From 1c70c59372e04b97d3297973255013d4c6eb902b Mon Sep 17 00:00:00 2001 From: Ilya Kreymer Date: Sat, 1 Jun 2019 12:50:37 -0700 Subject: [PATCH 1/3] a first attempt at bundling node-warc to run in browser! - avoid including fs and untildify, just pass in raw streams - uses webpack to bundle to dist/nodewarc.js - expose stream and zlib for further testing with WARCParser - add index.html for testing issues: still getting 'Uncaught Error: invalid distance too far back' from zlib, unrelated to warc parsing (which works well!) --- dist/nodewarc.js | 20 + index.html | 37 + index.js | 5 + lib/parsers/autoWARCParser.js | 5 +- lib/parsers/gzipDetector.js | 6 +- lib/parsers/warcGzParser.js | 8 +- lib/parsers/warcParser.js | 8 +- lib/utils/getStream.js | 28 + lib/writers/warcWriterBase.js | 7 +- package.json | 7 +- webpack.config.js | 21 + yarn.lock | 1302 ++++++++++++++++++++++++++++++++- 12 files changed, 1406 insertions(+), 48 deletions(-) create mode 100644 dist/nodewarc.js create mode 100644 index.html create mode 100644 lib/utils/getStream.js create mode 100644 webpack.config.js diff --git a/dist/nodewarc.js b/dist/nodewarc.js new file mode 100644 index 0000000..205d7c3 --- /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=60)}([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(63),i=r(64),s=r(35);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 W(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return z(e).length;default:if(n)return W(e).length;t=(""+t).toLowerCase(),n=!0}}function g(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function _(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 l=!0,f=0;fi&&(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+l<=r)switch(l){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,l=1):c>65535&&(c-=65536,n.push(c>>>10&1023|55296),c=56320|1023&c),n.push(c),i+=l}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 T(this,t,r);case"latin1":case"binary":return A(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),l=0;li)&&(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 y(this,e,t,r);case"utf8":case"utf-8":return w(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 T(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 j(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 B(e,t,r,n,s){return s||j(e,0,r,4),i.write(e,t,r,n,23,4),r+4}function N(e,t,r,n,s){return s||j(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 B(this,e,t,!0,r)},u.prototype.writeFloatBE=function(e,t,r){return B(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 z(e){return n.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(U,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function M(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,l=-1;function f(){c&&u&&(c=!1,u.length?h=u.concat(h):l=-1,h.length&&d())}function d(){if(!c){var e=a(f);c=!0;for(var t=h.length;t;){for(u=h,h=[];++l1)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 l(e){return`WARC-Concurrent-To: ${r}`}function f(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(l(r)),null!=a&&u.push(f(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(f(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(l(r)),null!=a&&u.push(f(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){var n=r(49),i="object"==typeof self&&self&&self.Object===Object&&self,s=n||i||Function("return this")();e.exports=s},function(e,t,r){"use strict";var n=r(19),i=Object.keys||function(e){var t=[];for(var r in e)t.push(r);return t};e.exports=l;var s=r(11);s.inherits=r(4);var o=r(36),a=r(27);s.inherits(l,o);for(var u=i(a.prototype),h=0;h({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,w,i,y],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,w,n,y],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(l({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,w,s,y],u))}_writeResponseRecord(e,r,n,i){const s=v(n,i),o=t.from(f({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,w,s,y],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(36)).Stream=t,t.Readable=t,t.Writable=r(27),t.Duplex=r(6),t.Transform=r(40),t.PassThrough=r(71)},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(87),{crlf:s}=r(29);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),l=["%","/","?",";","#"].concat(c),f=["/","?","#"],d=/^[+a-z0-9A-Z_-]{0,63}$/,p=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,g={javascript:!0,"javascript:":!0},_={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},y=r(130);function w(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 B=O.slice(0,T),N=O.slice(T+1),U=L.match(p);U&&(B.push(U[1]),N.unshift(U[2])),N.length&&(w="/"+N.join(".")+w),this.hostname=B.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),C||(this.hostname=n.toASCII(this.hostname));var D=this.port?":"+this.port:"",W=this.hostname||"";this.host=W+D,this.href+=this.host,C&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==w[0]&&(w="/"+w))}if(!g[R])for(T=0,I=c.length;T0)&&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,T=0,A=x.length;A>=0;A--)"."===(k=x[A])?x.splice(A,1):".."===k?(x.splice(A,1),T++):T&&(x.splice(A,1),T--);if(!v&&!R)for(;T--;T)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(76),o=r(42),a=r(41).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),l=0;l=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 y(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 w(e){if(!(this instanceof w))return new w(e);T.call(this,e,s.DEFLATE)}function b(e){if(!(this instanceof b))return new b(e);T.call(this,e,s.INFLATE)}function v(e){if(!(this instanceof v))return new v(e);T.call(this,e,s.GZIP)}function R(e){if(!(this instanceof R))return new R(e);T.call(this,e,s.GUNZIP)}function x(e){if(!(this instanceof x))return new x(e);T.call(this,e,s.DEFLATERAW)}function E(e){if(!(this instanceof E))return new E(e);T.call(this,e,s.INFLATERAW)}function k(e){if(!(this instanceof k))return new k(e);T.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 T(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){A(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 A(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=w,t.Inflate=b,t.Gzip=v,t.Gunzip=R,t.DeflateRaw=x,t.InflateRaw=E,t.Unzip=k,t.createDeflate=function(e){return new w(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 w(t),e,r)},t.deflateSync=function(e,t){return y(new w(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 y(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 y(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 y(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 y(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 y(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 y(new E(t),e)},o.inherits(T,i),T.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)},T.prototype.reset=function(){return a(this._handle,"zlib binding closed"),this._handle.reset()},T.prototype._flush=function(e){this._transform(n.alloc(0),"",e)},T.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))},T.prototype.close=function(t){A(this,t),e.nextTick(C,this)},T.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"))},T.prototype._processChunk=function(e,t,r){var i=e&&e.length,s=this._chunkSize-this._offset,o=0,c=this,l="function"==typeof r;if(!l){var f,d=[],p=0;this.on("error",function(e){f=e}),a(this._handle,"zlib binding closed");do{var g=this._handle.writeSync(t,e,o,i,this._buffer,this._offset,s)}while(!this._hadError&&y(g[0],g[1]));if(this._hadError)throw f;if(p>=u)throw A(this),new RangeError(h);var _=n.concat(d,p);return A(this),_}a(this._handle,"zlib binding closed");var m=this._handle.write(t,e,o,i,this._buffer,this._offset,s);function y(u,h){if(this&&(this.buffer=null,this.callback=null),!c._hadError){var f=s-h;if(a(f>=0,"have should not go down"),f>0){var g=c._buffer.slice(c._offset,c._offset+f);c._offset+=f,l?c.push(g):(d.push(g),p+=g.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,!l)return!0;var _=c._handle.write(t,e,o,i,c._buffer,c._offset,c._chunkSize);return _.callback=y,void(_.buffer=e)}if(!l)return!1;r()}}m.buffer=e,m.callback=y},o.inherits(w,T),o.inherits(b,T),o.inherits(v,T),o.inherits(R,T),o.inherits(x,T),o.inherits(E,T),o.inherits(k,T)}).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 l(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 f(this,e,!0)},a.prototype.rawListeners=function(e){return f(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(19);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=y;var a,u=!t.browser&&["v0.10","v0.9."].indexOf(t.version.slice(0,5))>-1?n:s.nextTick;y.WritableState=m;var h=r(11);h.inherits=r(4);var c={deprecate:r(70)},l=r(37),f=r(20).Buffer,d=i.Uint8Array||function(){};var p,g=r(38);function _(){}function m(e,t){a=a||r(6),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 l=!1===e.decodeStrings;this.decodeStrings=!l,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 y(e){if(a=a||r(6),!(p.call(y,this)||this instanceof a))return new y(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)),l.call(this)}function w(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,w(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,l=r.callback;if(w(e,t,!1,t.objectMode?1:h.length,h,c,l),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(y,l),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(y,Symbol.hasInstance,{value:function(e){return!!p.call(this,e)||this===y&&(e&&e._writableState instanceof m)}})):p=function(e){return e instanceof this},y.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},y.prototype.write=function(e,t,r){var n,i=this._writableState,o=!1,a=!i.objectMode&&(n=e,f.isBuffer(n)||n instanceof d);return a&&!f.isBuffer(e)&&(e=function(e){return f.from(e)}(e)),"function"==typeof t&&(r=t,t=null),a?t="buffer":t||(t=i.defaultEncoding),"function"!=typeof r&&(r=_),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=f.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(y.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),y.prototype._write=function(e,t,r){r(new Error("_write() is not implemented"))},y.prototype._writev=null,y.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(y.prototype,"destroyed",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),y.prototype.destroy=g.destroy,y.prototype._undestroy=g.undestroy,y.prototype._destroy=function(e,t){this.end(),t(e)}}).call(this,r(2),r(68).setImmediate,r(1))},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(5).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(133),i=r(55),s=r(135),o=r(136),a=r(17),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 l=new n(t);return r&&l.on("response",r),l},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(137),{DASH:i}=r(28),{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(143);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(19);e.exports=w;var s,o=r(35);w.ReadableState=y;r(26).EventEmitter;var a=function(e,t){return e.listeners(t).length},u=r(37),h=r(20).Buffer,c=t.Uint8Array||function(){};var l=r(11);l.inherits=r(4);var f=r(65),d=void 0;d=f&&f.debuglog?f.debuglog("stream"):function(){};var p,g=r(66),_=r(38);l.inherits(w,u);var m=["error","close","destroy","pause","resume"];function y(e,t){e=e||{};var n=t instanceof(s=s||r(6));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 g,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(39).StringDecoder),this.decoder=new p(e.encoding),this.encoding=e.encoding)}function w(e){if(s=s||r(6),!(this instanceof w))return new w(e);this._readableState=new y(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(T,e,t))}function T(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},w.prototype._read=function(e){this.emit("error",new Error("_read() is not implemented"))},w.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:w;function h(t,n){d("onunpipe"),t===r&&n&&!1===n.hasUnpiped&&(n.hasUnpiped=!0,d("cleanup"),e.removeListener("close",m),e.removeListener("finish",y),e.removeListener("drain",l),e.removeListener("error",_),e.removeListener("unpipe",h),r.removeListener("end",c),r.removeListener("end",w),r.removeListener("data",g),f=!0,!s.awaitDrain||e._writableState&&!e._writableState.needDrain||l())}function c(){d("onend"),e.end()}s.endEmitted?i.nextTick(u):r.once("end",u),e.on("unpipe",h);var l=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",l);var f=!1;var p=!1;function g(t){d("ondata"),p=!1,!1!==e.write(t)||p||((1===s.pipesCount&&s.pipes===e||s.pipesCount>1&&-1!==P(s.pipes,e))&&!f&&(d("false write response, pause",r._readableState.awaitDrain),r._readableState.awaitDrain++,p=!0),r.pause())}function _(t){d("onerror",t),w(),e.removeListener("error",_),0===a(e,"error")&&e.emit("error",t)}function m(){e.removeListener("finish",y),w()}function y(){d("onfinish"),e.removeListener("close",m),w()}function w(){d("unpipe"),r.unpipe(e)}return r.on("data",g),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",_),e.once("close",m),e.once("finish",y),e.emit("pipe",r),s.flowing||(d("pipe resume"),r.resume()),e},w.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 l(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function f(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(6),i=r(11);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]!==l[h])return!1;for(h=c.length-1;h>=0;h--)if(a=c[h],!w(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}f.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(f.AssertionError,Error),f.fail=m,f.ok=y,f.equal=function(e,t,r){e!=t&&m(e,t,r,"==",f.equal)},f.notEqual=function(e,t,r){e==t&&m(e,t,r,"!=",f.notEqual)},f.deepEqual=function(e,t,r){w(e,t,!1)||m(e,t,r,"deepEqual",f.deepEqual)},f.deepStrictEqual=function(e,t,r){w(e,t,!0)||m(e,t,r,"deepStrictEqual",f.deepStrictEqual)},f.notDeepEqual=function(e,t,r){w(e,t,!1)&&m(e,t,r,"notDeepEqual",f.notDeepEqual)},f.notDeepStrictEqual=function e(t,r,n){w(t,r,!0)&&m(t,r,n,"notDeepStrictEqual",e)},f.strictEqual=function(e,t,r){e!==t&&m(e,t,r,"===",f.strictEqual)},f.notStrictEqual=function(e,t,r){e===t&&m(e,t,r,"!==",f.notStrictEqual)},f.throws=function(e,t,r){R(!0,e,t,r)},f.doesNotThrow=function(e,t,r){R(!1,e,t,r)},f.ifError=function(e){if(e)throw e},f.strict=n(function e(t,r){t||m(t,!0,r,"==",e)},f,{equal:f.strictEqual,deepEqual:f.deepStrictEqual,notEqual:f.notStrictEqual,notDeepEqual:f.notDeepStrictEqual}),f.strict.strict=f.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),y(n.showHidden)&&(n.showHidden=!1),y(n.depth)&&(n.depth=2),y(n.colors)&&(n.colors=!1),y(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(y(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(_(t))return e.stylize(""+t,"number");if(p(t))return e.stylize(""+t,"boolean");if(g(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 l(r);if(0===o.length){if(x(r)){var u=r.name?": "+r.name:"";return e.stylize("[Function"+u+"]","special")}if(w(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 l(r)}var h,b="",E=!1,k=["{","}"];(d(r)&&(E=!0,k=["[","]"]),x(r))&&(b=" [Function"+(r.name?": "+r.name:"")+"]");return w(r)&&(b=" "+RegExp.prototype.toString.call(r)),v(r)&&(b=" "+Date.prototype.toUTCString.call(r)),R(r)&&(b=" "+l(r)),0!==o.length||E&&0!=r.length?n<0?w(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 l(e){return"["+Error.prototype.toString.call(e)+"]"}function f(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")),T(n,i)||(o="["+i+"]"),a||(e.seen.indexOf(u.value)<0?(a=g(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")),y(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 g(e){return null===e}function _(e){return"number"==typeof e}function m(e){return"string"==typeof e}function y(e){return void 0===e}function w(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(y(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=g,t.isNullOrUndefined=function(e){return null==e},t.isNumber=_,t.isString=m,t.isSymbol=function(e){return"symbol"==typeof e},t.isUndefined=y,t.isRegExp=w,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(78);var S=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function T(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 A="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(A&&e[A]){var t;if("function"!=typeof(t=e[A]))throw new TypeError('The "util.promisify.custom" argument must be of type Function');return Object.defineProperty(t,A,{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;s>>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){(function(t){const n=r(9),i=n.fs,s=n.untildify,o=t.from("1f8b08","hex"),a=o.length;e.exports=class{static async isGzipped(e){if(null==e)throw new Error(`The filePath path is ${e}`);e=s(e);const r=await i.open(e,"r"),n=t.allocUnsafe(3);await i.read(r,n,0,3,void 0),await i.close(r);let u=0,h=!0;if(a!==n.length)return!1;for(;ua)&&void 0===e.nsecs&&(g=0),g>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");a=p,u=g,i=f;var m=(1e4*(268435455&(p+=122192928e5))+g)%4294967296;c[h++]=m>>>24&255,c[h++]=m>>>16&255,c[h++]=m>>>8&255,c[h++]=255&m;var y=p/4294967296*1e4&268435455;c[h++]=y>>>8&255,c[h++]=255&y,c[h++]=y>>>24&15|16,c[h++]=y>>>16&255,c[h++]=f>>>8|128,c[h++]=255&f;for(var w=0;w<6;++w)c[h+w]=l[w];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(16),i=r(50),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(54),o=r(4),a=r(10),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 l=r.body.getReader();!function e(){l.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 f=h.rawHeaders["mime-type"];if(f){var d=f.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(17);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(32),{URL:i}=r(17),{canReplayProtocols:s,SPACE:o,HTTP1D1:a,H2Method:u}=r(28),{httpRequestPath:h}=r(57),{CRLF:c}=r(3),{stringifyHeaders:l}=r(33),f=`${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)===f?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+l(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)===f?e:e+c}return null!=this.responseHeaders&&(this._ensureProto(),this.statusText||(this.statusText=n[this.status]),e=`${this.protocol} ${this.status} ${this.statusText}${c}${l(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(46),i=r(58),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";const{WARCStreamTransform:n,AutoWARCParser:i,WARCGzParser:s,WARCParser:o}=r(61),{CRIExtraWARCGenerator:a,ElectronWARCWriter:u,PuppeteerCDPWARCGenerator:h,PuppeteerWARCGenerator:c,RemoteChromeWARCWriter:l,WARCWriterBase:f}=r(92),{CRIExtraCapturer:d,ElectronCapturer:p,PuppeteerCapturer:g,PuppeteerCDPCapturer:_,RemoteChromeCapturer:m,RequestHandler:y}=r(158);t.AutoWARCParser=i,t.CRIExtraCapturer=d,t.CRIExtraWARCGenerator=a,t.ElectronCapturer=p,t.ElectronWARCWriter=u,t.PuppeteerCDPCapturer=_,t.PuppeteerCDPWARCGenerator=h,t.PuppeteerCapturer=g,t.PuppeteerWARCGenerator=c,t.RemoteChromeCapturer=m,t.RemoteChromeWARCWriter=l,t.RequestHandler=y,t.WARCGzParser=s,t.WARCParser=o,t.WARCStreamTransform=n,t.WARCWriterBase=f,t.RequestLibWARCWriter=r(164),r(13)&&(t.recordIterator=r(14)),t.stream=r(25),t.zlib=r(18)},function(e,t,r){t.AutoWARCParser=r(62),t.GzipDetector=r(45),t.WARCGzParser=r(90),t.WARCParser=r(91),t.WARCStreamTransform=r(12),r(13)&&(t.recordIterator=r(14))},function(e,t,r){const n=r(9).getStream,i=r(18),s=r(22),o=r(12),a=r(45),u=r(13);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(14);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,l=0;l>16&255,a[u++]=t>>8&255,a[u++]=255&t;2===o&&(t=i[e.charCodeAt(l)]<<2|i[e.charCodeAt(l+1)]>>4,a[u++]=255&t);1===o&&(t=i[e.charCodeAt(l)]<<10|i[e.charCodeAt(l+1)]<<4|i[e.charCodeAt(l+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,l=r?i-1:0,f=r?-1:1,d=e[t+l];for(l+=f,s=d&(1<<-c)-1,d>>=-c,c+=a;c>0;s=256*s+e[t+l],l+=f,c-=8);for(o=s&(1<<-c)-1,s>>=-c,c+=n;c>0;o=256*o+e[t+l],l+=f,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,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:s-1,p=n?1:-1,g=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+l>=1?f/u:f*Math.pow(2,1-l))*u>=2&&(o++,u/=2),o+l>=c?(a=0,o=c):o+l>=1?(a=(t*u-1)*Math.pow(2,i),o+=l):(a=t*Math.pow(2,l-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*g}},function(e,t){},function(e,t,r){"use strict";var n=r(20).Buffer,i=r(67);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(69),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,l=e.document,f=Object.getPrototypeOf&&Object.getPrototypeOf(e);f=f&&f.setTimeout?f: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)}):l&&"onreadystatechange"in l.createElement("script")?(i=l.documentElement,n=function(e){var t=l.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,"*")}),f.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,l){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=l,this.strm.output=h,this.strm.next_out=c,this.flush=s,!r)return this._process(),this._checkError()?this._afterSync():void 0;var f=this;return n.nextTick(function(){f._process(),f._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;u4?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,l=e.prev,f=e.strstart+B,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=l[t&c])>u&&0!=--i);return o<=e.lookahead?o:e.lookahead}function se(e){var t,r,n,s,u,h,c,l,f,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,l=e.strstart+e.lookahead,f=s,d=void 0,(d=h.avail_in)>f&&(d=f),r=0===d?0:(h.avail_in-=d,i.arraySet(c,h.input,h.next_in,d,l),1===h.state.wrap?h.adler=o(h.adler,c,d,l):2===h.state.wrap&&(h.adler=a(h.adler,c,d,l)),h.next_in+=d,h.total_in+=d,d),e.lookahead+=r,e.lookahead+e.insert>=j)for(u=e.strstart-e.insert,e.ins_h=e.window[u],e.ins_h=(e.ins_h<=j&&(e.ins_h=(e.ins_h<=j)if(n=s._tr_tally(e,e.strstart-e.match_start,e.match_length-j),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=j){e.match_length--;do{e.strstart++,e.ins_h=(e.ins_h<=j&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=j-1)),e.prev_length>=j&&e.match_length<=e.prev_length){i=e.strstart+e.lookahead-j,n=s._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-j),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>T||r!==S||n<8||n>15||t<0||t>9||o<0||o>x)return X(e,_);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===f?(te(e,!0),0===e.strm.avail_out?Y:V):(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 fe(e,t,S,A,C,E)},t.deflateInit2=fe,t.deflateReset=le,t.deflateResetKeep=ce,t.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?_:(e.state.gzhead=t,p):_},t.deflate=function(e,t){var r,i,o,u;if(!e||!e.state||t>d||t<0)return e?X(e,_):_;if(i=e.state,!e.output||!e.input&&0!==e.avail_in||i.status===Z&&t!==f)return X(e,0===e.avail_out?y:_);if(i.strm=e,r=i.last_flush,i.last_flush=t,i.status===D)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=W):(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,K),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|=U),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===W)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=z)}else i.status=z;if(i.status===z)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=M)}else i.status=M;if(i.status===M)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!==f)return X(e,y);if(i.status===Z&&0!==e.avail_in)return X(e,y);if(0!==e.avail_in||0!==i.lookahead||t!==h&&i.status!==Z){var w=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===f?(te(e,!0),0===e.strm.avail_out?Y:V):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<=B){if(se(e),e.lookahead<=B&&t===h)return $;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=j&&e.strstart>0&&(n=a[i=e.strstart-1])===a[++i]&&n===a[++i]&&n===a[++i]){o=e.strstart+B;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>=j?(r=s._tr_tally(e,1,e.match_length-j),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===f?(te(e,!0),0===e.strm.avail_out?Y:V):e.last_lit&&(te(e,!1),0===e.strm.avail_out)?$:G}(i,t):n[i.level].func(i,t);if(w!==Y&&w!==V||(i.status=Z),w===$||w===Y)return 0===e.avail_out&&(i.last_flush=-1),p;if(w===G&&(t===c?s._tr_align(i):t!==d&&(s._tr_stored_block(i,0,0,!1),t===l&&(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!==f?p:i.wrap<=0?g:(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:g)},t.deflateEnd=function(e){var t;return e&&e.state?(t=e.state.status)!==D&&t!==W&&t!==z&&t!==M&&t!==F&&t!==H&&t!==Z?X(e,_):(e.state=null,t===H?X(e,m):p):_},t.deflateSetDictionary=function(e,t){var r,n,s,a,u,h,c,l,f=t.length;if(!e||!e.state)return _;if(2===(a=(r=e.state).wrap)||1===a&&r.status!==D||r.lookahead)return _;for(1===a&&(e.adler=o(e.adler,t,f,0)),r.wrap=0,f>=r.w_size&&(0===a&&(Q(r.head),r.strstart=0,r.block_start=0,r.insert=0),l=new i.Buf8(r.w_size),i.arraySet(l,t,f-r.w_size,r.w_size,0),t=l,f=r.w_size),u=e.avail_in,h=e.next_in,c=e.input,e.avail_in=f,e.next_in=0,e.input=t,se(r);r.lookahead>=j;){n=r.strstart,s=r.lookahead-(j-1);do{r.ins_h=(r.ins_h<=0;)e[t]=0}var h=0,c=1,l=2,f=29,d=256,p=d+1+f,g=30,_=19,m=2*p+1,y=15,w=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],T=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],A=[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*g);u(O);var I=new Array(512);u(I);var L=new Array(256);u(L);var q=new Array(f);u(q);var P,j,B,N=new Array(g);function U(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 D(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function W(e){return e<256?I[e]:I[256+(e>>>7)]}function z(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function M(e,t,r){e.bi_valid>w-r?(e.bi_buf|=t<>w-e.bi_valid,e.bi_valid+=r-w):(e.bi_buf|=t<>>=1,r<<=1}while(--t>0);return r>>>1}function Z(e,t,r){var n,i,s=new Array(y+1),o=0;for(n=1;n<=y;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?z(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--)V(e,s,r);i=u;do{r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],V(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++,V(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,l=t.stat_desc.has_stree,f=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,g=0;for(s=0;s<=y;s++)e.bl_count[s]=0;for(u[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;rp&&(s=p,g++),u[2*n+1]=s,n>h||(e.bl_count[s]++,o=0,n>=d&&(o=f[n-d]),a=u[2*n],e.opt_len+=a*(s+o),l&&(e.static_len+=a*(c[2*n+1]+o)));if(0!==g){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]--,g-=2}while(g>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;n0?(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*A[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?(M(e,(c<<1)+(n?1:0),3),K(e,C,O)):(M(e,(l<<1)+(n?1:0),3),function(e,t,r,n){var i;for(M(e,t-257,5),M(e,r-1,5),M(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*W(t)]++),e.last_lit===e.lit_bufsize-1},t._tr_align=function(e){M(e,c<<1,3),F(e,v,C),function(e){16===e.bi_valid?(z(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={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";var n=r(21),i=r(43),s=r(44),o=r(84),a=r(85),u=0,h=1,c=2,l=4,f=5,d=6,p=0,g=1,_=2,m=-2,y=-3,w=-4,b=-5,v=8,R=1,x=2,E=3,k=4,S=5,T=6,A=7,C=8,O=9,I=10,L=11,q=12,P=13,j=14,B=15,N=16,U=17,D=18,W=19,z=20,M=21,F=22,H=23,Z=24,$=25,G=26,Y=27,V=28,K=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,le=!0;function fe(e){if(le){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}),le=!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,Te,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&&(Te[0]=255&ae,Te[1]=ae>>>8&255,r.check=s(r.check,Te,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,Te[2]=ae>>>16&255,Te[3]=ae>>>24&255,r.check=s(r.check,Te,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&&(Te[0]=255&ae,Te[1]=ae>>>8&255,r.check=s(r.check,Te,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,Te,2,0)),ae=0,ue=0}else r.head&&(r.head.extra=null);r.mode=T;case T:if(1024&r.flags&&((le=r.length)>se&&(le=se),le&&(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,le,Re)),512&r.flags&&(r.check=s(r.check,ee,le,re)),se-=le,re+=le,r.length-=le),r.length))break e;r.length=0,r.mode=A;case A:if(2048&r.flags){if(0===se)break e;le=0;do{Re=ee[re+le++],r.head&&Re&&r.length<65536&&(r.head.name+=String.fromCharCode(Re))}while(Re&&le>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=j;break;case 1:if(fe(r),r.mode=z,t===d){ae>>>=2,ue-=2;break e}break;case 2:r.mode=U;break;case 3:e.msg="invalid block type",r.mode=X}ae>>>=2,ue-=2;break;case j: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=B,t===d)break e;case B:r.mode=N;case N:if(le=r.length){if(le>se&&(le=se),le>oe&&(le=oe),0===le)break e;n.arraySet(te,ee,re,le,ie),se-=le,re+=le,oe-=le,ie+=le,r.length-=le;break}r.mode=q;break;case U: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=D;case D:for(;r.have>>=3,ue-=3}for(;r.have<19;)r.lens[Ae[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=W;case W:for(;r.have>>16&255,ye=65535&Se,!((_e=Se>>>24)<=ue);){if(0===se)break e;se--,ae+=ee[re++]<>>=_e,ue-=_e,r.lens[r.have++]=ye;else{if(16===ye){for(ke=_e+2;ue>>=_e,ue-=_e,0===r.have){e.msg="invalid bit length repeat",r.mode=X;break}Re=r.lens[r.have-1],le=3+(3&ae),ae>>>=2,ue-=2}else if(17===ye){for(ke=_e+3;ue>>=_e)),ae>>>=3,ue-=3}else{for(ke=_e+7;ue>>=_e)),ae>>>=7,ue-=7}if(r.have+le>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=X;break}for(;le--;)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=z,t===d)break e;case z:r.mode=M;case M: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,ye=65535&Se,!((_e=Se>>>24)<=ue);){if(0===se)break e;se--,ae+=ee[re++]<>we)])>>>16&255,ye=65535&Se,!(we+(_e=Se>>>24)<=ue);){if(0===se)break e;se--,ae+=ee[re++]<>>=we,ue-=we,r.back+=we}if(ae>>>=_e,ue-=_e,r.back+=_e,r.length=ye,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,ye=65535&Se,!((_e=Se>>>24)<=ue);){if(0===se)break e;se--,ae+=ee[re++]<>we)])>>>16&255,ye=65535&Se,!(we+(_e=Se>>>24)<=ue);){if(0===se)break e;se--,ae+=ee[re++]<>>=we,ue-=we,r.back+=we}if(ae>>>=_e,ue-=_e,r.back+=_e,64&me){e.msg="invalid distance code",r.mode=X;break}r.offset=ye,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(le=ce-oe,r.offset>le){if((le=r.offset-le)>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=X;break}le>r.wnext?(le-=r.wnext,pe=r.wsize-le):pe=r.wnext-le,le>r.length&&(le=r.length),ge=r.window}else ge=te,pe=ie-r.offset,le=r.length;le>oe&&(le=oe),oe-=le,r.length-=le;do{te[ie++]=ge[pe++]}while(--le);0===r.length&&(r.mode=M);break;case G:if(0===oe)break e;te[ie++]=r.length,oe--,r.mode=M;break;case Y:if(r.wrap){for(;ue<32;){if(0===se)break e;se--,ae|=ee[re++]<>>=b=w>>>24,p-=b,0===(b=w>>>16&255))S[s++]=65535&w;else{if(!(16&b)){if(0==(64&b)){w=g[(65535&w)+(d&(1<>>=b,p-=b),p<15&&(d+=k[n++]<>>=b=w>>>24,p-=b,!(16&(b=w>>>16&255))){if(0==(64&b)){w=_[(65535&w)+(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=f,0===l){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===j[S];S--);if(T>S&&(T=S),0===S)return h[c++]=20971520,h[c++]=20971520,f.bits=1,0;for(k=1;k0&&(0===e||1!==S))return-1;for(B[1]=0,x=1;x<15;x++)B[x+1]=B[x]+j[x];for(E=0;E852||2===e&&I>592)return 1;for(;;){w=x-C,l[E]y?(b=N[U+l[E]],v=q[P+l[E]]):(b=96,v=0),d=1<>C)+(p-=d)]=w<<24|b<<16|v|0}while(0!==p);for(d=1<>=1;if(0!==d?(L&=d-1,L+=d):L=0,E++,0==--j[x]){if(x===S)break;x=t[r+l[E]]}if(x>T&&(L&_)!==g){for(0===C&&(C=T),m+=k,O=1<<(A=x-C);A+C852||2===e&&I>592)return 1;h[g=L&_]=T<<24|A<<16|m-c|0}}return 0!==L&&(h[m+L]=x-C<<24|64<<16|0),f.bits=T,0}},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,r){"use strict";const n=r(88),{crlf:i,begin:s}=r(29),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(9).getStream,i=r(22),s=r(12),o=r(13);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(14);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(93),t.RemoteChromeWARCWriter=r(125),t.PuppeteerCDPWARCGenerator=r(126),t.PuppeteerWARCGenerator=r(127),t.WARCWriterBase=r(7),t.CRIExtraWARCGenerator=r(157)},function(e,t,r){(function(t){const n=r(7),{CRLF:i}=r(3),{noGZ:s,replaceContentLen:o}=r(8),{getPostData:a,getResBody:u}=r(99);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(100);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(101),i=r(104),s=r(116),o=r(52),a=r(118),u=r(119),h=r(47),c=r(121),l="[object Map]",f="[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==l||t==f)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(47),i=r(102),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(103)(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(105),i=r(112),s=r(113),o=r(114),a=r(115),u=r(16),h=r(51),c=h(n),l=h(i),f=h(s),d=h(o),p=h(a),g=u;(n&&"[object DataView]"!=g(new n(new ArrayBuffer(1)))||i&&"[object Map]"!=g(new i)||s&&"[object Promise]"!=g(s.resolve())||o&&"[object Set]"!=g(new o)||a&&"[object WeakMap]"!=g(new a))&&(g=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 l:return"[object Map]";case f:return"[object Promise]";case d:return"[object Set]";case p:return"[object WeakMap]"}return t}),e.exports=g},function(e,t,r){var n=r(15)(r(5),"DataView");e.exports=n},function(e,t,r){var n=r(48),i=r(109),s=r(50),o=r(51),a=/^\[object .+?Constructor\]$/,u=Function.prototype,h=Object.prototype,c=u.toString,l=h.hasOwnProperty,f=RegExp("^"+c.call(l).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=function(e){return!(!s(e)||i(e))&&(n(e)?f:a).test(o(e))}},function(e,t,r){var n=r(30),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(110),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(5)["__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(15)(r(5),"Map");e.exports=n},function(e,t,r){var n=r(15)(r(5),"Promise");e.exports=n},function(e,t,r){var n=r(15)(r(5),"Set");e.exports=n},function(e,t,r){var n=r(15)(r(5),"WeakMap");e.exports=n},function(e,t,r){var n=r(117),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(16),i=r(23),s="[object Arguments]";e.exports=function(e){return i(e)&&n(e)==s}},function(e,t,r){var n=r(48),i=r(53);e.exports=function(e){return null!=e&&i(e.length)&&!n(e)}},function(e,t,r){(function(e){var n=r(5),i=r(120),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(31)(e))},function(e,t){e.exports=function(){return!1}},function(e,t,r){var n=r(122),i=r(123),s=r(124),o=s&&s.isTypedArray,a=o?i(o):n;e.exports=a},function(e,t,r){var n=r(16),i=r(53),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(49),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(31)(e))},function(e,t,r){(function(t){const n=r(7),{CRLF:i}=r(3),{noGZ:s,replaceContentLen:o}=r(8);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(7),{CRLF:i}=r(3),{noGZ:s,replaceContentLen:o}=r(8);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(17),{STATUS_CODES:i}=r(32),{CRLF:s}=r(3),o=r(7),{stringifyHeaders:a,stringifyRequestHeaders:u}=r(33),{httpRequestPath:h}=r(57),{noGZ:c,replaceContentLen:l}=r(8);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(l,`Content-Length: 0${s}`):(u=u.replace(c,"")).replace(l,`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,l=26,f=38,d=700,p=72,g=128,_="-",m=/^xn--/,y=/[^\x20-\x7E]/,w=/[\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(w,".")).split("."),t).join(".")}function T(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*l>>1;n+=h)e=R(e/v);return R(n+(v+1)*e/(e+f))}function I(e){var t,r,n,i,s,o,a,f,d,m,y,w=[],b=e.length,v=0,x=g,k=p;for((r=e.lastIndexOf(_))<0&&(r=0),n=0;n=128&&E("not-basic"),w.push(e.charCodeAt(n));for(i=r>0?r+1:0;i=b&&E("invalid-input"),((f=(y=e.charCodeAt(i++))-48<10?y-22:y-65<26?y-65:y-97<26?y-97:h)>=h||f>R((u-v)/o))&&E("overflow"),v+=f*o,!(f<(d=a<=k?c:a>=k+l?l:a-k));a+=h)o>R(u/(m=h-d))&&E("overflow"),o*=m;k=O(v-s,t=w.length+1,0==s),R(v/t)>u-x&&E("overflow"),x+=R(v/t),v%=t,w.splice(v++,0,x)}return A(w)}function L(e){var t,r,n,i,s,o,a,f,d,m,y,w,b,v,k,S=[];for(w=(e=T(e)).length,t=g,r=0,s=p,o=0;o=t&&yR((u-r)/(b=n+1))&&E("overflow"),r+=(a-t)*b,t=a,o=0;ou&&E("overflow"),y==t){for(f=r,d=h;!(f<(m=d<=s?c:d>=s+l?l:d-s));d+=h)k=f-m,v=h-m,S.push(x(C(m+k%v,0))),f=R(k/v);S.push(x(C(f,0))),s=O(r,b,n==i),r=0,++n}++r,++t}return S.join("")}a={version:"1.4.1",ucs2:{decode:T,encode:A},decode:I,encode:L,toASCII:function(e){return S(e,function(e){return y.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(31)(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(131),t.encode=t.stringify=r(132)},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?(l=g.substr(0,_),f=g.substr(_+1)):(l=g,f=""),d=decodeURIComponent(l),p=decodeURIComponent(f),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(58),t.CRIExtraCapturer=r(159),t.CapturedRequest=r(59),t.ElectronCapturer=r(160),t.PuppeteerCDPCapturer=r(161),t.PuppeteerCapturer=r(162),t.RemoteChromeCapturer=r(163),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(7),{STATUS_CODES:i}=r(32),{URL:s}=r(17),{CRLF:o}=r(3),{stringifyHeaders:a,stringifyRequestHeaders:u}=r(33),{noGZ:h,replaceContentLen:c}=r(8);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)}`,l=e.body;s=l?(s=s.replace(h,"")).replace(c,`Content-Length: ${t.byteLength(l,"utf8")}${o}`):s.replace(c,`Content-Length: 0${o}`),await this.writeResponseRecord(this._UP.href,s,l)}}}).call(this,r(0).Buffer)}])); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3dyaXRlcnMvd2FyY0ZpZWxkcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19yb290LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiwid2VicGFjazovLy8uL2xpYi93cml0ZXJzL3dhcmNXcml0ZXJCYXNlLmpzIiwid2VicGFjazovLy8uL2xpYi93cml0ZXJzL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8vLi9saWIvdXRpbHMvZ2V0U3RyZWFtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUtYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS11dGlsLWlzL2xpYi91dGlsLmpzIiwid2VicGFjazovLy8uL2xpYi9wYXJzZXJzL3dhcmNTdHJlYW1UcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3BhcnNlcnMvX2NhblVzZVJlY29yZEl0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL2xpYi9wYXJzZXJzL3JlY29yZHRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TmF0aXZlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3VybC91cmwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktemxpYi9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MtbmV4dGljay1hcmdzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvY29tbW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ldmVudGVtaXR0ZXIzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3RMaWtlLmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL3JlcXVlc3RIYW5kbGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIiwid2VicGFjazovLy8uL2xpYi91dGlscy9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3dhcmNSZWNvcmQvZmllbGRJZGVudGlmaWVycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3V0aWxzL2hlYWRlclNlcmlhbGl6ZXJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbS1icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1saWJzLWJyb3dzZXIvbm9kZV9tb2R1bGVzL3N0cmluZ19kZWNvZGVyL2xpYi9zdHJpbmdfZGVjb2Rlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXNzZXJ0L2Fzc2VydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2FkbGVyMzIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3BhcnNlcnMvZ3ppcERldGVjdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL3YxLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzUHJvdG90eXBlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19mcmVlR2xvYmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9Tb3VyY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNMZW5ndGguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9jYXBhYmlsaXR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9saWIvcmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzVW5pY29kZS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvdXRpbHMvdXJsLWhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3JlcXVlc3RDYXB0dXJlcnMvY2RwUmVxdWVzdEluZm8uanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3JlcXVlc3RDYXB0dXJlcnMvY2FwdHVyZWRSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2luZGV4LmpzIiwid2VicGFjazovLy8uL2xpYi9wYXJzZXJzL2luZGV4LmpzIiwid2VicGFjazovLy8uL2xpYi9wYXJzZXJzL2F1dG9XQVJDUGFyc2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9CdWZmZXJMaXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dGlsLWRlcHJlY2F0ZS9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS93cml0YWJsZS1icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vZHVwbGV4LWJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS16bGliL2xpYi9iaW5kaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9vYmplY3QtYXNzaWduL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3pzdHJlYW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZGVmbGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi90cmVlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9tZXNzYWdlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZsYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmZhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mdHJlZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY29uc3RhbnRzLmpzIiwid2VicGFjazovLy8uL2xpYi93YXJjUmVjb3JkL2J1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3dhcmNSZWNvcmQvcmVjb3JkLmpzIiwid2VicGFjazovLy8uL2xpYi93YXJjUmVjb3JkL3dhcmNDb250ZW50UGFyc2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcGFyc2Vycy93YXJjR3pQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3BhcnNlcnMvd2FyY1BhcnNlci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvd3JpdGVycy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvd3JpdGVycy9lbGVjdHJvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGF0aC1icm93c2VyaWZ5L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2xpYi9ybmctYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9saWIvYnl0ZXNUb1V1aWQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3V0aWxzL2Vuc3VyZVdBUkNGaWxlbmFtZS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvdXRpbHMvZWxlY3Ryb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0VtcHR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRUYWcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fRGF0YVZpZXcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmF0aXZlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFJhd1RhZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc01hc2tlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3JlSnNEYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFZhbHVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19Qcm9taXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1NldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19XZWFrTWFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzQXJndW1lbnRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0J1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJGYWxzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNUeXBlZEFycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VVbmFyeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19ub2RlVXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvd3JpdGVycy9yZW1vdGVDaHJvbWUuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3dyaXRlcnMvcHVwcGV0ZWVyQ0RQLmpzIiwid2VicGFjazovLy8uL2xpYi93cml0ZXJzL3B1cHBldGVlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3VybC91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9kZWNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9lbmNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9yZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90by1hcnJheWJ1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMveHRlbmQvaW1tdXRhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9idWlsdGluLXN0YXR1cy1jb2Rlcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvc3RhcnRDYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUNvbXBvdW5kZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9kZWJ1cnIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZGVidXJyTGV0dGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQcm9wZXJ0eU9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheU1hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU3ltYm9sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvd29yZHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNjaWlXb3Jkcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNVbmljb2RlV29yZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL191bmljb2RlV29yZHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC91cHBlckZpcnN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUNhc2VGaXJzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYXN0U2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNsaWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmluZ1RvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNjaWlUb0FycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3VuaWNvZGVUb0FycmF5LmpzIiwid2VicGFjazovLy8uL2xpYi93cml0ZXJzL2NyaUV4dHJhLmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL2luZGV4LmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL2NyaUV4dHJhLmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL2VsZWN0cm9uLmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL3B1cHBldGVlckNEUC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcmVxdWVzdENhcHR1cmVycy9wdXBwZXRlZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3JlcXVlc3RDYXB0dXJlcnMvcmVtb3RlQ2hyb21lLmpzIiwid2VicGFjazovLy8uL2xpYi93cml0ZXJzL3JlcXVlc3RMaWIuanMiXSwibmFtZXMiOlsiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImV4cG9ydHMiLCJtb2R1bGUiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJnbG9iYWwiLCJiYXNlNjQiLCJpZWVlNzU0IiwiaXNBcnJheSIsImtNYXhMZW5ndGgiLCJCdWZmZXIiLCJUWVBFRF9BUlJBWV9TVVBQT1JUIiwiY3JlYXRlQnVmZmVyIiwidGhhdCIsImxlbmd0aCIsIlJhbmdlRXJyb3IiLCJVaW50OEFycmF5IiwiX19wcm90b19fIiwiYXJnIiwiZW5jb2RpbmdPck9mZnNldCIsInRoaXMiLCJFcnJvciIsImFsbG9jVW5zYWZlIiwiZnJvbSIsIlR5cGVFcnJvciIsIkFycmF5QnVmZmVyIiwiYXJyYXkiLCJieXRlT2Zmc2V0IiwiYnl0ZUxlbmd0aCIsInVuZGVmaW5lZCIsImZyb21BcnJheUxpa2UiLCJmcm9tQXJyYXlCdWZmZXIiLCJzdHJpbmciLCJlbmNvZGluZyIsImlzRW5jb2RpbmciLCJhY3R1YWwiLCJ3cml0ZSIsInNsaWNlIiwiZnJvbVN0cmluZyIsIm9iaiIsImlzQnVmZmVyIiwibGVuIiwiY2hlY2tlZCIsImNvcHkiLCJidWZmZXIiLCJ2YWwiLCJ0eXBlIiwiZGF0YSIsImZyb21PYmplY3QiLCJhc3NlcnRTaXplIiwic2l6ZSIsInRvU3RyaW5nIiwiaXNWaWV3IiwibG93ZXJlZENhc2UiLCJ1dGY4VG9CeXRlcyIsImJhc2U2NFRvQnl0ZXMiLCJ0b0xvd2VyQ2FzZSIsInN3YXAiLCJiIiwiYmlkaXJlY3Rpb25hbEluZGV4T2YiLCJkaXIiLCJpc05hTiIsImFycmF5SW5kZXhPZiIsImluZGV4T2YiLCJsYXN0SW5kZXhPZiIsImFyciIsImluZGV4U2l6ZSIsImFyckxlbmd0aCIsInZhbExlbmd0aCIsIlN0cmluZyIsInJlYWQiLCJidWYiLCJyZWFkVUludDE2QkUiLCJmb3VuZEluZGV4IiwiZm91bmQiLCJqIiwiaGV4V3JpdGUiLCJvZmZzZXQiLCJOdW1iZXIiLCJyZW1haW5pbmciLCJzdHJMZW4iLCJwYXJzZWQiLCJwYXJzZUludCIsInN1YnN0ciIsInV0ZjhXcml0ZSIsImJsaXRCdWZmZXIiLCJhc2NpaVdyaXRlIiwic3RyIiwiYnl0ZUFycmF5IiwicHVzaCIsImNoYXJDb2RlQXQiLCJhc2NpaVRvQnl0ZXMiLCJsYXRpbjFXcml0ZSIsImJhc2U2NFdyaXRlIiwidWNzMldyaXRlIiwidW5pdHMiLCJoaSIsImxvIiwidXRmMTZsZVRvQnl0ZXMiLCJiYXNlNjRTbGljZSIsInN0YXJ0IiwiZW5kIiwiZnJvbUJ5dGVBcnJheSIsInV0ZjhTbGljZSIsIk1hdGgiLCJtaW4iLCJyZXMiLCJzZWNvbmRCeXRlIiwidGhpcmRCeXRlIiwiZm91cnRoQnl0ZSIsInRlbXBDb2RlUG9pbnQiLCJmaXJzdEJ5dGUiLCJjb2RlUG9pbnQiLCJieXRlc1BlclNlcXVlbmNlIiwiY29kZVBvaW50cyIsIk1BWF9BUkdVTUVOVFNfTEVOR1RIIiwiZnJvbUNoYXJDb2RlIiwiYXBwbHkiLCJkZWNvZGVDb2RlUG9pbnRzQXJyYXkiLCJTbG93QnVmZmVyIiwiYWxsb2MiLCJJTlNQRUNUX01BWF9CWVRFUyIsImZvbyIsInN1YmFycmF5IiwiZSIsInR5cGVkQXJyYXlTdXBwb3J0IiwicG9vbFNpemUiLCJfYXVnbWVudCIsInNwZWNpZXMiLCJjb25maWd1cmFibGUiLCJmaWxsIiwiYWxsb2NVbnNhZmVTbG93IiwiX2lzQnVmZmVyIiwiY29tcGFyZSIsImEiLCJ4IiwieSIsImNvbmNhdCIsImxpc3QiLCJwb3MiLCJzd2FwMTYiLCJzd2FwMzIiLCJzd2FwNjQiLCJhcmd1bWVudHMiLCJoZXhTbGljZSIsImFzY2lpU2xpY2UiLCJsYXRpbjFTbGljZSIsInV0ZjE2bGVTbGljZSIsImVxdWFscyIsImluc3BlY3QiLCJtYXgiLCJtYXRjaCIsImpvaW4iLCJ0YXJnZXQiLCJ0aGlzU3RhcnQiLCJ0aGlzRW5kIiwidGhpc0NvcHkiLCJ0YXJnZXRDb3B5IiwiaW5jbHVkZXMiLCJpc0Zpbml0ZSIsInRvSlNPTiIsIkFycmF5IiwiX2FyciIsInJldCIsIm91dCIsInRvSGV4IiwiYnl0ZXMiLCJjaGVja09mZnNldCIsImV4dCIsImNoZWNrSW50Iiwib2JqZWN0V3JpdGVVSW50MTYiLCJsaXR0bGVFbmRpYW4iLCJvYmplY3RXcml0ZVVJbnQzMiIsImNoZWNrSUVFRTc1NCIsIndyaXRlRmxvYXQiLCJub0Fzc2VydCIsIndyaXRlRG91YmxlIiwibmV3QnVmIiwic2xpY2VMZW4iLCJyZWFkVUludExFIiwibXVsIiwicmVhZFVJbnRCRSIsInJlYWRVSW50OCIsInJlYWRVSW50MTZMRSIsInJlYWRVSW50MzJMRSIsInJlYWRVSW50MzJCRSIsInJlYWRJbnRMRSIsInBvdyIsInJlYWRJbnRCRSIsInJlYWRJbnQ4IiwicmVhZEludDE2TEUiLCJyZWFkSW50MTZCRSIsInJlYWRJbnQzMkxFIiwicmVhZEludDMyQkUiLCJyZWFkRmxvYXRMRSIsInJlYWRGbG9hdEJFIiwicmVhZERvdWJsZUxFIiwicmVhZERvdWJsZUJFIiwid3JpdGVVSW50TEUiLCJ3cml0ZVVJbnRCRSIsIndyaXRlVUludDgiLCJmbG9vciIsIndyaXRlVUludDE2TEUiLCJ3cml0ZVVJbnQxNkJFIiwid3JpdGVVSW50MzJMRSIsIndyaXRlVUludDMyQkUiLCJ3cml0ZUludExFIiwibGltaXQiLCJzdWIiLCJ3cml0ZUludEJFIiwid3JpdGVJbnQ4Iiwid3JpdGVJbnQxNkxFIiwid3JpdGVJbnQxNkJFIiwid3JpdGVJbnQzMkxFIiwid3JpdGVJbnQzMkJFIiwid3JpdGVGbG9hdExFIiwid3JpdGVGbG9hdEJFIiwid3JpdGVEb3VibGVMRSIsIndyaXRlRG91YmxlQkUiLCJ0YXJnZXRTdGFydCIsInNldCIsImNvZGUiLCJJTlZBTElEX0JBU0U2NF9SRSIsIkluZmluaXR5IiwibGVhZFN1cnJvZ2F0ZSIsInRvQnl0ZUFycmF5IiwidHJpbSIsInJlcGxhY2UiLCJzdHJpbmd0cmltIiwiYmFzZTY0Y2xlYW4iLCJzcmMiLCJkc3QiLCJnIiwiRnVuY3Rpb24iLCJ3aW5kb3ciLCJjYWNoZWRTZXRUaW1lb3V0IiwiY2FjaGVkQ2xlYXJUaW1lb3V0IiwicHJvY2VzcyIsImRlZmF1bHRTZXRUaW1vdXQiLCJkZWZhdWx0Q2xlYXJUaW1lb3V0IiwicnVuVGltZW91dCIsImZ1biIsInNldFRpbWVvdXQiLCJjbGVhclRpbWVvdXQiLCJjdXJyZW50UXVldWUiLCJxdWV1ZSIsImRyYWluaW5nIiwicXVldWVJbmRleCIsImNsZWFuVXBOZXh0VGljayIsImRyYWluUXVldWUiLCJ0aW1lb3V0IiwicnVuIiwibWFya2VyIiwicnVuQ2xlYXJUaW1lb3V0IiwiSXRlbSIsIm5vb3AiLCJuZXh0VGljayIsImFyZ3MiLCJ0aXRsZSIsImJyb3dzZXIiLCJlbnYiLCJhcmd2IiwidmVyc2lvbiIsInZlcnNpb25zIiwib24iLCJhZGRMaXN0ZW5lciIsIm9uY2UiLCJvZmYiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImVtaXQiLCJwcmVwZW5kTGlzdGVuZXIiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwibGlzdGVuZXJzIiwiYmluZGluZyIsImN3ZCIsImNoZGlyIiwidW1hc2siLCJDUkxGIiwiV0FSQ1YiLCJXQVJDU2xhc2hWIiwiV0FSQ1R5cGVzIiwid2FyY2luZm8iLCJtZXRhZGF0YSIsInJlcXVlc3QiLCJyZXNwb25zZSIsInJldmlzaXQiLCJyZXNvdXJjZSIsImNvbnZlcnNpb24iLCJ1bmtub3duIiwiY29udGludWF0aW9uIiwiV0FSQ0NvbnRlbnRUeXBlcyIsIndhcmNGaWVsZHMiLCJodHRwUmVxdWVzdCIsImh0dHBSZXNwb25zZSIsInJlY29yZElkIiwidXVpZCIsIndhcmNEYXRlIiwiZGF0ZSIsIndhcmNUeXBlIiwid2FyY0NvbnRlbnRMZW5ndGgiLCJjb250ZW50TGVuIiwid2FyY0NvbmN1cnJlbnRUbyIsImNvbmN1cnJlbnRUbyIsIndhcmNXYXJjSW5mb0lkIiwid2lkIiwicmVxdWlyZWRIZWFkZXJGaWVsZHMiLCJyaWQiLCJ0YXJnZXRVUkkiLCJ3YXJjVGFyZ2V0VVJJIiwid2FyY0luZm9IZWFkZXIiLCJpbmZvSGVhZGVyIiwicmVxdWlyZWQiLCJmaWxlTmFtZSIsIndhcmNJbmZvQ29udGVudCIsImluZm9Db250ZW50IiwiYmFzZSIsIndhcmNSZXF1ZXN0SGVhZGVyIiwibm93Iiwid2FyY1Jlc3BvbnNlSGVhZGVyIiwid2FyY01ldGFkYXRhSGVhZGVyIiwicmVjb3JkU2VwYXJhdG9yIiwiQ1JMRjJ4IiwiY3RvciIsInN1cGVyQ3RvciIsInN1cGVyXyIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJUZW1wQ3RvciIsImZyZWVHbG9iYWwiLCJmcmVlU2VsZiIsInNlbGYiLCJyb290IiwicG5hIiwib2JqZWN0S2V5cyIsImtleXMiLCJEdXBsZXgiLCJ1dGlsIiwiaW5oZXJpdHMiLCJSZWFkYWJsZSIsIldyaXRhYmxlIiwidiIsIm1ldGhvZCIsIm9wdGlvbnMiLCJyZWFkYWJsZSIsImFsbG93SGFsZk9wZW4iLCJvbmVuZCIsIl93cml0YWJsZVN0YXRlIiwiZW5kZWQiLCJvbkVuZE5UIiwiaGlnaFdhdGVyTWFyayIsIl9yZWFkYWJsZVN0YXRlIiwiZGVzdHJveWVkIiwiX2Rlc3Ryb3kiLCJlcnIiLCJjYiIsImZzIiwiemxpYiIsIlBhdGgiLCJFdmVudEVtaXR0ZXIiLCJlbnN1cmVXQVJDRmlsZU5hbWUiLCJyZWNvcmRTZXBhcmF0b3JCdWZmZXIiLCJDUkxGQnVmZmVyIiwiV0FSQ1NlcFRTaXplIiwibWFrZUNvbnRlbnRCdWZmZXIiLCJtYXliZUJ1ZmZlciIsInN0ckJ1ZmYiLCJlbmRzV2l0aCIsImNudEJ1ZmZlciIsImVuc3VyZU9wdGlvbnMiLCJvcHRzIiwiYXBwZW5kaW5nIiwiZ3ppcCIsIk5PREVXQVJDX1dSSVRFX0daSVBQRUQiLCJbb2JqZWN0IE9iamVjdF0iLCJkZWZhdWx0T3B0cyIsInN1cGVyIiwiX3dhcmNPdXRTdHJlYW0iLCJfbGFzdEVycm9yIiwiX25vdyIsIl9maWxlTmFtZSIsIl93YXJjSW5mb0lkIiwiX3ZlcnNpb24iLCJfb25GaW5pc2giLCJfb25FcnJvciIsIndhcmNQYXRoIiwiYXNzaWduIiwid2ZwIiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJmbGFncyIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsImJhc2VuYW1lIiwicmVxRGF0YSIsInJlc0RhdGEiLCJyZXNSZWNJZCIsIl93cml0ZVJlcXVlc3RSZWNvcmQiLCJoZWFkZXJzIiwiX3dyaXRlUmVzcG9uc2VSZWNvcmQiLCJyZWNvcmRQYXJ0cyIsImNodW5rIiwid3JpdGVSZWNvcmRCbG9jayIsIndpbmZvIiwid3JpdGVXYXJjUmF3SW5mb1JlY29yZCIsInNvZnR3YXJlIiwicmVjSUQiLCJ3aGN0Iiwid2giLCJ0b3RhbExlbmd0aCIsInBhZ2VzIiwid2luZm9Db250ZW50IiwianNvbi1tZXRhZGF0YSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkZXNjIiwiYXV0b190aXRsZSIsIm1hcCIsInBhZ2UiLCJ0aW1lc3RhbXAiLCJ1cmwiLCJvdXRsaW5rcyIsIndyaXRlV2FyY01ldGFkYXRhIiwibWV0YURhdGEiLCJ3bWhjIiwid21oIiwiaHR0cEhlYWRlclN0cmluZyIsInJlcXVlc3REYXRhIiwicmVzcG9uc2VEYXRhIiwicmVjb3JkQnVmZmVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJnemlwU3luYyIsInJlc0lkIiwicmVxSGVhZENvbnRlbnRCdWZmZXIiLCJyZXFXSGVhZGVyIiwicmVzSGVhZGVyQ29udGVudEJ1ZmZlciIsInJlc3BXSGVhZGVyIiwibGUiLCJkZXN0cm95Iiwibm9HWiIsInJlcGxhY2VDb250ZW50TGVuIiwidW50aWxkaWZ5IiwiaGFzRlMiLCJnZXRTdHJlYW0iLCJ3cCIsInVzZVVudGlsZGlmeSIsImNyZWF0ZVJlYWRTdHJlYW0iLCJTdHJlYW0iLCJUcmFuc2Zvcm0iLCJQYXNzVGhyb3VnaCIsIm9iamVjdFRvU3RyaW5nIiwiaXNCb29sZWFuIiwiaXNOdWxsIiwiaXNOdWxsT3JVbmRlZmluZWQiLCJpc051bWJlciIsImlzU3RyaW5nIiwiaXNTeW1ib2wiLCJpc1VuZGVmaW5lZCIsImlzUmVnRXhwIiwicmUiLCJpc09iamVjdCIsImlzRGF0ZSIsImlzRXJyb3IiLCJpc0Z1bmN0aW9uIiwiaXNQcmltaXRpdmUiLCJSZWNvcmRCdWlsZGVyIiwiY3JsZiIsInJlYWRhYmxlT2JqZWN0TW9kZSIsImJ1ZmZlcmVkIiwiYnVpbGRlciIsInNlcExlbiIsImRvbmUiLCJwdXNoTGFzdCIsImlkeCIsIm1heWJlUmVjb3JkIiwibGFzdE1hdGNoIiwiY2h1bmtMZW4iLCJjb25zdW1lTGluZSIsImJ1aWxkUmVjb3JkIiwiZW5jIiwiX2NvbnN1bWVDaHVuayIsImFzeW5jR2VuRm5zIiwiZXJyb3IiLCJhc3luY0l0ZXJhdG9yIiwiV0FSQ1N0cmVhbVRyYW5zZm9ybSIsImFzeW5jIiwid2FyY1N0cmVhbSIsInJlY29yZEl0ZXJhdG9yIiwicGlwZSIsIm5leHRSZWNvcmQiLCJuZXh0IiwiYmFzZUlzTmF0aXZlIiwiZ2V0VmFsdWUiLCJnZXRSYXdUYWciLCJudWxsVGFnIiwidW5kZWZpbmVkVGFnIiwic3ltVG9TdHJpbmdUYWciLCJwdW55Y29kZSIsIlVybCIsInByb3RvY29sIiwic2xhc2hlcyIsImF1dGgiLCJob3N0IiwicG9ydCIsImhvc3RuYW1lIiwiaGFzaCIsInNlYXJjaCIsInF1ZXJ5IiwicGF0aG5hbWUiLCJwYXRoIiwiaHJlZiIsInBhcnNlIiwidXJsUGFyc2UiLCJzb3VyY2UiLCJyZWxhdGl2ZSIsInJlc29sdmVPYmplY3QiLCJmb3JtYXQiLCJwcm90b2NvbFBhdHRlcm4iLCJwb3J0UGF0dGVybiIsInNpbXBsZVBhdGhQYXR0ZXJuIiwidW53aXNlIiwiYXV0b0VzY2FwZSIsIm5vbkhvc3RDaGFycyIsImhvc3RFbmRpbmdDaGFycyIsImhvc3RuYW1lUGFydFBhdHRlcm4iLCJob3N0bmFtZVBhcnRTdGFydCIsInVuc2FmZVByb3RvY29sIiwiamF2YXNjcmlwdCIsImphdmFzY3JpcHQ6IiwiaG9zdGxlc3NQcm90b2NvbCIsInNsYXNoZWRQcm90b2NvbCIsImh0dHAiLCJodHRwcyIsImZ0cCIsImdvcGhlciIsImZpbGUiLCJodHRwOiIsImh0dHBzOiIsImZ0cDoiLCJnb3BoZXI6IiwiZmlsZToiLCJxdWVyeXN0cmluZyIsInBhcnNlUXVlcnlTdHJpbmciLCJzbGFzaGVzRGVub3RlSG9zdCIsInUiLCJxdWVyeUluZGV4Iiwic3BsaXR0ZXIiLCJ1U3BsaXQiLCJzcGxpdCIsInJlc3QiLCJzaW1wbGVQYXRoIiwiZXhlYyIsInByb3RvIiwibG93ZXJQcm90byIsImF0U2lnbiIsImhvc3RFbmQiLCJoZWMiLCJkZWNvZGVVUklDb21wb25lbnQiLCJwYXJzZUhvc3QiLCJpcHY2SG9zdG5hbWUiLCJob3N0cGFydHMiLCJwYXJ0IiwibmV3cGFydCIsImsiLCJ2YWxpZFBhcnRzIiwibm90SG9zdCIsImJpdCIsInVuc2hpZnQiLCJ0b0FTQ0lJIiwiaCIsImFlIiwiZXNjIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZXNjYXBlIiwicW0iLCJjaGFyQXQiLCJyZWwiLCJyZXN1bHQiLCJ0a2V5cyIsInRrIiwidGtleSIsInJrZXlzIiwicmsiLCJya2V5IiwicmVsUGF0aCIsInNoaWZ0IiwiaXNTb3VyY2VBYnMiLCJpc1JlbEFicyIsIm11c3RFbmRBYnMiLCJyZW1vdmVBbGxEb3RzIiwic3JjUGF0aCIsInBzeWNob3RpYyIsInBvcCIsImF1dGhJbkhvc3QiLCJsYXN0IiwiaGFzVHJhaWxpbmdTbGFzaCIsInVwIiwic3BsaWNlIiwiaXNBYnNvbHV0ZSIsImFzc2VydCIsIm9rIiwia1JhbmdlRXJyb3JNZXNzYWdlIiwiWl9NSU5fV0lORE9XQklUUyIsIlpfTUFYX1dJTkRPV0JJVFMiLCJaX0RFRkFVTFRfV0lORE9XQklUUyIsIlpfTUlOX0NIVU5LIiwiWl9NQVhfQ0hVTksiLCJaX0RFRkFVTFRfQ0hVTksiLCJaX01JTl9NRU1MRVZFTCIsIlpfTUFYX01FTUxFVkVMIiwiWl9ERUZBVUxUX01FTUxFVkVMIiwiWl9NSU5fTEVWRUwiLCJaX01BWF9MRVZFTCIsIlpfREVGQVVMVF9MRVZFTCIsIlpfREVGQVVMVF9DT01QUkVTU0lPTiIsImJrZXlzIiwiYmsiLCJia2V5IiwiY29kZXMiLCJaX09LIiwiWl9TVFJFQU1fRU5EIiwiWl9ORUVEX0RJQ1QiLCJaX0VSUk5PIiwiWl9TVFJFQU1fRVJST1IiLCJaX0RBVEFfRVJST1IiLCJaX01FTV9FUlJPUiIsIlpfQlVGX0VSUk9SIiwiWl9WRVJTSU9OX0VSUk9SIiwiY2tleXMiLCJjayIsImNrZXkiLCJ6bGliQnVmZmVyIiwiZW5naW5lIiwiY2FsbGJhY2siLCJidWZmZXJzIiwibnJlYWQiLCJmbG93Iiwib25FbmQiLCJjbG9zZSIsInpsaWJCdWZmZXJTeW5jIiwiZmx1c2hGbGFnIiwiX2ZpbmlzaEZsdXNoRmxhZyIsIl9wcm9jZXNzQ2h1bmsiLCJEZWZsYXRlIiwiWmxpYiIsIkRFRkxBVEUiLCJJbmZsYXRlIiwiSU5GTEFURSIsIkd6aXAiLCJHWklQIiwiR3VuemlwIiwiR1VOWklQIiwiRGVmbGF0ZVJhdyIsIkRFRkxBVEVSQVciLCJJbmZsYXRlUmF3IiwiSU5GTEFURVJBVyIsIlVuemlwIiwiVU5aSVAiLCJpc1ZhbGlkRmx1c2hGbGFnIiwiZmxhZyIsIlpfTk9fRkxVU0giLCJaX1BBUlRJQUxfRkxVU0giLCJaX1NZTkNfRkxVU0giLCJaX0ZVTExfRkxVU0giLCJaX0ZJTklTSCIsIlpfQkxPQ0siLCJfdGhpcyIsIl9vcHRzIiwiX2NodW5rU2l6ZSIsImNodW5rU2l6ZSIsImZsdXNoIiwiZmluaXNoRmx1c2giLCJfZmx1c2hGbGFnIiwid2luZG93Qml0cyIsImxldmVsIiwibWVtTGV2ZWwiLCJzdHJhdGVneSIsIlpfRklMVEVSRUQiLCJaX0hVRkZNQU5fT05MWSIsIlpfUkxFIiwiWl9GSVhFRCIsIlpfREVGQVVMVF9TVFJBVEVHWSIsImRpY3Rpb25hcnkiLCJfaGFuZGxlIiwiX2hhZEVycm9yIiwib25lcnJvciIsIm1lc3NhZ2UiLCJlcnJubyIsIl9jbG9zZSIsImluaXQiLCJfYnVmZmVyIiwiX29mZnNldCIsIl9sZXZlbCIsIl9zdHJhdGVneSIsImVtaXRDbG9zZU5UIiwiZnJlZXplIiwiY3JlYXRlRGVmbGF0ZSIsImNyZWF0ZUluZmxhdGUiLCJjcmVhdGVEZWZsYXRlUmF3IiwiY3JlYXRlSW5mbGF0ZVJhdyIsImNyZWF0ZUd6aXAiLCJjcmVhdGVHdW56aXAiLCJjcmVhdGVVbnppcCIsImRlZmxhdGUiLCJkZWZsYXRlU3luYyIsImRlZmxhdGVSYXciLCJkZWZsYXRlUmF3U3luYyIsInVuemlwIiwidW56aXBTeW5jIiwiaW5mbGF0ZSIsImluZmxhdGVTeW5jIiwiZ3VuemlwIiwiZ3VuemlwU3luYyIsImluZmxhdGVSYXciLCJpbmZsYXRlUmF3U3luYyIsInBhcmFtcyIsInJlc2V0IiwiX2ZsdXNoIiwiX3RyYW5zZm9ybSIsImtpbmQiLCJfdGhpczIiLCJ3cyIsImVuZGluZyIsIm5lZWREcmFpbiIsImF2YWlsSW5CZWZvcmUiLCJhdmFpbE91dEJlZm9yZSIsImluT2ZmIiwiZXIiLCJ3cml0ZVN5bmMiLCJyZXEiLCJhdmFpbEluQWZ0ZXIiLCJhdmFpbE91dEFmdGVyIiwiaGF2ZSIsIm5ld1JlcSIsImZuIiwiYXJnMSIsImFyZzIiLCJhcmczIiwiY29weVByb3BzIiwiU2FmZUJ1ZmZlciIsIlRZUEVEX09LIiwiVWludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiX2hhcyIsInNvdXJjZXMiLCJzaHJpbmtCdWYiLCJmblR5cGVkIiwiYXJyYXlTZXQiLCJkZXN0Iiwic3JjX29mZnMiLCJkZXN0X29mZnMiLCJmbGF0dGVuQ2h1bmtzIiwiY2h1bmtzIiwiZm5VbnR5cGVkIiwic2V0VHlwZWQiLCJCdWY4IiwiQnVmMTYiLCJCdWYzMiIsImhhcyIsInByZWZpeCIsIkV2ZW50cyIsIkVFIiwiY29udGV4dCIsImVtaXR0ZXIiLCJldmVudCIsImxpc3RlbmVyIiwiZXZ0IiwiX2V2ZW50cyIsIl9ldmVudHNDb3VudCIsImNsZWFyRXZlbnQiLCJldmVudE5hbWVzIiwiZXZlbnRzIiwibmFtZXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJoYW5kbGVycyIsImVlIiwibGlzdGVuZXJDb3VudCIsImExIiwiYTIiLCJhMyIsImE0IiwiYTUiLCJwcmVmaXhlZCIsIkNhcHR1cmVkUmVxdWVzdCIsIl9jYXB0dXJlIiwiX3JlcXVlc3RzIiwiTWFwIiwiY2xlYXIiLCJpbmZvIiwicmVxdWVzdElkIiwiYWRkUmVxdWVzdEluZm8iLCJpdGVyYXRvciIsImVudHJpZXMiLCJ2YWx1ZXMiLCJpdGVyYXRlZSIsInRoaXNBcmciLCJmb3JFYWNoIiwiY3IiLCJyaSIsIm9uZGF0YSIsInBhdXNlIiwib25kcmFpbiIsInJlc3VtZSIsIl9pc1N0ZGlvIiwib25jbG9zZSIsImRpZE9uRW5kIiwiY2xlYW51cCIsIlJlZmxlY3RPd25LZXlzIiwiUiIsIlJlZmxlY3QiLCJSZWZsZWN0QXBwbHkiLCJyZWNlaXZlciIsIm93bktleXMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiTnVtYmVySXNOYU4iLCJfbWF4TGlzdGVuZXJzIiwiZGVmYXVsdE1heExpc3RlbmVycyIsIiRnZXRNYXhMaXN0ZW5lcnMiLCJfYWRkTGlzdGVuZXIiLCJwcmVwZW5kIiwiZXhpc3RpbmciLCJ3YXJuaW5nIiwibmV3TGlzdGVuZXIiLCJ3YXJuZWQiLCJ3IiwiY291bnQiLCJjb25zb2xlIiwid2FybiIsIl9vbmNlV3JhcCIsInN0YXRlIiwiZmlyZWQiLCJ3cmFwRm4iLCJ3cmFwcGVkIiwiX2xpc3RlbmVycyIsInVud3JhcCIsImV2bGlzdGVuZXIiLCJ1bndyYXBMaXN0ZW5lcnMiLCJhcnJheUNsb25lIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRNYXhMaXN0ZW5lcnMiLCJnZXRNYXhMaXN0ZW5lcnMiLCJkb0Vycm9yIiwiaGFuZGxlciIsInBvc2l0aW9uIiwib3JpZ2luYWxMaXN0ZW5lciIsImluZGV4Iiwic3BsaWNlT25lIiwicmF3TGlzdGVuZXJzIiwic2V0SW1tZWRpYXRlIiwiQ29ya2VkUmVxdWVzdCIsImVudHJ5IiwiZmluaXNoIiwiY29ya1JlcSIsInBlbmRpbmdjYiIsImNvcmtlZFJlcXVlc3RzRnJlZSIsIm9uQ29ya2VkRmluaXNoIiwiYXN5bmNXcml0ZSIsIldyaXRhYmxlU3RhdGUiLCJpbnRlcm5hbFV0aWwiLCJkZXByZWNhdGUiLCJPdXJVaW50OEFycmF5IiwicmVhbEhhc0luc3RhbmNlIiwiZGVzdHJveUltcGwiLCJub3AiLCJzdHJlYW0iLCJpc0R1cGxleCIsIm9iamVjdE1vZGUiLCJ3cml0YWJsZU9iamVjdE1vZGUiLCJod20iLCJ3cml0YWJsZUh3bSIsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIsImRlZmF1bHRId20iLCJmaW5hbENhbGxlZCIsImZpbmlzaGVkIiwibm9EZWNvZGUiLCJkZWNvZGVTdHJpbmdzIiwiZGVmYXVsdEVuY29kaW5nIiwid3JpdGluZyIsImNvcmtlZCIsInN5bmMiLCJidWZmZXJQcm9jZXNzaW5nIiwib253cml0ZSIsIndyaXRlY2IiLCJ3cml0ZWxlbiIsIm9ud3JpdGVTdGF0ZVVwZGF0ZSIsImZpbmlzaE1heWJlIiwiZXJyb3JFbWl0dGVkIiwib253cml0ZUVycm9yIiwibmVlZEZpbmlzaCIsImJ1ZmZlcmVkUmVxdWVzdCIsImNsZWFyQnVmZmVyIiwiYWZ0ZXJXcml0ZSIsImxhc3RCdWZmZXJlZFJlcXVlc3QiLCJwcmVmaW5pc2hlZCIsImJ1ZmZlcmVkUmVxdWVzdENvdW50IiwiX3dyaXRlIiwid3JpdGV2IiwiX3dyaXRldiIsImZpbmFsIiwiX2ZpbmFsIiwiZG9Xcml0ZSIsIm9ud3JpdGVEcmFpbiIsImhvbGRlciIsImFsbEJ1ZmZlcnMiLCJpc0J1ZiIsImNhbGxGaW5hbCIsIm5lZWQiLCJwcmVmaW5pc2giLCJnZXRCdWZmZXIiLCJjdXJyZW50IiwiXyIsImhhc0luc3RhbmNlIiwiX3VpbnQ4QXJyYXlUb0J1ZmZlciIsIndyaXRlQWZ0ZXJFbmQiLCJ2YWxpZCIsInZhbGlkQ2h1bmsiLCJuZXdDaHVuayIsImRlY29kZUNodW5rIiwid3JpdGVPckJ1ZmZlciIsImNvcmsiLCJ1bmNvcmsiLCJzZXREZWZhdWx0RW5jb2RpbmciLCJlbmRXcml0YWJsZSIsIl91bmRlc3Ryb3kiLCJ1bmRlc3Ryb3kiLCJjYW5SZXBsYXlQcm90b2NvbHMiLCJTZXQiLCJTUEFDRSIsIkgyTWV0aG9kIiwiSDJwYXRoIiwiSFRUUDFEMSIsIkRBU0giLCJiZWdpbiIsIm1kYXRhIiwiZW1wdHkiLCJ3ZWJwYWNrUG9seWZpbGwiLCJwYXRocyIsImNoaWxkcmVuIiwiQ2xpZW50UmVxdWVzdCIsImV4dGVuZCIsInN0YXR1c0NvZGVzIiwiZGVmYXVsdFByb3RvY29sIiwibG9jYXRpb24iLCJ0b1VwcGVyQ2FzZSIsIkluY29taW5nTWVzc2FnZSIsIkFnZW50IiwiZGVmYXVsdE1heFNvY2tldHMiLCJnbG9iYWxBZ2VudCIsIlNUQVRVU19DT0RFUyIsIk1FVEhPRFMiLCJzdGFydENhc2UiLCJTUEFDRVJlIiwiZW5zdXJlSFRUUDJIZWFkZXJzIiwiaGVhZGVyS2V5Iiwic3RyaW5naWZ5SGVhZGVycyIsIm91dFN0cmluZyIsInN0cmluZ2lmeVJlcXVlc3RIZWFkZXJzIiwiaGFzSG9zdCIsImJhc2VUb1N0cmluZyIsIlJlYWRhYmxlU3RhdGUiLCJFRWxpc3RlbmVyQ291bnQiLCJkZWJ1Z1V0aWwiLCJkZWJ1ZyIsImRlYnVnbG9nIiwiU3RyaW5nRGVjb2RlciIsIkJ1ZmZlckxpc3QiLCJrUHJveHlFdmVudHMiLCJyZWFkYWJsZUh3bSIsInJlYWRhYmxlSGlnaFdhdGVyTWFyayIsInBpcGVzIiwicGlwZXNDb3VudCIsImZsb3dpbmciLCJlbmRFbWl0dGVkIiwicmVhZGluZyIsIm5lZWRSZWFkYWJsZSIsImVtaXR0ZWRSZWFkYWJsZSIsInJlYWRhYmxlTGlzdGVuaW5nIiwicmVzdW1lU2NoZWR1bGVkIiwiYXdhaXREcmFpbiIsInJlYWRpbmdNb3JlIiwiZGVjb2RlciIsIl9yZWFkIiwicmVhZGFibGVBZGRDaHVuayIsImFkZFRvRnJvbnQiLCJza2lwQ2h1bmtDaGVjayIsImVtaXRSZWFkYWJsZSIsIm9uRW9mQ2h1bmsiLCJjaHVua0ludmFsaWQiLCJhZGRDaHVuayIsIm1heWJlUmVhZE1vcmUiLCJuZWVkTW9yZURhdGEiLCJpc1BhdXNlZCIsInNldEVuY29kaW5nIiwiTUFYX0hXTSIsImhvd011Y2hUb1JlYWQiLCJoZWFkIiwiY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsiLCJlbWl0UmVhZGFibGVfIiwibWF5YmVSZWFkTW9yZV8iLCJuUmVhZGluZ05leHRUaWNrIiwicmVzdW1lXyIsImZyb21MaXN0IiwiaGFzU3RyaW5ncyIsIm5iIiwidGFpbCIsImNvcHlGcm9tQnVmZmVyU3RyaW5nIiwiY29weUZyb21CdWZmZXIiLCJmcm9tTGlzdFBhcnRpYWwiLCJlbmRSZWFkYWJsZSIsImVuZFJlYWRhYmxlTlQiLCJ4cyIsIm5PcmlnIiwiZG9SZWFkIiwicGlwZU9wdHMiLCJlbmRGbiIsInN0ZG91dCIsInN0ZGVyciIsInVucGlwZSIsIm9udW5waXBlIiwidW5waXBlSW5mbyIsImhhc1VucGlwZWQiLCJvbmZpbmlzaCIsImNsZWFuZWRVcCIsInBpcGVPbkRyYWluIiwiaW5jcmVhc2VkQXdhaXREcmFpbiIsImRlc3RzIiwiZXYiLCJ3cmFwIiwicGF1c2VkIiwiX2Zyb21MaXN0IiwiZW1pdEVycm9yTlQiLCJyZWFkYWJsZURlc3Ryb3llZCIsIndyaXRhYmxlRGVzdHJveWVkIiwibmVuYyIsInJldHJpZWQiLCJfbm9ybWFsaXplRW5jb2RpbmciLCJub3JtYWxpemVFbmNvZGluZyIsInRleHQiLCJ1dGYxNlRleHQiLCJ1dGYxNkVuZCIsImZpbGxMYXN0IiwidXRmOEZpbGxMYXN0IiwiYmFzZTY0VGV4dCIsImJhc2U2NEVuZCIsInNpbXBsZVdyaXRlIiwic2ltcGxlRW5kIiwibGFzdE5lZWQiLCJsYXN0VG90YWwiLCJsYXN0Q2hhciIsInV0ZjhDaGVja0J5dGUiLCJieXRlIiwidXRmOENoZWNrRXh0cmFCeXRlcyIsInRvdGFsIiwidXRmOENoZWNrSW5jb21wbGV0ZSIsImFmdGVyVHJhbnNmb3JtIiwidHMiLCJfdHJhbnNmb3JtU3RhdGUiLCJ0cmFuc2Zvcm1pbmciLCJ3cml0ZWNodW5rIiwicnMiLCJuZWVkVHJhbnNmb3JtIiwid3JpdGVlbmNvZGluZyIsInRyYW5zZm9ybSIsImVycjIiLCJvYmplY3RBc3NpZ24iLCJoYXNPd24iLCJwU2xpY2UiLCJmdW5jdGlvbnNIYXZlTmFtZXMiLCJwVG9TdHJpbmciLCJhcnJidWYiLCJEYXRhVmlldyIsInJlZ2V4IiwiZ2V0TmFtZSIsImZ1bmMiLCJ0cnVuY2F0ZSIsInNvbWV0aGluZyIsInJhd25hbWUiLCJmYWlsIiwiZXhwZWN0ZWQiLCJvcGVyYXRvciIsInN0YWNrU3RhcnRGdW5jdGlvbiIsIkFzc2VydGlvbkVycm9yIiwiX2RlZXBFcXVhbCIsInN0cmljdCIsIm1lbW9zIiwiZ2V0VGltZSIsIm11bHRpbGluZSIsImxhc3RJbmRleCIsImlnbm9yZUNhc2UiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJhY3R1YWxJbmRleCIsImFjdHVhbFZpc2l0ZWRPYmplY3RzIiwiYUlzQXJncyIsImlzQXJndW1lbnRzIiwiYklzQXJncyIsImthIiwia2IiLCJzb3J0Iiwib2JqRXF1aXYiLCJleHBlY3RlZEV4Y2VwdGlvbiIsInRlc3QiLCJpc1Byb3RvdHlwZU9mIiwiX3Rocm93cyIsInNob3VsZFRocm93IiwiYmxvY2siLCJfdHJ5QmxvY2siLCJ1c2VyUHJvdmlkZWRNZXNzYWdlIiwiaXNVbmV4cGVjdGVkRXhjZXB0aW9uIiwiZ2VuZXJhdGVkTWVzc2FnZSIsImdldE1lc3NhZ2UiLCJjYXB0dXJlU3RhY2tUcmFjZSIsInN0YWNrIiwiZm5fbmFtZSIsIm5leHRfbGluZSIsInN1YnN0cmluZyIsImVxdWFsIiwibm90RXF1YWwiLCJkZWVwRXF1YWwiLCJkZWVwU3RyaWN0RXF1YWwiLCJub3REZWVwRXF1YWwiLCJub3REZWVwU3RyaWN0RXF1YWwiLCJzdHJpY3RFcXVhbCIsIm5vdFN0cmljdEVxdWFsIiwidGhyb3dzIiwiZG9lc05vdFRocm93IiwiaWZFcnJvciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZXNjcmlwdG9ycyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImZvcm1hdFJlZ0V4cCIsImYiLCJvYmplY3RzIiwibXNnIiwibm9EZXByZWNhdGlvbiIsInRocm93RGVwcmVjYXRpb24iLCJ0cmFjZURlcHJlY2F0aW9uIiwidHJhY2UiLCJkZWJ1Z0Vudmlyb24iLCJkZWJ1Z3MiLCJjdHgiLCJzZWVuIiwic3R5bGl6ZSIsInN0eWxpemVOb0NvbG9yIiwiZGVwdGgiLCJjb2xvcnMiLCJzaG93SGlkZGVuIiwiX2V4dGVuZCIsImN1c3RvbUluc3BlY3QiLCJzdHlsaXplV2l0aENvbG9yIiwiZm9ybWF0VmFsdWUiLCJzdHlsZVR5cGUiLCJzdHlsZSIsInN0eWxlcyIsInJlY3Vyc2VUaW1lcyIsInByaW1pdGl2ZSIsInNpbXBsZSIsImZvcm1hdFByaW1pdGl2ZSIsInZpc2libGVLZXlzIiwiYXJyYXlUb0hhc2giLCJmb3JtYXRFcnJvciIsIlJlZ0V4cCIsIm91dHB1dCIsImJyYWNlcyIsInRvVVRDU3RyaW5nIiwiZm9ybWF0UHJvcGVydHkiLCJmb3JtYXRBcnJheSIsInJlZHVjZSIsInByZXYiLCJjdXIiLCJudW1MaW5lc0VzdCIsInJlZHVjZVRvU2luZ2xlU3RyaW5nIiwibGluZSIsImFyIiwicGFkIiwiTk9ERV9ERUJVRyIsInBpZCIsImJvbGQiLCJpdGFsaWMiLCJ1bmRlcmxpbmUiLCJpbnZlcnNlIiwid2hpdGUiLCJncmV5IiwiYmxhY2siLCJibHVlIiwiY3lhbiIsImdyZWVuIiwibWFnZW50YSIsInJlZCIsInllbGxvdyIsInNwZWNpYWwiLCJudW1iZXIiLCJib29sZWFuIiwibnVsbCIsInJlZ2V4cCIsIm1vbnRocyIsInByb3AiLCJsb2ciLCJ0aW1lIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImdldERhdGUiLCJnZXRNb250aCIsIm9yaWdpbiIsImFkZCIsImtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCIsImNhbGxiYWNraWZ5T25SZWplY3RlZCIsInJlYXNvbiIsIm5ld1JlYXNvbiIsInByb21pc2lmeSIsIm9yaWdpbmFsIiwicHJvbWlzZVJlc29sdmUiLCJwcm9taXNlUmVqZWN0IiwicHJvbWlzZSIsInNldFByb3RvdHlwZU9mIiwiZGVmaW5lUHJvcGVydGllcyIsImN1c3RvbSIsImNhbGxiYWNraWZ5IiwiY2FsbGJhY2tpZmllZCIsIm1heWJlQ2IiLCJ0aGVuIiwicmVqIiwiYWRsZXIiLCJzMSIsInMyIiwiY3JjVGFibGUiLCJ0YWJsZSIsIm1ha2VUYWJsZSIsImNyYyIsImdzIiwiZ3ppcE1hZ2ljTnVtIiwiZ3ppcE1hZ2ljTnVtTGVuIiwiZmlsZVBhdGgiLCJmZCIsIm9wZW4iLCJmaWxsTWUiLCJpc0d6aXBwZWQiLCJvcGVuU3luYyIsInJlYWRTeW5jIiwiY2xvc2VTeW5jIiwiX25vZGVJZCIsIl9jbG9ja3NlcSIsInJuZyIsImJ5dGVzVG9VdWlkIiwiX2xhc3RNU2VjcyIsIl9sYXN0TlNlY3MiLCJub2RlIiwiY2xvY2tzZXEiLCJzZWVkQnl0ZXMiLCJtc2VjcyIsIm5zZWNzIiwiZHQiLCJ0bCIsInRtaCIsIm9iamVjdFByb3RvIiwiQ3RvciIsImJhc2VHZXRUYWciLCJhc3luY1RhZyIsImZ1bmNUYWciLCJnZW5UYWciLCJwcm94eVRhZyIsInRhZyIsImZ1bmNUb1N0cmluZyIsIk1BWF9TQUZFX0lOVEVHRVIiLCJmZXRjaCIsIlJlYWRhYmxlU3RyZWFtIiwid3JpdGFibGVTdHJlYW0iLCJXcml0YWJsZVN0cmVhbSIsImFib3J0Q29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImJsb2JDb25zdHJ1Y3RvciIsIkJsb2IiLCJ4aHIiLCJnZXRYSFIiLCJYTUxIdHRwUmVxdWVzdCIsIlhEb21haW5SZXF1ZXN0IiwiY2hlY2tUeXBlU3VwcG9ydCIsInJlc3BvbnNlVHlwZSIsImhhdmVBcnJheUJ1ZmZlciIsImhhdmVTbGljZSIsImFycmF5YnVmZmVyIiwibXNzdHJlYW0iLCJtb3pjaHVua2VkYXJyYXlidWZmZXIiLCJvdmVycmlkZU1pbWVUeXBlIiwidmJBcnJheSIsIlZCQXJyYXkiLCJjYXBhYmlsaXR5IiwiclN0YXRlcyIsInJlYWR5U3RhdGVzIiwiVU5TRU5UIiwiT1BFTkVEIiwiSEVBREVSU19SRUNFSVZFRCIsIkxPQURJTkciLCJET05FIiwiZmV0Y2hUaW1lciIsIl9tb2RlIiwicmF3SGVhZGVycyIsInRyYWlsZXJzIiwicmF3VHJhaWxlcnMiLCJfZmV0Y2hSZXNwb25zZSIsInN0YXR1c0NvZGUiLCJzdGF0dXMiLCJzdGF0dXNNZXNzYWdlIiwic3RhdHVzVGV4dCIsImhlYWRlciIsIl9kZXN0cm95ZWQiLCJfcmVzdW1lRmV0Y2giLCJhYm9ydCIsImJvZHkiLCJwaXBlVG8iLCJjYXRjaCIsInJlYWRlciIsImdldFJlYWRlciIsIl94aHIiLCJfcG9zIiwicmVzcG9uc2VVUkwiLCJnZXRBbGxSZXNwb25zZUhlYWRlcnMiLCJtYXRjaGVzIiwiX2NoYXJzZXQiLCJtaW1lVHlwZSIsImNoYXJzZXRNYXRjaCIsIl9vblhIUlByb2dyZXNzIiwicmVhZHlTdGF0ZSIsInJlc3BvbnNlQm9keSIsInRvQXJyYXkiLCJyZXNwb25zZVRleHQiLCJuZXdEYXRhIiwiTVNTdHJlYW1SZWFkZXIiLCJvbnByb2dyZXNzIiwib25sb2FkIiwicmVhZEFzQXJyYXlCdWZmZXIiLCJyZUhhc1VuaWNvZGUiLCJVUkwiLCJodHRwUmVxdWVzdFBhdGgiLCJzZWFyY2hQYXJhbXMiLCJIZWFkZXJUcmFpbGVycyIsIkNEUFJlcXVlc3RJbmZvIiwiX3VybCIsInVybEZyYWdtZW50IiwicG9zdERhdGEiLCJyZXF1ZXN0SGVhZGVycyIsInJlcXVlc3RIZWFkZXJzXyIsInJlcXVlc3RIZWFkZXJzVGV4dCIsInJlc3BvbnNlSGVhZGVycyIsInJlc3BvbnNlSGVhZGVyc1RleHQiLCJnZXRCb2R5IiwiaGFzUG9zdERhdGEiLCJyZWRpckNSIiwicmVkaXJlY3RSZXNwb25zZSIsImhlYWRlcnNUZXh0Iiwibm90M3h4IiwiZmNybGZpZHgiLCJmbGluZSIsIl9jaGVja01ldGhvZCIsIl9lbnN1cmVQcm90byIsInB1cmwiLCJnZXRQYXJzZWRVUkwiLCJfZ2V0UmVxSGVhZGVyT2JqIiwiSG9zdCIsIl9zZXJpYWxpemVSZXF1ZXN0SGVhZGVyc1RleHQiLCJfc2VyaWFsaXplUmVxdWVzdEhlYWRlcnNPYmoiLCJnb29kIiwibWF5YmVNZXRoIiwiX21ldGhQcm90b0Zyb21SZXFIZWFkVGV4dCIsImh0dHBTdHJpbmciLCJodHRwU3RyaW5nUGFydHMiLCJfY29ycmVjdFByb3RvY29sIiwib3JpZ2luYWxQcm90b2NvbCIsIm5ld1Byb3RvY29sIiwiaXNSZXEiLCJpc1JlZGlyIiwiaXNSZXMiLCJkZXRlcm1pblJlcXVlc3RUeXBlIiwiX3JlcXMiLCJydCIsImZyb21SZWRpciIsImZyb21SZXF1ZXN0IiwiZnJvbVJlc3BvbnNlIiwiYWRkUmVzcG9uc2UiLCJ1cmxzIiwiQXV0b1dBUkNQYXJzZXIiLCJXQVJDR3pQYXJzZXIiLCJXQVJDUGFyc2VyIiwiQ1JJRXh0cmFXQVJDR2VuZXJhdG9yIiwiRWxlY3Ryb25XQVJDV3JpdGVyIiwiUHVwcGV0ZWVyQ0RQV0FSQ0dlbmVyYXRvciIsIlB1cHBldGVlcldBUkNHZW5lcmF0b3IiLCJSZW1vdGVDaHJvbWVXQVJDV3JpdGVyIiwiV0FSQ1dyaXRlckJhc2UiLCJDUklFeHRyYUNhcHR1cmVyIiwiRWxlY3Ryb25DYXB0dXJlciIsIlB1cHBldGVlckNhcHR1cmVyIiwiUHVwcGV0ZWVyQ0RQQ2FwdHVyZXIiLCJSZW1vdGVDaHJvbWVDYXB0dXJlciIsIlJlcXVlc3RIYW5kbGVyIiwiUmVxdWVzdExpYldBUkNXcml0ZXIiLCJHemlwRGV0ZWN0b3IiLCJjYW5Vc2VSZWNvcmRJdGVyYXRvciIsIl93cCIsIl9wYXJzaW5nIiwiX29uUmVjb3JkIiwiX29uRW5kIiwiX2dldFN0cmVhbSIsInN0YXJ0ZWRQYXJzaW5nIiwicmVjb3JkIiwiaXNHeiIsImlzR3ppcHBlZFN5bmMiLCJiNjQiLCJsZW5zIiwiZ2V0TGVucyIsInZhbGlkTGVuIiwicGxhY2VIb2xkZXJzTGVuIiwidG1wIiwiQXJyIiwiX2J5dGVMZW5ndGgiLCJjdXJCeXRlIiwicmV2TG9va3VwIiwidWludDgiLCJleHRyYUJ5dGVzIiwicGFydHMiLCJsZW4yIiwiZW5jb2RlQ2h1bmsiLCJsb29rdXAiLCJudW0iLCJpc0xFIiwibUxlbiIsIm5CeXRlcyIsImVMZW4iLCJlTWF4IiwiZUJpYXMiLCJuQml0cyIsIk5hTiIsImFicyIsIkxOMiIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJfY2xhc3NDYWxsQ2hlY2siLCJzY29wZSIsIlRpbWVvdXQiLCJpZCIsImNsZWFyRm4iLCJfaWQiLCJfY2xlYXJGbiIsInNldEludGVydmFsIiwiY2xlYXJJbnRlcnZhbCIsInVucmVmIiwicmVmIiwiZW5yb2xsIiwiaXRlbSIsIl9pZGxlVGltZW91dElkIiwiX2lkbGVUaW1lb3V0IiwidW5lbnJvbGwiLCJfdW5yZWZBY3RpdmUiLCJhY3RpdmUiLCJfb25UaW1lb3V0IiwiY2xlYXJJbW1lZGlhdGUiLCJyZWdpc3RlckltbWVkaWF0ZSIsImh0bWwiLCJjaGFubmVsIiwibWVzc2FnZVByZWZpeCIsIm9uR2xvYmFsTWVzc2FnZSIsIm5leHRIYW5kbGUiLCJ0YXNrc0J5SGFuZGxlIiwiY3VycmVudGx5UnVubmluZ0FUYXNrIiwiZG9jIiwiZG9jdW1lbnQiLCJhdHRhY2hUbyIsImhhbmRsZSIsInJ1bklmUHJlc2VudCIsInBvc3RNZXNzYWdlIiwiaW1wb3J0U2NyaXB0cyIsInBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMiLCJvbGRPbk1lc3NhZ2UiLCJvbm1lc3NhZ2UiLCJjYW5Vc2VQb3N0TWVzc2FnZSIsIk1lc3NhZ2VDaGFubmVsIiwicG9ydDEiLCJwb3J0MiIsImNyZWF0ZUVsZW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJzY3JpcHQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZW1vdmVDaGlsZCIsImFwcGVuZENoaWxkIiwicmFuZG9tIiwiYWRkRXZlbnRMaXN0ZW5lciIsImF0dGFjaEV2ZW50IiwidGFzayIsImNvbmZpZyIsImxvY2FsU3RvcmFnZSIsIlpzdHJlYW0iLCJ6bGliX2RlZmxhdGUiLCJ6bGliX2luZmxhdGUiLCJjb25zdGFudHMiLCJOT05FIiwiaW5pdF9kb25lIiwid3JpdGVfaW5fcHJvZ3Jlc3MiLCJwZW5kaW5nX2Nsb3NlIiwiZ3ppcF9pZF9ieXRlc19yZWFkIiwiZGVmbGF0ZUVuZCIsInN0cm0iLCJpbmZsYXRlRW5kIiwiaW5wdXQiLCJpbl9vZmYiLCJpbl9sZW4iLCJvdXRfb2ZmIiwib3V0X2xlbiIsImF2YWlsX2luIiwibmV4dF9pbiIsImF2YWlsX291dCIsIm5leHRfb3V0IiwiX3Byb2Nlc3MiLCJfY2hlY2tFcnJvciIsIl9hZnRlclN5bmMiLCJfYWZ0ZXIiLCJuZXh0X2V4cGVjdGVkX2hlYWRlcl9ieXRlIiwiaW5mbGF0ZVNldERpY3Rpb25hcnkiLCJfZXJyb3IiLCJfaW5pdCIsIl9zZXREaWN0aW9uYXJ5IiwiX3Jlc2V0IiwiZGVmbGF0ZUluaXQyIiwiWl9ERUZMQVRFRCIsImluZmxhdGVJbml0MiIsImRlZmxhdGVTZXREaWN0aW9uYXJ5IiwiZGVmbGF0ZVJlc2V0IiwiaW5mbGF0ZVJlc2V0IiwicHJvcElzRW51bWVyYWJsZSIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwidGVzdDEiLCJ0ZXN0MiIsInRlc3QzIiwibGV0dGVyIiwic2hvdWxkVXNlTmF0aXZlIiwic3ltYm9scyIsInRvIiwidG9PYmplY3QiLCJ0b3RhbF9pbiIsInRvdGFsX291dCIsImRhdGFfdHlwZSIsImNvbmZpZ3VyYXRpb25fdGFibGUiLCJ1dGlscyIsInRyZWVzIiwiYWRsZXIzMiIsImNyYzMyIiwiWl9VTktOT1dOIiwiTUFYX01FTV9MRVZFTCIsIk1BWF9XQklUUyIsIkRFRl9NRU1fTEVWRUwiLCJMX0NPREVTIiwiTElURVJBTFMiLCJEX0NPREVTIiwiQkxfQ09ERVMiLCJIRUFQX1NJWkUiLCJNQVhfQklUUyIsIk1JTl9NQVRDSCIsIk1BWF9NQVRDSCIsIk1JTl9MT09LQUhFQUQiLCJQUkVTRVRfRElDVCIsIklOSVRfU1RBVEUiLCJFWFRSQV9TVEFURSIsIk5BTUVfU1RBVEUiLCJDT01NRU5UX1NUQVRFIiwiSENSQ19TVEFURSIsIkJVU1lfU1RBVEUiLCJGSU5JU0hfU1RBVEUiLCJCU19ORUVEX01PUkUiLCJCU19CTE9DS19ET05FIiwiQlNfRklOSVNIX1NUQVJURUQiLCJCU19GSU5JU0hfRE9ORSIsIk9TX0NPREUiLCJlcnJvckNvZGUiLCJyYW5rIiwiemVybyIsImZsdXNoX3BlbmRpbmciLCJwZW5kaW5nIiwicGVuZGluZ19idWYiLCJwZW5kaW5nX291dCIsImZsdXNoX2Jsb2NrX29ubHkiLCJfdHJfZmx1c2hfYmxvY2siLCJibG9ja19zdGFydCIsInN0cnN0YXJ0IiwicHV0X2J5dGUiLCJwdXRTaG9ydE1TQiIsImxvbmdlc3RfbWF0Y2giLCJjdXJfbWF0Y2giLCJjaGFpbl9sZW5ndGgiLCJtYXhfY2hhaW5fbGVuZ3RoIiwic2NhbiIsImJlc3RfbGVuIiwicHJldl9sZW5ndGgiLCJuaWNlX21hdGNoIiwid19zaXplIiwiX3dpbiIsIndtYXNrIiwid19tYXNrIiwic3RyZW5kIiwic2Nhbl9lbmQxIiwic2Nhbl9lbmQiLCJnb29kX21hdGNoIiwibG9va2FoZWFkIiwibWF0Y2hfc3RhcnQiLCJmaWxsX3dpbmRvdyIsIm1vcmUiLCJfd19zaXplIiwid2luZG93X3NpemUiLCJoYXNoX3NpemUiLCJpbnNlcnQiLCJpbnNfaCIsImhhc2hfc2hpZnQiLCJoYXNoX21hc2siLCJkZWZsYXRlX2Zhc3QiLCJoYXNoX2hlYWQiLCJiZmx1c2giLCJtYXRjaF9sZW5ndGgiLCJfdHJfdGFsbHkiLCJtYXhfbGF6eV9tYXRjaCIsImxhc3RfbGl0IiwiZGVmbGF0ZV9zbG93IiwibWF4X2luc2VydCIsInByZXZfbWF0Y2giLCJtYXRjaF9hdmFpbGFibGUiLCJDb25maWciLCJnb29kX2xlbmd0aCIsIm1heF9sYXp5IiwibmljZV9sZW5ndGgiLCJtYXhfY2hhaW4iLCJEZWZsYXRlU3RhdGUiLCJwZW5kaW5nX2J1Zl9zaXplIiwiZ3poZWFkIiwiZ3ppbmRleCIsImxhc3RfZmx1c2giLCJ3X2JpdHMiLCJoYXNoX2JpdHMiLCJkeW5fbHRyZWUiLCJkeW5fZHRyZWUiLCJibF90cmVlIiwibF9kZXNjIiwiZF9kZXNjIiwiYmxfZGVzYyIsImJsX2NvdW50IiwiaGVhcCIsImhlYXBfbGVuIiwiaGVhcF9tYXgiLCJsX2J1ZiIsImxpdF9idWZzaXplIiwiZF9idWYiLCJvcHRfbGVuIiwic3RhdGljX2xlbiIsImJpX2J1ZiIsImJpX3ZhbGlkIiwiZGVmbGF0ZVJlc2V0S2VlcCIsIl90cl9pbml0IiwibWF4X2Jsb2NrX3NpemUiLCJtYXhfc3RhcnQiLCJkZWZsYXRlSW5pdCIsImRlZmxhdGVTZXRIZWFkZXIiLCJvbGRfZmx1c2giLCJiZWciLCJoY3JjIiwiZXh0cmEiLCJjb21tZW50Iiwib3MiLCJic3RhdGUiLCJkZWZsYXRlX2h1ZmYiLCJkZWZsYXRlX3JsZSIsIl90cl9hbGlnbiIsIl90cl9zdG9yZWRfYmxvY2siLCJhdmFpbCIsInRtcERpY3QiLCJkaWN0TGVuZ3RoIiwiZGVmbGF0ZUluZm8iLCJaX0JJTkFSWSIsIlpfVEVYVCIsIlNUT1JFRF9CTE9DSyIsIlNUQVRJQ19UUkVFUyIsIkRZTl9UUkVFUyIsIkxFTkdUSF9DT0RFUyIsIkJ1Zl9zaXplIiwiTUFYX0JMX0JJVFMiLCJFTkRfQkxPQ0siLCJSRVBfM182IiwiUkVQWl8zXzEwIiwiUkVQWl8xMV8xMzgiLCJleHRyYV9sYml0cyIsImV4dHJhX2RiaXRzIiwiZXh0cmFfYmxiaXRzIiwiYmxfb3JkZXIiLCJzdGF0aWNfbHRyZWUiLCJzdGF0aWNfZHRyZWUiLCJfZGlzdF9jb2RlIiwiX2xlbmd0aF9jb2RlIiwiYmFzZV9sZW5ndGgiLCJzdGF0aWNfbF9kZXNjIiwic3RhdGljX2RfZGVzYyIsInN0YXRpY19ibF9kZXNjIiwiYmFzZV9kaXN0IiwiU3RhdGljVHJlZURlc2MiLCJzdGF0aWNfdHJlZSIsImV4dHJhX2JpdHMiLCJleHRyYV9iYXNlIiwiZWxlbXMiLCJtYXhfbGVuZ3RoIiwiaGFzX3N0cmVlIiwiVHJlZURlc2MiLCJkeW5fdHJlZSIsInN0YXRfZGVzYyIsIm1heF9jb2RlIiwiZF9jb2RlIiwiZGlzdCIsInB1dF9zaG9ydCIsInNlbmRfYml0cyIsInNlbmRfY29kZSIsInRyZWUiLCJiaV9yZXZlcnNlIiwiZ2VuX2NvZGVzIiwiYml0cyIsIm5leHRfY29kZSIsImluaXRfYmxvY2siLCJiaV93aW5kdXAiLCJzbWFsbGVyIiwiX24yIiwiX20yIiwicHFkb3duaGVhcCIsImNvbXByZXNzX2Jsb2NrIiwibHRyZWUiLCJkdHJlZSIsImxjIiwibHgiLCJidWlsZF90cmVlIiwic3RyZWUiLCJ4Yml0cyIsIm92ZXJmbG93IiwiZ2VuX2JpdGxlbiIsInNjYW5fdHJlZSIsImN1cmxlbiIsInByZXZsZW4iLCJuZXh0bGVuIiwibWF4X2NvdW50IiwibWluX2NvdW50Iiwic2VuZF90cmVlIiwic3RhdGljX2luaXRfZG9uZSIsInN0b3JlZF9sZW4iLCJjb3B5X2Jsb2NrIiwidHJfc3RhdGljX2luaXQiLCJvcHRfbGVuYiIsInN0YXRpY19sZW5iIiwibWF4X2JsaW5kZXgiLCJibGFja19tYXNrIiwiZGV0ZWN0X2RhdGFfdHlwZSIsImJ1aWxkX2JsX3RyZWUiLCJsY29kZXMiLCJkY29kZXMiLCJibGNvZGVzIiwic2VuZF9hbGxfdHJlZXMiLCJiaV9mbHVzaCIsIjIiLCIxIiwiMCIsIi0xIiwiLTIiLCItMyIsIi00IiwiLTUiLCItNiIsImluZmxhdGVfZmFzdCIsImluZmxhdGVfdGFibGUiLCJDT0RFUyIsIkxFTlMiLCJESVNUUyIsIlpfVFJFRVMiLCJIRUFEIiwiRkxBR1MiLCJUSU1FIiwiT1MiLCJFWExFTiIsIkVYVFJBIiwiTkFNRSIsIkNPTU1FTlQiLCJIQ1JDIiwiRElDVElEIiwiRElDVCIsIlRZUEUiLCJUWVBFRE8iLCJTVE9SRUQiLCJDT1BZXyIsIkNPUFkiLCJUQUJMRSIsIkxFTkxFTlMiLCJDT0RFTEVOUyIsIkxFTl8iLCJMRU4iLCJMRU5FWFQiLCJESVNUIiwiRElTVEVYVCIsIk1BVENIIiwiTElUIiwiQ0hFQ0siLCJMRU5HVEgiLCJCQUQiLCJNRU0iLCJTWU5DIiwiRU5PVUdIX0xFTlMiLCJFTk9VR0hfRElTVFMiLCJERUZfV0JJVFMiLCJ6c3dhcDMyIiwicSIsIkluZmxhdGVTdGF0ZSIsImhhdmVkaWN0IiwiZG1heCIsImNoZWNrIiwid2JpdHMiLCJ3c2l6ZSIsIndoYXZlIiwid25leHQiLCJob2xkIiwibGVuY29kZSIsImRpc3Rjb2RlIiwibGVuYml0cyIsImRpc3RiaXRzIiwibmNvZGUiLCJubGVuIiwibmRpc3QiLCJ3b3JrIiwibGVuZHluIiwiZGlzdGR5biIsInNhbmUiLCJiYWNrIiwid2FzIiwiaW5mbGF0ZVJlc2V0S2VlcCIsImluZmxhdGVSZXNldDIiLCJsZW5maXgiLCJkaXN0Zml4IiwidmlyZ2luIiwiZml4ZWR0YWJsZXMiLCJzeW0iLCJ1cGRhdGV3aW5kb3ciLCJpbmZsYXRlSW5pdCIsInB1dCIsImxlZnQiLCJfaW4iLCJfb3V0IiwiZnJvbV9zb3VyY2UiLCJoZXJlX2JpdHMiLCJoZXJlX29wIiwiaGVyZV92YWwiLCJsYXN0X2JpdHMiLCJsYXN0X29wIiwibGFzdF92YWwiLCJoZXJlIiwiaGJ1ZiIsIm9yZGVyIiwiaW5mX2xlYXZlIiwieGZsYWdzIiwiZXh0cmFfbGVuIiwiaW5mbGF0ZUdldEhlYWRlciIsImluZmxhdGVJbmZvIiwic193aW5kb3ciLCJsY29kZSIsImRjb2RlIiwibG1hc2siLCJkbWFzayIsIm9wIiwidG9wIiwiZG9sZW4iLCJkb2Rpc3QiLCJsYmFzZSIsImxleHQiLCJkYmFzZSIsImRleHQiLCJsZW5zX2luZGV4IiwidGFibGVfaW5kZXgiLCJpbmNyIiwibG93IiwibWFzayIsImN1cnIiLCJkcm9wIiwidXNlZCIsImh1ZmYiLCJiYXNlX2luZGV4IiwiTUFYQklUUyIsIm9mZnMiLCJleHRyYV9pbmRleCIsIlpfTk9fQ09NUFJFU1NJT04iLCJaX0JFU1RfU1BFRUQiLCJaX0JFU1RfQ09NUFJFU1NJT04iLCJXQVJDUmVjb3JkIiwicGFyc2luZ1N0YXRlcyIsImNvbnRlbnQxIiwiY29udGVudDIiLCJjb25zdW1lQ1JMRkhlYWRlciIsImNvbnN1bWVDUkxGQ29udGVudDEiLCJjb25zdW1lQ1JMRkNvbnRlbnQyIiwiV0ZJQmVnaW5MZW4iLCJfcGFydHMiLCJjMSIsImMyIiwiX3BhcnNpbmdTdGF0ZSIsIm5ld1JlY29yZCIsImlzV0FSQ1JldmlzaW9uTGluZSIsImlzU2VwIiwiaXNKdXN0Q1JMRiIsIkNvbnRlbnRQYXJzZXIiLCJ3YXJjUGFydHMiLCJ3YXJjSGVhZGVyIiwicGFyc2VXYXJjUmVjb3JkSGVhZGVyIiwiaHR0cEluZm8iLCJjb250ZW50Iiwid3QiLCJwYXJzZUhUVFBQb3J0aW9uIiwicGFyc2VSZXNIVFRQIiwic3RhcnRzV2l0aCIsIndhcmNSZWNvcmRJRCIsIndhcmNDb250ZW50VHlwZSIsIndhcmNCbG9ja0RpZ2VzdCIsIndhcmNQYXlsb2FkRGlnZXN0Iiwid2FyY0lQQWRkcmVzcyIsIndhcmNSZWZlcnNUbyIsIndhcmNSZWZlcnNUb1RhcmdldFVSSSIsIndhcmNSZWZlcnNUb0RhdGUiLCJ3YXJjVHJ1bmNhdGVkIiwid2FyY1dhcmNpbmZvSUQiLCJ3YXJjRmlsZW5hbWUiLCJ3YXJjUHJvZmlsZSIsIndhcmNJZGVudGlmaWVkUGF5bG9hZFR5cGUiLCJ3YXJjU2VnbWVudE9yaWdpbklEIiwid2FyY1NlZ21lbnROdW1iZXIiLCJ3YXJjU2VnbWVudFRvdGFsTGVuZ3RoIiwiV0ZJIiwiV0FSQ1ZTbGFzaCIsIkNvbG9uU3BhY2UiLCJidWZMZW4iLCJidWZzIiwicGFyc2VSZXFIVFRQIiwiY3VycmVudEJ1ZmZlciIsImN1ckxlbiIsInNlcFBvcyIsImhlYWRlclZhbHVlIiwicmhlYWRlciIsInV0ZjhCdWZmZXJTbGljZSIsImJ1ZkVuZFBvc05vQ1JMRiIsIm91dGxpbmsiLCJ1bmtleWVkIiwiaGVhZGVyQnVmZnMiLCJyZXF1ZXN0TGluZSIsImh0dHBWZXJzaW9uIiwic3BhY2VJRFgiLCJsYXN0SURYIiwiX3BhcnNlSGVhZGVycyIsInN0YXR1c0xpbmUiLCJzdGF0dXNSZWFzb24iLCJsYXN0S2V5IiwiZ2V0UG9zdERhdGEiLCJnZXRSZXNCb2R5IiwiY2FwdHVyZXIiLCJ3Y0RlYnVnZ2VyIiwiZ2VuT3B0cyIsIndhcmNPcHRzIiwiaW5pdFdBUkMiLCJ3cml0ZVdhcmNJbmZvUmVjb3JkIiwid3JpdGVXZWJyZWNvcmRlckJvb2ttYXJrc0luZm9SZWNvcmQiLCJpdGVyYXRlUmVxdWVzdHMiLCJnZW5lcmF0ZVdhcmNFbnRyeSIsIm5yZXEiLCJwb3N0IiwiY2FuU2VyaWFsaXplUmVzcG9uc2UiLCJzZXJpYWxpemVSZXNwb25zZUhlYWRlcnMiLCJ3YXNFcnJvciIsInJib2R5IiwiYmFzZTY0RW5jb2RlZCIsIndyaXRlUmVxdWVzdFJlc3BvbnNlUmVjb3JkcyIsInNlcmlhbGl6ZVJlcXVlc3RIZWFkZXJzIiwid3JpdGVSZXF1ZXN0UmVjb3JkIiwibm9ybWFsaXplQXJyYXkiLCJhbGxvd0Fib3ZlUm9vdCIsInNwbGl0UGF0aFJlIiwic3BsaXRQYXRoIiwiZmlsZW5hbWUiLCJmaWx0ZXIiLCJyZXNvbHZlZFBhdGgiLCJyZXNvbHZlZEFic29sdXRlIiwibm9ybWFsaXplIiwidHJhaWxpbmdTbGFzaCIsImZyb21QYXJ0cyIsInRvUGFydHMiLCJzYW1lUGFydHNMZW5ndGgiLCJvdXRwdXRQYXJ0cyIsInNlcCIsImRlbGltaXRlciIsImRpcm5hbWUiLCJleHRuYW1lIiwiZ2V0UmFuZG9tVmFsdWVzIiwiY3J5cHRvIiwibXNDcnlwdG8iLCJybmRzOCIsInJuZHMiLCJieXRlVG9IZXgiLCJidGgiLCJ3YXJjUkUiLCJnemlwcGluZyIsImhhc1dBUkMiLCJoYXNXQVJDR1oiLCJpc0VtcHR5Iiwic2VuZENvbW1hbmQiLCJiYXNlS2V5cyIsImdldFRhZyIsImlzQXJyYXlMaWtlIiwiaXNQcm90b3R5cGUiLCJpc1R5cGVkQXJyYXkiLCJtYXBUYWciLCJzZXRUYWciLCJuYXRpdmVLZXlzIiwib3ZlckFyZyIsIldlYWtNYXAiLCJ0b1NvdXJjZSIsImRhdGFWaWV3Q3RvclN0cmluZyIsIm1hcEN0b3JTdHJpbmciLCJwcm9taXNlQ3RvclN0cmluZyIsInNldEN0b3JTdHJpbmciLCJ3ZWFrTWFwQ3RvclN0cmluZyIsImN0b3JTdHJpbmciLCJnZXROYXRpdmUiLCJpc01hc2tlZCIsInJlSXNIb3N0Q3RvciIsImZ1bmNQcm90byIsInJlSXNOYXRpdmUiLCJuYXRpdmVPYmplY3RUb1N0cmluZyIsImlzT3duIiwidW5tYXNrZWQiLCJ1aWQiLCJjb3JlSnNEYXRhIiwibWFza1NyY0tleSIsIklFX1BST1RPIiwiYmFzZUlzQXJndW1lbnRzIiwiaXNPYmplY3RMaWtlIiwiYXJnc1RhZyIsImlzTGVuZ3RoIiwic3R1YkZhbHNlIiwiZnJlZUV4cG9ydHMiLCJub2RlVHlwZSIsImZyZWVNb2R1bGUiLCJiYXNlSXNUeXBlZEFycmF5IiwiYmFzZVVuYXJ5Iiwibm9kZVV0aWwiLCJub2RlSXNUeXBlZEFycmF5IiwidHlwZWRBcnJheVRhZ3MiLCJmcmVlUHJvY2VzcyIsInR5cGVzIiwicmVxdWlyZSIsIm5ldHdvcmsiLCJnZXRSZXF1ZXN0UG9zdERhdGEiLCJnZXRSZXNwb25zZUJvZHkiLCJjbGllbnQiLCJzZW5kIiwiX1VQIiwicmVxSFRUUCIsInJlc0hUVFAiLCJfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXyIsIm1heEludCIsInRNaW4iLCJ0TWF4Iiwic2tldyIsImRhbXAiLCJpbml0aWFsQmlhcyIsImluaXRpYWxOIiwicmVnZXhQdW55Y29kZSIsInJlZ2V4Tm9uQVNDSUkiLCJyZWdleFNlcGFyYXRvcnMiLCJlcnJvcnMiLCJub3QtYmFzaWMiLCJpbnZhbGlkLWlucHV0IiwiYmFzZU1pbnVzVE1pbiIsInN0cmluZ0Zyb21DaGFyQ29kZSIsIm1hcERvbWFpbiIsInVjczJkZWNvZGUiLCJjb3VudGVyIiwidWNzMmVuY29kZSIsImRpZ2l0VG9CYXNpYyIsImRpZ2l0IiwiYWRhcHQiLCJkZWx0YSIsIm51bVBvaW50cyIsImZpcnN0VGltZSIsImRlY29kZSIsImJhc2ljIiwib2xkaSIsImJhc2VNaW51c1QiLCJpbnB1dExlbmd0aCIsImJpYXMiLCJlbmNvZGUiLCJoYW5kbGVkQ1BDb3VudCIsImJhc2ljTGVuZ3RoIiwiY3VycmVudFZhbHVlIiwiaGFuZGxlZENQQ291bnRQbHVzT25lIiwicU1pbnVzVCIsInVjczIiLCJ0b1VuaWNvZGUiLCJxcyIsImVxIiwibWF4S2V5cyIsImtzdHIiLCJ2c3RyIiwic3RyaW5naWZ5UHJpbWl0aXZlIiwia3MiLCJ0b0FycmF5QnVmZmVyIiwicHJlZmVyQmluYXJ5IiwiX2JvZHkiLCJfaGVhZGVycyIsInNldEhlYWRlciIsInVzZUZldGNoIiwiZGVjaWRlTW9kZSIsIl9mZXRjaFRpbWVyIiwibG93ZXJOYW1lIiwidW5zYWZlSGVhZGVycyIsImdldEhlYWRlciIsInJlbW92ZUhlYWRlciIsImhlYWRlcnNPYmoiLCJoZWFkZXJzTGlzdCIsImtleU5hbWUiLCJzaWduYWwiLCJjb250cm9sbGVyIiwiX2ZldGNoQWJvcnRDb250cm9sbGVyIiwicmVxdWVzdFRpbWVvdXQiLCJjcmVkZW50aWFscyIsIndpdGhDcmVkZW50aWFscyIsIl9jb25uZWN0Iiwib250aW1lb3V0Iiwic2V0UmVxdWVzdEhlYWRlciIsIl9yZXNwb25zZSIsInN0YXR1c1ZhbGlkIiwiZmx1c2hIZWFkZXJzIiwic2V0Tm9EZWxheSIsInNldFNvY2tldEtlZXBBbGl2ZSIsImFycmF5Q29weSIsIjEwMCIsIjEwMSIsIjEwMiIsIjIwMCIsIjIwMSIsIjIwMiIsIjIwMyIsIjIwNCIsIjIwNSIsIjIwNiIsIjIwNyIsIjIwOCIsIjIyNiIsIjMwMCIsIjMwMSIsIjMwMiIsIjMwMyIsIjMwNCIsIjMwNSIsIjMwNyIsIjMwOCIsIjQwMCIsIjQwMSIsIjQwMiIsIjQwMyIsIjQwNCIsIjQwNSIsIjQwNiIsIjQwNyIsIjQwOCIsIjQwOSIsIjQxMCIsIjQxMSIsIjQxMiIsIjQxMyIsIjQxNCIsIjQxNSIsIjQxNiIsIjQxNyIsIjQxOCIsIjQyMSIsIjQyMiIsIjQyMyIsIjQyNCIsIjQyNSIsIjQyNiIsIjQyOCIsIjQyOSIsIjQzMSIsIjQ1MSIsIjUwMCIsIjUwMSIsIjUwMiIsIjUwMyIsIjUwNCIsIjUwNSIsIjUwNiIsIjUwNyIsIjUwOCIsIjUwOSIsIjUxMCIsIjUxMSIsImNyZWF0ZUNvbXBvdW5kZXIiLCJ1cHBlckZpcnN0Iiwid29yZCIsImFycmF5UmVkdWNlIiwiZGVidXJyIiwid29yZHMiLCJyZUFwb3MiLCJhY2N1bXVsYXRvciIsImluaXRBY2N1bSIsImRlYnVyckxldHRlciIsInJlTGF0aW4iLCJyZUNvbWJvTWFyayIsImJhc2VQcm9wZXJ0eU9mIiwiw4AiLCLDgSIsIsOCIiwiw4MiLCLDhCIsIsOFIiwiw6AiLCLDoSIsIsOiIiwiw6MiLCLDpCIsIsOlIiwiw4ciLCLDpyIsIsOQIiwiw7AiLCLDiCIsIsOJIiwiw4oiLCLDiyIsIsOoIiwiw6kiLCLDqiIsIsOrIiwiw4wiLCLDjSIsIsOOIiwiw48iLCLDrCIsIsOtIiwiw64iLCLDryIsIsORIiwiw7EiLCLDkiIsIsOTIiwiw5QiLCLDlSIsIsOWIiwiw5giLCLDsiIsIsOzIiwiw7QiLCLDtSIsIsO2Iiwiw7giLCLDmSIsIsOaIiwiw5siLCLDnCIsIsO5Iiwiw7oiLCLDuyIsIsO8Iiwiw50iLCLDvSIsIsO/Iiwiw4YiLCLDpiIsIsOeIiwiw74iLCLDnyIsIsSAIiwixIIiLCLEhCIsIsSBIiwixIMiLCLEhSIsIsSGIiwixIgiLCLEiiIsIsSMIiwixIciLCLEiSIsIsSLIiwixI0iLCLEjiIsIsSQIiwixI8iLCLEkSIsIsSSIiwixJQiLCLEliIsIsSYIiwixJoiLCLEkyIsIsSVIiwixJciLCLEmSIsIsSbIiwixJwiLCLEniIsIsSgIiwixKIiLCLEnSIsIsSfIiwixKEiLCLEoyIsIsSkIiwixKYiLCLEpSIsIsSnIiwixKgiLCLEqiIsIsSsIiwixK4iLCLEsCIsIsSpIiwixKsiLCLErSIsIsSvIiwixLEiLCLEtCIsIsS1IiwixLYiLCLEtyIsIsS4IiwixLkiLCLEuyIsIsS9IiwixL8iLCLFgSIsIsS6IiwixLwiLCLEviIsIsWAIiwixYIiLCLFgyIsIsWFIiwixYciLCLFiiIsIsWEIiwixYYiLCLFiCIsIsWLIiwixYwiLCLFjiIsIsWQIiwixY0iLCLFjyIsIsWRIiwixZQiLCLFliIsIsWYIiwixZUiLCLFlyIsIsWZIiwixZoiLCLFnCIsIsWeIiwixaAiLCLFmyIsIsWdIiwixZ8iLCLFoSIsIsWiIiwixaQiLCLFpiIsIsWjIiwixaUiLCLFpyIsIsWoIiwixaoiLCLFrCIsIsWuIiwixbAiLCLFsiIsIsWpIiwixasiLCLFrSIsIsWvIiwixbEiLCLFsyIsIsW0IiwixbUiLCLFtiIsIsW3IiwixbgiLCLFuSIsIsW7Iiwixb0iLCLFuiIsIsW8Iiwixb4iLCLEsiIsIsSzIiwixZIiLCLFkyIsIsWJIiwixb8iLCJhcnJheU1hcCIsIklORklOSVRZIiwic3ltYm9sUHJvdG8iLCJzeW1ib2xUb1N0cmluZyIsInN5bWJvbFRhZyIsImFzY2lpV29yZHMiLCJoYXNVbmljb2RlV29yZCIsInVuaWNvZGVXb3JkcyIsInBhdHRlcm4iLCJndWFyZCIsInJlQXNjaWlXb3JkIiwicmVIYXNVbmljb2RlV29yZCIsInJzQnJlYWtSYW5nZSIsInJzTWF0aE9wUmFuZ2UiLCJyc0JyZWFrIiwicnNEaWdpdHMiLCJyc0RpbmdiYXQiLCJyc0xvd2VyIiwicnNNaXNjIiwicnNSZWdpb25hbCIsInJzU3VyclBhaXIiLCJyc1VwcGVyIiwicnNNaXNjTG93ZXIiLCJyc01pc2NVcHBlciIsInJlT3B0TW9kIiwicnNNb2RpZmllciIsInJzU2VxIiwicnNFbW9qaSIsInJlVW5pY29kZVdvcmQiLCJjcmVhdGVDYXNlRmlyc3QiLCJjYXN0U2xpY2UiLCJoYXNVbmljb2RlIiwic3RyaW5nVG9BcnJheSIsIm1ldGhvZE5hbWUiLCJzdHJTeW1ib2xzIiwiY2hyIiwidHJhaWxpbmciLCJiYXNlU2xpY2UiLCJhc2NpaVRvQXJyYXkiLCJ1bmljb2RlVG9BcnJheSIsInJzQXN0cmFsIiwicnNDb21ibyIsInJzRml0eiIsInJzTm9uQXN0cmFsIiwicnNTeW1ib2wiLCJyZVVuaWNvZGUiLCJyZXF1ZXN0TGluZUFuZEhlYWRlcnMiLCJzdGF0dXNMaW5lQW5kSGVhZGVycyIsInJlcXVlc3RFdmVudCIsIl9yZXF1ZXN0QyIsInJlcXVlc3RXaWxsQmVTZW50IiwiYXR0YWNoIiwibWF5YmVOZXR3b3JrTWVzc2FnZSIsInJlc3BvbnNlUmVjZWl2ZWQiLCJjZHBDbGllbnQiLCJyZXNwIiwicGQiLCJ3cml0ZVJlc3BvbnNlUmVjb3JkIl0sIm1hcHBpbmdzIjoiMERBQ0EsSUFBQUEsRUFBQSxHQUdBLFNBQUFDLEVBQUFDLEdBR0EsR0FBQUYsRUFBQUUsR0FDQSxPQUFBRixFQUFBRSxHQUFBQyxRQUdBLElBQUFDLEVBQUFKLEVBQUFFLEdBQUEsQ0FDQUcsRUFBQUgsRUFDQUksR0FBQSxFQUNBSCxRQUFBLElBVUEsT0FOQUksRUFBQUwsR0FBQU0sS0FBQUosRUFBQUQsUUFBQUMsSUFBQUQsUUFBQUYsR0FHQUcsRUFBQUUsR0FBQSxFQUdBRixFQUFBRCxRQTBEQSxPQXJEQUYsRUFBQVEsRUFBQUYsRUFHQU4sRUFBQVMsRUFBQVYsRUFHQUMsRUFBQVUsRUFBQSxTQUFBUixFQUFBUyxFQUFBQyxHQUNBWixFQUFBYSxFQUFBWCxFQUFBUyxJQUNBRyxPQUFBQyxlQUFBYixFQUFBUyxFQUFBLENBQTBDSyxZQUFBLEVBQUFDLElBQUFMLEtBSzFDWixFQUFBa0IsRUFBQSxTQUFBaEIsR0FDQSxvQkFBQWlCLGVBQUFDLGFBQ0FOLE9BQUFDLGVBQUFiLEVBQUFpQixPQUFBQyxZQUFBLENBQXdEQyxNQUFBLFdBRXhEUCxPQUFBQyxlQUFBYixFQUFBLGNBQWlEbUIsT0FBQSxLQVFqRHJCLEVBQUFzQixF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QUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFD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dHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA2MCk7XG4iLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuLypcbiAqIEV4cG9ydCBrTWF4TGVuZ3RoIGFmdGVyIHR5cGVkIGFycmF5IHN1cHBvcnQgaXMgZGV0ZXJtaW5lZC5cbiAqL1xuZXhwb3J0cy5rTWF4TGVuZ3RoID0ga01heExlbmd0aCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0ge19fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfX1cbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICBpZiAodGhhdCA9PT0gbnVsbCkge1xuICAgICAgdGhhdCA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuICAgIH1cbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aFxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0lmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUodGhpcywgYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKHRoaXMsIGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuLy8gVE9ETzogTGVnYWN5LCBub3QgbmVlZGVkIGFueW1vcmUuIFJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGFyci5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gZnJvbSAodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIHJldHVybiBmcm9tT2JqZWN0KHRoYXQsIHZhbHVlKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKG51bGwsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuc3BlY2llcyAmJlxuICAgICAgQnVmZmVyW1N5bWJvbC5zcGVjaWVzXSA9PT0gQnVmZmVyKSB7XG4gICAgLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywge1xuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAodGhhdCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2MobnVsbCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlICh0aGF0LCBzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICB0aGF0W2ldID0gMFxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJlbmNvZGluZ1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuXG4gIHZhciBhY3R1YWwgPSB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICB0aGF0ID0gdGhhdC5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGFycmF5LmJ5dGVMZW5ndGggLy8gdGhpcyB0aHJvd3MgaWYgYGFycmF5YCBpcyBub3QgYSB2YWxpZCBBcnJheUJ1ZmZlclxuXG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdvZmZzZXRcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ2xlbmd0aFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gYXJyYXlcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdCA9IGZyb21BcnJheUxpa2UodGhhdCwgYXJyYXkpXG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAodGhhdCwgb2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuKVxuXG4gICAgaWYgKHRoYXQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhhdFxuICAgIH1cblxuICAgIG9iai5jb3B5KHRoYXQsIDAsIDAsIGxlbilcbiAgICByZXR1cm4gdGhhdFxuICB9XG5cbiAgaWYgKG9iaikge1xuICAgIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBpc25hbihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicpXG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoKClgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIWlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IHN0cmluZyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHN0cmluZyA9ICcnICsgc3RyaW5nXG4gIH1cblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8IDBcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0ICAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAoaXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJlxuICAgICAgICB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbIHZhbCBdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICB2YXIgaW5kZXhTaXplID0gMVxuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgaVxuICBpZiAoZGlyKSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47ICsraSkge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmIChjb2RlIDwgMjU2KSB7XG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiB1dGY4VG9CeXRlcyhuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGlzbmFuICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBDUkxGID0gJ1xcclxcbidcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBDUkxGMnggPSAnXFxyXFxuXFxyXFxuJ1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHJlY29yZFNlcGFyYXRvciA9ICdcXHJcXG5cXHJcXG4nXG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgV0FSQ1YgPSAnMS4wJ1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IFdBUkNTbGFzaFYgPSBgV0FSQy8ke1dBUkNWfSR7Q1JMRn1gXG5cbi8qKlxuICogQHR5cGUge3t3YXJjaW5mbzogc3RyaW5nLCBtZXRhZGF0YTogc3RyaW5nLCByZXF1ZXN0OiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcsIHJldmlzaXQ6IHN0cmluZywgcmVzb3VyY2U6IHN0cmluZywgY29udmVyc2lvbjogc3RyaW5nLCB1bmtub3duOiBzdHJpbmcsIGNvbnRpbnVhdGlvbjogc3RyaW5nfX1cbiAqL1xuY29uc3QgV0FSQ1R5cGVzID0ge1xuICB3YXJjaW5mbzogJ3dhcmNpbmZvJyxcbiAgbWV0YWRhdGE6ICdtZXRhZGF0YScsXG4gIHJlcXVlc3Q6ICdyZXF1ZXN0JyxcbiAgcmVzcG9uc2U6ICdyZXNwb25zZScsXG4gIHJldmlzaXQ6ICdyZXZpc2l0JyxcbiAgcmVzb3VyY2U6ICdyZXNvdXJjZScsXG4gIGNvbnZlcnNpb246ICdjb252ZXJzaW9uJyxcbiAgdW5rbm93bjogJ3Vua25vd24nLFxuICBjb250aW51YXRpb246ICdjb250aW51YXRpb24nXG59XG5cbmNvbnN0IFdBUkNDb250ZW50VHlwZXMgPSB7XG4gIHdhcmNGaWVsZHM6ICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3dhcmMtZmllbGRzXFxyXFxuJyxcbiAgaHR0cFJlcXVlc3Q6ICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2h0dHA7IG1zZ3R5cGU9cmVxdWVzdFxcclxcbicsXG4gIGh0dHBSZXNwb25zZTogJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vaHR0cDsgbXNndHlwZT1yZXNwb25zZVxcclxcbidcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXVpZFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiByZWNvcmRJZCAodXVpZCkge1xuICByZXR1cm4gYFdBUkMtUmVjb3JkLUlEOiA8dXJuOnV1aWQ6JHt1dWlkfT4ke0NSTEZ9YFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHdhcmNEYXRlIChkYXRlKSB7XG4gIHJldHVybiBgV0FSQy1EYXRlOiAke2RhdGV9JHtDUkxGfWBcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0VVJJXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHdhcmNUYXJnZXRVUkkgKHRhcmdldFVSSSkge1xuICByZXR1cm4gYFdBUkMtVGFyZ2V0LVVSSTogJHt0YXJnZXRVUkl9JHtDUkxGfWBcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB3YXJjVHlwZSAodHlwZSkge1xuICByZXR1cm4gYFdBUkMtVHlwZTogJHt0eXBlfSR7Q1JMRn1gXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVOYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHdhcmNGaWxlbmFtZSAoZmlsZU5hbWUpIHtcbiAgcmV0dXJuIGBXQVJDLUZpbGVuYW1lOiAke2ZpbGVOYW1lfSR7Q1JMRn1gXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBjb250ZW50TGVuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHdhcmNDb250ZW50TGVuZ3RoIChjb250ZW50TGVuKSB7XG4gIHJldHVybiBgQ29udGVudC1MZW5ndGg6ICR7Y29udGVudExlbn0ke0NSTEZ9YFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50VHlwZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB3YXJjQ29udGVudFR5cGUgKGNvbnRlbnRUeXBlKSB7XG4gIHJldHVybiBgQ29udGVudC1UeXBlOiAke2NvbnRlbnRUeXBlfSR7Q1JMRn1gXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbmN1cnJlbnRUb1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB3YXJjQ29uY3VycmVudFRvIChjb25jdXJyZW50VG8pIHtcbiAgcmV0dXJuIGBXQVJDLUNvbmN1cnJlbnQtVG86IDx1cm46dXVpZDoke2NvbmN1cnJlbnRUb30+JHtDUkxGfWBcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gd2lkXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHdhcmNXYXJjSW5mb0lkICh3aWQpIHtcbiAgcmV0dXJuIGBXQVJDLVdhcmNpbmZvLUlEOiA8dXJuOnV1aWQ6JHt3aWR9PiR7Q1JMRn1gXG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge09iamVjdH0gcmVxRmllbGRzXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVxRmllbGRzLnJpZFxuICogQHBhcmFtIHtzdHJpbmd9IHJlcUZpZWxkcy5kYXRlXG4gKiBAcGFyYW0ge251bWJlcn0gcmVxRmllbGRzLmxlblxuICogQHBhcmFtIHs/c3RyaW5nfSBbcmVxRmllbGRzLnRhcmdldFVSSV1cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZWRIZWFkZXJGaWVsZHMgKHR5cGUsIHsgcmlkLCBkYXRlLCBsZW4sIHRhcmdldFVSSSB9KSB7XG4gIGlmICh0YXJnZXRVUkkgIT0gbnVsbCkge1xuICAgIHJldHVybiBgJHtXQVJDU2xhc2hWfSR7d2FyY1R5cGUodHlwZSl9JHtyZWNvcmRJZChyaWQpfSR7d2FyY0RhdGUoXG4gICAgICBkYXRlXG4gICAgKX0ke3dhcmNUYXJnZXRVUkkodGFyZ2V0VVJJKX0ke3dhcmNDb250ZW50TGVuZ3RoKGxlbil9YFxuICB9XG4gIHJldHVybiBgJHtXQVJDU2xhc2hWfSR7d2FyY1R5cGUodHlwZSl9JHtyZWNvcmRJZChyaWQpfSR7d2FyY0RhdGUoXG4gICAgZGF0ZVxuICApfSR7d2FyY0NvbnRlbnRMZW5ndGgobGVuKX1gXG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV0FSQ0luZm9IZWFkZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRlIC0gVGhlIGRhdGUgdmFsdWUgZm9yIFdBUkMtRGF0ZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBbZmlsZU5hbWVdIC0gVGhlIG5hbWUgb2YgdGhlIHdhcmMgZmlsZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBbdGFyZ2V0VVJJXSAtIFRoZSB0YXJnZXQgVVJJIGZvciB0aGUgcmVjb3JkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmlkIC0gVGhlIGlkIG9mIHRoZSByZWNvcmRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZW4gLSBUaGUgbGVuZ3RoIG9mIHRoZSByZWNvcmRzIGNvbnRlbnRcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7V0FSQ0luZm9IZWFkZXJ9IGluZm9IZWFkZXJcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gd2FyY0luZm9IZWFkZXIgKGluZm9IZWFkZXIpIHtcbiAgY29uc3QgcmVxdWlyZWQgPSBgJHtyZXF1aXJlZEhlYWRlckZpZWxkcyhXQVJDVHlwZXMud2FyY2luZm8sIGluZm9IZWFkZXIpfSR7XG4gICAgV0FSQ0NvbnRlbnRUeXBlcy53YXJjRmllbGRzXG4gIH1gXG4gIGlmIChpbmZvSGVhZGVyLmZpbGVOYW1lICE9IG51bGwpIHtcbiAgICByZXR1cm4gYCR7cmVxdWlyZWR9JHt3YXJjRmlsZW5hbWUoaW5mb0hlYWRlci5maWxlTmFtZSl9YFxuICB9XG4gIHJldHVybiByZXF1aXJlZFxufVxuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvQ29udGVudFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB3YXJjSW5mb0NvbnRlbnQgKGluZm9Db250ZW50KSB7XG4gIGNvbnN0IGJhc2UgPSBbYGZvcm1hdDogV0FSQyBGaWxlIEZvcm1hdCAke1dBUkNWfSR7Q1JMRn1gXVxuICBmb3IgKGxldCBrZXkgaW4gaW5mb0NvbnRlbnQpIHtcbiAgICBiYXNlLnB1c2goYCR7a2V5fTogJHtpbmZvQ29udGVudFtrZXldfSR7Q1JMRn1gKVxuICB9XG4gIHJldHVybiBiYXNlLmpvaW4oJycpXG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV0FSQ01ldGFkYXRhSGVhZGVyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0VVJJIC0gVGhlIFVSSSB0aGUgcmVjb3JkcyBhcmUgZm9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbm93IC0gVGhlIGRhdGUgdmFsdWUgZm9yIFdBUkMtRGF0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbmN1cnJlbnRUbyAtIFRoZSByZWNvcmQgaWQgdGhpcyBtZXRhZGF0YSByZWNvcmQgaXMgYXNzb2NpYXRlZCB3aXRoXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmlkIC0gVGhlIHJlY29yZCBpZCBvZiB0aGlzIHJlY29yZFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlbiAtIFRoZSBsZW5ndGggb2YgdGhpcyByZWNvcmRzIGNvbnRlbnRcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gd2lkIC0gVGhlIHJlY29yZCBpZCBvZiB0aGUgV2FyY2luZm8gcmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1dBUkNNZXRhZGF0YUhlYWRlcn0gbWV0YWRhdGFIZWFkZXJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHdhcmNNZXRhZGF0YUhlYWRlciAoeyB0YXJnZXRVUkksIG5vdywgY29uY3VycmVudFRvLCByaWQsIGxlbiwgd2lkIH0pIHtcbiAgY29uc3QgYmFzZSA9IFtcbiAgICByZXF1aXJlZEhlYWRlckZpZWxkcyhXQVJDVHlwZXMubWV0YWRhdGEsIHtcbiAgICAgIGRhdGU6IG5vdyxcbiAgICAgIGxlbixcbiAgICAgIHJpZCxcbiAgICAgIHRhcmdldFVSSVxuICAgIH0pLFxuICAgIFdBUkNDb250ZW50VHlwZXMud2FyY0ZpZWxkc1xuICBdXG4gIGlmIChjb25jdXJyZW50VG8gIT0gbnVsbCkge1xuICAgIGJhc2UucHVzaCh3YXJjQ29uY3VycmVudFRvKGNvbmN1cnJlbnRUbykpXG4gIH1cbiAgaWYgKHdpZCAhPSBudWxsKSB7XG4gICAgYmFzZS5wdXNoKHdhcmNXYXJjSW5mb0lkKHdpZCkpXG4gIH1cbiAgcmV0dXJuIGJhc2Uuam9pbignJylcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXQVJDUmVxdWVzdEhlYWRlclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldFVSSSAtIFRoZSBVUkkgdGhlIHJlY29yZCBpcyBmb3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBub3cgLSBUaGUgZGF0ZSB2YWx1ZSBmb3IgV0FSQy1EYXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29uY3VycmVudFRvIC0gVGhlIHJlY29yZCBpZCBvZiB0aGUgcmVjb3JkIHRoaXMgcmVjb3JkIGFzc29jaWF0ZWQgd2l0aFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJpZCAtIFRoZSByZWNvcmQgaWQgb2YgdGhpcyByZWNvcmRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZW4gLSBUaGUgbGVuZ3RoIG9mIHRoaXMgcmVjb3JkcyBjb250ZW50XG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHdpZCAtIFRoZSByZWNvcmQgaWQgb2YgdGhlIFdhcmNpbmZvIHJlY29yZFxuICovXG5cbi8qKlxuICogQHBhcmFtIHtXQVJDUmVxdWVzdEhlYWRlcn0gcmVxdWVzdEhlYWRlclxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gd2FyY1JlcXVlc3RIZWFkZXIgKHsgdGFyZ2V0VVJJLCBub3csIGNvbmN1cnJlbnRUbywgcmlkLCBsZW4sIHdpZCB9KSB7XG4gIGNvbnN0IGJhc2UgPSBbXG4gICAgcmVxdWlyZWRIZWFkZXJGaWVsZHMoV0FSQ1R5cGVzLnJlcXVlc3QsIHsgZGF0ZTogbm93LCBsZW4sIHJpZCwgdGFyZ2V0VVJJIH0pLFxuICAgIFdBUkNDb250ZW50VHlwZXMuaHR0cFJlcXVlc3RcbiAgXVxuICBpZiAoY29uY3VycmVudFRvICE9IG51bGwpIHtcbiAgICBiYXNlLnB1c2god2FyY0NvbmN1cnJlbnRUbyhjb25jdXJyZW50VG8pKVxuICB9XG4gIGlmICh3aWQgIT0gbnVsbCkge1xuICAgIGJhc2UucHVzaCh3YXJjV2FyY0luZm9JZCh3aWQpKVxuICB9XG4gIHJldHVybiBiYXNlLmpvaW4oJycpXG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV0FSQ1Jlc3BvbnNlSGVhZGVyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0VVJJIC0gVGhlIFVSSSB0aGUgcmVjb3JkIGlzIGZvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5vdyAtIFRoZSBkYXRlIHZhbHVlIGZvciBXQVJDLURhdGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByaWQgLSBUaGUgcmVjb3JkIGlkIG9mIHRoaXMgcmVjb3JkXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVuIC0gVGhlIGxlbmd0aCBvZiB0aGlzIHJlY29yZHMgY29udGVudFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB3aWQgLSBUaGUgcmVjb3JkIGlkIG9mIHRoZSBXYXJjaW5mbyByZWNvcmRcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7V0FSQ1Jlc3BvbnNlSGVhZGVyfSByZXNwb25zZUhlYWRlclxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gd2FyY1Jlc3BvbnNlSGVhZGVyICh7IHRhcmdldFVSSSwgbm93LCByaWQsIGxlbiwgd2lkIH0pIHtcbiAgY29uc3QgYmFzZSA9IFtcbiAgICByZXF1aXJlZEhlYWRlckZpZWxkcyhXQVJDVHlwZXMucmVzcG9uc2UsIHtcbiAgICAgIGRhdGU6IG5vdyxcbiAgICAgIGxlbixcbiAgICAgIHJpZCxcbiAgICAgIHRhcmdldFVSSVxuICAgIH0pLFxuICAgIFdBUkNDb250ZW50VHlwZXMuaHR0cFJlc3BvbnNlXG4gIF1cbiAgaWYgKHdpZCAhPSBudWxsKSB7XG4gICAgYmFzZS5wdXNoKHdhcmNXYXJjSW5mb0lkKHdpZCkpXG4gIH1cbiAgcmV0dXJuIGJhc2Uuam9pbignJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJlcXVpcmVkSGVhZGVyRmllbGRzLFxuICAvKipcbiAgICogQHR5cGUge2Z1bmN0aW9uKGhlYWRlckluZm86IFdBUkNJbmZvSGVhZGVyKTogc3RyaW5nfVxuICAgKi9cbiAgd2FyY0luZm9IZWFkZXIsXG4gIC8qKlxuICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW5mb0NvbnRlbnQ6IE9iamVjdCk6IHN0cmluZ31cbiAgICovXG4gIHdhcmNJbmZvQ29udGVudCxcbiAgLyoqXG4gICAqIEB0eXBlIHtmdW5jdGlvbihyZXFpZXN0RGF0YTogV0FSQ1JlcXVlc3RIZWFkZXIpOiBzdHJpbmd9XG4gICAqL1xuICB3YXJjUmVxdWVzdEhlYWRlcixcbiAgd2FyY1Jlc3BvbnNlSGVhZGVyLFxuICB3YXJjTWV0YWRhdGFIZWFkZXIsXG4gIHJlY29yZFNlcGFyYXRvcixcbiAgQ1JMRixcbiAgQ1JMRjJ4LFxuICBXQVJDVHlwZXMsXG4gIFdBUkNWLFxuICBXQVJDQ29udGVudFR5cGVzXG59XG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcm9vdDtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UsIHRoaXMgY2xhc3Ncbi8vIHByb3RvdHlwYWxseSBpbmhlcml0cyBmcm9tIFJlYWRhYmxlLCBhbmQgdGhlbiBwYXJhc2l0aWNhbGx5IGZyb21cbi8vIFdyaXRhYmxlLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwbmEgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9cmV0dXJuIGtleXM7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gRHVwbGV4O1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV9yZWFkYWJsZScpO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3dyaXRhYmxlJyk7XG5cbnV0aWwuaW5oZXJpdHMoRHVwbGV4LCBSZWFkYWJsZSk7XG5cbntcbiAgLy8gYXZvaWQgc2NvcGUgY3JlZXAsIHRoZSBrZXlzIGFycmF5IGNhbiB0aGVuIGJlIGNvbGxlY3RlZFxuICB2YXIga2V5cyA9IG9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKTtcbiAgZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gICAgdmFyIG1ldGhvZCA9IGtleXNbdl07XG4gICAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pIER1cGxleC5wcm90b3R5cGVbbWV0aG9kXSA9IFdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdO1xuICB9XG59XG5cbmZ1bmN0aW9uIER1cGxleChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSByZXR1cm4gbmV3IER1cGxleChvcHRpb25zKTtcblxuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVhZGFibGUgPT09IGZhbHNlKSB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcblxuICB0aGlzLmFsbG93SGFsZk9wZW4gPSB0cnVlO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmFsbG93SGFsZk9wZW4gPT09IGZhbHNlKSB0aGlzLmFsbG93SGFsZk9wZW4gPSBmYWxzZTtcblxuICB0aGlzLm9uY2UoJ2VuZCcsIG9uZW5kKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gaWYgd2UgYWxsb3cgaGFsZi1vcGVuIHN0YXRlLCBvciBpZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCxcbiAgLy8gdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuYWxsb3dIYWxmT3BlbiB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgcG5hLm5leHRUaWNrKG9uRW5kTlQsIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTtcblxuRHVwbGV4LnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHRoaXMucHVzaChudWxsKTtcbiAgdGhpcy5lbmQoKTtcblxuICBwbmEubmV4dFRpY2soY2IsIGVycik7XG59OyIsImNvbnN0IGZzID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0U3RyZWFtJykuZnM7XG5jb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpXG5jb25zdCBQYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCB1dWlkID0gcmVxdWlyZSgndXVpZC92MScpXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJylcbmNvbnN0IHtcbiAgd2FyY0luZm9IZWFkZXIsXG4gIHdhcmNJbmZvQ29udGVudCxcbiAgd2FyY1JlcXVlc3RIZWFkZXIsXG4gIHdhcmNSZXNwb25zZUhlYWRlcixcbiAgd2FyY01ldGFkYXRhSGVhZGVyLFxuICByZWNvcmRTZXBhcmF0b3IsXG4gIENSTEYsXG4gIENSTEYyeFxufSA9IHJlcXVpcmUoJy4vd2FyY0ZpZWxkcycpXG5jb25zdCBlbnN1cmVXQVJDRmlsZU5hbWUgPSByZXF1aXJlKCcuLi91dGlscy9lbnN1cmVXQVJDRmlsZW5hbWUnKVxuXG4vKipcbiAqIEB0eXBlIHtCdWZmZXJ9XG4gKi9cbmNvbnN0IHJlY29yZFNlcGFyYXRvckJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlY29yZFNlcGFyYXRvciwgJ3V0ZjgnKVxuXG4vKipcbiAqIEB0eXBlIHtCdWZmZXJ9XG4gKi9cbmNvbnN0IENSTEZCdWZmZXIgPSBCdWZmZXIuZnJvbShDUkxGLCAndXRmOCcpXG5cbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuY29uc3QgV0FSQ1NlcFRTaXplID0gcmVjb3JkU2VwYXJhdG9yQnVmZmVyLmxlbmd0aCArIENSTEZCdWZmZXIubGVuZ3RoXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEBwYXJhbSB7P0J1ZmZlcnw/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+IGV4cG9ydHMuWl9NQVhfV0lORE9XQklUUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHdpbmRvd0JpdHM6ICcgKyBvcHRzLndpbmRvd0JpdHMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLmxldmVsKSB7XG4gICAgaWYgKG9wdHMubGV2ZWwgPCBleHBvcnRzLlpfTUlOX0xFVkVMIHx8IG9wdHMubGV2ZWwgPiBleHBvcnRzLlpfTUFYX0xFVkVMKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29tcHJlc3Npb24gbGV2ZWw6ICcgKyBvcHRzLmxldmVsKTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5tZW1MZXZlbCkge1xuICAgIGlmIChvcHRzLm1lbUxldmVsIDwgZXhwb3J0cy5aX01JTl9NRU1MRVZFTCB8fCBvcHRzLm1lbUxldmVsID4gZXhwb3J0cy5aX01BWF9NRU1MRVZFTCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1lbUxldmVsOiAnICsgb3B0cy5tZW1MZXZlbCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdHMuc3RyYXRlZ3kpIHtcbiAgICBpZiAob3B0cy5zdHJhdGVneSAhPSBleHBvcnRzLlpfRklMVEVSRUQgJiYgb3B0cy5zdHJhdGVneSAhPSBleHBvcnRzLlpfSFVGRk1BTl9PTkxZICYmIG9wdHMuc3RyYXRlZ3kgIT0gZXhwb3J0cy5aX1JMRSAmJiBvcHRzLnN0cmF0ZWd5ICE9IGV4cG9ydHMuWl9GSVhFRCAmJiBvcHRzLnN0cmF0ZWd5ICE9IGV4cG9ydHMuWl9ERUZBVUxUX1NUUkFURUdZKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyYXRlZ3k6ICcgKyBvcHRzLnN0cmF0ZWd5KTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5kaWN0aW9uYXJ5KSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIob3B0cy5kaWN0aW9uYXJ5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRpY3Rpb25hcnk6IGl0IHNob3VsZCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuX2hhbmRsZSA9IG5ldyBiaW5kaW5nLlpsaWIobW9kZSk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLl9oYWRFcnJvciA9IGZhbHNlO1xuICB0aGlzLl9oYW5kbGUub25lcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBlcnJubykge1xuICAgIC8vIHRoZXJlIGlzIG5vIHdheSB0byBjbGVhbmx5IHJlY292ZXIuXG4gICAgLy8gY29udGludWluZyBvbmx5IG9ic2N1cmVzIHByb2JsZW1zLlxuICAgIF9jbG9zZShzZWxmKTtcbiAgICBzZWxmLl9oYWRFcnJvciA9IHRydWU7XG5cbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgZXJyb3IuZXJybm8gPSBlcnJubztcbiAgICBlcnJvci5jb2RlID0gZXhwb3J0cy5jb2Rlc1tlcnJub107XG4gICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgfTtcblxuICB2YXIgbGV2ZWwgPSBleHBvcnRzLlpfREVGQVVMVF9DT01QUkVTU0lPTjtcbiAgaWYgKHR5cGVvZiBvcHRzLmxldmVsID09PSAnbnVtYmVyJykgbGV2ZWwgPSBvcHRzLmxldmVsO1xuXG4gIHZhciBzdHJhdGVneSA9IGV4cG9ydHMuWl9ERUZBVUxUX1NUUkFURUdZO1xuICBpZiAodHlwZW9mIG9wdHMuc3RyYXRlZ3kgPT09ICdudW1iZXInKSBzdHJhdGVneSA9IG9wdHMuc3RyYXRlZ3k7XG5cbiAgdGhpcy5faGFuZGxlLmluaXQob3B0cy53aW5kb3dCaXRzIHx8IGV4cG9ydHMuWl9ERUZBVUxUX1dJTkRPV0JJVFMsIGxldmVsLCBvcHRzLm1lbUxldmVsIHx8IGV4cG9ydHMuWl9ERUZBVUxUX01FTUxFVkVMLCBzdHJhdGVneSwgb3B0cy5kaWN0aW9uYXJ5KTtcblxuICB0aGlzLl9idWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUodGhpcy5fY2h1bmtTaXplKTtcbiAgdGhpcy5fb2Zmc2V0ID0gMDtcbiAgdGhpcy5fbGV2ZWwgPSBsZXZlbDtcbiAgdGhpcy5fc3RyYXRlZ3kgPSBzdHJhdGVneTtcblxuICB0aGlzLm9uY2UoJ2VuZCcsIHRoaXMuY2xvc2UpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX2Nsb3NlZCcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhX3RoaXMuX2hhbmRsZTtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG51dGlsLmluaGVyaXRzKFpsaWIsIFRyYW5zZm9ybSk7XG5cblpsaWIucHJvdG90eXBlLnBhcmFtcyA9IGZ1bmN0aW9uIChsZXZlbCwgc3RyYXRlZ3ksIGNhbGxiYWNrKSB7XG4gIGlmIChsZXZlbCA8IGV4cG9ydHMuWl9NSU5fTEVWRUwgfHwgbGV2ZWwgPiBleHBvcnRzLlpfTUFYX0xFVkVMKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgY29tcHJlc3Npb24gbGV2ZWw6ICcgKyBsZXZlbCk7XG4gIH1cbiAgaWYgKHN0cmF0ZWd5ICE9IGV4cG9ydHMuWl9GSUxURVJFRCAmJiBzdHJhdGVneSAhPSBleHBvcnRzLlpfSFVGRk1BTl9PTkxZICYmIHN0cmF0ZWd5ICE9IGV4cG9ydHMuWl9STEUgJiYgc3RyYXRlZ3kgIT0gZXhwb3J0cy5aX0ZJWEVEICYmIHN0cmF0ZWd5ICE9IGV4cG9ydHMuWl9ERUZBVUxUX1NUUkFURUdZKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBzdHJhdGVneTogJyArIHN0cmF0ZWd5KTtcbiAgfVxuXG4gIGlmICh0aGlzLl9sZXZlbCAhPT0gbGV2ZWwgfHwgdGhpcy5fc3RyYXRlZ3kgIT09IHN0cmF0ZWd5KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuZmx1c2goYmluZGluZy5aX1NZTkNfRkxVU0gsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydChzZWxmLl9oYW5kbGUsICd6bGliIGJpbmRpbmcgY2xvc2VkJyk7XG4gICAgICBzZWxmLl9oYW5kbGUucGFyYW1zKGxldmVsLCBzdHJhdGVneSk7XG4gICAgICBpZiAoIXNlbGYuX2hhZEVycm9yKSB7XG4gICAgICAgIHNlbGYuX2xldmVsID0gbGV2ZWw7XG4gICAgICAgIHNlbGYuX3N0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4gICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKTtcbiAgfVxufTtcblxuWmxpYi5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIGFzc2VydCh0aGlzLl9oYW5kbGUsICd6bGliIGJpbmRpbmcgY2xvc2VkJyk7XG4gIHJldHVybiB0aGlzLl9oYW5kbGUucmVzZXQoKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIF9mbHVzaCBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlIHRyYW5zZm9ybSBjbGFzcyxcbi8vIGludGVybmFsbHksIHdoZW4gdGhlIGxhc3QgY2h1bmsgaGFzIGJlZW4gd3JpdHRlbi5cblpsaWIucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLl90cmFuc2Zvcm0oQnVmZmVyLmFsbG9jKDApLCAnJywgY2FsbGJhY2spO1xufTtcblxuWmxpYi5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoa2luZCwgY2FsbGJhY2spIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgdmFyIHdzID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGtpbmQgPT09ICdmdW5jdGlvbicgfHwga2luZCA9PT0gdW5kZWZpbmVkICYmICFjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0ga2luZDtcbiAgICBraW5kID0gYmluZGluZy5aX0ZVTExfRkxVU0g7XG4gIH1cblxuICBpZiAod3MuZW5kZWQpIHtcbiAgICBpZiAoY2FsbGJhY2spIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spO1xuICB9IGVsc2UgaWYgKHdzLmVuZGluZykge1xuICAgIGlmIChjYWxsYmFjaykgdGhpcy5vbmNlKCdlbmQnLCBjYWxsYmFjayk7XG4gIH0gZWxzZSBpZiAod3MubmVlZERyYWluKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9uY2UoJ2RyYWluJywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLmZsdXNoKGtpbmQsIGNhbGxiYWNrKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9mbHVzaEZsYWcgPSBraW5kO1xuICAgIHRoaXMud3JpdGUoQnVmZmVyLmFsbG9jKDApLCAnJywgY2FsbGJhY2spO1xuICB9XG59O1xuXG5abGliLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICBfY2xvc2UodGhpcywgY2FsbGJhY2spO1xuICBwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZU5ULCB0aGlzKTtcbn07XG5cbmZ1bmN0aW9uIF9jbG9zZShlbmdpbmUsIGNhbGxiYWNrKSB7XG4gIGlmIChjYWxsYmFjaykgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjayk7XG5cbiAgLy8gQ2FsbGVyIG1heSBpbnZva2UgLmNsb3NlIGFmdGVyIGEgemxpYiBlcnJvciAod2hpY2ggd2lsbCBudWxsIF9oYW5kbGUpLlxuICBpZiAoIWVuZ2luZS5faGFuZGxlKSByZXR1cm47XG5cbiAgZW5naW5lLl9oYW5kbGUuY2xvc2UoKTtcbiAgZW5naW5lLl9oYW5kbGUgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBlbWl0Q2xvc2VOVChzZWxmKSB7XG4gIHNlbGYuZW1pdCgnY2xvc2UnKTtcbn1cblxuWmxpYi5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBmbHVzaEZsYWc7XG4gIHZhciB3cyA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBlbmRpbmcgPSB3cy5lbmRpbmcgfHwgd3MuZW5kZWQ7XG4gIHZhciBsYXN0ID0gZW5kaW5nICYmICghY2h1bmsgfHwgd3MubGVuZ3RoID09PSBjaHVuay5sZW5ndGgpO1xuXG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiAhQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgcmV0dXJuIGNiKG5ldyBFcnJvcignaW52YWxpZCBpbnB1dCcpKTtcblxuICBpZiAoIXRoaXMuX2hhbmRsZSkgcmV0dXJuIGNiKG5ldyBFcnJvcignemxpYiBiaW5kaW5nIGNsb3NlZCcpKTtcblxuICAvLyBJZiBpdCdzIHRoZSBsYXN0IGNodW5rLCBvciBhIGZpbmFsIGZsdXNoLCB3ZSB1c2UgdGhlIFpfRklOSVNIIGZsdXNoIGZsYWdcbiAgLy8gKG9yIHdoYXRldmVyIGZsYWcgd2FzIHByb3ZpZGVkIHVzaW5nIG9wdHMuZmluaXNoRmx1c2gpLlxuICAvLyBJZiBpdCdzIGV4cGxpY2l0bHkgZmx1c2hpbmcgYXQgc29tZSBvdGhlciB0aW1lLCB0aGVuIHdlIHVzZVxuICAvLyBaX0ZVTExfRkxVU0guIE90aGVyd2lzZSwgdXNlIFpfTk9fRkxVU0ggZm9yIG1heGltdW0gY29tcHJlc3Npb25cbiAgLy8gZ29vZG5lc3MuXG4gIGlmIChsYXN0KSBmbHVzaEZsYWcgPSB0aGlzLl9maW5pc2hGbHVzaEZsYWc7ZWxzZSB7XG4gICAgZmx1c2hGbGFnID0gdGhpcy5fZmx1c2hGbGFnO1xuICAgIC8vIG9uY2Ugd2UndmUgZmx1c2hlZCB0aGUgbGFzdCBvZiB0aGUgcXVldWUsIHN0b3AgZmx1c2hpbmcgYW5kXG4gICAgLy8gZ28gYmFjayB0byB0aGUgbm9ybWFsIGJlaGF2aW9yLlxuICAgIGlmIChjaHVuay5sZW5ndGggPj0gd3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9mbHVzaEZsYWcgPSB0aGlzLl9vcHRzLmZsdXNoIHx8IGJpbmRpbmcuWl9OT19GTFVTSDtcbiAgICB9XG4gIH1cblxuICB0aGlzLl9wcm9jZXNzQ2h1bmsoY2h1bmssIGZsdXNoRmxhZywgY2IpO1xufTtcblxuWmxpYi5wcm90b3R5cGUuX3Byb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaywgZmx1c2hGbGFnLCBjYikge1xuICB2YXIgYXZhaWxJbkJlZm9yZSA9IGNodW5rICYmIGNodW5rLmxlbmd0aDtcbiAgdmFyIGF2YWlsT3V0QmVmb3JlID0gdGhpcy5fY2h1bmtTaXplIC0gdGhpcy5fb2Zmc2V0O1xuICB2YXIgaW5PZmYgPSAwO1xuXG4gIHZhciBzZWxmID0gdGhpcztcblxuICB2YXIgYXN5bmMgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbic7XG5cbiAgaWYgKCFhc3luYykge1xuICAgIHZhciBidWZmZXJzID0gW107XG4gICAgdmFyIG5yZWFkID0gMDtcblxuICAgIHZhciBlcnJvcjtcbiAgICB0aGlzLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcikge1xuICAgICAgZXJyb3IgPSBlcjtcbiAgICB9KTtcblxuICAgIGFzc2VydCh0aGlzLl9oYW5kbGUsICd6bGliIGJpbmRpbmcgY2xvc2VkJyk7XG4gICAgZG8ge1xuICAgICAgdmFyIHJlcyA9IHRoaXMuX2hhbmRsZS53cml0ZVN5bmMoZmx1c2hGbGFnLCBjaHVuaywgLy8gaW5cbiAgICAgIGluT2ZmLCAvLyBpbl9vZmZcbiAgICAgIGF2YWlsSW5CZWZvcmUsIC8vIGluX2xlblxuICAgICAgdGhpcy5fYnVmZmVyLCAvLyBvdXRcbiAgICAgIHRoaXMuX29mZnNldCwgLy9vdXRfb2ZmXG4gICAgICBhdmFpbE91dEJlZm9yZSk7IC8vIG91dF9sZW5cbiAgICB9IHdoaWxlICghdGhpcy5faGFkRXJyb3IgJiYgY2FsbGJhY2socmVzWzBdLCByZXNbMV0pKTtcblxuICAgIGlmICh0aGlzLl9oYWRFcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKG5yZWFkID49IGtNYXhMZW5ndGgpIHtcbiAgICAgIF9jbG9zZSh0aGlzKTtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGtSYW5nZUVycm9yTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdmFyIGJ1ZiA9IEJ1ZmZlci5jb25jYXQoYnVmZmVycywgbnJlYWQpO1xuICAgIF9jbG9zZSh0aGlzKTtcblxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICBhc3NlcnQodGhpcy5faGFuZGxlLCAnemxpYiBiaW5kaW5nIGNsb3NlZCcpO1xuICB2YXIgcmVxID0gdGhpcy5faGFuZGxlLndyaXRlKGZsdXNoRmxhZywgY2h1bmssIC8vIGluXG4gIGluT2ZmLCAvLyBpbl9vZmZcbiAgYXZhaWxJbkJlZm9yZSwgLy8gaW5fbGVuXG4gIHRoaXMuX2J1ZmZlciwgLy8gb3V0XG4gIHRoaXMuX29mZnNldCwgLy9vdXRfb2ZmXG4gIGF2YWlsT3V0QmVmb3JlKTsgLy8gb3V0X2xlblxuXG4gIHJlcS5idWZmZXIgPSBjaHVuaztcbiAgcmVxLmNhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgZnVuY3Rpb24gY2FsbGJhY2soYXZhaWxJbkFmdGVyLCBhdmFpbE91dEFmdGVyKSB7XG4gICAgLy8gV2hlbiB0aGUgY2FsbGJhY2sgaXMgdXNlZCBpbiBhbiBhc3luYyB3cml0ZSwgdGhlIGNhbGxiYWNrJ3NcbiAgICAvLyBjb250ZXh0IGlzIHRoZSBgcmVxYCBvYmplY3QgdGhhdCB3YXMgY3JlYXRlZC4gVGhlIHJlcSBvYmplY3RcbiAgICAvLyBpcyA9PT0gdGhpcy5faGFuZGxlLCBhbmQgdGhhdCdzIHdoeSBpdCdzIGltcG9ydGFudCB0byBudWxsXG4gICAgLy8gb3V0IHRoZSB2YWx1ZXMgYWZ0ZXIgdGhleSBhcmUgZG9uZSBiZWluZyB1c2VkLiBgdGhpcy5faGFuZGxlYFxuICAgIC8vIGNhbiBzdGF5IGluIG1lbW9yeSBsb25nZXIgdGhhbiB0aGUgY2FsbGJhY2sgYW5kIGJ1ZmZlciBhcmUgbmVlZGVkLlxuICAgIGlmICh0aGlzKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IG51bGw7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoc2VsZi5faGFkRXJyb3IpIHJldHVybjtcblxuICAgIHZhciBoYXZlID0gYXZhaWxPdXRCZWZvcmUgLSBhdmFpbE91dEFmdGVyO1xuICAgIGFzc2VydChoYXZlID49IDAsICdoYXZlIHNob3VsZCBub3QgZ28gZG93bicpO1xuXG4gICAgaWYgKGhhdmUgPiAwKSB7XG4gICAgICB2YXIgb3V0ID0gc2VsZi5fYnVmZmVyLnNsaWNlKHNlbGYuX29mZnNldCwgc2VsZi5fb2Zmc2V0ICsgaGF2ZSk7XG4gICAgICBzZWxmLl9vZmZzZXQgKz0gaGF2ZTtcbiAgICAgIC8vIHNlcnZlIHNvbWUgb3V0cHV0IHRvIHRoZSBjb25zdW1lci5cbiAgICAgIGlmIChhc3luYykge1xuICAgICAgICBzZWxmLnB1c2gob3V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1ZmZlcnMucHVzaChvdXQpO1xuICAgICAgICBucmVhZCArPSBvdXQubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGV4aGF1c3RlZCB0aGUgb3V0cHV0IGJ1ZmZlciwgb3IgdXNlZCBhbGwgdGhlIGlucHV0IGNyZWF0ZSBhIG5ldyBvbmUuXG4gICAgaWYgKGF2YWlsT3V0QWZ0ZXIgPT09IDAgfHwgc2VsZi5fb2Zmc2V0ID49IHNlbGYuX2NodW5rU2l6ZSkge1xuICAgICAgYXZhaWxPdXRCZWZvcmUgPSBzZWxmLl9jaHVua1NpemU7XG4gICAgICBzZWxmLl9vZmZzZXQgPSAwO1xuICAgICAgc2VsZi5fYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKHNlbGYuX2NodW5rU2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKGF2YWlsT3V0QWZ0ZXIgPT09IDApIHtcbiAgICAgIC8vIE5vdCBhY3R1YWxseSBkb25lLiAgTmVlZCB0byByZXByb2Nlc3MuXG4gICAgICAvLyBBbHNvLCB1cGRhdGUgdGhlIGF2YWlsSW5CZWZvcmUgdG8gdGhlIGF2YWlsSW5BZnRlciB2YWx1ZSxcbiAgICAgIC8vIHNvIHRoYXQgaWYgd2UgaGF2ZSB0byBoaXQgaXQgYSB0aGlyZCAoZm91cnRoLCBldGMuKSB0aW1lLFxuICAgICAgLy8gaXQnbGwgaGF2ZSB0aGUgY29ycmVjdCBieXRlIGNvdW50cy5cbiAgICAgIGluT2ZmICs9IGF2YWlsSW5CZWZvcmUgLSBhdmFpbEluQWZ0ZXI7XG4gICAgICBhdmFpbEluQmVmb3JlID0gYXZhaWxJbkFmdGVyO1xuXG4gICAgICBpZiAoIWFzeW5jKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgdmFyIG5ld1JlcSA9IHNlbGYuX2hhbmRsZS53cml0ZShmbHVzaEZsYWcsIGNodW5rLCBpbk9mZiwgYXZhaWxJbkJlZm9yZSwgc2VsZi5fYnVmZmVyLCBzZWxmLl9vZmZzZXQsIHNlbGYuX2NodW5rU2l6ZSk7XG4gICAgICBuZXdSZXEuY2FsbGJhY2sgPSBjYWxsYmFjazsgLy8gdGhpcyBzYW1lIGZ1bmN0aW9uXG4gICAgICBuZXdSZXEuYnVmZmVyID0gY2h1bms7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFhc3luYykgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gZmluaXNoZWQgd2l0aCB0aGUgY2h1bmsuXG4gICAgY2IoKTtcbiAgfVxufTtcblxudXRpbC5pbmhlcml0cyhEZWZsYXRlLCBabGliKTtcbnV0aWwuaW5oZXJpdHMoSW5mbGF0ZSwgWmxpYik7XG51dGlsLmluaGVyaXRzKEd6aXAsIFpsaWIpO1xudXRpbC5pbmhlcml0cyhHdW56aXAsIFpsaWIpO1xudXRpbC5pbmhlcml0cyhEZWZsYXRlUmF3LCBabGliKTtcbnV0aWwuaW5oZXJpdHMoSW5mbGF0ZVJhdywgWmxpYik7XG51dGlsLmluaGVyaXRzKFVuemlwLCBabGliKTsiLCIndXNlIHN0cmljdCc7XG5cbmlmICghcHJvY2Vzcy52ZXJzaW9uIHx8XG4gICAgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YwLicpID09PSAwIHx8XG4gICAgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLicpID09PSAwICYmIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS44LicpICE9PSAwKSB7XG4gIG1vZHVsZS5leHBvcnRzID0geyBuZXh0VGljazogbmV4dFRpY2sgfTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcHJvY2Vzc1xufVxuXG5mdW5jdGlvbiBuZXh0VGljayhmbiwgYXJnMSwgYXJnMiwgYXJnMykge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJjYWxsYmFja1wiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG4gIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgYXJncywgaTtcbiAgc3dpdGNoIChsZW4pIHtcbiAgY2FzZSAwOlxuICBjYXNlIDE6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZm4pO1xuICBjYXNlIDI6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrT25lKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxKTtcbiAgICB9KTtcbiAgY2FzZSAzOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja1R3bygpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSwgYXJnMik7XG4gICAgfSk7XG4gIGNhc2UgNDpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUaHJlZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgfSk7XG4gIGRlZmF1bHQ6XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gLSAxKTtcbiAgICBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGFyZ3MubGVuZ3RoKSB7XG4gICAgICBhcmdzW2krK10gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGljaygpIHtcbiAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0pO1xuICB9XG59XG5cbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIFRZUEVEX09LID0gICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBVaW50MTZBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyk7XG5cbmZ1bmN0aW9uIF9oYXMob2JqLCBrZXkpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG59XG5cbmV4cG9ydHMuYXNzaWduID0gZnVuY3Rpb24gKG9iaiAvKmZyb20xLCBmcm9tMiwgZnJvbTMsIC4uLiovKSB7XG4gIHZhciBzb3VyY2VzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgd2hpbGUgKHNvdXJjZXMubGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKTtcbiAgICBpZiAoIXNvdXJjZSkgeyBjb250aW51ZTsgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICdtdXN0IGJlIG5vbi1vYmplY3QnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwIGluIHNvdXJjZSkge1xuICAgICAgaWYgKF9oYXMoc291cmNlLCBwKSkge1xuICAgICAgICBvYmpbcF0gPSBzb3VyY2VbcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cblxuLy8gcmVkdWNlIGJ1ZmZlciBzaXplLCBhdm9pZGluZyBtZW0gY29weVxuZXhwb3J0cy5zaHJpbmtCdWYgPSBmdW5jdGlvbiAoYnVmLCBzaXplKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBzaXplKSB7IHJldHVybiBidWY7IH1cbiAgaWYgKGJ1Zi5zdWJhcnJheSkgeyByZXR1cm4gYnVmLnN1YmFycmF5KDAsIHNpemUpOyB9XG4gIGJ1Zi5sZW5ndGggPSBzaXplO1xuICByZXR1cm4gYnVmO1xufTtcblxuXG52YXIgZm5UeXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGlmIChzcmMuc3ViYXJyYXkgJiYgZGVzdC5zdWJhcnJheSkge1xuICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY19vZmZzLCBzcmNfb2ZmcyArIGxlbiksIGRlc3Rfb2Zmcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIHRvIG9yZGluYXJ5IGFycmF5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICAgIH1cbiAgfSxcbiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxuICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbiAoY2h1bmtzKSB7XG4gICAgdmFyIGksIGwsIGxlbiwgcG9zLCBjaHVuaywgcmVzdWx0O1xuXG4gICAgLy8gY2FsY3VsYXRlIGRhdGEgbGVuZ3RoXG4gICAgbGVuID0gMDtcbiAgICBmb3IgKGkgPSAwLCBsID0gY2h1bmtzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgbGVuICs9IGNodW5rc1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gam9pbiBjaHVua3NcbiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgIHBvcyA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNodW5rID0gY2h1bmtzW2ldO1xuICAgICAgcmVzdWx0LnNldChjaHVuaywgcG9zKTtcbiAgICAgIHBvcyArPSBjaHVuay5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxudmFyIGZuVW50eXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGNodW5rcyk7XG4gIH1cbn07XG5cblxuLy8gRW5hYmxlL0Rpc2FibGUgdHlwZWQgYXJyYXlzIHVzZSwgZm9yIHRlc3Rpbmdcbi8vXG5leHBvcnRzLnNldFR5cGVkID0gZnVuY3Rpb24gKG9uKSB7XG4gIGlmIChvbikge1xuICAgIGV4cG9ydHMuQnVmOCAgPSBVaW50OEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBVaW50MTZBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gSW50MzJBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblR5cGVkKTtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gQXJyYXk7XG4gICAgZXhwb3J0cy5CdWYxNiA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMzIgPSBBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblVudHlwZWQpO1xuICB9XG59O1xuXG5leHBvcnRzLnNldFR5cGVkKFRZUEVEX09LKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBwcmVmaXggPSAnfic7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgc3RvcmFnZSBmb3Igb3VyIGBFRWAgb2JqZWN0cy5cbiAqIEFuIGBFdmVudHNgIGluc3RhbmNlIGlzIGEgcGxhaW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRXZlbnRzKCkge31cblxuLy9cbi8vIFdlIHRyeSB0byBub3QgaW5oZXJpdCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC4gSW4gc29tZSBlbmdpbmVzIGNyZWF0aW5nIGFuXG4vLyBpbnN0YW5jZSBpbiB0aGlzIHdheSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCBkaXJlY3RseS5cbi8vIElmIGBPYmplY3QuY3JlYXRlKG51bGwpYCBpcyBub3Qgc3VwcG9ydGVkIHdlIHByZWZpeCB0aGUgZXZlbnQgbmFtZXMgd2l0aCBhXG4vLyBjaGFyYWN0ZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0LWluIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBub3Rcbi8vIG92ZXJyaWRkZW4gb3IgdXNlZCBhcyBhbiBhdHRhY2sgdmVjdG9yLlxuLy9cbmlmIChPYmplY3QuY3JlYXRlKSB7XG4gIEV2ZW50cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vXG4gIC8vIFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgaXMgc3RpbGwgaW5oZXJpdGVkIGluXG4gIC8vIHNvbWUgb2xkIGJyb3dzZXJzIGxpa2UgQW5kcm9pZCA0LCBpUGhvbmUgNS4xLCBPcGVyYSAxMSBhbmQgU2FmYXJpIDUuXG4gIC8vXG4gIGlmICghbmV3IEV2ZW50cygpLl9fcHJvdG9fXykgcHJlZml4ID0gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEVFKGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHRoaXMuZm4gPSBmbjtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5vbmNlID0gb25jZSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gbmV3IEVFKGZuLCBjb250ZXh0IHx8IGVtaXR0ZXIsIG9uY2UpXG4gICAgLCBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0pIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gbGlzdGVuZXIsIGVtaXR0ZXIuX2V2ZW50c0NvdW50Kys7XG4gIGVsc2UgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XS5mbikgZW1pdHRlci5fZXZlbnRzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2UgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBbZW1pdHRlci5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXTtcblxuICByZXR1cm4gZW1pdHRlcjtcbn1cblxuLyoqXG4gKiBDbGVhciBldmVudCBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZ0IFRoZSBFdmVudCBuYW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJFdmVudChlbWl0dGVyLCBldnQpIHtcbiAgaWYgKC0tZW1pdHRlci5fZXZlbnRzQ291bnQgPT09IDApIGVtaXR0ZXIuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgZWxzZSBkZWxldGUgZW1pdHRlci5fZXZlbnRzW2V2dF07XG59XG5cbi8qKlxuICogTWluaW1hbCBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UgdGhhdCBpcyBtb2xkZWQgYWdhaW5zdCB0aGUgTm9kZS5qc1xuICogYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkXG4gKiBsaXN0ZW5lcnMuXG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICB2YXIgbmFtZXMgPSBbXVxuICAgICwgZXZlbnRzXG4gICAgLCBuYW1lO1xuXG4gIGlmICh0aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgcmV0dXJuIG5hbWVzO1xuXG4gIGZvciAobmFtZSBpbiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzKSkge1xuICAgIGlmIChoYXMuY2FsbChldmVudHMsIG5hbWUpKSBuYW1lcy5wdXNoKHByZWZpeCA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lKTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgcmV0dXJuIG5hbWVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV2ZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgaGFuZGxlcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWhhbmRsZXJzKSByZXR1cm4gW107XG4gIGlmIChoYW5kbGVycy5mbikgcmV0dXJuIFtoYW5kbGVycy5mbl07XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGgsIGVlID0gbmV3IEFycmF5KGwpOyBpIDwgbDsgaSsrKSB7XG4gICAgZWVbaV0gPSBoYW5kbGVyc1tpXS5mbjtcbiAgfVxuXG4gIHJldHVybiBlZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIDA7XG4gIGlmIChsaXN0ZW5lcnMuZm4pIHJldHVybiAxO1xuICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQ2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuICAgICwgbGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgYXJnc1xuICAgICwgaTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKGxpc3RlbmVycy5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnMuZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQpLCB0cnVlO1xuICAgICAgY2FzZSAyOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExKSwgdHJ1ZTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIpLCB0cnVlO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMpLCB0cnVlO1xuICAgICAgY2FzZSA1OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCwgYTUpLCB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMuZm4uYXBwbHkobGlzdGVuZXJzLmNvbnRleHQsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAsIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0ZW5lcnNbaV0ub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzW2ldLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDE6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0KTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMik7IGJyZWFrO1xuICAgICAgICBjYXNlIDQ6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIsIGEzKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFhcmdzKSBmb3IgKGogPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmZuLmFwcGx5KGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiBvbihldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZShldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IGhhdmUgdGhpcyBjb250ZXh0LlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIE9ubHkgcmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVycy5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gdGhpcztcbiAgaWYgKCFmbikge1xuICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKFxuICAgICAgbGlzdGVuZXJzLmZuID09PSBmbiAmJlxuICAgICAgKCFvbmNlIHx8IGxpc3RlbmVycy5vbmNlKSAmJlxuICAgICAgKCFjb250ZXh0IHx8IGxpc3RlbmVycy5jb250ZXh0ID09PSBjb250ZXh0KVxuICAgICkge1xuICAgICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMCwgZXZlbnRzID0gW10sIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBsaXN0ZW5lcnNbaV0uZm4gIT09IGZuIHx8XG4gICAgICAgIChvbmNlICYmICFsaXN0ZW5lcnNbaV0ub25jZSkgfHxcbiAgICAgICAgKGNvbnRleHQgJiYgbGlzdGVuZXJzW2ldLmNvbnRleHQgIT09IGNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIFJlc2V0IHRoZSBhcnJheSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycy5cbiAgICAvL1xuICAgIGlmIChldmVudHMubGVuZ3RoKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGV2ZW50cy5sZW5ndGggPT09IDEgPyBldmVudHNbMF0gOiBldmVudHM7XG4gICAgZWxzZSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IFtldmVudF0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQ7XG5cbiAgaWYgKGV2ZW50KSB7XG4gICAgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcbiAgICBpZiAodGhpcy5fZXZlbnRzW2V2dF0pIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vL1xuLy8gQWxpYXMgbWV0aG9kcyBuYW1lcyBiZWNhdXNlIHBlb3BsZSByb2xsIGxpa2UgdGhhdC5cbi8vXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgcHJlZml4LlxuLy9cbkV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuLy9cbi8vIEFsbG93IGBFdmVudEVtaXR0ZXJgIHRvIGJlIGltcG9ydGVkIGFzIG1vZHVsZSBuYW1lc3BhY2UuXG4vL1xuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuLy9cbmlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbn1cbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0TGlrZTtcbiIsImNvbnN0IENhcHR1cmVkUmVxdWVzdCA9IHJlcXVpcmUoJy4vY2FwdHVyZWRSZXF1ZXN0JylcblxuLyoqXG4gKiBDbGFzcyBSZXNwb25zaWJsZSBGb3IgTWFuYWdpbmcgVGhlIENhcHR1cmVkIFJlcXVlc3QgLyBSZXNwb25zZXMgRm9yIEEgUGFnZVxuICovXG5jbGFzcyBSZXF1ZXN0SGFuZGxlciB7XG4gIC8qKlxuICAgKiBAZGVzYyBDcmVhdGUgQSBOZXcgUmVxdWVzdEhhbmRsZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBUbyBDYXB0dXJlIFJlcXVlc3RzIE9yIE5vdCBUbyBDYXB0dXJlIFJlcXVlc3RzXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl9jYXB0dXJlID0gdHJ1ZVxuXG4gICAgLyoqXG4gICAgICogQGRlc2MgQXNzb2NpYXRpb24gT2YgUmVxdWVzdElkcyBUbyBDYXB0dXJlZFJlcXVlc3RzXG4gICAgICogQHR5cGUge01hcDxzdHJpbmcsQ2FwdHVyZWRSZXF1ZXN0Pn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX3JlcXVlc3RzID0gbmV3IE1hcCgpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgU2V0cyBhbiBpbnRlcm5hbCBmbGFnIHRvIGJlZ2luIGNhcHR1cmluZyBuZXR3b3JrIHJlcXVlc3RzLlxuICAgKiBDbGVhcnMgQW55IFByZXZpb3VzbHkgQ2FwdHVyZWQgUmVxdWVzdCBJbmZvcm1hdGlvblxuICAgKi9cbiAgc3RhcnRDYXB0dXJpbmcgKCkge1xuICAgIHRoaXMuX3JlcXVlc3RzLmNsZWFyKClcbiAgICB0aGlzLl9jYXB0dXJlID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFNldHMgYW4gaW50ZXJuYWwgZmxhZyB0byBzdG9wIHRoZSBjYXB0dXJpbmcgbmV0d29yayByZXF1ZXN0c1xuICAgKi9cbiAgc3RvcENhcHR1cmluZyAoKSB7XG4gICAgdGhpcy5fY2FwdHVyZSA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgSGFuZGxlcyBlaXRoZXIgdGhlIE5ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnQgb3IgdGhlIE5ldHdvcmsucmVzcG9uc2VSZWNlaXZlZCBldmVudHNcbiAgICogQHNlZSBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvTmV0d29yay8jZXZlbnQtcmVxdWVzdFdpbGxCZVNlbnRcbiAgICogQHNlZSBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvTmV0d29yay8jZXZlbnQtcmVzcG9uc2VSZWNlaXZlZFxuICAgKiBAcGFyYW0ge09iamVjdH0gaW5mb1xuICAgKi9cbiAgYWRkUmVxdWVzdEluZm8gKGluZm8pIHtcbiAgICBpZiAodGhpcy5fY2FwdHVyZSkge1xuICAgICAgaWYgKHRoaXMuX3JlcXVlc3RzLmhhcyhpbmZvLnJlcXVlc3RJZCkpIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdHMuZ2V0KGluZm8ucmVxdWVzdElkKS5hZGRSZXF1ZXN0SW5mbyhpbmZvKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdHMuc2V0KGluZm8ucmVxdWVzdElkLCBuZXcgQ2FwdHVyZWRSZXF1ZXN0KGluZm8pKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBIYW5kbGVzIHRoZSBOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50IGV2ZW50XG4gICAqIEBzZWUgaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvdG90L05ldHdvcmsvI2V2ZW50LXJlcXVlc3RXaWxsQmVTZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvXG4gICAqL1xuICByZXF1ZXN0V2lsbEJlU2VudCAoaW5mbykge1xuICAgIGlmICh0aGlzLl9jYXB0dXJlKSB7XG4gICAgICBpZiAodGhpcy5fcmVxdWVzdHMuaGFzKGluZm8ucmVxdWVzdElkKSkge1xuICAgICAgICB0aGlzLl9yZXF1ZXN0cy5nZXQoaW5mby5yZXF1ZXN0SWQpLmFkZFJlcXVlc3RJbmZvKGluZm8pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXF1ZXN0cy5zZXQoaW5mby5yZXF1ZXN0SWQsIG5ldyBDYXB0dXJlZFJlcXVlc3QoaW5mbykpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEhhbmRsZXMgdGhlIE5ldHdvcmsucmVzcG9uc2VSZWNlaXZlZCBldmVudFxuICAgKiBAc2VlIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL3RvdC9OZXR3b3JrLyNldmVudC1yZXNwb25zZVJlY2VpdmVkXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvXG4gICAqL1xuICByZXNwb25zZVJlY2VpdmVkIChpbmZvKSB7XG4gICAgaWYgKHRoaXMuX2NhcHR1cmUpIHtcbiAgICAgIGlmICghdGhpcy5fcmVxdWVzdHMuaGFzKGluZm8ucmVxdWVzdElkKSkge1xuICAgICAgICB0aGlzLl9yZXF1ZXN0cy5zZXQoaW5mby5yZXF1ZXN0SWQsIG5ldyBDYXB0dXJlZFJlcXVlc3QoaW5mbykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXF1ZXN0cy5nZXQoaW5mby5yZXF1ZXN0SWQpLmFkZFJlcXVlc3RJbmZvKGluZm8pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWFwL0BAaXRlcmF0b3JcbiAgICogQGRlc2MgR2V0IEFuIEl0ZXJhdG9yIE92ZXIgVGhlIFJlcXVlc3QgSWQsIFJlcXVlc3QgT2JqZWN0IFBhaXJzXG4gICAqIEByZXR1cm5zIHtJdGVyYXRvcn1cbiAgICovXG4gIFtTeW1ib2wuaXRlcmF0b3JdICgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdHNbU3ltYm9sLml0ZXJhdG9yXSgpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgUmVtb3ZlIEFsbCBSZXF1ZXN0c1xuICAgKi9cbiAgY2xlYXIgKCkge1xuICAgIHRoaXMuX3JlcXVlc3RzLmNsZWFyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBEb2VzIFRoZSBJbnRlcmNlcHRvciBIYXZlIFRoZSBSZXF1ZXN0IE9iamVjdCBBc3NvY2lhdGVkIFdpdGggQSBSZXF1ZXN0IElkXG4gICAqIEBwYXJhbSB7IXN0cmluZ30gcmVxdWVzdElkXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaGFzIChyZXF1ZXN0SWQpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdHMuaGFzKHJlcXVlc3RJZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBSZXRyaWV2ZSBUaGUgQ29ycmVzcG9uZGluZyBSZXF1ZXN0IE9iamVjdCBGb3IgQSBSZXF1ZXN0IElkXG4gICAqIEBwYXJhbSB7IXN0cmluZ30gcmVxdWVzdElkXG4gICAqIEByZXR1cm5zIHtDYXB0dXJlZFJlcXVlc3R9XG4gICAqL1xuICBnZXQgKHJlcXVlc3RJZCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0cy5nZXQocmVxdWVzdElkKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBzaXplICgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdHMuc2l6ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEdldCBBbiBJdGVyYXRvciBPdmVyIFRoZSBSZXF1ZXN0IElkLCBSZXF1ZXN0IE9iamVjdCBQYWlyc1xuICAgKiBAcmV0dXJucyB7SXRlcmF0b3J9XG4gICAqL1xuICBlbnRyaWVzICgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdHMuZW50cmllcygpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgR2V0IEFuIEl0ZXJhdG9yIE92ZXIgVGhlIFJlcXVlc3QgSWRzXG4gICAqIEByZXR1cm5zIHtJdGVyYXRvcjxzdHJpbmc+fVxuICAgKi9cbiAga2V5cyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RzLmtleXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEdldCBBbiBJdGVyYXRvciBPdmVyIFRoZSBSZXF1ZXN0IE9iamVjdHNcbiAgICogQHJldHVybnMge0l0ZXJhdG9yPENhcHR1cmVkUmVxdWVzdD59XG4gICAqL1xuICB2YWx1ZXMgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0cy52YWx1ZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEFwcGx5IEFuIEl0ZXJhdGVlIE9uY2UgRm9yIEVhY2ggTWFwcGVkIFJlcXVlc3QgSWQsIFJlcXVlc3QgT2JqZWN0IFBhaXJcbiAgICogQHBhcmFtIHshZnVuY3Rpb259IGl0ZXJhdGVlIHRoZSBmdW5jdGlvbiB0byBiZSBhcHBsaWVkXG4gICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIG9wdGlvbmFsIHRoaXMgYXJndW1lbnRcbiAgICovXG4gIGZvckVhY2ggKGl0ZXJhdGVlLCB0aGlzQXJnKSB7XG4gICAgdGhpcy5fcmVxdWVzdHMuZm9yRWFjaChpdGVyYXRlZSwgdGhpc0FyZylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtJdGVyYXRvcjxDRFBSZXF1ZXN0SW5mbz59XG4gICAqL1xuICAqIGl0ZXJhdGVSZXF1ZXN0cyAoKSB7XG4gICAgZm9yIChsZXQgY3Igb2YgdGhpcy5fcmVxdWVzdHMudmFsdWVzKCkpIHtcbiAgICAgIGZvciAobGV0IHJpIG9mIGNyLnZhbHVlcygpKSB7XG4gICAgICAgIHlpZWxkIHJpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHR5cGUge1JlcXVlc3RIYW5kbGVyfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IFJlcXVlc3RIYW5kbGVyXG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxubW9kdWxlLmV4cG9ydHMgPSBTdHJlYW07XG5cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmluaGVyaXRzKFN0cmVhbSwgRUUpO1xuU3RyZWFtLlJlYWRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLmpzJyk7XG5TdHJlYW0uV3JpdGFibGUgPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vd3JpdGFibGUuanMnKTtcblN0cmVhbS5EdXBsZXggPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vZHVwbGV4LmpzJyk7XG5TdHJlYW0uVHJhbnNmb3JtID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3RyYW5zZm9ybS5qcycpO1xuU3RyZWFtLlBhc3NUaHJvdWdoID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3Bhc3N0aHJvdWdoLmpzJyk7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuNC54XG5TdHJlYW0uU3RyZWFtID0gU3RyZWFtO1xuXG5cblxuLy8gb2xkLXN0eWxlIHN0cmVhbXMuICBOb3RlIHRoYXQgdGhlIHBpcGUgbWV0aG9kICh0aGUgb25seSByZWxldmFudFxuLy8gcGFydCBvZiB0aGlzIGNsYXNzKSBpcyBvdmVycmlkZGVuIGluIHRoZSBSZWFkYWJsZSBjbGFzcy5cblxuZnVuY3Rpb24gU3RyZWFtKCkge1xuICBFRS5jYWxsKHRoaXMpO1xufVxuXG5TdHJlYW0ucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBvcHRpb25zKSB7XG4gIHZhciBzb3VyY2UgPSB0aGlzO1xuXG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGlmIChkZXN0LndyaXRhYmxlKSB7XG4gICAgICBpZiAoZmFsc2UgPT09IGRlc3Qud3JpdGUoY2h1bmspICYmIHNvdXJjZS5wYXVzZSkge1xuICAgICAgICBzb3VyY2UucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzb3VyY2Uub24oJ2RhdGEnLCBvbmRhdGEpO1xuXG4gIGZ1bmN0aW9uIG9uZHJhaW4oKSB7XG4gICAgaWYgKHNvdXJjZS5yZWFkYWJsZSAmJiBzb3VyY2UucmVzdW1lKSB7XG4gICAgICBzb3VyY2UucmVzdW1lKCk7XG4gICAgfVxuICB9XG5cbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICAvLyBJZiB0aGUgJ2VuZCcgb3B0aW9uIGlzIG5vdCBzdXBwbGllZCwgZGVzdC5lbmQoKSB3aWxsIGJlIGNhbGxlZCB3aGVuXG4gIC8vIHNvdXJjZSBnZXRzIHRoZSAnZW5kJyBvciAnY2xvc2UnIGV2ZW50cy4gIE9ubHkgZGVzdC5lbmQoKSBvbmNlLlxuICBpZiAoIWRlc3QuX2lzU3RkaW8gJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMuZW5kICE9PSBmYWxzZSkpIHtcbiAgICBzb3VyY2Uub24oJ2VuZCcsIG9uZW5kKTtcbiAgICBzb3VyY2Uub24oJ2Nsb3NlJywgb25jbG9zZSk7XG4gIH1cblxuICB2YXIgZGlkT25FbmQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBpZiAoZGlkT25FbmQpIHJldHVybjtcbiAgICBkaWRPbkVuZCA9IHRydWU7XG5cbiAgICBpZiAodHlwZW9mIGRlc3QuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgZGVzdC5kZXN0cm95KCk7XG4gIH1cblxuICAvLyBkb24ndCBsZWF2ZSBkYW5nbGluZyBwaXBlcyB3aGVuIHRoZXJlIGFyZSBlcnJvcnMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBjbGVhbnVwKCk7XG4gICAgaWYgKEVFLmxpc3RlbmVyQ291bnQodGhpcywgJ2Vycm9yJykgPT09IDApIHtcbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgc3RyZWFtIGVycm9yIGluIHBpcGUuXG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuICBkZXN0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIHJlbW92ZSBhbGwgdGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKTtcblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG4gIH1cblxuICBzb3VyY2Uub24oJ2VuZCcsIGNsZWFudXApO1xuICBzb3VyY2Uub24oJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgZGVzdC5vbignY2xvc2UnLCBjbGVhbnVwKTtcblxuICBkZXN0LmVtaXQoJ3BpcGUnLCBzb3VyY2UpO1xuXG4gIC8vIEFsbG93IGZvciB1bml4LWxpa2UgdXNhZ2U6IEEucGlwZShCKS5waXBlKEMpXG4gIHJldHVybiBkZXN0O1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnID8gUmVmbGVjdCA6IG51bGxcbnZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nXG4gID8gUi5hcHBseVxuICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpO1xuICB9XG5cbnZhciBSZWZsZWN0T3duS2V5c1xuaWYgKFIgJiYgdHlwZW9mIFIub3duS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICBSZWZsZWN0T3duS2V5cyA9IFIub3duS2V5c1xufSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldClcbiAgICAgIC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKTtcbiAgfTtcbn0gZWxzZSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFByb2Nlc3NFbWl0V2FybmluZyh3YXJuaW5nKSB7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKHdhcm5pbmcpO1xufVxuXG52YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG52YXIgZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRFbWl0dGVyLCAnZGVmYXVsdE1heExpc3RlbmVycycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGVmYXVsdE1heExpc3RlbmVycztcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ251bWJlcicgfHwgYXJnIDwgMCB8fCBOdW1iZXJJc05hTihhcmcpKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBhcmcgKyAnLicpO1xuICAgIH1cbiAgICBkZWZhdWx0TWF4TGlzdGVuZXJzID0gYXJnO1xuICB9XG59KTtcblxuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbigpIHtcblxuICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHtcbiAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59O1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBzZXRNYXhMaXN0ZW5lcnMobikge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPCAwIHx8IE51bWJlcklzTmFOKG4pKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcIm5cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgbiArICcuJyk7XG4gIH1cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiAkZ2V0TWF4TGlzdGVuZXJzKHRoYXQpIHtcbiAgaWYgKHRoYXQuX21heExpc3RlbmVycyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgcmV0dXJuIHRoYXQuX21heExpc3RlbmVycztcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7XG4gIHJldHVybiAkZ2V0TWF4TGlzdGVuZXJzKHRoaXMpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdCh0eXBlKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgdmFyIGRvRXJyb3IgPSAodHlwZSA9PT0gJ2Vycm9yJyk7XG5cbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKVxuICAgIGRvRXJyb3IgPSAoZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT09IHVuZGVmaW5lZCk7XG4gIGVsc2UgaWYgKCFkb0Vycm9yKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgdmFyIGVyO1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApXG4gICAgICBlciA9IGFyZ3NbMF07XG4gICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvd1xuICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi5cbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH1cbiAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7XG4gICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IGV2ZW50c1t0eXBlXTtcblxuICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuXG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgfVxuXG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGFyZ2V0Ll9ldmVudHNDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gICAgaWYgKGV2ZW50cy5uZXdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICAgICsrdGFyZ2V0Ll9ldmVudHNDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID1cbiAgICAgICAgcHJlcGVuZCA/IFtsaXN0ZW5lciwgZXhpc3RpbmddIDogW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgfSBlbHNlIGlmIChwcmVwZW5kKSB7XG4gICAgICBleGlzdGluZy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgICBtID0gJGdldE1heExpc3RlbmVycyh0YXJnZXQpO1xuICAgIGlmIChtID4gMCAmJiBleGlzdGluZy5sZW5ndGggPiBtICYmICFleGlzdGluZy53YXJuZWQpIHtcbiAgICAgIGV4aXN0aW5nLndhcm5lZCA9IHRydWU7XG4gICAgICAvLyBObyBlcnJvciBjb2RlIGZvciB0aGlzIHNpbmNlIGl0IGlzIGEgV2FybmluZ1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICB2YXIgdyA9IG5ldyBFcnJvcignUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcubGVuZ3RoICsgJyAnICsgU3RyaW5nKHR5cGUpICsgJyBsaXN0ZW5lcnMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNyZWFzZSBsaW1pdCcpO1xuICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICB3LmVtaXR0ZXIgPSB0YXJnZXQ7XG4gICAgICB3LnR5cGUgPSB0eXBlO1xuICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgIFByb2Nlc3NFbWl0V2FybmluZyh3KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH07XG5cbmZ1bmN0aW9uIG9uY2VXcmFwcGVyKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIGlmICghdGhpcy5maXJlZCkge1xuICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pO1xuICAgIHRoaXMuZmlyZWQgPSB0cnVlO1xuICAgIFJlZmxlY3RBcHBseSh0aGlzLmxpc3RlbmVyLCB0aGlzLnRhcmdldCwgYXJncyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX29uY2VXcmFwKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIHN0YXRlID0geyBmaXJlZDogZmFsc2UsIHdyYXBGbjogdW5kZWZpbmVkLCB0YXJnZXQ6IHRhcmdldCwgdHlwZTogdHlwZSwgbGlzdGVuZXI6IGxpc3RlbmVyIH07XG4gIHZhciB3cmFwcGVkID0gb25jZVdyYXBwZXIuYmluZChzdGF0ZSk7XG4gIHdyYXBwZWQubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgc3RhdGUud3JhcEZuID0gd3JhcHBlZDtcbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpO1xuICB9XG4gIHRoaXMub24odHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBsaXN0ID0gZXZlbnRzW3R5cGVdO1xuICAgICAgaWYgKGxpc3QgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcG9zaXRpb24gPSAtMTtcblxuICAgICAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8IGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICBldmVudHNbdHlwZV0gPSBsaXN0WzBdO1xuXG4gICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgb3JpZ2luYWxMaXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzLCBldmVudHMsIGk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c1t0eXBlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhldmVudHMpO1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gICAgICB9IGVsc2UgaWYgKGxpc3RlbmVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIExJRk8gb3JkZXJcbiAgICAgICAgZm9yIChpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbmZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHtcbiAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG4gIGlmIChldmxpc3RlbmVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIHVud3JhcCA/XG4gICAgdW53cmFwTGlzdGVuZXJzKGV2bGlzdGVuZXIpIDogYXJyYXlDbG9uZShldmxpc3RlbmVyLCBldmxpc3RlbmVyLmxlbmd0aCk7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgdHJ1ZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIubGlzdGVuZXJDb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyQ291bnQuY2FsbChlbWl0dGVyLCB0eXBlKTtcbiAgfVxufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gbGlzdGVuZXJDb3VudDtcbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2UgaWYgKGV2bGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdO1xufTtcblxuZnVuY3Rpb24gYXJyYXlDbG9uZShhcnIsIG4pIHtcbiAgdmFyIGNvcHkgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKVxuICAgIGNvcHlbaV0gPSBhcnJbaV07XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHtcbiAgZm9yICg7IGluZGV4ICsgMSA8IGxpc3QubGVuZ3RoOyBpbmRleCsrKVxuICAgIGxpc3RbaW5kZXhdID0gbGlzdFtpbmRleCArIDFdO1xuICBsaXN0LnBvcCgpO1xufVxuXG5mdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7XG4gICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIEEgYml0IHNpbXBsZXIgdGhhbiByZWFkYWJsZSBzdHJlYW1zLlxuLy8gSW1wbGVtZW50IGFuIGFzeW5jIC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYiksIGFuZCBpdCdsbCBoYW5kbGUgYWxsXG4vLyB0aGUgZHJhaW4gZXZlbnQgZW1pc3Npb24gYW5kIGJ1ZmZlcmluZy5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgcG5hID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdyaXRhYmxlO1xuXG4vKiA8cmVwbGFjZW1lbnQ+ICovXG5mdW5jdGlvbiBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB0aGlzLmNhbGxiYWNrID0gY2I7XG4gIHRoaXMubmV4dCA9IG51bGw7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG4gIHRoaXMuZmluaXNoID0gZnVuY3Rpb24gKCkge1xuICAgIG9uQ29ya2VkRmluaXNoKF90aGlzLCBzdGF0ZSk7XG4gIH07XG59XG4vKiA8L3JlcGxhY2VtZW50PiAqL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGFzeW5jV3JpdGUgPSAhcHJvY2Vzcy5icm93c2VyICYmIFsndjAuMTAnLCAndjAuOS4nXS5pbmRleE9mKHByb2Nlc3MudmVyc2lvbi5zbGljZSgwLCA1KSkgPiAtMSA/IHNldEltbWVkaWF0ZSA6IHBuYS5uZXh0VGljaztcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIER1cGxleDtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBPdXJVaW50OEFycmF5ID0gZ2xvYmFsLlVpbnQ4QXJyYXkgfHwgZnVuY3Rpb24gKCkge307XG5mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuayk7XG59XG5mdW5jdGlvbiBfaXNVaW50OEFycmF5KG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheTtcbn1cblxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0uXG4gIC8vIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgcmVhZGFibGVYWFggYW5kIHdyaXRhYmxlWFhYLlxuICB2YXIgaXNEdXBsZXggPSBzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXg7XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIHdyaXRhYmxlSHdtID0gb3B0aW9ucy53cml0YWJsZUhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG5cbiAgaWYgKGh3bSB8fCBod20gPT09IDApIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bTtlbHNlIGlmIChpc0R1cGxleCAmJiAod3JpdGFibGVId20gfHwgd3JpdGFibGVId20gPT09IDApKSB0aGlzLmhpZ2hXYXRlck1hcmsgPSB3cml0YWJsZUh3bTtlbHNlIHRoaXMuaGlnaFdhdGVyTWFyayA9IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBNYXRoLmZsb29yKHRoaXMuaGlnaFdhdGVyTWFyayk7XG5cbiAgLy8gaWYgX2ZpbmFsIGhhcyBiZWVuIGNhbGxlZFxuICB0aGlzLmZpbmFsQ2FsbGVkID0gZmFsc2U7XG5cbiAgLy8gZHJhaW4gZXZlbnQgZmxhZy5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gaGFzIGl0IGJlZW4gZGVzdHJveWVkXG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gdHJ1ZSBhbGwgd3JpdGVzIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgLnVuY29yaygpIGNhbGxcbiAgdGhpcy5jb3JrZWQgPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24gKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcblxuICAvLyBudW1iZXIgb2YgcGVuZGluZyB1c2VyLXN1cHBsaWVkIHdyaXRlIGNhbGxiYWNrc1xuICAvLyB0aGlzIG11c3QgYmUgMCBiZWZvcmUgJ2ZpbmlzaCcgY2FuIGJlIGVtaXR0ZWRcbiAgdGhpcy5wZW5kaW5nY2IgPSAwO1xuXG4gIC8vIGVtaXQgcHJlZmluaXNoIGlmIHRoZSBvbmx5IHRoaW5nIHdlJ3JlIHdhaXRpbmcgZm9yIGlzIF93cml0ZSBjYnNcbiAgLy8gVGhpcyBpcyByZWxldmFudCBmb3Igc3luY2hyb25vdXMgVHJhbnNmb3JtIHN0cmVhbXNcbiAgdGhpcy5wcmVmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG5cbiAgLy8gY291bnQgYnVmZmVyZWQgcmVxdWVzdHNcbiAgdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG5cbiAgLy8gYWxsb2NhdGUgdGhlIGZpcnN0IENvcmtlZFJlcXVlc3QsIHRoZXJlIGlzIGFsd2F5c1xuICAvLyBvbmUgYWxsb2NhdGVkIGFuZCBmcmVlIHRvIHVzZSwgYW5kIHdlIG1haW50YWluIGF0IG1vc3QgdHdvXG4gIHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3QodGhpcyk7XG59XG5cbldyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uIGdldEJ1ZmZlcigpIHtcbiAgdmFyIGN1cnJlbnQgPSB0aGlzLmJ1ZmZlcmVkUmVxdWVzdDtcbiAgdmFyIG91dCA9IFtdO1xuICB3aGlsZSAoY3VycmVudCkge1xuICAgIG91dC5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn07XG5cbihmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLCAnYnVmZmVyJywge1xuICAgICAgZ2V0OiBpbnRlcm5hbFV0aWwuZGVwcmVjYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCk7XG4gICAgICB9LCAnX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgJyArICdpbnN0ZWFkLicsICdERVAwMDAzJylcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge31cbn0pKCk7XG5cbi8vIFRlc3QgX3dyaXRhYmxlU3RhdGUgZm9yIGluaGVyaXRhbmNlIHRvIGFjY291bnQgZm9yIER1cGxleCBzdHJlYW1zLFxuLy8gd2hvc2UgcHJvdG90eXBlIGNoYWluIG9ubHkgcG9pbnRzIHRvIFJlYWRhYmxlLlxudmFyIHJlYWxIYXNJbnN0YW5jZTtcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5oYXNJbnN0YW5jZSAmJiB0eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgcmVhbEhhc0luc3RhbmNlID0gRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZSwgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgIGlmIChyZWFsSGFzSW5zdGFuY2UuY2FsbCh0aGlzLCBvYmplY3QpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh0aGlzICE9PSBXcml0YWJsZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIFdyaXRhYmxlU3RhdGU7XG4gICAgfVxuICB9KTtcbn0gZWxzZSB7XG4gIHJlYWxIYXNJbnN0YW5jZSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIC8vIFdyaXRhYmxlIGN0b3IgaXMgYXBwbGllZCB0byBEdXBsZXhlcywgdG9vLlxuICAvLyBgcmVhbEhhc0luc3RhbmNlYCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB1c2luZyBwbGFpbiBgaW5zdGFuY2VvZmBcbiAgLy8gd291bGQgcmV0dXJuIGZhbHNlLCBhcyBubyBgX3dyaXRhYmxlU3RhdGVgIHByb3BlcnR5IGlzIGF0dGFjaGVkLlxuXG4gIC8vIFRyeWluZyB0byB1c2UgdGhlIGN1c3RvbSBgaW5zdGFuY2VvZmAgZm9yIFdyaXRhYmxlIGhlcmUgd2lsbCBhbHNvIGJyZWFrIHRoZVxuICAvLyBOb2RlLmpzIExhenlUcmFuc2Zvcm0gaW1wbGVtZW50YXRpb24sIHdoaWNoIGhhcyBhIG5vbi10cml2aWFsIGdldHRlciBmb3JcbiAgLy8gYF93cml0YWJsZVN0YXRlYCB0aGF0IHdvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICBpZiAoIXJlYWxIYXNJbnN0YW5jZS5jYWxsKFdyaXRhYmxlLCB0aGlzKSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSB7XG4gICAgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcbiAgfVxuXG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBuZXcgV3JpdGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3kuXG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRlID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZSA9IG9wdGlvbnMud3JpdGU7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGV2ID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZXYgPSBvcHRpb25zLndyaXRldjtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbmFsID09PSAnZnVuY3Rpb24nKSB0aGlzLl9maW5hbCA9IG9wdGlvbnMuZmluYWw7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnKSk7XG59O1xuXG5mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSwgY2IpIHtcbiAgdmFyIGVyID0gbmV3IEVycm9yKCd3cml0ZSBhZnRlciBlbmQnKTtcbiAgLy8gVE9ETzogZGVmZXIgZXJyb3IgZXZlbnRzIGNvbnNpc3RlbnRseSBldmVyeXdoZXJlLCBub3QganVzdCB0aGUgY2JcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICBwbmEubmV4dFRpY2soY2IsIGVyKTtcbn1cblxuLy8gQ2hlY2tzIHRoYXQgYSB1c2VyLXN1cHBsaWVkIGNodW5rIGlzIHZhbGlkLCBlc3BlY2lhbGx5IGZvciB0aGUgcGFydGljdWxhclxuLy8gbW9kZSB0aGUgc3RyZWFtIGlzIGluLiBDdXJyZW50bHkgdGhpcyBtZWFucyB0aGF0IGBudWxsYCBpcyBuZXZlciBhY2NlcHRlZFxuLy8gYW5kIHVuZGVmaW5lZC9ub24tc3RyaW5nIHZhbHVlcyBhcmUgb25seSBhbGxvd2VkIGluIG9iamVjdCBtb2RlLlxuZnVuY3Rpb24gdmFsaWRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgY2IpIHtcbiAgdmFyIHZhbGlkID0gdHJ1ZTtcbiAgdmFyIGVyID0gZmFsc2U7XG5cbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbScpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICBwbmEubmV4dFRpY2soY2IsIGVyKTtcbiAgICB2YWxpZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiB2YWxpZDtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuICB2YXIgaXNCdWYgPSAhc3RhdGUub2JqZWN0TW9kZSAmJiBfaXNVaW50OEFycmF5KGNodW5rKTtcblxuICBpZiAoaXNCdWYgJiYgIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICBjaHVuayA9IF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGlzQnVmKSBlbmNvZGluZyA9ICdidWZmZXInO2Vsc2UgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG5cbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3A7XG5cbiAgaWYgKHN0YXRlLmVuZGVkKSB3cml0ZUFmdGVyRW5kKHRoaXMsIGNiKTtlbHNlIGlmIChpc0J1ZiB8fCB2YWxpZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgY2IpKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgcmV0ID0gd3JpdGVPckJ1ZmZlcih0aGlzLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG5cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgLy8gbm9kZTo6UGFyc2VFbmNvZGluZygpIHJlcXVpcmVzIGxvd2VyIGNhc2UuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghKFsnaGV4JywgJ3V0ZjgnLCAndXRmLTgnLCAnYXNjaWknLCAnYmluYXJ5JywgJ2Jhc2U2NCcsICd1Y3MyJywgJ3Vjcy0yJywgJ3V0ZjE2bGUnLCAndXRmLTE2bGUnLCAncmF3J10uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZykge1xuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgc3RhdGUuZGVjb2RlU3RyaW5ncyAhPT0gZmFsc2UgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgfVxuICByZXR1cm4gY2h1bms7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBpc0J1ZiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBpZiAoIWlzQnVmKSB7XG4gICAgdmFyIG5ld0NodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG4gICAgaWYgKGNodW5rICE9PSBuZXdDaHVuaykge1xuICAgICAgaXNCdWYgPSB0cnVlO1xuICAgICAgZW5jb2RpbmcgPSAnYnVmZmVyJztcbiAgICAgIGNodW5rID0gbmV3Q2h1bms7XG4gICAgfVxuICB9XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG5cbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKSB7XG4gICAgdmFyIGxhc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSB7XG4gICAgICBjaHVuazogY2h1bmssXG4gICAgICBlbmNvZGluZzogZW5jb2RpbmcsXG4gICAgICBpc0J1ZjogaXNCdWYsXG4gICAgICBjYWxsYmFjazogY2IsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcbiAgICBpZiAobGFzdCkge1xuICAgICAgbGFzdC5uZXh0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgKz0gMTtcbiAgfSBlbHNlIHtcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlbjtcbiAgc3RhdGUud3JpdGVjYiA9IGNiO1xuICBzdGF0ZS53cml0aW5nID0gdHJ1ZTtcbiAgc3RhdGUuc3luYyA9IHRydWU7XG4gIGlmICh3cml0ZXYpIHN0cmVhbS5fd3JpdGV2KGNodW5rLCBzdGF0ZS5vbndyaXRlKTtlbHNlIHN0cmVhbS5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBzdGF0ZS5vbndyaXRlKTtcbiAgc3RhdGUuc3luYyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKSB7XG4gIC0tc3RhdGUucGVuZGluZ2NiO1xuXG4gIGlmIChzeW5jKSB7XG4gICAgLy8gZGVmZXIgdGhlIGNhbGxiYWNrIGlmIHdlIGFyZSBiZWluZyBjYWxsZWQgc3luY2hyb25vdXNseVxuICAgIC8vIHRvIGF2b2lkIHBpbGluZyB1cCB0aGluZ3Mgb24gdGhlIHN0YWNrXG4gICAgcG5hLm5leHRUaWNrKGNiLCBlcik7XG4gICAgLy8gdGhpcyBjYW4gZW1pdCBmaW5pc2gsIGFuZCBpdCB3aWxsIGFsd2F5cyBoYXBwZW5cbiAgICAvLyBhZnRlciBlcnJvclxuICAgIHBuYS5uZXh0VGljayhmaW5pc2hNYXliZSwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9IGVsc2Uge1xuICAgIC8vIHRoZSBjYWxsZXIgZXhwZWN0IHRoaXMgdG8gaGFwcGVuIGJlZm9yZSBpZlxuICAgIC8vIGl0IGlzIGFzeW5jXG4gICAgY2IoZXIpO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICAvLyB0aGlzIGNhbiBlbWl0IGZpbmlzaCwgYnV0IGZpbmlzaCBtdXN0XG4gICAgLy8gYWx3YXlzIGZvbGxvdyBlcnJvclxuICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuXG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG5cbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8qPHJlcGxhY2VtZW50PiovXG4gICAgICBhc3luY1dyaXRlKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICAvKjwvcmVwbGFjZW1lbnQ+Ki9cbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYikge1xuICBpZiAoIWZpbmlzaGVkKSBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSk7XG4gIHN0YXRlLnBlbmRpbmdjYi0tO1xuICBjYigpO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuLy8gTXVzdCBmb3JjZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gbmV4dFRpY2ssIHNvIHRoYXQgd2UgZG9uJ3Rcbi8vIGVtaXQgJ2RyYWluJyBiZWZvcmUgdGhlIHdyaXRlKCkgY29uc3VtZXIgZ2V0cyB0aGUgJ2ZhbHNlJyByZXR1cm5cbi8vIHZhbHVlLCBhbmQgaGFzIGEgY2hhbmNlIHRvIGF0dGFjaCBhICdkcmFpbicgbGlzdGVuZXIuXG5mdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpO1xuICB9XG59XG5cbi8vIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGluIHRoZSBidWZmZXIgd2FpdGluZywgdGhlbiBwcm9jZXNzIGl0XG5mdW5jdGlvbiBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKSB7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSB0cnVlO1xuICB2YXIgZW50cnkgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3Q7XG5cbiAgaWYgKHN0cmVhbS5fd3JpdGV2ICYmIGVudHJ5ICYmIGVudHJ5Lm5leHQpIHtcbiAgICAvLyBGYXN0IGNhc2UsIHdyaXRlIGV2ZXJ5dGhpbmcgdXNpbmcgX3dyaXRldigpXG4gICAgdmFyIGwgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudDtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KGwpO1xuICAgIHZhciBob2xkZXIgPSBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7XG4gICAgaG9sZGVyLmVudHJ5ID0gZW50cnk7XG5cbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHZhciBhbGxCdWZmZXJzID0gdHJ1ZTtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGlmICghZW50cnkuaXNCdWYpIGFsbEJ1ZmZlcnMgPSBmYWxzZTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGJ1ZmZlci5hbGxCdWZmZXJzID0gYWxsQnVmZmVycztcblxuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgdHJ1ZSwgc3RhdGUubGVuZ3RoLCBidWZmZXIsICcnLCBob2xkZXIuZmluaXNoKTtcblxuICAgIC8vIGRvV3JpdGUgaXMgYWxtb3N0IGFsd2F5cyBhc3luYywgZGVmZXIgdGhlc2UgdG8gc2F2ZSBhIGJpdCBvZiB0aW1lXG4gICAgLy8gYXMgdGhlIGhvdCBwYXRoIGVuZHMgd2l0aCBkb1dyaXRlXG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gICAgaWYgKGhvbGRlci5uZXh0KSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBob2xkZXIubmV4dDtcbiAgICAgIGhvbGRlci5uZXh0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3Qoc3RhdGUpO1xuICAgIH1cbiAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gU2xvdyBjYXNlLCB3cml0ZSBjaHVua3Mgb25lLWJ5LW9uZVxuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBlbnRyeS5lbmNvZGluZztcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gICAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQtLTtcbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBjYWxsIHRoZSBvbndyaXRlIGltbWVkaWF0ZWx5LCB0aGVuXG4gICAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgICAgLy8gYWxzbywgdGhhdCBtZWFucyB0aGF0IHRoZSBjaHVuayBhbmQgY2IgYXJlIGN1cnJlbnRseVxuICAgICAgLy8gYmVpbmcgcHJvY2Vzc2VkLCBzbyBtb3ZlIHRoZSBidWZmZXIgY291bnRlciBwYXN0IHRoZW0uXG4gICAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkgPT09IG51bGwpIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB9XG5cbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignX3dyaXRlKCkgaXMgbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcblxuICAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9XG5cbiAgLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuICBpZiAoIXN0YXRlLmVuZGluZyAmJiAhc3RhdGUuZmluaXNoZWQpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5mdW5jdGlvbiBjYWxsRmluYWwoc3RyZWFtLCBzdGF0ZSkge1xuICBzdHJlYW0uX2ZpbmFsKGZ1bmN0aW9uIChlcnIpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH1cbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQgJiYgIXN0YXRlLmZpbmFsQ2FsbGVkKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJlYW0uX2ZpbmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICAgIHN0YXRlLmZpbmFsQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIHBuYS5uZXh0VGljayhjYWxsRmluYWwsIHN0cmVhbSwgc3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgaWYgKHN0YXRlLnBlbmRpbmdjYiA9PT0gMCkge1xuICAgICAgc3RhdGUuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZCkgcG5hLm5leHRUaWNrKGNiKTtlbHNlIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb25Db3JrZWRGaW5pc2goY29ya1JlcSwgc3RhdGUsIGVycikge1xuICB2YXIgZW50cnkgPSBjb3JrUmVxLmVudHJ5O1xuICBjb3JrUmVxLmVudHJ5ID0gbnVsbDtcbiAgd2hpbGUgKGVudHJ5KSB7XG4gICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgY2IoZXJyKTtcbiAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gIH1cbiAgaWYgKHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSkge1xuICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gY29ya1JlcTtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBjb3JrUmVxO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveTtcbldyaXRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95O1xuV3JpdGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5lbmQoKTtcbiAgY2IoZXJyKTtcbn07IiwiLyoqXG4gKiBAdHlwZSB7U2V0PHN0cmluZz59XG4gKi9cbmNvbnN0IGNhblJlcGxheVByb3RvY29scyA9IG5ldyBTZXQoW1xuICAnSFRUUC8wLjknLFxuICAnSFRUUC8xLjAnLFxuICAnSFRUUC8xLjEnLFxuICAnREFUQScsXG4gICdkYXRhJ1xuXSlcblxuLyoqXG4gKiBAdHlwZSB7e2NhblJlcGxheVByb3RvY29sczogU2V0PHN0cmluZz4sIFNQQUNFOiBzdHJpbmcsIEgyTWV0aG9kOiBzdHJpbmcsIEhUVFAxRDE6IHN0cmluZywgREFTSDogc3RyaW5nLCBIMnBhdGg6IHN0cmluZ319XG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjYW5SZXBsYXlQcm90b2NvbHMsXG4gIFNQQUNFOiAnICcsXG4gIEgyTWV0aG9kOiAnOm1ldGhvZCcsXG4gIEgycGF0aDogJzpwYXRoJyxcbiAgSFRUUDFEMTogJ0hUVFAvMS4xJyxcbiAgREFTSDogJy0nXG59XG4iLCIndXNlIHN0cmljdCdcblxuLyoqXG4gKiBAZGVzYyBCdWZmZXJzIGZyb20gaGV4IHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSBhIFdBUkMgcmVjb3JkcyBXQVJDLVRZUEUgb3IgcmVjb3JkL3JlY29yZC1zZWN0aW9uIHNlcGFyYXRvclxuICogYXMgc2VlbiBieSB0aGUgcGFyc2VyLiBEdWUgdG8gdGhlIGxhcmdlIHNpemUgb2YgV0FSQyBmaWxlcyBhbmQgdGhlIGJpbmFyeSBkYXRhIGNvbnRhaW5lZCB3aXRoaW4gaXQgaXMgbW9yZSBlZmZpY2llbnRcbiAqIHRvIHBhcnNlIHRoZSBmaWxlcyBjb250ZW50cyBsb29raW5nIGZvciB0aGVzZSBzZW50aW5lbHMgdGhhbiBjb252ZXJ0aW5nIHRoZSBidWZmZXIgdG8gYW4gVVRGLTggc3RyaW5nIGZpcnN0XG4gKiBAdHlwZSB7e2JlZ2luOiBCdWZmZXIsIGluZm86IEJ1ZmZlciwgbWRhdGE6IEJ1ZmZlciwgcmVxOiBCdWZmZXIsIHJlczogQnVmZmVyLCByZXZpc2l0OiBCdWZmZXIsIHJlc291cmNlOiBCdWZmZXIsIGNybGY6IEJ1ZmZlciwgZW1wdHk6IEJ1ZmZlcn19XG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvKipcbiAgICogQHR5cGUge0J1ZmZlcn1cbiAgICovXG4gIGJlZ2luOiBCdWZmZXIuZnJvbSgnNTc0MTUyNDMyZicsICdoZXgnKSxcblxuICAvKipcbiAgICogQHR5cGUge0J1ZmZlcn1cbiAgICovXG4gIGluZm86IEJ1ZmZlci5mcm9tKCc1NzQxNTI0MzJkNTQ3OTcwNjUzYTIwNzc2MTcyNjM2OTZlNjY2ZicsICdoZXgnKSxcblxuICAvKipcbiAgICogQHR5cGUge0J1ZmZlcn1cbiAgICovXG4gIG1kYXRhOiBCdWZmZXIuZnJvbSgnNTc0MTUyNDMyZDU0Nzk3MDY1M2EyMDZkNjU3NDYxNjQ2MTc0NjEnLCAnaGV4JyksXG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCdWZmZXJ9XG4gICAqL1xuICByZXE6IEJ1ZmZlci5mcm9tKCc1NzQxNTI0MzJkNTQ3OTcwNjUzYTIwNzI2NTcxNzU2NTczNzQnLCAnaGV4JyksXG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCdWZmZXJ9XG4gICAqL1xuICByZXM6IEJ1ZmZlci5mcm9tKCc1NzQxNTI0MzJkNTQ3OTcwNjUzYTIwNzI2NTczNzA2ZjZlNzM2NScsICdoZXgnKSxcblxuICAvKipcbiAgICogQHR5cGUge0J1ZmZlcn1cbiAgICovXG4gIHJldmlzaXQ6IEJ1ZmZlci5mcm9tKCc1NzQxNTI0MzJkNTQ3OTcwNjUzYTIwNzI2NTc2Njk3MzY5NzQnLCAnaGV4JyksXG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCdWZmZXJ9XG4gICAqL1xuICByZXNvdXJjZTogQnVmZmVyLmZyb20oJzU3NDE1MjQzMmQ1NDc5NzA2NTNhMjA3MjY1NzM2Zjc1NzI2MzY1JywgJ2hleCcpLFxuXG4gIC8qKlxuICAgKiBAdHlwZSB7QnVmZmVyfVxuICAgKi9cbiAgY3JsZjogQnVmZmVyLmZyb20oJzBkMGEnLCAnaGV4JyksXG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCdWZmZXJ9XG4gICAqL1xuICBlbXB0eTogQnVmZmVyLmZyb20oJzBkJywgJ2hleCcpXG59XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0aWYgKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XG5cdFx0bW9kdWxlLnBhdGhzID0gW107XG5cdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XG5cdFx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwibG9hZGVkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJpZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xuXHR9XG5cdHJldHVybiBtb2R1bGU7XG59O1xuIiwidmFyIENsaWVudFJlcXVlc3QgPSByZXF1aXJlKCcuL2xpYi9yZXF1ZXN0JylcbnZhciByZXNwb25zZSA9IHJlcXVpcmUoJy4vbGliL3Jlc3BvbnNlJylcbnZhciBleHRlbmQgPSByZXF1aXJlKCd4dGVuZCcpXG52YXIgc3RhdHVzQ29kZXMgPSByZXF1aXJlKCdidWlsdGluLXN0YXR1cy1jb2RlcycpXG52YXIgdXJsID0gcmVxdWlyZSgndXJsJylcblxudmFyIGh0dHAgPSBleHBvcnRzXG5cbmh0dHAucmVxdWVzdCA9IGZ1bmN0aW9uIChvcHRzLCBjYikge1xuXHRpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKVxuXHRcdG9wdHMgPSB1cmwucGFyc2Uob3B0cylcblx0ZWxzZVxuXHRcdG9wdHMgPSBleHRlbmQob3B0cylcblxuXHQvLyBOb3JtYWxseSwgdGhlIHBhZ2UgaXMgbG9hZGVkIGZyb20gaHR0cCBvciBodHRwcywgc28gbm90IHNwZWNpZnlpbmcgYSBwcm90b2NvbFxuXHQvLyB3aWxsIHJlc3VsdCBpbiBhICh2YWxpZCkgcHJvdG9jb2wtcmVsYXRpdmUgdXJsLiBIb3dldmVyLCB0aGlzIHdvbid0IHdvcmsgaWZcblx0Ly8gdGhlIHByb3RvY29sIGlzIHNvbWV0aGluZyBlbHNlLCBsaWtlICdmaWxlOidcblx0dmFyIGRlZmF1bHRQcm90b2NvbCA9IGdsb2JhbC5sb2NhdGlvbi5wcm90b2NvbC5zZWFyY2goL15odHRwcz86JC8pID09PSAtMSA/ICdodHRwOicgOiAnJ1xuXG5cdHZhciBwcm90b2NvbCA9IG9wdHMucHJvdG9jb2wgfHwgZGVmYXVsdFByb3RvY29sXG5cdHZhciBob3N0ID0gb3B0cy5ob3N0bmFtZSB8fCBvcHRzLmhvc3Rcblx0dmFyIHBvcnQgPSBvcHRzLnBvcnRcblx0dmFyIHBhdGggPSBvcHRzLnBhdGggfHwgJy8nXG5cblx0Ly8gTmVjZXNzYXJ5IGZvciBJUHY2IGFkZHJlc3Nlc1xuXHRpZiAoaG9zdCAmJiBob3N0LmluZGV4T2YoJzonKSAhPT0gLTEpXG5cdFx0aG9zdCA9ICdbJyArIGhvc3QgKyAnXSdcblxuXHQvLyBUaGlzIG1heSBiZSBhIHJlbGF0aXZlIHVybC4gVGhlIGJyb3dzZXIgc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIGludGVycHJldCBpdCBjb3JyZWN0bHkuXG5cdG9wdHMudXJsID0gKGhvc3QgPyAocHJvdG9jb2wgKyAnLy8nICsgaG9zdCkgOiAnJykgKyAocG9ydCA/ICc6JyArIHBvcnQgOiAnJykgKyBwYXRoXG5cdG9wdHMubWV0aG9kID0gKG9wdHMubWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpXG5cdG9wdHMuaGVhZGVycyA9IG9wdHMuaGVhZGVycyB8fCB7fVxuXG5cdC8vIEFsc28gdmFsaWQgb3B0cy5hdXRoLCBvcHRzLm1vZGVcblxuXHR2YXIgcmVxID0gbmV3IENsaWVudFJlcXVlc3Qob3B0cylcblx0aWYgKGNiKVxuXHRcdHJlcS5vbigncmVzcG9uc2UnLCBjYilcblx0cmV0dXJuIHJlcVxufVxuXG5odHRwLmdldCA9IGZ1bmN0aW9uIGdldCAob3B0cywgY2IpIHtcblx0dmFyIHJlcSA9IGh0dHAucmVxdWVzdChvcHRzLCBjYilcblx0cmVxLmVuZCgpXG5cdHJldHVybiByZXFcbn1cblxuaHR0cC5DbGllbnRSZXF1ZXN0ID0gQ2xpZW50UmVxdWVzdFxuaHR0cC5JbmNvbWluZ01lc3NhZ2UgPSByZXNwb25zZS5JbmNvbWluZ01lc3NhZ2VcblxuaHR0cC5BZ2VudCA9IGZ1bmN0aW9uICgpIHt9XG5odHRwLkFnZW50LmRlZmF1bHRNYXhTb2NrZXRzID0gNFxuXG5odHRwLmdsb2JhbEFnZW50ID0gbmV3IGh0dHAuQWdlbnQoKVxuXG5odHRwLlNUQVRVU19DT0RFUyA9IHN0YXR1c0NvZGVzXG5cbmh0dHAuTUVUSE9EUyA9IFtcblx0J0NIRUNLT1VUJyxcblx0J0NPTk5FQ1QnLFxuXHQnQ09QWScsXG5cdCdERUxFVEUnLFxuXHQnR0VUJyxcblx0J0hFQUQnLFxuXHQnTE9DSycsXG5cdCdNLVNFQVJDSCcsXG5cdCdNRVJHRScsXG5cdCdNS0FDVElWSVRZJyxcblx0J01LQ09MJyxcblx0J01PVkUnLFxuXHQnTk9USUZZJyxcblx0J09QVElPTlMnLFxuXHQnUEFUQ0gnLFxuXHQnUE9TVCcsXG5cdCdQUk9QRklORCcsXG5cdCdQUk9QUEFUQ0gnLFxuXHQnUFVSR0UnLFxuXHQnUFVUJyxcblx0J1JFUE9SVCcsXG5cdCdTRUFSQ0gnLFxuXHQnU1VCU0NSSUJFJyxcblx0J1RSQUNFJyxcblx0J1VOTE9DSycsXG5cdCdVTlNVQlNDUklCRSdcbl0iLCJjb25zdCBzdGFydENhc2UgPSByZXF1aXJlKCdsb2Rhc2gvc3RhcnRDYXNlJylcbmNvbnN0IHsgREFTSCB9ID0gcmVxdWlyZSgnLi4vdXRpbHMvY29uc3RhbnRzJylcbmNvbnN0IHsgQ1JMRiB9ID0gcmVxdWlyZSgnLi4vd3JpdGVycy93YXJjRmllbGRzJylcblxuLyoqXG4gKiBAdHlwZSB7UmVnRXhwfVxuICovXG5jb25zdCBTUEFDRVJlID0gL1xccy9nXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlcktleVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlbnN1cmVIVFRQMkhlYWRlcnMgKGhlYWRlcktleSkge1xuICBpZiAoaGVhZGVyS2V5WzBdID09PSAnOicpIHJldHVybiBoZWFkZXJLZXlcbiAgcmV0dXJuIHN0YXJ0Q2FzZShoZWFkZXJLZXkpLnJlcGxhY2UoU1BBQ0VSZSwgREFTSClcbn1cblxuLyoqXG4gKiBAZGVzYyBDb252ZXJ0cyBhbiBIVFRQIGhlYWRlcnMgb2JqZWN0IGludG8gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvblxuICogQHBhcmFtIHtPYmplY3R9IGhlYWRlcnMgLSBUaGUgSFRUUCBoZWFkZXIgb2JqZWN0IHRvIGJlIHN0cmluZ2lmaWVkXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnRzLnN0cmluZ2lmeUhlYWRlcnMgPSBmdW5jdGlvbiBzdHJpbmdpZnlIZWFkZXJzIChoZWFkZXJzKSB7XG4gIGxldCBoZWFkZXJLZXlcbiAgbGV0IG91dFN0cmluZyA9IFtdXG4gIGZvciAoaGVhZGVyS2V5IGluIGhlYWRlcnMpIHtcbiAgICBvdXRTdHJpbmcucHVzaChgJHtlbnN1cmVIVFRQMkhlYWRlcnMoaGVhZGVyS2V5KX06ICR7aGVhZGVyc1toZWFkZXJLZXldfSR7Q1JMRn1gKVxuICB9XG4gIC8vIGpvaW4gdXNlZCB0byBmaXggbWVtb3J5IGlzc3VlIGNhdXNlZCBieSBjb25jYXRlbmF0aW9uOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMTc1I2M0XG4gIC8vIGFmZmVjdHMgbm9kZVxuICByZXR1cm4gb3V0U3RyaW5nLmpvaW4oJycpXG59XG5cbi8qKlxuICogQGRlc2MgQ29udmVydHMgYW4gSFRUUCByZXF1ZXN0IGhlYWRlcnMgb2JqZWN0IGludG8gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvblxuICogQHBhcmFtIHtPYmplY3R9IGhlYWRlcnMgLSBUaGUgSFRUUCBoZWFkZXJzIG9iamVjdCBmb3IgdGhlIHJlcXVlc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBob3N0IC0gVGhlIGhvc3QgZm9yIHRoZSByZXF1ZXN0IHRvIGJlIHVzZWQgaWYgdGhlIEhUVFAgaGVhZGVycyBvYmplY3QgZG9lcyBub3QgY29udGFpbiB0aGUgSG9zdCBmaWVsZFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0cy5zdHJpbmdpZnlSZXF1ZXN0SGVhZGVycyA9IGZ1bmN0aW9uIHN0cmluZ2lmeVJlcXVlc3RIZWFkZXJzIChoZWFkZXJzLCBob3N0KSB7XG4gIGxldCBoYXNIb3N0ID0gZmFsc2VcbiAgbGV0IGhlYWRlcktleVxuICBsZXQgb3V0U3RyaW5nID0gW11cbiAgZm9yIChoZWFkZXJLZXkgaW4gaGVhZGVycykge1xuICAgIGlmIChoZWFkZXJLZXkgPT09ICdob3N0JyB8fCBoZWFkZXJLZXkgPT09ICdIb3N0Jykge1xuICAgICAgaGFzSG9zdCA9IHRydWVcbiAgICB9XG4gICAgb3V0U3RyaW5nLnB1c2goYCR7ZW5zdXJlSFRUUDJIZWFkZXJzKGhlYWRlcktleSl9OiAke2hlYWRlcnNbaGVhZGVyS2V5XX0ke0NSTEZ9YClcbiAgfVxuICBpZiAoIWhhc0hvc3QpIHtcbiAgICBvdXRTdHJpbmcucHVzaChgSG9zdDogJHtob3N0fSR7Q1JMRn1gKVxuICB9XG4gIC8vIGpvaW4gdXNlZCB0byBmaXggbWVtb3J5IGlzc3VlIGNhdXNlZCBieSBjb25jYXRlbmF0aW9uOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMTc1I2M0XG4gIC8vIGFmZmVjdHMgbm9kZVxuICByZXR1cm4gb3V0U3RyaW5nLmpvaW4oJycpXG59XG4iLCJ2YXIgYmFzZVRvU3RyaW5nID0gcmVxdWlyZSgnLi9fYmFzZVRvU3RyaW5nJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b1N0cmluZyhudWxsKTtcbiAqIC8vID0+ICcnXG4gKlxuICogXy50b1N0cmluZygtMCk7XG4gKiAvLyA9PiAnLTAnXG4gKlxuICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICogLy8gPT4gJzEsMiwzJ1xuICovXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1N0cmluZztcbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuXG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGRlYnVnVXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBkZWJ1ZyA9IHZvaWQgMDtcbmlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7XG4gIGRlYnVnID0gZGVidWdVdGlsLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gKCkge307XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlckxpc3QgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvQnVmZmVyTGlzdCcpO1xudmFyIGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3knKTtcbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIga1Byb3h5RXZlbnRzID0gWydlcnJvcicsICdjbG9zZScsICdkZXN0cm95JywgJ3BhdXNlJywgJ3Jlc3VtZSddO1xuXG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKTtcblxuICAvLyBUaGlzIGlzIGEgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgYW55XG4gIC8vIHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIHRoaXMgY29kZSBuZWVkc1xuICAvLyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgTm9kZS5qcyB0aGF0IGRvIG5vdCBpbmNsdWRlXG4gIC8vIHRoZSBwcmVwZW5kTGlzdGVuZXIoKSBtZXRob2QuIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVtb3ZlIHRoaXMgaGFjay5cbiAgaWYgKCFlbWl0dGVyLl9ldmVudHMgfHwgIWVtaXR0ZXIuX2V2ZW50c1tldmVudF0pIGVtaXR0ZXIub24oZXZlbnQsIGZuKTtlbHNlIGlmIChpc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pKSBlbWl0dGVyLl9ldmVudHNbZXZlbnRdLnVuc2hpZnQoZm4pO2Vsc2UgZW1pdHRlci5fZXZlbnRzW2V2ZW50XSA9IFtmbiwgZW1pdHRlci5fZXZlbnRzW2V2ZW50XV07XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0uXG4gIC8vIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgcmVhZGFibGVYWFggYW5kIHdyaXRhYmxlWFhYLlxuICB2YXIgaXNEdXBsZXggPSBzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXg7XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciByZWFkYWJsZUh3bSA9IG9wdGlvbnMucmVhZGFibGVIaWdoV2F0ZXJNYXJrO1xuICB2YXIgZGVmYXVsdEh3bSA9IHRoaXMub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xuXG4gIGlmIChod20gfHwgaHdtID09PSAwKSB0aGlzLmhpZ2hXYXRlck1hcmsgPSBod207ZWxzZSBpZiAoaXNEdXBsZXggJiYgKHJlYWRhYmxlSHdtIHx8IHJlYWRhYmxlSHdtID09PSAwKSkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gcmVhZGFibGVId207ZWxzZSB0aGlzLmhpZ2hXYXRlck1hcmsgPSBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gTWF0aC5mbG9vcih0aGlzLmhpZ2hXYXRlck1hcmspO1xuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KClcbiAgdGhpcy5idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBldmVudCAncmVhZGFibGUnLydkYXRhJyBpcyBlbWl0dGVkXG4gIC8vIGltbWVkaWF0ZWx5LCBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlXG4gIC8vIGFueSBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCByZWFkIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAvLyBoYXMgaXQgYmVlbiBkZXN0cm95ZWRcbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyB0aGUgbnVtYmVyIG9mIHdyaXRlcnMgdGhhdCBhcmUgYXdhaXRpbmcgYSBkcmFpbiBldmVudCBpbiAucGlwZSgpc1xuICB0aGlzLmF3YWl0RHJhaW4gPSAwO1xuXG4gIC8vIGlmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWRcbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlO1xuXG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIGlmICghU3RyaW5nRGVjb2RlcikgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRpb25zLmRlc3Ryb3k7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ2Rlc3Ryb3llZCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gd2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgLy8gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldFxuICAgIGlmICghdGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTtcblxuUmVhZGFibGUucHJvdG90eXBlLmRlc3Ryb3kgPSBkZXN0cm95SW1wbC5kZXN0cm95O1xuUmVhZGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3kgPSBkZXN0cm95SW1wbC51bmRlc3Ryb3k7XG5SZWFkYWJsZS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICB0aGlzLnB1c2gobnVsbCk7XG4gIGNiKGVycik7XG59O1xuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHNraXBDaHVua0NoZWNrO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcbiAgICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgICBlbmNvZGluZyA9ICcnO1xuICAgICAgfVxuICAgICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBza2lwQ2h1bmtDaGVjayA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlLCBza2lwQ2h1bmtDaGVjayk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIG51bGwsIHRydWUsIGZhbHNlKTtcbn07XG5cbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQsIHNraXBDaHVua0NoZWNrKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGVyO1xuICAgIGlmICghc2tpcENodW5rQ2hlY2spIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gICAgaWYgKGVyKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmICFzdGF0ZS5vYmplY3RNb2RlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihjaHVuaykgIT09IEJ1ZmZlci5wcm90b3R5cGUpIHtcbiAgICAgICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFkZFRvRnJvbnQpIHtcbiAgICAgICAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKSk7ZWxzZSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZGVkKSB7XG4gICAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFlbmNvZGluZykge1xuICAgICAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG4gICAgICAgICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsubGVuZ3RoICE9PSAwKSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZmFsc2UpO2Vsc2UgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkTW9yZURhdGEoc3RhdGUpO1xufVxuXG5mdW5jdGlvbiBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgYWRkVG9Gcm9udCkge1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO2Vsc2Ugc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuXG4gICAgaWYgKHN0YXRlLm5lZWRSZWFkYWJsZSkgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gIH1cbiAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXI7XG4gIGlmICghX2lzVWludDhBcnJheShjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG4vLyBpZiBpdCdzIHBhc3QgdGhlIGhpZ2ggd2F0ZXIgbWFyaywgd2UgY2FuIHB1c2ggaW4gc29tZSBtb3JlLlxuLy8gQWxzbywgaWYgd2UgaGF2ZSBubyBkYXRhIHlldCwgd2UgY2FuIHN0YW5kIHNvbWVcbi8vIG1vcmUgYnl0ZXMuICBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGNhc2VzIHdoZXJlIGh3bT0wLFxuLy8gc3VjaCBhcyB0aGUgcmVwbC4gIEFsc28sIGlmIHRoZSBwdXNoKCkgdHJpZ2dlcmVkIGFcbi8vIHJlYWRhYmxlIGV2ZW50LCBhbmQgdGhlIHVzZXIgY2FsbGVkIHJlYWQobGFyZ2VOdW1iZXIpIHN1Y2ggdGhhdFxuLy8gbmVlZFJlYWRhYmxlIHdhcyBzZXQsIHRoZW4gd2Ugb3VnaHQgdG8gcHVzaCBtb3JlLCBzbyB0aGF0IGFub3RoZXJcbi8vICdyZWFkYWJsZScgZXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQuXG5mdW5jdGlvbiBuZWVkTW9yZURhdGEoc3RhdGUpIHtcbiAgcmV0dXJuICFzdGF0ZS5lbmRlZCAmJiAoc3RhdGUubmVlZFJlYWRhYmxlIHx8IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUubGVuZ3RoID09PSAwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID09PSBmYWxzZTtcbn07XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24gKGVuYykge1xuICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiA4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyIHRvIHByZXZlbnQgaW5jcmVhc2luZyBod20gZXhjZXNzaXZlbHkgaW5cbiAgICAvLyB0aW55IGFtb3VudHNcbiAgICBuLS07XG4gICAgbiB8PSBuID4+PiAxO1xuICAgIG4gfD0gbiA+Pj4gMjtcbiAgICBuIHw9IG4gPj4+IDQ7XG4gICAgbiB8PSBuID4+PiA4O1xuICAgIG4gfD0gbiA+Pj4gMTY7XG4gICAgbisrO1xuICB9XG4gIHJldHVybiBuO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKG4gPD0gMCB8fCBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIHJldHVybiAwO1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIDE7XG4gIGlmIChuICE9PSBuKSB7XG4gICAgLy8gT25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg7ZWxzZSByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSBjdXJyZW50IGh3bSwgdGhlbiByYWlzZSB0aGUgaHdtLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcbiAgaWYgKG4gPD0gc3RhdGUubGVuZ3RoKSByZXR1cm4gbjtcbiAgLy8gRG9uJ3QgaGF2ZSBlbm91Z2hcbiAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKTtcbiAgbiA9IHBhcnNlSW50KG4sIDEwKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIG5PcmlnID0gbjtcblxuICBpZiAobiAhPT0gMCkgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5uZWVkUmVhZGFibGUgJiYgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGRlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKTtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtlbHNlIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfSBlbHNlIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuICB9XG5cbiAgdmFyIHJldDtcbiAgaWYgKG4gPiAwKSByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7ZWxzZSByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxlbmd0aCAtPSBuO1xuICB9XG5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAgIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgICBpZiAoIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gICAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICAgIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7XG4gIH1cblxuICBpZiAocmV0ICE9PSBudWxsKSB0aGlzLmVtaXQoJ2RhdGEnLCByZXQpO1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIHBuYS5uZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcG5hLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ19yZWFkKCkgaXMgbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG5cbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcblxuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogdW5waXBlO1xuICBpZiAoc3RhdGUuZW5kRW1pdHRlZCkgcG5hLm5leHRUaWNrKGVuZEZuKTtlbHNlIHNyYy5vbmNlKCdlbmQnLCBlbmRGbik7XG5cbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSwgdW5waXBlSW5mbykge1xuICAgIGRlYnVnKCdvbnVucGlwZScpO1xuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBpZiAodW5waXBlSW5mbyAmJiB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHVucGlwZUluZm8uaGFzVW5waXBlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIHVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuXG4gIC8vIElmIHRoZSB1c2VyIHB1c2hlcyBtb3JlIGRhdGEgd2hpbGUgd2UncmUgd3JpdGluZyB0byBkZXN0IHRoZW4gd2UnbGwgZW5kIHVwXG4gIC8vIGluIG9uZGF0YSBhZ2Fpbi4gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIGluY3JlYXNlIGF3YWl0RHJhaW4gb25jZSBiZWNhdXNlXG4gIC8vIGRlc3Qgd2lsbCBvbmx5IGVtaXQgb25lICdkcmFpbicgZXZlbnQgZm9yIHRoZSBtdWx0aXBsZSB3cml0ZXMuXG4gIC8vID0+IEludHJvZHVjZSBhIGd1YXJkIG9uIGluY3JlYXNpbmcgYXdhaXREcmFpbi5cbiAgdmFyIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgc3JjLm9uKCdkYXRhJywgb25kYXRhKTtcbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgZGVidWcoJ29uZGF0YScpO1xuICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQgJiYgIWluY3JlYXNlZEF3YWl0RHJhaW4pIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICAvLyA9PiBDaGVjayB3aGV0aGVyIGBkZXN0YCBpcyBzdGlsbCBhIHBpcGluZyBkZXN0aW5hdGlvbi5cbiAgICAgIGlmICgoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJiBzdGF0ZS5waXBlcyA9PT0gZGVzdCB8fCBzdGF0ZS5waXBlc0NvdW50ID4gMSAmJiBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KSAhPT0gLTEpICYmICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgICAgaW5jcmVhc2VkQXdhaXREcmFpbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUVsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKSBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG5cbiAgLy8gTWFrZSBzdXJlIG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSB1c2VybGFuZCBvbmVzLlxuICBwcmVwZW5kTGlzdGVuZXIoZGVzdCwgJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJyk7XG4gICAgc3JjLnVucGlwZShkZXN0KTtcbiAgfVxuXG4gIC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG4gIGRlc3QuZW1pdCgncGlwZScsIHNyYyk7XG5cbiAgLy8gc3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGlwZSByZXN1bWUnKTtcbiAgICBzcmMucmVzdW1lKCk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbikgc3RhdGUuYXdhaXREcmFpbi0tO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluID09PSAwICYmIEVFbGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciB1bnBpcGVJbmZvID0geyBoYXNVbnBpcGVkOiBmYWxzZSB9O1xuXG4gIC8vIGlmIHdlJ3JlIG5vdCBwaXBpbmcgYW55d2hlcmUsIHRoZW4gZG8gbm90aGluZy5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDApIHJldHVybiB0aGlzO1xuXG4gIC8vIGp1c3Qgb25lIGRlc3RpbmF0aW9uLiAgbW9zdCBjb21tb24gY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHtcbiAgICAvLyBwYXNzZWQgaW4gb25lLCBidXQgaXQncyBub3QgdGhlIHJpZ2h0IG9uZS5cbiAgICBpZiAoZGVzdCAmJiBkZXN0ICE9PSBzdGF0ZS5waXBlcykgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoIWRlc3QpIGRlc3QgPSBzdGF0ZS5waXBlcztcblxuICAgIC8vIGdvdCBhIG1hdGNoLlxuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgaWYgKGRlc3QpIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RzW2ldLmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuICAgIH1yZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpbmRleCA9IGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAvLyBTdGFydCBmbG93aW5nIG9uIG5leHQgdGljayBpZiBzdHJlYW0gaXNuJ3QgZXhwbGljaXRseSBwYXVzZWRcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nICE9PSBmYWxzZSkgdGhpcy5yZXN1bWUoKTtcbiAgfSBlbHNlIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmICFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcG5hLm5leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuXG5mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpIHtcbiAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpO1xuICBzZWxmLnJlYWQoMCk7XG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHBuYS5uZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdGF0ZS5hd2FpdERyYWluID0gMDtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIHdoaWxlIChzdGF0ZS5mbG93aW5nICYmIHN0cmVhbS5yZWFkKCkgIT09IG51bGwpIHt9XG59XG5cbi8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBwYXVzZWQgPSBmYWxzZTtcblxuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSBfdGhpcy5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBfdGhpcy5wdXNoKG51bGwpO1xuICB9KTtcblxuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBkYXRhJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAvLyBkb24ndCBza2lwIG92ZXIgZmFsc3kgdmFsdWVzIGluIG9iamVjdE1vZGVcbiAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkpIHJldHVybjtlbHNlIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpKSByZXR1cm47XG5cbiAgICB2YXIgcmV0ID0gX3RoaXMucHVzaChjaHVuayk7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHBhdXNlZCA9IHRydWU7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy5cbiAgLy8gaW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGZvciAodmFyIGkgaW4gc3RyZWFtKSB7XG4gICAgaWYgKHRoaXNbaV0gPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ldID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb3h5IGNlcnRhaW4gaW1wb3J0YW50IGV2ZW50cy5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCBrUHJveHlFdmVudHMubGVuZ3RoOyBuKyspIHtcbiAgICBzdHJlYW0ub24oa1Byb3h5RXZlbnRzW25dLCB0aGlzLmVtaXQuYmluZCh0aGlzLCBrUHJveHlFdmVudHNbbl0pKTtcbiAgfVxuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHRoaXMuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ3JlYWRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgfVxufSk7XG5cbi8vIGV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0O1xuXG4vLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICAvLyBub3RoaW5nIGJ1ZmZlcmVkXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIHZhciByZXQ7XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXQgPSBzdGF0ZS5idWZmZXIuc2hpZnQoKTtlbHNlIGlmICghbiB8fCBuID49IHN0YXRlLmxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgbGlzdFxuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSByZXQgPSBzdGF0ZS5idWZmZXIuam9pbignJyk7ZWxzZSBpZiAoc3RhdGUuYnVmZmVyLmxlbmd0aCA9PT0gMSkgcmV0ID0gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YTtlbHNlIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKTtcbiAgICBzdGF0ZS5idWZmZXIuY2xlYXIoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdFxuICAgIHJldCA9IGZyb21MaXN0UGFydGlhbChuLCBzdGF0ZS5idWZmZXIsIHN0YXRlLmRlY29kZXIpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gRXh0cmFjdHMgb25seSBlbm91Z2ggYnVmZmVyZWQgZGF0YSB0byBzYXRpc2Z5IHRoZSBhbW91bnQgcmVxdWVzdGVkLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdFBhcnRpYWwobiwgbGlzdCwgaGFzU3RyaW5ncykge1xuICB2YXIgcmV0O1xuICBpZiAobiA8IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzXG4gICAgcmV0ID0gbGlzdC5oZWFkLmRhdGEuc2xpY2UoMCwgbik7XG4gICAgbGlzdC5oZWFkLmRhdGEgPSBsaXN0LmhlYWQuZGF0YS5zbGljZShuKTtcbiAgfSBlbHNlIGlmIChuID09PSBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBmaXJzdCBjaHVuayBpcyBhIHBlcmZlY3QgbWF0Y2hcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzdWx0IHNwYW5zIG1vcmUgdGhhbiBvbmUgYnVmZmVyXG4gICAgcmV0ID0gaGFzU3RyaW5ncyA/IGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIDogY29weUZyb21CdWZmZXIobiwgbGlzdCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YVxuLy8gY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSB7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHZhciByZXQgPSBwLmRhdGE7XG4gIG4gLT0gcmV0Lmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgc3RyID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBzdHIubGVuZ3RoID8gc3RyLmxlbmd0aCA6IG47XG4gICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSByZXQgKz0gc3RyO2Vsc2UgcmV0ICs9IHN0ci5zbGljZSgwLCBuKTtcbiAgICBuIC09IG5iO1xuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gc3RyLnNsaWNlKG5iKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICArK2M7XG4gIH1cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGEgY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KSB7XG4gIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobik7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHAuZGF0YS5jb3B5KHJldCk7XG4gIG4gLT0gcC5kYXRhLmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgYnVmID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgYnVmLmNvcHkocmV0LCByZXQubGVuZ3RoIC0gbiwgMCwgbmIpO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBidWYuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICBpZiAoc3RhdGUubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKCdcImVuZFJlYWRhYmxlKClcIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBwbmEubmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLy8gdW5kb2N1bWVudGVkIGNiKCkgQVBJLCBuZWVkZWQgZm9yIGNvcmUsIG5vdCBmb3IgcHVibGljIEFQSVxuZnVuY3Rpb24gZGVzdHJveShlcnIsIGNiKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIHJlYWRhYmxlRGVzdHJveWVkID0gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgdmFyIHdyaXRhYmxlRGVzdHJveWVkID0gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcblxuICBpZiAocmVhZGFibGVEZXN0cm95ZWQgfHwgd3JpdGFibGVEZXN0cm95ZWQpIHtcbiAgICBpZiAoY2IpIHtcbiAgICAgIGNiKGVycik7XG4gICAgfSBlbHNlIGlmIChlcnIgJiYgKCF0aGlzLl93cml0YWJsZVN0YXRlIHx8ICF0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCkpIHtcbiAgICAgIHBuYS5uZXh0VGljayhlbWl0RXJyb3JOVCwgdGhpcywgZXJyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB3ZSBzZXQgZGVzdHJveWVkIHRvIHRydWUgYmVmb3JlIGZpcmluZyBlcnJvciBjYWxsYmFja3MgaW4gb3JkZXJcbiAgLy8gdG8gbWFrZSBpdCByZS1lbnRyYW5jZSBzYWZlIGluIGNhc2UgZGVzdHJveSgpIGlzIGNhbGxlZCB3aXRoaW4gY2FsbGJhY2tzXG5cbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHRydWU7XG4gIH1cblxuICAvLyBpZiB0aGlzIGlzIGEgZHVwbGV4IHN0cmVhbSBtYXJrIHRoZSB3cml0YWJsZSBwYXJ0IGFzIGRlc3Ryb3llZCBhcyB3ZWxsXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG5cbiAgdGhpcy5fZGVzdHJveShlcnIgfHwgbnVsbCwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmICghY2IgJiYgZXJyKSB7XG4gICAgICBwbmEubmV4dFRpY2soZW1pdEVycm9yTlQsIF90aGlzLCBlcnIpO1xuICAgICAgaWYgKF90aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICAgIF90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjYikge1xuICAgICAgY2IoZXJyKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufVxuXG5mdW5jdGlvbiB1bmRlc3Ryb3koKSB7XG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIH1cblxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdEVycm9yTlQoc2VsZiwgZXJyKSB7XG4gIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGVzdHJveTogZGVzdHJveSxcbiAgdW5kZXN0cm95OiB1bmRlc3Ryb3lcbn07IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBpc0VuY29kaW5nID0gQnVmZmVyLmlzRW5jb2RpbmcgfHwgZnVuY3Rpb24gKGVuY29kaW5nKSB7XG4gIGVuY29kaW5nID0gJycgKyBlbmNvZGluZztcbiAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpjYXNlICd1dGY4JzpjYXNlICd1dGYtOCc6Y2FzZSAnYXNjaWknOmNhc2UgJ2JpbmFyeSc6Y2FzZSAnYmFzZTY0JzpjYXNlICd1Y3MyJzpjYXNlICd1Y3MtMic6Y2FzZSAndXRmMTZsZSc6Y2FzZSAndXRmLTE2bGUnOmNhc2UgJ3Jhdyc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBfbm9ybWFsaXplRW5jb2RpbmcoZW5jKSB7XG4gIGlmICghZW5jKSByZXR1cm4gJ3V0ZjgnO1xuICB2YXIgcmV0cmllZDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuYykge1xuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiAndXRmOCc7XG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gJ3V0ZjE2bGUnO1xuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiAnbGF0aW4xJztcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gZW5jO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHJldHJpZWQpIHJldHVybjsgLy8gdW5kZWZpbmVkXG4gICAgICAgIGVuYyA9ICgnJyArIGVuYykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0cmllZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG4vLyBEbyBub3QgY2FjaGUgYEJ1ZmZlci5pc0VuY29kaW5nYCB3aGVuIGNoZWNraW5nIGVuY29kaW5nIG5hbWVzIGFzIHNvbWVcbi8vIG1vZHVsZXMgbW9ua2V5LXBhdGNoIGl0IHRvIHN1cHBvcnQgYWRkaXRpb25hbCBlbmNvZGluZ3NcbmZ1bmN0aW9uIG5vcm1hbGl6ZUVuY29kaW5nKGVuYykge1xuICB2YXIgbmVuYyA9IF9ub3JtYWxpemVFbmNvZGluZyhlbmMpO1xuICBpZiAodHlwZW9mIG5lbmMgIT09ICdzdHJpbmcnICYmIChCdWZmZXIuaXNFbmNvZGluZyA9PT0gaXNFbmNvZGluZyB8fCAhaXNFbmNvZGluZyhlbmMpKSkgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jKTtcbiAgcmV0dXJuIG5lbmMgfHwgZW5jO1xufVxuXG4vLyBTdHJpbmdEZWNvZGVyIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgZWZmaWNpZW50bHkgc3BsaXR0aW5nIGEgc2VyaWVzIG9mXG4vLyBidWZmZXJzIGludG8gYSBzZXJpZXMgb2YgSlMgc3RyaW5ncyB3aXRob3V0IGJyZWFraW5nIGFwYXJ0IG11bHRpLWJ5dGVcbi8vIGNoYXJhY3RlcnMuXG5leHBvcnRzLlN0cmluZ0RlY29kZXIgPSBTdHJpbmdEZWNvZGVyO1xuZnVuY3Rpb24gU3RyaW5nRGVjb2RlcihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gbm9ybWFsaXplRW5jb2RpbmcoZW5jb2RpbmcpO1xuICB2YXIgbmI7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgdGhpcy50ZXh0ID0gdXRmMTZUZXh0O1xuICAgICAgdGhpcy5lbmQgPSB1dGYxNkVuZDtcbiAgICAgIG5iID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgdGhpcy5maWxsTGFzdCA9IHV0ZjhGaWxsTGFzdDtcbiAgICAgIG5iID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICB0aGlzLnRleHQgPSBiYXNlNjRUZXh0O1xuICAgICAgdGhpcy5lbmQgPSBiYXNlNjRFbmQ7XG4gICAgICBuYiA9IDM7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhpcy53cml0ZSA9IHNpbXBsZVdyaXRlO1xuICAgICAgdGhpcy5lbmQgPSBzaW1wbGVFbmQ7XG4gICAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5sYXN0TmVlZCA9IDA7XG4gIHRoaXMubGFzdFRvdGFsID0gMDtcbiAgdGhpcy5sYXN0Q2hhciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuYik7XG59XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICB2YXIgcjtcbiAgdmFyIGk7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSB7XG4gICAgciA9IHRoaXMuZmlsbExhc3QoYnVmKTtcbiAgICBpZiAociA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XG4gICAgaSA9IHRoaXMubGFzdE5lZWQ7XG4gICAgdGhpcy5sYXN0TmVlZCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgaSA9IDA7XG4gIH1cbiAgaWYgKGkgPCBidWYubGVuZ3RoKSByZXR1cm4gciA/IHIgKyB0aGlzLnRleHQoYnVmLCBpKSA6IHRoaXMudGV4dChidWYsIGkpO1xuICByZXR1cm4gciB8fCAnJztcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IHV0ZjhFbmQ7XG5cbi8vIFJldHVybnMgb25seSBjb21wbGV0ZSBjaGFyYWN0ZXJzIGluIGEgQnVmZmVyXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS50ZXh0ID0gdXRmOFRleHQ7XG5cbi8vIEF0dGVtcHRzIHRvIGNvbXBsZXRlIGEgcGFydGlhbCBub24tVVRGLTggY2hhcmFjdGVyIHVzaW5nIGJ5dGVzIGZyb20gYSBCdWZmZXJcblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmZpbGxMYXN0ID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAodGhpcy5sYXN0TmVlZCA8PSBidWYubGVuZ3RoKSB7XG4gICAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkLCAwLCB0aGlzLmxhc3ROZWVkKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCB0aGlzLmxhc3RUb3RhbCk7XG4gIH1cbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkLCAwLCBidWYubGVuZ3RoKTtcbiAgdGhpcy5sYXN0TmVlZCAtPSBidWYubGVuZ3RoO1xufTtcblxuLy8gQ2hlY2tzIHRoZSB0eXBlIG9mIGEgVVRGLTggYnl0ZSwgd2hldGhlciBpdCdzIEFTQ0lJLCBhIGxlYWRpbmcgYnl0ZSwgb3IgYVxuLy8gY29udGludWF0aW9uIGJ5dGUuIElmIGFuIGludmFsaWQgYnl0ZSBpcyBkZXRlY3RlZCwgLTIgaXMgcmV0dXJuZWQuXG5mdW5jdGlvbiB1dGY4Q2hlY2tCeXRlKGJ5dGUpIHtcbiAgaWYgKGJ5dGUgPD0gMHg3RikgcmV0dXJuIDA7ZWxzZSBpZiAoYnl0ZSA+PiA1ID09PSAweDA2KSByZXR1cm4gMjtlbHNlIGlmIChieXRlID4+IDQgPT09IDB4MEUpIHJldHVybiAzO2Vsc2UgaWYgKGJ5dGUgPj4gMyA9PT0gMHgxRSkgcmV0dXJuIDQ7XG4gIHJldHVybiBieXRlID4+IDYgPT09IDB4MDIgPyAtMSA6IC0yO1xufVxuXG4vLyBDaGVja3MgYXQgbW9zdCAzIGJ5dGVzIGF0IHRoZSBlbmQgb2YgYSBCdWZmZXIgaW4gb3JkZXIgdG8gZGV0ZWN0IGFuXG4vLyBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyLiBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzICgyLCAzLCBvciA0KVxuLy8gbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBVVEYtOCBjaGFyYWN0ZXIgKGlmIGFwcGxpY2FibGUpIGFyZSByZXR1cm5lZC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0luY29tcGxldGUoc2VsZiwgYnVmLCBpKSB7XG4gIHZhciBqID0gYnVmLmxlbmd0aCAtIDE7XG4gIGlmIChqIDwgaSkgcmV0dXJuIDA7XG4gIHZhciBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAxO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSB8fCBuYiA9PT0gLTIpIHJldHVybiAwO1xuICBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAyO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSB8fCBuYiA9PT0gLTIpIHJldHVybiAwO1xuICBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSB7XG4gICAgICBpZiAobmIgPT09IDIpIG5iID0gMDtlbHNlIHNlbGYubGFzdE5lZWQgPSBuYiAtIDM7XG4gICAgfVxuICAgIHJldHVybiBuYjtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy8gVmFsaWRhdGVzIGFzIG1hbnkgY29udGludWF0aW9uIGJ5dGVzIGZvciBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyIGFzXG4vLyBuZWVkZWQgb3IgYXJlIGF2YWlsYWJsZS4gSWYgd2Ugc2VlIGEgbm9uLWNvbnRpbnVhdGlvbiBieXRlIHdoZXJlIHdlIGV4cGVjdFxuLy8gb25lLCB3ZSBcInJlcGxhY2VcIiB0aGUgdmFsaWRhdGVkIGNvbnRpbnVhdGlvbiBieXRlcyB3ZSd2ZSBzZWVuIHNvIGZhciB3aXRoXG4vLyBhIHNpbmdsZSBVVEYtOCByZXBsYWNlbWVudCBjaGFyYWN0ZXIgKCdcXHVmZmZkJyksIHRvIG1hdGNoIHY4J3MgVVRGLTggZGVjb2Rpbmdcbi8vIGJlaGF2aW9yLiBUaGUgY29udGludWF0aW9uIGJ5dGUgY2hlY2sgaXMgaW5jbHVkZWQgdGhyZWUgdGltZXMgaW4gdGhlIGNhc2Vcbi8vIHdoZXJlIGFsbCBvZiB0aGUgY29udGludWF0aW9uIGJ5dGVzIGZvciBhIGNoYXJhY3RlciBleGlzdCBpbiB0aGUgc2FtZSBidWZmZXIuXG4vLyBJdCBpcyBhbHNvIGRvbmUgdGhpcyB3YXkgYXMgYSBzbGlnaHQgcGVyZm9ybWFuY2UgaW5jcmVhc2UgaW5zdGVhZCBvZiB1c2luZyBhXG4vLyBsb29wLlxuZnVuY3Rpb24gdXRmOENoZWNrRXh0cmFCeXRlcyhzZWxmLCBidWYsIHApIHtcbiAgaWYgKChidWZbMF0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgIHNlbGYubGFzdE5lZWQgPSAwO1xuICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gIH1cbiAgaWYgKHNlbGYubGFzdE5lZWQgPiAxICYmIGJ1Zi5sZW5ndGggPiAxKSB7XG4gICAgaWYgKChidWZbMV0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgc2VsZi5sYXN0TmVlZCA9IDE7XG4gICAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICAgIH1cbiAgICBpZiAoc2VsZi5sYXN0TmVlZCA+IDIgJiYgYnVmLmxlbmd0aCA+IDIpIHtcbiAgICAgIGlmICgoYnVmWzJdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgc2VsZi5sYXN0TmVlZCA9IDI7XG4gICAgICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIEF0dGVtcHRzIHRvIGNvbXBsZXRlIGEgbXVsdGktYnl0ZSBVVEYtOCBjaGFyYWN0ZXIgdXNpbmcgYnl0ZXMgZnJvbSBhIEJ1ZmZlci5cbmZ1bmN0aW9uIHV0ZjhGaWxsTGFzdChidWYpIHtcbiAgdmFyIHAgPSB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQ7XG4gIHZhciByID0gdXRmOENoZWNrRXh0cmFCeXRlcyh0aGlzLCBidWYsIHApO1xuICBpZiAociAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcjtcbiAgaWYgKHRoaXMubGFzdE5lZWQgPD0gYnVmLmxlbmd0aCkge1xuICAgIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHAsIDAsIHRoaXMubGFzdE5lZWQpO1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIHRoaXMubGFzdFRvdGFsKTtcbiAgfVxuICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCBwLCAwLCBidWYubGVuZ3RoKTtcbiAgdGhpcy5sYXN0TmVlZCAtPSBidWYubGVuZ3RoO1xufVxuXG4vLyBSZXR1cm5zIGFsbCBjb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXJzIGluIGEgQnVmZmVyLiBJZiB0aGUgQnVmZmVyIGVuZGVkIG9uIGFcbi8vIHBhcnRpYWwgY2hhcmFjdGVyLCB0aGUgY2hhcmFjdGVyJ3MgYnl0ZXMgYXJlIGJ1ZmZlcmVkIHVudGlsIHRoZSByZXF1aXJlZFxuLy8gbnVtYmVyIG9mIGJ5dGVzIGFyZSBhdmFpbGFibGUuXG5mdW5jdGlvbiB1dGY4VGV4dChidWYsIGkpIHtcbiAgdmFyIHRvdGFsID0gdXRmOENoZWNrSW5jb21wbGV0ZSh0aGlzLCBidWYsIGkpO1xuICBpZiAoIXRoaXMubGFzdE5lZWQpIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjgnLCBpKTtcbiAgdGhpcy5sYXN0VG90YWwgPSB0b3RhbDtcbiAgdmFyIGVuZCA9IGJ1Zi5sZW5ndGggLSAodG90YWwgLSB0aGlzLmxhc3ROZWVkKTtcbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgMCwgZW5kKTtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmOCcsIGksIGVuZCk7XG59XG5cbi8vIEZvciBVVEYtOCwgYSByZXBsYWNlbWVudCBjaGFyYWN0ZXIgaXMgYWRkZWQgd2hlbiBlbmRpbmcgb24gYSBwYXJ0aWFsXG4vLyBjaGFyYWN0ZXIuXG5mdW5jdGlvbiB1dGY4RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSByZXR1cm4gciArICdcXHVmZmZkJztcbiAgcmV0dXJuIHI7XG59XG5cbi8vIFVURi0xNkxFIHR5cGljYWxseSBuZWVkcyB0d28gYnl0ZXMgcGVyIGNoYXJhY3RlciwgYnV0IGV2ZW4gaWYgd2UgaGF2ZSBhbiBldmVuXG4vLyBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHdlIGVuZCBvbiBhIGxlYWRpbmcvaGlnaFxuLy8gc3Vycm9nYXRlLiBJbiB0aGF0IGNhc2UsIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIG5leHQgdHdvIGJ5dGVzIGluIG9yZGVyIHRvXG4vLyBkZWNvZGUgdGhlIGxhc3QgY2hhcmFjdGVyIHByb3Blcmx5LlxuZnVuY3Rpb24gdXRmMTZUZXh0KGJ1ZiwgaSkge1xuICBpZiAoKGJ1Zi5sZW5ndGggLSBpKSAlIDIgPT09IDApIHtcbiAgICB2YXIgciA9IGJ1Zi50b1N0cmluZygndXRmMTZsZScsIGkpO1xuICAgIGlmIChyKSB7XG4gICAgICB2YXIgYyA9IHIuY2hhckNvZGVBdChyLmxlbmd0aCAtIDEpO1xuICAgICAgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhEQkZGKSB7XG4gICAgICAgIHRoaXMubGFzdE5lZWQgPSAyO1xuICAgICAgICB0aGlzLmxhc3RUb3RhbCA9IDQ7XG4gICAgICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDJdO1xuICAgICAgICB0aGlzLmxhc3RDaGFyWzFdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIHIuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuICB0aGlzLmxhc3ROZWVkID0gMTtcbiAgdGhpcy5sYXN0VG90YWwgPSAyO1xuICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmMTZsZScsIGksIGJ1Zi5sZW5ndGggLSAxKTtcbn1cblxuLy8gRm9yIFVURi0xNkxFIHdlIGRvIG5vdCBleHBsaWNpdGx5IGFwcGVuZCBzcGVjaWFsIHJlcGxhY2VtZW50IGNoYXJhY3RlcnMgaWYgd2Vcbi8vIGVuZCBvbiBhIHBhcnRpYWwgY2hhcmFjdGVyLCB3ZSBzaW1wbHkgbGV0IHY4IGhhbmRsZSB0aGF0LlxuZnVuY3Rpb24gdXRmMTZFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHtcbiAgICB2YXIgZW5kID0gdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkO1xuICAgIHJldHVybiByICsgdGhpcy5sYXN0Q2hhci50b1N0cmluZygndXRmMTZsZScsIDAsIGVuZCk7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRleHQoYnVmLCBpKSB7XG4gIHZhciBuID0gKGJ1Zi5sZW5ndGggLSBpKSAlIDM7XG4gIGlmIChuID09PSAwKSByZXR1cm4gYnVmLnRvU3RyaW5nKCdiYXNlNjQnLCBpKTtcbiAgdGhpcy5sYXN0TmVlZCA9IDMgLSBuO1xuICB0aGlzLmxhc3RUb3RhbCA9IDM7XG4gIGlmIChuID09PSAxKSB7XG4gICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMl07XG4gICAgdGhpcy5sYXN0Q2hhclsxXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIH1cbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygnYmFzZTY0JywgaSwgYnVmLmxlbmd0aCAtIG4pO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHJldHVybiByICsgdGhpcy5sYXN0Q2hhci50b1N0cmluZygnYmFzZTY0JywgMCwgMyAtIHRoaXMubGFzdE5lZWQpO1xuICByZXR1cm4gcjtcbn1cblxuLy8gUGFzcyBieXRlcyBvbiB0aHJvdWdoIGZvciBzaW5nbGUtYnl0ZSBlbmNvZGluZ3MgKGUuZy4gYXNjaWksIGxhdGluMSwgaGV4KVxuZnVuY3Rpb24gc2ltcGxlV3JpdGUoYnVmKSB7XG4gIHJldHVybiBidWYudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHNpbXBsZUVuZChidWYpIHtcbiAgcmV0dXJuIGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuZnVuY3Rpb24gYWZ0ZXJUcmFuc2Zvcm0oZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYikge1xuICAgIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCd3cml0ZSBjYWxsYmFjayBjYWxsZWQgbXVsdGlwbGUgdGltZXMnKSk7XG4gIH1cblxuICB0cy53cml0ZWNodW5rID0gbnVsbDtcbiAgdHMud3JpdGVjYiA9IG51bGw7XG5cbiAgaWYgKGRhdGEgIT0gbnVsbCkgLy8gc2luZ2xlIGVxdWFscyBjaGVjayBmb3IgYm90aCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgXG4gICAgdGhpcy5wdXNoKGRhdGEpO1xuXG4gIGNiKGVyKTtcblxuICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBycy5yZWFkaW5nID0gZmFsc2U7XG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0ge1xuICAgIGFmdGVyVHJhbnNmb3JtOiBhZnRlclRyYW5zZm9ybS5iaW5kKHRoaXMpLFxuICAgIG5lZWRUcmFuc2Zvcm06IGZhbHNlLFxuICAgIHRyYW5zZm9ybWluZzogZmFsc2UsXG4gICAgd3JpdGVjYjogbnVsbCxcbiAgICB3cml0ZWNodW5rOiBudWxsLFxuICAgIHdyaXRlZW5jb2Rpbmc6IG51bGxcbiAgfTtcblxuICAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB0aGlzLl90cmFuc2Zvcm0gPSBvcHRpb25zLnRyYW5zZm9ybTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoO1xuICB9XG5cbiAgLy8gV2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICB0aGlzLm9uKCdwcmVmaW5pc2gnLCBwcmVmaW5pc2gpO1xufVxuXG5mdW5jdGlvbiBwcmVmaW5pc2goKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9mbHVzaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlciwgZGF0YSkge1xuICAgICAgZG9uZShfdGhpcywgZXIsIGRhdGEpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGRvbmUodGhpcywgbnVsbCwgbnVsbCk7XG4gIH1cbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHJldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xufTtcblxuLy8gVGhpcyBpcyB0aGUgcGFydCB3aGVyZSB5b3UgZG8gc3R1ZmYhXG4vLyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyAnY2h1bmsnIGlzIGFuIGlucHV0IGNodW5rLlxuLy9cbi8vIENhbGwgYHB1c2gobmV3Q2h1bmspYCB0byBwYXNzIGFsb25nIHRyYW5zZm9ybWVkIG91dHB1dFxuLy8gdG8gdGhlIHJlYWRhYmxlIHNpZGUuICBZb3UgbWF5IGNhbGwgJ3B1c2gnIHplcm8gb3IgbW9yZSB0aW1lcy5cbi8vXG4vLyBDYWxsIGBjYihlcnIpYCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsuICBJZiB5b3UgcGFzc1xuLy8gYW4gZXJyb3IsIHRoZW4gdGhhdCdsbCBwdXQgdGhlIGh1cnQgb24gdGhlIHdob2xlIG9wZXJhdGlvbi4gIElmIHlvdVxuLy8gbmV2ZXIgY2FsbCBjYigpLCB0aGVuIHlvdSdsbCBuZXZlciBnZXQgYW5vdGhlciBjaHVuay5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignX3RyYW5zZm9ybSgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gIER1cGxleC5wcm90b3R5cGUuX2Rlc3Ryb3kuY2FsbCh0aGlzLCBlcnIsIGZ1bmN0aW9uIChlcnIyKSB7XG4gICAgY2IoZXJyMik7XG4gICAgX3RoaXMyLmVtaXQoJ2Nsb3NlJyk7XG4gIH0pO1xufTtcblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcblxuICBpZiAoZGF0YSAhPSBudWxsKSAvLyBzaW5nbGUgZXF1YWxzIGNoZWNrIGZvciBib3RoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGBcbiAgICBzdHJlYW0ucHVzaChkYXRhKTtcblxuICAvLyBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlciwgdGhlbiB0aGF0IG1lYW5zXG4gIC8vIHRoYXQgbm90aGluZyBtb3JlIHdpbGwgZXZlciBiZSBwcm92aWRlZFxuICBpZiAoc3RyZWFtLl93cml0YWJsZVN0YXRlLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAoc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZS50cmFuc2Zvcm1pbmcpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZycpO1xuXG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbnZhciBvYmplY3RBc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbi8vIGNvbXBhcmUgYW5kIGlzQnVmZmVyIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvYmxvYi82ODBlOWU1ZTQ4OGYyMmFhYzI3NTk5YTU3ZGM4NDRhNjMxNTkyOGRkL2luZGV4LmpzXG4vLyBvcmlnaW5hbCBub3RpY2U6XG5cbi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIHggPSBhLmxlbmd0aDtcbiAgdmFyIHkgPSBiLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXTtcbiAgICAgIHkgPSBiW2ldO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmICh5IDwgeCkge1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxuZnVuY3Rpb24gaXNCdWZmZXIoYikge1xuICBpZiAoZ2xvYmFsLkJ1ZmZlciAmJiB0eXBlb2YgZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBnbG9iYWwuQnVmZmVyLmlzQnVmZmVyKGIpO1xuICB9XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpO1xufVxuXG4vLyBiYXNlZCBvbiBub2RlIGFzc2VydCwgb3JpZ2luYWwgbm90aWNlOlxuLy8gTkI6IFRoZSBVUkwgdG8gdGhlIENvbW1vbkpTIHNwZWMgaXMga2VwdCBqdXN0IGZvciB0cmFkaXRpb24uXG4vLyAgICAgbm9kZS1hc3NlcnQgaGFzIGV2b2x2ZWQgYSBsb3Qgc2luY2UgdGhlbiwgYm90aCBpbiBBUEkgYW5kIGJlaGF2aW9yLlxuXG4vLyBodHRwOi8vd2lraS5jb21tb25qcy5vcmcvd2lraS9Vbml0X1Rlc3RpbmcvMS4wXG4vL1xuLy8gVEhJUyBJUyBOT1QgVEVTVEVEIE5PUiBMSUtFTFkgVE8gV09SSyBPVVRTSURFIFY4IVxuLy9cbi8vIE9yaWdpbmFsbHkgZnJvbSBuYXJ3aGFsLmpzIChodHRwOi8vbmFyd2hhbGpzLm9yZylcbi8vIENvcHlyaWdodCAoYykgMjAwOSBUaG9tYXMgUm9iaW5zb24gPDI4MG5vcnRoLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAnU29mdHdhcmUnKSwgdG9cbi8vIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOXG4vLyBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsLycpO1xudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcFNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIGZ1bmN0aW9uc0hhdmVOYW1lcyA9IChmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb28oKSB7fS5uYW1lID09PSAnZm9vJztcbn0oKSk7XG5mdW5jdGlvbiBwVG9TdHJpbmcgKG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaik7XG59XG5mdW5jdGlvbiBpc1ZpZXcoYXJyYnVmKSB7XG4gIGlmIChpc0J1ZmZlcihhcnJidWYpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgZ2xvYmFsLkFycmF5QnVmZmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhcnJidWYpO1xuICB9XG4gIGlmICghYXJyYnVmKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChhcnJidWYgaW5zdGFuY2VvZiBEYXRhVmlldykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChhcnJidWYuYnVmZmVyICYmIGFycmJ1Zi5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbi8vIDEuIFRoZSBhc3NlcnQgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0aGF0IHRocm93XG4vLyBBc3NlcnRpb25FcnJvcidzIHdoZW4gcGFydGljdWxhciBjb25kaXRpb25zIGFyZSBub3QgbWV0LiBUaGVcbi8vIGFzc2VydCBtb2R1bGUgbXVzdCBjb25mb3JtIHRvIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlLlxuXG52YXIgYXNzZXJ0ID0gbW9kdWxlLmV4cG9ydHMgPSBvaztcblxuLy8gMi4gVGhlIEFzc2VydGlvbkVycm9yIGlzIGRlZmluZWQgaW4gYXNzZXJ0LlxuLy8gbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7IG1lc3NhZ2U6IG1lc3NhZ2UsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsOiBhY3R1YWwsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkIH0pXG5cbnZhciByZWdleCA9IC9cXHMqZnVuY3Rpb25cXHMrKFteXFwoXFxzXSopXFxzKi87XG4vLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL2Z1bmN0aW9uLnByb3RvdHlwZS5uYW1lL2Jsb2IvYWRlZWVlYzhiZmNjNjA2OGIxODdkN2Q5ZmIzZDViYjFkM2EzMDg5OS9pbXBsZW1lbnRhdGlvbi5qc1xuZnVuY3Rpb24gZ2V0TmFtZShmdW5jKSB7XG4gIGlmICghdXRpbC5pc0Z1bmN0aW9uKGZ1bmMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChmdW5jdGlvbnNIYXZlTmFtZXMpIHtcbiAgICByZXR1cm4gZnVuYy5uYW1lO1xuICB9XG4gIHZhciBzdHIgPSBmdW5jLnRvU3RyaW5nKCk7XG4gIHZhciBtYXRjaCA9IHN0ci5tYXRjaChyZWdleCk7XG4gIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXTtcbn1cbmFzc2VydC5Bc3NlcnRpb25FcnJvciA9IGZ1bmN0aW9uIEFzc2VydGlvbkVycm9yKG9wdGlvbnMpIHtcbiAgdGhpcy5uYW1lID0gJ0Fzc2VydGlvbkVycm9yJztcbiAgdGhpcy5hY3R1YWwgPSBvcHRpb25zLmFjdHVhbDtcbiAgdGhpcy5leHBlY3RlZCA9IG9wdGlvbnMuZXhwZWN0ZWQ7XG4gIHRoaXMub3BlcmF0b3IgPSBvcHRpb25zLm9wZXJhdG9yO1xuICBpZiAob3B0aW9ucy5tZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlO1xuICAgIHRoaXMuZ2VuZXJhdGVkTWVzc2FnZSA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubWVzc2FnZSA9IGdldE1lc3NhZ2UodGhpcyk7XG4gICAgdGhpcy5nZW5lcmF0ZWRNZXNzYWdlID0gdHJ1ZTtcbiAgfVxuICB2YXIgc3RhY2tTdGFydEZ1bmN0aW9uID0gb3B0aW9ucy5zdGFja1N0YXJ0RnVuY3Rpb24gfHwgZmFpbDtcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgc3RhY2tTdGFydEZ1bmN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBub24gdjggYnJvd3NlcnMgc28gd2UgY2FuIGhhdmUgYSBzdGFja3RyYWNlXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcigpO1xuICAgIGlmIChlcnIuc3RhY2spIHtcbiAgICAgIHZhciBvdXQgPSBlcnIuc3RhY2s7XG5cbiAgICAgIC8vIHRyeSB0byBzdHJpcCB1c2VsZXNzIGZyYW1lc1xuICAgICAgdmFyIGZuX25hbWUgPSBnZXROYW1lKHN0YWNrU3RhcnRGdW5jdGlvbik7XG4gICAgICB2YXIgaWR4ID0gb3V0LmluZGV4T2YoJ1xcbicgKyBmbl9uYW1lKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAvLyBvbmNlIHdlIGhhdmUgbG9jYXRlZCB0aGUgZnVuY3Rpb24gZnJhbWVcbiAgICAgICAgLy8gd2UgbmVlZCB0byBzdHJpcCBvdXQgZXZlcnl0aGluZyBiZWZvcmUgaXQgKGFuZCBpdHMgbGluZSlcbiAgICAgICAgdmFyIG5leHRfbGluZSA9IG91dC5pbmRleE9mKCdcXG4nLCBpZHggKyAxKTtcbiAgICAgICAgb3V0ID0gb3V0LnN1YnN0cmluZyhuZXh0X2xpbmUgKyAxKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGFjayA9IG91dDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIGFzc2VydC5Bc3NlcnRpb25FcnJvciBpbnN0YW5jZW9mIEVycm9yXG51dGlsLmluaGVyaXRzKGFzc2VydC5Bc3NlcnRpb25FcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiB0cnVuY2F0ZShzLCBuKSB7XG4gIGlmICh0eXBlb2YgcyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPCBuID8gcyA6IHMuc2xpY2UoMCwgbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHM7XG4gIH1cbn1cbmZ1bmN0aW9uIGluc3BlY3Qoc29tZXRoaW5nKSB7XG4gIGlmIChmdW5jdGlvbnNIYXZlTmFtZXMgfHwgIXV0aWwuaXNGdW5jdGlvbihzb21ldGhpbmcpKSB7XG4gICAgcmV0dXJuIHV0aWwuaW5zcGVjdChzb21ldGhpbmcpO1xuICB9XG4gIHZhciByYXduYW1lID0gZ2V0TmFtZShzb21ldGhpbmcpO1xuICB2YXIgbmFtZSA9IHJhd25hbWUgPyAnOiAnICsgcmF3bmFtZSA6ICcnO1xuICByZXR1cm4gJ1tGdW5jdGlvbicgKyAgbmFtZSArICddJztcbn1cbmZ1bmN0aW9uIGdldE1lc3NhZ2Uoc2VsZikge1xuICByZXR1cm4gdHJ1bmNhdGUoaW5zcGVjdChzZWxmLmFjdHVhbCksIDEyOCkgKyAnICcgK1xuICAgICAgICAgc2VsZi5vcGVyYXRvciArICcgJyArXG4gICAgICAgICB0cnVuY2F0ZShpbnNwZWN0KHNlbGYuZXhwZWN0ZWQpLCAxMjgpO1xufVxuXG4vLyBBdCBwcmVzZW50IG9ubHkgdGhlIHRocmVlIGtleXMgbWVudGlvbmVkIGFib3ZlIGFyZSB1c2VkIGFuZFxuLy8gdW5kZXJzdG9vZCBieSB0aGUgc3BlYy4gSW1wbGVtZW50YXRpb25zIG9yIHN1YiBtb2R1bGVzIGNhbiBwYXNzXG4vLyBvdGhlciBrZXlzIHRvIHRoZSBBc3NlcnRpb25FcnJvcidzIGNvbnN0cnVjdG9yIC0gdGhleSB3aWxsIGJlXG4vLyBpZ25vcmVkLlxuXG4vLyAzLiBBbGwgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbXVzdCB0aHJvdyBhbiBBc3NlcnRpb25FcnJvclxuLy8gd2hlbiBhIGNvcnJlc3BvbmRpbmcgY29uZGl0aW9uIGlzIG5vdCBtZXQsIHdpdGggYSBtZXNzYWdlIHRoYXRcbi8vIG1heSBiZSB1bmRlZmluZWQgaWYgbm90IHByb3ZpZGVkLiAgQWxsIGFzc2VydGlvbiBtZXRob2RzIHByb3ZpZGVcbi8vIGJvdGggdGhlIGFjdHVhbCBhbmQgZXhwZWN0ZWQgdmFsdWVzIHRvIHRoZSBhc3NlcnRpb24gZXJyb3IgZm9yXG4vLyBkaXNwbGF5IHB1cnBvc2VzLlxuXG5mdW5jdGlvbiBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIG9wZXJhdG9yLCBzdGFja1N0YXJ0RnVuY3Rpb24pIHtcbiAgdGhyb3cgbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBhY3R1YWw6IGFjdHVhbCxcbiAgICBleHBlY3RlZDogZXhwZWN0ZWQsXG4gICAgb3BlcmF0b3I6IG9wZXJhdG9yLFxuICAgIHN0YWNrU3RhcnRGdW5jdGlvbjogc3RhY2tTdGFydEZ1bmN0aW9uXG4gIH0pO1xufVxuXG4vLyBFWFRFTlNJT04hIGFsbG93cyBmb3Igd2VsbCBiZWhhdmVkIGVycm9ycyBkZWZpbmVkIGVsc2V3aGVyZS5cbmFzc2VydC5mYWlsID0gZmFpbDtcblxuLy8gNC4gUHVyZSBhc3NlcnRpb24gdGVzdHMgd2hldGhlciBhIHZhbHVlIGlzIHRydXRoeSwgYXMgZGV0ZXJtaW5lZFxuLy8gYnkgISFndWFyZC5cbi8vIGFzc2VydC5vayhndWFyZCwgbWVzc2FnZV9vcHQpO1xuLy8gVGhpcyBzdGF0ZW1lbnQgaXMgZXF1aXZhbGVudCB0byBhc3NlcnQuZXF1YWwodHJ1ZSwgISFndWFyZCxcbi8vIG1lc3NhZ2Vfb3B0KTsuIFRvIHRlc3Qgc3RyaWN0bHkgZm9yIHRoZSB2YWx1ZSB0cnVlLCB1c2Vcbi8vIGFzc2VydC5zdHJpY3RFcXVhbCh0cnVlLCBndWFyZCwgbWVzc2FnZV9vcHQpOy5cblxuZnVuY3Rpb24gb2sodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCF2YWx1ZSkgZmFpbCh2YWx1ZSwgdHJ1ZSwgbWVzc2FnZSwgJz09JywgYXNzZXJ0Lm9rKTtcbn1cbmFzc2VydC5vayA9IG9rO1xuXG4vLyA1LiBUaGUgZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIHNoYWxsb3csIGNvZXJjaXZlIGVxdWFsaXR5IHdpdGhcbi8vID09LlxuLy8gYXNzZXJ0LmVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9IGV4cGVjdGVkKSBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PScsIGFzc2VydC5lcXVhbCk7XG59O1xuXG4vLyA2LiBUaGUgbm9uLWVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBmb3Igd2hldGhlciB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsXG4vLyB3aXRoICE9IGFzc2VydC5ub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3RFcXVhbCA9IGZ1bmN0aW9uIG5vdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCA9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9JywgYXNzZXJ0Lm5vdEVxdWFsKTtcbiAgfVxufTtcblxuLy8gNy4gVGhlIGVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBhIGRlZXAgZXF1YWxpdHkgcmVsYXRpb24uXG4vLyBhc3NlcnQuZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmRlZXBFcXVhbCA9IGZ1bmN0aW9uIGRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmICghX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBmYWxzZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdkZWVwRXF1YWwnLCBhc3NlcnQuZGVlcEVxdWFsKTtcbiAgfVxufTtcblxuYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIGRlZXBTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmICghX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCB0cnVlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ2RlZXBTdHJpY3RFcXVhbCcsIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHN0cmljdCwgbWVtb3MpIHtcbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYWN0dWFsKSAmJiBpc0J1ZmZlcihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gY29tcGFyZShhY3R1YWwsIGV4cGVjdGVkKSA9PT0gMDtcblxuICAvLyA3LjIuIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIERhdGUgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIERhdGUgb2JqZWN0IHRoYXQgcmVmZXJzIHRvIHRoZSBzYW1lIHRpbWUuXG4gIH0gZWxzZSBpZiAodXRpbC5pc0RhdGUoYWN0dWFsKSAmJiB1dGlsLmlzRGF0ZShleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gYWN0dWFsLmdldFRpbWUoKSA9PT0gZXhwZWN0ZWQuZ2V0VGltZSgpO1xuXG4gIC8vIDcuMyBJZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIFJlZ0V4cCBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzb3VyY2UgYW5kXG4gIC8vIHByb3BlcnRpZXMgKGBnbG9iYWxgLCBgbXVsdGlsaW5lYCwgYGxhc3RJbmRleGAsIGBpZ25vcmVDYXNlYCkuXG4gIH0gZWxzZSBpZiAodXRpbC5pc1JlZ0V4cChhY3R1YWwpICYmIHV0aWwuaXNSZWdFeHAoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGFjdHVhbC5zb3VyY2UgPT09IGV4cGVjdGVkLnNvdXJjZSAmJlxuICAgICAgICAgICBhY3R1YWwuZ2xvYmFsID09PSBleHBlY3RlZC5nbG9iYWwgJiZcbiAgICAgICAgICAgYWN0dWFsLm11bHRpbGluZSA9PT0gZXhwZWN0ZWQubXVsdGlsaW5lICYmXG4gICAgICAgICAgIGFjdHVhbC5sYXN0SW5kZXggPT09IGV4cGVjdGVkLmxhc3RJbmRleCAmJlxuICAgICAgICAgICBhY3R1YWwuaWdub3JlQ2FzZSA9PT0gZXhwZWN0ZWQuaWdub3JlQ2FzZTtcblxuICAvLyA3LjQuIE90aGVyIHBhaXJzIHRoYXQgZG8gbm90IGJvdGggcGFzcyB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcsXG4gIC8vIGVxdWl2YWxlbmNlIGlzIGRldGVybWluZWQgYnkgPT0uXG4gIH0gZWxzZSBpZiAoKGFjdHVhbCA9PT0gbnVsbCB8fCB0eXBlb2YgYWN0dWFsICE9PSAnb2JqZWN0JykgJiZcbiAgICAgICAgICAgICAoZXhwZWN0ZWQgPT09IG51bGwgfHwgdHlwZW9mIGV4cGVjdGVkICE9PSAnb2JqZWN0JykpIHtcbiAgICByZXR1cm4gc3RyaWN0ID8gYWN0dWFsID09PSBleHBlY3RlZCA6IGFjdHVhbCA9PSBleHBlY3RlZDtcblxuICAvLyBJZiBib3RoIHZhbHVlcyBhcmUgaW5zdGFuY2VzIG9mIHR5cGVkIGFycmF5cywgd3JhcCB0aGVpciB1bmRlcmx5aW5nXG4gIC8vIEFycmF5QnVmZmVycyBpbiBhIEJ1ZmZlciBlYWNoIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlXG4gIC8vIFRoaXMgb3B0aW1pemF0aW9uIHJlcXVpcmVzIHRoZSBhcnJheXMgdG8gaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGNoZWNrZWQgYnlcbiAgLy8gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyAoYWthIHBUb1N0cmluZykuIE5ldmVyIHBlcmZvcm0gYmluYXJ5XG4gIC8vIGNvbXBhcmlzb25zIGZvciBGbG9hdCpBcnJheXMsIHRob3VnaCwgc2luY2UgZS5nLiArMCA9PT0gLTAgYnV0IHRoZWlyXG4gIC8vIGJpdCBwYXR0ZXJucyBhcmUgbm90IGlkZW50aWNhbC5cbiAgfSBlbHNlIGlmIChpc1ZpZXcoYWN0dWFsKSAmJiBpc1ZpZXcoZXhwZWN0ZWQpICYmXG4gICAgICAgICAgICAgcFRvU3RyaW5nKGFjdHVhbCkgPT09IHBUb1N0cmluZyhleHBlY3RlZCkgJiZcbiAgICAgICAgICAgICAhKGFjdHVhbCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSB8fFxuICAgICAgICAgICAgICAgYWN0dWFsIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSkge1xuICAgIHJldHVybiBjb21wYXJlKG5ldyBVaW50OEFycmF5KGFjdHVhbC5idWZmZXIpLFxuICAgICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KGV4cGVjdGVkLmJ1ZmZlcikpID09PSAwO1xuXG4gIC8vIDcuNSBGb3IgYWxsIG90aGVyIE9iamVjdCBwYWlycywgaW5jbHVkaW5nIEFycmF5IG9iamVjdHMsIGVxdWl2YWxlbmNlIGlzXG4gIC8vIGRldGVybWluZWQgYnkgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChhcyB2ZXJpZmllZFxuICAvLyB3aXRoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCksIHRoZSBzYW1lIHNldCBvZiBrZXlzXG4gIC8vIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLCBlcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnlcbiAgLy8gY29ycmVzcG9uZGluZyBrZXksIGFuZCBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuIE5vdGU6IHRoaXNcbiAgLy8gYWNjb3VudHMgZm9yIGJvdGggbmFtZWQgYW5kIGluZGV4ZWQgcHJvcGVydGllcyBvbiBBcnJheXMuXG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYWN0dWFsKSAhPT0gaXNCdWZmZXIoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIG1lbW9zID0gbWVtb3MgfHwge2FjdHVhbDogW10sIGV4cGVjdGVkOiBbXX07XG5cbiAgICB2YXIgYWN0dWFsSW5kZXggPSBtZW1vcy5hY3R1YWwuaW5kZXhPZihhY3R1YWwpO1xuICAgIGlmIChhY3R1YWxJbmRleCAhPT0gLTEpIHtcbiAgICAgIGlmIChhY3R1YWxJbmRleCA9PT0gbWVtb3MuZXhwZWN0ZWQuaW5kZXhPZihleHBlY3RlZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWVtb3MuYWN0dWFsLnB1c2goYWN0dWFsKTtcbiAgICBtZW1vcy5leHBlY3RlZC5wdXNoKGV4cGVjdGVkKTtcblxuICAgIHJldHVybiBvYmpFcXVpdihhY3R1YWwsIGV4cGVjdGVkLCBzdHJpY3QsIG1lbW9zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyhvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xufVxuXG5mdW5jdGlvbiBvYmpFcXVpdihhLCBiLCBzdHJpY3QsIGFjdHVhbFZpc2l0ZWRPYmplY3RzKSB7XG4gIGlmIChhID09PSBudWxsIHx8IGEgPT09IHVuZGVmaW5lZCB8fCBiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG4gIC8vIGlmIG9uZSBpcyBhIHByaW1pdGl2ZSwgdGhlIG90aGVyIG11c3QgYmUgc2FtZVxuICBpZiAodXRpbC5pc1ByaW1pdGl2ZShhKSB8fCB1dGlsLmlzUHJpbWl0aXZlKGIpKVxuICAgIHJldHVybiBhID09PSBiO1xuICBpZiAoc3RyaWN0ICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSAhPT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGIpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgdmFyIGFJc0FyZ3MgPSBpc0FyZ3VtZW50cyhhKTtcbiAgdmFyIGJJc0FyZ3MgPSBpc0FyZ3VtZW50cyhiKTtcbiAgaWYgKChhSXNBcmdzICYmICFiSXNBcmdzKSB8fCAoIWFJc0FyZ3MgJiYgYklzQXJncykpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoYUlzQXJncykge1xuICAgIGEgPSBwU2xpY2UuY2FsbChhKTtcbiAgICBiID0gcFNsaWNlLmNhbGwoYik7XG4gICAgcmV0dXJuIF9kZWVwRXF1YWwoYSwgYiwgc3RyaWN0KTtcbiAgfVxuICB2YXIga2EgPSBvYmplY3RLZXlzKGEpO1xuICB2YXIga2IgPSBvYmplY3RLZXlzKGIpO1xuICB2YXIga2V5LCBpO1xuICAvLyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGtleXMgaW5jb3Jwb3JhdGVzXG4gIC8vIGhhc093blByb3BlcnR5KVxuICBpZiAoa2EubGVuZ3RoICE9PSBrYi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvL3RoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy9+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPT0ga2JbaV0pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy9lcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnkgY29ycmVzcG9uZGluZyBrZXksIGFuZFxuICAvL35+fnBvc3NpYmx5IGV4cGVuc2l2ZSBkZWVwIHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBrZXkgPSBrYVtpXTtcbiAgICBpZiAoIV9kZWVwRXF1YWwoYVtrZXldLCBiW2tleV0sIHN0cmljdCwgYWN0dWFsVmlzaXRlZE9iamVjdHMpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyA4LiBUaGUgbm9uLWVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBmb3IgYW55IGRlZXAgaW5lcXVhbGl0eS5cbi8vIGFzc2VydC5ub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90RGVlcEVxdWFsID0gZnVuY3Rpb24gbm90RGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgZmFsc2UpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnbm90RGVlcEVxdWFsJywgYXNzZXJ0Lm5vdERlZXBFcXVhbCk7XG4gIH1cbn07XG5cbmFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWwgPSBub3REZWVwU3RyaWN0RXF1YWw7XG5mdW5jdGlvbiBub3REZWVwU3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCB0cnVlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ25vdERlZXBTdHJpY3RFcXVhbCcsIG5vdERlZXBTdHJpY3RFcXVhbCk7XG4gIH1cbn1cblxuXG4vLyA5LiBUaGUgc3RyaWN0IGVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBzdHJpY3QgZXF1YWxpdHksIGFzIGRldGVybWluZWQgYnkgPT09LlxuLy8gYXNzZXJ0LnN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LnN0cmljdEVxdWFsID0gZnVuY3Rpb24gc3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJz09PScsIGFzc2VydC5zdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbi8vIDEwLiBUaGUgc3RyaWN0IG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHN0cmljdCBpbmVxdWFsaXR5LCBhc1xuLy8gZGV0ZXJtaW5lZCBieSAhPT0uICBhc3NlcnQubm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90U3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnIT09JywgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkge1xuICBpZiAoIWFjdHVhbCB8fCAhZXhwZWN0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGV4cGVjdGVkKSA9PSAnW29iamVjdCBSZWdFeHBdJykge1xuICAgIHJldHVybiBleHBlY3RlZC50ZXN0KGFjdHVhbCk7XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSWdub3JlLiAgVGhlIGluc3RhbmNlb2YgY2hlY2sgZG9lc24ndCB3b3JrIGZvciBhcnJvdyBmdW5jdGlvbnMuXG4gIH1cblxuICBpZiAoRXJyb3IuaXNQcm90b3R5cGVPZihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZXhwZWN0ZWQuY2FsbCh7fSwgYWN0dWFsKSA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gX3RyeUJsb2NrKGJsb2NrKSB7XG4gIHZhciBlcnJvcjtcbiAgdHJ5IHtcbiAgICBibG9jaygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyb3IgPSBlO1xuICB9XG4gIHJldHVybiBlcnJvcjtcbn1cblxuZnVuY3Rpb24gX3Rocm93cyhzaG91bGRUaHJvdywgYmxvY2ssIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIHZhciBhY3R1YWw7XG5cbiAgaWYgKHR5cGVvZiBibG9jayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYmxvY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXhwZWN0ZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgbWVzc2FnZSA9IGV4cGVjdGVkO1xuICAgIGV4cGVjdGVkID0gbnVsbDtcbiAgfVxuXG4gIGFjdHVhbCA9IF90cnlCbG9jayhibG9jayk7XG5cbiAgbWVzc2FnZSA9IChleHBlY3RlZCAmJiBleHBlY3RlZC5uYW1lID8gJyAoJyArIGV4cGVjdGVkLm5hbWUgKyAnKS4nIDogJy4nKSArXG4gICAgICAgICAgICAobWVzc2FnZSA/ICcgJyArIG1lc3NhZ2UgOiAnLicpO1xuXG4gIGlmIChzaG91bGRUaHJvdyAmJiAhYWN0dWFsKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnTWlzc2luZyBleHBlY3RlZCBleGNlcHRpb24nICsgbWVzc2FnZSk7XG4gIH1cblxuICB2YXIgdXNlclByb3ZpZGVkTWVzc2FnZSA9IHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJztcbiAgdmFyIGlzVW53YW50ZWRFeGNlcHRpb24gPSAhc2hvdWxkVGhyb3cgJiYgdXRpbC5pc0Vycm9yKGFjdHVhbCk7XG4gIHZhciBpc1VuZXhwZWN0ZWRFeGNlcHRpb24gPSAhc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmICFleHBlY3RlZDtcblxuICBpZiAoKGlzVW53YW50ZWRFeGNlcHRpb24gJiZcbiAgICAgIHVzZXJQcm92aWRlZE1lc3NhZ2UgJiZcbiAgICAgIGV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpKSB8fFxuICAgICAgaXNVbmV4cGVjdGVkRXhjZXB0aW9uKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnR290IHVud2FudGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIGlmICgoc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmIGV4cGVjdGVkICYmXG4gICAgICAhZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkpIHx8ICghc2hvdWxkVGhyb3cgJiYgYWN0dWFsKSkge1xuICAgIHRocm93IGFjdHVhbDtcbiAgfVxufVxuXG4vLyAxMS4gRXhwZWN0ZWQgdG8gdGhyb3cgYW4gZXJyb3I6XG4vLyBhc3NlcnQudGhyb3dzKGJsb2NrLCBFcnJvcl9vcHQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LnRocm93cyA9IGZ1bmN0aW9uKGJsb2NrLCAvKm9wdGlvbmFsKi9lcnJvciwgLypvcHRpb25hbCovbWVzc2FnZSkge1xuICBfdGhyb3dzKHRydWUsIGJsb2NrLCBlcnJvciwgbWVzc2FnZSk7XG59O1xuXG4vLyBFWFRFTlNJT04hIFRoaXMgaXMgYW5ub3lpbmcgdG8gd3JpdGUgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbmFzc2VydC5kb2VzTm90VGhyb3cgPSBmdW5jdGlvbihibG9jaywgLypvcHRpb25hbCovZXJyb3IsIC8qb3B0aW9uYWwqL21lc3NhZ2UpIHtcbiAgX3Rocm93cyhmYWxzZSwgYmxvY2ssIGVycm9yLCBtZXNzYWdlKTtcbn07XG5cbmFzc2VydC5pZkVycm9yID0gZnVuY3Rpb24oZXJyKSB7IGlmIChlcnIpIHRocm93IGVycjsgfTtcblxuLy8gRXhwb3NlIGEgc3RyaWN0IG9ubHkgdmFyaWFudCBvZiBhc3NlcnRcbmZ1bmN0aW9uIHN0cmljdCh2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAoIXZhbHVlKSBmYWlsKHZhbHVlLCB0cnVlLCBtZXNzYWdlLCAnPT0nLCBzdHJpY3QpO1xufVxuYXNzZXJ0LnN0cmljdCA9IG9iamVjdEFzc2lnbihzdHJpY3QsIGFzc2VydCwge1xuICBlcXVhbDogYXNzZXJ0LnN0cmljdEVxdWFsLFxuICBkZWVwRXF1YWw6IGFzc2VydC5kZWVwU3RyaWN0RXF1YWwsXG4gIG5vdEVxdWFsOiBhc3NlcnQubm90U3RyaWN0RXF1YWwsXG4gIG5vdERlZXBFcXVhbDogYXNzZXJ0Lm5vdERlZXBTdHJpY3RFcXVhbFxufSk7XG5hc3NlcnQuc3RyaWN0LnN0cmljdCA9IGFzc2VydC5zdHJpY3Q7XG5cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKGhhc093bi5jYWxsKG9iaiwga2V5KSkga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgfHxcbiAgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmopIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgdmFyIGRlc2NyaXB0b3JzID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZXNjcmlwdG9yc1trZXlzW2ldXSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXlzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0b3JzO1xuICB9O1xuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRpbmcgdGhpbmdzIGluIHRoZSBwcm9jZXNzIG9mIHN0YXJ0aW5nIHVwLlxuICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCcuL3N1cHBvcnQvaXNCdWZmZXInKTtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbigpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKSk7XG59O1xuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5leHBvcnRzLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5fZXh0ZW5kID0gZnVuY3Rpb24ob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn07XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG5cbnZhciBrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyA/IFN5bWJvbCgndXRpbC5wcm9taXNpZnkuY3VzdG9tJykgOiB1bmRlZmluZWQ7XG5cbmV4cG9ydHMucHJvbWlzaWZ5ID0gZnVuY3Rpb24gcHJvbWlzaWZ5KG9yaWdpbmFsKSB7XG4gIGlmICh0eXBlb2Ygb3JpZ2luYWwgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwib3JpZ2luYWxcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24nKTtcblxuICBpZiAoa0N1c3RvbVByb21pc2lmaWVkU3ltYm9sICYmIG9yaWdpbmFsW2tDdXN0b21Qcm9taXNpZmllZFN5bWJvbF0pIHtcbiAgICB2YXIgZm4gPSBvcmlnaW5hbFtrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2xdO1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInV0aWwucHJvbWlzaWZ5LmN1c3RvbVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbicpO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sIGtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCwge1xuICAgICAgdmFsdWU6IGZuLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICBmdW5jdGlvbiBmbigpIHtcbiAgICB2YXIgcHJvbWlzZVJlc29sdmUsIHByb21pc2VSZWplY3Q7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBwcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICBwcm9taXNlUmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgfVxuICAgIGFyZ3MucHVzaChmdW5jdGlvbiAoZXJyLCB2YWx1ZSkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBwcm9taXNlUmVqZWN0KGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9taXNlUmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgb3JpZ2luYWwuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBwcm9taXNlUmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZm4sIE9iamVjdC5nZXRQcm90b3R5cGVPZihvcmlnaW5hbCkpO1xuXG4gIGlmIChrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2wpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwga0N1c3RvbVByb21pc2lmaWVkU3ltYm9sLCB7XG4gICAgdmFsdWU6IGZuLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhcbiAgICBmbixcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9yaWdpbmFsKVxuICApO1xufVxuXG5leHBvcnRzLnByb21pc2lmeS5jdXN0b20gPSBrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2xcblxuZnVuY3Rpb24gY2FsbGJhY2tpZnlPblJlamVjdGVkKHJlYXNvbiwgY2IpIHtcbiAgLy8gYCFyZWFzb25gIGd1YXJkIGluc3BpcmVkIGJ5IGJsdWViaXJkIChSZWY6IGh0dHBzOi8vZ29vLmdsL3Q1SVM2TSkuXG4gIC8vIEJlY2F1c2UgYG51bGxgIGlzIGEgc3BlY2lhbCBlcnJvciB2YWx1ZSBpbiBjYWxsYmFja3Mgd2hpY2ggbWVhbnMgXCJubyBlcnJvclxuICAvLyBvY2N1cnJlZFwiLCB3ZSBlcnJvci13cmFwIHNvIHRoZSBjYWxsYmFjayBjb25zdW1lciBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlblxuICAvLyBcInRoZSBwcm9taXNlIHJlamVjdGVkIHdpdGggbnVsbFwiIG9yIFwidGhlIHByb21pc2UgZnVsZmlsbGVkIHdpdGggdW5kZWZpbmVkXCIuXG4gIGlmICghcmVhc29uKSB7XG4gICAgdmFyIG5ld1JlYXNvbiA9IG5ldyBFcnJvcignUHJvbWlzZSB3YXMgcmVqZWN0ZWQgd2l0aCBhIGZhbHN5IHZhbHVlJyk7XG4gICAgbmV3UmVhc29uLnJlYXNvbiA9IHJlYXNvbjtcbiAgICByZWFzb24gPSBuZXdSZWFzb247XG4gIH1cbiAgcmV0dXJuIGNiKHJlYXNvbik7XG59XG5cbmZ1bmN0aW9uIGNhbGxiYWNraWZ5KG9yaWdpbmFsKSB7XG4gIGlmICh0eXBlb2Ygb3JpZ2luYWwgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJvcmlnaW5hbFwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbicpO1xuICB9XG5cbiAgLy8gV2UgRE8gTk9UIHJldHVybiB0aGUgcHJvbWlzZSBhcyBpdCBnaXZlcyB0aGUgdXNlciBhIGZhbHNlIHNlbnNlIHRoYXRcbiAgLy8gdGhlIHByb21pc2UgaXMgYWN0dWFsbHkgc29tZWhvdyByZWxhdGVkIHRvIHRoZSBjYWxsYmFjaydzIGV4ZWN1dGlvblxuICAvLyBhbmQgdGhhdCB0aGUgY2FsbGJhY2sgdGhyb3dpbmcgd2lsbCByZWplY3QgdGhlIHByb21pc2UuXG4gIGZ1bmN0aW9uIGNhbGxiYWNraWZpZWQoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgfVxuXG4gICAgdmFyIG1heWJlQ2IgPSBhcmdzLnBvcCgpO1xuICAgIGlmICh0eXBlb2YgbWF5YmVDYiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxhc3QgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY2IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBtYXliZUNiLmFwcGx5KHNlbGYsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICAvLyBJbiB0cnVlIG5vZGUgc3R5bGUgd2UgcHJvY2VzcyB0aGUgY2FsbGJhY2sgb24gYG5leHRUaWNrYCB3aXRoIGFsbCB0aGVcbiAgICAvLyBpbXBsaWNhdGlvbnMgKHN0YWNrLCBgdW5jYXVnaHRFeGNlcHRpb25gLCBgYXN5bmNfaG9va3NgKVxuICAgIG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpXG4gICAgICAudGhlbihmdW5jdGlvbihyZXQpIHsgcHJvY2Vzcy5uZXh0VGljayhjYiwgbnVsbCwgcmV0KSB9LFxuICAgICAgICAgICAgZnVuY3Rpb24ocmVqKSB7IHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2tpZnlPblJlamVjdGVkLCByZWosIGNiKSB9KTtcbiAgfVxuXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihjYWxsYmFja2lmaWVkLCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY2FsbGJhY2tpZmllZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvcmlnaW5hbCkpO1xuICByZXR1cm4gY2FsbGJhY2tpZmllZDtcbn1cbmV4cG9ydHMuY2FsbGJhY2tpZnkgPSBjYWxsYmFja2lmeTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gTm90ZTogYWRsZXIzMiB0YWtlcyAxMiUgZm9yIGxldmVsIDAgYW5kIDIlIGZvciBsZXZlbCA2LlxuLy8gSXQgaXNuJ3Qgd29ydGggaXQgdG8gbWFrZSBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgYXMgaW4gb3JpZ2luYWwuXG4vLyBTbWFsbCBzaXplIGlzIHByZWZlcmFibGUuXG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuZnVuY3Rpb24gYWRsZXIzMihhZGxlciwgYnVmLCBsZW4sIHBvcykge1xuICB2YXIgczEgPSAoYWRsZXIgJiAweGZmZmYpIHwwLFxuICAgICAgczIgPSAoKGFkbGVyID4+PiAxNikgJiAweGZmZmYpIHwwLFxuICAgICAgbiA9IDA7XG5cbiAgd2hpbGUgKGxlbiAhPT0gMCkge1xuICAgIC8vIFNldCBsaW1pdCB+IHR3aWNlIGxlc3MgdGhhbiA1NTUyLCB0byBrZWVwXG4gICAgLy8gczIgaW4gMzEtYml0cywgYmVjYXVzZSB3ZSBmb3JjZSBzaWduZWQgaW50cy5cbiAgICAvLyBpbiBvdGhlciBjYXNlICU9IHdpbGwgZmFpbC5cbiAgICBuID0gbGVuID4gMjAwMCA/IDIwMDAgOiBsZW47XG4gICAgbGVuIC09IG47XG5cbiAgICBkbyB7XG4gICAgICBzMSA9IChzMSArIGJ1Zltwb3MrK10pIHwwO1xuICAgICAgczIgPSAoczIgKyBzMSkgfDA7XG4gICAgfSB3aGlsZSAoLS1uKTtcblxuICAgIHMxICU9IDY1NTIxO1xuICAgIHMyICU9IDY1NTIxO1xuICB9XG5cbiAgcmV0dXJuIChzMSB8IChzMiA8PCAxNikpIHwwO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gYWRsZXIzMjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gTm90ZTogd2UgY2FuJ3QgZ2V0IHNpZ25pZmljYW50IHNwZWVkIGJvb3N0IGhlcmUuXG4vLyBTbyB3cml0ZSBjb2RlIHRvIG1pbmltaXplIHNpemUgLSBubyBwcmVnZW5lcmF0ZWQgdGFibGVzXG4vLyBhbmQgYXJyYXkgdG9vbHMgZGVwZW5kZW5jaWVzLlxuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbi8vIFVzZSBvcmRpbmFyeSBhcnJheSwgc2luY2UgdW50eXBlZCBtYWtlcyBubyBib29zdCBoZXJlXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gIHZhciBjLCB0YWJsZSA9IFtdO1xuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgMjU2OyBuKyspIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IDg7IGsrKykge1xuICAgICAgYyA9ICgoYyAmIDEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICB9XG4gICAgdGFibGVbbl0gPSBjO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciB0ID0gY3JjVGFibGUsXG4gICAgICBlbmQgPSBwb3MgKyBsZW47XG5cbiAgY3JjIF49IC0xO1xuXG4gIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKykge1xuICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gYnVmW2ldKSAmIDB4RkZdO1xuICB9XG5cbiAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjcmMzMjtcbiIsIi8vaW1wb3J0IHsgZnMsIHVudGlsZGlmeSB9IGZyb20gJy4uL3V0aWxzL2dldFN0cmVhbSdcbmNvbnN0IGdzID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0U3RyZWFtJyk7XG5jb25zdCBmcyA9IGdzLmZzO1xuY29uc3QgdW50aWxkaWZ5ID0gZ3MudW50aWxkaWZ5O1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR3ppcFxuICogQGRlc2MgR2l6cGVkIHdhcmMgbWFnaWMgbnVtOlxuICogLSBCdWZmZXIuZnJvbSgnMWY4YjA4JywgJ2hleCcpXG4gKiAtIFVpbnQ4QXJyYXkgWyAzMSwgMTM5LCA4IF1cbiAqIE5vdCBnemlwZWQgd2FyYyBtYWdpYyBudW06XG4gKiAtIFVpbnQ4QXJyYXkgWyA4NywgNjUsIDgyIF1cbiAqIEB0eXBlIHtCdWZmZXJ9XG4gKi9cbmNvbnN0IGd6aXBNYWdpY051bSA9IEJ1ZmZlci5mcm9tKCcxZjhiMDgnLCAnaGV4JylcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfSBsZW5ndGggb2YgdGhlIGd6aXAgbWFnaWMgbnVtYmVyIF9oZWFkZXIgMyBieXRlc1xuICovXG5jb25zdCBnemlwTWFnaWNOdW1MZW4gPSBnemlwTWFnaWNOdW0ubGVuZ3RoXG5cbi8qKlxuICogVXRpbGl0eSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBtZWFucyB0byBkZXRlY3QgaWYgYSBmaWxlIGlzIGd6aXBwZWQgb3Igbm90XG4gKi9cbmNsYXNzIEd6aXBEZXRlY3RvciB7XG4gIC8qKlxuICAgKiBAZGVzYyBEZXRlcm1pbmVzIGlmIGEgZmlsZSBpcyBnemlwcGVkIG9yIG5vdCBieSByZWFkaW5nIGl0cyB0aGUgbWFnaWMgbnVtYmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCAtIHBhdGggdG8gdGhlIGZpbGUgdG8gZGV0ZWN0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBmaWxlIGlzIGd6aXBwZWQgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgZmlsZVBhdGggaXMgbnVsbCBvciB1bmRlZmluZWQgb3IgaWYgYW5vdGhlciBlcnJvciBvY2N1cnJlZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGlzR3ppcHBlZCAoZmlsZVBhdGgpIHtcbiAgICBpZiAoZmlsZVBhdGggPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZmlsZVBhdGggcGF0aCBpcyAke2ZpbGVQYXRofWApXG4gICAgfVxuICAgIGZpbGVQYXRoID0gdW50aWxkaWZ5KGZpbGVQYXRoKVxuICAgIGNvbnN0IGZkID0gYXdhaXQgZnMub3BlbihmaWxlUGF0aCwgJ3InKVxuICAgIGNvbnN0IGZpbGxNZSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgzKVxuICAgIGF3YWl0IGZzLnJlYWQoZmQsIGZpbGxNZSwgMCwgMywgdW5kZWZpbmVkKVxuICAgIGF3YWl0IGZzLmNsb3NlKGZkKVxuICAgIGxldCBpID0gMFxuICAgIGxldCBpc0d6aXBwZWQgPSB0cnVlXG4gICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiBhcyB3ZSBjcmVhdGUgdGhlIFVuaXQ4QXJyYXkgdG8gYmUgc2l6ZSAzXG4gICAgLy8gYnV0IGp1c3QgaW4gY2FzZVxuICAgIGlmIChnemlwTWFnaWNOdW1MZW4gIT09IGZpbGxNZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBmb3IgKDsgaSA8IGd6aXBNYWdpY051bUxlbjsgKytpKSB7XG4gICAgICBpZiAoZ3ppcE1hZ2ljTnVtW2ldICE9PSBmaWxsTWVbaV0pIHtcbiAgICAgICAgaXNHemlwcGVkID0gZmFsc2VcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlzR3ppcHBlZFxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFN5bmNocm9ub3VzIHZlcnNpb24gb2Yge0BsaW5rIGlzR3ppcHBlZH1cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoIC0gcGF0aCB0byB0aGUgZmlsZSB0byBkZXRlY3RcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZmlsZSBpcyBnemlwcGVkIGZhbHNlIG90aGVyd2lzZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGZpbGVQYXRoIGlzIG51bGwgb3IgdW5kZWZpbmVkIG9yIGlmIGFub3RoZXIgZXJyb3Igb2NjdXJyZWRcbiAgICovXG4gIHN0YXRpYyBpc0d6aXBwZWRTeW5jIChmaWxlUGF0aCkge1xuICAgIGlmIChmaWxlUGF0aCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBmaWxlUGF0aCBwYXRoIGlzICR7ZmlsZVBhdGh9YClcbiAgICB9XG4gICAgZmlsZVBhdGggPSB1bnRpbGRpZnkoZmlsZVBhdGgpXG4gICAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhmaWxlUGF0aCwgJ3InKVxuICAgIGNvbnN0IGZpbGxNZSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgzKVxuICAgIGZzLnJlYWRTeW5jKGZkLCBmaWxsTWUsIDAsIDMsIHVuZGVmaW5lZClcbiAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgbGV0IGkgPSAwXG4gICAgbGV0IGlzR3ppcHBlZCA9IHRydWVcbiAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuIGFzIHdlIGNyZWF0ZSB0aGUgVW5pdDhBcnJheSB0byBiZSBzaXplIDNcbiAgICAvLyBidXQganVzdCBpbiBjYXNlXG4gICAgaWYgKGd6aXBNYWdpY051bUxlbiAhPT0gZmlsbE1lLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGZvciAoOyBpIDwgZ3ppcE1hZ2ljTnVtTGVuOyArK2kpIHtcbiAgICAgIGlmIChnemlwTWFnaWNOdW1baV0gIT09IGZpbGxNZVtpXSkge1xuICAgICAgICBpc0d6aXBwZWQgPSBmYWxzZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNHemlwcGVkXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7R3ppcERldGVjdG9yfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IEd6aXBEZXRlY3RvclxuIiwidmFyIHJuZyA9IHJlcXVpcmUoJy4vbGliL3JuZycpO1xudmFyIGJ5dGVzVG9VdWlkID0gcmVxdWlyZSgnLi9saWIvYnl0ZXNUb1V1aWQnKTtcblxuLy8gKipgdjEoKWAgLSBHZW5lcmF0ZSB0aW1lLWJhc2VkIFVVSUQqKlxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9MaW9zSy9VVUlELmpzXG4vLyBhbmQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3V1aWQuaHRtbFxuXG52YXIgX25vZGVJZDtcbnZhciBfY2xvY2tzZXE7XG5cbi8vIFByZXZpb3VzIHV1aWQgY3JlYXRpb24gdGltZVxudmFyIF9sYXN0TVNlY3MgPSAwO1xudmFyIF9sYXN0TlNlY3MgPSAwO1xuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Jyb29mYS9ub2RlLXV1aWQgZm9yIEFQSSBkZXRhaWxzXG5mdW5jdGlvbiB2MShvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICB2YXIgaSA9IGJ1ZiAmJiBvZmZzZXQgfHwgMDtcbiAgdmFyIGIgPSBidWYgfHwgW107XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBub2RlID0gb3B0aW9ucy5ub2RlIHx8IF9ub2RlSWQ7XG4gIHZhciBjbG9ja3NlcSA9IG9wdGlvbnMuY2xvY2tzZXEgIT09IHVuZGVmaW5lZCA/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+fVxuICAgKi9cbiAgdXJsICgpIHtcbiAgICBsZXQgdXJscyA9IEFycmF5LmZyb20odGhpcy5fcmVxcy5rZXlzKCkpXG4gICAgaWYgKHVybHMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdXJsc1swXVxuICAgIH1cbiAgICByZXR1cm4gdXJsc1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEl0ZXJhdGUgb3ZlciB0aGUgUmVxdWVzdEluZm8jdXJsIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ2FwdHVyZWRSZXF1ZXN0cyNyZXF1ZXN0SWRcbiAgICogQHJldHVybiB7SXRlcmF0b3I8c3RyaW5nPn1cbiAgICovXG4gIGtleXMgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXFzLmtleXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEl0ZXJhdGUgb3ZlciB0aGUgQ0RQUmVxdWVzdEluZm8gYXNzb2NpYXRlZCB3aXRoIHRoZSBDYXB0dXJlZFJlcXVlc3RzI3JlcXVlc3RJZFxuICAgKiBAcmV0dXJuIHtJdGVyYXRvcjxDRFBSZXF1ZXN0SW5mbz59XG4gICAqL1xuICB2YWx1ZXMgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXFzLnZhbHVlcygpXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7Q2FwdHVyZWRSZXF1ZXN0fVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IENhcHR1cmVkUmVxdWVzdFxuIiwiJ3VzZSBzdHJpY3QnXG5jb25zdCB7XG4gIFdBUkNTdHJlYW1UcmFuc2Zvcm0sXG4gIEF1dG9XQVJDUGFyc2VyLFxuICBXQVJDR3pQYXJzZXIsXG4gIFdBUkNQYXJzZXJcbn0gPSByZXF1aXJlKCcuL2xpYi9wYXJzZXJzJylcblxuY29uc3Qge1xuICBDUklFeHRyYVdBUkNHZW5lcmF0b3IsXG4gIEVsZWN0cm9uV0FSQ1dyaXRlcixcbiAgUHVwcGV0ZWVyQ0RQV0FSQ0dlbmVyYXRvcixcbiAgUHVwcGV0ZWVyV0FSQ0dlbmVyYXRvcixcbiAgUmVtb3RlQ2hyb21lV0FSQ1dyaXRlcixcbiAgV0FSQ1dyaXRlckJhc2Vcbn0gPSByZXF1aXJlKCcuL2xpYi93cml0ZXJzJylcblxuY29uc3Qge1xuICBDUklFeHRyYUNhcHR1cmVyLFxuICBFbGVjdHJvbkNhcHR1cmVyLFxuICBQdXBwZXRlZXJDYXB0dXJlcixcbiAgUHVwcGV0ZWVyQ0RQQ2FwdHVyZXIsXG4gIFJlbW90ZUNocm9tZUNhcHR1cmVyLFxuICBSZXF1ZXN0SGFuZGxlclxufSA9IHJlcXVpcmUoJy4vbGliL3JlcXVlc3RDYXB0dXJlcnMnKVxuXG4vKipcbiAqIEB0eXBlIHtBdXRvV0FSQ1BhcnNlcn1cbiAqL1xuZXhwb3J0cy5BdXRvV0FSQ1BhcnNlciA9IEF1dG9XQVJDUGFyc2VyXG5cbi8qKlxuICogQHR5cGUge0NSSUV4dHJhUmVxdWVzdENhcHR1cmVyfVxuICovXG5leHBvcnRzLkNSSUV4dHJhQ2FwdHVyZXIgPSBDUklFeHRyYUNhcHR1cmVyXG5cbi8qKlxuICogQHR5cGUge0NSSUV4dHJhV0FSQ0dlbmVyYXRvcn1cbiAqL1xuZXhwb3J0cy5DUklFeHRyYVdBUkNHZW5lcmF0b3IgPSBDUklFeHRyYVdBUkNHZW5lcmF0b3JcblxuLyoqXG4gKiBAdHlwZSB7RWxlY3Ryb25SZXF1ZXN0Q2FwdHVyZXJ9XG4gKi9cbmV4cG9ydHMuRWxlY3Ryb25DYXB0dXJlciA9IEVsZWN0cm9uQ2FwdHVyZXJcblxuLyoqXG4gKiBAdHlwZSB7RWxlY3Ryb25XQVJDR2VuZXJhdG9yfVxuICovXG5leHBvcnRzLkVsZWN0cm9uV0FSQ1dyaXRlciA9IEVsZWN0cm9uV0FSQ1dyaXRlclxuXG4vKipcbiAqIEB0eXBlIHtQdXBwZXRlZXJDRFBSZXF1ZXN0Q2FwdHVyZXJ9XG4gKi9cbmV4cG9ydHMuUHVwcGV0ZWVyQ0RQQ2FwdHVyZXIgPSBQdXBwZXRlZXJDRFBDYXB0dXJlclxuXG4vKipcbiAqIEB0eXBlIHtQdXBwZXRlZXJDRFBXQVJDR2VuZXJhdG9yfVxuICovXG5leHBvcnRzLlB1cHBldGVlckNEUFdBUkNHZW5lcmF0b3IgPSBQdXBwZXRlZXJDRFBXQVJDR2VuZXJhdG9yXG5cbi8qKlxuICogQHR5cGUge1B1cHBldGVlclJlcXVlc3RDYXB0dXJlcn1cbiAqL1xuZXhwb3J0cy5QdXBwZXRlZXJDYXB0dXJlciA9IFB1cHBldGVlckNhcHR1cmVyXG5cbi8qKlxuICogQHR5cGUge1B1cHBldGVlcldBUkNHZW5lcmF0b3J9XG4gKi9cbmV4cG9ydHMuUHVwcGV0ZWVyV0FSQ0dlbmVyYXRvciA9IFB1cHBldGVlcldBUkNHZW5lcmF0b3JcblxuLyoqXG4gKiBAdHlwZSB7UmVtb3RlQ2hyb21lUmVxdWVzdENhcHR1cmVyfVxuICovXG5leHBvcnRzLlJlbW90ZUNocm9tZUNhcHR1cmVyID0gUmVtb3RlQ2hyb21lQ2FwdHVyZXJcblxuLyoqXG4gKiBAdHlwZSB7UmVtb3RlQ2hyb21lV0FSQ0dlbmVyYXRvcn1cbiAqL1xuZXhwb3J0cy5SZW1vdGVDaHJvbWVXQVJDV3JpdGVyID0gUmVtb3RlQ2hyb21lV0FSQ1dyaXRlclxuXG4vKipcbiAqIEB0eXBlIHtSZXF1ZXN0SGFuZGxlcn1cbiAqL1xuZXhwb3J0cy5SZXF1ZXN0SGFuZGxlciA9IFJlcXVlc3RIYW5kbGVyXG5cbi8qKlxuICogQHR5cGUge1dBUkNHelBhcnNlcn1cbiAqL1xuZXhwb3J0cy5XQVJDR3pQYXJzZXIgPSBXQVJDR3pQYXJzZXJcblxuLyoqXG4gKiBAdHlwZSB7V0FSQ1BhcnNlcn1cbiAqL1xuZXhwb3J0cy5XQVJDUGFyc2VyID0gV0FSQ1BhcnNlclxuXG4vKipcbiAqIEB0eXBlIHtXQVJDU3RyZWFtVHJhbnNmb3JtfVxuICovXG5leHBvcnRzLldBUkNTdHJlYW1UcmFuc2Zvcm0gPSBXQVJDU3RyZWFtVHJhbnNmb3JtXG5cbi8qKlxuICogQHR5cGUge1dBUkNXcml0ZXJCYXNlfVxuICovXG5leHBvcnRzLldBUkNXcml0ZXJCYXNlID0gV0FSQ1dyaXRlckJhc2VcblxuLyoqXG4gKiBAdHlwZSB7UmVxdWVzdExpYldBUkNHZW5lcmF0b3J9XG4gKi9cbmV4cG9ydHMuUmVxdWVzdExpYldBUkNXcml0ZXIgPSByZXF1aXJlKCcuL2xpYi93cml0ZXJzL3JlcXVlc3RMaWInKVxuXG5pZiAocmVxdWlyZSgnLi9saWIvcGFyc2Vycy9fY2FuVXNlUmVjb3JkSXRlcmF0b3InKSkge1xuICAvKipcbiAgICogQHR5cGUge2Z1bmN0aW9uKFJlYWRTdHJlYW0pOiBBc3luY0l0ZXJhdG9yPFdBUkNSZWNvcmQ+fVxuICAgKi9cbiAgZXhwb3J0cy5yZWNvcmRJdGVyYXRvciA9IHJlcXVpcmUoJy4vbGliL3BhcnNlcnMvcmVjb3JkdGVyYXRvcicpXG59XG5cbmV4cG9ydHMuc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbmV4cG9ydHMuemxpYiA9IHJlcXVpcmUoJ3psaWInKVxuXG4iLCIvKipcbiAqIEB0eXBlIHtBdXRvV0FSQ1BhcnNlcn1cbiAqL1xuZXhwb3J0cy5BdXRvV0FSQ1BhcnNlciA9IHJlcXVpcmUoJy4vYXV0b1dBUkNQYXJzZXInKVxuXG4vKipcbiAqIEB0eXBlIHtHemlwRGV0ZWN0b3J9XG4gKi9cbmV4cG9ydHMuR3ppcERldGVjdG9yID0gcmVxdWlyZSgnLi9nemlwRGV0ZWN0b3InKVxuXG4vKipcbiAqIEB0eXBlIHtXQVJDR3pQYXJzZXJ9XG4gKi9cbmV4cG9ydHMuV0FSQ0d6UGFyc2VyID0gcmVxdWlyZSgnLi93YXJjR3pQYXJzZXInKVxuXG4vKipcbiAqIEB0eXBlIHtXQVJDUGFyc2VyfVxuICovXG5leHBvcnRzLldBUkNQYXJzZXIgPSByZXF1aXJlKCcuL3dhcmNQYXJzZXInKVxuXG4vKipcbiAqIEB0eXBlIHtXQVJDU3RyZWFtVHJhbnNmb3JtfVxuICovXG5leHBvcnRzLldBUkNTdHJlYW1UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL3dhcmNTdHJlYW1UcmFuc2Zvcm0nKVxuXG5pZiAocmVxdWlyZSgnLi9fY2FuVXNlUmVjb3JkSXRlcmF0b3InKSkge1xuICAvKipcbiAgICogQHR5cGUge2Z1bmN0aW9uKHdhcmNTdHJlYW06IFJlYWRTdHJlYW18R3VuemlwKTogQXN5bmNJdGVyYXRvcjxXQVJDUmVjb3JkPn1cbiAgICovXG4gIGV4cG9ydHMucmVjb3JkSXRlcmF0b3IgPSByZXF1aXJlKCcuL3JlY29yZHRlcmF0b3InKVxufVxuIiwiY29uc3QgZ2V0U3RyZWFtID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0U3RyZWFtJykuZ2V0U3RyZWFtXG5jb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJylcbmNvbnN0IFdBUkNTdHJlYW1UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL3dhcmNTdHJlYW1UcmFuc2Zvcm0nKVxuY29uc3QgR3ppcERldGVjdG9yID0gcmVxdWlyZSgnLi9nemlwRGV0ZWN0b3InKVxuY29uc3QgY2FuVXNlUmVjb3JkSXRlcmF0b3IgPSByZXF1aXJlKCcuL19jYW5Vc2VSZWNvcmRJdGVyYXRvcicpXG5cbi8qKlxuICogQGRlc2MgUGFyc2VzIGEgV0FSQyBmaWxlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0aW5nIGlmIGl0IGlzIGd6aXBwZWQuXG4gKiBAZXh0ZW5kcyB7RXZlbnRFbWl0dGVyfVxuICogQGV4YW1wbGVcbiAqICBjb25zdCBwYXJzZXIgPSBuZXcgQXV0b1dBUkNQYXJzZXIoJzxwYXRoLXRvLXdhcmNmaWxlPicpXG4gKiAgcGFyc2VyLm9uKCdyZWNvcmQnLCByZWNvcmQgPT4geyBjb25zb2xlLmxvZyhyZWNvcmQpIH0pXG4gKiAgcGFyc2VyLm9uKCdlcnJvcicsIGVycm9yID0+IHsgY29uc29sZS5lcnJvcihlcnJvcikgfSlcbiAqICBwYXJzZXIuc3RhcnQoKVxuICogQGV4YW1wbGVcbiAqICBjb25zdCBwYXJzZXIgPSBuZXcgQXV0b1dBUkNQYXJzZXIoKVxuICogIHBhcnNlci5vbigncmVjb3JkJywgcmVjb3JkID0+IHsgY29uc29sZS5sb2cocmVjb3JkKSB9KVxuICogIHBhcnNlci5vbignZXJyb3InLCBlcnJvciA9PiB7IGNvbnNvbGUuZXJyb3IoZXJyb3IpIH0pXG4gKiAgcGFyc2VyLnBhcnNlV0FSQygnPHBhdGgtdG8td2FyY2ZpbGU+JylcbiAqICBAZXhhbXBsZVxuICogIC8vIHJlcXVpcmVzIG5vZGUgPj0gMTBcbiAqICBmb3IgYXdhaXQgKGNvbnN0IHJlY29yZCBvZiBuZXcgQXV0b1dBUkNQYXJzZXIoJzxwYXRoLXRvLXdhcmNmaWxlPicpKSB7XG4gKiAgICBjb25zb2xlLmxvZyhyZWNvcmQpXG4gKiAgfVxuICovXG5jbGFzcyBBdXRvV0FSQ1BhcnNlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBAZGVzYyBDcmVhdGUgYSBuZXcgQXV0b1dBUkNQYXJzZXJcbiAgICogQHBhcmFtIHs/c3RyaW5nfSBbd3BdIC0gcGF0aCB0byB0aGUgd2FyYyBmaWxlIHRvIGJlIHBhcnNlZFxuICAgKi9cbiAgY29uc3RydWN0b3IgKHdwKSB7XG4gICAgc3VwZXIoKVxuICAgIC8qKlxuICAgICAqIEB0eXBlIHs/c3RyaW5nfSB0aGUgcGF0aCB0byB0aGUgV0FSQyBmaWxlIHRvIGJlIHBhcnNlZFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5fd3AgPSB3cFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59IGlzIHRoZSBwYXJzZXIgY3VycmVudGx5IHBhcnNpbmcgdGhlIFdBUkNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX3BhcnNpbmcgPSBmYWxzZVxuXG4gICAgdGhpcy5fb25SZWNvcmQgPSB0aGlzLl9vblJlY29yZC5iaW5kKHRoaXMpXG4gICAgdGhpcy5fb25FbmQgPSB0aGlzLl9vbkVuZC5iaW5kKHRoaXMpXG4gICAgdGhpcy5fb25FcnJvciA9IHRoaXMuX29uRXJyb3IuYmluZCh0aGlzKVxuXG4gICAgaWYgKGNhblVzZVJlY29yZEl0ZXJhdG9yKSB7XG4gICAgICBjb25zdCByZWNvcmRJdGVyYXRvciA9IHJlcXVpcmUoJy4vcmVjb3JkdGVyYXRvcicpXG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm5zIHtBc3luY0l0ZXJhdG9yPFdBUkNSZWNvcmQ+fVxuICAgICAgICovXG4gICAgICB0aGlzW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlY29yZEl0ZXJhdG9yKHRoaXMuX2dldFN0cmVhbSgpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBCZWdpbiBwYXJzaW5nIHRoZSBXQVJDIGZpbGUuIE9uY2UgdGhlIHN0YXJ0IG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdGhlIHBhcnNlciB3aWxsIGJlZ2luIGVtaXR0aW5nXG4gICAqIEBlbWl0cyB7cmVjb3JkfSBlbWl0dGVkIHdoZW4gdGhlIHBhcnNlciBoYXMgcGFyc2VkIGEgZnVsbCByZWNvcmQsIHRoZSBhcmd1bWVudCBzdXBwbGllZCB0byB0aGUgbGlzdGVuZXIgd2lsbCBiZSB0aGUgcGFyc2VkIHJlY29yZFxuICAgKiBAZW1pdHMge2RvbmV9IGVtaXR0ZWQgd2hlbiB0aGUgV0FSQyBmaWxlIGhhcyBiZWVuIGNvbXBsZXRlbHkgcGFyc2VkXG4gICAqIEBlbWl0cyB7ZXJyb3J9IGVtaXR0ZWQgaWYgYW4gZXhjZXB0aW9uIG9jY3VycywgdGhlIGFyZ3VtZW50IHN1cHBsaWVkIHRvIHRoZSBsaXN0ZW5lciB3aWxsIGJlIHRoZSBlcnJvciB0aGF0IG9jY3VycmVkLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSAgaWYgdGhlIHBhcnNlciBoYXMgYmVndW4gb3IgaXMgY3VycmVudGx5IHBhcnNpbmcgYSBXQVJDIGZpbGVcbiAgICogLSB0cnVlOiBpbmRpY2F0ZXMgdGhlIHBhcnNlciBoYXMgYmVndW4gcGFyc2luZyB0aGUgV0FSQyBmaWxlIHRydWVcbiAgICogLSBmYWxzZTogaW5kaWNhdGVkIHRoZSBwYXJzZXIgaXMgY3VycmVudGx5IHBhcnNpbmcgYSBXQVJDIGZpbGVcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBwYXRoIHRvIHRoZSBXQVJDIGZpbGUgaXMgbnVsbCBvciB1bmRlZmluZWQgb3IgYW5vdGhlciBlcnJvciBvY2N1cnJlZFxuICAgKi9cbiAgc3RhcnQgKCkge1xuICAgIGxldCBzdGFydGVkUGFyc2luZyA9IGZhbHNlXG4gICAgaWYgKCF0aGlzLl9wYXJzaW5nKSB7XG4gICAgICBpZiAodGhpcy5fd3AgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzdXBwbGllZCBwYXRoIHRvIHRoZSBXQVJDIGZpbGUgaXMgbnVsbC91bmRlZmluZWQnKVxuICAgICAgfVxuICAgICAgdGhpcy5fcGFyc2luZyA9IHRydWVcbiAgICAgIHRoaXMuX2dldFN0cmVhbSgpXG4gICAgICAgIC5waXBlKG5ldyBXQVJDU3RyZWFtVHJhbnNmb3JtKCkpXG4gICAgICAgIC5vbignZGF0YScsIHRoaXMuX29uUmVjb3JkKVxuICAgICAgICAub24oJ2Vycm9yJywgdGhpcy5fb25FcnJvcilcbiAgICAgICAgLm9uKCdlbmQnLCB0aGlzLl9vbkVuZClcbiAgICAgIHN0YXJ0ZWRQYXJzaW5nID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gc3RhcnRlZFBhcnNpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBBbGlhcyBmb3Ige0BsaW5rIHN0YXJ0fSBleGNlcHQgdGhhdCB5b3UgY2FuIHN1cHBseSB0aGUgcGF0aCB0byB0aGUgV0FSQyBmaWxlIHRvIGJlIHBhcnNlZFxuICAgKiBpZiBvbmUgd2FzIG5vdCBzdXBwbGllZCB2aWEgdGhlIGNvbnN0cnVjdG9yIG9yIHRvIHBhcnNlIGFub3RoZXIgV0FSQyBmaWxlLiBJZiB0aGUgcGF0aCB0byBXQVJDIGZpbGVcbiAgICogdG8gYmUgcGFyc2VkIHdhcyBzdXBwbGllZCB2aWEgdGhlIGNvbnN0cnVjdG9yIGFuZCB5b3Ugc3VwcGx5IGEgZGlmZmVyZW50IHBhdGggdG8gdGhpcyBtZXRob2QuXG4gICAqIEl0IHdpbGwgb3ZlcnJpZGUgdGhlIG9uZSBzdXBwbGllZCB2aWEgdGhlIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gW3dwXSAtIHBhdGggdG8gdGhlIFdBUkMgZmlsZSB0byBiZSBwYXJzZWRcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gaW5kaWNhdGlvbiBpZiB0aGUgcGFyc2VyIGhhcyBiZWd1biBvciBpcyBjdXJyZW50bHkgcGFyc2luZyBhIFdBUkMgZmlsZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIHBhdGggdG8gdGhlIFdBUkMgZmlsZSBpcyBudWxsIG9yIHVuZGVmaW5lZCBvciBhbm90aGVyIGVycm9yIG9jY3VycmVkXG4gICAqL1xuICBwYXJzZVdBUkMgKHdwKSB7XG4gICAgaWYgKCF0aGlzLl9wYXJzaW5nKSB7XG4gICAgICB0aGlzLl93cCA9IHdwIHx8IHRoaXMuX3dwXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXJ0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBMaXN0ZW5lciBmb3IgYSBwYXJzZXJzIHJlY29yZCBldmVudFxuICAgKiBAcGFyYW0ge1dBUkNSZWNvcmR9IHJlY29yZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uUmVjb3JkIChyZWNvcmQpIHtcbiAgICB0aGlzLmVtaXQoJ3JlY29yZCcsIHJlY29yZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBMaXN0ZW5lciBmb3IgYSBwYXJzZXJzIGRvbmUgZXZlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbkVuZCAoKSB7XG4gICAgdGhpcy5fcGFyc2luZyA9IGZhbHNlXG4gICAgdGhpcy5lbWl0KCdkb25lJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBMaXN0ZW5lciBmb3IgYSBwYXJzZXJzIGVycm9yIGV2ZW50XG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25FcnJvciAoZXJyb3IpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgUmV0dXJucyBhIFJlYWRTdHJlYW0gZm9yIHRoZSBXQVJDIHRvIGJlIHBhcnNlZC5cbiAgICogSWYgdGhlIFdBUkMgZmlsZSBpcyBnemlwZWQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgdGhlXG4gICAqIHJlc3VsdHMgb2YgYGBSZWFkU3RyZWFtLnBpcGUoemxpYi5jcmVhdGVHdW56aXAoKSlgYFxuICAgKiBAcmV0dXJucyB7UmVhZFN0cmVhbXxHdW56aXB9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZ2V0U3RyZWFtICgpIHtcbiAgICBjb25zdCBpc0d6ID0gR3ppcERldGVjdG9yLmlzR3ppcHBlZFN5bmModGhpcy5fd3ApXG4gICAgY29uc3Qgc3RyZWFtID0gZ2V0U3RyZWFtKHRoaXMuX3dwLCB0cnVlKVxuICAgIGlmIChpc0d6KSByZXR1cm4gc3RyZWFtLnBpcGUoemxpYi5jcmVhdGVHdW56aXAoKSlcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7QXV0b1dBUkNQYXJzZXJ9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gQXV0b1dBUkNQYXJzZXJcbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArXG4gICAgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9XG4gICAgICAoKHVpbnQ4W2ldIDw8IDE2KSAmIDB4RkYwMDAwKSArXG4gICAgICAoKHVpbnQ4W2kgKyAxXSA8PCA4KSAmIDB4RkYwMCkgK1xuICAgICAgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsoXG4gICAgICB1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpXG4gICAgKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSAoZSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSAobSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICgodmFsdWUgKiBjKSAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuZnVuY3Rpb24gY29weUJ1ZmZlcihzcmMsIHRhcmdldCwgb2Zmc2V0KSB7XG4gIHNyYy5jb3B5KHRhcmdldCwgb2Zmc2V0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEJ1ZmZlckxpc3QoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJ1ZmZlckxpc3QpO1xuXG4gICAgdGhpcy5oZWFkID0gbnVsbDtcbiAgICB0aGlzLnRhaWwgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfVxuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiBwdXNoKHYpIHtcbiAgICB2YXIgZW50cnkgPSB7IGRhdGE6IHYsIG5leHQ6IG51bGwgfTtcbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB0aGlzLnRhaWwubmV4dCA9IGVudHJ5O2Vsc2UgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgdGhpcy50YWlsID0gZW50cnk7XG4gICAgKyt0aGlzLmxlbmd0aDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gdW5zaGlmdCh2KSB7XG4gICAgdmFyIGVudHJ5ID0geyBkYXRhOiB2LCBuZXh0OiB0aGlzLmhlYWQgfTtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHRoaXMudGFpbCA9IGVudHJ5O1xuICAgIHRoaXMuaGVhZCA9IGVudHJ5O1xuICAgICsrdGhpcy5sZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbiBzaGlmdCgpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB2YXIgcmV0ID0gdGhpcy5oZWFkLmRhdGE7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxKSB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsO2Vsc2UgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHQ7XG4gICAgLS10aGlzLmxlbmd0aDtcbiAgICByZXR1cm4gcmV0O1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIGpvaW4ocykge1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICAgIHZhciBwID0gdGhpcy5oZWFkO1xuICAgIHZhciByZXQgPSAnJyArIHAuZGF0YTtcbiAgICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgICAgcmV0ICs9IHMgKyBwLmRhdGE7XG4gICAgfXJldHVybiByZXQ7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0KG4pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxKSByZXR1cm4gdGhpcy5oZWFkLmRhdGE7XG4gICAgdmFyIHJldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuID4+PiAwKTtcbiAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKHApIHtcbiAgICAgIGNvcHlCdWZmZXIocC5kYXRhLCByZXQsIGkpO1xuICAgICAgaSArPSBwLmRhdGEubGVuZ3RoO1xuICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICByZXR1cm4gQnVmZmVyTGlzdDtcbn0oKTtcblxuaWYgKHV0aWwgJiYgdXRpbC5pbnNwZWN0ICYmIHV0aWwuaW5zcGVjdC5jdXN0b20pIHtcbiAgbW9kdWxlLmV4cG9ydHMucHJvdG90eXBlW3V0aWwuaW5zcGVjdC5jdXN0b21dID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBvYmogPSB1dGlsLmluc3BlY3QoeyBsZW5ndGg6IHRoaXMubGVuZ3RoIH0pO1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnICcgKyBvYmo7XG4gIH07XG59IiwidmFyIHNjb3BlID0gKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsKSB8fFxuICAgICAgICAgICAgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYpIHx8XG4gICAgICAgICAgICB3aW5kb3c7XG52YXIgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG5cbi8vIERPTSBBUElzLCBmb3IgY29tcGxldGVuZXNzXG5cbmV4cG9ydHMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRUaW1lb3V0LCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJUaW1lb3V0KTtcbn07XG5leHBvcnRzLnNldEludGVydmFsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldEludGVydmFsLCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJJbnRlcnZhbCk7XG59O1xuZXhwb3J0cy5jbGVhclRpbWVvdXQgPVxuZXhwb3J0cy5jbGVhckludGVydmFsID0gZnVuY3Rpb24odGltZW91dCkge1xuICBpZiAodGltZW91dCkge1xuICAgIHRpbWVvdXQuY2xvc2UoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gVGltZW91dChpZCwgY2xlYXJGbikge1xuICB0aGlzLl9pZCA9IGlkO1xuICB0aGlzLl9jbGVhckZuID0gY2xlYXJGbjtcbn1cblRpbWVvdXQucHJvdG90eXBlLnVucmVmID0gVGltZW91dC5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24oKSB7fTtcblRpbWVvdXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2NsZWFyRm4uY2FsbChzY29wZSwgdGhpcy5faWQpO1xufTtcblxuLy8gRG9lcyBub3Qgc3RhcnQgdGhlIHRpbWUsIGp1c3Qgc2V0cyB1cCB0aGUgbWVtYmVycyBuZWVkZWQuXG5leHBvcnRzLmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0sIG1zZWNzKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSBtc2Vjcztcbn07XG5cbmV4cG9ydHMudW5lbnJvbGwgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSAtMTtcbn07XG5cbmV4cG9ydHMuX3VucmVmQWN0aXZlID0gZXhwb3J0cy5hY3RpdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcblxuICB2YXIgbXNlY3MgPSBpdGVtLl9pZGxlVGltZW91dDtcbiAgaWYgKG1zZWNzID49IDApIHtcbiAgICBpdGVtLl9pZGxlVGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICBpZiAoaXRlbS5fb25UaW1lb3V0KVxuICAgICAgICBpdGVtLl9vblRpbWVvdXQoKTtcbiAgICB9LCBtc2Vjcyk7XG4gIH1cbn07XG5cbi8vIHNldGltbWVkaWF0ZSBhdHRhY2hlcyBpdHNlbGYgdG8gdGhlIGdsb2JhbCBvYmplY3RcbnJlcXVpcmUoXCJzZXRpbW1lZGlhdGVcIik7XG4vLyBPbiBzb21lIGV4b3RpYyBlbnZpcm9ubWVudHMsIGl0J3Mgbm90IGNsZWFyIHdoaWNoIG9iamVjdCBgc2V0aW1tZWRpYXRlYCB3YXNcbi8vIGFibGUgdG8gaW5zdGFsbCBvbnRvLiAgU2VhcmNoIGVhY2ggcG9zc2liaWxpdHkgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlXG4vLyBgc2V0aW1tZWRpYXRlYCBsaWJyYXJ5LlxuZXhwb3J0cy5zZXRJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuc2V0SW1tZWRpYXRlKTtcbmV4cG9ydHMuY2xlYXJJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5jbGVhckltbWVkaWF0ZSk7XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxOyAvLyBTcGVjIHNheXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgICB2YXIgdGFza3NCeUhhbmRsZSA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIHZhciByZWdpc3RlckltbWVkaWF0ZTtcblxuICAgIGZ1bmN0aW9uIHNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuICAgICAgLy8gQ2FsbGJhY2sgY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24oXCJcIiArIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIENvcHkgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAxXTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIGFuZCByZWdpc3RlciB0aGUgdGFza1xuICAgICAgdmFyIHRhc2sgPSB7IGNhbGxiYWNrOiBjYWxsYmFjaywgYXJnczogYXJncyB9O1xuICAgICAgdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXSA9IHRhc2s7XG4gICAgICByZWdpc3RlckltbWVkaWF0ZShuZXh0SGFuZGxlKTtcbiAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7XG4gICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuKHRhc2spIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgdmFyIGFyZ3MgPSB0YXNrLmFyZ3M7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSWZQcmVzZW50KGhhbmRsZSkge1xuICAgICAgICAvLyBGcm9tIHRoZSBzcGVjOiBcIldhaXQgdW50aWwgYW55IGludm9jYXRpb25zIG9mIHRoaXMgYWxnb3JpdGhtIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgb25lIGhhdmUgY29tcGxldGVkLlwiXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nQVRhc2spIHtcbiAgICAgICAgICAgIC8vIERlbGF5IGJ5IGRvaW5nIGEgc2V0VGltZW91dC4gc2V0SW1tZWRpYXRlIHdhcyB0cmllZCBpbnN0ZWFkLCBidXQgaW4gRmlyZWZveCA3IGl0IGdlbmVyYXRlZCBhXG4gICAgICAgICAgICAvLyBcInRvbyBtdWNoIHJlY3Vyc2lvblwiIGVycm9yLlxuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBydW4odGFzayk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcnVuSWZQcmVzZW50KGhhbmRsZSk7IH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsIFwiKlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaHRtbC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaHRtbC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiID8gdHlwZW9mIGdsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMgOiBnbG9iYWwgOiBzZWxmKSk7XG4iLCJcbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXByZWNhdGU7XG5cbi8qKlxuICogTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbiAqIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS5ub0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50aHJvd0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIHRocm93IGFuIEVycm9yIHdoZW4gaW52b2tlZC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRyYWNlRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgaW52b2tlIGBjb25zb2xlLnRyYWNlKClgIGluc3RlYWQgb2YgYGNvbnNvbGUuZXJyb3IoKWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0aGUgZnVuY3Rpb24gdG8gZGVwcmVjYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnIC0gdGhlIHN0cmluZyB0byBwcmludCB0byB0aGUgY29uc29sZSB3aGVuIGBmbmAgaXMgaW52b2tlZFxuICogQHJldHVybnMge0Z1bmN0aW9ufSBhIG5ldyBcImRlcHJlY2F0ZWRcIiB2ZXJzaW9uIG9mIGBmbmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGVwcmVjYXRlIChmbiwgbXNnKSB7XG4gIGlmIChjb25maWcoJ25vRGVwcmVjYXRpb24nKSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKGNvbmZpZygndGhyb3dEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChjb25maWcoJ3RyYWNlRGVwcmVjYXRpb24nKSkge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGBsb2NhbFN0b3JhZ2VgIGZvciBib29sZWFuIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGBuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb25maWcgKG5hbWUpIHtcbiAgLy8gYWNjZXNzaW5nIGdsb2JhbC5sb2NhbFN0b3JhZ2UgY2FuIHRyaWdnZXIgYSBET01FeGNlcHRpb24gaW4gc2FuZGJveGVkIGlmcmFtZXNcbiAgdHJ5IHtcbiAgICBpZiAoIWdsb2JhbC5sb2NhbFN0b3JhZ2UpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdmFsID0gZ2xvYmFsLmxvY2FsU3RvcmFnZVtuYW1lXTtcbiAgaWYgKG51bGwgPT0gdmFsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG5cbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fd3JpdGFibGUuanMnKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpLlRyYW5zZm9ybVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL3JlYWRhYmxlJykuUGFzc1Rocm91Z2hcbiIsIid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludCBjYW1lbGNhc2U6IFwib2ZmXCIgKi9cblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuXG52YXIgWnN0cmVhbSA9IHJlcXVpcmUoJ3Bha28vbGliL3psaWIvenN0cmVhbScpO1xudmFyIHpsaWJfZGVmbGF0ZSA9IHJlcXVpcmUoJ3Bha28vbGliL3psaWIvZGVmbGF0ZS5qcycpO1xudmFyIHpsaWJfaW5mbGF0ZSA9IHJlcXVpcmUoJ3Bha28vbGliL3psaWIvaW5mbGF0ZS5qcycpO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJ3Bha28vbGliL3psaWIvY29uc3RhbnRzJyk7XG5cbmZvciAodmFyIGtleSBpbiBjb25zdGFudHMpIHtcbiAgZXhwb3J0c1trZXldID0gY29uc3RhbnRzW2tleV07XG59XG5cbi8vIHpsaWIgbW9kZXNcbmV4cG9ydHMuTk9ORSA9IDA7XG5leHBvcnRzLkRFRkxBVEUgPSAxO1xuZXhwb3J0cy5JTkZMQVRFID0gMjtcbmV4cG9ydHMuR1pJUCA9IDM7XG5leHBvcnRzLkdVTlpJUCA9IDQ7XG5leHBvcnRzLkRFRkxBVEVSQVcgPSA1O1xuZXhwb3J0cy5JTkZMQVRFUkFXID0gNjtcbmV4cG9ydHMuVU5aSVAgPSA3O1xuXG52YXIgR1pJUF9IRUFERVJfSUQxID0gMHgxZjtcbnZhciBHWklQX0hFQURFUl9JRDIgPSAweDhiO1xuXG4vKipcbiAqIEVtdWxhdGUgTm9kZSdzIHpsaWIgQysrIGxheWVyIGZvciB1c2UgYnkgdGhlIEpTIGxheWVyIGluIGluZGV4LmpzXG4gKi9cbmZ1bmN0aW9uIFpsaWIobW9kZSkge1xuICBpZiAodHlwZW9mIG1vZGUgIT09ICdudW1iZXInIHx8IG1vZGUgPCBleHBvcnRzLkRFRkxBVEUgfHwgbW9kZSA+IGV4cG9ydHMuVU5aSVApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCYWQgYXJndW1lbnQnKTtcbiAgfVxuXG4gIHRoaXMuZGljdGlvbmFyeSA9IG51bGw7XG4gIHRoaXMuZXJyID0gMDtcbiAgdGhpcy5mbHVzaCA9IDA7XG4gIHRoaXMuaW5pdF9kb25lID0gZmFsc2U7XG4gIHRoaXMubGV2ZWwgPSAwO1xuICB0aGlzLm1lbUxldmVsID0gMDtcbiAgdGhpcy5tb2RlID0gbW9kZTtcbiAgdGhpcy5zdHJhdGVneSA9IDA7XG4gIHRoaXMud2luZG93Qml0cyA9IDA7XG4gIHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MgPSBmYWxzZTtcbiAgdGhpcy5wZW5kaW5nX2Nsb3NlID0gZmFsc2U7XG4gIHRoaXMuZ3ppcF9pZF9ieXRlc19yZWFkID0gMDtcbn1cblxuWmxpYi5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLndyaXRlX2luX3Byb2dyZXNzKSB7XG4gICAgdGhpcy5wZW5kaW5nX2Nsb3NlID0gdHJ1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnBlbmRpbmdfY2xvc2UgPSBmYWxzZTtcblxuICBhc3NlcnQodGhpcy5pbml0X2RvbmUsICdjbG9zZSBiZWZvcmUgaW5pdCcpO1xuICBhc3NlcnQodGhpcy5tb2RlIDw9IGV4cG9ydHMuVU5aSVApO1xuXG4gIGlmICh0aGlzLm1vZGUgPT09IGV4cG9ydHMuREVGTEFURSB8fCB0aGlzLm1vZGUgPT09IGV4cG9ydHMuR1pJUCB8fCB0aGlzLm1vZGUgPT09IGV4cG9ydHMuREVGTEFURVJBVykge1xuICAgIHpsaWJfZGVmbGF0ZS5kZWZsYXRlRW5kKHRoaXMuc3RybSk7XG4gIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSBleHBvcnRzLklORkxBVEUgfHwgdGhpcy5tb2RlID09PSBleHBvcnRzLkdVTlpJUCB8fCB0aGlzLm1vZGUgPT09IGV4cG9ydHMuSU5GTEFURVJBVyB8fCB0aGlzLm1vZGUgPT09IGV4cG9ydHMuVU5aSVApIHtcbiAgICB6bGliX2luZmxhdGUuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICB9XG5cbiAgdGhpcy5tb2RlID0gZXhwb3J0cy5OT05FO1xuXG4gIHRoaXMuZGljdGlvbmFyeSA9IG51bGw7XG59O1xuXG5abGliLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChmbHVzaCwgaW5wdXQsIGluX29mZiwgaW5fbGVuLCBvdXQsIG91dF9vZmYsIG91dF9sZW4pIHtcbiAgcmV0dXJuIHRoaXMuX3dyaXRlKHRydWUsIGZsdXNoLCBpbnB1dCwgaW5fb2ZmLCBpbl9sZW4sIG91dCwgb3V0X29mZiwgb3V0X2xlbik7XG59O1xuXG5abGliLnByb3RvdHlwZS53cml0ZVN5bmMgPSBmdW5jdGlvbiAoZmx1c2gsIGlucHV0LCBpbl9vZmYsIGluX2xlbiwgb3V0LCBvdXRfb2ZmLCBvdXRfbGVuKSB7XG4gIHJldHVybiB0aGlzLl93cml0ZShmYWxzZSwgZmx1c2gsIGlucHV0LCBpbl9vZmYsIGluX2xlbiwgb3V0LCBvdXRfb2ZmLCBvdXRfbGVuKTtcbn07XG5cblpsaWIucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChhc3luYywgZmx1c2gsIGlucHV0LCBpbl9vZmYsIGluX2xlbiwgb3V0LCBvdXRfb2ZmLCBvdXRfbGVuKSB7XG4gIGFzc2VydC5lcXVhbChhcmd1bWVudHMubGVuZ3RoLCA4KTtcblxuICBhc3NlcnQodGhpcy5pbml0X2RvbmUsICd3cml0ZSBiZWZvcmUgaW5pdCcpO1xuICBhc3NlcnQodGhpcy5tb2RlICE9PSBleHBvcnRzLk5PTkUsICdhbHJlYWR5IGZpbmFsaXplZCcpO1xuICBhc3NlcnQuZXF1YWwoZmFsc2UsIHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MsICd3cml0ZSBhbHJlYWR5IGluIHByb2dyZXNzJyk7XG4gIGFzc2VydC5lcXVhbChmYWxzZSwgdGhpcy5wZW5kaW5nX2Nsb3NlLCAnY2xvc2UgaXMgcGVuZGluZycpO1xuXG4gIHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MgPSB0cnVlO1xuXG4gIGFzc2VydC5lcXVhbChmYWxzZSwgZmx1c2ggPT09IHVuZGVmaW5lZCwgJ211c3QgcHJvdmlkZSBmbHVzaCB2YWx1ZScpO1xuXG4gIHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MgPSB0cnVlO1xuXG4gIGlmIChmbHVzaCAhPT0gZXhwb3J0cy5aX05PX0ZMVVNIICYmIGZsdXNoICE9PSBleHBvcnRzLlpfUEFSVElBTF9GTFVTSCAmJiBmbHVzaCAhPT0gZXhwb3J0cy5aX1NZTkNfRkxVU0ggJiYgZmx1c2ggIT09IGV4cG9ydHMuWl9GVUxMX0ZMVVNIICYmIGZsdXNoICE9PSBleHBvcnRzLlpfRklOSVNIICYmIGZsdXNoICE9PSBleHBvcnRzLlpfQkxPQ0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZmx1c2ggdmFsdWUnKTtcbiAgfVxuXG4gIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgaW5wdXQgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgaW5fbGVuID0gMDtcbiAgICBpbl9vZmYgPSAwO1xuICB9XG5cbiAgdGhpcy5zdHJtLmF2YWlsX2luID0gaW5fbGVuO1xuICB0aGlzLnN0cm0uaW5wdXQgPSBpbnB1dDtcbiAgdGhpcy5zdHJtLm5leHRfaW4gPSBpbl9vZmY7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSBvdXRfbGVuO1xuICB0aGlzLnN0cm0ub3V0cHV0ID0gb3V0O1xuICB0aGlzLnN0cm0ubmV4dF9vdXQgPSBvdXRfb2ZmO1xuICB0aGlzLmZsdXNoID0gZmx1c2g7XG5cbiAgaWYgKCFhc3luYykge1xuICAgIC8vIHN5bmMgdmVyc2lvblxuICAgIHRoaXMuX3Byb2Nlc3MoKTtcblxuICAgIGlmICh0aGlzLl9jaGVja0Vycm9yKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hZnRlclN5bmMoKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gYXN5bmMgdmVyc2lvblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgIHNlbGYuX3Byb2Nlc3MoKTtcbiAgICBzZWxmLl9hZnRlcigpO1xuICB9KTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cblpsaWIucHJvdG90eXBlLl9hZnRlclN5bmMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhdmFpbF9vdXQgPSB0aGlzLnN0cm0uYXZhaWxfb3V0O1xuICB2YXIgYXZhaWxfaW4gPSB0aGlzLnN0cm0uYXZhaWxfaW47XG5cbiAgdGhpcy53cml0ZV9pbl9wcm9ncmVzcyA9IGZhbHNlO1xuXG4gIHJldHVybiBbYXZhaWxfaW4sIGF2YWlsX291dF07XG59O1xuXG5abGliLnByb3RvdHlwZS5fcHJvY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5leHRfZXhwZWN0ZWRfaGVhZGVyX2J5dGUgPSBudWxsO1xuXG4gIC8vIElmIHRoZSBhdmFpbF9vdXQgaXMgbGVmdCBhdCAwLCB0aGVuIGl0IG1lYW5zIHRoYXQgaXQgcmFuIG91dFxuICAvLyBvZiByb29tLiAgSWYgdGhlcmUgd2FzIGF2YWlsX291dCBsZWZ0IG92ZXIsIHRoZW4gaXQgbWVhbnNcbiAgLy8gdGhhdCBhbGwgb2YgdGhlIGlucHV0IHdhcyBjb25zdW1lZC5cbiAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgICBjYXNlIGV4cG9ydHMuREVGTEFURTpcbiAgICBjYXNlIGV4cG9ydHMuR1pJUDpcbiAgICBjYXNlIGV4cG9ydHMuREVGTEFURVJBVzpcbiAgICAgIHRoaXMuZXJyID0gemxpYl9kZWZsYXRlLmRlZmxhdGUodGhpcy5zdHJtLCB0aGlzLmZsdXNoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgZXhwb3J0cy5VTlpJUDpcbiAgICAgIGlmICh0aGlzLnN0cm0uYXZhaWxfaW4gPiAwKSB7XG4gICAgICAgIG5leHRfZXhwZWN0ZWRfaGVhZGVyX2J5dGUgPSB0aGlzLnN0cm0ubmV4dF9pbjtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoICh0aGlzLmd6aXBfaWRfYnl0ZXNfcmVhZCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgaWYgKG5leHRfZXhwZWN0ZWRfaGVhZGVyX2J5dGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLnN0cm0uaW5wdXRbbmV4dF9leHBlY3RlZF9oZWFkZXJfYnl0ZV0gPT09IEdaSVBfSEVBREVSX0lEMSkge1xuICAgICAgICAgICAgdGhpcy5nemlwX2lkX2J5dGVzX3JlYWQgPSAxO1xuICAgICAgICAgICAgbmV4dF9leHBlY3RlZF9oZWFkZXJfYnl0ZSsrO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zdHJtLmF2YWlsX2luID09PSAxKSB7XG4gICAgICAgICAgICAgIC8vIFRoZSBvbmx5IGF2YWlsYWJsZSBieXRlIHdhcyBhbHJlYWR5IHJlYWQuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1vZGUgPSBleHBvcnRzLklORkxBVEU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChuZXh0X2V4cGVjdGVkX2hlYWRlcl9ieXRlID09PSBudWxsKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5zdHJtLmlucHV0W25leHRfZXhwZWN0ZWRfaGVhZGVyX2J5dGVdID09PSBHWklQX0hFQURFUl9JRDIpIHtcbiAgICAgICAgICAgIHRoaXMuZ3ppcF9pZF9ieXRlc19yZWFkID0gMjtcbiAgICAgICAgICAgIHRoaXMubW9kZSA9IGV4cG9ydHMuR1VOWklQO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBhY3R1YWwgZGlmZmVyZW5jZSBiZXR3ZWVuIElORkxBVEUgYW5kIElORkxBVEVSQVdcbiAgICAgICAgICAgIC8vIChhZnRlciBpbml0aWFsaXphdGlvbikuXG4gICAgICAgICAgICB0aGlzLm1vZGUgPSBleHBvcnRzLklORkxBVEU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG51bWJlciBvZiBnemlwIG1hZ2ljIG51bWJlciBieXRlcyByZWFkJyk7XG4gICAgICB9XG5cbiAgICAvLyBmYWxsdGhyb3VnaFxuICAgIGNhc2UgZXhwb3J0cy5JTkZMQVRFOlxuICAgIGNhc2UgZXhwb3J0cy5HVU5aSVA6XG4gICAgY2FzZSBleHBvcnRzLklORkxBVEVSQVc6XG4gICAgICB0aGlzLmVyciA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlKHRoaXMuc3RybSwgdGhpcy5mbHVzaFxuXG4gICAgICAvLyBJZiBkYXRhIHdhcyBlbmNvZGVkIHdpdGggZGljdGlvbmFyeVxuICAgICAgKTtpZiAodGhpcy5lcnIgPT09IGV4cG9ydHMuWl9ORUVEX0RJQ1QgJiYgdGhpcy5kaWN0aW9uYXJ5KSB7XG4gICAgICAgIC8vIExvYWQgaXRcbiAgICAgICAgdGhpcy5lcnIgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCB0aGlzLmRpY3Rpb25hcnkpO1xuICAgICAgICBpZiAodGhpcy5lcnIgPT09IGV4cG9ydHMuWl9PSykge1xuICAgICAgICAgIC8vIEFuZCB0cnkgdG8gZGVjb2RlIGFnYWluXG4gICAgICAgICAgdGhpcy5lcnIgPSB6bGliX2luZmxhdGUuaW5mbGF0ZSh0aGlzLnN0cm0sIHRoaXMuZmx1c2gpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXJyID09PSBleHBvcnRzLlpfREFUQV9FUlJPUikge1xuICAgICAgICAgIC8vIEJvdGggaW5mbGF0ZVNldERpY3Rpb25hcnkoKSBhbmQgaW5mbGF0ZSgpIHJldHVybiBaX0RBVEFfRVJST1IuXG4gICAgICAgICAgLy8gTWFrZSBpdCBwb3NzaWJsZSBmb3IgQWZ0ZXIoKSB0byB0ZWxsIGEgYmFkIGRpY3Rpb25hcnkgZnJvbSBiYWRcbiAgICAgICAgICAvLyBpbnB1dC5cbiAgICAgICAgICB0aGlzLmVyciA9IGV4cG9ydHMuWl9ORUVEX0RJQ1Q7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlICh0aGlzLnN0cm0uYXZhaWxfaW4gPiAwICYmIHRoaXMubW9kZSA9PT0gZXhwb3J0cy5HVU5aSVAgJiYgdGhpcy5lcnIgPT09IGV4cG9ydHMuWl9TVFJFQU1fRU5EICYmIHRoaXMuc3RybS5uZXh0X2luWzBdICE9PSAweDAwKSB7XG4gICAgICAgIC8vIEJ5dGVzIHJlbWFpbiBpbiBpbnB1dCBidWZmZXIuIFBlcmhhcHMgdGhpcyBpcyBhbm90aGVyIGNvbXByZXNzZWRcbiAgICAgICAgLy8gbWVtYmVyIGluIHRoZSBzYW1lIGFyY2hpdmUsIG9yIGp1c3QgdHJhaWxpbmcgZ2FyYmFnZS5cbiAgICAgICAgLy8gVHJhaWxpbmcgemVybyBieXRlcyBhcmUgb2theSwgdGhvdWdoLCBzaW5jZSB0aGV5IGFyZSBmcmVxdWVudGx5XG4gICAgICAgIC8vIHVzZWQgZm9yIHBhZGRpbmcuXG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB0aGlzLmVyciA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlKHRoaXMuc3RybSwgdGhpcy5mbHVzaCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1vZGUgJyArIHRoaXMubW9kZSk7XG4gIH1cbn07XG5cblpsaWIucHJvdG90eXBlLl9jaGVja0Vycm9yID0gZnVuY3Rpb24gKCkge1xuICAvLyBBY2NlcHRhYmxlIGVycm9yIHN0YXRlcyBkZXBlbmQgb24gdGhlIHR5cGUgb2YgemxpYiBzdHJlYW0uXG4gIHN3aXRjaCAodGhpcy5lcnIpIHtcbiAgICBjYXNlIGV4cG9ydHMuWl9PSzpcbiAgICBjYXNlIGV4cG9ydHMuWl9CVUZfRVJST1I6XG4gICAgICBpZiAodGhpcy5zdHJtLmF2YWlsX291dCAhPT0gMCAmJiB0aGlzLmZsdXNoID09PSBleHBvcnRzLlpfRklOSVNIKSB7XG4gICAgICAgIHRoaXMuX2Vycm9yKCd1bmV4cGVjdGVkIGVuZCBvZiBmaWxlJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgZXhwb3J0cy5aX1NUUkVBTV9FTkQ6XG4gICAgICAvLyBub3JtYWwgc3RhdHVzZXMsIG5vdCBmYXRhbFxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBleHBvcnRzLlpfTkVFRF9ESUNUOlxuICAgICAgaWYgKHRoaXMuZGljdGlvbmFyeSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2Vycm9yKCdNaXNzaW5nIGRpY3Rpb25hcnknKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2Vycm9yKCdCYWQgZGljdGlvbmFyeScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBzb21ldGhpbmcgZWxzZS5cbiAgICAgIHRoaXMuX2Vycm9yKCdabGliIGVycm9yJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblpsaWIucHJvdG90eXBlLl9hZnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLl9jaGVja0Vycm9yKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgYXZhaWxfb3V0ID0gdGhpcy5zdHJtLmF2YWlsX291dDtcbiAgdmFyIGF2YWlsX2luID0gdGhpcy5zdHJtLmF2YWlsX2luO1xuXG4gIHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAvLyBjYWxsIHRoZSB3cml0ZSgpIGNiXG4gIHRoaXMuY2FsbGJhY2soYXZhaWxfaW4sIGF2YWlsX291dCk7XG5cbiAgaWYgKHRoaXMucGVuZGluZ19jbG9zZSkge1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxufTtcblxuWmxpYi5wcm90b3R5cGUuX2Vycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgaWYgKHRoaXMuc3RybS5tc2cpIHtcbiAgICBtZXNzYWdlID0gdGhpcy5zdHJtLm1zZztcbiAgfVxuICB0aGlzLm9uZXJyb3IobWVzc2FnZSwgdGhpcy5lcnJcblxuICAvLyBubyBob3BlIG9mIHJlc2N1ZS5cbiAgKTt0aGlzLndyaXRlX2luX3Byb2dyZXNzID0gZmFsc2U7XG4gIGlmICh0aGlzLnBlbmRpbmdfY2xvc2UpIHtcbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cbn07XG5cblpsaWIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAod2luZG93Qml0cywgbGV2ZWwsIG1lbUxldmVsLCBzdHJhdGVneSwgZGljdGlvbmFyeSkge1xuICBhc3NlcnQoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCB8fCBhcmd1bWVudHMubGVuZ3RoID09PSA1LCAnaW5pdCh3aW5kb3dCaXRzLCBsZXZlbCwgbWVtTGV2ZWwsIHN0cmF0ZWd5LCBbZGljdGlvbmFyeV0pJyk7XG5cbiAgYXNzZXJ0KHdpbmRvd0JpdHMgPj0gOCAmJiB3aW5kb3dCaXRzIDw9IDE1LCAnaW52YWxpZCB3aW5kb3dCaXRzJyk7XG4gIGFzc2VydChsZXZlbCA+PSAtMSAmJiBsZXZlbCA8PSA5LCAnaW52YWxpZCBjb21wcmVzc2lvbiBsZXZlbCcpO1xuXG4gIGFzc2VydChtZW1MZXZlbCA+PSAxICYmIG1lbUxldmVsIDw9IDksICdpbnZhbGlkIG1lbWxldmVsJyk7XG5cbiAgYXNzZXJ0KHN0cmF0ZWd5ID09PSBleHBvcnRzLlpfRklMVEVSRUQgfHwgc3RyYXRlZ3kgPT09IGV4cG9ydHMuWl9IVUZGTUFOX09OTFkgfHwgc3RyYXRlZ3kgPT09IGV4cG9ydHMuWl9STEUgfHwgc3RyYXRlZ3kgPT09IGV4cG9ydHMuWl9GSVhFRCB8fCBzdHJhdGVneSA9PT0gZXhwb3J0cy5aX0RFRkFVTFRfU1RSQVRFR1ksICdpbnZhbGlkIHN0cmF0ZWd5Jyk7XG5cbiAgdGhpcy5faW5pdChsZXZlbCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5LCBkaWN0aW9uYXJ5KTtcbiAgdGhpcy5fc2V0RGljdGlvbmFyeSgpO1xufTtcblxuWmxpYi5wcm90b3R5cGUucGFyYW1zID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ2RlZmxhdGVQYXJhbXMgTm90IHN1cHBvcnRlZCcpO1xufTtcblxuWmxpYi5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX3Jlc2V0KCk7XG4gIHRoaXMuX3NldERpY3Rpb25hcnkoKTtcbn07XG5cblpsaWIucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gKGxldmVsLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksIGRpY3Rpb25hcnkpIHtcbiAgdGhpcy5sZXZlbCA9IGxldmVsO1xuICB0aGlzLndpbmRvd0JpdHMgPSB3aW5kb3dCaXRzO1xuICB0aGlzLm1lbUxldmVsID0gbWVtTGV2ZWw7XG4gIHRoaXMuc3RyYXRlZ3kgPSBzdHJhdGVneTtcblxuICB0aGlzLmZsdXNoID0gZXhwb3J0cy5aX05PX0ZMVVNIO1xuXG4gIHRoaXMuZXJyID0gZXhwb3J0cy5aX09LO1xuXG4gIGlmICh0aGlzLm1vZGUgPT09IGV4cG9ydHMuR1pJUCB8fCB0aGlzLm1vZGUgPT09IGV4cG9ydHMuR1VOWklQKSB7XG4gICAgdGhpcy53aW5kb3dCaXRzICs9IDE2O1xuICB9XG5cbiAgaWYgKHRoaXMubW9kZSA9PT0gZXhwb3J0cy5VTlpJUCkge1xuICAgIHRoaXMud2luZG93Qml0cyArPSAzMjtcbiAgfVxuXG4gIGlmICh0aGlzLm1vZGUgPT09IGV4cG9ydHMuREVGTEFURVJBVyB8fCB0aGlzLm1vZGUgPT09IGV4cG9ydHMuSU5GTEFURVJBVykge1xuICAgIHRoaXMud2luZG93Qml0cyA9IC0xICogdGhpcy53aW5kb3dCaXRzO1xuICB9XG5cbiAgdGhpcy5zdHJtID0gbmV3IFpzdHJlYW0oKTtcblxuICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgIGNhc2UgZXhwb3J0cy5ERUZMQVRFOlxuICAgIGNhc2UgZXhwb3J0cy5HWklQOlxuICAgIGNhc2UgZXhwb3J0cy5ERUZMQVRFUkFXOlxuICAgICAgdGhpcy5lcnIgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUluaXQyKHRoaXMuc3RybSwgdGhpcy5sZXZlbCwgZXhwb3J0cy5aX0RFRkxBVEVELCB0aGlzLndpbmRvd0JpdHMsIHRoaXMubWVtTGV2ZWwsIHRoaXMuc3RyYXRlZ3kpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBleHBvcnRzLklORkxBVEU6XG4gICAgY2FzZSBleHBvcnRzLkdVTlpJUDpcbiAgICBjYXNlIGV4cG9ydHMuSU5GTEFURVJBVzpcbiAgICBjYXNlIGV4cG9ydHMuVU5aSVA6XG4gICAgICB0aGlzLmVyciA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlSW5pdDIodGhpcy5zdHJtLCB0aGlzLndpbmRvd0JpdHMpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBtb2RlICcgKyB0aGlzLm1vZGUpO1xuICB9XG5cbiAgaWYgKHRoaXMuZXJyICE9PSBleHBvcnRzLlpfT0spIHtcbiAgICB0aGlzLl9lcnJvcignSW5pdCBlcnJvcicpO1xuICB9XG5cbiAgdGhpcy5kaWN0aW9uYXJ5ID0gZGljdGlvbmFyeTtcblxuICB0aGlzLndyaXRlX2luX3Byb2dyZXNzID0gZmFsc2U7XG4gIHRoaXMuaW5pdF9kb25lID0gdHJ1ZTtcbn07XG5cblpsaWIucHJvdG90eXBlLl9zZXREaWN0aW9uYXJ5ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5kaWN0aW9uYXJ5ID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLmVyciA9IGV4cG9ydHMuWl9PSztcblxuICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgIGNhc2UgZXhwb3J0cy5ERUZMQVRFOlxuICAgIGNhc2UgZXhwb3J0cy5ERUZMQVRFUkFXOlxuICAgICAgdGhpcy5lcnIgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCB0aGlzLmRpY3Rpb25hcnkpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgaWYgKHRoaXMuZXJyICE9PSBleHBvcnRzLlpfT0spIHtcbiAgICB0aGlzLl9lcnJvcignRmFpbGVkIHRvIHNldCBkaWN0aW9uYXJ5Jyk7XG4gIH1cbn07XG5cblpsaWIucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lcnIgPSBleHBvcnRzLlpfT0s7XG5cbiAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgICBjYXNlIGV4cG9ydHMuREVGTEFURTpcbiAgICBjYXNlIGV4cG9ydHMuREVGTEFURVJBVzpcbiAgICBjYXNlIGV4cG9ydHMuR1pJUDpcbiAgICAgIHRoaXMuZXJyID0gemxpYl9kZWZsYXRlLmRlZmxhdGVSZXNldCh0aGlzLnN0cm0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBleHBvcnRzLklORkxBVEU6XG4gICAgY2FzZSBleHBvcnRzLklORkxBVEVSQVc6XG4gICAgY2FzZSBleHBvcnRzLkdVTlpJUDpcbiAgICAgIHRoaXMuZXJyID0gemxpYl9pbmZsYXRlLmluZmxhdGVSZXNldCh0aGlzLnN0cm0pO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgaWYgKHRoaXMuZXJyICE9PSBleHBvcnRzLlpfT0spIHtcbiAgICB0aGlzLl9lcnJvcignRmFpbGVkIHRvIHJlc2V0IHN0cmVhbScpO1xuICB9XG59O1xuXG5leHBvcnRzLlpsaWIgPSBabGliOyIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbmZ1bmN0aW9uIFpTdHJlYW0oKSB7XG4gIC8qIG5leHQgaW5wdXQgYnl0ZSAqL1xuICB0aGlzLmlucHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfaW4gPSAwO1xuICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IGlucHV0ICovXG4gIHRoaXMuYXZhaWxfaW4gPSAwO1xuICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9pbiA9IDA7XG4gIC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqL1xuICB0aGlzLm91dHB1dCA9IG51bGw7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcbiAgdGhpcy5uZXh0X291dCA9IDA7XG4gIC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG91dHB1dCAqL1xuICB0aGlzLmF2YWlsX291dCA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovXG4gIHRoaXMudG90YWxfb3V0ID0gMDtcbiAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovXG4gIHRoaXMubXNnID0gJycvKlpfTlVMTCovO1xuICAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi9cbiAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYmluYXJ5IG9yIHRleHQgKi9cbiAgdGhpcy5kYXRhX3R5cGUgPSAyLypaX1VOS05PV04qLztcbiAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi9cbiAgdGhpcy5hZGxlciA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gWlN0cmVhbTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG52YXIgdXRpbHMgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIHRyZWVzICAgPSByZXF1aXJlKCcuL3RyZWVzJyk7XG52YXIgYWRsZXIzMiA9IHJlcXVpcmUoJy4vYWRsZXIzMicpO1xudmFyIGNyYzMyICAgPSByZXF1aXJlKCcuL2NyYzMyJyk7XG52YXIgbXNnICAgICA9IHJlcXVpcmUoJy4vbWVzc2FnZXMnKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9QQVJUSUFMX0ZMVVNIID0gMTtcbi8vdmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG52YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG4vL3ZhciBaX1RSRUVTICAgICAgICAgPSA2O1xuXG5cbi8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAqL1xudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbi8vdmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbi8vdmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cblxuLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4vL3ZhciBaX05PX0NPTVBSRVNTSU9OICAgICAgPSAwO1xuLy92YXIgWl9CRVNUX1NQRUVEICAgICAgICAgID0gMTtcbi8vdmFyIFpfQkVTVF9DT01QUkVTU0lPTiAgICA9IDk7XG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cblxudmFyIFpfRklMVEVSRUQgICAgICAgICAgICA9IDE7XG52YXIgWl9IVUZGTUFOX09OTFkgICAgICAgID0gMjtcbnZhciBaX1JMRSAgICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG52YXIgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuLy92YXIgWl9CSU5BUlkgICAgICAgICAgICAgID0gMDtcbi8vdmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cblxuLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbnZhciBNQVhfTUVNX0xFVkVMID0gOTtcbi8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqL1xudmFyIE1BWF9XQklUUyA9IDE1O1xuLyogMzJLIExaNzcgd2luZG93ICovXG52YXIgREVGX01FTV9MRVZFTCA9IDg7XG5cblxudmFyIExFTkdUSF9DT0RFUyAgPSAyOTtcbi8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG52YXIgRF9DT0RFUyAgICAgICA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG52YXIgTUFYX0JJVFMgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIE1JTl9NQVRDSCA9IDM7XG52YXIgTUFYX01BVENIID0gMjU4O1xudmFyIE1JTl9MT09LQUhFQUQgPSAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSk7XG5cbnZhciBQUkVTRVRfRElDVCA9IDB4MjA7XG5cbnZhciBJTklUX1NUQVRFID0gNDI7XG52YXIgRVhUUkFfU1RBVEUgPSA2OTtcbnZhciBOQU1FX1NUQVRFID0gNzM7XG52YXIgQ09NTUVOVF9TVEFURSA9IDkxO1xudmFyIEhDUkNfU1RBVEUgPSAxMDM7XG52YXIgQlVTWV9TVEFURSA9IDExMztcbnZhciBGSU5JU0hfU1RBVEUgPSA2NjY7XG5cbnZhciBCU19ORUVEX01PUkUgICAgICA9IDE7IC8qIGJsb2NrIG5vdCBjb21wbGV0ZWQsIG5lZWQgbW9yZSBpbnB1dCBvciBtb3JlIG91dHB1dCAqL1xudmFyIEJTX0JMT0NLX0RPTkUgICAgID0gMjsgLyogYmxvY2sgZmx1c2ggcGVyZm9ybWVkICovXG52YXIgQlNfRklOSVNIX1NUQVJURUQgPSAzOyAvKiBmaW5pc2ggc3RhcnRlZCwgbmVlZCBvbmx5IG1vcmUgb3V0cHV0IGF0IG5leHQgZGVmbGF0ZSAqL1xudmFyIEJTX0ZJTklTSF9ET05FICAgID0gNDsgLyogZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dCAqL1xuXG52YXIgT1NfQ09ERSA9IDB4MDM7IC8vIFVuaXggOikgLiBEb24ndCBkZXRlY3QsIHVzZSB0aGlzIGRlZmF1bHQuXG5cbmZ1bmN0aW9uIGVycihzdHJtLCBlcnJvckNvZGUpIHtcbiAgc3RybS5tc2cgPSBtc2dbZXJyb3JDb2RlXTtcbiAgcmV0dXJuIGVycm9yQ29kZTtcbn1cblxuZnVuY3Rpb24gcmFuayhmKSB7XG4gIHJldHVybiAoKGYpIDw8IDEpIC0gKChmKSA+IDQgPyA5IDogMCk7XG59XG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXNcbiAqIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXRcbiAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5vdXRwdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuXG4gKiAoU2VlIGFsc28gcmVhZF9idWYoKSkuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoX3BlbmRpbmcoc3RybSkge1xuICB2YXIgcyA9IHN0cm0uc3RhdGU7XG5cbiAgLy9fdHJfZmx1c2hfYml0cyhzKTtcbiAgdmFyIGxlbiA9IHMucGVuZGluZztcbiAgaWYgKGxlbiA+IHN0cm0uYXZhaWxfb3V0KSB7XG4gICAgbGVuID0gc3RybS5hdmFpbF9vdXQ7XG4gIH1cbiAgaWYgKGxlbiA9PT0gMCkgeyByZXR1cm47IH1cblxuICB1dGlscy5hcnJheVNldChzdHJtLm91dHB1dCwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nX291dCwgbGVuLCBzdHJtLm5leHRfb3V0KTtcbiAgc3RybS5uZXh0X291dCArPSBsZW47XG4gIHMucGVuZGluZ19vdXQgKz0gbGVuO1xuICBzdHJtLnRvdGFsX291dCArPSBsZW47XG4gIHN0cm0uYXZhaWxfb3V0IC09IGxlbjtcbiAgcy5wZW5kaW5nIC09IGxlbjtcbiAgaWYgKHMucGVuZGluZyA9PT0gMCkge1xuICAgIHMucGVuZGluZ19vdXQgPSAwO1xuICB9XG59XG5cblxuZnVuY3Rpb24gZmx1c2hfYmxvY2tfb25seShzLCBsYXN0KSB7XG4gIHRyZWVzLl90cl9mbHVzaF9ibG9jayhzLCAocy5ibG9ja19zdGFydCA+PSAwID8gcy5ibG9ja19zdGFydCA6IC0xKSwgcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQsIGxhc3QpO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgZmx1c2hfcGVuZGluZyhzLnN0cm0pO1xufVxuXG5cbmZ1bmN0aW9uIHB1dF9ieXRlKHMsIGIpIHtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluXG4gKiBwZW5kaW5nX2J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0U2hvcnRNU0IocywgYikge1xuLy8gIHB1dF9ieXRlKHMsIChCeXRlKShiID4+IDgpKTtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiAmIDB4ZmYpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAoYiA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGIgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMlxuICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2hcbiAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkXG4gKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+aW5wdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGZyb20gaXQuXG4gKiAoU2VlIGFsc28gZmx1c2hfcGVuZGluZygpKS5cbiAqL1xuZnVuY3Rpb24gcmVhZF9idWYoc3RybSwgYnVmLCBzdGFydCwgc2l6ZSkge1xuICB2YXIgbGVuID0gc3RybS5hdmFpbF9pbjtcblxuICBpZiAobGVuID4gc2l6ZSkgeyBsZW4gPSBzaXplOyB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuIDA7IH1cblxuICBzdHJtLmF2YWlsX2luIC09IGxlbjtcblxuICAvLyB6bWVtY3B5KGJ1Ziwgc3RybS0+bmV4dF9pbiwgbGVuKTtcbiAgdXRpbHMuYXJyYXlTZXQoYnVmLCBzdHJtLmlucHV0LCBzdHJtLm5leHRfaW4sIGxlbiwgc3RhcnQpO1xuICBpZiAoc3RybS5zdGF0ZS53cmFwID09PSAxKSB7XG4gICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIGVsc2UgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMikge1xuICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBidWYsIGxlbiwgc3RhcnQpO1xuICB9XG5cbiAgc3RybS5uZXh0X2luICs9IGxlbjtcbiAgc3RybS50b3RhbF9pbiArPSBsZW47XG5cbiAgcmV0dXJuIGxlbjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNldCBtYXRjaF9zdGFydCB0byB0aGUgbG9uZ2VzdCBtYXRjaCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIGFuZFxuICogcmV0dXJuIGl0cyBsZW5ndGguIE1hdGNoZXMgc2hvcnRlciBvciBlcXVhbCB0byBwcmV2X2xlbmd0aCBhcmUgZGlzY2FyZGVkLFxuICogaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFuZCBtYXRjaF9zdGFydCBpc1xuICogZ2FyYmFnZS5cbiAqIElOIGFzc2VydGlvbnM6IGN1cl9tYXRjaCBpcyB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhlIGN1cnJlbnRcbiAqICAgc3RyaW5nIChzdHJzdGFydCkgYW5kIGl0cyBkaXN0YW5jZSBpcyA8PSBNQVhfRElTVCwgYW5kIHByZXZfbGVuZ3RoID49IDFcbiAqIE9VVCBhc3NlcnRpb246IHRoZSBtYXRjaCBsZW5ndGggaXMgbm90IGdyZWF0ZXIgdGhhbiBzLT5sb29rYWhlYWQuXG4gKi9cbmZ1bmN0aW9uIGxvbmdlc3RfbWF0Y2gocywgY3VyX21hdGNoKSB7XG4gIHZhciBjaGFpbl9sZW5ndGggPSBzLm1heF9jaGFpbl9sZW5ndGg7ICAgICAgLyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovXG4gIHZhciBzY2FuID0gcy5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi9cbiAgdmFyIG1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqL1xuICB2YXIgYmVzdF9sZW4gPSBzLnByZXZfbGVuZ3RoOyAgICAgICAgICAgICAgLyogYmVzdCBtYXRjaCBsZW5ndGggc28gZmFyICovXG4gIHZhciBuaWNlX21hdGNoID0gcy5uaWNlX21hdGNoOyAgICAgICAgICAgICAvKiBzdG9wIGlmIG1hdGNoIGxvbmcgZW5vdWdoICovXG4gIHZhciBsaW1pdCA9IChzLnN0cnN0YXJ0ID4gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpID9cbiAgICAgIHMuc3Ryc3RhcnQgLSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSA6IDAvKk5JTCovO1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7IC8vIHNob3J0Y3V0XG5cbiAgdmFyIHdtYXNrID0gcy53X21hc2s7XG4gIHZhciBwcmV2ICA9IHMucHJldjtcblxuICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLFxuICAgKiB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nIG9mIHdpbmRvdyBpbmRleCAwLlxuICAgKi9cblxuICB2YXIgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgdmFyIHNjYW5fZW5kMSAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdO1xuICB2YXIgc2Nhbl9lbmQgICA9IF93aW5bc2NhbiArIGJlc3RfbGVuXTtcblxuICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi5cbiAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIC8vIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCBcIkNvZGUgdG9vIGNsZXZlclwiKTtcblxuICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqL1xuICBpZiAocy5wcmV2X2xlbmd0aCA+PSBzLmdvb2RfbWF0Y2gpIHtcbiAgICBjaGFpbl9sZW5ndGggPj49IDI7XG4gIH1cbiAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeVxuICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIGlmIChuaWNlX21hdGNoID4gcy5sb29rYWhlYWQpIHsgbmljZV9tYXRjaCA9IHMubG9va2FoZWFkOyB9XG5cbiAgLy8gQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgXCJuZWVkIGxvb2thaGVhZFwiKTtcblxuICBkbyB7XG4gICAgLy8gQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCBcIm5vIGZ1dHVyZVwiKTtcbiAgICBtYXRjaCA9IGN1cl9tYXRjaDtcblxuICAgIC8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZVxuICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDIuICBOb3RlIHRoYXQgdGhlIGNoZWNrcyBiZWxvd1xuICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZVxuICAgICAqIHJlYXNvbnMuICBUaGVyZWZvcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgd2lsbCBiZSBhY2Nlc3NlZCwgYW5kXG4gICAgICogY29uZGl0aW9uYWwganVtcHMgd2lsbCBiZSBtYWRlIHRoYXQgZGVwZW5kIG9uIHRob3NlIHZhbHVlcy5cbiAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc29cbiAgICAgKiB0aGUgb3V0cHV0IG9mIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSB1bmluaXRpYWxpemVkIHZhbHVlcy5cbiAgICAgKi9cblxuICAgIGlmIChfd2luW21hdGNoICsgYmVzdF9sZW5dICAgICAhPT0gc2Nhbl9lbmQgIHx8XG4gICAgICAgIF93aW5bbWF0Y2ggKyBiZXN0X2xlbiAtIDFdICE9PSBzY2FuX2VuZDEgfHxcbiAgICAgICAgX3dpblttYXRjaF0gICAgICAgICAgICAgICAgIT09IF93aW5bc2Nhbl0gfHxcbiAgICAgICAgX3dpblsrK21hdGNoXSAgICAgICAgICAgICAgIT09IF93aW5bc2NhbiArIDFdKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZVxuICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pXG4gICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXlcbiAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0XG4gICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguXG4gICAgICovXG4gICAgc2NhbiArPSAyO1xuICAgIG1hdGNoKys7XG4gICAgLy8gQXNzZXJ0KCpzY2FuID09ICptYXRjaCwgXCJtYXRjaFsyXT9cIik7XG5cbiAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uO1xuICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LlxuICAgICAqL1xuICAgIGRvIHtcbiAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgIH0gd2hpbGUgKF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTtcblxuICAgIC8vIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCBcIndpbGQgc2NhblwiKTtcblxuICAgIGxlbiA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIO1xuXG4gICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7XG4gICAgICBzLm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoO1xuICAgICAgYmVzdF9sZW4gPSBsZW47XG4gICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgICAgIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG4gICAgfVxuICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQgJiYgLS1jaGFpbl9sZW5ndGggIT09IDApO1xuXG4gIGlmIChiZXN0X2xlbiA8PSBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBiZXN0X2xlbjtcbiAgfVxuICByZXR1cm4gcy5sb29rYWhlYWQ7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LlxuICogVXBkYXRlcyBzdHJzdGFydCBhbmQgbG9va2FoZWFkLlxuICpcbiAqIElOIGFzc2VydGlvbjogbG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRFxuICogT1VUIGFzc2VydGlvbnM6IHN0cnN0YXJ0IDw9IHdpbmRvd19zaXplLU1JTl9MT09LQUhFQURcbiAqICAgIEF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGF2YWlsX2luID09IDA7IHJlYWRzIGFyZVxuICogICAgcGVyZm9ybWVkIGZvciBhdCBsZWFzdCB0d28gYnl0ZXMgKHJlcXVpcmVkIGZvciB0aGUgemlwIHRyYW5zbGF0ZV9lb2xcbiAqICAgIG9wdGlvbiAtLSBub3Qgc3VwcG9ydGVkIGhlcmUpLlxuICovXG5mdW5jdGlvbiBmaWxsX3dpbmRvdyhzKSB7XG4gIHZhciBfd19zaXplID0gcy53X3NpemU7XG4gIHZhciBwLCBuLCBtLCBtb3JlLCBzdHI7XG5cbiAgLy9Bc3NlcnQocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCwgXCJhbHJlYWR5IGVub3VnaCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIG1vcmUgPSBzLndpbmRvd19zaXplIC0gcy5sb29rYWhlYWQgLSBzLnN0cnN0YXJ0O1xuXG4gICAgLy8gSlMgaW50cyBoYXZlIDMyIGJpdCwgYmxvY2sgYmVsb3cgbm90IG5lZWRlZFxuICAgIC8qIERlYWwgd2l0aCAhQCMkJSA2NEsgbGltaXQ6ICovXG4gICAgLy9pZiAoc2l6ZW9mKGludCkgPD0gMikge1xuICAgIC8vICAgIGlmIChtb3JlID09IDAgJiYgcy0+c3Ryc3RhcnQgPT0gMCAmJiBzLT5sb29rYWhlYWQgPT0gMCkge1xuICAgIC8vICAgICAgICBtb3JlID0gd3NpemU7XG4gICAgLy9cbiAgICAvLyAgfSBlbHNlIGlmIChtb3JlID09ICh1bnNpZ25lZCkoLTEpKSB7XG4gICAgLy8gICAgICAgIC8qIFZlcnkgdW5saWtlbHksIGJ1dCBwb3NzaWJsZSBvbiAxNiBiaXQgbWFjaGluZSBpZlxuICAgIC8vICAgICAgICAgKiBzdHJzdGFydCA9PSAwICYmIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIGEgYnl0ZSBhdCB0aW1lKVxuICAgIC8vICAgICAgICAgKi9cbiAgICAvLyAgICAgICAgbW9yZS0tO1xuICAgIC8vICAgIH1cbiAgICAvL31cblxuXG4gICAgLyogSWYgdGhlIHdpbmRvdyBpcyBhbG1vc3QgZnVsbCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGxvb2thaGVhZCxcbiAgICAgKiBtb3ZlIHRoZSB1cHBlciBoYWxmIHRvIHRoZSBsb3dlciBvbmUgdG8gbWFrZSByb29tIGluIHRoZSB1cHBlciBoYWxmLlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0ID49IF93X3NpemUgKyAoX3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG5cbiAgICAgIHV0aWxzLmFycmF5U2V0KHMud2luZG93LCBzLndpbmRvdywgX3dfc2l6ZSwgX3dfc2l6ZSwgMCk7XG4gICAgICBzLm1hdGNoX3N0YXJ0IC09IF93X3NpemU7XG4gICAgICBzLnN0cnN0YXJ0IC09IF93X3NpemU7XG4gICAgICAvKiB3ZSBub3cgaGF2ZSBzdHJzdGFydCA+PSBNQVhfRElTVCAqL1xuICAgICAgcy5ibG9ja19zdGFydCAtPSBfd19zaXplO1xuXG4gICAgICAvKiBTbGlkZSB0aGUgaGFzaCB0YWJsZSAoY291bGQgYmUgYXZvaWRlZCB3aXRoIDMyIGJpdCB2YWx1ZXNcbiAgICAgICBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UpLiBXZSBzbGlkZSBldmVuIHdoZW4gbGV2ZWwgPT0gMFxuICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDBcbiAgICAgICBsYXRlci4gKFVzaW5nIGxldmVsIDAgcGVybWFuZW50bHkgaXMgbm90IGFuIG9wdGltYWwgdXNhZ2Ugb2ZcbiAgICAgICB6bGliLCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcGF0aG9sb2dpY2FsIGNhc2UuKVxuICAgICAgICovXG5cbiAgICAgIG4gPSBzLmhhc2hfc2l6ZTtcbiAgICAgIHAgPSBuO1xuICAgICAgZG8ge1xuICAgICAgICBtID0gcy5oZWFkWy0tcF07XG4gICAgICAgIHMuaGVhZFtwXSA9IChtID49IF93X3NpemUgPyBtIC0gX3dfc2l6ZSA6IDApO1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbiA9IF93X3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMucHJldlstLXBdO1xuICAgICAgICBzLnByZXZbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgICAgLyogSWYgbiBpcyBub3Qgb24gYW55IGhhc2ggY2hhaW4sIHByZXZbbl0gaXMgZ2FyYmFnZSBidXRcbiAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC5cbiAgICAgICAgICovXG4gICAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgICBtb3JlICs9IF93X3NpemU7XG4gICAgfVxuICAgIGlmIChzLnN0cm0uYXZhaWxfaW4gPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8qIElmIHRoZXJlIHdhcyBubyBzbGlkaW5nOlxuICAgICAqICAgIHN0cnN0YXJ0IDw9IFdTSVpFK01BWF9ESVNULTEgJiYgbG9va2FoZWFkIDw9IE1JTl9MT09LQUhFQUQgLSAxICYmXG4gICAgICogICAgbW9yZSA9PSB3aW5kb3dfc2l6ZSAtIGxvb2thaGVhZCAtIHN0cnN0YXJ0XG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIChNSU5fTE9PS0FIRUFELTEgKyBXU0laRSArIE1BWF9ESVNULTEpXG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIDIqV1NJWkUgKyAyXG4gICAgICogSW4gdGhlIEJJR19NRU0gb3IgTU1BUCBjYXNlIChub3QgeWV0IHN1cHBvcnRlZCksXG4gICAgICogICB3aW5kb3dfc2l6ZSA9PSBpbnB1dF9zaXplICsgTUlOX0xPT0tBSEVBRCAgJiZcbiAgICAgKiAgIHN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIDw9IGlucHV0X3NpemUgPT4gbW9yZSA+PSBNSU5fTE9PS0FIRUFELlxuICAgICAqIE90aGVyd2lzZSwgd2luZG93X3NpemUgPT0gMipXU0laRSBzbyBtb3JlID49IDIuXG4gICAgICogSWYgdGhlcmUgd2FzIHNsaWRpbmcsIG1vcmUgPj0gV1NJWkUuIFNvIGluIGFsbCBjYXNlcywgbW9yZSA+PSAyLlxuICAgICAqL1xuICAgIC8vQXNzZXJ0KG1vcmUgPj0gMiwgXCJtb3JlIDwgMlwiKTtcbiAgICBuID0gcmVhZF9idWYocy5zdHJtLCBzLndpbmRvdywgcy5zdHJzdGFydCArIHMubG9va2FoZWFkLCBtb3JlKTtcbiAgICBzLmxvb2thaGVhZCArPSBuO1xuXG4gICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6ICovXG4gICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPj0gTUlOX01BVENIKSB7XG4gICAgICBzdHIgPSBzLnN0cnN0YXJ0IC0gcy5pbnNlcnQ7XG4gICAgICBzLmluc19oID0gcy53aW5kb3dbc3RyXTtcblxuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyAxXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyAxXSkgJiBzLmhhc2hfbWFzaztcbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgQ2FsbCB1cGRhdGVfaGFzaCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICB3aGlsZSAocy5pbnNlcnQpIHtcbiAgICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgICBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI7XG4gICAgICAgIHN0cisrO1xuICAgICAgICBzLmluc2VydC0tO1xuICAgICAgICBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA8IE1JTl9NQVRDSCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZSB3aG9sZSBpbnB1dCBoYXMgbGVzcyB0aGFuIE1JTl9NQVRDSCBieXRlcywgaW5zX2ggaXMgZ2FyYmFnZSxcbiAgICAgKiBidXQgdGhpcyBpcyBub3QgaW1wb3J0YW50IHNpbmNlIG9ubHkgbGl0ZXJhbCBieXRlcyB3aWxsIGJlIGVtaXR0ZWQuXG4gICAgICovXG5cbiAgfSB3aGlsZSAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIHMuc3RybS5hdmFpbF9pbiAhPT0gMCk7XG5cbiAgLyogSWYgdGhlIFdJTl9JTklUIGJ5dGVzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZGF0YSBoYXZlIG5ldmVyIGJlZW5cbiAgICogd3JpdHRlbiwgdGhlbiB6ZXJvIHRob3NlIGJ5dGVzIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayByZXBvcnRzIG9mXG4gICAqIHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCAob3IgdW5pbml0aWFsaXNlZCBhcyBKdWxpYW4gd3JpdGVzKSBieXRlcyBieVxuICAgKiB0aGUgbG9uZ2VzdCBtYXRjaCByb3V0aW5lcy4gIFVwZGF0ZSB0aGUgaGlnaCB3YXRlciBtYXJrIGZvciB0aGUgbmV4dFxuICAgKiB0aW1lIHRocm91Z2ggaGVyZS4gIFdJTl9JTklUIGlzIHNldCB0byBNQVhfTUFUQ0ggc2luY2UgdGhlIGxvbmdlc3QgbWF0Y2hcbiAgICogcm91dGluZXMgYWxsb3cgc2Nhbm5pbmcgdG8gc3Ryc3RhcnQgKyBNQVhfTUFUQ0gsIGlnbm9yaW5nIGxvb2thaGVhZC5cbiAgICovXG4vLyAgaWYgKHMuaGlnaF93YXRlciA8IHMud2luZG93X3NpemUpIHtcbi8vICAgIHZhciBjdXJyID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkO1xuLy8gICAgdmFyIGluaXQgPSAwO1xuLy9cbi8vICAgIGlmIChzLmhpZ2hfd2F0ZXIgPCBjdXJyKSB7XG4vLyAgICAgIC8qIFByZXZpb3VzIGhpZ2ggd2F0ZXIgbWFyayBiZWxvdyBjdXJyZW50IGRhdGEgLS0gemVybyBXSU5fSU5JVFxuLy8gICAgICAgKiBieXRlcyBvciB1cCB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy5cbi8vICAgICAgICovXG4vLyAgICAgIGluaXQgPSBzLndpbmRvd19zaXplIC0gY3Vycjtcbi8vICAgICAgaWYgKGluaXQgPiBXSU5fSU5JVClcbi8vICAgICAgICBpbml0ID0gV0lOX0lOSVQ7XG4vLyAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIGN1cnIsICh1bnNpZ25lZClpbml0KTtcbi8vICAgICAgcy0+aGlnaF93YXRlciA9IGN1cnIgKyBpbml0O1xuLy8gICAgfVxuLy8gICAgZWxzZSBpZiAocy0+aGlnaF93YXRlciA8ICh1bGcpY3VyciArIFdJTl9JTklUKSB7XG4vLyAgICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBhdCBvciBhYm92ZSBjdXJyZW50IGRhdGEsIGJ1dCBiZWxvdyBjdXJyZW50IGRhdGFcbi8vICAgICAgICogcGx1cyBXSU5fSU5JVCAtLSB6ZXJvIG91dCB0byBjdXJyZW50IGRhdGEgcGx1cyBXSU5fSU5JVCwgb3IgdXBcbi8vICAgICAgICogdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gKHVsZyljdXJyICsgV0lOX0lOSVQgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICBpZiAoaW5pdCA+IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcilcbi8vICAgICAgICBpbml0ID0gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBzLT5oaWdoX3dhdGVyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgKz0gaW5pdDtcbi8vICAgIH1cbi8vICB9XG4vL1xuLy8gIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplIC0gTUlOX0xPT0tBSEVBRCxcbi8vICAgIFwibm90IGVub3VnaCByb29tIGZvciBzZWFyY2hcIik7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weSB3aXRob3V0IGNvbXByZXNzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm5cbiAqIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgc2luY2VcbiAqIHVuY29tcHJlc3NpYmxlIGRhdGEgaXMgcHJvYmFibHkgbm90IHVzZWZ1bC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkXG4gKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uXG4gKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgZXh0cmEgY29weWluZyBmcm9tXG4gKiB3aW5kb3cgdG8gcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc3RvcmVkKHMsIGZsdXNoKSB7XG4gIC8qIFN0b3JlZCBibG9ja3MgYXJlIGxpbWl0ZWQgdG8gMHhmZmZmIGJ5dGVzLCBwZW5kaW5nX2J1ZiBpcyBsaW1pdGVkXG4gICAqIHRvIHBlbmRpbmdfYnVmX3NpemUsIGFuZCBlYWNoIHN0b3JlZCBibG9jayBoYXMgYSA1IGJ5dGUgaGVhZGVyOlxuICAgKi9cbiAgdmFyIG1heF9ibG9ja19zaXplID0gMHhmZmZmO1xuXG4gIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMucGVuZGluZ19idWZfc2l6ZSAtIDUpIHtcbiAgICBtYXhfYmxvY2tfc2l6ZSA9IHMucGVuZGluZ19idWZfc2l6ZSAtIDU7XG4gIH1cblxuICAvKiBDb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSBpbnB1dCB0byBvdXRwdXQ6ICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBGaWxsIHRoZSB3aW5kb3cgYXMgbXVjaCBhcyBwb3NzaWJsZTogKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPD0gMSkge1xuXG4gICAgICAvL0Fzc2VydChzLT5zdHJzdGFydCA8IHMtPndfc2l6ZStNQVhfRElTVChzKSB8fFxuICAgICAgLy8gIHMtPmJsb2NrX3N0YXJ0ID49IChsb25nKXMtPndfc2l6ZSwgXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgaWYgKCEocy5zdHJzdGFydCA8IHMud19zaXplICsgKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgfHxcbi8vICAgICAgICBzLmJsb2NrX3N0YXJ0ID49IHMud19zaXplKSkge1xuLy8gICAgICAgIHRocm93ICBuZXcgRXJyb3IoXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgfVxuXG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuXG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cbiAgICAvL0Fzc2VydChzLT5ibG9ja19zdGFydCA+PSAwTCwgXCJibG9jayBnb25lXCIpO1xuLy8gICAgaWYgKHMuYmxvY2tfc3RhcnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJibG9jayBnb25lXCIpO1xuXG4gICAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgICBzLmxvb2thaGVhZCA9IDA7XG5cbiAgICAvKiBFbWl0IGEgc3RvcmVkIGJsb2NrIGlmIHBlbmRpbmdfYnVmIHdpbGwgYmUgZnVsbDogKi9cbiAgICB2YXIgbWF4X3N0YXJ0ID0gcy5ibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplO1xuXG4gICAgaWYgKHMuc3Ryc3RhcnQgPT09IDAgfHwgcy5zdHJzdGFydCA+PSBtYXhfc3RhcnQpIHtcbiAgICAgIC8qIHN0cnN0YXJ0ID09IDAgaXMgcG9zc2libGUgd2hlbiB3cmFwYXJvdW5kIG9uIDE2LWJpdCBtYWNoaW5lICovXG4gICAgICBzLmxvb2thaGVhZCA9IHMuc3Ryc3RhcnQgLSBtYXhfc3RhcnQ7XG4gICAgICBzLnN0cnN0YXJ0ID0gbWF4X3N0YXJ0O1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cblxuXG4gICAgfVxuICAgIC8qIEZsdXNoIGlmIHdlIG1heSBoYXZlIHRvIHNsaWRlLCBvdGhlcndpc2UgYmxvY2tfc3RhcnQgbWF5IGJlY29tZVxuICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6XG4gICAgICovXG4gICAgaWYgKHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0ID49IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuXG4gIHMuaW5zZXJ0ID0gMDtcblxuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cblxuICBpZiAocy5zdHJzdGFydCA+IHMuYmxvY2tfc3RhcnQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfTkVFRF9NT1JFO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXByZXNzIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4gdGhlIGN1cnJlbnRcbiAqIGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGFuZCBpbnNlcnRzXG4gKiBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBvbmx5IGZvciB1bm1hdGNoZWQgc3RyaW5ncyBvciBmb3Igc2hvcnRcbiAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9mYXN0KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovXG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGVcbiAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjpcbiAgICAgKi9cbiAgICBoYXNoX2hlYWQgPSAwLypOSUwqLztcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgLyoqKi9cbiAgICB9XG5cbiAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLlxuICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENIXG4gICAgICovXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgKChzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkKSA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkpIHtcbiAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nXG4gICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2hcbiAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKHMsIGhhc2hfaGVhZCk7XG4gICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqL1xuICAgIH1cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvLyBjaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LCBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCk7IC8vIGZvciBkZWJ1ZyBvbmx5XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuXG4gICAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgICAgICovXG4gICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gcy5tYXhfbGF6eV9tYXRjaC8qbWF4X2luc2VydF9sZW5ndGgqLyAmJiBzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGgtLTsgLyogc3RyaW5nIGF0IHN0cnN0YXJ0IGFscmVhZHkgaW4gdGFibGUgKi9cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgICAgLyogc3Ryc3RhcnQgbmV2ZXIgZXhjZWVkcyBXU0laRS1NQVhfTUFUQ0gsIHNvIHRoZXJlIGFyZVxuICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuXG4gICAgICAgICAgICovXG4gICAgICAgIH0gd2hpbGUgKC0tcy5tYXRjaF9sZW5ndGggIT09IDApO1xuICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICB9IGVsc2VcbiAgICAgIHtcbiAgICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgICAgICBzLmluc19oID0gcy53aW5kb3dbcy5zdHJzdGFydF07XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMuaW5zX2gsIHMud2luZG93W3Muc3Ryc3RhcnQrMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgMV0pICYgcy5oYXNoX21hc2s7XG5cbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lc1xuLy8jZW5kaWZcbiAgICAgICAgLyogSWYgbG9va2FoZWFkIDwgTUlOX01BVENILCBpbnNfaCBpcyBnYXJiYWdlLCBidXQgaXQgZG9lcyBub3RcbiAgICAgICAgICogbWF0dGVyIHNpbmNlIGl0IHdpbGwgYmUgcmVjb21wdXRlZCBhdCBuZXh0IGRlZmxhdGUgY2FsbC5cbiAgICAgICAgICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy53aW5kb3dbcy5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAoKHMuc3Ryc3RhcnQgPCAoTUlOX01BVENIIC0gMSkpID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDEpO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2FtZSBhcyBhYm92ZSwgYnV0IGFjaGlldmVzIGJldHRlciBjb21wcmVzc2lvbi4gV2UgdXNlIGEgbGF6eVxuICogZXZhbHVhdGlvbiBmb3IgbWF0Y2hlczogYSBtYXRjaCBpcyBmaW5hbGx5IGFkb3B0ZWQgb25seSBpZiB0aGVyZSBpc1xuICogbm8gYmV0dGVyIG1hdGNoIGF0IHRoZSBuZXh0IHdpbmRvdyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9zbG93KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAgIC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgdmFyIG1heF9pbnNlcnQ7XG5cbiAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKi9cbiAgICBzLnByZXZfbGVuZ3RoID0gcy5tYXRjaF9sZW5ndGg7XG4gICAgcy5wcmV2X21hdGNoID0gcy5tYXRjaF9zdGFydDtcbiAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG5cbiAgICBpZiAoaGFzaF9oZWFkICE9PSAwLypOSUwqLyAmJiBzLnByZXZfbGVuZ3RoIDwgcy5tYXhfbGF6eV9tYXRjaCAmJlxuICAgICAgICBzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpLypNQVhfRElTVChzKSovKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cblxuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IDUgJiZcbiAgICAgICAgIChzLnN0cmF0ZWd5ID09PSBaX0ZJTFRFUkVEIHx8IChzLm1hdGNoX2xlbmd0aCA9PT0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0ID4gNDA5Ni8qVE9PX0ZBUiovKSkpIHtcblxuICAgICAgICAvKiBJZiBwcmV2X21hdGNoIGlzIGFsc28gTUlOX01BVENILCBtYXRjaF9zdGFydCBpcyBnYXJiYWdlXG4gICAgICAgICAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuXG4gICAgICAgICAqL1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudFxuICAgICAqIG1hdGNoIGlzIG5vdCBiZXR0ZXIsIG91dHB1dCB0aGUgcHJldmlvdXMgbWF0Y2g6XG4gICAgICovXG4gICAgaWYgKHMucHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMubWF0Y2hfbGVuZ3RoIDw9IHMucHJldl9sZW5ndGgpIHtcbiAgICAgIG1heF9pbnNlcnQgPSBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQgLSBNSU5fTUFUQ0g7XG4gICAgICAvKiBEbyBub3QgaW5zZXJ0IHN0cmluZ3MgaW4gaGFzaCB0YWJsZSBiZXlvbmQgdGhpcy4gKi9cblxuICAgICAgLy9jaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LTEsIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCk7XG5cbiAgICAgIC8qKipfdHJfdGFsbHlfZGlzdChzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgIHMucHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7KioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSAxIC0gcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENIKTtcbiAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLlxuICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdFxuICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpblxuICAgICAgICogdGhlIGhhc2ggdGFibGUuXG4gICAgICAgKi9cbiAgICAgIHMubG9va2FoZWFkIC09IHMucHJldl9sZW5ndGggLSAxO1xuICAgICAgcy5wcmV2X2xlbmd0aCAtPSAyO1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoKytzLnN0cnN0YXJ0IDw9IG1heF9pbnNlcnQpIHtcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKC0tcy5wcmV2X2xlbmd0aCAhPT0gMCk7XG4gICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICBzLnN0cnN0YXJ0Kys7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIC8qKiovXG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYVxuICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaFxuICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC5cbiAgICAgICAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTtcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLX09OTFkocywgMCkgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgLyoqKi9cbiAgICAgIH1cbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCB0byBjb21wYXJlIHdpdGgsIHdhaXQgZm9yXG4gICAgICAgKiB0aGUgbmV4dCBzdGVwIHRvIGRlY2lkZS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGZsdXNoICE9IFpfTk9fRkxVU0gsIFwibm8gZmx1c2g/XCIpO1xuICBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIH1cbiAgcy5pbnNlcnQgPSBzLnN0cnN0YXJ0IDwgTUlOX01BVENIIC0gMSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZVxuICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mXG4gKiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBaX1JMRS4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfcmxlKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG4gIHZhciBwcmV2OyAgICAgICAgICAgICAgLyogYnl0ZSBhdCBkaXN0YW5jZSBvbmUgdG8gbWF0Y2ggKi9cbiAgdmFyIHNjYW4sIHN0cmVuZDsgICAgICAvKiBzY2FuIGdvZXMgdXAgdG8gc3RyZW5kIGZvciBsZW5ndGggb2YgcnVuICovXG5cbiAgdmFyIF93aW4gPSBzLndpbmRvdztcblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIGxvbmdlc3QgcnVuLCBwbHVzIG9uZSBmb3IgdGhlIHVucm9sbGVkIGxvb3AuXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBTZWUgaG93IG1hbnkgdGltZXMgdGhlIHByZXZpb3VzIGJ5dGUgcmVwZWF0cyAqL1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgPiAwKSB7XG4gICAgICBzY2FuID0gcy5zdHJzdGFydCAtIDE7XG4gICAgICBwcmV2ID0gX3dpbltzY2FuXTtcbiAgICAgIGlmIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSkge1xuICAgICAgICBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLypqc2hpbnQgbm9lbXB0eTpmYWxzZSovXG4gICAgICAgIH0gd2hpbGUgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pO1xuICAgICAgICBpZiAocy5tYXRjaF9sZW5ndGggPiBzLmxvb2thaGVhZCkge1xuICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gcy5sb29rYWhlYWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1SW50KShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG4gICAgfVxuXG4gICAgLyogRW1pdCBtYXRjaCBpZiBoYXZlIHJ1biBvZiBNSU5fTUFUQ0ggb3IgbG9uZ2VyLCBlbHNlIGVtaXQgbGl0ZXJhbCAqL1xuICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5zdHJzdGFydCAtIDEsIHMubWF0Y2hfbGVuZ3RoKTtcblxuICAgICAgLyoqKiBfdHJfdGFsbHlfZGlzdChzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDEsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTtcblxuICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRm9yIFpfSFVGRk1BTl9PTkxZLCBkbyBub3QgbG9vayBmb3IgbWF0Y2hlcy4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuXG4gKiAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBIdWZmbWFuLilcbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgbGl0ZXJhbCB0byB3cml0ZS4gKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7ICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcbiAgICBzLmxvb2thaGVhZC0tO1xuICAgIHMuc3Ryc3RhcnQrKztcbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uXG4gKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG9cbiAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZVxuICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLlxuICovXG5mdW5jdGlvbiBDb25maWcoZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluLCBmdW5jKSB7XG4gIHRoaXMuZ29vZF9sZW5ndGggPSBnb29kX2xlbmd0aDtcbiAgdGhpcy5tYXhfbGF6eSA9IG1heF9sYXp5O1xuICB0aGlzLm5pY2VfbGVuZ3RoID0gbmljZV9sZW5ndGg7XG4gIHRoaXMubWF4X2NoYWluID0gbWF4X2NoYWluO1xuICB0aGlzLmZ1bmMgPSBmdW5jO1xufVxuXG52YXIgY29uZmlndXJhdGlvbl90YWJsZTtcblxuY29uZmlndXJhdGlvbl90YWJsZSA9IFtcbiAgLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqL1xuICBuZXcgQ29uZmlnKDAsIDAsIDAsIDAsIGRlZmxhdGVfc3RvcmVkKSwgICAgICAgICAgLyogMCBzdG9yZSBvbmx5ICovXG4gIG5ldyBDb25maWcoNCwgNCwgOCwgNCwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgICAvKiAxIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoNCwgNSwgMTYsIDgsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAvKiAyICovXG4gIG5ldyBDb25maWcoNCwgNiwgMzIsIDMyLCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAvKiAzICovXG5cbiAgbmV3IENvbmZpZyg0LCA0LCAxNiwgMTYsIGRlZmxhdGVfc2xvdyksICAgICAgICAgIC8qIDQgbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDMyLCAzMiwgZGVmbGF0ZV9zbG93KSwgICAgICAgICAvKiA1ICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA2ICovXG4gIG5ldyBDb25maWcoOCwgMzIsIDEyOCwgMjU2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA3ICovXG4gIG5ldyBDb25maWcoMzIsIDEyOCwgMjU4LCAxMDI0LCBkZWZsYXRlX3Nsb3cpLCAgICAvKiA4ICovXG4gIG5ldyBDb25maWcoMzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3cpICAgICAvKiA5IG1heCBjb21wcmVzc2lvbiAqL1xuXTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIFwibG9uZ2VzdCBtYXRjaFwiIHJvdXRpbmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbVxuICovXG5mdW5jdGlvbiBsbV9pbml0KHMpIHtcbiAgcy53aW5kb3dfc2l6ZSA9IDIgKiBzLndfc2l6ZTtcblxuICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6XG4gICAqL1xuICBzLm1heF9sYXp5X21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfbGF6eTtcbiAgcy5nb29kX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5nb29kX2xlbmd0aDtcbiAgcy5uaWNlX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5uaWNlX2xlbmd0aDtcbiAgcy5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfY2hhaW47XG5cbiAgcy5zdHJzdGFydCA9IDA7XG4gIHMuYmxvY2tfc3RhcnQgPSAwO1xuICBzLmxvb2thaGVhZCA9IDA7XG4gIHMuaW5zZXJ0ID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzLmluc19oID0gMDtcbn1cblxuXG5mdW5jdGlvbiBEZWZsYXRlU3RhdGUoKSB7XG4gIHRoaXMuc3RybSA9IG51bGw7ICAgICAgICAgICAgLyogcG9pbnRlciBiYWNrIHRvIHRoaXMgemxpYiBzdHJlYW0gKi9cbiAgdGhpcy5zdGF0dXMgPSAwOyAgICAgICAgICAgIC8qIGFzIHRoZSBuYW1lIGltcGxpZXMgKi9cbiAgdGhpcy5wZW5kaW5nX2J1ZiA9IG51bGw7ICAgICAgLyogb3V0cHV0IHN0aWxsIHBlbmRpbmcgKi9cbiAgdGhpcy5wZW5kaW5nX2J1Zl9zaXplID0gMDsgIC8qIHNpemUgb2YgcGVuZGluZ19idWYgKi9cbiAgdGhpcy5wZW5kaW5nX291dCA9IDA7ICAgICAgIC8qIG5leHQgcGVuZGluZyBieXRlIHRvIG91dHB1dCB0byB0aGUgc3RyZWFtICovXG4gIHRoaXMucGVuZGluZyA9IDA7ICAgICAgICAgICAvKiBuYiBvZiBieXRlcyBpbiB0aGUgcGVuZGluZyBidWZmZXIgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5nemhlYWQgPSBudWxsOyAgICAgICAgIC8qIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHRvIHdyaXRlICovXG4gIHRoaXMuZ3ppbmRleCA9IDA7ICAgICAgICAgICAvKiB3aGVyZSBpbiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCAqL1xuICB0aGlzLm1ldGhvZCA9IFpfREVGTEFURUQ7IC8qIGNhbiBvbmx5IGJlIERFRkxBVEVEICovXG4gIHRoaXMubGFzdF9mbHVzaCA9IC0xOyAgIC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi9cblxuICB0aGlzLndfc2l6ZSA9IDA7ICAvKiBMWjc3IHdpbmRvdyBzaXplICgzMksgYnkgZGVmYXVsdCkgKi9cbiAgdGhpcy53X2JpdHMgPSAwOyAgLyogbG9nMih3X3NpemUpICAoOC4uMTYpICovXG4gIHRoaXMud19tYXNrID0gMDsgIC8qIHdfc2l6ZSAtIDEgKi9cblxuICB0aGlzLndpbmRvdyA9IG51bGw7XG4gIC8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LFxuICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZVxuICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mXG4gICAqIHdTaXplLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5c1xuICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS5cbiAgICovXG5cbiAgdGhpcy53aW5kb3dfc2l6ZSA9IDA7XG4gIC8qIEFjdHVhbCBzaXplIG9mIHdpbmRvdzogMip3U2l6ZSwgZXhjZXB0IHdoZW4gdGhlIHVzZXIgaW5wdXQgYnVmZmVyXG4gICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuXG4gICAqL1xuXG4gIHRoaXMucHJldiA9IG51bGw7XG4gIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzXG4gICAqIGFycmF5IHRvIDY0SywgdGhpcyBsaW5rIGlzIG1haW50YWluZWQgb25seSBmb3IgdGhlIGxhc3QgMzJLIHN0cmluZ3MuXG4gICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLlxuICAgKi9cblxuICB0aGlzLmhlYWQgPSBudWxsOyAgIC8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovXG5cbiAgdGhpcy5pbnNfaCA9IDA7ICAgICAgIC8qIGhhc2ggaW5kZXggb2Ygc3RyaW5nIHRvIGJlIGluc2VydGVkICovXG4gIHRoaXMuaGFzaF9zaXplID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGFzaCB0YWJsZSAqL1xuICB0aGlzLmhhc2hfYml0cyA9IDA7ICAgLyogbG9nMihoYXNoX3NpemUpICovXG4gIHRoaXMuaGFzaF9tYXNrID0gMDsgICAvKiBoYXNoX3NpemUtMSAqL1xuXG4gIHRoaXMuaGFzaF9zaGlmdCA9IDA7XG4gIC8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoIGlucHV0XG4gICAqIHN0ZXAuIEl0IG11c3QgYmUgc3VjaCB0aGF0IGFmdGVyIE1JTl9NQVRDSCBzdGVwcywgdGhlIG9sZGVzdFxuICAgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczpcbiAgICogICBoYXNoX3NoaWZ0ICogTUlOX01BVENIID49IGhhc2hfYml0c1xuICAgKi9cblxuICB0aGlzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgLyogV2luZG93IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGJsb2NrLiBHZXRzXG4gICAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuXG4gICAqL1xuXG4gIHRoaXMubWF0Y2hfbGVuZ3RoID0gMDsgICAgICAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqL1xuICB0aGlzLnByZXZfbWF0Y2ggPSAwOyAgICAgICAgLyogcHJldmlvdXMgbWF0Y2ggKi9cbiAgdGhpcy5tYXRjaF9hdmFpbGFibGUgPSAwOyAgIC8qIHNldCBpZiBwcmV2aW91cyBtYXRjaCBleGlzdHMgKi9cbiAgdGhpcy5zdHJzdGFydCA9IDA7ICAgICAgICAgIC8qIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgKi9cbiAgdGhpcy5tYXRjaF9zdGFydCA9IDA7ICAgICAgIC8qIHN0YXJ0IG9mIG1hdGNoaW5nIHN0cmluZyAqL1xuICB0aGlzLmxvb2thaGVhZCA9IDA7ICAgICAgICAgLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdyAqL1xuXG4gIHRoaXMucHJldl9sZW5ndGggPSAwO1xuICAvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXNcbiAgICogYXJlIGRpc2NhcmRlZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uXG4gICAqL1xuXG4gIHRoaXMubWF4X2NoYWluX2xlbmd0aCA9IDA7XG4gIC8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzXG4gICAqIGxlbmd0aC4gIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGVcbiAgICogc3BlZWQuXG4gICAqL1xuXG4gIHRoaXMubWF4X2xhenlfbWF0Y2ggPSAwO1xuICAvKiBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgbWF0Y2ggb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoIGlzIHN0cmljdGx5XG4gICAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uXG4gICAqIGxldmVscyA+PSA0LlxuICAgKi9cbiAgLy8gVGhhdCdzIGFsaWFzIHRvIG1heF9sYXp5X21hdGNoLCBkb24ndCB1c2UgZGlyZWN0bHlcbiAgLy90aGlzLm1heF9pbnNlcnRfbGVuZ3RoID0gMDtcbiAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBub3RcbiAgICogZ3JlYXRlciB0aGFuIHRoaXMgbGVuZ3RoLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uIGxldmVscyA8PSAzLlxuICAgKi9cblxuICB0aGlzLmxldmVsID0gMDsgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICgxLi45KSAqL1xuICB0aGlzLnN0cmF0ZWd5ID0gMDsgIC8qIGZhdm9yIG9yIGZvcmNlIEh1ZmZtYW4gY29kaW5nKi9cblxuICB0aGlzLmdvb2RfbWF0Y2ggPSAwO1xuICAvKiBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMgKi9cblxuICB0aGlzLm5pY2VfbWF0Y2ggPSAwOyAvKiBTdG9wIHNlYXJjaGluZyB3aGVuIGN1cnJlbnQgbWF0Y2ggZXhjZWVkcyB0aGlzICovXG5cbiAgICAgICAgICAgICAgLyogdXNlZCBieSB0cmVlcy5jOiAqL1xuXG4gIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi9cblxuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgZHluX2R0cmVlWzIqRF9DT0RFUysxXTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi9cblxuICAvLyBVc2UgZmxhdCBhcnJheSBvZiBET1VCTEUgc2l6ZSwgd2l0aCBpbnRlcmxlYXZlZCBmYXRhLFxuICAvLyBiZWNhdXNlIEpTIGRvZXMgbm90IHN1cHBvcnQgZWZmZWN0aXZlXG4gIHRoaXMuZHluX2x0cmVlICA9IG5ldyB1dGlscy5CdWYxNihIRUFQX1NJWkUgKiAyKTtcbiAgdGhpcy5keW5fZHRyZWUgID0gbmV3IHV0aWxzLkJ1ZjE2KCgyICogRF9DT0RFUyArIDEpICogMik7XG4gIHRoaXMuYmxfdHJlZSAgICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIEJMX0NPREVTICsgMSkgKiAyKTtcbiAgemVybyh0aGlzLmR5bl9sdHJlZSk7XG4gIHplcm8odGhpcy5keW5fZHRyZWUpO1xuICB6ZXJvKHRoaXMuYmxfdHJlZSk7XG5cbiAgdGhpcy5sX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqL1xuICB0aGlzLmRfZGVzYyAgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgZGlzdGFuY2UgdHJlZSAqL1xuICB0aGlzLmJsX2Rlc2MgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovXG5cbiAgLy91c2ggYmxfY291bnRbTUFYX0JJVFMrMV07XG4gIHRoaXMuYmxfY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy9pbnQgaGVhcFsyKkxfQ09ERVMrMV07ICAgICAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHRoaXMuaGVhcCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHplcm8odGhpcy5oZWFwKTtcblxuICB0aGlzLmhlYXBfbGVuID0gMDsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhlYXAgKi9cbiAgdGhpcy5oZWFwX21heCA9IDA7ICAgICAgICAgICAgICAgLyogZWxlbWVudCBvZiBsYXJnZXN0IGZyZXF1ZW5jeSAqL1xuICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLlxuICAgKi9cblxuICB0aGlzLmRlcHRoID0gbmV3IHV0aWxzLkJ1ZjE2KDIgKiBMX0NPREVTICsgMSk7IC8vdWNoIGRlcHRoWzIqTF9DT0RFUysxXTtcbiAgemVybyh0aGlzLmRlcHRoKTtcbiAgLyogRGVwdGggb2YgZWFjaCBzdWJ0cmVlIHVzZWQgYXMgdGllIGJyZWFrZXIgZm9yIHRyZWVzIG9mIGVxdWFsIGZyZXF1ZW5jeVxuICAgKi9cblxuICB0aGlzLmxfYnVmID0gMDsgICAgICAgICAgLyogYnVmZmVyIGluZGV4IGZvciBsaXRlcmFscyBvciBsZW5ndGhzICovXG5cbiAgdGhpcy5saXRfYnVmc2l6ZSA9IDA7XG4gIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3JcbiAgICogbGltaXRpbmcgbGl0X2J1ZnNpemUgdG8gNjRLOlxuICAgKiAgIC0gZnJlcXVlbmNpZXMgY2FuIGJlIGtlcHQgaW4gMTYgYml0IGNvdW50ZXJzXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXRcbiAgICogICAgIGRhdGEgaXMgc3RpbGwgaW4gdGhlIHdpbmRvdyBzbyB3ZSBjYW4gc3RpbGwgZW1pdCBhIHN0b3JlZCBibG9jayBldmVuXG4gICAqICAgICB3aGVuIGlucHV0IGNvbWVzIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZvclxuICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYSBmaWxlIHNtYWxsZXIgdGhhbiA2NEssIHdlIGNhblxuICAgKiAgICAgZXZlbiBlbWl0IGEgc3RvcmVkIGZpbGUgaW5zdGVhZCBvZiBhIHN0b3JlZCBibG9jayAoc2F2aW5nIDUgYnl0ZXMpLlxuICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuXG4gICAqICAgLSBjcmVhdGluZyBuZXcgSHVmZm1hbiB0cmVlcyBsZXNzIGZyZXF1ZW50bHkgbWF5IG5vdCBwcm92aWRlIGZhc3RcbiAgICogICAgIGFkYXB0YXRpb24gdG8gY2hhbmdlcyBpbiB0aGUgaW5wdXQgZGF0YSBzdGF0aXN0aWNzLiAoVGFrZSBmb3JcbiAgICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieVxuICAgKiAgICAgYSBoaWdobHkgY29tcHJlc3NpYmxlIHN0cmluZyB0YWJsZS4pIFNtYWxsZXIgYnVmZmVyIHNpemVzIGdpdmVcbiAgICogICAgIGZhc3QgYWRhcHRhdGlvbiBidXQgaGF2ZSBvZiBjb3Vyc2UgdGhlIG92ZXJoZWFkIG9mIHRyYW5zbWl0dGluZ1xuICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LlxuICAgKiAgIC0gSSBjYW4ndCBjb3VudCBhYm92ZSA0XG4gICAqL1xuXG4gIHRoaXMubGFzdF9saXQgPSAwOyAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cblxuICB0aGlzLmRfYnVmID0gMDtcbiAgLyogQnVmZmVyIGluZGV4IGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZVxuICAgKiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZ1xuICAgKiBhcnJheSB3b3VsZCBiZSBuZWNlc3NhcnkuXG4gICAqL1xuXG4gIHRoaXMub3B0X2xlbiA9IDA7ICAgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIG9wdGltYWwgdHJlZXMgKi9cbiAgdGhpcy5zdGF0aWNfbGVuID0gMDsgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovXG4gIHRoaXMubWF0Y2hlcyA9IDA7ICAgICAgIC8qIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrICovXG4gIHRoaXMuaW5zZXJ0ID0gMDsgICAgICAgIC8qIGJ5dGVzIGF0IGVuZCBvZiB3aW5kb3cgbGVmdCB0byBpbnNlcnQgKi9cblxuXG4gIHRoaXMuYmlfYnVmID0gMDtcbiAgLyogT3V0cHV0IGJ1ZmZlci4gYml0cyBhcmUgaW5zZXJ0ZWQgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbSAobGVhc3RcbiAgICogc2lnbmlmaWNhbnQgYml0cykuXG4gICAqL1xuICB0aGlzLmJpX3ZhbGlkID0gMDtcbiAgLyogTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYmlfYnVmLiAgQWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QgdmFsaWQgYml0XG4gICAqIGFyZSBhbHdheXMgemVyby5cbiAgICovXG5cbiAgLy8gVXNlZCBmb3Igd2luZG93IG1lbW9yeSBpbml0LiBXZSBzYWZlbHkgaWdub3JlIGl0IGZvciBKUy4gVGhhdCBtYWtlc1xuICAvLyBzZW5zZSBvbmx5IGZvciBwb2ludGVycyBhbmQgbWVtb3J5IGNoZWNrIHRvb2xzLlxuICAvL3RoaXMuaGlnaF93YXRlciA9IDA7XG4gIC8qIEhpZ2ggd2F0ZXIgbWFyayBvZmZzZXQgaW4gd2luZG93IGZvciBpbml0aWFsaXplZCBieXRlcyAtLSBieXRlcyBhYm92ZVxuICAgKiB0aGlzIGFyZSBzZXQgdG8gemVybyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgd2FybmluZ3Mgd2hlblxuICAgKiBsb25nZXN0IG1hdGNoIHJvdXRpbmVzIGFjY2VzcyBieXRlcyBwYXN0IHRoZSBpbnB1dC4gIFRoaXMgaXMgdGhlblxuICAgKiB1cGRhdGVkIHRvIHRoZSBuZXcgaGlnaCB3YXRlciBtYXJrLlxuICAgKi9cbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHM7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSAwO1xuICBzdHJtLmRhdGFfdHlwZSA9IFpfVU5LTk9XTjtcblxuICBzID0gc3RybS5zdGF0ZTtcbiAgcy5wZW5kaW5nID0gMDtcbiAgcy5wZW5kaW5nX291dCA9IDA7XG5cbiAgaWYgKHMud3JhcCA8IDApIHtcbiAgICBzLndyYXAgPSAtcy53cmFwO1xuICAgIC8qIHdhcyBtYWRlIG5lZ2F0aXZlIGJ5IGRlZmxhdGUoLi4uLCBaX0ZJTklTSCk7ICovXG4gIH1cbiAgcy5zdGF0dXMgPSAocy53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEUpO1xuICBzdHJtLmFkbGVyID0gKHMud3JhcCA9PT0gMikgP1xuICAgIDAgIC8vIGNyYzMyKDAsIFpfTlVMTCwgMClcbiAgOlxuICAgIDE7IC8vIGFkbGVyMzIoMCwgWl9OVUxMLCAwKVxuICBzLmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIO1xuICB0cmVlcy5fdHJfaW5pdChzKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0KHN0cm0pIHtcbiAgdmFyIHJldCA9IGRlZmxhdGVSZXNldEtlZXAoc3RybSk7XG4gIGlmIChyZXQgPT09IFpfT0spIHtcbiAgICBsbV9pbml0KHN0cm0uc3RhdGUpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVNldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgaWYgKHN0cm0uc3RhdGUud3JhcCAhPT0gMikgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RybS5zdGF0ZS5nemhlYWQgPSBoZWFkO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KSB7XG4gIGlmICghc3RybSkgeyAvLyA9PT0gWl9OVUxMXG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIHZhciB3cmFwID0gMTtcblxuICBpZiAobGV2ZWwgPT09IFpfREVGQVVMVF9DT01QUkVTU0lPTikge1xuICAgIGxldmVsID0gNjtcbiAgfVxuXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkgeyAvKiBzdXBwcmVzcyB6bGliIHdyYXBwZXIgKi9cbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cblxuICBlbHNlIGlmICh3aW5kb3dCaXRzID4gMTUpIHtcbiAgICB3cmFwID0gMjsgICAgICAgICAgIC8qIHdyaXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkICovXG4gICAgd2luZG93Qml0cyAtPSAxNjtcbiAgfVxuXG5cbiAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9PSBaX0RFRkxBVEVEIHx8XG4gICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHxcbiAgICBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuXG4gIGlmICh3aW5kb3dCaXRzID09PSA4KSB7XG4gICAgd2luZG93Qml0cyA9IDk7XG4gIH1cbiAgLyogdW50aWwgMjU2LWJ5dGUgd2luZG93IGJ1ZyBmaXhlZCAqL1xuXG4gIHZhciBzID0gbmV3IERlZmxhdGVTdGF0ZSgpO1xuXG4gIHN0cm0uc3RhdGUgPSBzO1xuICBzLnN0cm0gPSBzdHJtO1xuXG4gIHMud3JhcCA9IHdyYXA7XG4gIHMuZ3poZWFkID0gbnVsbDtcbiAgcy53X2JpdHMgPSB3aW5kb3dCaXRzO1xuICBzLndfc2l6ZSA9IDEgPDwgcy53X2JpdHM7XG4gIHMud19tYXNrID0gcy53X3NpemUgLSAxO1xuXG4gIHMuaGFzaF9iaXRzID0gbWVtTGV2ZWwgKyA3O1xuICBzLmhhc2hfc2l6ZSA9IDEgPDwgcy5oYXNoX2JpdHM7XG4gIHMuaGFzaF9tYXNrID0gcy5oYXNoX3NpemUgLSAxO1xuICBzLmhhc2hfc2hpZnQgPSB+figocy5oYXNoX2JpdHMgKyBNSU5fTUFUQ0ggLSAxKSAvIE1JTl9NQVRDSCk7XG5cbiAgcy53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSAqIDIpO1xuICBzLmhlYWQgPSBuZXcgdXRpbHMuQnVmMTYocy5oYXNoX3NpemUpO1xuICBzLnByZXYgPSBuZXcgdXRpbHMuQnVmMTYocy53X3NpemUpO1xuXG4gIC8vIERvbid0IG5lZWQgbWVtIGluaXQgbWFnaWMgZm9yIEpTLlxuICAvL3MuaGlnaF93YXRlciA9IDA7ICAvKiBub3RoaW5nIHdyaXR0ZW4gdG8gcy0+d2luZG93IHlldCAqL1xuXG4gIHMubGl0X2J1ZnNpemUgPSAxIDw8IChtZW1MZXZlbCArIDYpOyAvKiAxNksgZWxlbWVudHMgYnkgZGVmYXVsdCAqL1xuXG4gIHMucGVuZGluZ19idWZfc2l6ZSA9IHMubGl0X2J1ZnNpemUgKiA0O1xuXG4gIC8vb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhzdHJtLCBzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7XG4gIC8vcy0+cGVuZGluZ19idWYgPSAodWNoZiAqKSBvdmVybGF5O1xuICBzLnBlbmRpbmdfYnVmID0gbmV3IHV0aWxzLkJ1Zjgocy5wZW5kaW5nX2J1Zl9zaXplKTtcblxuICAvLyBJdCBpcyBvZmZzZXQgZnJvbSBgcy5wZW5kaW5nX2J1ZmAgKHNpemUgaXMgYHMubGl0X2J1ZnNpemUgKiAyYClcbiAgLy9zLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTtcbiAgcy5kX2J1ZiA9IDEgKiBzLmxpdF9idWZzaXplO1xuXG4gIC8vcy0+bF9idWYgPSBzLT5wZW5kaW5nX2J1ZiArICgxK3NpemVvZih1c2gpKSpzLT5saXRfYnVmc2l6ZTtcbiAgcy5sX2J1ZiA9ICgxICsgMikgKiBzLmxpdF9idWZzaXplO1xuXG4gIHMubGV2ZWwgPSBsZXZlbDtcbiAgcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICBzLm1ldGhvZCA9IG1ldGhvZDtcblxuICByZXR1cm4gZGVmbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkge1xuICByZXR1cm4gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBaX0RFRkxBVEVELCBNQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSk7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZShzdHJtLCBmbHVzaCkge1xuICB2YXIgb2xkX2ZsdXNoLCBzO1xuICB2YXIgYmVnLCB2YWw7IC8vIGZvciBnemlwIGhlYWRlciB3cml0ZSBvbmx5XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8XG4gICAgZmx1c2ggPiBaX0JMT0NLIHx8IGZsdXNoIDwgMCkge1xuICAgIHJldHVybiBzdHJtID8gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKSA6IFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKCFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHx8XG4gICAgICAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPT0gWl9GSU5JU0gpKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCAoc3RybS5hdmFpbF9vdXQgPT09IDApID8gWl9CVUZfRVJST1IgOiBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzLnN0cm0gPSBzdHJtOyAvKiBqdXN0IGluIGNhc2UgKi9cbiAgb2xkX2ZsdXNoID0gcy5sYXN0X2ZsdXNoO1xuICBzLmxhc3RfZmx1c2ggPSBmbHVzaDtcblxuICAvKiBXcml0ZSB0aGUgaGVhZGVyICovXG4gIGlmIChzLnN0YXR1cyA9PT0gSU5JVF9TVEFURSkge1xuXG4gICAgaWYgKHMud3JhcCA9PT0gMikgeyAvLyBHWklQIGhlYWRlclxuICAgICAgc3RybS5hZGxlciA9IDA7ICAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgcHV0X2J5dGUocywgMzEpO1xuICAgICAgcHV0X2J5dGUocywgMTM5KTtcbiAgICAgIHB1dF9ieXRlKHMsIDgpO1xuICAgICAgaWYgKCFzLmd6aGVhZCkgeyAvLyBzLT5nemhlYWQgPT0gWl9OVUxMXG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBPU19DT0RFKTtcbiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50ZXh0ID8gMSA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHMuZ3poZWFkLmhjcmMgPyAyIDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoIXMuZ3poZWFkLmV4dHJhID8gMCA6IDQpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5uYW1lID8gMCA6IDgpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5jb21tZW50ID8gMCA6IDE2KVxuICAgICAgICApO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC50aW1lICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDgpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDE2KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiAyNCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5vcyAmIDB4ZmYpO1xuICAgICAgICBpZiAocy5nemhlYWQuZXh0cmEgJiYgcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhmZik7XG4gICAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZywgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBFWFRSQV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSAvLyBERUZMQVRFIGhlYWRlclxuICAgIHtcbiAgICAgIHZhciBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgocy53X2JpdHMgLSA4KSA8PCA0KSkgPDwgODtcbiAgICAgIHZhciBsZXZlbF9mbGFncyA9IC0xO1xuXG4gICAgICBpZiAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPCA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMTtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA9PT0gNikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDM7XG4gICAgICB9XG4gICAgICBoZWFkZXIgfD0gKGxldmVsX2ZsYWdzIDw8IDYpO1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHsgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOyB9XG4gICAgICBoZWFkZXIgKz0gMzEgLSAoaGVhZGVyICUgMzEpO1xuXG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICBwdXRTaG9ydE1TQihzLCBoZWFkZXIpO1xuXG4gICAgICAvKiBTYXZlIHRoZSBhZGxlcjMyIG9mIHRoZSBwcmVzZXQgZGljdGlvbmFyeTogKi9cbiAgICAgIGlmIChzLnN0cnN0YXJ0ICE9PSAwKSB7XG4gICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gMTsgLy8gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTtcbiAgICB9XG4gIH1cblxuLy8jaWZkZWYgR1pJUFxuICBpZiAocy5zdGF0dXMgPT09IEVYVFJBX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmV4dHJhLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cblxuICAgICAgd2hpbGUgKHMuZ3ppbmRleCA8IChzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmZmYpKSB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmFbcy5nemluZGV4XSAmIDB4ZmYpO1xuICAgICAgICBzLmd6aW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3ppbmRleCA9PT0gcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gTkFNRV9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5uYW1lLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIC8vaW50IHZhbDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKUyBzcGVjaWZpYzogbGl0dGxlIG1hZ2ljIHRvIGFkZCB6ZXJvIHRlcm1pbmF0b3IgdG8gZW5kIG9mIHN0cmluZ1xuICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQubmFtZS5sZW5ndGgpIHtcbiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7XG4gICAgICB9IHdoaWxlICh2YWwgIT09IDApO1xuXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWwgPT09IDApIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gQ09NTUVOVF9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBDT01NRU5UX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmNvbW1lbnQvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5jb21tZW50Lmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IEhDUkNfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgaWYgKHMucGVuZGluZyArIDIgPiBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIH1cbiAgICAgIGlmIChzLnBlbmRpbmcgKyAyIDw9IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7XG4gICAgICAgIHN0cm0uYWRsZXIgPSAwOyAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgIH1cbiAgfVxuLy8jZW5kaWZcblxuICAvKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlICovXG4gIGlmIChzLnBlbmRpbmcgIT09IDApIHtcbiAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aFxuICAgICAgICogbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmRcbiAgICAgICAqIGF2YWlsX2luIGVxdWFsIHRvIHplcm8uIFRoZXJlIHdvbid0IGJlIGFueXRoaW5nIHRvIGRvLFxuICAgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2VcbiAgICAgICAqIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZTpcbiAgICAgICAqL1xuICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7XG4gICAgICByZXR1cm4gWl9PSztcbiAgICB9XG5cbiAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGFuZCBhdm9pZCBkdXBsaWNhdGUgY29uc2VjdXRpdmVcbiAgICAgKiBmbHVzaGVzLiBGb3IgcmVwZWF0ZWQgYW5kIHVzZWxlc3MgY2FsbHMgd2l0aCBaX0ZJTklTSCwgd2Uga2VlcFxuICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRl9FUlJPUi5cbiAgICAgKi9cbiAgfSBlbHNlIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHJhbmsoZmx1c2gpIDw9IHJhbmsob2xkX2ZsdXNoKSAmJlxuICAgIGZsdXNoICE9PSBaX0ZJTklTSCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogVXNlciBtdXN0IG5vdCBwcm92aWRlIG1vcmUgaW5wdXQgYWZ0ZXIgdGhlIGZpcnN0IEZJTklTSDogKi9cbiAgaWYgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogU3RhcnQgYSBuZXcgYmxvY2sgb3IgY29udGludWUgdGhlIGN1cnJlbnQgb25lLlxuICAgKi9cbiAgaWYgKHN0cm0uYXZhaWxfaW4gIT09IDAgfHwgcy5sb29rYWhlYWQgIT09IDAgfHxcbiAgICAoZmx1c2ggIT09IFpfTk9fRkxVU0ggJiYgcy5zdGF0dXMgIT09IEZJTklTSF9TVEFURSkpIHtcbiAgICB2YXIgYnN0YXRlID0gKHMuc3RyYXRlZ3kgPT09IFpfSFVGRk1BTl9PTkxZKSA/IGRlZmxhdGVfaHVmZihzLCBmbHVzaCkgOlxuICAgICAgKHMuc3RyYXRlZ3kgPT09IFpfUkxFID8gZGVmbGF0ZV9ybGUocywgZmx1c2gpIDpcbiAgICAgICAgY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5mdW5jKHMsIGZsdXNoKSk7XG5cbiAgICBpZiAoYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9ET05FKSB7XG4gICAgICBzLnN0YXR1cyA9IEZJTklTSF9TVEFURTtcbiAgICB9XG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfTkVFRF9NT1JFIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQpIHtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgICAgLyogYXZvaWQgQlVGX0VSUk9SIG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICB9XG4gICAgICByZXR1cm4gWl9PSztcbiAgICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGxcbiAgICAgICAqIG9mIGRlZmxhdGUgc2hvdWxkIHVzZSB0aGUgc2FtZSBmbHVzaCBwYXJhbWV0ZXIgdG8gbWFrZSBzdXJlXG4gICAgICAgKiB0aGF0IHRoZSBmbHVzaCBpcyBjb21wbGV0ZS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBvdXRwdXQgYW5cbiAgICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvXG4gICAgICAgKiBlbnN1cmVzIHRoYXQgZm9yIGEgdmVyeSBzbWFsbCBvdXRwdXQgYnVmZmVyLCB3ZSBlbWl0IGF0IG1vc3RcbiAgICAgICAqIG9uZSBlbXB0eSBibG9jay5cbiAgICAgICAqL1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19CTE9DS19ET05FKSB7XG4gICAgICBpZiAoZmx1c2ggPT09IFpfUEFSVElBTF9GTFVTSCkge1xuICAgICAgICB0cmVlcy5fdHJfYWxpZ24ocyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChmbHVzaCAhPT0gWl9CTE9DSykgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi9cblxuICAgICAgICB0cmVlcy5fdHJfc3RvcmVkX2Jsb2NrKHMsIDAsIDAsIGZhbHNlKTtcbiAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWRcbiAgICAgICAgICogYXMgYSBzcGVjaWFsIG1hcmtlciBieSBpbmZsYXRlX3N5bmMoKS5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9GVUxMX0ZMVVNIKSB7XG4gICAgICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovICAgICAgICAgICAgIC8qIGZvcmdldCBoaXN0b3J5ICovXG4gICAgICAgICAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gICAgICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgICAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5pbnNlcnQgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICAgIHJldHVybiBaX09LO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvL0Fzc2VydChzdHJtLT5hdmFpbF9vdXQgPiAwLCBcImJ1ZzJcIik7XG4gIC8vaWYgKHN0cm0uYXZhaWxfb3V0IDw9IDApIHsgdGhyb3cgbmV3IEVycm9yKFwiYnVnMlwiKTt9XG5cbiAgaWYgKGZsdXNoICE9PSBaX0ZJTklTSCkgeyByZXR1cm4gWl9PSzsgfVxuICBpZiAocy53cmFwIDw9IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VORDsgfVxuXG4gIC8qIFdyaXRlIHRoZSB0cmFpbGVyICovXG4gIGlmIChzLndyYXAgPT09IDIpIHtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAyNCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLnRvdGFsX2luICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAyNCkgJiAweGZmKTtcbiAgfVxuICBlbHNlXG4gIHtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyID4+PiAxNik7XG4gICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gIH1cblxuICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAvKiBJZiBhdmFpbF9vdXQgaXMgemVybywgdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCBkZWZsYXRlIGFnYWluXG4gICAqIHRvIGZsdXNoIHRoZSByZXN0LlxuICAgKi9cbiAgaWYgKHMud3JhcCA+IDApIHsgcy53cmFwID0gLXMud3JhcDsgfVxuICAvKiB3cml0ZSB0aGUgdHJhaWxlciBvbmx5IG9uY2UhICovXG4gIHJldHVybiBzLnBlbmRpbmcgIT09IDAgPyBaX09LIDogWl9TVFJFQU1fRU5EO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlRW5kKHN0cm0pIHtcbiAgdmFyIHN0YXR1cztcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHN0YXR1cyA9IHN0cm0uc3RhdGUuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSBJTklUX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBFWFRSQV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gTkFNRV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQ09NTUVOVF9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gSENSQ19TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQlVTWV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gRklOSVNIX1NUQVRFXG4gICkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG5cbiAgcmV0dXJuIHN0YXR1cyA9PT0gQlVTWV9TVEFURSA/IGVycihzdHJtLCBaX0RBVEFfRVJST1IpIDogWl9PSztcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlXG4gKiBzZXF1ZW5jZSB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgcztcbiAgdmFyIHN0ciwgbjtcbiAgdmFyIHdyYXA7XG4gIHZhciBhdmFpbDtcbiAgdmFyIG5leHQ7XG4gIHZhciBpbnB1dDtcbiAgdmFyIHRtcERpY3Q7XG5cbiAgaWYgKCFzdHJtLyo9PSBaX05VTEwqLyB8fCAhc3RybS5zdGF0ZS8qPT0gWl9OVUxMKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzID0gc3RybS5zdGF0ZTtcbiAgd3JhcCA9IHMud3JhcDtcblxuICBpZiAod3JhcCA9PT0gMiB8fCAod3JhcCA9PT0gMSAmJiBzLnN0YXR1cyAhPT0gSU5JVF9TVEFURSkgfHwgcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICAvKiB3aGVuIHVzaW5nIHpsaWIgd3JhcHBlcnMsIGNvbXB1dGUgQWRsZXItMzIgZm9yIHByb3ZpZGVkIGRpY3Rpb25hcnkgKi9cbiAgaWYgKHdyYXAgPT09IDEpIHtcbiAgICAvKiBhZGxlcjMyKHN0cm0tPmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBzdHJtLmFkbGVyID0gYWRsZXIzMihzdHJtLmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgfVxuXG4gIHMud3JhcCA9IDA7ICAgLyogYXZvaWQgY29tcHV0aW5nIEFkbGVyLTMyIGluIHJlYWRfYnVmICovXG5cbiAgLyogaWYgZGljdGlvbmFyeSB3b3VsZCBmaWxsIHdpbmRvdywganVzdCByZXBsYWNlIHRoZSBoaXN0b3J5ICovXG4gIGlmIChkaWN0TGVuZ3RoID49IHMud19zaXplKSB7XG4gICAgaWYgKHdyYXAgPT09IDApIHsgICAgICAgICAgICAvKiBhbHJlYWR5IGVtcHR5IG90aGVyd2lzZSAqL1xuICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG4gICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgcy5pbnNlcnQgPSAwO1xuICAgIH1cbiAgICAvKiB1c2UgdGhlIHRhaWwgKi9cbiAgICAvLyBkaWN0aW9uYXJ5ID0gZGljdGlvbmFyeS5zbGljZShkaWN0TGVuZ3RoIC0gcy53X3NpemUpO1xuICAgIHRtcERpY3QgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSk7XG4gICAgdXRpbHMuYXJyYXlTZXQodG1wRGljdCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCAtIHMud19zaXplLCBzLndfc2l6ZSwgMCk7XG4gICAgZGljdGlvbmFyeSA9IHRtcERpY3Q7XG4gICAgZGljdExlbmd0aCA9IHMud19zaXplO1xuICB9XG4gIC8qIGluc2VydCBkaWN0aW9uYXJ5IGludG8gd2luZG93IGFuZCBoYXNoICovXG4gIGF2YWlsID0gc3RybS5hdmFpbF9pbjtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBzdHJtLmF2YWlsX2luID0gZGljdExlbmd0aDtcbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5pbnB1dCA9IGRpY3Rpb25hcnk7XG4gIGZpbGxfd2luZG93KHMpO1xuICB3aGlsZSAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgc3RyID0gcy5zdHJzdGFydDtcbiAgICBuID0gcy5sb29rYWhlYWQgLSAoTUlOX01BVENIIC0gMSk7XG4gICAgZG8ge1xuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG5cbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHN0cjtcbiAgICAgIHN0cisrO1xuICAgIH0gd2hpbGUgKC0tbik7XG4gICAgcy5zdHJzdGFydCA9IHN0cjtcbiAgICBzLmxvb2thaGVhZCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgZmlsbF93aW5kb3cocyk7XG4gIH1cbiAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIHMuaW5zZXJ0ID0gcy5sb29rYWhlYWQ7XG4gIHMubG9va2FoZWFkID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmlucHV0ID0gaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBhdmFpbDtcbiAgcy53cmFwID0gd3JhcDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZXhwb3J0cy5kZWZsYXRlSW5pdCA9IGRlZmxhdGVJbml0O1xuZXhwb3J0cy5kZWZsYXRlSW5pdDIgPSBkZWZsYXRlSW5pdDI7XG5leHBvcnRzLmRlZmxhdGVSZXNldCA9IGRlZmxhdGVSZXNldDtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0S2VlcCA9IGRlZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmRlZmxhdGVTZXRIZWFkZXIgPSBkZWZsYXRlU2V0SGVhZGVyO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZUVuZCA9IGRlZmxhdGVFbmQ7XG5leHBvcnRzLmRlZmxhdGVTZXREaWN0aW9uYXJ5ID0gZGVmbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmRlZmxhdGVJbmZvID0gJ3Bha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuZGVmbGF0ZUJvdW5kID0gZGVmbGF0ZUJvdW5kO1xuZXhwb3J0cy5kZWZsYXRlQ29weSA9IGRlZmxhdGVDb3B5O1xuZXhwb3J0cy5kZWZsYXRlUGFyYW1zID0gZGVmbGF0ZVBhcmFtcztcbmV4cG9ydHMuZGVmbGF0ZVBlbmRpbmcgPSBkZWZsYXRlUGVuZGluZztcbmV4cG9ydHMuZGVmbGF0ZVByaW1lID0gZGVmbGF0ZVByaW1lO1xuZXhwb3J0cy5kZWZsYXRlVHVuZSA9IGRlZmxhdGVUdW5lO1xuKi9cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG4vKiBlc2xpbnQtZGlzYWJsZSBzcGFjZS11bmFyeS1vcHMgKi9cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8vdmFyIFpfRklMVEVSRUQgICAgICAgICAgPSAxO1xuLy92YXIgWl9IVUZGTUFOX09OTFkgICAgICA9IDI7XG4vL3ZhciBaX1JMRSAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xuLy92YXIgWl9ERUZBVUxUX1NUUkFURUdZICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbnZhciBaX0JJTkFSWSAgICAgICAgICAgICAgPSAwO1xudmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG4vLyBGcm9tIHp1dGlsLmhcblxudmFyIFNUT1JFRF9CTE9DSyA9IDA7XG52YXIgU1RBVElDX1RSRUVTID0gMTtcbnZhciBEWU5fVFJFRVMgICAgPSAyO1xuLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi9cblxudmFyIE1JTl9NQVRDSCAgICA9IDM7XG52YXIgTUFYX01BVENIICAgID0gMjU4O1xuLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAqL1xuXG4vLyBGcm9tIGRlZmxhdGUuaFxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS5cbiAqL1xuXG52YXIgTEVOR1RIX0NPREVTICA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG5cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBEX0NPREVTICAgICAgID0gMzA7XG4vKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi9cblxudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xuXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG5cbnZhciBNQVhfQklUUyAgICAgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIEJ1Zl9zaXplICAgICAgPSAxNjtcbi8qIHNpemUgb2YgYml0IGJ1ZmZlciBpbiBiaV9idWYgKi9cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0YW50c1xuICovXG5cbnZhciBNQVhfQkxfQklUUyA9IDc7XG4vKiBCaXQgbGVuZ3RoIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQkxfQklUUyBiaXRzICovXG5cbnZhciBFTkRfQkxPQ0sgICA9IDI1Njtcbi8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi9cblxudmFyIFJFUF8zXzYgICAgID0gMTY7XG4vKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzNfMTAgICA9IDE3O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMy0xMCB0aW1lcyAgKDMgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzExXzEzOCA9IDE4O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxuLyogZXNsaW50LWRpc2FibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi9cbnZhciBleHRyYV9sYml0cyA9ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqL1xuICBbMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXTtcblxudmFyIGV4dHJhX2RiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi9cbiAgWzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdO1xuXG52YXIgZXh0cmFfYmxiaXRzID0gIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggYml0IGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XTtcblxudmFyIGJsX29yZGVyID1cbiAgWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdO1xuLyogZXNsaW50LWVuYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xuXG4vKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nXG4gKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy5cbiAqL1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIExvY2FsIGRhdGEuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UuXG4gKi9cblxuLy8gV2UgcHJlLWZpbGwgYXJyYXlzIHdpdGggMCB0byBhdm9pZCB1bmluaXRpYWxpemVkIGdhcHNcblxudmFyIERJU1RfQ09ERV9MRU4gPSA1MTI7IC8qIHNlZSBkZWZpbml0aW9uIG9mIGFycmF5IGRpc3RfY29kZSBiZWxvdyAqL1xuXG4vLyAhISEhIFVzZSBmbGF0IGFycmF5IGluc3RlYWQgb2Ygc3RydWN0dXJlLCBGcmVxID0gaSoyLCBMZW4gPSBpKjIrMVxudmFyIHN0YXRpY19sdHJlZSAgPSBuZXcgQXJyYXkoKExfQ09ERVMgKyAyKSAqIDIpO1xuemVybyhzdGF0aWNfbHRyZWUpO1xuLyogVGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUuIFNpbmNlIHRoZSBiaXQgbGVuZ3RocyBhcmUgaW1wb3NlZCwgdGhlcmUgaXMgbm9cbiAqIG5lZWQgZm9yIHRoZSBMX0NPREVTIGV4dHJhIGNvZGVzIHVzZWQgZHVyaW5nIGhlYXAgY29uc3RydWN0aW9uLiBIb3dldmVyXG4gKiBUaGUgY29kZXMgMjg2IGFuZCAyODcgYXJlIG5lZWRlZCB0byBidWlsZCBhIGNhbm9uaWNhbCB0cmVlIChzZWUgX3RyX2luaXRcbiAqIGJlbG93KS5cbiAqL1xuXG52YXIgc3RhdGljX2R0cmVlICA9IG5ldyBBcnJheShEX0NPREVTICogMik7XG56ZXJvKHN0YXRpY19kdHJlZSk7XG4vKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlXG4gKiA1IGJpdHMuKVxuICovXG5cbnZhciBfZGlzdF9jb2RlICAgID0gbmV3IEFycmF5KERJU1RfQ09ERV9MRU4pO1xuemVybyhfZGlzdF9jb2RlKTtcbi8qIERpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBkaXN0YW5jZXNcbiAqIDMgLi4gMjU4LCB0aGUgbGFzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHRvcCA4IGJpdHMgb2ZcbiAqIHRoZSAxNSBiaXQgZGlzdGFuY2VzLlxuICovXG5cbnZhciBfbGVuZ3RoX2NvZGUgID0gbmV3IEFycmF5KE1BWF9NQVRDSCAtIE1JTl9NQVRDSCArIDEpO1xuemVybyhfbGVuZ3RoX2NvZGUpO1xuLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9sZW5ndGggICA9IG5ldyBBcnJheShMRU5HVEhfQ09ERVMpO1xuemVybyhiYXNlX2xlbmd0aCk7XG4vKiBGaXJzdCBub3JtYWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9kaXN0ICAgICA9IG5ldyBBcnJheShEX0NPREVTKTtcbnplcm8oYmFzZV9kaXN0KTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgZGlzdGFuY2UgZm9yIGVhY2ggY29kZSAoMCA9IGRpc3RhbmNlIG9mIDEpICovXG5cblxuZnVuY3Rpb24gU3RhdGljVHJlZURlc2Moc3RhdGljX3RyZWUsIGV4dHJhX2JpdHMsIGV4dHJhX2Jhc2UsIGVsZW1zLCBtYXhfbGVuZ3RoKSB7XG5cbiAgdGhpcy5zdGF0aWNfdHJlZSAgPSBzdGF0aWNfdHJlZTsgIC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iaXRzICAgPSBleHRyYV9iaXRzOyAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovXG4gIHRoaXMuZXh0cmFfYmFzZSAgID0gZXh0cmFfYmFzZTsgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovXG4gIHRoaXMuZWxlbXMgICAgICAgID0gZWxlbXM7ICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovXG4gIHRoaXMubWF4X2xlbmd0aCAgID0gbWF4X2xlbmd0aDsgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovXG5cbiAgLy8gc2hvdyBpZiBgc3RhdGljX3RyZWVgIGhhcyBkYXRhIG9yIGR1bW15IC0gbmVlZGVkIGZvciBtb25vbW9ycGhpYyBvYmplY3RzXG4gIHRoaXMuaGFzX3N0cmVlICAgID0gc3RhdGljX3RyZWUgJiYgc3RhdGljX3RyZWUubGVuZ3RoO1xufVxuXG5cbnZhciBzdGF0aWNfbF9kZXNjO1xudmFyIHN0YXRpY19kX2Rlc2M7XG52YXIgc3RhdGljX2JsX2Rlc2M7XG5cblxuZnVuY3Rpb24gVHJlZURlc2MoZHluX3RyZWUsIHN0YXRfZGVzYykge1xuICB0aGlzLmR5bl90cmVlID0gZHluX3RyZWU7ICAgICAvKiB0aGUgZHluYW1pYyB0cmVlICovXG4gIHRoaXMubWF4X2NvZGUgPSAwOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuICB0aGlzLnN0YXRfZGVzYyA9IHN0YXRfZGVzYzsgICAvKiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSAqL1xufVxuXG5cblxuZnVuY3Rpb24gZF9jb2RlKGRpc3QpIHtcbiAgcmV0dXJuIGRpc3QgPCAyNTYgPyBfZGlzdF9jb2RlW2Rpc3RdIDogX2Rpc3RfY29kZVsyNTYgKyAoZGlzdCA+Pj4gNyldO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogT3V0cHV0IGEgc2hvcnQgTFNCIGZpcnN0IG9uIHRoZSBzdHJlYW0uXG4gKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdCdWYuXG4gKi9cbmZ1bmN0aW9uIHB1dF9zaG9ydChzLCB3KSB7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodykgJiAweGZmKSk7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodXNoKSh3KSA+PiA4KSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKHcpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodyA+Pj4gOCkgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuXG4gKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy5cbiAqL1xuZnVuY3Rpb24gc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPiAoQnVmX3NpemUgLSBsZW5ndGgpKSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gICAgcy5iaV9idWYgPSB2YWx1ZSA+PiAoQnVmX3NpemUgLSBzLmJpX3ZhbGlkKTtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aCAtIEJ1Zl9zaXplO1xuICB9IGVsc2Uge1xuICAgIHMuYmlfYnVmIHw9ICh2YWx1ZSA8PCBzLmJpX3ZhbGlkKSAmIDB4ZmZmZjtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHNlbmRfY29kZShzLCBjLCB0cmVlKSB7XG4gIHNlbmRfYml0cyhzLCB0cmVlW2MgKiAyXS8qLkNvZGUqLywgdHJlZVtjICogMiArIDFdLyouTGVuKi8pO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXJcbiAqIG1ldGhvZCB3b3VsZCB1c2UgYSB0YWJsZSlcbiAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTVcbiAqL1xuZnVuY3Rpb24gYmlfcmV2ZXJzZShjb2RlLCBsZW4pIHtcbiAgdmFyIHJlcyA9IDA7XG4gIGRvIHtcbiAgICByZXMgfD0gY29kZSAmIDE7XG4gICAgY29kZSA+Pj49IDE7XG4gICAgcmVzIDw8PSAxO1xuICB9IHdoaWxlICgtLWxlbiA+IDApO1xuICByZXR1cm4gcmVzID4+PiAxO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIsIGtlZXBpbmcgYXQgbW9zdCA3IGJpdHMgaW4gaXQuXG4gKi9cbmZ1bmN0aW9uIGJpX2ZsdXNoKHMpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPT09IDE2KSB7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IDA7XG4gICAgcy5iaV92YWxpZCA9IDA7XG5cbiAgfSBlbHNlIGlmIChzLmJpX3ZhbGlkID49IDgpIHtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmICYgMHhmZjtcbiAgICBzLmJpX2J1ZiA+Pj0gODtcbiAgICBzLmJpX3ZhbGlkIC09IDg7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoXG4gKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZFxuICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGVcbiAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC5cbiAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXNcbiAqICAgICBub3QgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZ2VuX2JpdGxlbihzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgICAgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgICAgICAgID0gZGVzYy5keW5fdHJlZTtcbiAgdmFyIG1heF9jb2RlICAgICAgICA9IGRlc2MubWF4X2NvZGU7XG4gIHZhciBzdHJlZSAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGV4dHJhICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2JpdHM7XG4gIHZhciBiYXNlICAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iYXNlO1xuICB2YXIgbWF4X2xlbmd0aCAgICAgID0gZGVzYy5zdGF0X2Rlc2MubWF4X2xlbmd0aDtcbiAgdmFyIGg7ICAgICAgICAgICAgICAvKiBoZWFwIGluZGV4ICovXG4gIHZhciBuLCBtOyAgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqL1xuICB2YXIgeGJpdHM7ICAgICAgICAgIC8qIGV4dHJhIGJpdHMgKi9cbiAgdmFyIGY7ICAgICAgICAgICAgICAvKiBmcmVxdWVuY3kgKi9cbiAgdmFyIG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqL1xuXG4gIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIHMuYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgLyogSW4gYSBmaXJzdCBwYXNzLCBjb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzICh3aGljaCBtYXlcbiAgICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2YgdGhlIGJpdCBsZW5ndGggdHJlZSkuXG4gICAqL1xuICB0cmVlW3MuaGVhcFtzLmhlYXBfbWF4XSAqIDIgKyAxXS8qLkxlbiovID0gMDsgLyogcm9vdCBvZiB0aGUgaGVhcCAqL1xuXG4gIGZvciAoaCA9IHMuaGVhcF9tYXggKyAxOyBoIDwgSEVBUF9TSVpFOyBoKyspIHtcbiAgICBuID0gcy5oZWFwW2hdO1xuICAgIGJpdHMgPSB0cmVlW3RyZWVbbiAqIDIgKyAxXS8qLkRhZCovICogMiArIDFdLyouTGVuKi8gKyAxO1xuICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkge1xuICAgICAgYml0cyA9IG1heF9sZW5ndGg7XG4gICAgICBvdmVyZmxvdysrO1xuICAgIH1cbiAgICB0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgLyogV2Ugb3ZlcndyaXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi9cblxuICAgIGlmIChuID4gbWF4X2NvZGUpIHsgY29udGludWU7IH0gLyogbm90IGEgbGVhZiBub2RlICovXG5cbiAgICBzLmJsX2NvdW50W2JpdHNdKys7XG4gICAgeGJpdHMgPSAwO1xuICAgIGlmIChuID49IGJhc2UpIHtcbiAgICAgIHhiaXRzID0gZXh0cmFbbiAtIGJhc2VdO1xuICAgIH1cbiAgICBmID0gdHJlZVtuICogMl0vKi5GcmVxKi87XG4gICAgcy5vcHRfbGVuICs9IGYgKiAoYml0cyArIHhiaXRzKTtcbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gKz0gZiAqIChzdHJlZVtuICogMiArIDFdLyouTGVuKi8gKyB4Yml0cyk7XG4gICAgfVxuICB9XG4gIGlmIChvdmVyZmxvdyA9PT0gMCkgeyByZXR1cm47IH1cblxuICAvLyBUcmFjZSgoc3RkZXJyLFwiXFxuYml0IGxlbmd0aCBvdmVyZmxvd1xcblwiKSk7XG4gIC8qIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBvbiBvYmoyIGFuZCBwaWMgb2YgdGhlIENhbGdhcnkgY29ycHVzICovXG5cbiAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi9cbiAgZG8ge1xuICAgIGJpdHMgPSBtYXhfbGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAocy5ibF9jb3VudFtiaXRzXSA9PT0gMCkgeyBiaXRzLS07IH1cbiAgICBzLmJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovXG4gICAgcy5ibF9jb3VudFtiaXRzICsgMV0gKz0gMjsgLyogbW92ZSBvbmUgb3ZlcmZsb3cgaXRlbSBhcyBpdHMgYnJvdGhlciAqL1xuICAgIHMuYmxfY291bnRbbWF4X2xlbmd0aF0tLTtcbiAgICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVwIHVwLFxuICAgICAqIGJ1dCB0aGlzIGRvZXMgbm90IGFmZmVjdCBibF9jb3VudFttYXhfbGVuZ3RoXVxuICAgICAqL1xuICAgIG92ZXJmbG93IC09IDI7XG4gIH0gd2hpbGUgKG92ZXJmbG93ID4gMCk7XG5cbiAgLyogTm93IHJlY29tcHV0ZSBhbGwgYml0IGxlbmd0aHMsIHNjYW5uaW5nIGluIGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICAgKiBoIGlzIHN0aWxsIGVxdWFsIHRvIEhFQVBfU0laRS4gKEl0IGlzIHNpbXBsZXIgdG8gcmVjb25zdHJ1Y3QgYWxsXG4gICAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRha2VuXG4gICAqIGZyb20gJ2FyJyB3cml0dGVuIGJ5IEhhcnVoaWtvIE9rdW11cmEuKVxuICAgKi9cbiAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPT0gMDsgYml0cy0tKSB7XG4gICAgbiA9IHMuYmxfY291bnRbYml0c107XG4gICAgd2hpbGUgKG4gIT09IDApIHtcbiAgICAgIG0gPSBzLmhlYXBbLS1oXTtcbiAgICAgIGlmIChtID4gbWF4X2NvZGUpIHsgY29udGludWU7IH1cbiAgICAgIGlmICh0cmVlW20gKiAyICsgMV0vKi5MZW4qLyAhPT0gYml0cykge1xuICAgICAgICAvLyBUcmFjZSgoc3RkZXJyLFwiY29kZSAlZCBiaXRzICVkLT4lZFxcblwiLCBtLCB0cmVlW21dLkxlbiwgYml0cykpO1xuICAgICAgICBzLm9wdF9sZW4gKz0gKGJpdHMgLSB0cmVlW20gKiAyICsgMV0vKi5MZW4qLykgKiB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICAgICAgdHJlZVttICogMiArIDFdLyouTGVuKi8gPSBiaXRzO1xuICAgICAgfVxuICAgICAgbi0tO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogR2VuZXJhdGUgdGhlIGNvZGVzIGZvciBhIGdpdmVuIHRyZWUgYW5kIGJpdCBjb3VudHMgKHdoaWNoIG5lZWQgbm90IGJlXG4gKiBvcHRpbWFsKS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBiaXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yXG4gKiB0aGUgZ2l2ZW4gdHJlZSBhbmQgdGhlIGZpZWxkIGxlbiBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbjogdGhlIGZpZWxkIGNvZGUgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cyBvZiBub25cbiAqICAgICB6ZXJvIGNvZGUgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIGJsX2NvdW50KVxuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAgICAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuLy8gICAgdXNoZiAqYmxfY291bnQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCAqL1xue1xuICB2YXIgbmV4dF9jb2RlID0gbmV3IEFycmF5KE1BWF9CSVRTICsgMSk7IC8qIG5leHQgY29kZSB2YWx1ZSBmb3IgZWFjaCBiaXQgbGVuZ3RoICovXG4gIHZhciBjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY29kZSB2YWx1ZSAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi9cbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBpbmRleCAqL1xuXG4gIC8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlc1xuICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC5cbiAgICovXG4gIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSAoY29kZSArIGJsX2NvdW50W2JpdHMgLSAxXSkgPDwgMTtcbiAgfVxuICAvKiBDaGVjayB0aGF0IHRoZSBiaXQgY291bnRzIGluIGJsX2NvdW50IGFyZSBjb25zaXN0ZW50LiBUaGUgbGFzdCBjb2RlXG4gICAqIG11c3QgYmUgYWxsIG9uZXMuXG4gICAqL1xuICAvL0Fzc2VydCAoY29kZSArIGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSxcbiAgLy8gICAgICAgIFwiaW5jb25zaXN0ZW50IGJpdCBjb3VudHNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5nZW5fY29kZXM6IG1heF9jb2RlICVkIFwiLCBtYXhfY29kZSkpO1xuXG4gIGZvciAobiA9IDA7ICBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICB2YXIgbGVuID0gdHJlZVtuICogMiArIDFdLyouTGVuKi87XG4gICAgaWYgKGxlbiA9PT0gMCkgeyBjb250aW51ZTsgfVxuICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovXG4gICAgdHJlZVtuICogMl0vKi5Db2RlKi8gPSBiaV9yZXZlcnNlKG5leHRfY29kZVtsZW5dKyssIGxlbik7XG5cbiAgICAvL1RyYWNlY3YodHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsXCJcXG5uICUzZCAlYyBsICUyZCBjICU0eCAoJXgpIFwiLFxuICAgIC8vICAgICBuLCAoaXNncmFwaChuKSA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwgbmV4dF9jb2RlW2xlbl0tMSkpO1xuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzICdjb25zdGFudCcgdGFibGVzLlxuICovXG5mdW5jdGlvbiB0cl9zdGF0aWNfaW5pdCgpIHtcbiAgdmFyIG47ICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAvKiBiaXQgY291bnRlciAqL1xuICB2YXIgbGVuZ3RoOyAgIC8qIGxlbmd0aCB2YWx1ZSAqL1xuICB2YXIgY29kZTsgICAgIC8qIGNvZGUgdmFsdWUgKi9cbiAgdmFyIGRpc3Q7ICAgICAvKiBkaXN0YW5jZSBpbmRleCAqL1xuICB2YXIgYmxfY291bnQgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy8gZG8gY2hlY2sgaW4gX3RyX2luaXQoKVxuICAvL2lmIChzdGF0aWNfaW5pdF9kb25lKSByZXR1cm47XG5cbiAgLyogRm9yIHNvbWUgZW1iZWRkZWQgdGFyZ2V0cywgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm90IGluaXRpYWxpemVkOiAqL1xuLyojaWZkZWYgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlNcbiAgc3RhdGljX2xfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19sdHJlZTtcbiAgc3RhdGljX2xfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfbGJpdHM7XG4gIHN0YXRpY19kX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfZHRyZWU7XG4gIHN0YXRpY19kX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2RiaXRzO1xuICBzdGF0aWNfYmxfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfYmxiaXRzO1xuI2VuZGlmKi9cblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovXG4gIGxlbmd0aCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMgLSAxOyBjb2RlKyspIHtcbiAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfbGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9sZW5ndGhfY29kZVtsZW5ndGgrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAobGVuZ3RoID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogbGVuZ3RoICE9IDI1NlwiKTtcbiAgLyogTm90ZSB0aGF0IHRoZSBsZW5ndGggMjU1IChtYXRjaCBsZW5ndGggMjU4KSBjYW4gYmUgcmVwcmVzZW50ZWRcbiAgICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwgc28gd2VcbiAgICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOlxuICAgKi9cbiAgX2xlbmd0aF9jb2RlW2xlbmd0aCAtIDFdID0gY29kZTtcblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGRpc3QgKDAuLjMySykgLT4gZGlzdCBjb2RlICgwLi4yOSkgKi9cbiAgZGlzdCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCAxNjsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogZGlzdCAhPSAyNTZcIik7XG4gIGRpc3QgPj49IDc7IC8qIGZyb20gbm93IG9uLCBhbGwgZGlzdGFuY2VzIGFyZSBkaXZpZGVkIGJ5IDEyOCAqL1xuICBmb3IgKDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNztcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgKGV4dHJhX2RiaXRzW2NvZGVdIC0gNykpOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogMjU2K2Rpc3QgIT0gNTEyXCIpO1xuXG4gIC8qIENvbnN0cnVjdCB0aGUgY29kZXMgb2YgdGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUgKi9cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgbiA9IDA7XG4gIHdoaWxlIChuIDw9IDE0Mykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI1NSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA5O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs5XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI3OSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA3O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs3XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI4Nykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZVxuICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGVcbiAgICogYWxsIG9uZXMpXG4gICAqL1xuICBnZW5fY29kZXMoc3RhdGljX2x0cmVlLCBMX0NPREVTICsgMSwgYmxfY291bnQpO1xuXG4gIC8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDU7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobiwgNSk7XG4gIH1cblxuICAvLyBOb3cgZGF0YSByZWFkeSBhbmQgd2UgY2FuIGluaXQgc3RhdGljIHRyZWVzXG4gIHN0YXRpY19sX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMgKyAxLCBMX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19kX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgICAgICAgICAgRF9DT0RFUywgTUFYX0JJVFMpO1xuICBzdGF0aWNfYmxfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhuZXcgQXJyYXkoMCksIGV4dHJhX2JsYml0cywgMCwgICAgICAgICBCTF9DT0RFUywgTUFYX0JMX0JJVFMpO1xuXG4gIC8vc3RhdGljX2luaXRfZG9uZSA9IHRydWU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIGEgbmV3IGJsb2NrLlxuICovXG5mdW5jdGlvbiBpbml0X2Jsb2NrKHMpIHtcbiAgdmFyIG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIHRyZWVzLiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUzsgIG4rKykgeyBzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyAgbisrKSB7IHMuZHluX2R0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IEJMX0NPREVTOyBuKyspIHsgcy5ibF90cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cblxuICBzLmR5bl9sdHJlZVtFTkRfQkxPQ0sgKiAyXS8qLkZyZXEqLyA9IDE7XG4gIHMub3B0X2xlbiA9IHMuc3RhdGljX2xlbiA9IDA7XG4gIHMubGFzdF9saXQgPSBzLm1hdGNoZXMgPSAwO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5XG4gKi9cbmZ1bmN0aW9uIGJpX3dpbmR1cChzKVxue1xuICBpZiAocy5iaV92YWxpZCA+IDgpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPiAwKSB7XG4gICAgLy9wdXRfYnl0ZShzLCAoQnl0ZSlzLT5iaV9idWYpO1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWY7XG4gIH1cbiAgcy5iaV9idWYgPSAwO1xuICBzLmJpX3ZhbGlkID0gMDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0c1xuICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNvcHlfYmxvY2socywgYnVmLCBsZW4sIGhlYWRlcilcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAgICAqYnVmOyAgICAvKiB0aGUgaW5wdXQgZGF0YSAqL1xuLy91bnNpZ25lZCBsZW47ICAgICAvKiBpdHMgbGVuZ3RoICovXG4vL2ludCAgICAgIGhlYWRlcjsgIC8qIHRydWUgaWYgYmxvY2sgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiAqL1xue1xuICBiaV93aW5kdXAocyk7ICAgICAgICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovXG5cbiAgaWYgKGhlYWRlcikge1xuICAgIHB1dF9zaG9ydChzLCBsZW4pO1xuICAgIHB1dF9zaG9ydChzLCB+bGVuKTtcbiAgfVxuLy8gIHdoaWxlIChsZW4tLSkge1xuLy8gICAgcHV0X2J5dGUocywgKmJ1ZisrKTtcbi8vICB9XG4gIHV0aWxzLmFycmF5U2V0KHMucGVuZGluZ19idWYsIHMud2luZG93LCBidWYsIGxlbiwgcy5wZW5kaW5nKTtcbiAgcy5wZW5kaW5nICs9IGxlbjtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wYXJlcyB0byBzdWJ0cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlblxuICogdGhlIHN1YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIHtcbiAgdmFyIF9uMiA9IG4gKiAyO1xuICB2YXIgX20yID0gbSAqIDI7XG4gIHJldHVybiAodHJlZVtfbjJdLyouRnJlcSovIDwgdHJlZVtfbTJdLyouRnJlcSovIHx8XG4gICAgICAgICAodHJlZVtfbjJdLyouRnJlcSovID09PSB0cmVlW19tMl0vKi5GcmVxKi8gJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgayxcbiAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nXG4gKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzXG4gKiB0d28gc29ucykuXG4gKi9cbmZ1bmN0aW9uIHBxZG93bmhlYXAocywgdHJlZSwgaylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqL1xuLy8gICAgaW50IGs7ICAgICAgICAgICAgICAgLyogbm9kZSB0byBtb3ZlIGRvd24gKi9cbntcbiAgdmFyIHYgPSBzLmhlYXBba107XG4gIHZhciBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqL1xuICB3aGlsZSAoaiA8PSBzLmhlYXBfbGVuKSB7XG4gICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi9cbiAgICBpZiAoaiA8IHMuaGVhcF9sZW4gJiZcbiAgICAgIHNtYWxsZXIodHJlZSwgcy5oZWFwW2ogKyAxXSwgcy5oZWFwW2pdLCBzLmRlcHRoKSkge1xuICAgICAgaisrO1xuICAgIH1cbiAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqL1xuICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHsgYnJlYWs7IH1cblxuICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovXG4gICAgcy5oZWFwW2tdID0gcy5oZWFwW2pdO1xuICAgIGsgPSBqO1xuXG4gICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqL1xuICAgIGogPDw9IDE7XG4gIH1cbiAgcy5oZWFwW2tdID0gdjtcbn1cblxuXG4vLyBpbmxpbmVkIG1hbnVhbGx5XG4vLyB2YXIgU01BTExFU1QgPSAxO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGJsb2NrIGRhdGEgY29tcHJlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gSHVmZm1hbiB0cmVlc1xuICovXG5mdW5jdGlvbiBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY29uc3QgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqL1xuLy8gICAgY29uc3QgY3RfZGF0YSAqZHRyZWU7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbntcbiAgdmFyIGRpc3Q7ICAgICAgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuICB2YXIgbGM7ICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqL1xuICB2YXIgbHggPSAwOyAgICAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cbiAgdmFyIGNvZGU7ICAgICAgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovXG4gIHZhciBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqL1xuXG4gIGlmIChzLmxhc3RfbGl0ICE9PSAwKSB7XG4gICAgZG8ge1xuICAgICAgZGlzdCA9IChzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBseCAqIDJdIDw8IDgpIHwgKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMiArIDFdKTtcbiAgICAgIGxjID0gcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgbHhdO1xuICAgICAgbHgrKztcblxuICAgICAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJlZSk7IC8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgICAgLy9UcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLFwiICclYycgXCIsIGxjKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdO1xuICAgICAgICBzZW5kX2NvZGUocywgY29kZSArIExJVEVSQUxTICsgMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgbGMsIGV4dHJhKTsgICAgICAgLyogc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgICBkaXN0LS07IC8qIGRpc3QgaXMgbm93IHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAgICAgY29kZSA9IGRfY29kZShkaXN0KTtcbiAgICAgICAgLy9Bc3NlcnQgKGNvZGUgPCBEX0NPREVTLCBcImJhZCBkX2NvZGVcIik7XG5cbiAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUsIGR0cmVlKTsgICAgICAgLyogc2VuZCB0aGUgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBkaXN0IC09IGJhc2VfZGlzdFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgZGlzdCwgZXh0cmEpOyAgIC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqL1xuXG4gICAgICAvKiBDaGVjayB0aGF0IHRoZSBvdmVybGF5IGJldHdlZW4gcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmIGlzIG9rOiAqL1xuICAgICAgLy9Bc3NlcnQoKHVJbnQpKHMtPnBlbmRpbmcpIDwgcy0+bGl0X2J1ZnNpemUgKyAyKmx4LFxuICAgICAgLy8gICAgICAgXCJwZW5kaW5nQnVmIG92ZXJmbG93XCIpO1xuXG4gICAgfSB3aGlsZSAobHggPCBzLmxhc3RfbGl0KTtcbiAgfVxuXG4gIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLlxuICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhcbiAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpc1xuICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfdHJlZShzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgc3RyZWUgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGVsZW1zICAgID0gZGVzYy5zdGF0X2Rlc2MuZWxlbXM7XG4gIHZhciBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVhcCBlbGVtZW50cyAqL1xuICB2YXIgbWF4X2NvZGUgPSAtMTsgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHZhciBub2RlOyAgICAgICAgICAvKiBuZXcgbm9kZSBiZWluZyBjcmVhdGVkICovXG5cbiAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpblxuICAgKiBoZWFwW1NNQUxMRVNUXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS5cbiAgICogaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICovXG4gIHMuaGVhcF9sZW4gPSAwO1xuICBzLmhlYXBfbWF4ID0gSEVBUF9TSVpFO1xuXG4gIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7XG4gICAgaWYgKHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IG1heF9jb2RlID0gbjtcbiAgICAgIHMuZGVwdGhbbl0gPSAwO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gMDtcbiAgICB9XG4gIH1cblxuICAvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLFxuICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmVcbiAgICogcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3RcbiAgICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS5cbiAgICovXG4gIHdoaWxlIChzLmhlYXBfbGVuIDwgMikge1xuICAgIG5vZGUgPSBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7XG4gICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSAxO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAwO1xuICAgIHMub3B0X2xlbi0tO1xuXG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGUgKiAyICsgMV0vKi5MZW4qLztcbiAgICB9XG4gICAgLyogbm9kZSBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovXG4gIH1cbiAgZGVzYy5tYXhfY29kZSA9IG1heF9jb2RlO1xuXG4gIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVuLzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSxcbiAgICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6XG4gICAqL1xuICBmb3IgKG4gPSAocy5oZWFwX2xlbiA+PiAxLyppbnQgLzIqLyk7IG4gPj0gMTsgbi0tKSB7IHBxZG93bmhlYXAocywgdHJlZSwgbik7IH1cblxuICAvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvXG4gICAqIGZyZXF1ZW50IG5vZGVzLlxuICAgKi9cbiAgbm9kZSA9IGVsZW1zOyAgICAgICAgICAgICAgLyogbmV4dCBpbnRlcm5hbCBub2RlIG9mIHRoZSB0cmVlICovXG4gIGRvIHtcbiAgICAvL3BxcmVtb3ZlKHMsIHRyZWUsIG4pOyAgLyogbiA9IG5vZGUgb2YgbGVhc3QgZnJlcXVlbmN5ICovXG4gICAgLyoqKiBwcXJlbW92ZSAqKiovXG4gICAgbiA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTtcbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBzLmhlYXBbcy5oZWFwX2xlbi0tXTtcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuICAgIC8qKiovXG5cbiAgICBtID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dOyAvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqL1xuXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBuOyAvKiBrZWVwIHRoZSBub2RlcyBzb3J0ZWQgYnkgZnJlcXVlbmN5ICovXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBtO1xuXG4gICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUgZmF0aGVyIG9mIG4gYW5kIG0gKi9cbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IHRyZWVbbiAqIDJdLyouRnJlcSovICsgdHJlZVttICogMl0vKi5GcmVxKi87XG4gICAgcy5kZXB0aFtub2RlXSA9IChzLmRlcHRoW25dID49IHMuZGVwdGhbbV0gPyBzLmRlcHRoW25dIDogcy5kZXB0aFttXSkgKyAxO1xuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkRhZCovID0gdHJlZVttICogMiArIDFdLyouRGFkKi8gPSBub2RlO1xuXG4gICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi9cbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBub2RlKys7XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxLypTTUFMTEVTVCovKTtcblxuICB9IHdoaWxlIChzLmhlYXBfbGVuID49IDIpO1xuXG4gIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuXG4gIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3dcbiAgICogZ2VuZXJhdGUgdGhlIGJpdCBsZW5ndGhzLlxuICAgKi9cbiAgZ2VuX2JpdGxlbihzLCBkZXNjKTtcblxuICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovXG4gIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgcy5ibF9jb3VudCk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVzXG4gKiBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLlxuICovXG5mdW5jdGlvbiBzY2FuX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgIG1heF9jb3VudCA9IDEzODtcbiAgICBtaW5fY291bnQgPSAzO1xuICB9XG4gIHRyZWVbKG1heF9jb2RlICsgMSkgKiAyICsgMV0vKi5MZW4qLyA9IDB4ZmZmZjsgLyogZ3VhcmQgKi9cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBzLmJsX3RyZWVbY3VybGVuICogMl0vKi5GcmVxKi8gKz0gY291bnQ7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuXG4gICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7IHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLysrOyB9XG4gICAgICBzLmJsX3RyZWVbUkVQXzNfNiAqIDJdLyouRnJlcSovKys7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8zXzEwICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8xMV8xMzggKiAyXS8qLkZyZXEqLysrO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuXG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluXG4gKiBibF90cmVlLlxuICovXG5mdW5jdGlvbiBzZW5kX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi9cbntcbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovXG4gIHZhciBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi9cblxuICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXS8qLkxlbiovOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovXG5cbiAgdmFyIGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi9cbiAgdmFyIG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqL1xuICB2YXIgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBkbyB7IHNlbmRfY29kZShzLCBjdXJsZW4sIHMuYmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT09IDApO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHtcbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTtcbiAgICAgICAgY291bnQtLTtcbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KGNvdW50ID49IDMgJiYgY291bnQgPD0gNiwgXCIgM182P1wiKTtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMik7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8zXzEwLCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfMTFfMTM4LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMTEsIDcpO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuICAgIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIG1heF9jb3VudCA9IDY7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG1heF9jb3VudCA9IDc7XG4gICAgICBtaW5fY291bnQgPSA0O1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpblxuICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkX2JsX3RyZWUocykge1xuICB2YXIgbWF4X2JsaW5kZXg7ICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICBzY2FuX3RyZWUocywgcy5keW5fbHRyZWUsIHMubF9kZXNjLm1heF9jb2RlKTtcbiAgc2Nhbl90cmVlKHMsIHMuZHluX2R0cmVlLCBzLmRfZGVzYy5tYXhfY29kZSk7XG5cbiAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZTogKi9cbiAgYnVpbGRfdHJlZShzLCBzLmJsX2Rlc2MpO1xuICAvKiBvcHRfbGVuIG5vdyBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucywgZXhjZXB0XG4gICAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuXG4gICAqL1xuXG4gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdFxuICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5c1xuICAgKiAzIGJ1dCB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaXMgNC4pXG4gICAqL1xuICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMgLSAxOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7XG4gICAgaWYgKHMuYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF0gKiAyICsgMV0vKi5MZW4qLyAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8qIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5ndGggdHJlZSBhbmQgY291bnRzICovXG4gIHMub3B0X2xlbiArPSAzICogKG1heF9ibGluZGV4ICsgMSkgKyA1ICsgNSArIDQ7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVsZFwiLFxuICAvLyAgICAgICAgcy0+b3B0X2xlbiwgcy0+c3RhdGljX2xlbikpO1xuXG4gIHJldHVybiBtYXhfYmxpbmRleDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZVxuICogbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuXG4gKiBJTiBhc3NlcnRpb246IGxjb2RlcyA+PSAyNTcsIGRjb2RlcyA+PSAxLCBibGNvZGVzID49IDQuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfYWxsX3RyZWVzKHMsIGxjb2RlcywgZGNvZGVzLCBibGNvZGVzKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGludCBsY29kZXMsIGRjb2RlcywgYmxjb2RlczsgLyogbnVtYmVyIG9mIGNvZGVzIGZvciBlYWNoIHRyZWUgKi9cbntcbiAgdmFyIHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqL1xuXG4gIC8vQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgXCJub3QgZW5vdWdoIGNvZGVzXCIpO1xuICAvL0Fzc2VydCAobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUyxcbiAgLy8gICAgICAgIFwidG9vIG1hbnkgY29kZXNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgY291bnRzOiBcIikpO1xuICBzZW5kX2JpdHMocywgbGNvZGVzIC0gMjU3LCA1KTsgLyogbm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIHNlbmRfYml0cyhzLCBkY29kZXMgLSAxLCAgIDUpO1xuICBzZW5kX2JpdHMocywgYmxjb2RlcyAtIDQsICA0KTsgLyogbm90IC0zIGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqL1xuICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7XG4gICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb2RlICUyZCBcIiwgYmxfb3JkZXJbcmFua10pKTtcbiAgICBzZW5kX2JpdHMocywgcy5ibF90cmVlW2JsX29yZGVyW3JhbmtdICogMiArIDFdLyouTGVuKi8sIDMpO1xuICB9XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2x0cmVlLCBsY29kZXMgLSAxKTsgLyogbGl0ZXJhbCB0cmVlICovXG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xuXG4gIHNlbmRfdHJlZShzLCBzLmR5bl9kdHJlZSwgZGNvZGVzIC0gMSk7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ2hlY2sgaWYgdGhlIGRhdGEgdHlwZSBpcyBURVhUIG9yIEJJTkFSWSwgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06XG4gKiAtIFRFWFQgaWYgdGhlIHR3byBjb25kaXRpb25zIGJlbG93IGFyZSBzYXRpc2ZpZWQ6XG4gKiAgICBhKSBUaGVyZSBhcmUgbm8gbm9uLXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcImJsYWNrIGxpc3RcIiAoMC4uNiwgMTQuLjI1LCAyOC4uMzEpLlxuICogICAgYikgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHByaW50YWJsZSBjaGFyYWN0ZXIgYmVsb25naW5nIHRvIHRoZVxuICogICAgICAgXCJ3aGl0ZSBsaXN0XCIgKDkge1RBQn0sIDEwIHtMRn0sIDEzIHtDUn0sIDMyLi4yNTUpLlxuICogLSBCSU5BUlkgb3RoZXJ3aXNlLlxuICogLSBUaGUgZm9sbG93aW5nIHBhcnRpYWxseS1wb3J0YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgZm9ybSBhXG4gKiAgIFwiZ3JheSBsaXN0XCIgdGhhdCBpcyBpZ25vcmVkIGluIHRoaXMgZGV0ZWN0aW9uIGFsZ29yaXRobTpcbiAqICAgKDcge0JFTH0sIDgge0JTfSwgMTEge1ZUfSwgMTIge0ZGfSwgMjYge1NVQn0sIDI3IHtFU0N9KS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBGcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0LlxuICovXG5mdW5jdGlvbiBkZXRlY3RfZGF0YV90eXBlKHMpIHtcbiAgLyogYmxhY2tfbWFzayBpcyB0aGUgYml0IG1hc2sgb2YgYmxhY2stbGlzdGVkIGJ5dGVzXG4gICAqIHNldCBiaXRzIDAuLjYsIDE0Li4yNSwgYW5kIDI4Li4zMVxuICAgKiAweGYzZmZjMDdmID0gYmluYXJ5IDExMTEwMDExMTExMTExMTExMTAwMDAwMDAxMTExMTExXG4gICAqL1xuICB2YXIgYmxhY2tfbWFzayA9IDB4ZjNmZmMwN2Y7XG4gIHZhciBuO1xuXG4gIC8qIENoZWNrIGZvciBub24tdGV4dHVhbCAoXCJibGFjay1saXN0ZWRcIikgYnl0ZXMuICovXG4gIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj49IDEpIHtcbiAgICBpZiAoKGJsYWNrX21hc2sgJiAxKSAmJiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSkge1xuICAgICAgcmV0dXJuIFpfQklOQVJZO1xuICAgIH1cbiAgfVxuXG4gIC8qIENoZWNrIGZvciB0ZXh0dWFsIChcIndoaXRlLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgaWYgKHMuZHluX2x0cmVlWzkgKiAyXS8qLkZyZXEqLyAhPT0gMCB8fCBzLmR5bl9sdHJlZVsxMCAqIDJdLyouRnJlcSovICE9PSAwIHx8XG4gICAgICBzLmR5bl9sdHJlZVsxMyAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgcmV0dXJuIFpfVEVYVDtcbiAgfVxuICBmb3IgKG4gPSAzMjsgbiA8IExJVEVSQUxTOyBuKyspIHtcbiAgICBpZiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICByZXR1cm4gWl9URVhUO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZXJlIGFyZSBubyBcImJsYWNrLWxpc3RlZFwiIG9yIFwid2hpdGUtbGlzdGVkXCIgYnl0ZXM6XG4gICAqIHRoaXMgc3RyZWFtIGVpdGhlciBpcyBlbXB0eSBvciBoYXMgdG9sZXJhdGVkIChcImdyYXktbGlzdGVkXCIpIGJ5dGVzIG9ubHkuXG4gICAqL1xuICByZXR1cm4gWl9CSU5BUlk7XG59XG5cblxudmFyIHN0YXRpY19pbml0X2RvbmUgPSBmYWxzZTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIF90cl9pbml0KHMpXG57XG5cbiAgaWYgKCFzdGF0aWNfaW5pdF9kb25lKSB7XG4gICAgdHJfc3RhdGljX2luaXQoKTtcbiAgICBzdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbiAgfVxuXG4gIHMubF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9sdHJlZSwgc3RhdGljX2xfZGVzYyk7XG4gIHMuZF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSwgc3RhdGljX2RfZGVzYyk7XG4gIHMuYmxfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmJsX3RyZWUsIHN0YXRpY19ibF9kZXNjKTtcblxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqL1xuICBpbml0X2Jsb2NrKHMpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHN0b3JlZCBibG9ja1xuICovXG5mdW5jdGlvbiBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jayAqL1xuLy91bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi9cbi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqL1xue1xuICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTsgICAgLyogc2VuZCBibG9jayB0eXBlICovXG4gIGNvcHlfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCB0cnVlKTsgLyogd2l0aCBoZWFkZXIgKi9cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuXG4gKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gX3RyX2FsaWduKHMpIHtcbiAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUyA8PCAxLCAzKTtcbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTtcbiAgYmlfZmx1c2gocyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWNcbiAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS5cbiAqL1xuZnVuY3Rpb24gX3RyX2ZsdXNoX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHZhciBvcHRfbGVuYiwgc3RhdGljX2xlbmI7ICAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovXG4gIHZhciBtYXhfYmxpbmRleCA9IDA7ICAgICAgICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgdW5sZXNzIGEgc3RvcmVkIGJsb2NrIGlzIGZvcmNlZCAqL1xuICBpZiAocy5sZXZlbCA+IDApIHtcblxuICAgIC8qIENoZWNrIGlmIHRoZSBmaWxlIGlzIGJpbmFyeSBvciB0ZXh0ICovXG4gICAgaWYgKHMuc3RybS5kYXRhX3R5cGUgPT09IFpfVU5LTk9XTikge1xuICAgICAgcy5zdHJtLmRhdGFfdHlwZSA9IGRldGVjdF9kYXRhX3R5cGUocyk7XG4gICAgfVxuXG4gICAgLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICAgIGJ1aWxkX3RyZWUocywgcy5sX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgICBidWlsZF90cmVlKHMsIHMuZF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcbiAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2ZcbiAgICAgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLlxuICAgICAqL1xuXG4gICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXhcbiAgICAgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7XG5cbiAgICAvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgdGhlIGJsb2NrIGxlbmd0aHMgaW4gYnl0ZXMuICovXG4gICAgb3B0X2xlbmIgPSAocy5vcHRfbGVuICsgMyArIDcpID4+PiAzO1xuICAgIHN0YXRpY19sZW5iID0gKHMuc3RhdGljX2xlbiArIDMgKyA3KSA+Pj4gMztcblxuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbm9wdCAlbHUoJWx1KSBzdGF0ICVsdSglbHUpIHN0b3JlZCAlbHUgbGl0ICV1IFwiLFxuICAgIC8vICAgICAgICBvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sXG4gICAgLy8gICAgICAgIHMtPmxhc3RfbGl0KSk7XG5cbiAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIHsgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYjsgfVxuXG4gIH0gZWxzZSB7XG4gICAgLy8gQXNzZXJ0KGJ1ZiAhPSAoY2hhciopMCwgXCJsb3N0IGJ1ZlwiKTtcbiAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7IC8qIGZvcmNlIGEgc3RvcmVkIGJsb2NrICovXG4gIH1cblxuICBpZiAoKHN0b3JlZF9sZW4gKyA0IDw9IG9wdF9sZW5iKSAmJiAoYnVmICE9PSAtMSkpIHtcbiAgICAvKiA0OiB0d28gd29yZHMgZm9yIHRoZSBsZW5ndGhzICovXG5cbiAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLlxuICAgICAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2VcbiAgICAgKiB0aGUgbGFzdCBibG9jayBmbHVzaCwgYmVjYXVzZSBjb21wcmVzc2lvbiB3b3VsZCBoYXZlIGJlZW5cbiAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG9cbiAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLlxuICAgICAqL1xuICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTtcblxuICB9IGVsc2UgaWYgKHMuc3RyYXRlZ3kgPT09IFpfRklYRUQgfHwgc3RhdGljX2xlbmIgPT09IG9wdF9sZW5iKSB7XG5cbiAgICBzZW5kX2JpdHMocywgKFNUQVRJQ19UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzdGF0aWNfbHRyZWUsIHN0YXRpY19kdHJlZSk7XG5cbiAgfSBlbHNlIHtcbiAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBzZW5kX2FsbF90cmVlcyhzLCBzLmxfZGVzYy5tYXhfY29kZSArIDEsIHMuZF9kZXNjLm1heF9jb2RlICsgMSwgbWF4X2JsaW5kZXggKyAxKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzLmR5bl9sdHJlZSwgcy5keW5fZHRyZWUpO1xuICB9XG4gIC8vIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCBcImJhZCBjb21wcmVzc2VkIHNpemVcIik7XG4gIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CXG4gICAqIGFuZCB1TG9uZyBpbXBsZW1lbnRlZCBvbiAzMiBiaXRzLlxuICAgKi9cbiAgaW5pdF9ibG9jayhzKTtcblxuICBpZiAobGFzdCkge1xuICAgIGJpX3dpbmR1cChzKTtcbiAgfVxuICAvLyBUcmFjZXYoKHN0ZGVycixcIlxcbmNvbXBybGVuICVsdSglbHUpIFwiLCBzLT5jb21wcmVzc2VkX2xlbj4+MyxcbiAgLy8gICAgICAgcy0+Y29tcHJlc3NlZF9sZW4tNypsYXN0KSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2F2ZSB0aGUgbWF0Y2ggaW5mbyBhbmQgdGFsbHkgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFJldHVybiB0cnVlIGlmXG4gKiB0aGUgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQuXG4gKi9cbmZ1bmN0aW9uIF90cl90YWxseShzLCBkaXN0LCBsYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB1bnNpZ25lZCBkaXN0OyAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi9cbi8vICAgIHVuc2lnbmVkIGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqL1xue1xuICAvL3ZhciBvdXRfbGVuZ3RoLCBpbl9sZW5ndGgsIGRjb2RlO1xuXG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyXSAgICAgPSAoZGlzdCA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBzLmxhc3RfbGl0ICogMiArIDFdID0gZGlzdCAmIDB4ZmY7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgcy5sYXN0X2xpdF0gPSBsYyAmIDB4ZmY7XG4gIHMubGFzdF9saXQrKztcblxuICBpZiAoZGlzdCA9PT0gMCkge1xuICAgIC8qIGxjIGlzIHRoZSB1bm1hdGNoZWQgY2hhciAqL1xuICAgIHMuZHluX2x0cmVlW2xjICogMl0vKi5GcmVxKi8rKztcbiAgfSBlbHNlIHtcbiAgICBzLm1hdGNoZXMrKztcbiAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgZGlzdC0tOyAgICAgICAgICAgICAvKiBkaXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovXG4gICAgLy9Bc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJlxuICAgIC8vICAgICAgICh1c2gpbGMgPD0gKHVzaCkoTUFYX01BVENILU1JTl9NQVRDSCkgJiZcbiAgICAvLyAgICAgICAodXNoKWRfY29kZShkaXN0KSA8ICh1c2gpRF9DT0RFUywgIFwiX3RyX3RhbGx5OiBiYWQgbWF0Y2hcIik7XG5cbiAgICBzLmR5bl9sdHJlZVsoX2xlbmd0aF9jb2RlW2xjXSArIExJVEVSQUxTICsgMSkgKiAyXS8qLkZyZXEqLysrO1xuICAgIHMuZHluX2R0cmVlW2RfY29kZShkaXN0KSAqIDJdLyouRnJlcSovKys7XG4gIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhdWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcblxuLy8jaWZkZWYgVFJVTkNBVEVfQkxPQ0tcbi8vICAvKiBUcnkgdG8gZ3Vlc3MgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBzdG9wIHRoZSBjdXJyZW50IGJsb2NrIGhlcmUgKi9cbi8vICBpZiAoKHMubGFzdF9saXQgJiAweDFmZmYpID09PSAwICYmIHMubGV2ZWwgPiAyKSB7XG4vLyAgICAvKiBDb21wdXRlIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgY29tcHJlc3NlZCBsZW5ndGggKi9cbi8vICAgIG91dF9sZW5ndGggPSBzLmxhc3RfbGl0Kjg7XG4vLyAgICBpbl9sZW5ndGggPSBzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydDtcbi8vXG4vLyAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7XG4vLyAgICAgIG91dF9sZW5ndGggKz0gcy5keW5fZHRyZWVbZGNvZGUqMl0vKi5GcmVxKi8gKiAoNSArIGV4dHJhX2RiaXRzW2Rjb2RlXSk7XG4vLyAgICB9XG4vLyAgICBvdXRfbGVuZ3RoID4+Pj0gMztcbi8vICAgIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgXCIsXG4vLyAgICAvLyAgICAgICBzLT5sYXN0X2xpdCwgaW5fbGVuZ3RoLCBvdXRfbGVuZ3RoLFxuLy8gICAgLy8gICAgICAgMTAwTCAtIG91dF9sZW5ndGgqMTAwTC9pbl9sZW5ndGgpKTtcbi8vICAgIGlmIChzLm1hdGNoZXMgPCAocy5sYXN0X2xpdD4+MSkvKmludCAvMiovICYmIG91dF9sZW5ndGggPCAoaW5fbGVuZ3RoPj4xKS8qaW50IC8yKi8pIHtcbi8vICAgICAgcmV0dXJuIHRydWU7XG4vLyAgICB9XG4vLyAgfVxuLy8jZW5kaWZcblxuICByZXR1cm4gKHMubGFzdF9saXQgPT09IHMubGl0X2J1ZnNpemUgLSAxKTtcbiAgLyogV2UgYXZvaWQgZXF1YWxpdHkgd2l0aCBsaXRfYnVmc2l6ZSBiZWNhdXNlIG9mIHdyYXBhcm91bmQgYXQgNjRLXG4gICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvXG4gICAqIDY0Sy0xIGJ5dGVzLlxuICAgKi9cbn1cblxuZXhwb3J0cy5fdHJfaW5pdCAgPSBfdHJfaW5pdDtcbmV4cG9ydHMuX3RyX3N0b3JlZF9ibG9jayA9IF90cl9zdG9yZWRfYmxvY2s7XG5leHBvcnRzLl90cl9mbHVzaF9ibG9jayAgPSBfdHJfZmx1c2hfYmxvY2s7XG5leHBvcnRzLl90cl90YWxseSA9IF90cl90YWxseTtcbmV4cG9ydHMuX3RyX2FsaWduID0gX3RyX2FsaWduO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAyOiAgICAgICduZWVkIGRpY3Rpb25hcnknLCAgICAgLyogWl9ORUVEX0RJQ1QgICAgICAgMiAgKi9cbiAgMTogICAgICAnc3RyZWFtIGVuZCcsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovXG4gIDA6ICAgICAgJycsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqL1xuICAnLTEnOiAgICdmaWxlIGVycm9yJywgICAgICAgICAgLyogWl9FUlJOTyAgICAgICAgICgtMSkgKi9cbiAgJy0yJzogICAnc3RyZWFtIGVycm9yJywgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovXG4gICctMyc6ICAgJ2RhdGEgZXJyb3InLCAgICAgICAgICAvKiBaX0RBVEFfRVJST1IgICAgKC0zKSAqL1xuICAnLTQnOiAgICdpbnN1ZmZpY2llbnQgbWVtb3J5JywgLyogWl9NRU1fRVJST1IgICAgICgtNCkgKi9cbiAgJy01JzogICAnYnVmZmVyIGVycm9yJywgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICAoLTUpICovXG4gICctNic6ICAgJ2luY29tcGF0aWJsZSB2ZXJzaW9uJyAvKiBaX1ZFUlNJT05fRVJST1IgKC02KSAqL1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG52YXIgdXRpbHMgICAgICAgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIGFkbGVyMzIgICAgICAgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgICAgICAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIGluZmxhdGVfZmFzdCAgPSByZXF1aXJlKCcuL2luZmZhc3QnKTtcbnZhciBpbmZsYXRlX3RhYmxlID0gcmVxdWlyZSgnLi9pbmZ0cmVlcycpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuLy92YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbi8vdmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuLy92YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG52YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG52YXIgWl9ORUVEX0RJQ1QgICAgID0gMjtcbi8vdmFyIFpfRVJSTk8gICAgICAgICA9IC0xO1xudmFyIFpfU1RSRUFNX0VSUk9SICA9IC0yO1xudmFyIFpfREFUQV9FUlJPUiAgICA9IC0zO1xudmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuXG4vKiBTVEFURVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgICAgSEVBRCA9IDE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqL1xudmFyICAgIEZMQUdTID0gMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtZXRob2QgYW5kIGZsYWdzIChnemlwKSAqL1xudmFyICAgIFRJTUUgPSAzOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtb2RpZmljYXRpb24gdGltZSAoZ3ppcCkgKi9cbnZhciAgICBPUyA9IDQ7ICAgICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovXG52YXIgICAgRVhMRU4gPSA1OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBFWFRSQSA9IDY7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgYnl0ZXMgKGd6aXApICovXG52YXIgICAgTkFNRSA9IDc7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBmaWxlIG5hbWUgKGd6aXApICovXG52YXIgICAgQ09NTUVOVCA9IDg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBjb21tZW50IChnemlwKSAqL1xudmFyICAgIEhDUkMgPSA5OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBoZWFkZXIgY3JjIChnemlwKSAqL1xudmFyICAgIERJQ1RJRCA9IDEwOyAgICAvKiBpOiB3YWl0aW5nIGZvciBkaWN0aW9uYXJ5IGNoZWNrIHZhbHVlICovXG52YXIgICAgRElDVCA9IDExOyAgICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCAqL1xudmFyICAgICAgICBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xudmFyICAgICAgICBUWVBFRE8gPSAxMzsgICAgLyogaTogc2FtZSwgYnV0IHNraXAgY2hlY2sgdG8gZXhpdCBpbmZsYXRlIG9uIG5ldyBibG9jayAqL1xudmFyICAgICAgICBTVE9SRUQgPSAxNDsgICAgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi9cbnZhciAgICAgICAgQ09QWV8gPSAxNTsgICAgIC8qIGkvbzogc2FtZSBhcyBDT1BZIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgIENPUFkgPSAxNjsgICAgICAvKiBpL286IHdhaXRpbmcgZm9yIGlucHV0IG9yIG91dHB1dCB0byBjb3B5IHN0b3JlZCBibG9jayAqL1xudmFyICAgICAgICBUQUJMRSA9IDE3OyAgICAgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovXG52YXIgICAgICAgIExFTkxFTlMgPSAxODsgICAvKiBpOiB3YWl0aW5nIGZvciBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgQ09ERUxFTlMgPSAxOTsgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqL1xudmFyICAgICAgICAgICAgTEVOXyA9IDIwOyAgICAgIC8qIGk6IHNhbWUgYXMgTEVOIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgICAgICBMRU4gPSAyMTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdC9lb2IgY29kZSAqL1xudmFyICAgICAgICAgICAgTEVORVhUID0gMjI7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aCBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBESVNUID0gMjM7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgY29kZSAqL1xudmFyICAgICAgICAgICAgRElTVEVYVCA9IDI0OyAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi9cbnZhciAgICAgICAgICAgIE1BVENIID0gMjU7ICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gY29weSBzdHJpbmcgKi9cbnZhciAgICAgICAgICAgIExJVCA9IDI2OyAgICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgbGl0ZXJhbCAqL1xudmFyICAgIENIRUNLID0gMjc7ICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi9cbnZhciAgICBMRU5HVEggPSAyODsgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBET05FID0gMjk7ICAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIE1FTSA9IDMxOyAgICAgICAvKiBnb3QgYW4gaW5mbGF0ZSgpIG1lbW9yeSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIFNZTkMgPSAzMjsgICAgICAvKiBsb29raW5nIGZvciBzeW5jaHJvbml6YXRpb24gYnl0ZXMgdG8gcmVzdGFydCBpbmZsYXRlKCkgKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5cbnZhciBFTk9VR0hfTEVOUyA9IDg1MjtcbnZhciBFTk9VR0hfRElTVFMgPSA1OTI7XG4vL3ZhciBFTk9VR0ggPSAgKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9XQklUUyA9IE1BWF9XQklUUztcblxuXG5mdW5jdGlvbiB6c3dhcDMyKHEpIHtcbiAgcmV0dXJuICAoKChxID4+PiAyNCkgJiAweGZmKSArXG4gICAgICAgICAgKChxID4+PiA4KSAmIDB4ZmYwMCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYwMCkgPDwgOCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYpIDw8IDI0KSk7XG59XG5cblxuZnVuY3Rpb24gSW5mbGF0ZVN0YXRlKCkge1xuICB0aGlzLm1vZGUgPSAwOyAgICAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqL1xuICB0aGlzLmxhc3QgPSBmYWxzZTsgICAgICAgICAgLyogdHJ1ZSBpZiBwcm9jZXNzaW5nIGxhc3QgYmxvY2sgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5oYXZlZGljdCA9IGZhbHNlOyAgICAgIC8qIHRydWUgaWYgZGljdGlvbmFyeSBwcm92aWRlZCAqL1xuICB0aGlzLmZsYWdzID0gMDsgICAgICAgICAgICAgLyogZ3ppcCBoZWFkZXIgbWV0aG9kIGFuZCBmbGFncyAoMCBpZiB6bGliKSAqL1xuICB0aGlzLmRtYXggPSAwOyAgICAgICAgICAgICAgLyogemxpYiBoZWFkZXIgbWF4IGRpc3RhbmNlIChJTkZMQVRFX1NUUklDVCkgKi9cbiAgdGhpcy5jaGVjayA9IDA7ICAgICAgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovXG4gIHRoaXMudG90YWwgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBvdXRwdXQgY291bnQgKi9cbiAgLy8gVE9ETzogbWF5IGJlIHt9XG4gIHRoaXMuaGVhZCA9IG51bGw7ICAgICAgICAgICAvKiB3aGVyZSB0byBzYXZlIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uICovXG5cbiAgLyogc2xpZGluZyB3aW5kb3cgKi9cbiAgdGhpcy53Yml0cyA9IDA7ICAgICAgICAgICAgIC8qIGxvZyBiYXNlIDIgb2YgcmVxdWVzdGVkIHdpbmRvdyBzaXplICovXG4gIHRoaXMud3NpemUgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdGhpcy53aGF2ZSA9IDA7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdGhpcy53bmV4dCA9IDA7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICB0aGlzLndpbmRvdyA9IG51bGw7ICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi9cblxuICAvKiBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5ob2xkID0gMDsgICAgICAgICAgICAgIC8qIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqL1xuICB0aGlzLmJpdHMgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gXCJpblwiICovXG5cbiAgLyogZm9yIHN0cmluZyBhbmQgc3RvcmVkIGJsb2NrIGNvcHlpbmcgKi9cbiAgdGhpcy5sZW5ndGggPSAwOyAgICAgICAgICAgIC8qIGxpdGVyYWwgb3IgbGVuZ3RoIG9mIGRhdGEgdG8gY29weSAqL1xuICB0aGlzLm9mZnNldCA9IDA7ICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IHN0cmluZyBmcm9tICovXG5cbiAgLyogZm9yIHRhYmxlIGFuZCBjb2RlIGRlY29kaW5nICovXG4gIHRoaXMuZXh0cmEgPSAwOyAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG5lZWRlZCAqL1xuXG4gIC8qIGZpeGVkIGFuZCBkeW5hbWljIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuY29kZSA9IG51bGw7ICAgICAgICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAqL1xuICB0aGlzLmRpc3Rjb2RlID0gbnVsbDsgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi9cbiAgdGhpcy5sZW5iaXRzID0gMDsgICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGxlbmNvZGUgKi9cbiAgdGhpcy5kaXN0Yml0cyA9IDA7ICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGRpc3Rjb2RlICovXG5cbiAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqL1xuICB0aGlzLm5jb2RlID0gMDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLm5sZW4gPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5uZGlzdCA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5oYXZlID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgaW4gbGVuc1tdICovXG4gIHRoaXMubmV4dCA9IG51bGw7ICAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiBjb2Rlc1tdICovXG5cbiAgdGhpcy5sZW5zID0gbmV3IHV0aWxzLkJ1ZjE2KDMyMCk7IC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy53b3JrID0gbmV3IHV0aWxzLkJ1ZjE2KDI4OCk7IC8qIHdvcmsgYXJlYSBmb3IgY29kZSB0YWJsZSBidWlsZGluZyAqL1xuXG4gIC8qXG4gICBiZWNhdXNlIHdlIGRvbid0IGhhdmUgcG9pbnRlcnMgaW4ganMsIHdlIHVzZSBsZW5jb2RlIGFuZCBkaXN0Y29kZSBkaXJlY3RseVxuICAgYXMgYnVmZmVycyBzbyB3ZSBkb24ndCBuZWVkIGNvZGVzXG4gICovXG4gIC8vdGhpcy5jb2RlcyA9IG5ldyB1dGlscy5CdWYzMihFTk9VR0gpOyAgICAgICAvKiBzcGFjZSBmb3IgY29kZSB0YWJsZXMgKi9cbiAgdGhpcy5sZW5keW4gPSBudWxsOyAgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLmRpc3RkeW4gPSBudWxsOyAgICAgICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAoSlMgc3BlY2lmaWMpICovXG4gIHRoaXMuc2FuZSA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGlmIGZhbHNlLCBhbGxvdyBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgKi9cbiAgdGhpcy5iYWNrID0gMDsgICAgICAgICAgICAgICAgICAgLyogYml0cyBiYWNrIG9mIGxhc3QgdW5wcm9jZXNzZWQgbGVuZ3RoL2xpdCAqL1xuICB0aGlzLndhcyA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsIGxlbmd0aCBvZiBtYXRjaCAqL1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSBzdGF0ZS50b3RhbCA9IDA7XG4gIHN0cm0ubXNnID0gJyc7IC8qWl9OVUxMKi9cbiAgaWYgKHN0YXRlLndyYXApIHsgICAgICAgLyogdG8gc3VwcG9ydCBpbGwtY29uY2VpdmVkIEphdmEgdGVzdCBzdWl0ZSAqL1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS53cmFwICYgMTtcbiAgfVxuICBzdGF0ZS5tb2RlID0gSEVBRDtcbiAgc3RhdGUubGFzdCA9IDA7XG4gIHN0YXRlLmhhdmVkaWN0ID0gMDtcbiAgc3RhdGUuZG1heCA9IDMyNzY4O1xuICBzdGF0ZS5oZWFkID0gbnVsbC8qWl9OVUxMKi87XG4gIHN0YXRlLmhvbGQgPSAwO1xuICBzdGF0ZS5iaXRzID0gMDtcbiAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0xFTlMpO1xuICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0RJU1RTKTtcblxuICBzdGF0ZS5zYW5lID0gMTtcbiAgc3RhdGUuYmFjayA9IC0xO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IHJlc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RhdGUud3NpemUgPSAwO1xuICBzdGF0ZS53aGF2ZSA9IDA7XG4gIHN0YXRlLnduZXh0ID0gMDtcbiAgcmV0dXJuIGluZmxhdGVSZXNldEtlZXAoc3RybSk7XG5cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKSB7XG4gIHZhciB3cmFwO1xuICB2YXIgc3RhdGU7XG5cbiAgLyogZ2V0IHRoZSBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBleHRyYWN0IHdyYXAgcmVxdWVzdCBmcm9tIHdpbmRvd0JpdHMgcGFyYW1ldGVyICovXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkge1xuICAgIHdyYXAgPSAwO1xuICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0cztcbiAgfVxuICBlbHNlIHtcbiAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxO1xuICAgIGlmICh3aW5kb3dCaXRzIDwgNDgpIHtcbiAgICAgIHdpbmRvd0JpdHMgJj0gMTU7XG4gICAgfVxuICB9XG5cbiAgLyogc2V0IG51bWJlciBvZiB3aW5kb3cgYml0cywgZnJlZSB3aW5kb3cgaWYgZGlmZmVyZW50ICovXG4gIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIGlmIChzdGF0ZS53aW5kb3cgIT09IG51bGwgJiYgc3RhdGUud2JpdHMgIT09IHdpbmRvd0JpdHMpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXNldCB0aGUgcmVzdCBvZiBpdCAqL1xuICBzdGF0ZS53cmFwID0gd3JhcDtcbiAgc3RhdGUud2JpdHMgPSB3aW5kb3dCaXRzO1xuICByZXR1cm4gaW5mbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgcmV0O1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICAvL3N0cm0ubXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi9cblxuICBzdGF0ZSA9IG5ldyBJbmZsYXRlU3RhdGUoKTtcblxuICAvL2lmIChzdGF0ZSA9PT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogYWxsb2NhdGVkXFxuXCIpKTtcbiAgc3RybS5zdGF0ZSA9IHN0YXRlO1xuICBzdGF0ZS53aW5kb3cgPSBudWxsLypaX05VTEwqLztcbiAgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTtcbiAgaWYgKHJldCAhPT0gWl9PSykge1xuICAgIHN0cm0uc3RhdGUgPSBudWxsLypaX05VTEwqLztcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdChzdHJtKSB7XG4gIHJldHVybiBpbmZsYXRlSW5pdDIoc3RybSwgREVGX1dCSVRTKTtcbn1cblxuXG4vKlxuIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG9cbiBmaXhlZCBjb2RlIGRlY29kaW5nLiAgTm9ybWFsbHkgdGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguXG4gSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZVxuIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmRcbiB0aGVyZWFmdGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb2RlIGJ5IGFib3V0IDJLIGJ5dGVzLCBpblxuIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZVxuIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW5cbiBtYXkgbm90IGJlIHRocmVhZC1zYWZlLlxuICovXG52YXIgdmlyZ2luID0gdHJ1ZTtcblxudmFyIGxlbmZpeCwgZGlzdGZpeDsgLy8gV2UgaGF2ZSBubyBwb2ludGVycyBpbiBKUywgc28ga2VlcCB0YWJsZXMgc2VwYXJhdGVcblxuZnVuY3Rpb24gZml4ZWR0YWJsZXMoc3RhdGUpIHtcbiAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi9cbiAgaWYgKHZpcmdpbikge1xuICAgIHZhciBzeW07XG5cbiAgICBsZW5maXggPSBuZXcgdXRpbHMuQnVmMzIoNTEyKTtcbiAgICBkaXN0Zml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDMyKTtcblxuICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMTQ0KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuICAgIHdoaWxlIChzeW0gPCAyNTYpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA5OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4MCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDc7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjg4KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuXG4gICAgaW5mbGF0ZV90YWJsZShMRU5TLCAgc3RhdGUubGVucywgMCwgMjg4LCBsZW5maXgsICAgMCwgc3RhdGUud29yaywgeyBiaXRzOiA5IH0pO1xuXG4gICAgLyogZGlzdGFuY2UgdGFibGUgKi9cbiAgICBzeW0gPSAwO1xuICAgIHdoaWxlIChzeW0gPCAzMikgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDU7IH1cblxuICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIDAsIDMyLCAgIGRpc3RmaXgsIDAsIHN0YXRlLndvcmssIHsgYml0czogNSB9KTtcblxuICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovXG4gICAgdmlyZ2luID0gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5sZW5jb2RlID0gbGVuZml4O1xuICBzdGF0ZS5sZW5iaXRzID0gOTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBkaXN0Zml4O1xuICBzdGF0ZS5kaXN0Yml0cyA9IDU7XG59XG5cblxuLypcbiBVcGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0IHdzaXplIChub3JtYWxseSAzMkspIGJ5dGVzIHdyaXR0ZW4gYmVmb3JlXG4gcmV0dXJuaW5nLiAgSWYgd2luZG93IGRvZXMgbm90IGV4aXN0IHlldCwgY3JlYXRlIGl0LiAgVGhpcyBpcyBvbmx5IGNhbGxlZFxuIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXNcbiBpbmZsYXRlIGNhbGwsIGJ1dCB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIHN0cmVhbSBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQuXG4gSXQgaXMgYWxzbyBjYWxsZWQgdG8gY3JlYXRlIGEgd2luZG93IGZvciBkaWN0aW9uYXJ5IGRhdGEgd2hlbiBhIGRpY3Rpb25hcnlcbiBpcyBsb2FkZWQuXG5cbiBQcm92aWRpbmcgb3V0cHV0IGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gMzJLIHRvIGluZmxhdGUoKSBzaG91bGQgcHJvdmlkZSBhIHNwZWVkXG4gYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvd1xuIHVwb24gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLCBhbmQgc2luY2UgYWxsIGRpc3RhbmNlcyBhZnRlciB0aGUgZmlyc3QgMzJLIG9mXG4gb3V0cHV0IHdpbGwgZmFsbCBpbiB0aGUgb3V0cHV0IGRhdGEsIG1ha2luZyBtYXRjaCBjb3BpZXMgc2ltcGxlciBhbmQgZmFzdGVyLlxuIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZXdpbmRvdyhzdHJtLCBzcmMsIGVuZCwgY29weSkge1xuICB2YXIgZGlzdDtcbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBpZiBpdCBoYXNuJ3QgYmVlbiBkb25lIGFscmVhZHksIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2luZG93ICovXG4gIGlmIChzdGF0ZS53aW5kb3cgPT09IG51bGwpIHtcbiAgICBzdGF0ZS53c2l6ZSA9IDEgPDwgc3RhdGUud2JpdHM7XG4gICAgc3RhdGUud25leHQgPSAwO1xuICAgIHN0YXRlLndoYXZlID0gMDtcblxuICAgIHN0YXRlLndpbmRvdyA9IG5ldyB1dGlscy5CdWY4KHN0YXRlLndzaXplKTtcbiAgfVxuXG4gIC8qIGNvcHkgc3RhdGUtPndzaXplIG9yIGxlc3Mgb3V0cHV0IGJ5dGVzIGludG8gdGhlIGNpcmN1bGFyIHdpbmRvdyAqL1xuICBpZiAoY29weSA+PSBzdGF0ZS53c2l6ZSkge1xuICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBzdGF0ZS53c2l6ZSwgc3RhdGUud3NpemUsIDApO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplO1xuICB9XG4gIGVsc2Uge1xuICAgIGRpc3QgPSBzdGF0ZS53c2l6ZSAtIHN0YXRlLnduZXh0O1xuICAgIGlmIChkaXN0ID4gY29weSkge1xuICAgICAgZGlzdCA9IGNvcHk7XG4gICAgfVxuICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPnduZXh0LCBlbmQgLSBjb3B5LCBkaXN0KTtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgZGlzdCwgc3RhdGUud25leHQpO1xuICAgIGNvcHkgLT0gZGlzdDtcbiAgICBpZiAoY29weSkge1xuICAgICAgLy96bWVtY3B5KHN0YXRlLT53aW5kb3csIGVuZCAtIGNvcHksIGNvcHkpO1xuICAgICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGNvcHksIDApO1xuICAgICAgc3RhdGUud25leHQgPSBjb3B5O1xuICAgICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzdGF0ZS53bmV4dCArPSBkaXN0O1xuICAgICAgaWYgKHN0YXRlLnduZXh0ID09PSBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53bmV4dCA9IDA7IH1cbiAgICAgIGlmIChzdGF0ZS53aGF2ZSA8IHN0YXRlLndzaXplKSB7IHN0YXRlLndoYXZlICs9IGRpc3Q7IH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgaW5wdXQsIG91dHB1dDsgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGJ1ZmZlcnNcbiAgdmFyIG5leHQ7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgaW5wdXQgSU5ERVggKi9cbiAgdmFyIHB1dDsgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgb3V0cHV0IElOREVYICovXG4gIHZhciBoYXZlLCBsZWZ0OyAgICAgICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovXG4gIHZhciBfaW4sIF9vdXQ7ICAgICAgICAgICAgICAvKiBzYXZlIHN0YXJ0aW5nIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovXG4gIHZhciBjb3B5OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG4gIHZhciBoZXJlID0gMDsgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsOyAvLyBwYWtlZCBcImhlcmVcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICAvL3ZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi9cbiAgdmFyIGxhc3RfYml0cywgbGFzdF9vcCwgbGFzdF92YWw7IC8vIHBha2VkIFwibGFzdFwiIGRlbm9ybWFsaXplZCAoSlMgc3BlY2lmaWMpXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovXG4gIHZhciByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqL1xuICB2YXIgaGJ1ZiA9IG5ldyB1dGlscy5CdWY4KDQpOyAgICAvKiBidWZmZXIgZm9yIGd6aXAgaGVhZGVyIGNyYyBjYWxjdWxhdGlvbiAqL1xuICB2YXIgb3B0cztcblxuICB2YXIgbjsgLy8gdGVtcG9yYXJ5IHZhciBmb3IgTkVFRF9CSVRTXG5cbiAgdmFyIG9yZGVyID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovXG4gICAgWyAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1IF07XG5cblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgfHwgIXN0cm0ub3V0cHV0IHx8XG4gICAgICAoIXN0cm0uaW5wdXQgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7IHN0YXRlLm1vZGUgPSBUWVBFRE87IH0gICAgLyogc2tpcCBjaGVjayAqL1xuXG5cbiAgLy8tLS0gTE9BRCgpIC0tLVxuICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIC8vLS0tXG5cbiAgX2luID0gaGF2ZTtcbiAgX291dCA9IGxlZnQ7XG4gIHJldCA9IFpfT0s7XG5cbiAgaW5mX2xlYXZlOiAvLyBnb3RvIGVtdWxhdGlvblxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChzdGF0ZS5tb2RlKSB7XG4gICAgICBjYXNlIEhFQUQ6XG4gICAgICAgIGlmIChzdGF0ZS53cmFwID09PSAwKSB7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IFRZUEVETztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBORUVEQklUUygxNik7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKChzdGF0ZS53cmFwICYgMikgJiYgaG9sZCA9PT0gMHg4YjFmKSB7ICAvKiBnemlwIGhlYWRlciAqL1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gMC8qY3JjMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuXG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubW9kZSA9IEZMQUdTO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmZsYWdzID0gMDsgICAgICAgICAgIC8qIGV4cGVjdCB6bGliIGhlYWRlciAqL1xuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHN0YXRlLndyYXAgJiAxKSB8fCAgIC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi9cbiAgICAgICAgICAoKChob2xkICYgMHhmZikvKkJJVFMoOCkqLyA8PCA4KSArIChob2xkID4+IDgpKSAlIDMxKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGhlYWRlciBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICAgIGJpdHMgLT0gNDtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBsZW4gPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA4O1xuICAgICAgICBpZiAoc3RhdGUud2JpdHMgPT09IDApIHtcbiAgICAgICAgICBzdGF0ZS53Yml0cyA9IGxlbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsZW4gPiBzdGF0ZS53Yml0cykge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgd2luZG93IHNpemUnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZG1heCA9IDEgPDwgbGVuO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgemxpYiBoZWFkZXIgb2tcXG5cIikpO1xuICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAxLyphZGxlcjMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgIHN0YXRlLm1vZGUgPSBob2xkICYgMHgyMDAgPyBESUNUSUQgOiBUWVBFO1xuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZMQUdTOlxuICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUuZmxhZ3MgPSBob2xkO1xuICAgICAgICBpZiAoKHN0YXRlLmZsYWdzICYgMHhmZikgIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweGUwMDApIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGhlYWRlciBmbGFncyBzZXQnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLnRleHQgPSAoKGhvbGQgPj4gOCkgJiAxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gVElNRTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUSU1FOlxuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLnRpbWUgPSBob2xkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzQoc3RhdGUuY2hlY2ssIGhvbGQpXG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIGhidWZbMl0gPSAoaG9sZCA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzNdID0gKGhvbGQgPj4+IDI0KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgNCwgMCk7XG4gICAgICAgICAgLy89PT1cbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IE9TO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIE9TOlxuICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLnhmbGFncyA9IChob2xkICYgMHhmZik7XG4gICAgICAgICAgc3RhdGUuaGVhZC5vcyA9IChob2xkID4+IDgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBFWExFTjtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBFWExFTjpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkO1xuICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX2xlbiA9IGhvbGQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSA9IG51bGwvKlpfTlVMTCovO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1vZGUgPSBFWFRSQTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBFWFRSQTpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICAgICAgbGVuID0gc3RhdGUuaGVhZC5leHRyYV9sZW4gLSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICAgIGlmICghc3RhdGUuaGVhZC5leHRyYSkge1xuICAgICAgICAgICAgICAgIC8vIFVzZSB1bnR5cGVkIGFycmF5IGZvciBtb3JlIGNvbnZlbmllbnQgcHJvY2Vzc2luZyBsYXRlclxuICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBuZXcgQXJyYXkoc3RhdGUuaGVhZC5leHRyYV9sZW4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHV0aWxzLmFycmF5U2V0KFxuICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgICAgICAvLyBleHRyYSBmaWVsZCBpcyBsaW1pdGVkIHRvIDY1NTM2IGJ5dGVzXG4gICAgICAgICAgICAgICAgLy8gLSBubyBuZWVkIGZvciBhZGRpdGlvbmFsIHNpemUgY2hlY2tcbiAgICAgICAgICAgICAgICBjb3B5LFxuICAgICAgICAgICAgICAgIC8qbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuID8gc3RhdGUuaGVhZC5leHRyYV9tYXggOiBjb3B5LCovXG4gICAgICAgICAgICAgICAgbGVuXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vem1lbWNweShzdGF0ZS5oZWFkLmV4dHJhICsgbGVuLCBuZXh0LFxuICAgICAgICAgICAgICAvLyAgICAgICAgbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4ID9cbiAgICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuIDogY29weSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGgpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IE5BTUU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTkFNRTpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwODAwKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgY29weSA9IDA7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gVE9ETzogMiBvciAxIGJ5dGVzP1xuICAgICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqL1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmXG4gICAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5uYW1lX21heCovKSkge1xuICAgICAgICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG5cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT01NRU5UO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPTU1FTlQ6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MTAwMCkge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGNvcHkgPSAwO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQuY29tbV9tYXgqLykpIHtcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpO1xuICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgIGlmIChsZW4pIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuY29tbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IEhDUkM7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgSENSQzpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLmNoZWNrICYgMHhmZmZmKSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaGVhZGVyIGNyYyBtaXNtYXRjaCc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5oY3JjID0gKChzdGF0ZS5mbGFncyA+PiA5KSAmIDEpO1xuICAgICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBESUNUSUQ6XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSB6c3dhcDMyKGhvbGQpO1xuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IERJQ1Q7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRElDVDpcbiAgICAgICAgaWYgKHN0YXRlLmhhdmVkaWN0ID09PSAwKSB7XG4gICAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICAgICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgICAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gICAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgICAgLy8tLS1cbiAgICAgICAgICByZXR1cm4gWl9ORUVEX0RJQ1Q7XG4gICAgICAgIH1cbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUWVBFOlxuICAgICAgICBpZiAoZmx1c2ggPT09IFpfQkxPQ0sgfHwgZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVFlQRURPOlxuICAgICAgICBpZiAoc3RhdGUubGFzdCkge1xuICAgICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUubW9kZSA9IENIRUNLO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGFzdCA9IChob2xkICYgMHgwMSkvKkJJVFMoMSkqLztcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoMSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDE7XG4gICAgICAgIGJpdHMgLT0gMTtcbiAgICAgICAgLy8tLS0vL1xuXG4gICAgICAgIHN3aXRjaCAoKGhvbGQgJiAweDAzKS8qQklUUygyKSovKSB7XG4gICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovXG4gICAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBzdG9yZWQgYmxvY2slc1xcblwiLFxuICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBTVE9SRUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCBibG9jayAqL1xuICAgICAgICAgICAgZml4ZWR0YWJsZXMoc3RhdGUpO1xuICAgICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fOyAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi9cbiAgICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykge1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi9cbiAgICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUQUJMRTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYmxvY2sgdHlwZSc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNUT1JFRDpcbiAgICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vLyAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovXG4gICAgICAgIGhvbGQgPj4+PSBiaXRzICYgNztcbiAgICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPT0gKChob2xkID4+PiAxNikgXiAweGZmZmYpKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3Rocyc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkICYgMHhmZmZmO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcXG5cIixcbiAgICAgICAgLy8gICAgICAgIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IENPUFlfO1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgQ09QWV86XG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT1BZO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPUFk6XG4gICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7IGNvcHkgPSBoYXZlOyB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICAgICAgaWYgKGNvcHkgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgLy8tLS0gem1lbWNweShwdXQsIG5leHQsIGNvcHkpOyAtLS1cbiAgICAgICAgICB1dGlscy5hcnJheVNldChvdXRwdXQsIGlucHV0LCBuZXh0LCBjb3B5LCBwdXQpO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgICBwdXQgKz0gY29weTtcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcXG5cIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRBQkxFOlxuICAgICAgICAvLz09PSBORUVEQklUUygxNCk7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTQpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubmxlbiA9IChob2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDI1NztcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDU7XG4gICAgICAgIGJpdHMgLT0gNTtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5uZGlzdCA9IChob2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDE7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgICBiaXRzIC09IDU7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubmNvZGUgPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA0O1xuICAgICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNDtcbiAgICAgICAgYml0cyAtPSA0O1xuICAgICAgICAvLy0tLS8vXG4vLyNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkRcbiAgICAgICAgaWYgKHN0YXRlLm5sZW4gPiAyODYgfHwgc3RhdGUubmRpc3QgPiAzMCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ3RvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHRhYmxlIHNpemVzIG9rXFxuXCIpKTtcbiAgICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5MRU5TO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTkxFTlM6XG4gICAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmNvZGUpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygzKTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gKGhvbGQgJiAweDA3KTsvL0JJVFMoMyk7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICBiaXRzIC09IDM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgMTkpIHtcbiAgICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgICAvL3N0YXRlLm5leHQgPSBzdGF0ZS5jb2RlcztcbiAgICAgICAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcbiAgICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICAgIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW47XG4gICAgICAgIHN0YXRlLmxlbmJpdHMgPSA3O1xuXG4gICAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShDT0RFUywgc3RhdGUubGVucywgMCwgMTksIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuXG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcXG5cIikpO1xuICAgICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IENPREVMRU5TO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPREVMRU5TOlxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkge1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLSAxKV07LypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgICBpZiAoKGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhlcmVfdmFsIDwgMTYpIHtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGhlcmVfdmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChoZXJlX3ZhbCA9PT0gMTYpIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMik7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAyO1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBpZiAoc3RhdGUuaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGVuID0gc3RhdGUubGVuc1tzdGF0ZS5oYXZlIC0gMV07XG4gICAgICAgICAgICAgIGNvcHkgPSAzICsgKGhvbGQgJiAweDAzKTsvL0JJVFMoMik7XG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGhlcmVfdmFsID09PSAxNykge1xuICAgICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTtcbiAgICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDM7XG4gICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICAgIGNvcHkgPSAzICsgKGhvbGQgJiAweDA3KTsvL0JJVFMoMyk7XG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICAgICAgICBiaXRzIC09IDM7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTtcbiAgICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDc7XG4gICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICAgIGNvcHkgPSAxMSArIChob2xkICYgMHg3Zik7Ly9CSVRTKDcpO1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyg3KSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gNztcbiAgICAgICAgICAgICAgYml0cyAtPSA3O1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUuaGF2ZSArIGNvcHkgPiBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkge1xuICAgICAgICAgICAgICBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUrK10gPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyogaGFuZGxlIGVycm9yIGJyZWFrcyBpbiB3aGlsZSAqL1xuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gQkFEKSB7IGJyZWFrOyB9XG5cbiAgICAgICAgLyogY2hlY2sgZm9yIGVuZC1vZi1ibG9jayBjb2RlIChiZXR0ZXIgaGF2ZSBvbmUpICovXG4gICAgICAgIGlmIChzdGF0ZS5sZW5zWzI1Nl0gPT09IDApIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBidWlsZCBjb2RlIHRhYmxlcyAtLSBub3RlOiBkbyBub3QgY2hhbmdlIHRoZSBsZW5iaXRzIG9yIGRpc3RiaXRzXG4gICAgICAgICAgIHZhbHVlcyBoZXJlICg5IGFuZCA2KSB3aXRob3V0IHJlYWRpbmcgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqL1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gOTtcblxuICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgc3RhdGUubmxlbiwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuICAgICAgICAvLyBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUuZGlzdGJpdHMgPSA2O1xuICAgICAgICAvL3N0YXRlLmRpc3Rjb2RlLmNvcHkoc3RhdGUuY29kZXMpO1xuICAgICAgICAvLyBTd2l0Y2ggdG8gdXNlIGR5bmFtaWMgdGFibGVcbiAgICAgICAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluO1xuICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5kaXN0Yml0cyB9O1xuICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCBzdGF0ZS5ubGVuLCBzdGF0ZS5uZGlzdCwgc3RhdGUuZGlzdGNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgICAvLyBzdGF0ZS5uZXh0X2luZGV4ID0gb3B0cy50YWJsZV9pbmRleDtcbiAgICAgICAgc3RhdGUuZGlzdGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAgIC8vIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dDtcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZXMgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsICdpbmZsYXRlOiAgICAgICBjb2RlcyBva1xcbicpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTl87XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5fOlxuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTjpcbiAgICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkge1xuICAgICAgICAgIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICAgIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAgICAgICAgIC8vLS0tXG4gICAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIF9vdXQpO1xuICAgICAgICAgIC8vLS0tIExPQUQoKSAtLS1cbiAgICAgICAgICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICAgICAgICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICAgICAgICAgIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgICAgICAgICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICAgICAgICAgIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgICAgICAgICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgICAgICAgICBob2xkID0gc3RhdGUuaG9sZDtcbiAgICAgICAgICBiaXRzID0gc3RhdGUuYml0cztcbiAgICAgICAgICAvLy0tLVxuXG4gICAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFRZUEUpIHtcbiAgICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuYmFjayA9IDA7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOyAgLypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKGhlcmVfYml0cyA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX29wICYmIChoZXJlX29wICYgMHhmMCkgPT09IDApIHtcbiAgICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7XG4gICAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDtcbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtsYXN0X3ZhbCArXG4gICAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzO1xuICAgICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0cztcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzO1xuICAgICAgICBzdGF0ZS5sZW5ndGggPSBoZXJlX3ZhbDtcbiAgICAgICAgaWYgKGhlcmVfb3AgPT09IDApIHtcbiAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgP1xuICAgICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gTElUO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX29wICYgMzIpIHtcbiAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgICAgc3RhdGUuYmFjayA9IC0xO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX29wICYgNjQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZXh0cmEgPSBoZXJlX29wICYgMTU7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5FWFQ7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVORVhUOlxuICAgICAgICBpZiAoc3RhdGUuZXh0cmEpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgICAgbiA9IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLmxlbmd0aCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKHN0YXRlLmV4dHJhKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgICBzdGF0ZS53YXMgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBESVNUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERJU1Q6XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxKV07LypCSVRTKHN0YXRlLmRpc3RiaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgoaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICAgKChob2xkICYgKCgxIDw8IChsYXN0X2JpdHMgKyBsYXN0X29wKSkgLSAxKSkvKkJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkqLyA+PiBsYXN0X2JpdHMpXTtcbiAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7XG4gICAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7XG4gICAgICAgIGlmIChoZXJlX29wICYgNjQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUub2Zmc2V0ID0gaGVyZV92YWw7XG4gICAgICAgIHN0YXRlLmV4dHJhID0gKGhlcmVfb3ApICYgMTU7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBESVNURVhUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERJU1RFWFQ6XG4gICAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTtcbiAgICAgICAgICBuID0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUub2Zmc2V0ICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0gMSkvKkJJVFMoc3RhdGUuZXh0cmEpKi87XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICAgIH1cbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gICAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBzdGF0ZS5kbWF4KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcXG5cIiwgc3RhdGUub2Zmc2V0KSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBNQVRDSDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBNQVRDSDpcbiAgICAgICAgaWYgKGxlZnQgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSBfb3V0IC0gbGVmdDtcbiAgICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IGNvcHkpIHsgICAgICAgICAvKiBjb3B5IGZyb20gd2luZG93ICovXG4gICAgICAgICAgY29weSA9IHN0YXRlLm9mZnNldCAtIGNvcHk7XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53aGF2ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnNhbmUpIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYXVsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgIFRyYWNlKChzdGRlcnIsIFwiaW5mbGF0ZS5jIHRvbyBmYXJcXG5cIikpO1xuLy8gICAgICAgICAgY29weSAtPSBzdGF0ZS53aGF2ZTtcbi8vICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbi8vICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuLy8gICAgICAgICAgbGVmdCAtPSBjb3B5O1xuLy8gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4vLyAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgIG91dHB1dFtwdXQrK10gPSAwO1xuLy8gICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbi8vICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuLy8gICAgICAgICAgYnJlYWs7XG4vLyNlbmRpZlxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLnduZXh0KSB7XG4gICAgICAgICAgICBjb3B5IC09IHN0YXRlLnduZXh0O1xuICAgICAgICAgICAgZnJvbSA9IHN0YXRlLndzaXplIC0gY29weTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmcm9tID0gc3RhdGUud25leHQgLSBjb3B5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4gICAgICAgICAgZnJvbV9zb3VyY2UgPSBzdGF0ZS53aW5kb3c7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgIGZyb20gPSBwdXQgLSBzdGF0ZS5vZmZzZXQ7XG4gICAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbiAgICAgICAgbGVmdCAtPSBjb3B5O1xuICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIG91dHB1dFtwdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICB9IHdoaWxlICgtLWNvcHkpO1xuICAgICAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7IHN0YXRlLm1vZGUgPSBMRU47IH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExJVDpcbiAgICAgICAgaWYgKGxlZnQgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIG91dHB1dFtwdXQrK10gPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGxlZnQtLTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENIRUNLOlxuICAgICAgICBpZiAoc3RhdGUud3JhcCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIC8vIFVzZSAnfCcgaW5zdGVhZCBvZiAnKycgdG8gbWFrZSBzdXJlIHRoYXQgcmVzdWx0IGlzIHNpZ25lZFxuICAgICAgICAgICAgaG9sZCB8PSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBfb3V0IC09IGxlZnQ7XG4gICAgICAgICAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgICAgICAgICBzdGF0ZS50b3RhbCArPSBfb3V0O1xuICAgICAgICAgIGlmIChfb3V0KSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPVxuICAgICAgICAgICAgICAgIC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBwdXQgLSBfb3V0LCBfb3V0KTsqL1xuICAgICAgICAgICAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSk7XG5cbiAgICAgICAgICB9XG4gICAgICAgICAgX291dCA9IGxlZnQ7XG4gICAgICAgICAgLy8gTkI6IGNyYzMyIHN0b3JlZCBhcyBzaWduZWQgMzItYml0IGludCwgenN3YXAzMiByZXR1cm5zIHNpZ25lZCB0b29cbiAgICAgICAgICBpZiAoKHN0YXRlLmZsYWdzID8gaG9sZCA6IHpzd2FwMzIoaG9sZCkpICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGRhdGEgY2hlY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgY2hlY2sgbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOR1RIO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTkdUSDpcbiAgICAgICAgaWYgKHN0YXRlLndyYXAgJiYgc3RhdGUuZmxhZ3MpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUudG90YWwgJiAweGZmZmZmZmZmKSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGxlbmd0aCBjaGVjayc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBsZW5ndGggbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gRE9ORTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBET05FOlxuICAgICAgICByZXQgPSBaX1NUUkVBTV9FTkQ7XG4gICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgIGNhc2UgQkFEOlxuICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7XG4gICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgIGNhc2UgTUVNOlxuICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gICAgICBjYXNlIFNZTkM6XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgICB9XG4gIH1cblxuICAvLyBpbmZfbGVhdmUgPC0gaGVyZSBpcyByZWFsIHBsYWNlIGZvciBcImdvdG8gaW5mX2xlYXZlXCIsIGVtdWxhdGVkIHZpYSBcImJyZWFrIGluZl9sZWF2ZVwiXG5cbiAgLypcbiAgICAgUmV0dXJuIGZyb20gaW5mbGF0ZSgpLCB1cGRhdGluZyB0aGUgdG90YWwgY291bnRzIGFuZCB0aGUgY2hlY2sgdmFsdWUuXG4gICAgIElmIHRoZXJlIHdhcyBubyBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZmxhdGUoKSBjYWxsLCByZXR1cm4gYSBidWZmZXJcbiAgICAgZXJyb3IuICBDYWxsIHVwZGF0ZXdpbmRvdygpIHRvIGNyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSB3aW5kb3cgc3RhdGUuXG4gICAgIE5vdGU6IGEgbWVtb3J5IGVycm9yIGZyb20gaW5mbGF0ZSgpIGlzIG5vbi1yZWNvdmVyYWJsZS5cbiAgICovXG5cbiAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIC8vLS0tXG5cbiAgaWYgKHN0YXRlLndzaXplIHx8IChfb3V0ICE9PSBzdHJtLmF2YWlsX291dCAmJiBzdGF0ZS5tb2RlIDwgQkFEICYmXG4gICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPCBDSEVDSyB8fCBmbHVzaCAhPT0gWl9GSU5JU0gpKSkge1xuICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQsIF9vdXQgLSBzdHJtLmF2YWlsX291dCkpIHtcbiAgICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gICAgfVxuICB9XG4gIF9pbiAtPSBzdHJtLmF2YWlsX2luO1xuICBfb3V0IC09IHN0cm0uYXZhaWxfb3V0O1xuICBzdHJtLnRvdGFsX2luICs9IF9pbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgaWYgKHN0YXRlLndyYXAgJiYgX291dCkge1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBzdHJtLm5leHRfb3V0IC0gX291dCwgX291dCk7Ki9cbiAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpKTtcbiAgfVxuICBzdHJtLmRhdGFfdHlwZSA9IHN0YXRlLmJpdHMgKyAoc3RhdGUubGFzdCA/IDY0IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gVFlQRSA/IDEyOCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IExFTl8gfHwgc3RhdGUubW9kZSA9PT0gQ09QWV8gPyAyNTYgOiAwKTtcbiAgaWYgKCgoX2luID09PSAwICYmIF9vdXQgPT09IDApIHx8IGZsdXNoID09PSBaX0ZJTklTSCkgJiYgcmV0ID09PSBaX09LKSB7XG4gICAgcmV0ID0gWl9CVUZfRVJST1I7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUVuZChzdHJtKSB7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIC8qfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICB2YXIgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUud2luZG93KSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuICBzdHJtLnN0YXRlID0gbnVsbDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVHZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICB2YXIgc3RhdGU7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmICgoc3RhdGUud3JhcCAmIDIpID09PSAwKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuXG4gIC8qIHNhdmUgaGVhZGVyIHN0cnVjdHVyZSAqL1xuICBzdGF0ZS5oZWFkID0gaGVhZDtcbiAgaGVhZC5kb25lID0gZmFsc2U7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5KSB7XG4gIHZhciBkaWN0TGVuZ3RoID0gZGljdGlvbmFyeS5sZW5ndGg7XG5cbiAgdmFyIHN0YXRlO1xuICB2YXIgZGljdGlkO1xuICB2YXIgcmV0O1xuXG4gIC8qIGNoZWNrIHN0YXRlICovXG4gIGlmICghc3RybSAvKiA9PSBaX05VTEwgKi8gfHwgIXN0cm0uc3RhdGUgLyogPT0gWl9OVUxMICovKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKHN0YXRlLndyYXAgIT09IDAgJiYgc3RhdGUubW9kZSAhPT0gRElDVCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBjb3JyZWN0IGRpY3Rpb25hcnkgaWRlbnRpZmllciAqL1xuICBpZiAoc3RhdGUubW9kZSA9PT0gRElDVCkge1xuICAgIGRpY3RpZCA9IDE7IC8qIGFkbGVyMzIoMCwgbnVsbCwgMCkqL1xuICAgIC8qIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgMCk7XG4gICAgaWYgKGRpY3RpZCAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7XG4gICAgfVxuICB9XG4gIC8qIGNvcHkgZGljdGlvbmFyeSB0byB3aW5kb3cgdXNpbmcgdXBkYXRld2luZG93KCksIHdoaWNoIHdpbGwgYW1lbmQgdGhlXG4gICBleGlzdGluZyBkaWN0aW9uYXJ5IGlmIGFwcHJvcHJpYXRlICovXG4gIHJldCA9IHVwZGF0ZXdpbmRvdyhzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCBkaWN0TGVuZ3RoKTtcbiAgaWYgKHJldCkge1xuICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICB9XG4gIHN0YXRlLmhhdmVkaWN0ID0gMTtcbiAgLy8gVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBkaWN0aW9uYXJ5IHNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5leHBvcnRzLmluZmxhdGVSZXNldCA9IGluZmxhdGVSZXNldDtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0MiA9IGluZmxhdGVSZXNldDI7XG5leHBvcnRzLmluZmxhdGVSZXNldEtlZXAgPSBpbmZsYXRlUmVzZXRLZWVwO1xuZXhwb3J0cy5pbmZsYXRlSW5pdCA9IGluZmxhdGVJbml0O1xuZXhwb3J0cy5pbmZsYXRlSW5pdDIgPSBpbmZsYXRlSW5pdDI7XG5leHBvcnRzLmluZmxhdGUgPSBpbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlRW5kID0gaW5mbGF0ZUVuZDtcbmV4cG9ydHMuaW5mbGF0ZUdldEhlYWRlciA9IGluZmxhdGVHZXRIZWFkZXI7XG5leHBvcnRzLmluZmxhdGVTZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmluZmxhdGVJbmZvID0gJ3Bha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuaW5mbGF0ZUNvcHkgPSBpbmZsYXRlQ29weTtcbmV4cG9ydHMuaW5mbGF0ZUdldERpY3Rpb25hcnkgPSBpbmZsYXRlR2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZU1hcmsgPSBpbmZsYXRlTWFyaztcbmV4cG9ydHMuaW5mbGF0ZVByaW1lID0gaW5mbGF0ZVByaW1lO1xuZXhwb3J0cy5pbmZsYXRlU3luYyA9IGluZmxhdGVTeW5jO1xuZXhwb3J0cy5pbmZsYXRlU3luY1BvaW50ID0gaW5mbGF0ZVN5bmNQb2ludDtcbmV4cG9ydHMuaW5mbGF0ZVVuZGVybWluZSA9IGluZmxhdGVVbmRlcm1pbmU7XG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbi8vIFNlZSBzdGF0ZSBkZWZzIGZyb20gaW5mbGF0ZS5qc1xudmFyIEJBRCA9IDMwOyAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cblxuLypcbiAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmdcbiAgIGxpdGVyYWwgYW5kIG1hdGNoIGJ5dGVzIHVudGlsIGVpdGhlciBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBpc1xuICAgYXZhaWxhYmxlLCBhbiBlbmQtb2YtYmxvY2sgaXMgZW5jb3VudGVyZWQsIG9yIGEgZGF0YSBlcnJvciBpcyBlbmNvdW50ZXJlZC5cbiAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3JcbiAgIGV4YW1wbGUsIGEgMTZLIGlucHV0IGJ1ZmZlciBhbmQgYSA2NEsgb3V0cHV0IGJ1ZmZlciwgbW9yZSB0aGFuIDk1JSBvZiB0aGVcbiAgIGluZmxhdGUgZXhlY3V0aW9uIHRpbWUgaXMgc3BlbnQgaW4gdGhpcyByb3V0aW5lLlxuXG4gICBFbnRyeSBhc3N1bXB0aW9uczpcblxuICAgICAgICBzdGF0ZS5tb2RlID09PSBMRU5cbiAgICAgICAgc3RybS5hdmFpbF9pbiA+PSA2XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID49IDI1OFxuICAgICAgICBzdGFydCA+PSBzdHJtLmF2YWlsX291dFxuICAgICAgICBzdGF0ZS5iaXRzIDwgOFxuXG4gICBPbiByZXR1cm4sIHN0YXRlLm1vZGUgaXMgb25lIG9mOlxuXG4gICAgICAgIExFTiAtLSByYW4gb3V0IG9mIGVub3VnaCBvdXRwdXQgc3BhY2Ugb3IgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dFxuICAgICAgICBUWVBFIC0tIHJlYWNoZWQgZW5kIG9mIGJsb2NrIGNvZGUsIGluZmxhdGUoKSB0byBpbnRlcnByZXQgbmV4dCBibG9ja1xuICAgICAgICBCQUQgLS0gZXJyb3IgaW4gYmxvY2sgZGF0YVxuXG4gICBOb3RlczpcblxuICAgIC0gVGhlIG1heGltdW0gaW5wdXQgYml0cyB1c2VkIGJ5IGEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMgMTUgYml0cyBmb3IgdGhlXG4gICAgICBsZW5ndGggY29kZSwgNSBiaXRzIGZvciB0aGUgbGVuZ3RoIGV4dHJhLCAxNSBiaXRzIGZvciB0aGUgZGlzdGFuY2UgY29kZSxcbiAgICAgIGFuZCAxMyBiaXRzIGZvciB0aGUgZGlzdGFuY2UgZXh0cmEuICBUaGlzIHRvdGFscyA0OCBiaXRzLCBvciBzaXggYnl0ZXMuXG4gICAgICBUaGVyZWZvcmUgaWYgc3RybS5hdmFpbF9pbiA+PSA2LCB0aGVuIHRoZXJlIGlzIGVub3VnaCBpbnB1dCB0byBhdm9pZFxuICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy5cblxuICAgIC0gVGhlIG1heGltdW0gYnl0ZXMgdGhhdCBhIHNpbmdsZSBsZW5ndGgvZGlzdGFuY2UgcGFpciBjYW4gb3V0cHV0IGlzIDI1OFxuICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpXG4gICAgICByZXF1aXJlcyBzdHJtLmF2YWlsX291dCA+PSAyNTggZm9yIGVhY2ggbG9vcCB0byBhdm9pZCBjaGVja2luZyBmb3JcbiAgICAgIG91dHB1dCBzcGFjZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhcnQpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgX2luOyAgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5pbnB1dCAqL1xuICB2YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogaGF2ZSBlbm91Z2ggaW5wdXQgd2hpbGUgaW4gPCBsYXN0ICovXG4gIHZhciBfb3V0OyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLm91dHB1dCAqL1xuICB2YXIgYmVnOyAgICAgICAgICAgICAgICAgICAgLyogaW5mbGF0ZSgpJ3MgaW5pdGlhbCBzdHJtLm91dHB1dCAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgb3V0IDwgZW5kLCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlICovXG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICB2YXIgZG1heDsgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBkaXN0YW5jZSBmcm9tIHpsaWIgaGVhZGVyICovXG4vLyNlbmRpZlxuICB2YXIgd3NpemU7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHZhciB3aGF2ZTsgICAgICAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHZhciB3bmV4dDsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgLy8gVXNlIGBzX3dpbmRvd2AgaW5zdGVhZCBgd2luZG93YCwgYXZvaWQgY29uZmxpY3Qgd2l0aCBpbnN0cnVtZW50YXRpb24gdG9vbHNcbiAgdmFyIHNfd2luZG93OyAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgd3NpemUgIT0gMCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5ob2xkICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmJpdHMgKi9cbiAgdmFyIGxjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ubGVuY29kZSAqL1xuICB2YXIgZGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5kaXN0Y29kZSAqL1xuICB2YXIgbG1hc2s7ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgbGVuZ3RoIGNvZGVzICovXG4gIHZhciBkbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuICB2YXIgaGVyZTsgICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmVkIHRhYmxlIGVudHJ5ICovXG4gIHZhciBvcDsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMsIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgb3IgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICB3aW5kb3cgcG9zaXRpb24sIHdpbmRvdyBieXRlcyB0byBjb3B5ICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGgsIHVudXNlZCBieXRlcyAqL1xuICB2YXIgZGlzdDsgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggZGlzdGFuY2UgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG5cblxuICB2YXIgaW5wdXQsIG91dHB1dDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuXG4gIC8qIGNvcHkgc3RhdGUgdG8gbG9jYWwgdmFyaWFibGVzICovXG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgLy9oZXJlID0gc3RhdGUuaGVyZTtcbiAgX2luID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGxhc3QgPSBfaW4gKyAoc3RybS5hdmFpbF9pbiAtIDUpO1xuICBfb3V0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGJlZyA9IF9vdXQgLSAoc3RhcnQgLSBzdHJtLmF2YWlsX291dCk7XG4gIGVuZCA9IF9vdXQgKyAoc3RybS5hdmFpbF9vdXQgLSAyNTcpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgZG1heCA9IHN0YXRlLmRtYXg7XG4vLyNlbmRpZlxuICB3c2l6ZSA9IHN0YXRlLndzaXplO1xuICB3aGF2ZSA9IHN0YXRlLndoYXZlO1xuICB3bmV4dCA9IHN0YXRlLnduZXh0O1xuICBzX3dpbmRvdyA9IHN0YXRlLndpbmRvdztcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICBsY29kZSA9IHN0YXRlLmxlbmNvZGU7XG4gIGRjb2RlID0gc3RhdGUuZGlzdGNvZGU7XG4gIGxtYXNrID0gKDEgPDwgc3RhdGUubGVuYml0cykgLSAxO1xuICBkbWFzayA9ICgxIDw8IHN0YXRlLmRpc3RiaXRzKSAtIDE7XG5cblxuICAvKiBkZWNvZGUgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZXMgdW50aWwgZW5kLW9mLWJsb2NrIG9yIG5vdCBlbm91Z2hcbiAgICAgaW5wdXQgZGF0YSBvciBvdXRwdXQgc3BhY2UgKi9cblxuICB0b3A6XG4gIGRvIHtcbiAgICBpZiAoYml0cyA8IDE1KSB7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgIGJpdHMgKz0gODtcbiAgICB9XG5cbiAgICBoZXJlID0gbGNvZGVbaG9sZCAmIGxtYXNrXTtcblxuICAgIGRvbGVuOlxuICAgIGZvciAoOzspIHsgLy8gR290byBlbXVsYXRpb25cbiAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgYml0cyAtPSBvcDtcbiAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcbiAgICAgIGlmIChvcCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGl0ZXJhbCAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgP1xuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xcblwiIDpcbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxcblwiLCBoZXJlLnZhbCkpO1xuICAgICAgICBvdXRwdXRbX291dCsrXSA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGJhc2UgKi9cbiAgICAgICAgbGVuID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi9cbiAgICAgICAgaWYgKG9wKSB7XG4gICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGVuICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7XG4gICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcXG5cIiwgbGVuKSk7XG4gICAgICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBoZXJlID0gZGNvZGVbaG9sZCAmIGRtYXNrXTtcblxuICAgICAgICBkb2Rpc3Q6XG4gICAgICAgIGZvciAoOzspIHsgLy8gZ290byBlbXVsYXRpb25cbiAgICAgICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLztcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87XG5cbiAgICAgICAgICBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYXNlICovXG4gICAgICAgICAgICBkaXN0ID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi9cbiAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3QgKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gICAgICAgICAgICBpZiAoZGlzdCA+IGRtYXgpIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcXG5cIiwgZGlzdCkpO1xuICAgICAgICAgICAgb3AgPSBfb3V0IC0gYmVnOyAgICAgICAgICAgICAgICAvKiBtYXggZGlzdGFuY2UgaW4gb3V0cHV0ICovXG4gICAgICAgICAgICBpZiAoZGlzdCA+IG9wKSB7ICAgICAgICAgICAgICAgIC8qIHNlZSBpZiBjb3B5IGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgIG9wID0gZGlzdCAtIG9wOyAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgaW4gd2luZG93ICovXG4gICAgICAgICAgICAgIGlmIChvcCA+IHdoYXZlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLnNhbmUpIHtcbiAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgICAgICAgfVxuXG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmF1bHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSXG4vLyAgICAgICAgICAgICAgICBpZiAobGVuIDw9IG9wIC0gd2hhdmUpIHtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICBsZW4gLT0gb3AgLSB3aGF2ZTtcbi8vICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCA+IHdoYXZlKTtcbi8vICAgICAgICAgICAgICAgIGlmIChvcCA9PT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZnJvbSA9IDA7IC8vIHdpbmRvdyBpbmRleFxuICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IHNfd2luZG93O1xuICAgICAgICAgICAgICBpZiAod25leHQgPT09IDApIHsgICAgICAgICAgIC8qIHZlcnkgY29tbW9uIGNhc2UgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplIC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmICh3bmV4dCA8IG9wKSB7ICAgICAgLyogd3JhcCBhcm91bmQgd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSArIHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgb3AgLT0gd25leHQ7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIGVuZCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gMDtcbiAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA8IGxlbikgeyAgLyogc29tZSBmcm9tIHN0YXJ0IG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgICBvcCA9IHduZXh0O1xuICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpZ3VvdXMgaW4gd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDIpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgICAgICAvKiBjb3B5IGRpcmVjdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBsZW5ndGggaXMgdGhyZWUgKi9cbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfSB3aGlsZSAobGVuID4gMik7XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgLyogMm5kIGxldmVsIGRpc3RhbmNlIGNvZGUgKi9cbiAgICAgICAgICAgIGhlcmUgPSBkY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICAgICAgY29udGludWUgZG9kaXN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgY29kZSc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAgICAgLyogMm5kIGxldmVsIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGhlcmUgPSBsY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICBjb250aW51ZSBkb2xlbjtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMzIpIHsgICAgICAgICAgICAgICAgICAgICAvKiBlbmQtb2YtYmxvY2sgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcXG5cIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICB9XG4gIH0gd2hpbGUgKF9pbiA8IGxhc3QgJiYgX291dCA8IGVuZCk7XG5cbiAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovXG4gIGxlbiA9IGJpdHMgPj4gMztcbiAgX2luIC09IGxlbjtcbiAgYml0cyAtPSBsZW4gPDwgMztcbiAgaG9sZCAmPSAoMSA8PCBiaXRzKSAtIDE7XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXR1cm4gKi9cbiAgc3RybS5uZXh0X2luID0gX2luO1xuICBzdHJtLm5leHRfb3V0ID0gX291dDtcbiAgc3RybS5hdmFpbF9pbiA9IChfaW4gPCBsYXN0ID8gNSArIChsYXN0IC0gX2luKSA6IDUgLSAoX2luIC0gbGFzdCkpO1xuICBzdHJtLmF2YWlsX291dCA9IChfb3V0IDwgZW5kID8gMjU3ICsgKGVuZCAtIF9vdXQpIDogMjU3IC0gKF9vdXQgLSBlbmQpKTtcbiAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gIHN0YXRlLmJpdHMgPSBiaXRzO1xuICByZXR1cm47XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xuXG52YXIgTUFYQklUUyA9IDE1O1xudmFyIEVOT1VHSF9MRU5TID0gODUyO1xudmFyIEVOT1VHSF9ESVNUUyA9IDU5Mjtcbi8vdmFyIEVOT1VHSCA9IChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxudmFyIGxiYXNlID0gWyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgYmFzZSAqL1xuICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLFxuICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMFxuXTtcblxudmFyIGxleHQgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCxcbiAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDcyLCA3OFxuXTtcblxudmFyIGRiYXNlID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBiYXNlICovXG4gIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MyxcbiAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LFxuICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3LCAwLCAwXG5dO1xuXG52YXIgZGV4dCA9IFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgZXh0cmEgKi9cbiAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsXG4gIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LFxuICAyOCwgMjgsIDI5LCAyOSwgNjQsIDY0XG5dO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfdGFibGUodHlwZSwgbGVucywgbGVuc19pbmRleCwgY29kZXMsIHRhYmxlLCB0YWJsZV9pbmRleCwgd29yaywgb3B0cylcbntcbiAgdmFyIGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAvL2hlcmUgPSBvcHRzLmhlcmU7IC8qIHRhYmxlIGVudHJ5IGZvciBkdXBsaWNhdGlvbiAqL1xuXG4gIHZhciBsZW4gPSAwOyAgICAgICAgICAgICAgIC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovXG4gIHZhciBzeW0gPSAwOyAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGNvZGUgc3ltYm9scyAqL1xuICB2YXIgbWluID0gMCwgbWF4ID0gMDsgICAgICAgICAgLyogbWluaW11bSBhbmQgbWF4aW11bSBjb2RlIGxlbmd0aHMgKi9cbiAgdmFyIHJvb3QgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHJvb3QgdGFibGUgKi9cbiAgdmFyIGN1cnIgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIGN1cnJlbnQgdGFibGUgKi9cbiAgdmFyIGRyb3AgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqL1xuICB2YXIgbGVmdCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovXG4gIHZhciB1c2VkID0gMDsgICAgICAgICAgICAgIC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovXG4gIHZhciBodWZmID0gMDsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqL1xuICB2YXIgaW5jcjsgICAgICAgICAgICAgIC8qIGZvciBpbmNyZW1lbnRpbmcgY29kZSwgaW5kZXggKi9cbiAgdmFyIGZpbGw7ICAgICAgICAgICAgICAvKiBpbmRleCBmb3IgcmVwbGljYXRpbmcgZW50cmllcyAqL1xuICB2YXIgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi9cbiAgdmFyIG1hc2s7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsb3cgcm9vdCBiaXRzICovXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZSAqL1xuICB2YXIgYmFzZSA9IG51bGw7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgYmFzZV9pbmRleCA9IDA7XG4vLyAgdmFyIHNob2V4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPiBlbmQgKi9cbiAgdmFyIGNvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovXG4gIHZhciBvZmZzID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovXG4gIHZhciBleHRyYSA9IG51bGw7XG4gIHZhciBleHRyYV9pbmRleCA9IDA7XG5cbiAgdmFyIGhlcmVfYml0cywgaGVyZV9vcCwgaGVyZV92YWw7XG5cbiAgLypcbiAgIFByb2Nlc3MgYSBzZXQgb2YgY29kZSBsZW5ndGhzIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBIdWZmbWFuIGNvZGUuICBUaGVcbiAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZVxuICAgc3ltYm9scyAwLi5jb2Rlcy0xLiAgVGhlIEh1ZmZtYW4gY29kZSBpcyBnZW5lcmF0ZWQgYnkgZmlyc3Qgc29ydGluZyB0aGVcbiAgIHN5bWJvbHMgYnkgbGVuZ3RoIGZyb20gc2hvcnQgdG8gbG9uZywgYW5kIHJldGFpbmluZyB0aGUgc3ltYm9sIG9yZGVyXG4gICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzXG4gICBmb3IgdGhlIGZpcnN0IGNvZGUgb2YgdGhlIHNob3J0ZXN0IGxlbmd0aCwgYW5kIHRoZSBjb2RlcyBhcmUgaW50ZWdlclxuICAgaW5jcmVtZW50cyBmb3IgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgemVyb3MgYXJlIGFwcGVuZGVkIGFzIHRoZSBsZW5ndGhcbiAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHNcbiAgIGZyb20gdGhlaXIgbW9yZSBuYXR1cmFsIGludGVnZXIgaW5jcmVtZW50IG9yZGVyaW5nLCBhbmQgc28gd2hlbiB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcyBhcmUgYnVpbHQgaW4gdGhlIGxhcmdlIGxvb3AgYmVsb3csIHRoZSBpbnRlZ2VyIGNvZGVzXG4gICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLlxuXG4gICBUaGlzIHJvdXRpbmUgYXNzdW1lcywgYnV0IGRvZXMgbm90IGNoZWNrLCB0aGF0IGFsbCBvZiB0aGUgZW50cmllcyBpblxuICAgbGVuc1tdIGFyZSBpbiB0aGUgcmFuZ2UgMC4uTUFYQklUUy4gIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhpcy5cbiAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0XG4gICBzeW1ib2wgZG9lcyBub3Qgb2NjdXIgaW4gdGhpcyBjb2RlLlxuXG4gICBUaGUgY29kZXMgYXJlIHNvcnRlZCBieSBjb21wdXRpbmcgYSBjb3VudCBvZiBjb2RlcyBmb3IgZWFjaCBsZW5ndGgsXG4gICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGVcbiAgIHNvcnRlZCB0YWJsZSwgYW5kIHRoZW4gZW50ZXJpbmcgdGhlIHN5bWJvbHMgaW4gb3JkZXIgaW4gdGhlIHNvcnRlZFxuICAgdGFibGUuICBUaGUgc29ydGVkIHRhYmxlIGlzIHdvcmtbXSwgd2l0aCB0aGF0IHNwYWNlIGJlaW5nIHByb3ZpZGVkIGJ5XG4gICB0aGUgY2FsbGVyLlxuXG4gICBUaGUgbGVuZ3RoIGNvdW50cyBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYXMgd2VsbCwgaS5lLiBmaW5kaW5nXG4gICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggY29kZXMsIGRldGVybWluaW5nIGlmIHRoZXJlIGFyZSBhbnlcbiAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkXG4gICBhdCBsZW5ndGggY291bnRzIHRvIGRldGVybWluZSBzdWItdGFibGUgc2l6ZXMgd2hlbiBidWlsZGluZyB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcy5cbiAgICovXG5cbiAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovXG4gIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgY291bnRbbGVuXSA9IDA7XG4gIH1cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBjb3VudFtsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrO1xuICB9XG5cbiAgLyogYm91bmQgY29kZSBsZW5ndGhzLCBmb3JjZSByb290IHRvIGJlIHdpdGhpbiBjb2RlIGxlbmd0aHMgKi9cbiAgcm9vdCA9IGJpdHM7XG4gIGZvciAobWF4ID0gTUFYQklUUzsgbWF4ID49IDE7IG1heC0tKSB7XG4gICAgaWYgKGNvdW50W21heF0gIT09IDApIHsgYnJlYWs7IH1cbiAgfVxuICBpZiAocm9vdCA+IG1heCkge1xuICAgIHJvb3QgPSBtYXg7XG4gIH1cbiAgaWYgKG1heCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHN5bWJvbHMgdG8gY29kZSBhdCBhbGwgKi9cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7ICAvL2hlcmUub3AgPSAodmFyIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxOyAgIC8vaGVyZS5iaXRzID0gKHZhciBjaGFyKTE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7ICAgLy9oZXJlLnZhbCA9ICh2YXIgc2hvcnQpMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG5cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7XG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG4gICAgb3B0cy5iaXRzID0gMTtcbiAgICByZXR1cm4gMDsgICAgIC8qIG5vIHN5bWJvbHMsIGJ1dCB3YWl0IGZvciBkZWNvZGluZyB0byByZXBvcnQgZXJyb3IgKi9cbiAgfVxuICBmb3IgKG1pbiA9IDE7IG1pbiA8IG1heDsgbWluKyspIHtcbiAgICBpZiAoY291bnRbbWluXSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290IDwgbWluKSB7XG4gICAgcm9vdCA9IG1pbjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqL1xuICBsZWZ0ID0gMTtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBsZWZ0IDw8PSAxO1xuICAgIGxlZnQgLT0gY291bnRbbGVuXTtcbiAgICBpZiAobGVmdCA8IDApIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9ICAgICAgICAvKiBvdmVyLXN1YnNjcmliZWQgKi9cbiAgfVxuICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT09IENPREVTIHx8IG1heCAhPT0gMSkpIHtcbiAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovXG4gIH1cblxuICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqL1xuICBvZmZzWzFdID0gMDtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykge1xuICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dO1xuICB9XG5cbiAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqL1xuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGlmIChsZW5zW2xlbnNfaW5kZXggKyBzeW1dICE9PSAwKSB7XG4gICAgICB3b3JrW29mZnNbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rK10gPSBzeW07XG4gICAgfVxuICB9XG5cbiAgLypcbiAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZ1xuICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmZcbiAgIHdpdGggbGVuZ3RoIGxlbi4gIFRoYXQgY29kZSBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5kZXggYnkgZHJvcHBpbmcgZHJvcFxuICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLFxuICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0b1xuICAgZmlsbCB0aGUgdGFibGUgd2l0aCByZXBsaWNhdGVkIGVudHJpZXMuXG5cbiAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHNcbiAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4XG4gICBvZiB0aGUgbG93IHJvb3QgYml0cyBvZiBodWZmLiAgVGhpcyBpcyBzYXZlZCBpbiBsb3cgdG8gY2hlY2sgZm9yIHdoZW4gYVxuICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3AgaXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzXG4gICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuXG5cbiAgIFdoZW4gYSBuZXcgc3ViLXRhYmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlXG4gICBjb2RlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIHdoYXQgc2l6ZSBzdWItdGFibGUgaXMgbmVlZGVkLiAgVGhlIGxlbmd0aFxuICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmVcbiAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy5cblxuICAgdXNlZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB0aGVcbiAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3RcbiAgIHRoZSBjb25zdGFudHMgRU5PVUdIX0xFTlMgYW5kIEVOT1VHSF9ESVNUUyB0byBndWFyZCBhZ2FpbnN0IGNoYW5nZXMgaW5cbiAgIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG4gICBzeW0gaW5jcmVtZW50cyB0aHJvdWdoIGFsbCBzeW1ib2xzLCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcyB3aGVuXG4gICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzXG4gICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzXG4gICBpbiB0aGUgcmVzdCBvZiB0aGUgZGVjb2RpbmcgdGFibGVzIHdpdGggaW52YWxpZCBjb2RlIG1hcmtlcnMuXG4gICAqL1xuXG4gIC8qIHNldCB1cCBmb3IgY29kZSB0eXBlICovXG4gIC8vIHBvb3IgbWFuIG9wdGltaXphdGlvbiAtIHVzZSBpZi1lbHNlIGluc3RlYWQgb2Ygc3dpdGNoLFxuICAvLyB0byBhdm9pZCBkZW9wdHMgaW4gb2xkIHY4XG4gIGlmICh0eXBlID09PSBDT0RFUykge1xuICAgIGJhc2UgPSBleHRyYSA9IHdvcms7ICAgIC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqL1xuICAgIGVuZCA9IDE5O1xuXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTEVOUykge1xuICAgIGJhc2UgPSBsYmFzZTtcbiAgICBiYXNlX2luZGV4IC09IDI1NztcbiAgICBleHRyYSA9IGxleHQ7XG4gICAgZXh0cmFfaW5kZXggLT0gMjU3O1xuICAgIGVuZCA9IDI1NjtcblxuICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogRElTVFMgKi9cbiAgICBiYXNlID0gZGJhc2U7XG4gICAgZXh0cmEgPSBkZXh0O1xuICAgIGVuZCA9IC0xO1xuICB9XG5cbiAgLyogaW5pdGlhbGl6ZSBvcHRzIGZvciBsb29wICovXG4gIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovXG4gIHN5bSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIHN5bWJvbCAqL1xuICBsZW4gPSBtaW47ICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBsZW5ndGggKi9cbiAgbmV4dCA9IHRhYmxlX2luZGV4OyAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSB0byBmaWxsIGluICovXG4gIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi9cbiAgZHJvcCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgYml0cyB0byBkcm9wIGZyb20gY29kZSBmb3IgaW5kZXggKi9cbiAgbG93ID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIHRyaWdnZXIgbmV3IHN1Yi10YWJsZSB3aGVuIGxlbiA+IHJvb3QgKi9cbiAgdXNlZCA9IDEgPDwgcm9vdDsgICAgICAgICAgLyogdXNlIHJvb3QgdGFibGUgZW50cmllcyAqL1xuICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqL1xuXG4gIC8qIGNoZWNrIGF2YWlsYWJsZSB0YWJsZSBzcGFjZSAqL1xuICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICh0eXBlID09PSBESVNUUyAmJiB1c2VkID4gRU5PVUdIX0RJU1RTKSkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgLyogcHJvY2VzcyBhbGwgY29kZXMgYW5kIG1ha2UgdGFibGUgZW50cmllcyAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogY3JlYXRlIHRhYmxlIGVudHJ5ICovXG4gICAgaGVyZV9iaXRzID0gbGVuIC0gZHJvcDtcbiAgICBpZiAod29ya1tzeW1dIDwgZW5kKSB7XG4gICAgICBoZXJlX29wID0gMDtcbiAgICAgIGhlcmVfdmFsID0gd29ya1tzeW1dO1xuICAgIH1cbiAgICBlbHNlIGlmICh3b3JrW3N5bV0gPiBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSBleHRyYVtleHRyYV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgICBoZXJlX3ZhbCA9IGJhc2VbYmFzZV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaGVyZV9vcCA9IDMyICsgNjQ7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovXG4gICAgICBoZXJlX3ZhbCA9IDA7XG4gICAgfVxuXG4gICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gZHJvcCk7XG4gICAgZmlsbCA9IDEgPDwgY3VycjtcbiAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqL1xuICAgIGRvIHtcbiAgICAgIGZpbGwgLT0gaW5jcjtcbiAgICAgIHRhYmxlW25leHQgKyAoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gKGhlcmVfYml0cyA8PCAyNCkgfCAoaGVyZV9vcCA8PCAxNikgfCBoZXJlX3ZhbCB8MDtcbiAgICB9IHdoaWxlIChmaWxsICE9PSAwKTtcblxuICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIDEpO1xuICAgIHdoaWxlIChodWZmICYgaW5jcikge1xuICAgICAgaW5jciA+Pj0gMTtcbiAgICB9XG4gICAgaWYgKGluY3IgIT09IDApIHtcbiAgICAgIGh1ZmYgJj0gaW5jciAtIDE7XG4gICAgICBodWZmICs9IGluY3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh1ZmYgPSAwO1xuICAgIH1cblxuICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqL1xuICAgIHN5bSsrO1xuICAgIGlmICgtLWNvdW50W2xlbl0gPT09IDApIHtcbiAgICAgIGlmIChsZW4gPT09IG1heCkgeyBicmVhazsgfVxuICAgICAgbGVuID0gbGVuc1tsZW5zX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG5cbiAgICAvKiBjcmVhdGUgbmV3IHN1Yi10YWJsZSBpZiBuZWVkZWQgKi9cbiAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9PSBsb3cpIHtcbiAgICAgIC8qIGlmIGZpcnN0IHRpbWUsIHRyYW5zaXRpb24gdG8gc3ViLXRhYmxlcyAqL1xuICAgICAgaWYgKGRyb3AgPT09IDApIHtcbiAgICAgICAgZHJvcCA9IHJvb3Q7XG4gICAgICB9XG5cbiAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi9cbiAgICAgIG5leHQgKz0gbWluOyAgICAgICAgICAgIC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqL1xuXG4gICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi9cbiAgICAgIGN1cnIgPSBsZW4gLSBkcm9wO1xuICAgICAgbGVmdCA9IDEgPDwgY3VycjtcbiAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkge1xuICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTtcbiAgICAgICAgaWYgKGxlZnQgPD0gMCkgeyBicmVhazsgfVxuICAgICAgICBjdXJyKys7XG4gICAgICAgIGxlZnQgPDw9IDE7XG4gICAgICB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbm91Z2ggc3BhY2UgKi9cbiAgICAgIHVzZWQgKz0gMSA8PCBjdXJyO1xuICAgICAgaWYgKCh0eXBlID09PSBMRU5TICYmIHVzZWQgPiBFTk9VR0hfTEVOUykgfHxcbiAgICAgICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqL1xuICAgICAgbG93ID0gaHVmZiAmIG1hc2s7XG4gICAgICAvKnRhYmxlLm9wW2xvd10gPSBjdXJyO1xuICAgICAgdGFibGUuYml0c1tsb3ddID0gcm9vdDtcbiAgICAgIHRhYmxlLnZhbFtsb3ddID0gbmV4dCAtIG9wdHMudGFibGVfaW5kZXg7Ki9cbiAgICAgIHRhYmxlW2xvd10gPSAocm9vdCA8PCAyNCkgfCAoY3VyciA8PCAxNikgfCAobmV4dCAtIHRhYmxlX2luZGV4KSB8MDtcbiAgICB9XG4gIH1cblxuICAvKiBmaWxsIGluIHJlbWFpbmluZyB0YWJsZSBlbnRyeSBpZiBjb2RlIGlzIGluY29tcGxldGUgKGd1YXJhbnRlZWQgdG8gaGF2ZVxuICAgYXQgbW9zdCBvbmUgcmVtYWluaW5nIGVudHJ5LCBzaW5jZSBpZiB0aGUgY29kZSBpcyBpbmNvbXBsZXRlLCB0aGVcbiAgIG1heGltdW0gY29kZSBsZW5ndGggdGhhdCB3YXMgYWxsb3dlZCB0byBnZXQgdGhpcyBmYXIgaXMgb25lIGJpdCkgKi9cbiAgaWYgKGh1ZmYgIT09IDApIHtcbiAgICAvL3RhYmxlLm9wW25leHQgKyBodWZmXSA9IDY0OyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbbmV4dCArIGh1ZmZdID0gbGVuIC0gZHJvcDtcbiAgICAvL3RhYmxlLnZhbFtuZXh0ICsgaHVmZl0gPSAwO1xuICAgIHRhYmxlW25leHQgKyBodWZmXSA9ICgobGVuIC0gZHJvcCkgPDwgMjQpIHwgKDY0IDw8IDE2KSB8MDtcbiAgfVxuXG4gIC8qIHNldCByZXR1cm4gcGFyYW1ldGVycyAqL1xuICAvL29wdHMudGFibGVfaW5kZXggKz0gdXNlZDtcbiAgb3B0cy5iaXRzID0gcm9vdDtcbiAgcmV0dXJuIDA7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbiAgWl9OT19GTFVTSDogICAgICAgICAwLFxuICBaX1BBUlRJQUxfRkxVU0g6ICAgIDEsXG4gIFpfU1lOQ19GTFVTSDogICAgICAgMixcbiAgWl9GVUxMX0ZMVVNIOiAgICAgICAzLFxuICBaX0ZJTklTSDogICAgICAgICAgIDQsXG4gIFpfQkxPQ0s6ICAgICAgICAgICAgNSxcbiAgWl9UUkVFUzogICAgICAgICAgICA2LFxuXG4gIC8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAgKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gICovXG4gIFpfT0s6ICAgICAgICAgICAgICAgMCxcbiAgWl9TVFJFQU1fRU5EOiAgICAgICAxLFxuICBaX05FRURfRElDVDogICAgICAgIDIsXG4gIFpfRVJSTk86ICAgICAgICAgICAtMSxcbiAgWl9TVFJFQU1fRVJST1I6ICAgIC0yLFxuICBaX0RBVEFfRVJST1I6ICAgICAgLTMsXG4gIC8vWl9NRU1fRVJST1I6ICAgICAtNCxcbiAgWl9CVUZfRVJST1I6ICAgICAgIC01LFxuICAvL1pfVkVSU0lPTl9FUlJPUjogLTYsXG5cbiAgLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4gIFpfTk9fQ09NUFJFU1NJT046ICAgICAgICAgMCxcbiAgWl9CRVNUX1NQRUVEOiAgICAgICAgICAgICAxLFxuICBaX0JFU1RfQ09NUFJFU1NJT046ICAgICAgIDksXG4gIFpfREVGQVVMVF9DT01QUkVTU0lPTjogICAtMSxcblxuXG4gIFpfRklMVEVSRUQ6ICAgICAgICAgICAgICAgMSxcbiAgWl9IVUZGTUFOX09OTFk6ICAgICAgICAgICAyLFxuICBaX1JMRTogICAgICAgICAgICAgICAgICAgIDMsXG4gIFpfRklYRUQ6ICAgICAgICAgICAgICAgICAgNCxcbiAgWl9ERUZBVUxUX1NUUkFURUdZOiAgICAgICAwLFxuXG4gIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbiAgWl9CSU5BUlk6ICAgICAgICAgICAgICAgICAwLFxuICBaX1RFWFQ6ICAgICAgICAgICAgICAgICAgIDEsXG4gIC8vWl9BU0NJSTogICAgICAgICAgICAgICAgMSwgLy8gPSBaX1RFWFQgKGRlcHJlY2F0ZWQpXG4gIFpfVU5LTk9XTjogICAgICAgICAgICAgICAgMixcblxuICAvKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbiAgWl9ERUZMQVRFRDogICAgICAgICAgICAgICA4XG4gIC8vWl9OVUxMOiAgICAgICAgICAgICAgICAgbnVsbCAvLyBVc2UgLTEgb3IgbnVsbCBpbmxpbmUsIGRlcGVuZGluZyBvbiB2YXIgdHlwZVxufTtcbiIsIid1c2Ugc3RyaWN0J1xuY29uc3QgV0FSQ1JlY29yZCA9IHJlcXVpcmUoJy4vcmVjb3JkJylcbmNvbnN0IHsgY3JsZiwgYmVnaW4gfSA9IHJlcXVpcmUoJy4vZmllbGRJZGVudGlmaWVycycpXG5cbi8qKlxuICogQHR5cGUge3toZWFkZXI6IHN5bWJvbCwgY29udGVudDE6IHN5bWJvbCwgY29udGVudDI6IHN5bWJvbCwgY29uc3VtZUNSTEZIZWFkZXI6IHN5bWJvbCwgY29uc3VtZUNSTEZDb250ZW50MTogc3ltYm9sLCBjb25zdW1lQ1JMRkNvbnRlbnQyOiBzeW1ib2x9fVxuICovXG5jb25zdCBwYXJzaW5nU3RhdGVzID0ge1xuICBoZWFkZXI6IFN5bWJvbCgnd2FyYy1wYXJzaW5nLWhlYWRlcicpLFxuICBjb250ZW50MTogU3ltYm9sKCd3YXJjLXBhcnNpbmctY29udGVudDEnKSxcbiAgY29udGVudDI6IFN5bWJvbCgnd2FyYy1wYXJzaW5nLWNvbnRlbnQyJyksXG4gIGNvbnN1bWVDUkxGSGVhZGVyOiBTeW1ib2woJ3dhcmMtcGFyc2luZy1jb21zdW1lLWNybGYtaGVhZGVyJyksXG4gIGNvbnN1bWVDUkxGQ29udGVudDE6IFN5bWJvbCgnd2FyYy1wYXJzaW5nLWNvbXN1bWUtY3JsZi1jMScpLFxuICBjb25zdW1lQ1JMRkNvbnRlbnQyOiBTeW1ib2woJ3dhcmMtcGFyc2luZy1jb21zdW1lLWNybGYtYzInKVxufVxuXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmNvbnN0IFdGSUJlZ2luTGVuID0gYmVnaW4ubGVuZ3RoXG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJ9IGxpbmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0p1c3RDUkxGIChsaW5lKSB7XG4gIGlmIChsaW5lLmxlbmd0aCAhPT0gMikgcmV0dXJuIGZhbHNlXG4gIHJldHVybiBsaW5lWzBdID09PSBjcmxmWzBdICYmIGxpbmVbMV0gPT09IGNybGZbMV1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gbGluZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzV0FSQ1JldmlzaW9uTGluZSAobGluZSkge1xuICBpZiAobGluZS5sZW5ndGggPiAxMSkgcmV0dXJuIGZhbHNlXG4gIGxldCBpID0gMFxuICB3aGlsZSAoaSA8IFdGSUJlZ2luTGVuKSB7XG4gICAgaWYgKGJlZ2luW2ldICE9PSBsaW5lW2ldKSByZXR1cm4gZmFsc2VcbiAgICBpICs9IDFcbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIEBkZXNjIFByb2dyZXNzaXZlbHkgYnVpbGRzIHdhcmMgcmVjb3JkcyBieSBjb25zdW1pbmcgdGhlIGZpbGUgbGluZSBieSBsaW5lXG4gKi9cbmNsYXNzIFJlY29yZEJ1aWxkZXIge1xuICAvKipcbiAgICogQGRlc2MgQ3JlYXRlIGEgbmV3IFJlY29yZEJ1aWxkZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7e2hlYWRlcjogQnVmZmVyW10sIGMxOiBCdWZmZXJbXSwgYzI6IEJ1ZmZlcltdfX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX3BhcnRzID0ge1xuICAgICAgaGVhZGVyOiBbXSxcbiAgICAgIGMxOiBbXSxcbiAgICAgIGMyOiBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtzeW1ib2x9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl9wYXJzaW5nU3RhdGUgPSBwYXJzaW5nU3RhdGVzLmhlYWRlclxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFJldHVybnMgYSBuZXcgV0FSQyByZWNvcmQgaWYgb25lIGNhbiBiZSBjcmVhdGVkIG90aGVyd2lzZSByZXR1cm5zIG51bGxcbiAgICogQHJldHVybnMgez9XQVJDUmVjb3JkfVxuICAgKi9cbiAgYnVpbGRSZWNvcmQgKCkge1xuICAgIGlmICh0aGlzLl9wYXJ0cy5oZWFkZXIubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IG5ld1JlY29yZCA9IG5ldyBXQVJDUmVjb3JkKHRoaXMuX3BhcnRzKVxuICAgIHRoaXMuX3BhcnRzLmhlYWRlciA9IFtdXG4gICAgdGhpcy5fcGFydHMuYzEgPSBbXVxuICAgIHRoaXMuX3BhcnRzLmMyID0gW11cbiAgICByZXR1cm4gbmV3UmVjb3JkXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgQ29uc3VtZXMgYSBsaW5lIG9mIGEgV0FSQyBmaWxlLlxuICAgKiBJZiBhIHJlY29yZCBjYW4gYmUgYnVpbHQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IFdBUkNSZWNvcmQgb3RoZXJ3aXNlIG51bGxcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGxpbmUgLSBUaGUgbGluZSB0byBiZSBjb25zdW1lZFxuICAgKiBAcmV0dXJucyB7P1dBUkNSZWNvcmR9XG4gICAqL1xuICBjb25zdW1lTGluZSAobGluZSkge1xuICAgIGxldCBuZXdSZWNvcmQgPSBudWxsXG4gICAgaWYgKGlzV0FSQ1JldmlzaW9uTGluZShsaW5lKSkge1xuICAgICAgdGhpcy5fcGFyc2luZ1N0YXRlID0gcGFyc2luZ1N0YXRlcy5oZWFkZXJcbiAgICAgIG5ld1JlY29yZCA9IHRoaXMuYnVpbGRSZWNvcmQoKVxuICAgIH1cbiAgICBjb25zdCBpc1NlcCA9IGlzSnVzdENSTEYobGluZSlcbiAgICBzd2l0Y2ggKHRoaXMuX3BhcnNpbmdTdGF0ZSkge1xuICAgICAgY2FzZSBwYXJzaW5nU3RhdGVzLmhlYWRlcjpcbiAgICAgICAgaWYgKCFpc1NlcCkge1xuICAgICAgICAgIHRoaXMuX3BhcnRzLmhlYWRlci5wdXNoKGxpbmUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcGFyc2luZ1N0YXRlID0gcGFyc2luZ1N0YXRlcy5jb25zdW1lQ1JMRkhlYWRlclxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIHBhcnNpbmdTdGF0ZXMuY29uc3VtZUNSTEZIZWFkZXI6XG4gICAgICAgIGlmICghaXNTZXApIHtcbiAgICAgICAgICB0aGlzLl9wYXJ0cy5jMS5wdXNoKGxpbmUpXG4gICAgICAgICAgdGhpcy5fcGFyc2luZ1N0YXRlID0gcGFyc2luZ1N0YXRlcy5jb250ZW50MVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIHBhcnNpbmdTdGF0ZXMuY29udGVudDE6XG4gICAgICAgIGlmICghaXNTZXApIHtcbiAgICAgICAgICB0aGlzLl9wYXJ0cy5jMS5wdXNoKGxpbmUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcGFyc2luZ1N0YXRlID0gcGFyc2luZ1N0YXRlcy5jb25zdW1lQ1JMRkNvbnRlbnQxXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgcGFyc2luZ1N0YXRlcy5jb25zdW1lQ1JMRkNvbnRlbnQxOlxuICAgICAgICBpZiAoIWlzU2VwKSB7XG4gICAgICAgICAgdGhpcy5fcGFydHMuYzIucHVzaChsaW5lKVxuICAgICAgICAgIHRoaXMuX3BhcnNpbmdTdGF0ZSA9IHBhcnNpbmdTdGF0ZXMuY29udGVudDJcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBwYXJzaW5nU3RhdGVzLmNvbnRlbnQyOlxuICAgICAgICBpZiAoIWlzU2VwKSB7XG4gICAgICAgICAgdGhpcy5fcGFydHMuYzIucHVzaChsaW5lKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3BhcnNpbmdTdGF0ZSA9IHBhcnNpbmdTdGF0ZXMuY29uc3VtZUNSTEZDb250ZW50MlxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIHBhcnNpbmdTdGF0ZXMuY29uc3VtZUNSTEZDb250ZW50MjpcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1JlY29yZFxuICB9XG59XG5cbi8qKlxuICogQHR5cGUge1JlY29yZEJ1aWxkZXJ9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gUmVjb3JkQnVpbGRlclxuIiwiJ3VzZSBzdHJpY3QnXG5jb25zdCBDb250ZW50UGFyc2VyID0gcmVxdWlyZSgnLi93YXJjQ29udGVudFBhcnNlcnMnKVxuY29uc3QgeyBXQVJDVHlwZXMgfSA9IHJlcXVpcmUoJy4uL3dyaXRlcnMvd2FyY0ZpZWxkcycpXG5cbi8qKlxuICogQGRlc2MgV0FSQyByZWNvcmQgY2xhc3MuIFRoZSBXQVJDIG5hbWVkIGZpZWxkcyBhcmUgcHJvcGVydGllcyBvbiB0aGlzIG9iamVjdFxuICovXG5jbGFzcyBXQVJDUmVjb3JkIHtcbiAgLyoqXG4gICAqIEBkZXNjIENyZWF0ZSBhIG5ldyBXQVJDUmVjb3JkXG4gICAqIEBwYXJhbSB7e2hlYWRlcjogQnVmZmVyW10sIGMxOiBCdWZmZXJbXSwgYzI6IEJ1ZmZlcltdfX0gd2FyY1BhcnRzIC0gVGhlIHBhcnRzIG9mIGEgd2FyYyByZWNvcmRcbiAgICovXG4gIGNvbnN0cnVjdG9yICh3YXJjUGFydHMpIHtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcGFyc2VkIFdBUkMgaGVhZGVyXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLndhcmNIZWFkZXIgPSBDb250ZW50UGFyc2VyLnBhcnNlV2FyY1JlY29yZEhlYWRlcih3YXJjUGFydHMuaGVhZGVyKVxuXG4gICAgLyoqXG4gICAgICogQGRlc2MgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcnNlZCByZXF1ZXN0IG9yIHJlc3BvbnNlIHJlY29yZHMgSFRUUCBpbmZvcm1hdGlvblxuICAgICAqIEB0eXBlIHs/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/IHJlc3AucmVxdWVzdC5ib2R5IDogbnVsbFxuXG4gICAgLy8gbm93LCB3cml0ZSBvdXIgcmVxdWVzdCByZWNvcmRcbiAgICBhd2FpdCB0aGlzLndyaXRlUmVxdWVzdFJlY29yZCh0aGlzLl9VUC5ocmVmLCByZXFIVFRQLCBwZClcblxuICAgIC8vIHdyaXRlIHRoZSByZXNwb25zZSAtIHdlIHdvbid0IGhhdmUgYSByZXNwIGlmIHdlJ3ZlIG9ubHkgbWFkZSBhIHJlcXVlc3RcbiAgICBsZXQgcmVzSFRUUCA9IGBIVFRQLzEuMSAke3Jlc3Auc3RhdHVzQ29kZX0gJHtcbiAgICAgIFNUQVRVU19DT0RFU1tyZXNwLnN0YXR1c0NvZGVdXG4gICAgfSAke0NSTEZ9JHtzdHJpbmdpZnlIZWFkZXJzKHJlc3AuaGVhZGVycyl9YFxuICAgIGxldCBib2R5ID0gcmVzcC5ib2R5XG5cbiAgICBpZiAoYm9keSkge1xuICAgICAgcmVzSFRUUCA9IHJlc0hUVFAucmVwbGFjZShub0daLCAnJylcbiAgICAgIHJlc0hUVFAgPSByZXNIVFRQLnJlcGxhY2UoXG4gICAgICAgIHJlcGxhY2VDb250ZW50TGVuLFxuICAgICAgICBgQ29udGVudC1MZW5ndGg6ICR7QnVmZmVyLmJ5dGVMZW5ndGgoYm9keSwgJ3V0ZjgnKX0ke0NSTEZ9YFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoaXMgcmVjb3JkIGhhcyAwIGNvbnRlbnRcbiAgICAgIHJlc0hUVFAgPSByZXNIVFRQLnJlcGxhY2UocmVwbGFjZUNvbnRlbnRMZW4sIGBDb250ZW50LUxlbmd0aDogMCR7Q1JMRn1gKVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLndyaXRlUmVzcG9uc2VSZWNvcmQodGhpcy5fVVAuaHJlZiwgcmVzSFRUUCwgYm9keSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlcXVlc3RMaWJXQVJDR2VuZXJhdG9yXG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..9621507 --- /dev/null +++ b/index.html @@ -0,0 +1,37 @@ + + + + + + + + + Test WARC: + + + + + + diff --git a/index.js b/index.js index 98458e2..558f48e 100755 --- a/index.js +++ b/index.js @@ -115,3 +115,8 @@ if (require('./lib/parsers/_canUseRecordIterator')) { */ exports.recordIterator = require('./lib/parsers/recordterator') } + +// Testing for Browser +exports.stream = require('stream') +exports.zlib = require('zlib') + 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== From c92414ca565dedfd3b234d894075f7c43dadc3c3 Mon Sep 17 00:00:00 2001 From: Ilya Kreymer Date: Sat, 1 Jun 2019 13:54:10 -0700 Subject: [PATCH 2/3] use pako directly! --- dist/nodewarc.js | 10 +++++----- index.html | 23 ++++++++++++++++++++--- index.js | 2 +- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/dist/nodewarc.js b/dist/nodewarc.js index 205d7c3..2829842 100644 --- a/dist/nodewarc.js +++ b/dist/nodewarc.js @@ -1,20 +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=60)}([function(e,t,r){"use strict";(function(e){ +!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(63),i=r(64),s=r(35);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 W(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return z(e).length;default:if(n)return W(e).length;t=(""+t).toLowerCase(),n=!0}}function g(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function _(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 l=!0,f=0;fi&&(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+l<=r)switch(l){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,l=1):c>65535&&(c-=65536,n.push(c>>>10&1023|55296),c=56320|1023&c),n.push(c),i+=l}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 T(this,t,r);case"latin1":case"binary":return A(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),l=0;li)&&(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 y(this,e,t,r);case"utf8":case"utf-8":return w(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 T(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 j(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 B(e,t,r,n,s){return s||j(e,0,r,4),i.write(e,t,r,n,23,4),r+4}function N(e,t,r,n,s){return s||j(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 B(this,e,t,!0,r)},u.prototype.writeFloatBE=function(e,t,r){return B(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 z(e){return n.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(U,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function M(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,l=-1;function f(){c&&u&&(c=!1,u.length?h=u.concat(h):l=-1,h.length&&d())}function d(){if(!c){var e=a(f);c=!0;for(var t=h.length;t;){for(u=h,h=[];++l1)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 l(e){return`WARC-Concurrent-To: ${r}`}function f(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(l(r)),null!=a&&u.push(f(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(f(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(l(r)),null!=a&&u.push(f(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){var n=r(49),i="object"==typeof self&&self&&self.Object===Object&&self,s=n||i||Function("return this")();e.exports=s},function(e,t,r){"use strict";var n=r(19),i=Object.keys||function(e){var t=[];for(var r in e)t.push(r);return t};e.exports=l;var s=r(11);s.inherits=r(4);var o=r(36),a=r(27);s.inherits(l,o);for(var u=i(a.prototype),h=0;h({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,w,i,y],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,w,n,y],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(l({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,w,s,y],u))}_writeResponseRecord(e,r,n,i){const s=v(n,i),o=t.from(f({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,w,s,y],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(36)).Stream=t,t.Readable=t,t.Writable=r(27),t.Duplex=r(6),t.Transform=r(40),t.PassThrough=r(71)},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(87),{crlf:s}=r(29);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),l=["%","/","?",";","#"].concat(c),f=["/","?","#"],d=/^[+a-z0-9A-Z_-]{0,63}$/,p=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,g={javascript:!0,"javascript:":!0},_={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},y=r(130);function w(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 B=O.slice(0,T),N=O.slice(T+1),U=L.match(p);U&&(B.push(U[1]),N.unshift(U[2])),N.length&&(w="/"+N.join(".")+w),this.hostname=B.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),C||(this.hostname=n.toASCII(this.hostname));var D=this.port?":"+this.port:"",W=this.hostname||"";this.host=W+D,this.href+=this.host,C&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==w[0]&&(w="/"+w))}if(!g[R])for(T=0,I=c.length;T0)&&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,T=0,A=x.length;A>=0;A--)"."===(k=x[A])?x.splice(A,1):".."===k?(x.splice(A,1),T++):T&&(x.splice(A,1),T--);if(!v&&!R)for(;T--;T)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(76),o=r(42),a=r(41).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),l=0;l=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 y(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 w(e){if(!(this instanceof w))return new w(e);T.call(this,e,s.DEFLATE)}function b(e){if(!(this instanceof b))return new b(e);T.call(this,e,s.INFLATE)}function v(e){if(!(this instanceof v))return new v(e);T.call(this,e,s.GZIP)}function R(e){if(!(this instanceof R))return new R(e);T.call(this,e,s.GUNZIP)}function x(e){if(!(this instanceof x))return new x(e);T.call(this,e,s.DEFLATERAW)}function E(e){if(!(this instanceof E))return new E(e);T.call(this,e,s.INFLATERAW)}function k(e){if(!(this instanceof k))return new k(e);T.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 T(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){A(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 A(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=w,t.Inflate=b,t.Gzip=v,t.Gunzip=R,t.DeflateRaw=x,t.InflateRaw=E,t.Unzip=k,t.createDeflate=function(e){return new w(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 w(t),e,r)},t.deflateSync=function(e,t){return y(new w(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 y(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 y(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 y(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 y(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 y(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 y(new E(t),e)},o.inherits(T,i),T.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)},T.prototype.reset=function(){return a(this._handle,"zlib binding closed"),this._handle.reset()},T.prototype._flush=function(e){this._transform(n.alloc(0),"",e)},T.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))},T.prototype.close=function(t){A(this,t),e.nextTick(C,this)},T.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"))},T.prototype._processChunk=function(e,t,r){var i=e&&e.length,s=this._chunkSize-this._offset,o=0,c=this,l="function"==typeof r;if(!l){var f,d=[],p=0;this.on("error",function(e){f=e}),a(this._handle,"zlib binding closed");do{var g=this._handle.writeSync(t,e,o,i,this._buffer,this._offset,s)}while(!this._hadError&&y(g[0],g[1]));if(this._hadError)throw f;if(p>=u)throw A(this),new RangeError(h);var _=n.concat(d,p);return A(this),_}a(this._handle,"zlib binding closed");var m=this._handle.write(t,e,o,i,this._buffer,this._offset,s);function y(u,h){if(this&&(this.buffer=null,this.callback=null),!c._hadError){var f=s-h;if(a(f>=0,"have should not go down"),f>0){var g=c._buffer.slice(c._offset,c._offset+f);c._offset+=f,l?c.push(g):(d.push(g),p+=g.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,!l)return!0;var _=c._handle.write(t,e,o,i,c._buffer,c._offset,c._chunkSize);return _.callback=y,void(_.buffer=e)}if(!l)return!1;r()}}m.buffer=e,m.callback=y},o.inherits(w,T),o.inherits(b,T),o.inherits(v,T),o.inherits(R,T),o.inherits(x,T),o.inherits(E,T),o.inherits(k,T)}).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 l(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 f(this,e,!0)},a.prototype.rawListeners=function(e){return f(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(19);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=y;var a,u=!t.browser&&["v0.10","v0.9."].indexOf(t.version.slice(0,5))>-1?n:s.nextTick;y.WritableState=m;var h=r(11);h.inherits=r(4);var c={deprecate:r(70)},l=r(37),f=r(20).Buffer,d=i.Uint8Array||function(){};var p,g=r(38);function _(){}function m(e,t){a=a||r(6),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 l=!1===e.decodeStrings;this.decodeStrings=!l,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 y(e){if(a=a||r(6),!(p.call(y,this)||this instanceof a))return new y(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)),l.call(this)}function w(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,w(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,l=r.callback;if(w(e,t,!1,t.objectMode?1:h.length,h,c,l),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(y,l),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(y,Symbol.hasInstance,{value:function(e){return!!p.call(this,e)||this===y&&(e&&e._writableState instanceof m)}})):p=function(e){return e instanceof this},y.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},y.prototype.write=function(e,t,r){var n,i=this._writableState,o=!1,a=!i.objectMode&&(n=e,f.isBuffer(n)||n instanceof d);return a&&!f.isBuffer(e)&&(e=function(e){return f.from(e)}(e)),"function"==typeof t&&(r=t,t=null),a?t="buffer":t||(t=i.defaultEncoding),"function"!=typeof r&&(r=_),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=f.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(y.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),y.prototype._write=function(e,t,r){r(new Error("_write() is not implemented"))},y.prototype._writev=null,y.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(y.prototype,"destroyed",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}}),y.prototype.destroy=g.destroy,y.prototype._undestroy=g.undestroy,y.prototype._destroy=function(e,t){this.end(),t(e)}}).call(this,r(2),r(68).setImmediate,r(1))},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(5).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(133),i=r(55),s=r(135),o=r(136),a=r(17),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 l=new n(t);return r&&l.on("response",r),l},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(137),{DASH:i}=r(28),{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(143);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(19);e.exports=w;var s,o=r(35);w.ReadableState=y;r(26).EventEmitter;var a=function(e,t){return e.listeners(t).length},u=r(37),h=r(20).Buffer,c=t.Uint8Array||function(){};var l=r(11);l.inherits=r(4);var f=r(65),d=void 0;d=f&&f.debuglog?f.debuglog("stream"):function(){};var p,g=r(66),_=r(38);l.inherits(w,u);var m=["error","close","destroy","pause","resume"];function y(e,t){e=e||{};var n=t instanceof(s=s||r(6));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 g,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(39).StringDecoder),this.decoder=new p(e.encoding),this.encoding=e.encoding)}function w(e){if(s=s||r(6),!(this instanceof w))return new w(e);this._readableState=new y(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(T,e,t))}function T(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},w.prototype._read=function(e){this.emit("error",new Error("_read() is not implemented"))},w.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:w;function h(t,n){d("onunpipe"),t===r&&n&&!1===n.hasUnpiped&&(n.hasUnpiped=!0,d("cleanup"),e.removeListener("close",m),e.removeListener("finish",y),e.removeListener("drain",l),e.removeListener("error",_),e.removeListener("unpipe",h),r.removeListener("end",c),r.removeListener("end",w),r.removeListener("data",g),f=!0,!s.awaitDrain||e._writableState&&!e._writableState.needDrain||l())}function c(){d("onend"),e.end()}s.endEmitted?i.nextTick(u):r.once("end",u),e.on("unpipe",h);var l=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",l);var f=!1;var p=!1;function g(t){d("ondata"),p=!1,!1!==e.write(t)||p||((1===s.pipesCount&&s.pipes===e||s.pipesCount>1&&-1!==P(s.pipes,e))&&!f&&(d("false write response, pause",r._readableState.awaitDrain),r._readableState.awaitDrain++,p=!0),r.pause())}function _(t){d("onerror",t),w(),e.removeListener("error",_),0===a(e,"error")&&e.emit("error",t)}function m(){e.removeListener("finish",y),w()}function y(){d("onfinish"),e.removeListener("close",m),w()}function w(){d("unpipe"),r.unpipe(e)}return r.on("data",g),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",_),e.once("close",m),e.once("finish",y),e.emit("pipe",r),s.flowing||(d("pipe resume"),r.resume()),e},w.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 l(e){var t=e&&e.length?this.write(e):"";return this.lastNeed?t+this.lastChar.toString("base64",0,3-this.lastNeed):t}function f(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(6),i=r(11);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=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]!==l[h])return!1;for(h=c.length-1;h>=0;h--)if(a=c[h],!w(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}f.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(f.AssertionError,Error),f.fail=m,f.ok=y,f.equal=function(e,t,r){e!=t&&m(e,t,r,"==",f.equal)},f.notEqual=function(e,t,r){e==t&&m(e,t,r,"!=",f.notEqual)},f.deepEqual=function(e,t,r){w(e,t,!1)||m(e,t,r,"deepEqual",f.deepEqual)},f.deepStrictEqual=function(e,t,r){w(e,t,!0)||m(e,t,r,"deepStrictEqual",f.deepStrictEqual)},f.notDeepEqual=function(e,t,r){w(e,t,!1)&&m(e,t,r,"notDeepEqual",f.notDeepEqual)},f.notDeepStrictEqual=function e(t,r,n){w(t,r,!0)&&m(t,r,n,"notDeepStrictEqual",e)},f.strictEqual=function(e,t,r){e!==t&&m(e,t,r,"===",f.strictEqual)},f.notStrictEqual=function(e,t,r){e===t&&m(e,t,r,"!==",f.notStrictEqual)},f.throws=function(e,t,r){R(!0,e,t,r)},f.doesNotThrow=function(e,t,r){R(!1,e,t,r)},f.ifError=function(e){if(e)throw e},f.strict=n(function e(t,r){t||m(t,!0,r,"==",e)},f,{equal:f.strictEqual,deepEqual:f.deepStrictEqual,notEqual:f.notStrictEqual,notDeepEqual:f.notDeepStrictEqual}),f.strict.strict=f.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),y(n.showHidden)&&(n.showHidden=!1),y(n.depth)&&(n.depth=2),y(n.colors)&&(n.colors=!1),y(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(y(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(_(t))return e.stylize(""+t,"number");if(p(t))return e.stylize(""+t,"boolean");if(g(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 l(r);if(0===o.length){if(x(r)){var u=r.name?": "+r.name:"";return e.stylize("[Function"+u+"]","special")}if(w(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 l(r)}var h,b="",E=!1,k=["{","}"];(d(r)&&(E=!0,k=["[","]"]),x(r))&&(b=" [Function"+(r.name?": "+r.name:"")+"]");return w(r)&&(b=" "+RegExp.prototype.toString.call(r)),v(r)&&(b=" "+Date.prototype.toUTCString.call(r)),R(r)&&(b=" "+l(r)),0!==o.length||E&&0!=r.length?n<0?w(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 l(e){return"["+Error.prototype.toString.call(e)+"]"}function f(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")),T(n,i)||(o="["+i+"]"),a||(e.seen.indexOf(u.value)<0?(a=g(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")),y(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 g(e){return null===e}function _(e){return"number"==typeof e}function m(e){return"string"==typeof e}function y(e){return void 0===e}function w(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(y(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=g,t.isNullOrUndefined=function(e){return null==e},t.isNumber=_,t.isString=m,t.isSymbol=function(e){return"symbol"==typeof e},t.isUndefined=y,t.isRegExp=w,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(78);var S=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function T(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 A="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(A&&e[A]){var t;if("function"!=typeof(t=e[A]))throw new TypeError('The "util.promisify.custom" argument must be of type Function');return Object.defineProperty(t,A,{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;s>>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){(function(t){const n=r(9),i=n.fs,s=n.untildify,o=t.from("1f8b08","hex"),a=o.length;e.exports=class{static async isGzipped(e){if(null==e)throw new Error(`The filePath path is ${e}`);e=s(e);const r=await i.open(e,"r"),n=t.allocUnsafe(3);await i.read(r,n,0,3,void 0),await i.close(r);let u=0,h=!0;if(a!==n.length)return!1;for(;ua)&&void 0===e.nsecs&&(g=0),g>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");a=p,u=g,i=f;var m=(1e4*(268435455&(p+=122192928e5))+g)%4294967296;c[h++]=m>>>24&255,c[h++]=m>>>16&255,c[h++]=m>>>8&255,c[h++]=255&m;var y=p/4294967296*1e4&268435455;c[h++]=y>>>8&255,c[h++]=255&y,c[h++]=y>>>24&15|16,c[h++]=y>>>16&255,c[h++]=f>>>8|128,c[h++]=255&f;for(var w=0;w<6;++w)c[h+w]=l[w];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(16),i=r(50),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(54),o=r(4),a=r(10),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 l=r.body.getReader();!function e(){l.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 f=h.rawHeaders["mime-type"];if(f){var d=f.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(17);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(32),{URL:i}=r(17),{canReplayProtocols:s,SPACE:o,HTTP1D1:a,H2Method:u}=r(28),{httpRequestPath:h}=r(57),{CRLF:c}=r(3),{stringifyHeaders:l}=r(33),f=`${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)===f?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+l(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)===f?e:e+c}return null!=this.responseHeaders&&(this._ensureProto(),this.statusText||(this.statusText=n[this.status]),e=`${this.protocol} ${this.status} ${this.statusText}${c}${l(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(46),i=r(58),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";const{WARCStreamTransform:n,AutoWARCParser:i,WARCGzParser:s,WARCParser:o}=r(61),{CRIExtraWARCGenerator:a,ElectronWARCWriter:u,PuppeteerCDPWARCGenerator:h,PuppeteerWARCGenerator:c,RemoteChromeWARCWriter:l,WARCWriterBase:f}=r(92),{CRIExtraCapturer:d,ElectronCapturer:p,PuppeteerCapturer:g,PuppeteerCDPCapturer:_,RemoteChromeCapturer:m,RequestHandler:y}=r(158);t.AutoWARCParser=i,t.CRIExtraCapturer=d,t.CRIExtraWARCGenerator=a,t.ElectronCapturer=p,t.ElectronWARCWriter=u,t.PuppeteerCDPCapturer=_,t.PuppeteerCDPWARCGenerator=h,t.PuppeteerCapturer=g,t.PuppeteerWARCGenerator=c,t.RemoteChromeCapturer=m,t.RemoteChromeWARCWriter=l,t.RequestHandler=y,t.WARCGzParser=s,t.WARCParser=o,t.WARCStreamTransform=n,t.WARCWriterBase=f,t.RequestLibWARCWriter=r(164),r(13)&&(t.recordIterator=r(14)),t.stream=r(25),t.zlib=r(18)},function(e,t,r){t.AutoWARCParser=r(62),t.GzipDetector=r(45),t.WARCGzParser=r(90),t.WARCParser=r(91),t.WARCStreamTransform=r(12),r(13)&&(t.recordIterator=r(14))},function(e,t,r){const n=r(9).getStream,i=r(18),s=r(22),o=r(12),a=r(45),u=r(13);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(14);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,l=0;l>16&255,a[u++]=t>>8&255,a[u++]=255&t;2===o&&(t=i[e.charCodeAt(l)]<<2|i[e.charCodeAt(l+1)]>>4,a[u++]=255&t);1===o&&(t=i[e.charCodeAt(l)]<<10|i[e.charCodeAt(l+1)]<<4|i[e.charCodeAt(l+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,l=r?i-1:0,f=r?-1:1,d=e[t+l];for(l+=f,s=d&(1<<-c)-1,d>>=-c,c+=a;c>0;s=256*s+e[t+l],l+=f,c-=8);for(o=s&(1<<-c)-1,s>>=-c,c+=n;c>0;o=256*o+e[t+l],l+=f,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,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:s-1,p=n?1:-1,g=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+l>=1?f/u:f*Math.pow(2,1-l))*u>=2&&(o++,u/=2),o+l>=c?(a=0,o=c):o+l>=1?(a=(t*u-1)*Math.pow(2,i),o+=l):(a=t*Math.pow(2,l-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*g}},function(e,t){},function(e,t,r){"use strict";var n=r(20).Buffer,i=r(67);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(69),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,l=e.document,f=Object.getPrototypeOf&&Object.getPrototypeOf(e);f=f&&f.setTimeout?f: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)}):l&&"onreadystatechange"in l.createElement("script")?(i=l.documentElement,n=function(e){var t=l.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,"*")}),f.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,l){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=l,this.strm.output=h,this.strm.next_out=c,this.flush=s,!r)return this._process(),this._checkError()?this._afterSync():void 0;var f=this;return n.nextTick(function(){f._process(),f._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"; + */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;u4?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,l=e.prev,f=e.strstart+B,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=l[t&c])>u&&0!=--i);return o<=e.lookahead?o:e.lookahead}function se(e){var t,r,n,s,u,h,c,l,f,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,l=e.strstart+e.lookahead,f=s,d=void 0,(d=h.avail_in)>f&&(d=f),r=0===d?0:(h.avail_in-=d,i.arraySet(c,h.input,h.next_in,d,l),1===h.state.wrap?h.adler=o(h.adler,c,d,l):2===h.state.wrap&&(h.adler=a(h.adler,c,d,l)),h.next_in+=d,h.total_in+=d,d),e.lookahead+=r,e.lookahead+e.insert>=j)for(u=e.strstart-e.insert,e.ins_h=e.window[u],e.ins_h=(e.ins_h<=j&&(e.ins_h=(e.ins_h<=j)if(n=s._tr_tally(e,e.strstart-e.match_start,e.match_length-j),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=j){e.match_length--;do{e.strstart++,e.ins_h=(e.ins_h<=j&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=j-1)),e.prev_length>=j&&e.match_length<=e.prev_length){i=e.strstart+e.lookahead-j,n=s._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-j),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>T||r!==S||n<8||n>15||t<0||t>9||o<0||o>x)return X(e,_);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===f?(te(e,!0),0===e.strm.avail_out?Y:V):(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 fe(e,t,S,A,C,E)},t.deflateInit2=fe,t.deflateReset=le,t.deflateResetKeep=ce,t.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?_:(e.state.gzhead=t,p):_},t.deflate=function(e,t){var r,i,o,u;if(!e||!e.state||t>d||t<0)return e?X(e,_):_;if(i=e.state,!e.output||!e.input&&0!==e.avail_in||i.status===Z&&t!==f)return X(e,0===e.avail_out?y:_);if(i.strm=e,r=i.last_flush,i.last_flush=t,i.status===D)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=W):(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,K),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|=U),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===W)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=z)}else i.status=z;if(i.status===z)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=M)}else i.status=M;if(i.status===M)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!==f)return X(e,y);if(i.status===Z&&0!==e.avail_in)return X(e,y);if(0!==e.avail_in||0!==i.lookahead||t!==h&&i.status!==Z){var w=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===f?(te(e,!0),0===e.strm.avail_out?Y:V):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<=B){if(se(e),e.lookahead<=B&&t===h)return $;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=j&&e.strstart>0&&(n=a[i=e.strstart-1])===a[++i]&&n===a[++i]&&n===a[++i]){o=e.strstart+B;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>=j?(r=s._tr_tally(e,1,e.match_length-j),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===f?(te(e,!0),0===e.strm.avail_out?Y:V):e.last_lit&&(te(e,!1),0===e.strm.avail_out)?$:G}(i,t):n[i.level].func(i,t);if(w!==Y&&w!==V||(i.status=Z),w===$||w===Y)return 0===e.avail_out&&(i.last_flush=-1),p;if(w===G&&(t===c?s._tr_align(i):t!==d&&(s._tr_stored_block(i,0,0,!1),t===l&&(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!==f?p:i.wrap<=0?g:(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:g)},t.deflateEnd=function(e){var t;return e&&e.state?(t=e.state.status)!==D&&t!==W&&t!==z&&t!==M&&t!==F&&t!==H&&t!==Z?X(e,_):(e.state=null,t===H?X(e,m):p):_},t.deflateSetDictionary=function(e,t){var r,n,s,a,u,h,c,l,f=t.length;if(!e||!e.state)return _;if(2===(a=(r=e.state).wrap)||1===a&&r.status!==D||r.lookahead)return _;for(1===a&&(e.adler=o(e.adler,t,f,0)),r.wrap=0,f>=r.w_size&&(0===a&&(Q(r.head),r.strstart=0,r.block_start=0,r.insert=0),l=new i.Buf8(r.w_size),i.arraySet(l,t,f-r.w_size,r.w_size,0),t=l,f=r.w_size),u=e.avail_in,h=e.next_in,c=e.input,e.avail_in=f,e.next_in=0,e.input=t,se(r);r.lookahead>=j;){n=r.strstart,s=r.lookahead-(j-1);do{r.ins_h=(r.ins_h<=0;)e[t]=0}var h=0,c=1,l=2,f=29,d=256,p=d+1+f,g=30,_=19,m=2*p+1,y=15,w=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],T=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],A=[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*g);u(O);var I=new Array(512);u(I);var L=new Array(256);u(L);var q=new Array(f);u(q);var P,j,B,N=new Array(g);function U(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 D(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function W(e){return e<256?I[e]:I[256+(e>>>7)]}function z(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function M(e,t,r){e.bi_valid>w-r?(e.bi_buf|=t<>w-e.bi_valid,e.bi_valid+=r-w):(e.bi_buf|=t<>>=1,r<<=1}while(--t>0);return r>>>1}function Z(e,t,r){var n,i,s=new Array(y+1),o=0;for(n=1;n<=y;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?z(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--)V(e,s,r);i=u;do{r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],V(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++,V(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,l=t.stat_desc.has_stree,f=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,g=0;for(s=0;s<=y;s++)e.bl_count[s]=0;for(u[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;rp&&(s=p,g++),u[2*n+1]=s,n>h||(e.bl_count[s]++,o=0,n>=d&&(o=f[n-d]),a=u[2*n],e.opt_len+=a*(s+o),l&&(e.static_len+=a*(c[2*n+1]+o)));if(0!==g){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]--,g-=2}while(g>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;n0?(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*A[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?(M(e,(c<<1)+(n?1:0),3),K(e,C,O)):(M(e,(l<<1)+(n?1:0),3),function(e,t,r,n){var i;for(M(e,t-257,5),M(e,r-1,5),M(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*W(t)]++),e.last_lit===e.lit_bufsize-1},t._tr_align=function(e){M(e,c<<1,3),F(e,v,C),function(e){16===e.bi_valid?(z(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={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";var n=r(21),i=r(43),s=r(44),o=r(84),a=r(85),u=0,h=1,c=2,l=4,f=5,d=6,p=0,g=1,_=2,m=-2,y=-3,w=-4,b=-5,v=8,R=1,x=2,E=3,k=4,S=5,T=6,A=7,C=8,O=9,I=10,L=11,q=12,P=13,j=14,B=15,N=16,U=17,D=18,W=19,z=20,M=21,F=22,H=23,Z=24,$=25,G=26,Y=27,V=28,K=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,le=!0;function fe(e){if(le){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}),le=!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,Te,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&&(Te[0]=255&ae,Te[1]=ae>>>8&255,r.check=s(r.check,Te,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,Te[2]=ae>>>16&255,Te[3]=ae>>>24&255,r.check=s(r.check,Te,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&&(Te[0]=255&ae,Te[1]=ae>>>8&255,r.check=s(r.check,Te,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,Te,2,0)),ae=0,ue=0}else r.head&&(r.head.extra=null);r.mode=T;case T:if(1024&r.flags&&((le=r.length)>se&&(le=se),le&&(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,le,Re)),512&r.flags&&(r.check=s(r.check,ee,le,re)),se-=le,re+=le,r.length-=le),r.length))break e;r.length=0,r.mode=A;case A:if(2048&r.flags){if(0===se)break e;le=0;do{Re=ee[re+le++],r.head&&Re&&r.length<65536&&(r.head.name+=String.fromCharCode(Re))}while(Re&&le>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=j;break;case 1:if(fe(r),r.mode=z,t===d){ae>>>=2,ue-=2;break e}break;case 2:r.mode=U;break;case 3:e.msg="invalid block type",r.mode=X}ae>>>=2,ue-=2;break;case j: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=B,t===d)break e;case B:r.mode=N;case N:if(le=r.length){if(le>se&&(le=se),le>oe&&(le=oe),0===le)break e;n.arraySet(te,ee,re,le,ie),se-=le,re+=le,oe-=le,ie+=le,r.length-=le;break}r.mode=q;break;case U: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=D;case D:for(;r.have>>=3,ue-=3}for(;r.have<19;)r.lens[Ae[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=W;case W:for(;r.have>>16&255,ye=65535&Se,!((_e=Se>>>24)<=ue);){if(0===se)break e;se--,ae+=ee[re++]<>>=_e,ue-=_e,r.lens[r.have++]=ye;else{if(16===ye){for(ke=_e+2;ue>>=_e,ue-=_e,0===r.have){e.msg="invalid bit length repeat",r.mode=X;break}Re=r.lens[r.have-1],le=3+(3&ae),ae>>>=2,ue-=2}else if(17===ye){for(ke=_e+3;ue>>=_e)),ae>>>=3,ue-=3}else{for(ke=_e+7;ue>>=_e)),ae>>>=7,ue-=7}if(r.have+le>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=X;break}for(;le--;)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=z,t===d)break e;case z:r.mode=M;case M: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,ye=65535&Se,!((_e=Se>>>24)<=ue);){if(0===se)break e;se--,ae+=ee[re++]<>we)])>>>16&255,ye=65535&Se,!(we+(_e=Se>>>24)<=ue);){if(0===se)break e;se--,ae+=ee[re++]<>>=we,ue-=we,r.back+=we}if(ae>>>=_e,ue-=_e,r.back+=_e,r.length=ye,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,ye=65535&Se,!((_e=Se>>>24)<=ue);){if(0===se)break e;se--,ae+=ee[re++]<>we)])>>>16&255,ye=65535&Se,!(we+(_e=Se>>>24)<=ue);){if(0===se)break e;se--,ae+=ee[re++]<>>=we,ue-=we,r.back+=we}if(ae>>>=_e,ue-=_e,r.back+=_e,64&me){e.msg="invalid distance code",r.mode=X;break}r.offset=ye,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(le=ce-oe,r.offset>le){if((le=r.offset-le)>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=X;break}le>r.wnext?(le-=r.wnext,pe=r.wsize-le):pe=r.wnext-le,le>r.length&&(le=r.length),ge=r.window}else ge=te,pe=ie-r.offset,le=r.length;le>oe&&(le=oe),oe-=le,r.length-=le;do{te[ie++]=ge[pe++]}while(--le);0===r.length&&(r.mode=M);break;case G:if(0===oe)break e;te[ie++]=r.length,oe--,r.mode=M;break;case Y:if(r.wrap){for(;ue<32;){if(0===se)break e;se--,ae|=ee[re++]<>>=b=w>>>24,p-=b,0===(b=w>>>16&255))S[s++]=65535&w;else{if(!(16&b)){if(0==(64&b)){w=g[(65535&w)+(d&(1<>>=b,p-=b),p<15&&(d+=k[n++]<>>=b=w>>>24,p-=b,!(16&(b=w>>>16&255))){if(0==(64&b)){w=_[(65535&w)+(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=f,0===l){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===j[S];S--);if(T>S&&(T=S),0===S)return h[c++]=20971520,h[c++]=20971520,f.bits=1,0;for(k=1;k0&&(0===e||1!==S))return-1;for(B[1]=0,x=1;x<15;x++)B[x+1]=B[x]+j[x];for(E=0;E852||2===e&&I>592)return 1;for(;;){w=x-C,l[E]y?(b=N[U+l[E]],v=q[P+l[E]]):(b=96,v=0),d=1<>C)+(p-=d)]=w<<24|b<<16|v|0}while(0!==p);for(d=1<>=1;if(0!==d?(L&=d-1,L+=d):L=0,E++,0==--j[x]){if(x===S)break;x=t[r+l[E]]}if(x>T&&(L&_)!==g){for(0===C&&(C=T),m+=k,O=1<<(A=x-C);A+C852||2===e&&I>592)return 1;h[g=L&_]=T<<24|A<<16|m-c|0}}return 0!==L&&(h[m+L]=x-C<<24|64<<16|0),f.bits=T,0}},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,r){"use strict";const n=r(88),{crlf:i,begin:s}=r(29),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(9).getStream,i=r(22),s=r(12),o=r(13);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(14);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(93),t.RemoteChromeWARCWriter=r(125),t.PuppeteerCDPWARCGenerator=r(126),t.PuppeteerWARCGenerator=r(127),t.WARCWriterBase=r(7),t.CRIExtraWARCGenerator=r(157)},function(e,t,r){(function(t){const n=r(7),{CRLF:i}=r(3),{noGZ:s,replaceContentLen:o}=r(8),{getPostData:a,getResBody:u}=r(99);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(100);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(101),i=r(104),s=r(116),o=r(52),a=r(118),u=r(119),h=r(47),c=r(121),l="[object Map]",f="[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==l||t==f)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(47),i=r(102),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(103)(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(105),i=r(112),s=r(113),o=r(114),a=r(115),u=r(16),h=r(51),c=h(n),l=h(i),f=h(s),d=h(o),p=h(a),g=u;(n&&"[object DataView]"!=g(new n(new ArrayBuffer(1)))||i&&"[object Map]"!=g(new i)||s&&"[object Promise]"!=g(s.resolve())||o&&"[object Set]"!=g(new o)||a&&"[object WeakMap]"!=g(new a))&&(g=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 l:return"[object Map]";case f:return"[object Promise]";case d:return"[object Set]";case p:return"[object WeakMap]"}return t}),e.exports=g},function(e,t,r){var n=r(15)(r(5),"DataView");e.exports=n},function(e,t,r){var n=r(48),i=r(109),s=r(50),o=r(51),a=/^\[object .+?Constructor\]$/,u=Function.prototype,h=Object.prototype,c=u.toString,l=h.hasOwnProperty,f=RegExp("^"+c.call(l).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=function(e){return!(!s(e)||i(e))&&(n(e)?f:a).test(o(e))}},function(e,t,r){var n=r(30),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(110),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(5)["__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(15)(r(5),"Map");e.exports=n},function(e,t,r){var n=r(15)(r(5),"Promise");e.exports=n},function(e,t,r){var n=r(15)(r(5),"Set");e.exports=n},function(e,t,r){var n=r(15)(r(5),"WeakMap");e.exports=n},function(e,t,r){var n=r(117),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(16),i=r(23),s="[object Arguments]";e.exports=function(e){return i(e)&&n(e)==s}},function(e,t,r){var n=r(48),i=r(53);e.exports=function(e){return null!=e&&i(e.length)&&!n(e)}},function(e,t,r){(function(e){var n=r(5),i=r(120),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(31)(e))},function(e,t){e.exports=function(){return!1}},function(e,t,r){var n=r(122),i=r(123),s=r(124),o=s&&s.isTypedArray,a=o?i(o):n;e.exports=a},function(e,t,r){var n=r(16),i=r(53),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(49),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(31)(e))},function(e,t,r){(function(t){const n=r(7),{CRLF:i}=r(3),{noGZ:s,replaceContentLen:o}=r(8);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(7),{CRLF:i}=r(3),{noGZ:s,replaceContentLen:o}=r(8);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(17),{STATUS_CODES:i}=r(32),{CRLF:s}=r(3),o=r(7),{stringifyHeaders:a,stringifyRequestHeaders:u}=r(33),{httpRequestPath:h}=r(57),{noGZ:c,replaceContentLen:l}=r(8);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(l,`Content-Length: 0${s}`):(u=u.replace(c,"")).replace(l,`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,l=26,f=38,d=700,p=72,g=128,_="-",m=/^xn--/,y=/[^\x20-\x7E]/,w=/[\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(w,".")).split("."),t).join(".")}function T(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*l>>1;n+=h)e=R(e/v);return R(n+(v+1)*e/(e+f))}function I(e){var t,r,n,i,s,o,a,f,d,m,y,w=[],b=e.length,v=0,x=g,k=p;for((r=e.lastIndexOf(_))<0&&(r=0),n=0;n=128&&E("not-basic"),w.push(e.charCodeAt(n));for(i=r>0?r+1:0;i=b&&E("invalid-input"),((f=(y=e.charCodeAt(i++))-48<10?y-22:y-65<26?y-65:y-97<26?y-97:h)>=h||f>R((u-v)/o))&&E("overflow"),v+=f*o,!(f<(d=a<=k?c:a>=k+l?l:a-k));a+=h)o>R(u/(m=h-d))&&E("overflow"),o*=m;k=O(v-s,t=w.length+1,0==s),R(v/t)>u-x&&E("overflow"),x+=R(v/t),v%=t,w.splice(v++,0,x)}return A(w)}function L(e){var t,r,n,i,s,o,a,f,d,m,y,w,b,v,k,S=[];for(w=(e=T(e)).length,t=g,r=0,s=p,o=0;o=t&&yR((u-r)/(b=n+1))&&E("overflow"),r+=(a-t)*b,t=a,o=0;ou&&E("overflow"),y==t){for(f=r,d=h;!(f<(m=d<=s?c:d>=s+l?l:d-s));d+=h)k=f-m,v=h-m,S.push(x(C(m+k%v,0))),f=R(k/v);S.push(x(C(f,0))),s=O(r,b,n==i),r=0,++n}++r,++t}return S.join("")}a={version:"1.4.1",ucs2:{decode:T,encode:A},decode:I,encode:L,toASCII:function(e){return S(e,function(e){return y.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(31)(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(131),t.encode=t.stringify=r(132)},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?(l=g.substr(0,_),f=g.substr(_+1)):(l=g,f=""),d=decodeURIComponent(l),p=decodeURIComponent(f),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(58),t.CRIExtraCapturer=r(159),t.CapturedRequest=r(59),t.ElectronCapturer=r(160),t.PuppeteerCDPCapturer=r(161),t.PuppeteerCapturer=r(162),t.RemoteChromeCapturer=r(163),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(7),{STATUS_CODES:i}=r(32),{URL:s}=r(17),{CRLF:o}=r(3),{stringifyHeaders:a,stringifyRequestHeaders:u}=r(33),{noGZ:h,replaceContentLen:c}=r(8);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)}`,l=e.body;s=l?(s=s.replace(h,"")).replace(c,`Content-Length: ${t.byteLength(l,"utf8")}${o}`):s.replace(c,`Content-Length: 0${o}`),await this.writeResponseRecord(this._UP.href,s,l)}}}).call(this,r(0).Buffer)}])); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3dyaXRlcnMvd2FyY0ZpZWxkcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19yb290LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiwid2VicGFjazovLy8uL2xpYi93cml0ZXJzL3dhcmNXcml0ZXJCYXNlLmpzIiwid2VicGFjazovLy8uL2xpYi93cml0ZXJzL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8vLi9saWIvdXRpbHMvZ2V0U3RyZWFtLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUtYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS11dGlsLWlzL2xpYi91dGlsLmpzIiwid2VicGFjazovLy8uL2xpYi9wYXJzZXJzL3dhcmNTdHJlYW1UcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3BhcnNlcnMvX2NhblVzZVJlY29yZEl0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL2xpYi9wYXJzZXJzL3JlY29yZHRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TmF0aXZlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3VybC91cmwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktemxpYi9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MtbmV4dGljay1hcmdzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvY29tbW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ldmVudGVtaXR0ZXIzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3RMaWtlLmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL3JlcXVlc3RIYW5kbGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIiwid2VicGFjazovLy8uL2xpYi91dGlscy9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3dhcmNSZWNvcmQvZmllbGRJZGVudGlmaWVycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3V0aWxzL2hlYWRlclNlcmlhbGl6ZXJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbS1icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1saWJzLWJyb3dzZXIvbm9kZV9tb2R1bGVzL3N0cmluZ19kZWNvZGVyL2xpYi9zdHJpbmdfZGVjb2Rlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXNzZXJ0L2Fzc2VydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2FkbGVyMzIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3BhcnNlcnMvZ3ppcERldGVjdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL3YxLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzUHJvdG90eXBlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19mcmVlR2xvYmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9Tb3VyY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNMZW5ndGguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9jYXBhYmlsaXR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9saWIvcmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzVW5pY29kZS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvdXRpbHMvdXJsLWhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3JlcXVlc3RDYXB0dXJlcnMvY2RwUmVxdWVzdEluZm8uanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3JlcXVlc3RDYXB0dXJlcnMvY2FwdHVyZWRSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2luZGV4LmpzIiwid2VicGFjazovLy8uL2xpYi9wYXJzZXJzL2luZGV4LmpzIiwid2VicGFjazovLy8uL2xpYi9wYXJzZXJzL2F1dG9XQVJDUGFyc2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9CdWZmZXJMaXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zZXRpbW1lZGlhdGUvc2V0SW1tZWRpYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dGlsLWRlcHJlY2F0ZS9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS93cml0YWJsZS1icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vZHVwbGV4LWJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS16bGliL2xpYi9iaW5kaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9vYmplY3QtYXNzaWduL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3pzdHJlYW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZGVmbGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi90cmVlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9tZXNzYWdlcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZsYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmZhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mdHJlZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY29uc3RhbnRzLmpzIiwid2VicGFjazovLy8uL2xpYi93YXJjUmVjb3JkL2J1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3dhcmNSZWNvcmQvcmVjb3JkLmpzIiwid2VicGFjazovLy8uL2xpYi93YXJjUmVjb3JkL3dhcmNDb250ZW50UGFyc2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcGFyc2Vycy93YXJjR3pQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3BhcnNlcnMvd2FyY1BhcnNlci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvd3JpdGVycy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvd3JpdGVycy9lbGVjdHJvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGF0aC1icm93c2VyaWZ5L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2xpYi9ybmctYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdXVpZC9saWIvYnl0ZXNUb1V1aWQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3V0aWxzL2Vuc3VyZVdBUkNGaWxlbmFtZS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvdXRpbHMvZWxlY3Ryb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0VtcHR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRUYWcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fRGF0YVZpZXcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmF0aXZlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFJhd1RhZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc01hc2tlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3JlSnNEYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFZhbHVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19Qcm9taXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1NldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19XZWFrTWFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzQXJndW1lbnRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0J1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJGYWxzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNUeXBlZEFycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VVbmFyeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19ub2RlVXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvd3JpdGVycy9yZW1vdGVDaHJvbWUuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3dyaXRlcnMvcHVwcGV0ZWVyQ0RQLmpzIiwid2VicGFjazovLy8uL2xpYi93cml0ZXJzL3B1cHBldGVlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3VybC91dGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9kZWNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9lbmNvZGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9yZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90by1hcnJheWJ1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMveHRlbmQvaW1tdXRhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9idWlsdGluLXN0YXR1cy1jb2Rlcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvc3RhcnRDYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUNvbXBvdW5kZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlSZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9kZWJ1cnIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZGVidXJyTGV0dGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQcm9wZXJ0eU9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheU1hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU3ltYm9sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvd29yZHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNjaWlXb3Jkcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNVbmljb2RlV29yZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL191bmljb2RlV29yZHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC91cHBlckZpcnN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUNhc2VGaXJzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYXN0U2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNsaWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmluZ1RvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNjaWlUb0FycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3VuaWNvZGVUb0FycmF5LmpzIiwid2VicGFjazovLy8uL2xpYi93cml0ZXJzL2NyaUV4dHJhLmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL2luZGV4LmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL2NyaUV4dHJhLmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL2VsZWN0cm9uLmpzIiwid2VicGFjazovLy8uL2xpYi9yZXF1ZXN0Q2FwdHVyZXJzL3B1cHBldGVlckNEUC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcmVxdWVzdENhcHR1cmVycy9wdXBwZXRlZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3JlcXVlc3RDYXB0dXJlcnMvcmVtb3RlQ2hyb21lLmpzIiwid2VicGFjazovLy8uL2xpYi93cml0ZXJzL3JlcXVlc3RMaWIuanMiXSwibmFtZXMiOlsiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImV4cG9ydHMiLCJtb2R1bGUiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJnbG9iYWwiLCJiYXNlNjQiLCJpZWVlNzU0IiwiaXNBcnJheSIsImtNYXhMZW5ndGgiLCJCdWZmZXIiLCJUWVBFRF9BUlJBWV9TVVBQT1JUIiwiY3JlYXRlQnVmZmVyIiwidGhhdCIsImxlbmd0aCIsIlJhbmdlRXJyb3IiLCJVaW50OEFycmF5IiwiX19wcm90b19fIiwiYXJnIiwiZW5jb2RpbmdPck9mZnNldCIsInRoaXMiLCJFcnJvciIsImFsbG9jVW5zYWZlIiwiZnJvbSIsIlR5cGVFcnJvciIsIkFycmF5QnVmZmVyIiwiYXJyYXkiLCJieXRlT2Zmc2V0IiwiYnl0ZUxlbmd0aCIsInVuZGVmaW5lZCIsImZyb21BcnJheUxpa2UiLCJmcm9tQXJyYXlCdWZmZXIiLCJzdHJpbmciLCJlbmNvZGluZyIsImlzRW5jb2RpbmciLCJhY3R1YWwiLCJ3cml0ZSIsInNsaWNlIiwiZnJvbVN0cmluZyIsIm9iaiIsImlzQnVmZmVyIiwibGVuIiwiY2hlY2tlZCIsImNvcHkiLCJidWZmZXIiLCJ2YWwiLCJ0eXBlIiwiZGF0YSIsImZyb21PYmplY3QiLCJhc3NlcnRTaXplIiwic2l6ZSIsInRvU3RyaW5nIiwiaXNWaWV3IiwibG93ZXJlZENhc2UiLCJ1dGY4VG9CeXRlcyIsImJhc2U2NFRvQnl0ZXMiLCJ0b0xvd2VyQ2FzZSIsInN3YXAiLCJiIiwiYmlkaXJlY3Rpb25hbEluZGV4T2YiLCJkaXIiLCJpc05hTiIsImFycmF5SW5kZXhPZiIsImluZGV4T2YiLCJsYXN0SW5kZXhPZiIsImFyciIsImluZGV4U2l6ZSIsImFyckxlbmd0aCIsInZhbExlbmd0aCIsIlN0cmluZyIsInJlYWQiLCJidWYiLCJyZWFkVUludDE2QkUiLCJmb3VuZEluZGV4IiwiZm91bmQiLCJqIiwiaGV4V3JpdGUiLCJvZmZzZXQiLCJOdW1iZXIiLCJyZW1haW5pbmciLCJzdHJMZW4iLCJwYXJzZWQiLCJwYXJzZUludCIsInN1YnN0ciIsInV0ZjhXcml0ZSIsImJsaXRCdWZmZXIiLCJhc2NpaVdyaXRlIiwic3RyIiwiYnl0ZUFycmF5IiwicHVzaCIsImNoYXJDb2RlQXQiLCJhc2NpaVRvQnl0ZXMiLCJsYXRpbjFXcml0ZSIsImJhc2U2NFdyaXRlIiwidWNzMldyaXRlIiwidW5pdHMiLCJoaSIsImxvIiwidXRmMTZsZVRvQnl0ZXMiLCJiYXNlNjRTbGljZSIsInN0YXJ0IiwiZW5kIiwiZnJvbUJ5dGVBcnJheSIsInV0ZjhTbGljZSIsIk1hdGgiLCJtaW4iLCJyZXMiLCJzZWNvbmRCeXRlIiwidGhpcmRCeXRlIiwiZm91cnRoQnl0ZSIsInRlbXBDb2RlUG9pbnQiLCJmaXJzdEJ5dGUiLCJjb2RlUG9pbnQiLCJieXRlc1BlclNlcXVlbmNlIiwiY29kZVBvaW50cyIsIk1BWF9BUkdVTUVOVFNfTEVOR1RIIiwiZnJvbUNoYXJDb2RlIiwiYXBwbHkiLCJkZWNvZGVDb2RlUG9pbnRzQXJyYXkiLCJTbG93QnVmZmVyIiwiYWxsb2MiLCJJTlNQRUNUX01BWF9CWVRFUyIsImZvbyIsInN1YmFycmF5IiwiZSIsInR5cGVkQXJyYXlTdXBwb3J0IiwicG9vbFNpemUiLCJfYXVnbWVudCIsInNwZWNpZXMiLCJjb25maWd1cmFibGUiLCJmaWxsIiwiYWxsb2NVbnNhZmVTbG93IiwiX2lzQnVmZmVyIiwiY29tcGFyZSIsImEiLCJ4IiwieSIsImNvbmNhdCIsImxpc3QiLCJwb3MiLCJzd2FwMTYiLCJzd2FwMzIiLCJzd2FwNjQiLCJhcmd1bWVudHMiLCJoZXhTbGljZSIsImFzY2lpU2xpY2UiLCJsYXRpbjFTbGljZSIsInV0ZjE2bGVTbGljZSIsImVxdWFscyIsImluc3BlY3QiLCJtYXgiLCJtYXRjaCIsImpvaW4iLCJ0YXJnZXQiLCJ0aGlzU3RhcnQiLCJ0aGlzRW5kIiwidGhpc0NvcHkiLCJ0YXJnZXRDb3B5IiwiaW5jbHVkZXMiLCJpc0Zpbml0ZSIsInRvSlNPTiIsIkFycmF5IiwiX2FyciIsInJldCIsIm91dCIsInRvSGV4IiwiYnl0ZXMiLCJjaGVja09mZnNldCIsImV4dCIsImNoZWNrSW50Iiwib2JqZWN0V3JpdGVVSW50MTYiLCJsaXR0bGVFbmRpYW4iLCJvYmplY3RXcml0ZVVJbnQzMiIsImNoZWNrSUVFRTc1NCIsIndyaXRlRmxvYXQiLCJub0Fzc2VydCIsIndyaXRlRG91YmxlIiwibmV3QnVmIiwic2xpY2VMZW4iLCJyZWFkVUludExFIiwibXVsIiwicmVhZFVJbnRCRSIsInJlYWRVSW50OCIsInJlYWRVSW50MTZMRSIsInJlYWRVSW50MzJMRSIsInJlYWRVSW50MzJCRSIsInJlYWRJbnRMRSIsInBvdyIsInJlYWRJbnRCRSIsInJlYWRJbnQ4IiwicmVhZEludDE2TEUiLCJyZWFkSW50MTZCRSIsInJlYWRJbnQzMkxFIiwicmVhZEludDMyQkUiLCJyZWFkRmxvYXRMRSIsInJlYWRGbG9hdEJFIiwicmVhZERvdWJsZUxFIiwicmVhZERvdWJsZUJFIiwid3JpdGVVSW50TEUiLCJ3cml0ZVVJbnRCRSIsIndyaXRlVUludDgiLCJmbG9vciIsIndyaXRlVUludDE2TEUiLCJ3cml0ZVVJbnQxNkJFIiwid3JpdGVVSW50MzJMRSIsIndyaXRlVUludDMyQkUiLCJ3cml0ZUludExFIiwibGltaXQiLCJzdWIiLCJ3cml0ZUludEJFIiwid3JpdGVJbnQ4Iiwid3JpdGVJbnQxNkxFIiwid3JpdGVJbnQxNkJFIiwid3JpdGVJbnQzMkxFIiwid3JpdGVJbnQzMkJFIiwid3JpdGVGbG9hdExFIiwid3JpdGVGbG9hdEJFIiwid3JpdGVEb3VibGVMRSIsIndyaXRlRG91YmxlQkUiLCJ0YXJnZXRTdGFydCIsInNldCIsImNvZGUiLCJJTlZBTElEX0JBU0U2NF9SRSIsIkluZmluaXR5IiwibGVhZFN1cnJvZ2F0ZSIsInRvQnl0ZUFycmF5IiwidHJpbSIsInJlcGxhY2UiLCJzdHJpbmd0cmltIiwiYmFzZTY0Y2xlYW4iLCJzcmMiLCJkc3QiLCJnIiwiRnVuY3Rpb24iLCJ3aW5kb3ciLCJjYWNoZWRTZXRUaW1lb3V0IiwiY2FjaGVkQ2xlYXJUaW1lb3V0IiwicHJvY2VzcyIsImRlZmF1bHRTZXRUaW1vdXQiLCJkZWZhdWx0Q2xlYXJUaW1lb3V0IiwicnVuVGltZW91dCIsImZ1biIsInNldFRpbWVvdXQiLCJjbGVhclRpbWVvdXQiLCJjdXJyZW50UXVldWUiLCJxdWV1ZSIsImRyYWluaW5nIiwicXVldWVJbmRleCIsImNsZWFuVXBOZXh0VGljayIsImRyYWluUXVldWUiLCJ0aW1lb3V0IiwicnVuIiwibWFya2VyIiwicnVuQ2xlYXJUaW1lb3V0IiwiSXRlbSIsIm5vb3AiLCJuZXh0VGljayIsImFyZ3MiLCJ0aXRsZSIsImJyb3dzZXIiLCJlbnYiLCJhcmd2IiwidmVyc2lvbiIsInZlcnNpb25zIiwib24iLCJhZGRMaXN0ZW5lciIsIm9uY2UiLCJvZmYiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImVtaXQiLCJwcmVwZW5kTGlzdGVuZXIiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwibGlzdGVuZXJzIiwiYmluZGluZyIsImN3ZCIsImNoZGlyIiwidW1hc2siLCJDUkxGIiwiV0FSQ1YiLCJXQVJDU2xhc2hWIiwiV0FSQ1R5cGVzIiwid2FyY2luZm8iLCJtZXRhZGF0YSIsInJlcXVlc3QiLCJyZXNwb25zZSIsInJldmlzaXQiLCJyZXNvdXJjZSIsImNvbnZlcnNpb24iLCJ1bmtub3duIiwiY29udGludWF0aW9uIiwiV0FSQ0NvbnRlbnRUeXBlcyIsIndhcmNGaWVsZHMiLCJodHRwUmVxdWVzdCIsImh0dHBSZXNwb25zZSIsInJlY29yZElkIiwidXVpZCIsIndhcmNEYXRlIiwiZGF0ZSIsIndhcmNUeXBlIiwid2FyY0NvbnRlbnRMZW5ndGgiLCJjb250ZW50TGVuIiwid2FyY0NvbmN1cnJlbnRUbyIsImNvbmN1cnJlbnRUbyIsIndhcmNXYXJjSW5mb0lkIiwid2lkIiwicmVxdWlyZWRIZWFkZXJGaWVsZHMiLCJyaWQiLCJ0YXJnZXRVUkkiLCJ3YXJjVGFyZ2V0VVJJIiwid2FyY0luZm9IZWFkZXIiLCJpbmZvSGVhZGVyIiwicmVxdWlyZWQiLCJmaWxlTmFtZSIsIndhcmNJbmZvQ29udGVudCIsImluZm9Db250ZW50IiwiYmFzZSIsIndhcmNSZXF1ZXN0SGVhZGVyIiwibm93Iiwid2FyY1Jlc3BvbnNlSGVhZGVyIiwid2FyY01ldGFkYXRhSGVhZGVyIiwicmVjb3JkU2VwYXJhdG9yIiwiQ1JMRjJ4IiwiY3RvciIsInN1cGVyQ3RvciIsInN1cGVyXyIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJUZW1wQ3RvciIsImZyZWVHbG9iYWwiLCJmcmVlU2VsZiIsInNlbGYiLCJyb290IiwicG5hIiwib2JqZWN0S2V5cyIsImtleXMiLCJEdXBsZXgiLCJ1dGlsIiwiaW5oZXJpdHMiLCJSZWFkYWJsZSIsIldyaXRhYmxlIiwidiIsIm1ldGhvZCIsIm9wdGlvbnMiLCJyZWFkYWJsZSIsImFsbG93SGFsZk9wZW4iLCJvbmVuZCIsIl93cml0YWJsZVN0YXRlIiwiZW5kZWQiLCJvbkVuZE5UIiwiaGlnaFdhdGVyTWFyayIsIl9yZWFkYWJsZVN0YXRlIiwiZGVzdHJveWVkIiwiX2Rlc3Ryb3kiLCJlcnIiLCJjYiIsImZzIiwiemxpYiIsIlBhdGgiLCJFdmVudEVtaXR0ZXIiLCJlbnN1cmVXQVJDRmlsZU5hbWUiLCJyZWNvcmRTZXBhcmF0b3JCdWZmZXIiLCJDUkxGQnVmZmVyIiwiV0FSQ1NlcFRTaXplIiwibWFrZUNvbnRlbnRCdWZmZXIiLCJtYXliZUJ1ZmZlciIsInN0ckJ1ZmYiLCJlbmRzV2l0aCIsImNudEJ1ZmZlciIsImVuc3VyZU9wdGlvbnMiLCJvcHRzIiwiYXBwZW5kaW5nIiwiZ3ppcCIsIk5PREVXQVJDX1dSSVRFX0daSVBQRUQiLCJbb2JqZWN0IE9iamVjdF0iLCJkZWZhdWx0T3B0cyIsInN1cGVyIiwiX3dhcmNPdXRTdHJlYW0iLCJfbGFzdEVycm9yIiwiX25vdyIsIl9maWxlTmFtZSIsIl93YXJjSW5mb0lkIiwiX3ZlcnNpb24iLCJfb25GaW5pc2giLCJfb25FcnJvciIsIndhcmNQYXRoIiwiYXNzaWduIiwid2ZwIiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJmbGFncyIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsImJhc2VuYW1lIiwicmVxRGF0YSIsInJlc0RhdGEiLCJyZXNSZWNJZCIsIl93cml0ZVJlcXVlc3RSZWNvcmQiLCJoZWFkZXJzIiwiX3dyaXRlUmVzcG9uc2VSZWNvcmQiLCJyZWNvcmRQYXJ0cyIsImNodW5rIiwid3JpdGVSZWNvcmRCbG9jayIsIndpbmZvIiwid3JpdGVXYXJjUmF3SW5mb1JlY29yZCIsInNvZnR3YXJlIiwicmVjSUQiLCJ3aGN0Iiwid2giLCJ0b3RhbExlbmd0aCIsInBhZ2VzIiwid2luZm9Db250ZW50IiwianNvbi1tZXRhZGF0YSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkZXNjIiwiYXV0b190aXRsZSIsIm1hcCIsInBhZ2UiLCJ0aW1lc3RhbXAiLCJ1cmwiLCJvdXRsaW5rcyIsIndyaXRlV2FyY01ldGFkYXRhIiwibWV0YURhdGEiLCJ3bWhjIiwid21oIiwiaHR0cEhlYWRlclN0cmluZyIsInJlcXVlc3REYXRhIiwicmVzcG9uc2VEYXRhIiwicmVjb3JkQnVmZmVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJnemlwU3luYyIsInJlc0lkIiwicmVxSGVhZENvbnRlbnRCdWZmZXIiLCJyZXFXSGVhZGVyIiwicmVzSGVhZGVyQ29udGVudEJ1ZmZlciIsInJlc3BXSGVhZGVyIiwibGUiLCJkZXN0cm95Iiwibm9HWiIsInJlcGxhY2VDb250ZW50TGVuIiwidW50aWxkaWZ5IiwiaGFzRlMiLCJnZXRTdHJlYW0iLCJ3cCIsInVzZVVudGlsZGlmeSIsImNyZWF0ZVJlYWRTdHJlYW0iLCJTdHJlYW0iLCJUcmFuc2Zvcm0iLCJQYXNzVGhyb3VnaCIsIm9iamVjdFRvU3RyaW5nIiwiaXNCb29sZWFuIiwiaXNOdWxsIiwiaXNOdWxsT3JVbmRlZmluZWQiLCJpc051bWJlciIsImlzU3RyaW5nIiwiaXNTeW1ib2wiLCJpc1VuZGVmaW5lZCIsImlzUmVnRXhwIiwicmUiLCJpc09iamVjdCIsImlzRGF0ZSIsImlzRXJyb3IiLCJpc0Z1bmN0aW9uIiwiaXNQcmltaXRpdmUiLCJSZWNvcmRCdWlsZGVyIiwiY3JsZiIsInJlYWRhYmxlT2JqZWN0TW9kZSIsImJ1ZmZlcmVkIiwiYnVpbGRlciIsInNlcExlbiIsImRvbmUiLCJwdXNoTGFzdCIsImlkeCIsIm1heWJlUmVjb3JkIiwibGFzdE1hdGNoIiwiY2h1bmtMZW4iLCJjb25zdW1lTGluZSIsImJ1aWxkUmVjb3JkIiwiZW5jIiwiX2NvbnN1bWVDaHVuayIsImFzeW5jR2VuRm5zIiwiZXJyb3IiLCJhc3luY0l0ZXJhdG9yIiwiV0FSQ1N0cmVhbVRyYW5zZm9ybSIsImFzeW5jIiwid2FyY1N0cmVhbSIsInJlY29yZEl0ZXJhdG9yIiwicGlwZSIsIm5leHRSZWNvcmQiLCJuZXh0IiwiYmFzZUlzTmF0aXZlIiwiZ2V0VmFsdWUiLCJnZXRSYXdUYWciLCJudWxsVGFnIiwidW5kZWZpbmVkVGFnIiwic3ltVG9TdHJpbmdUYWciLCJwdW55Y29kZSIsIlVybCIsInByb3RvY29sIiwic2xhc2hlcyIsImF1dGgiLCJob3N0IiwicG9ydCIsImhvc3RuYW1lIiwiaGFzaCIsInNlYXJjaCIsInF1ZXJ5IiwicGF0aG5hbWUiLCJwYXRoIiwiaHJlZiIsInBhcnNlIiwidXJsUGFyc2UiLCJzb3VyY2UiLCJyZWxhdGl2ZSIsInJlc29sdmVPYmplY3QiLCJmb3JtYXQiLCJwcm90b2NvbFBhdHRlcm4iLCJwb3J0UGF0dGVybiIsInNpbXBsZVBhdGhQYXR0ZXJuIiwidW53aXNlIiwiYXV0b0VzY2FwZSIsIm5vbkhvc3RDaGFycyIsImhvc3RFbmRpbmdDaGFycyIsImhvc3RuYW1lUGFydFBhdHRlcm4iLCJob3N0bmFtZVBhcnRTdGFydCIsInVuc2FmZVByb3RvY29sIiwiamF2YXNjcmlwdCIsImphdmFzY3JpcHQ6IiwiaG9zdGxlc3NQcm90b2NvbCIsInNsYXNoZWRQcm90b2NvbCIsImh0dHAiLCJodHRwcyIsImZ0cCIsImdvcGhlciIsImZpbGUiLCJodHRwOiIsImh0dHBzOiIsImZ0cDoiLCJnb3BoZXI6IiwiZmlsZToiLCJxdWVyeXN0cmluZyIsInBhcnNlUXVlcnlTdHJpbmciLCJzbGFzaGVzRGVub3RlSG9zdCIsInUiLCJxdWVyeUluZGV4Iiwic3BsaXR0ZXIiLCJ1U3BsaXQiLCJzcGxpdCIsInJlc3QiLCJzaW1wbGVQYXRoIiwiZXhlYyIsInByb3RvIiwibG93ZXJQcm90byIsImF0U2lnbiIsImhvc3RFbmQiLCJoZWMiLCJkZWNvZGVVUklDb21wb25lbnQiLCJwYXJzZUhvc3QiLCJpcHY2SG9zdG5hbWUiLCJob3N0cGFydHMiLCJwYXJ0IiwibmV3cGFydCIsImsiLCJ2YWxpZFBhcnRzIiwibm90SG9zdCIsImJpdCIsInVuc2hpZnQiLCJ0b0FTQ0lJIiwiaCIsImFlIiwiZXNjIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZXNjYXBlIiwicW0iLCJjaGFyQXQiLCJyZWwiLCJyZXN1bHQiLCJ0a2V5cyIsInRrIiwidGtleSIsInJrZXlzIiwicmsiLCJya2V5IiwicmVsUGF0aCIsInNoaWZ0IiwiaXNTb3VyY2VBYnMiLCJpc1JlbEFicyIsIm11c3RFbmRBYnMiLCJyZW1vdmVBbGxEb3RzIiwic3JjUGF0aCIsInBzeWNob3RpYyIsInBvcCIsImF1dGhJbkhvc3QiLCJsYXN0IiwiaGFzVHJhaWxpbmdTbGFzaCIsInVwIiwic3BsaWNlIiwiaXNBYnNvbHV0ZSIsImFzc2VydCIsIm9rIiwia1JhbmdlRXJyb3JNZXNzYWdlIiwiWl9NSU5fV0lORE9XQklUUyIsIlpfTUFYX1dJTkRPV0JJVFMiLCJaX0RFRkFVTFRfV0lORE9XQklUUyIsIlpfTUlOX0NIVU5LIiwiWl9NQVhfQ0hVTksiLCJaX0RFRkFVTFRfQ0hVTksiLCJaX01JTl9NRU1MRVZFTCIsIlpfTUFYX01FTUxFVkVMIiwiWl9ERUZBVUxUX01FTUxFVkVMIiwiWl9NSU5fTEVWRUwiLCJaX01BWF9MRVZFTCIsIlpfREVGQVVMVF9MRVZFTCIsIlpfREVGQVVMVF9DT01QUkVTU0lPTiIsImJrZXlzIiwiYmsiLCJia2V5IiwiY29kZXMiLCJaX09LIiwiWl9TVFJFQU1fRU5EIiwiWl9ORUVEX0RJQ1QiLCJaX0VSUk5PIiwiWl9TVFJFQU1fRVJST1IiLCJaX0RBVEFfRVJST1IiLCJaX01FTV9FUlJPUiIsIlpfQlVGX0VSUk9SIiwiWl9WRVJTSU9OX0VSUk9SIiwiY2tleXMiLCJjayIsImNrZXkiLCJ6bGliQnVmZmVyIiwiZW5naW5lIiwiY2FsbGJhY2siLCJidWZmZXJzIiwibnJlYWQiLCJmbG93Iiwib25FbmQiLCJjbG9zZSIsInpsaWJCdWZmZXJTeW5jIiwiZmx1c2hGbGFnIiwiX2ZpbmlzaEZsdXNoRmxhZyIsIl9wcm9jZXNzQ2h1bmsiLCJEZWZsYXRlIiwiWmxpYiIsIkRFRkxBVEUiLCJJbmZsYXRlIiwiSU5GTEFURSIsIkd6aXAiLCJHWklQIiwiR3VuemlwIiwiR1VOWklQIiwiRGVmbGF0ZVJhdyIsIkRFRkxBVEVSQVciLCJJbmZsYXRlUmF3IiwiSU5GTEFURVJBVyIsIlVuemlwIiwiVU5aSVAiLCJpc1ZhbGlkRmx1c2hGbGFnIiwiZmxhZyIsIlpfTk9fRkxVU0giLCJaX1BBUlRJQUxfRkxVU0giLCJaX1NZTkNfRkxVU0giLCJaX0ZVTExfRkxVU0giLCJaX0ZJTklTSCIsIlpfQkxPQ0siLCJfdGhpcyIsIl9vcHRzIiwiX2NodW5rU2l6ZSIsImNodW5rU2l6ZSIsImZsdXNoIiwiZmluaXNoRmx1c2giLCJfZmx1c2hGbGFnIiwid2luZG93Qml0cyIsImxldmVsIiwibWVtTGV2ZWwiLCJzdHJhdGVneSIsIlpfRklMVEVSRUQiLCJaX0hVRkZNQU5fT05MWSIsIlpfUkxFIiwiWl9GSVhFRCIsIlpfREVGQVVMVF9TVFJBVEVHWSIsImRpY3Rpb25hcnkiLCJfaGFuZGxlIiwiX2hhZEVycm9yIiwib25lcnJvciIsIm1lc3NhZ2UiLCJlcnJubyIsIl9jbG9zZSIsImluaXQiLCJfYnVmZmVyIiwiX29mZnNldCIsIl9sZXZlbCIsIl9zdHJhdGVneSIsImVtaXRDbG9zZU5UIiwiZnJlZXplIiwiY3JlYXRlRGVmbGF0ZSIsImNyZWF0ZUluZmxhdGUiLCJjcmVhdGVEZWZsYXRlUmF3IiwiY3JlYXRlSW5mbGF0ZVJhdyIsImNyZWF0ZUd6aXAiLCJjcmVhdGVHdW56aXAiLCJjcmVhdGVVbnppcCIsImRlZmxhdGUiLCJkZWZsYXRlU3luYyIsImRlZmxhdGVSYXciLCJkZWZsYXRlUmF3U3luYyIsInVuemlwIiwidW56aXBTeW5jIiwiaW5mbGF0ZSIsImluZmxhdGVTeW5jIiwiZ3VuemlwIiwiZ3VuemlwU3luYyIsImluZmxhdGVSYXciLCJpbmZsYXRlUmF3U3luYyIsInBhcmFtcyIsInJlc2V0IiwiX2ZsdXNoIiwiX3RyYW5zZm9ybSIsImtpbmQiLCJfdGhpczIiLCJ3cyIsImVuZGluZyIsIm5lZWREcmFpbiIsImF2YWlsSW5CZWZvcmUiLCJhdmFpbE91dEJlZm9yZSIsImluT2ZmIiwiZXIiLCJ3cml0ZVN5bmMiLCJyZXEiLCJhdmFpbEluQWZ0ZXIiLCJhdmFpbE91dEFmdGVyIiwiaGF2ZSIsIm5ld1JlcSIsImZuIiwiYXJnMSIsImFyZzIiLCJhcmczIiwiY29weVByb3BzIiwiU2FmZUJ1ZmZlciIsIlRZUEVEX09LIiwiVWludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiX2hhcyIsInNvdXJjZXMiLCJzaHJpbmtCdWYiLCJmblR5cGVkIiwiYXJyYXlTZXQiLCJkZXN0Iiwic3JjX29mZnMiLCJkZXN0X29mZnMiLCJmbGF0dGVuQ2h1bmtzIiwiY2h1bmtzIiwiZm5VbnR5cGVkIiwic2V0VHlwZWQiLCJCdWY4IiwiQnVmMTYiLCJCdWYzMiIsImhhcyIsInByZWZpeCIsIkV2ZW50cyIsIkVFIiwiY29udGV4dCIsImVtaXR0ZXIiLCJldmVudCIsImxpc3RlbmVyIiwiZXZ0IiwiX2V2ZW50cyIsIl9ldmVudHNDb3VudCIsImNsZWFyRXZlbnQiLCJldmVudE5hbWVzIiwiZXZlbnRzIiwibmFtZXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJoYW5kbGVycyIsImVlIiwibGlzdGVuZXJDb3VudCIsImExIiwiYTIiLCJhMyIsImE0IiwiYTUiLCJwcmVmaXhlZCIsIkNhcHR1cmVkUmVxdWVzdCIsIl9jYXB0dXJlIiwiX3JlcXVlc3RzIiwiTWFwIiwiY2xlYXIiLCJpbmZvIiwicmVxdWVzdElkIiwiYWRkUmVxdWVzdEluZm8iLCJpdGVyYXRvciIsImVudHJpZXMiLCJ2YWx1ZXMiLCJpdGVyYXRlZSIsInRoaXNBcmciLCJmb3JFYWNoIiwiY3IiLCJyaSIsIm9uZGF0YSIsInBhdXNlIiwib25kcmFpbiIsInJlc3VtZSIsIl9pc1N0ZGlvIiwib25jbG9zZSIsImRpZE9uRW5kIiwiY2xlYW51cCIsIlJlZmxlY3RPd25LZXlzIiwiUiIsIlJlZmxlY3QiLCJSZWZsZWN0QXBwbHkiLCJyZWNlaXZlciIsIm93bktleXMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiTnVtYmVySXNOYU4iLCJfbWF4TGlzdGVuZXJzIiwiZGVmYXVsdE1heExpc3RlbmVycyIsIiRnZXRNYXhMaXN0ZW5lcnMiLCJfYWRkTGlzdGVuZXIiLCJwcmVwZW5kIiwiZXhpc3RpbmciLCJ3YXJuaW5nIiwibmV3TGlzdGVuZXIiLCJ3YXJuZWQiLCJ3IiwiY291bnQiLCJjb25zb2xlIiwid2FybiIsIl9vbmNlV3JhcCIsInN0YXRlIiwiZmlyZWQiLCJ3cmFwRm4iLCJ3cmFwcGVkIiwiX2xpc3RlbmVycyIsInVud3JhcCIsImV2bGlzdGVuZXIiLCJ1bndyYXBMaXN0ZW5lcnMiLCJhcnJheUNsb25lIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRNYXhMaXN0ZW5lcnMiLCJnZXRNYXhMaXN0ZW5lcnMiLCJkb0Vycm9yIiwiaGFuZGxlciIsInBvc2l0aW9uIiwib3JpZ2luYWxMaXN0ZW5lciIsImluZGV4Iiwic3BsaWNlT25lIiwicmF3TGlzdGVuZXJzIiwic2V0SW1tZWRpYXRlIiwiQ29ya2VkUmVxdWVzdCIsImVudHJ5IiwiZmluaXNoIiwiY29ya1JlcSIsInBlbmRpbmdjYiIsImNvcmtlZFJlcXVlc3RzRnJlZSIsIm9uQ29ya2VkRmluaXNoIiwiYXN5bmNXcml0ZSIsIldyaXRhYmxlU3RhdGUiLCJpbnRlcm5hbFV0aWwiLCJkZXByZWNhdGUiLCJPdXJVaW50OEFycmF5IiwicmVhbEhhc0luc3RhbmNlIiwiZGVzdHJveUltcGwiLCJub3AiLCJzdHJlYW0iLCJpc0R1cGxleCIsIm9iamVjdE1vZGUiLCJ3cml0YWJsZU9iamVjdE1vZGUiLCJod20iLCJ3cml0YWJsZUh3bSIsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIsImRlZmF1bHRId20iLCJmaW5hbENhbGxlZCIsImZpbmlzaGVkIiwibm9EZWNvZGUiLCJkZWNvZGVTdHJpbmdzIiwiZGVmYXVsdEVuY29kaW5nIiwid3JpdGluZyIsImNvcmtlZCIsInN5bmMiLCJidWZmZXJQcm9jZXNzaW5nIiwib253cml0ZSIsIndyaXRlY2IiLCJ3cml0ZWxlbiIsIm9ud3JpdGVTdGF0ZVVwZGF0ZSIsImZpbmlzaE1heWJlIiwiZXJyb3JFbWl0dGVkIiwib253cml0ZUVycm9yIiwibmVlZEZpbmlzaCIsImJ1ZmZlcmVkUmVxdWVzdCIsImNsZWFyQnVmZmVyIiwiYWZ0ZXJXcml0ZSIsImxhc3RCdWZmZXJlZFJlcXVlc3QiLCJwcmVmaW5pc2hlZCIsImJ1ZmZlcmVkUmVxdWVzdENvdW50IiwiX3dyaXRlIiwid3JpdGV2IiwiX3dyaXRldiIsImZpbmFsIiwiX2ZpbmFsIiwiZG9Xcml0ZSIsIm9ud3JpdGVEcmFpbiIsImhvbGRlciIsImFsbEJ1ZmZlcnMiLCJpc0J1ZiIsImNhbGxGaW5hbCIsIm5lZWQiLCJwcmVmaW5pc2giLCJnZXRCdWZmZXIiLCJjdXJyZW50IiwiXyIsImhhc0luc3RhbmNlIiwiX3VpbnQ4QXJyYXlUb0J1ZmZlciIsIndyaXRlQWZ0ZXJFbmQiLCJ2YWxpZCIsInZhbGlkQ2h1bmsiLCJuZXdDaHVuayIsImRlY29kZUNodW5rIiwid3JpdGVPckJ1ZmZlciIsImNvcmsiLCJ1bmNvcmsiLCJzZXREZWZhdWx0RW5jb2RpbmciLCJlbmRXcml0YWJsZSIsIl91bmRlc3Ryb3kiLCJ1bmRlc3Ryb3kiLCJjYW5SZXBsYXlQcm90b2NvbHMiLCJTZXQiLCJTUEFDRSIsIkgyTWV0aG9kIiwiSDJwYXRoIiwiSFRUUDFEMSIsIkRBU0giLCJiZWdpbiIsIm1kYXRhIiwiZW1wdHkiLCJ3ZWJwYWNrUG9seWZpbGwiLCJwYXRocyIsImNoaWxkcmVuIiwiQ2xpZW50UmVxdWVzdCIsImV4dGVuZCIsInN0YXR1c0NvZGVzIiwiZGVmYXVsdFByb3RvY29sIiwibG9jYXRpb24iLCJ0b1VwcGVyQ2FzZSIsIkluY29taW5nTWVzc2FnZSIsIkFnZW50IiwiZGVmYXVsdE1heFNvY2tldHMiLCJnbG9iYWxBZ2VudCIsIlNUQVRVU19DT0RFUyIsIk1FVEhPRFMiLCJzdGFydENhc2UiLCJTUEFDRVJlIiwiZW5zdXJlSFRUUDJIZWFkZXJzIiwiaGVhZGVyS2V5Iiwic3RyaW5naWZ5SGVhZGVycyIsIm91dFN0cmluZyIsInN0cmluZ2lmeVJlcXVlc3RIZWFkZXJzIiwiaGFzSG9zdCIsImJhc2VUb1N0cmluZyIsIlJlYWRhYmxlU3RhdGUiLCJFRWxpc3RlbmVyQ291bnQiLCJkZWJ1Z1V0aWwiLCJkZWJ1ZyIsImRlYnVnbG9nIiwiU3RyaW5nRGVjb2RlciIsIkJ1ZmZlckxpc3QiLCJrUHJveHlFdmVudHMiLCJyZWFkYWJsZUh3bSIsInJlYWRhYmxlSGlnaFdhdGVyTWFyayIsInBpcGVzIiwicGlwZXNDb3VudCIsImZsb3dpbmciLCJlbmRFbWl0dGVkIiwicmVhZGluZyIsIm5lZWRSZWFkYWJsZSIsImVtaXR0ZWRSZWFkYWJsZSIsInJlYWRhYmxlTGlzdGVuaW5nIiwicmVzdW1lU2NoZWR1bGVkIiwiYXdhaXREcmFpbiIsInJlYWRpbmdNb3JlIiwiZGVjb2RlciIsIl9yZWFkIiwicmVhZGFibGVBZGRDaHVuayIsImFkZFRvRnJvbnQiLCJza2lwQ2h1bmtDaGVjayIsImVtaXRSZWFkYWJsZSIsIm9uRW9mQ2h1bmsiLCJjaHVua0ludmFsaWQiLCJhZGRDaHVuayIsIm1heWJlUmVhZE1vcmUiLCJuZWVkTW9yZURhdGEiLCJpc1BhdXNlZCIsInNldEVuY29kaW5nIiwiTUFYX0hXTSIsImhvd011Y2hUb1JlYWQiLCJoZWFkIiwiY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsiLCJlbWl0UmVhZGFibGVfIiwibWF5YmVSZWFkTW9yZV8iLCJuUmVhZGluZ05leHRUaWNrIiwicmVzdW1lXyIsImZyb21MaXN0IiwiaGFzU3RyaW5ncyIsIm5iIiwidGFpbCIsImNvcHlGcm9tQnVmZmVyU3RyaW5nIiwiY29weUZyb21CdWZmZXIiLCJmcm9tTGlzdFBhcnRpYWwiLCJlbmRSZWFkYWJsZSIsImVuZFJlYWRhYmxlTlQiLCJ4cyIsIm5PcmlnIiwiZG9SZWFkIiwicGlwZU9wdHMiLCJlbmRGbiIsInN0ZG91dCIsInN0ZGVyciIsInVucGlwZSIsIm9udW5waXBlIiwidW5waXBlSW5mbyIsImhhc1VucGlwZWQiLCJvbmZpbmlzaCIsImNsZWFuZWRVcCIsInBpcGVPbkRyYWluIiwiaW5jcmVhc2VkQXdhaXREcmFpbiIsImRlc3RzIiwiZXYiLCJ3cmFwIiwicGF1c2VkIiwiX2Zyb21MaXN0IiwiZW1pdEVycm9yTlQiLCJyZWFkYWJsZURlc3Ryb3llZCIsIndyaXRhYmxlRGVzdHJveWVkIiwibmVuYyIsInJldHJpZWQiLCJfbm9ybWFsaXplRW5jb2RpbmciLCJub3JtYWxpemVFbmNvZGluZyIsInRleHQiLCJ1dGYxNlRleHQiLCJ1dGYxNkVuZCIsImZpbGxMYXN0IiwidXRmOEZpbGxMYXN0IiwiYmFzZTY0VGV4dCIsImJhc2U2NEVuZCIsInNpbXBsZVdyaXRlIiwic2ltcGxlRW5kIiwibGFzdE5lZWQiLCJsYXN0VG90YWwiLCJsYXN0Q2hhciIsInV0ZjhDaGVja0J5dGUiLCJieXRlIiwidXRmOENoZWNrRXh0cmFCeXRlcyIsInRvdGFsIiwidXRmOENoZWNrSW5jb21wbGV0ZSIsImFmdGVyVHJhbnNmb3JtIiwidHMiLCJfdHJhbnNmb3JtU3RhdGUiLCJ0cmFuc2Zvcm1pbmciLCJ3cml0ZWNodW5rIiwicnMiLCJuZWVkVHJhbnNmb3JtIiwid3JpdGVlbmNvZGluZyIsInRyYW5zZm9ybSIsImVycjIiLCJvYmplY3RBc3NpZ24iLCJoYXNPd24iLCJwU2xpY2UiLCJmdW5jdGlvbnNIYXZlTmFtZXMiLCJwVG9TdHJpbmciLCJhcnJidWYiLCJEYXRhVmlldyIsInJlZ2V4IiwiZ2V0TmFtZSIsImZ1bmMiLCJ0cnVuY2F0ZSIsInNvbWV0aGluZyIsInJhd25hbWUiLCJmYWlsIiwiZXhwZWN0ZWQiLCJvcGVyYXRvciIsInN0YWNrU3RhcnRGdW5jdGlvbiIsIkFzc2VydGlvbkVycm9yIiwiX2RlZXBFcXVhbCIsInN0cmljdCIsIm1lbW9zIiwiZ2V0VGltZSIsIm11bHRpbGluZSIsImxhc3RJbmRleCIsImlnbm9yZUNhc2UiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJhY3R1YWxJbmRleCIsImFjdHVhbFZpc2l0ZWRPYmplY3RzIiwiYUlzQXJncyIsImlzQXJndW1lbnRzIiwiYklzQXJncyIsImthIiwia2IiLCJzb3J0Iiwib2JqRXF1aXYiLCJleHBlY3RlZEV4Y2VwdGlvbiIsInRlc3QiLCJpc1Byb3RvdHlwZU9mIiwiX3Rocm93cyIsInNob3VsZFRocm93IiwiYmxvY2siLCJfdHJ5QmxvY2siLCJ1c2VyUHJvdmlkZWRNZXNzYWdlIiwiaXNVbmV4cGVjdGVkRXhjZXB0aW9uIiwiZ2VuZXJhdGVkTWVzc2FnZSIsImdldE1lc3NhZ2UiLCJjYXB0dXJlU3RhY2tUcmFjZSIsInN0YWNrIiwiZm5fbmFtZSIsIm5leHRfbGluZSIsInN1YnN0cmluZyIsImVxdWFsIiwibm90RXF1YWwiLCJkZWVwRXF1YWwiLCJkZWVwU3RyaWN0RXF1YWwiLCJub3REZWVwRXF1YWwiLCJub3REZWVwU3RyaWN0RXF1YWwiLCJzdHJpY3RFcXVhbCIsIm5vdFN0cmljdEVxdWFsIiwidGhyb3dzIiwiZG9lc05vdFRocm93IiwiaWZFcnJvciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZXNjcmlwdG9ycyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImZvcm1hdFJlZ0V4cCIsImYiLCJvYmplY3RzIiwibXNnIiwibm9EZXByZWNhdGlvbiIsInRocm93RGVwcmVjYXRpb24iLCJ0cmFjZURlcHJlY2F0aW9uIiwidHJhY2UiLCJkZWJ1Z0Vudmlyb24iLCJkZWJ1Z3MiLCJjdHgiLCJzZWVuIiwic3R5bGl6ZSIsInN0eWxpemVOb0NvbG9yIiwiZGVwdGgiLCJjb2xvcnMiLCJzaG93SGlkZGVuIiwiX2V4dGVuZCIsImN1c3RvbUluc3BlY3QiLCJzdHlsaXplV2l0aENvbG9yIiwiZm9ybWF0VmFsdWUiLCJzdHlsZVR5cGUiLCJzdHlsZSIsInN0eWxlcyIsInJlY3Vyc2VUaW1lcyIsInByaW1pdGl2ZSIsInNpbXBsZSIsImZvcm1hdFByaW1pdGl2ZSIsInZpc2libGVLZXlzIiwiYXJyYXlUb0hhc2giLCJmb3JtYXRFcnJvciIsIlJlZ0V4cCIsIm91dHB1dCIsImJyYWNlcyIsInRvVVRDU3RyaW5nIiwiZm9ybWF0UHJvcGVydHkiLCJmb3JtYXRBcnJheSIsInJlZHVjZSIsInByZXYiLCJjdXIiLCJudW1MaW5lc0VzdCIsInJlZHVjZVRvU2luZ2xlU3RyaW5nIiwibGluZSIsImFyIiwicGFkIiwiTk9ERV9ERUJVRyIsInBpZCIsImJvbGQiLCJpdGFsaWMiLCJ1bmRlcmxpbmUiLCJpbnZlcnNlIiwid2hpdGUiLCJncmV5IiwiYmxhY2siLCJibHVlIiwiY3lhbiIsImdyZWVuIiwibWFnZW50YSIsInJlZCIsInllbGxvdyIsInNwZWNpYWwiLCJudW1iZXIiLCJib29sZWFuIiwibnVsbCIsInJlZ2V4cCIsIm1vbnRocyIsInByb3AiLCJsb2ciLCJ0aW1lIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImdldERhdGUiLCJnZXRNb250aCIsIm9yaWdpbiIsImFkZCIsImtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCIsImNhbGxiYWNraWZ5T25SZWplY3RlZCIsInJlYXNvbiIsIm5ld1JlYXNvbiIsInByb21pc2lmeSIsIm9yaWdpbmFsIiwicHJvbWlzZVJlc29sdmUiLCJwcm9taXNlUmVqZWN0IiwicHJvbWlzZSIsInNldFByb3RvdHlwZU9mIiwiZGVmaW5lUHJvcGVydGllcyIsImN1c3RvbSIsImNhbGxiYWNraWZ5IiwiY2FsbGJhY2tpZmllZCIsIm1heWJlQ2IiLCJ0aGVuIiwicmVqIiwiYWRsZXIiLCJzMSIsInMyIiwiY3JjVGFibGUiLCJ0YWJsZSIsIm1ha2VUYWJsZSIsImNyYyIsImdzIiwiZ3ppcE1hZ2ljTnVtIiwiZ3ppcE1hZ2ljTnVtTGVuIiwiZmlsZVBhdGgiLCJmZCIsIm9wZW4iLCJmaWxsTWUiLCJpc0d6aXBwZWQiLCJvcGVuU3luYyIsInJlYWRTeW5jIiwiY2xvc2VTeW5jIiwiX25vZGVJZCIsIl9jbG9ja3NlcSIsInJuZyIsImJ5dGVzVG9VdWlkIiwiX2xhc3RNU2VjcyIsIl9sYXN0TlNlY3MiLCJub2RlIiwiY2xvY2tzZXEiLCJzZWVkQnl0ZXMiLCJtc2VjcyIsIm5zZWNzIiwiZHQiLCJ0bCIsInRtaCIsIm9iamVjdFByb3RvIiwiQ3RvciIsImJhc2VHZXRUYWciLCJhc3luY1RhZyIsImZ1bmNUYWciLCJnZW5UYWciLCJwcm94eVRhZyIsInRhZyIsImZ1bmNUb1N0cmluZyIsIk1BWF9TQUZFX0lOVEVHRVIiLCJmZXRjaCIsIlJlYWRhYmxlU3RyZWFtIiwid3JpdGFibGVTdHJlYW0iLCJXcml0YWJsZVN0cmVhbSIsImFib3J0Q29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImJsb2JDb25zdHJ1Y3RvciIsIkJsb2IiLCJ4aHIiLCJnZXRYSFIiLCJYTUxIdHRwUmVxdWVzdCIsIlhEb21haW5SZXF1ZXN0IiwiY2hlY2tUeXBlU3VwcG9ydCIsInJlc3BvbnNlVHlwZSIsImhhdmVBcnJheUJ1ZmZlciIsImhhdmVTbGljZSIsImFycmF5YnVmZmVyIiwibXNzdHJlYW0iLCJtb3pjaHVua2VkYXJyYXlidWZmZXIiLCJvdmVycmlkZU1pbWVUeXBlIiwidmJBcnJheSIsIlZCQXJyYXkiLCJjYXBhYmlsaXR5IiwiclN0YXRlcyIsInJlYWR5U3RhdGVzIiwiVU5TRU5UIiwiT1BFTkVEIiwiSEVBREVSU19SRUNFSVZFRCIsIkxPQURJTkciLCJET05FIiwiZmV0Y2hUaW1lciIsIl9tb2RlIiwicmF3SGVhZGVycyIsInRyYWlsZXJzIiwicmF3VHJhaWxlcnMiLCJfZmV0Y2hSZXNwb25zZSIsInN0YXR1c0NvZGUiLCJzdGF0dXMiLCJzdGF0dXNNZXNzYWdlIiwic3RhdHVzVGV4dCIsImhlYWRlciIsIl9kZXN0cm95ZWQiLCJfcmVzdW1lRmV0Y2giLCJhYm9ydCIsImJvZHkiLCJwaXBlVG8iLCJjYXRjaCIsInJlYWRlciIsImdldFJlYWRlciIsIl94aHIiLCJfcG9zIiwicmVzcG9uc2VVUkwiLCJnZXRBbGxSZXNwb25zZUhlYWRlcnMiLCJtYXRjaGVzIiwiX2NoYXJzZXQiLCJtaW1lVHlwZSIsImNoYXJzZXRNYXRjaCIsIl9vblhIUlByb2dyZXNzIiwicmVhZHlTdGF0ZSIsInJlc3BvbnNlQm9keSIsInRvQXJyYXkiLCJyZXNwb25zZVRleHQiLCJuZXdEYXRhIiwiTVNTdHJlYW1SZWFkZXIiLCJvbnByb2dyZXNzIiwib25sb2FkIiwicmVhZEFzQXJyYXlCdWZmZXIiLCJyZUhhc1VuaWNvZGUiLCJVUkwiLCJodHRwUmVxdWVzdFBhdGgiLCJzZWFyY2hQYXJhbXMiLCJIZWFkZXJUcmFpbGVycyIsIkNEUFJlcXVlc3RJbmZvIiwiX3VybCIsInVybEZyYWdtZW50IiwicG9zdERhdGEiLCJyZXF1ZXN0SGVhZGVycyIsInJlcXVlc3RIZWFkZXJzXyIsInJlcXVlc3RIZWFkZXJzVGV4dCIsInJlc3BvbnNlSGVhZGVycyIsInJlc3BvbnNlSGVhZGVyc1RleHQiLCJnZXRCb2R5IiwiaGFzUG9zdERhdGEiLCJyZWRpckNSIiwicmVkaXJlY3RSZXNwb25zZSIsImhlYWRlcnNUZXh0Iiwibm90M3h4IiwiZmNybGZpZHgiLCJmbGluZSIsIl9jaGVja01ldGhvZCIsIl9lbnN1cmVQcm90byIsInB1cmwiLCJnZXRQYXJzZWRVUkwiLCJfZ2V0UmVxSGVhZGVyT2JqIiwiSG9zdCIsIl9zZXJpYWxpemVSZXF1ZXN0SGVhZGVyc1RleHQiLCJfc2VyaWFsaXplUmVxdWVzdEhlYWRlcnNPYmoiLCJnb29kIiwibWF5YmVNZXRoIiwiX21ldGhQcm90b0Zyb21SZXFIZWFkVGV4dCIsImh0dHBTdHJpbmciLCJodHRwU3RyaW5nUGFydHMiLCJfY29ycmVjdFByb3RvY29sIiwib3JpZ2luYWxQcm90b2NvbCIsIm5ld1Byb3RvY29sIiwiaXNSZXEiLCJpc1JlZGlyIiwiaXNSZXMiLCJkZXRlcm1pblJlcXVlc3RUeXBlIiwiX3JlcXMiLCJydCIsImZyb21SZWRpciIsImZyb21SZXF1ZXN0IiwiZnJvbVJlc3BvbnNlIiwiYWRkUmVzcG9uc2UiLCJ1cmxzIiwiQXV0b1dBUkNQYXJzZXIiLCJXQVJDR3pQYXJzZXIiLCJXQVJDUGFyc2VyIiwiQ1JJRXh0cmFXQVJDR2VuZXJhdG9yIiwiRWxlY3Ryb25XQVJDV3JpdGVyIiwiUHVwcGV0ZWVyQ0RQV0FSQ0dlbmVyYXRvciIsIlB1cHBldGVlcldBUkNHZW5lcmF0b3IiLCJSZW1vdGVDaHJvbWVXQVJDV3JpdGVyIiwiV0FSQ1dyaXRlckJhc2UiLCJDUklFeHRyYUNhcHR1cmVyIiwiRWxlY3Ryb25DYXB0dXJlciIsIlB1cHBldGVlckNhcHR1cmVyIiwiUHVwcGV0ZWVyQ0RQQ2FwdHVyZXIiLCJSZW1vdGVDaHJvbWVDYXB0dXJlciIsIlJlcXVlc3RIYW5kbGVyIiwiUmVxdWVzdExpYldBUkNXcml0ZXIiLCJHemlwRGV0ZWN0b3IiLCJjYW5Vc2VSZWNvcmRJdGVyYXRvciIsIl93cCIsIl9wYXJzaW5nIiwiX29uUmVjb3JkIiwiX29uRW5kIiwiX2dldFN0cmVhbSIsInN0YXJ0ZWRQYXJzaW5nIiwicmVjb3JkIiwiaXNHeiIsImlzR3ppcHBlZFN5bmMiLCJiNjQiLCJsZW5zIiwiZ2V0TGVucyIsInZhbGlkTGVuIiwicGxhY2VIb2xkZXJzTGVuIiwidG1wIiwiQXJyIiwiX2J5dGVMZW5ndGgiLCJjdXJCeXRlIiwicmV2TG9va3VwIiwidWludDgiLCJleHRyYUJ5dGVzIiwicGFydHMiLCJsZW4yIiwiZW5jb2RlQ2h1bmsiLCJsb29rdXAiLCJudW0iLCJpc0xFIiwibUxlbiIsIm5CeXRlcyIsImVMZW4iLCJlTWF4IiwiZUJpYXMiLCJuQml0cyIsIk5hTiIsImFicyIsIkxOMiIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJfY2xhc3NDYWxsQ2hlY2siLCJzY29wZSIsIlRpbWVvdXQiLCJpZCIsImNsZWFyRm4iLCJfaWQiLCJfY2xlYXJGbiIsInNldEludGVydmFsIiwiY2xlYXJJbnRlcnZhbCIsInVucmVmIiwicmVmIiwiZW5yb2xsIiwiaXRlbSIsIl9pZGxlVGltZW91dElkIiwiX2lkbGVUaW1lb3V0IiwidW5lbnJvbGwiLCJfdW5yZWZBY3RpdmUiLCJhY3RpdmUiLCJfb25UaW1lb3V0IiwiY2xlYXJJbW1lZGlhdGUiLCJyZWdpc3RlckltbWVkaWF0ZSIsImh0bWwiLCJjaGFubmVsIiwibWVzc2FnZVByZWZpeCIsIm9uR2xvYmFsTWVzc2FnZSIsIm5leHRIYW5kbGUiLCJ0YXNrc0J5SGFuZGxlIiwiY3VycmVudGx5UnVubmluZ0FUYXNrIiwiZG9jIiwiZG9jdW1lbnQiLCJhdHRhY2hUbyIsImhhbmRsZSIsInJ1bklmUHJlc2VudCIsInBvc3RNZXNzYWdlIiwiaW1wb3J0U2NyaXB0cyIsInBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMiLCJvbGRPbk1lc3NhZ2UiLCJvbm1lc3NhZ2UiLCJjYW5Vc2VQb3N0TWVzc2FnZSIsIk1lc3NhZ2VDaGFubmVsIiwicG9ydDEiLCJwb3J0MiIsImNyZWF0ZUVsZW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJzY3JpcHQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZW1vdmVDaGlsZCIsImFwcGVuZENoaWxkIiwicmFuZG9tIiwiYWRkRXZlbnRMaXN0ZW5lciIsImF0dGFjaEV2ZW50IiwidGFzayIsImNvbmZpZyIsImxvY2FsU3RvcmFnZSIsIlpzdHJlYW0iLCJ6bGliX2RlZmxhdGUiLCJ6bGliX2luZmxhdGUiLCJjb25zdGFudHMiLCJOT05FIiwiaW5pdF9kb25lIiwid3JpdGVfaW5fcHJvZ3Jlc3MiLCJwZW5kaW5nX2Nsb3NlIiwiZ3ppcF9pZF9ieXRlc19yZWFkIiwiZGVmbGF0ZUVuZCIsInN0cm0iLCJpbmZsYXRlRW5kIiwiaW5wdXQiLCJpbl9vZmYiLCJpbl9sZW4iLCJvdXRfb2ZmIiwib3V0X2xlbiIsImF2YWlsX2luIiwibmV4dF9pbiIsImF2YWlsX291dCIsIm5leHRfb3V0IiwiX3Byb2Nlc3MiLCJfY2hlY2tFcnJvciIsIl9hZnRlclN5bmMiLCJfYWZ0ZXIiLCJuZXh0X2V4cGVjdGVkX2hlYWRlcl9ieXRlIiwiaW5mbGF0ZVNldERpY3Rpb25hcnkiLCJfZXJyb3IiLCJfaW5pdCIsIl9zZXREaWN0aW9uYXJ5IiwiX3Jlc2V0IiwiZGVmbGF0ZUluaXQyIiwiWl9ERUZMQVRFRCIsImluZmxhdGVJbml0MiIsImRlZmxhdGVTZXREaWN0aW9uYXJ5IiwiZGVmbGF0ZVJlc2V0IiwiaW5mbGF0ZVJlc2V0IiwicHJvcElzRW51bWVyYWJsZSIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwidGVzdDEiLCJ0ZXN0MiIsInRlc3QzIiwibGV0dGVyIiwic2hvdWxkVXNlTmF0aXZlIiwic3ltYm9scyIsInRvIiwidG9PYmplY3QiLCJ0b3RhbF9pbiIsInRvdGFsX291dCIsImRhdGFfdHlwZSIsImNvbmZpZ3VyYXRpb25fdGFibGUiLCJ1dGlscyIsInRyZWVzIiwiYWRsZXIzMiIsImNyYzMyIiwiWl9VTktOT1dOIiwiTUFYX01FTV9MRVZFTCIsIk1BWF9XQklUUyIsIkRFRl9NRU1fTEVWRUwiLCJMX0NPREVTIiwiTElURVJBTFMiLCJEX0NPREVTIiwiQkxfQ09ERVMiLCJIRUFQX1NJWkUiLCJNQVhfQklUUyIsIk1JTl9NQVRDSCIsIk1BWF9NQVRDSCIsIk1JTl9MT09LQUhFQUQiLCJQUkVTRVRfRElDVCIsIklOSVRfU1RBVEUiLCJFWFRSQV9TVEFURSIsIk5BTUVfU1RBVEUiLCJDT01NRU5UX1NUQVRFIiwiSENSQ19TVEFURSIsIkJVU1lfU1RBVEUiLCJGSU5JU0hfU1RBVEUiLCJCU19ORUVEX01PUkUiLCJCU19CTE9DS19ET05FIiwiQlNfRklOSVNIX1NUQVJURUQiLCJCU19GSU5JU0hfRE9ORSIsIk9TX0NPREUiLCJlcnJvckNvZGUiLCJyYW5rIiwiemVybyIsImZsdXNoX3BlbmRpbmciLCJwZW5kaW5nIiwicGVuZGluZ19idWYiLCJwZW5kaW5nX291dCIsImZsdXNoX2Jsb2NrX29ubHkiLCJfdHJfZmx1c2hfYmxvY2siLCJibG9ja19zdGFydCIsInN0cnN0YXJ0IiwicHV0X2J5dGUiLCJwdXRTaG9ydE1TQiIsImxvbmdlc3RfbWF0Y2giLCJjdXJfbWF0Y2giLCJjaGFpbl9sZW5ndGgiLCJtYXhfY2hhaW5fbGVuZ3RoIiwic2NhbiIsImJlc3RfbGVuIiwicHJldl9sZW5ndGgiLCJuaWNlX21hdGNoIiwid19zaXplIiwiX3dpbiIsIndtYXNrIiwid19tYXNrIiwic3RyZW5kIiwic2Nhbl9lbmQxIiwic2Nhbl9lbmQiLCJnb29kX21hdGNoIiwibG9va2FoZWFkIiwibWF0Y2hfc3RhcnQiLCJmaWxsX3dpbmRvdyIsIm1vcmUiLCJfd19zaXplIiwid2luZG93X3NpemUiLCJoYXNoX3NpemUiLCJpbnNlcnQiLCJpbnNfaCIsImhhc2hfc2hpZnQiLCJoYXNoX21hc2siLCJkZWZsYXRlX2Zhc3QiLCJoYXNoX2hlYWQiLCJiZmx1c2giLCJtYXRjaF9sZW5ndGgiLCJfdHJfdGFsbHkiLCJtYXhfbGF6eV9tYXRjaCIsImxhc3RfbGl0IiwiZGVmbGF0ZV9zbG93IiwibWF4X2luc2VydCIsInByZXZfbWF0Y2giLCJtYXRjaF9hdmFpbGFibGUiLCJDb25maWciLCJnb29kX2xlbmd0aCIsIm1heF9sYXp5IiwibmljZV9sZW5ndGgiLCJtYXhfY2hhaW4iLCJEZWZsYXRlU3RhdGUiLCJwZW5kaW5nX2J1Zl9zaXplIiwiZ3poZWFkIiwiZ3ppbmRleCIsImxhc3RfZmx1c2giLCJ3X2JpdHMiLCJoYXNoX2JpdHMiLCJkeW5fbHRyZWUiLCJkeW5fZHRyZWUiLCJibF90cmVlIiwibF9kZXNjIiwiZF9kZXNjIiwiYmxfZGVzYyIsImJsX2NvdW50IiwiaGVhcCIsImhlYXBfbGVuIiwiaGVhcF9tYXgiLCJsX2J1ZiIsImxpdF9idWZzaXplIiwiZF9idWYiLCJvcHRfbGVuIiwic3RhdGljX2xlbiIsImJpX2J1ZiIsImJpX3ZhbGlkIiwiZGVmbGF0ZVJlc2V0S2VlcCIsIl90cl9pbml0IiwibWF4X2Jsb2NrX3NpemUiLCJtYXhfc3RhcnQiLCJkZWZsYXRlSW5pdCIsImRlZmxhdGVTZXRIZWFkZXIiLCJvbGRfZmx1c2giLCJiZWciLCJoY3JjIiwiZXh0cmEiLCJjb21tZW50Iiwib3MiLCJic3RhdGUiLCJkZWZsYXRlX2h1ZmYiLCJkZWZsYXRlX3JsZSIsIl90cl9hbGlnbiIsIl90cl9zdG9yZWRfYmxvY2siLCJhdmFpbCIsInRtcERpY3QiLCJkaWN0TGVuZ3RoIiwiZGVmbGF0ZUluZm8iLCJaX0JJTkFSWSIsIlpfVEVYVCIsIlNUT1JFRF9CTE9DSyIsIlNUQVRJQ19UUkVFUyIsIkRZTl9UUkVFUyIsIkxFTkdUSF9DT0RFUyIsIkJ1Zl9zaXplIiwiTUFYX0JMX0JJVFMiLCJFTkRfQkxPQ0siLCJSRVBfM182IiwiUkVQWl8zXzEwIiwiUkVQWl8xMV8xMzgiLCJleHRyYV9sYml0cyIsImV4dHJhX2RiaXRzIiwiZXh0cmFfYmxiaXRzIiwiYmxfb3JkZXIiLCJzdGF0aWNfbHRyZWUiLCJzdGF0aWNfZHRyZWUiLCJfZGlzdF9jb2RlIiwiX2xlbmd0aF9jb2RlIiwiYmFzZV9sZW5ndGgiLCJzdGF0aWNfbF9kZXNjIiwic3RhdGljX2RfZGVzYyIsInN0YXRpY19ibF9kZXNjIiwiYmFzZV9kaXN0IiwiU3RhdGljVHJlZURlc2MiLCJzdGF0aWNfdHJlZSIsImV4dHJhX2JpdHMiLCJleHRyYV9iYXNlIiwiZWxlbXMiLCJtYXhfbGVuZ3RoIiwiaGFzX3N0cmVlIiwiVHJlZURlc2MiLCJkeW5fdHJlZSIsInN0YXRfZGVzYyIsIm1heF9jb2RlIiwiZF9jb2RlIiwiZGlzdCIsInB1dF9zaG9ydCIsInNlbmRfYml0cyIsInNlbmRfY29kZSIsInRyZWUiLCJiaV9yZXZlcnNlIiwiZ2VuX2NvZGVzIiwiYml0cyIsIm5leHRfY29kZSIsImluaXRfYmxvY2siLCJiaV93aW5kdXAiLCJzbWFsbGVyIiwiX24yIiwiX20yIiwicHFkb3duaGVhcCIsImNvbXByZXNzX2Jsb2NrIiwibHRyZWUiLCJkdHJlZSIsImxjIiwibHgiLCJidWlsZF90cmVlIiwic3RyZWUiLCJ4Yml0cyIsIm92ZXJmbG93IiwiZ2VuX2JpdGxlbiIsInNjYW5fdHJlZSIsImN1cmxlbiIsInByZXZsZW4iLCJuZXh0bGVuIiwibWF4X2NvdW50IiwibWluX2NvdW50Iiwic2VuZF90cmVlIiwic3RhdGljX2luaXRfZG9uZSIsInN0b3JlZF9sZW4iLCJjb3B5X2Jsb2NrIiwidHJfc3RhdGljX2luaXQiLCJvcHRfbGVuYiIsInN0YXRpY19sZW5iIiwibWF4X2JsaW5kZXgiLCJibGFja19tYXNrIiwiZGV0ZWN0X2RhdGFfdHlwZSIsImJ1aWxkX2JsX3RyZWUiLCJsY29kZXMiLCJkY29kZXMiLCJibGNvZGVzIiwic2VuZF9hbGxfdHJlZXMiLCJiaV9mbHVzaCIsIjIiLCIxIiwiMCIsIi0xIiwiLTIiLCItMyIsIi00IiwiLTUiLCItNiIsImluZmxhdGVfZmFzdCIsImluZmxhdGVfdGFibGUiLCJDT0RFUyIsIkxFTlMiLCJESVNUUyIsIlpfVFJFRVMiLCJIRUFEIiwiRkxBR1MiLCJUSU1FIiwiT1MiLCJFWExFTiIsIkVYVFJBIiwiTkFNRSIsIkNPTU1FTlQiLCJIQ1JDIiwiRElDVElEIiwiRElDVCIsIlRZUEUiLCJUWVBFRE8iLCJTVE9SRUQiLCJDT1BZXyIsIkNPUFkiLCJUQUJMRSIsIkxFTkxFTlMiLCJDT0RFTEVOUyIsIkxFTl8iLCJMRU4iLCJMRU5FWFQiLCJESVNUIiwiRElTVEVYVCIsIk1BVENIIiwiTElUIiwiQ0hFQ0siLCJMRU5HVEgiLCJCQUQiLCJNRU0iLCJTWU5DIiwiRU5PVUdIX0xFTlMiLCJFTk9VR0hfRElTVFMiLCJERUZfV0JJVFMiLCJ6c3dhcDMyIiwicSIsIkluZmxhdGVTdGF0ZSIsImhhdmVkaWN0IiwiZG1heCIsImNoZWNrIiwid2JpdHMiLCJ3c2l6ZSIsIndoYXZlIiwid25leHQiLCJob2xkIiwibGVuY29kZSIsImRpc3Rjb2RlIiwibGVuYml0cyIsImRpc3RiaXRzIiwibmNvZGUiLCJubGVuIiwibmRpc3QiLCJ3b3JrIiwibGVuZHluIiwiZGlzdGR5biIsInNhbmUiLCJiYWNrIiwid2FzIiwiaW5mbGF0ZVJlc2V0S2VlcCIsImluZmxhdGVSZXNldDIiLCJsZW5maXgiLCJkaXN0Zml4IiwidmlyZ2luIiwiZml4ZWR0YWJsZXMiLCJzeW0iLCJ1cGRhdGV3aW5kb3ciLCJpbmZsYXRlSW5pdCIsInB1dCIsImxlZnQiLCJfaW4iLCJfb3V0IiwiZnJvbV9zb3VyY2UiLCJoZXJlX2JpdHMiLCJoZXJlX29wIiwiaGVyZV92YWwiLCJsYXN0X2JpdHMiLCJsYXN0X29wIiwibGFzdF92YWwiLCJoZXJlIiwiaGJ1ZiIsIm9yZGVyIiwiaW5mX2xlYXZlIiwieGZsYWdzIiwiZXh0cmFfbGVuIiwiaW5mbGF0ZUdldEhlYWRlciIsImluZmxhdGVJbmZvIiwic193aW5kb3ciLCJsY29kZSIsImRjb2RlIiwibG1hc2siLCJkbWFzayIsIm9wIiwidG9wIiwiZG9sZW4iLCJkb2Rpc3QiLCJsYmFzZSIsImxleHQiLCJkYmFzZSIsImRleHQiLCJsZW5zX2luZGV4IiwidGFibGVfaW5kZXgiLCJpbmNyIiwibG93IiwibWFzayIsImN1cnIiLCJkcm9wIiwidXNlZCIsImh1ZmYiLCJiYXNlX2luZGV4IiwiTUFYQklUUyIsIm9mZnMiLCJleHRyYV9pbmRleCIsIlpfTk9fQ09NUFJFU1NJT04iLCJaX0JFU1RfU1BFRUQiLCJaX0JFU1RfQ09NUFJFU1NJT04iLCJXQVJDUmVjb3JkIiwicGFyc2luZ1N0YXRlcyIsImNvbnRlbnQxIiwiY29udGVudDIiLCJjb25zdW1lQ1JMRkhlYWRlciIsImNvbnN1bWVDUkxGQ29udGVudDEiLCJjb25zdW1lQ1JMRkNvbnRlbnQyIiwiV0ZJQmVnaW5MZW4iLCJfcGFydHMiLCJjMSIsImMyIiwiX3BhcnNpbmdTdGF0ZSIsIm5ld1JlY29yZCIsImlzV0FSQ1JldmlzaW9uTGluZSIsImlzU2VwIiwiaXNKdXN0Q1JMRiIsIkNvbnRlbnRQYXJzZXIiLCJ3YXJjUGFydHMiLCJ3YXJjSGVhZGVyIiwicGFyc2VXYXJjUmVjb3JkSGVhZGVyIiwiaHR0cEluZm8iLCJjb250ZW50Iiwid3QiLCJwYXJzZUhUVFBQb3J0aW9uIiwicGFyc2VSZXNIVFRQIiwic3RhcnRzV2l0aCIsIndhcmNSZWNvcmRJRCIsIndhcmNDb250ZW50VHlwZSIsIndhcmNCbG9ja0RpZ2VzdCIsIndhcmNQYXlsb2FkRGlnZXN0Iiwid2FyY0lQQWRkcmVzcyIsIndhcmNSZWZlcnNUbyIsIndhcmNSZWZlcnNUb1RhcmdldFVSSSIsIndhcmNSZWZlcnNUb0RhdGUiLCJ3YXJjVHJ1bmNhdGVkIiwid2FyY1dhcmNpbmZvSUQiLCJ3YXJjRmlsZW5hbWUiLCJ3YXJjUHJvZmlsZSIsIndhcmNJZGVudGlmaWVkUGF5bG9hZFR5cGUiLCJ3YXJjU2VnbWVudE9yaWdpbklEIiwid2FyY1NlZ21lbnROdW1iZXIiLCJ3YXJjU2VnbWVudFRvdGFsTGVuZ3RoIiwiV0ZJIiwiV0FSQ1ZTbGFzaCIsIkNvbG9uU3BhY2UiLCJidWZMZW4iLCJidWZzIiwicGFyc2VSZXFIVFRQIiwiY3VycmVudEJ1ZmZlciIsImN1ckxlbiIsInNlcFBvcyIsImhlYWRlclZhbHVlIiwicmhlYWRlciIsInV0ZjhCdWZmZXJTbGljZSIsImJ1ZkVuZFBvc05vQ1JMRiIsIm91dGxpbmsiLCJ1bmtleWVkIiwiaGVhZGVyQnVmZnMiLCJyZXF1ZXN0TGluZSIsImh0dHBWZXJzaW9uIiwic3BhY2VJRFgiLCJsYXN0SURYIiwiX3BhcnNlSGVhZGVycyIsInN0YXR1c0xpbmUiLCJzdGF0dXNSZWFzb24iLCJsYXN0S2V5IiwiZ2V0UG9zdERhdGEiLCJnZXRSZXNCb2R5IiwiY2FwdHVyZXIiLCJ3Y0RlYnVnZ2VyIiwiZ2VuT3B0cyIsIndhcmNPcHRzIiwiaW5pdFdBUkMiLCJ3cml0ZVdhcmNJbmZvUmVjb3JkIiwid3JpdGVXZWJyZWNvcmRlckJvb2ttYXJrc0luZm9SZWNvcmQiLCJpdGVyYXRlUmVxdWVzdHMiLCJnZW5lcmF0ZVdhcmNFbnRyeSIsIm5yZXEiLCJwb3N0IiwiY2FuU2VyaWFsaXplUmVzcG9uc2UiLCJzZXJpYWxpemVSZXNwb25zZUhlYWRlcnMiLCJ3YXNFcnJvciIsInJib2R5IiwiYmFzZTY0RW5jb2RlZCIsIndyaXRlUmVxdWVzdFJlc3BvbnNlUmVjb3JkcyIsInNlcmlhbGl6ZVJlcXVlc3RIZWFkZXJzIiwid3JpdGVSZXF1ZXN0UmVjb3JkIiwibm9ybWFsaXplQXJyYXkiLCJhbGxvd0Fib3ZlUm9vdCIsInNwbGl0UGF0aFJlIiwic3BsaXRQYXRoIiwiZmlsZW5hbWUiLCJmaWx0ZXIiLCJyZXNvbHZlZFBhdGgiLCJyZXNvbHZlZEFic29sdXRlIiwibm9ybWFsaXplIiwidHJhaWxpbmdTbGFzaCIsImZyb21QYXJ0cyIsInRvUGFydHMiLCJzYW1lUGFydHNMZW5ndGgiLCJvdXRwdXRQYXJ0cyIsInNlcCIsImRlbGltaXRlciIsImRpcm5hbWUiLCJleHRuYW1lIiwiZ2V0UmFuZG9tVmFsdWVzIiwiY3J5cHRvIiwibXNDcnlwdG8iLCJybmRzOCIsInJuZHMiLCJieXRlVG9IZXgiLCJidGgiLCJ3YXJjUkUiLCJnemlwcGluZyIsImhhc1dBUkMiLCJoYXNXQVJDR1oiLCJpc0VtcHR5Iiwic2VuZENvbW1hbmQiLCJiYXNlS2V5cyIsImdldFRhZyIsImlzQXJyYXlMaWtlIiwiaXNQcm90b3R5cGUiLCJpc1R5cGVkQXJyYXkiLCJtYXBUYWciLCJzZXRUYWciLCJuYXRpdmVLZXlzIiwib3ZlckFyZyIsIldlYWtNYXAiLCJ0b1NvdXJjZSIsImRhdGFWaWV3Q3RvclN0cmluZyIsIm1hcEN0b3JTdHJpbmciLCJwcm9taXNlQ3RvclN0cmluZyIsInNldEN0b3JTdHJpbmciLCJ3ZWFrTWFwQ3RvclN0cmluZyIsImN0b3JTdHJpbmciLCJnZXROYXRpdmUiLCJpc01hc2tlZCIsInJlSXNIb3N0Q3RvciIsImZ1bmNQcm90byIsInJlSXNOYXRpdmUiLCJuYXRpdmVPYmplY3RUb1N0cmluZyIsImlzT3duIiwidW5tYXNrZWQiLCJ1aWQiLCJjb3JlSnNEYXRhIiwibWFza1NyY0tleSIsIklFX1BST1RPIiwiYmFzZUlzQXJndW1lbnRzIiwiaXNPYmplY3RMaWtlIiwiYXJnc1RhZyIsImlzTGVuZ3RoIiwic3R1YkZhbHNlIiwiZnJlZUV4cG9ydHMiLCJub2RlVHlwZSIsImZyZWVNb2R1bGUiLCJiYXNlSXNUeXBlZEFycmF5IiwiYmFzZVVuYXJ5Iiwibm9kZVV0aWwiLCJub2RlSXNUeXBlZEFycmF5IiwidHlwZWRBcnJheVRhZ3MiLCJmcmVlUHJvY2VzcyIsInR5cGVzIiwicmVxdWlyZSIsIm5ldHdvcmsiLCJnZXRSZXF1ZXN0UG9zdERhdGEiLCJnZXRSZXNwb25zZUJvZHkiLCJjbGllbnQiLCJzZW5kIiwiX1VQIiwicmVxSFRUUCIsInJlc0hUVFAiLCJfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXyIsIm1heEludCIsInRNaW4iLCJ0TWF4Iiwic2tldyIsImRhbXAiLCJpbml0aWFsQmlhcyIsImluaXRpYWxOIiwicmVnZXhQdW55Y29kZSIsInJlZ2V4Tm9uQVNDSUkiLCJyZWdleFNlcGFyYXRvcnMiLCJlcnJvcnMiLCJub3QtYmFzaWMiLCJpbnZhbGlkLWlucHV0IiwiYmFzZU1pbnVzVE1pbiIsInN0cmluZ0Zyb21DaGFyQ29kZSIsIm1hcERvbWFpbiIsInVjczJkZWNvZGUiLCJjb3VudGVyIiwidWNzMmVuY29kZSIsImRpZ2l0VG9CYXNpYyIsImRpZ2l0IiwiYWRhcHQiLCJkZWx0YSIsIm51bVBvaW50cyIsImZpcnN0VGltZSIsImRlY29kZSIsImJhc2ljIiwib2xkaSIsImJhc2VNaW51c1QiLCJpbnB1dExlbmd0aCIsImJpYXMiLCJlbmNvZGUiLCJoYW5kbGVkQ1BDb3VudCIsImJhc2ljTGVuZ3RoIiwiY3VycmVudFZhbHVlIiwiaGFuZGxlZENQQ291bnRQbHVzT25lIiwicU1pbnVzVCIsInVjczIiLCJ0b1VuaWNvZGUiLCJxcyIsImVxIiwibWF4S2V5cyIsImtzdHIiLCJ2c3RyIiwic3RyaW5naWZ5UHJpbWl0aXZlIiwia3MiLCJ0b0FycmF5QnVmZmVyIiwicHJlZmVyQmluYXJ5IiwiX2JvZHkiLCJfaGVhZGVycyIsInNldEhlYWRlciIsInVzZUZldGNoIiwiZGVjaWRlTW9kZSIsIl9mZXRjaFRpbWVyIiwibG93ZXJOYW1lIiwidW5zYWZlSGVhZGVycyIsImdldEhlYWRlciIsInJlbW92ZUhlYWRlciIsImhlYWRlcnNPYmoiLCJoZWFkZXJzTGlzdCIsImtleU5hbWUiLCJzaWduYWwiLCJjb250cm9sbGVyIiwiX2ZldGNoQWJvcnRDb250cm9sbGVyIiwicmVxdWVzdFRpbWVvdXQiLCJjcmVkZW50aWFscyIsIndpdGhDcmVkZW50aWFscyIsIl9jb25uZWN0Iiwib250aW1lb3V0Iiwic2V0UmVxdWVzdEhlYWRlciIsIl9yZXNwb25zZSIsInN0YXR1c1ZhbGlkIiwiZmx1c2hIZWFkZXJzIiwic2V0Tm9EZWxheSIsInNldFNvY2tldEtlZXBBbGl2ZSIsImFycmF5Q29weSIsIjEwMCIsIjEwMSIsIjEwMiIsIjIwMCIsIjIwMSIsIjIwMiIsIjIwMyIsIjIwNCIsIjIwNSIsIjIwNiIsIjIwNyIsIjIwOCIsIjIyNiIsIjMwMCIsIjMwMSIsIjMwMiIsIjMwMyIsIjMwNCIsIjMwNSIsIjMwNyIsIjMwOCIsIjQwMCIsIjQwMSIsIjQwMiIsIjQwMyIsIjQwNCIsIjQwNSIsIjQwNiIsIjQwNyIsIjQwOCIsIjQwOSIsIjQxMCIsIjQxMSIsIjQxMiIsIjQxMyIsIjQxNCIsIjQxNSIsIjQxNiIsIjQxNyIsIjQxOCIsIjQyMSIsIjQyMiIsIjQyMyIsIjQyNCIsIjQyNSIsIjQyNiIsIjQyOCIsIjQyOSIsIjQzMSIsIjQ1MSIsIjUwMCIsIjUwMSIsIjUwMiIsIjUwMyIsIjUwNCIsIjUwNSIsIjUwNiIsIjUwNyIsIjUwOCIsIjUwOSIsIjUxMCIsIjUxMSIsImNyZWF0ZUNvbXBvdW5kZXIiLCJ1cHBlckZpcnN0Iiwid29yZCIsImFycmF5UmVkdWNlIiwiZGVidXJyIiwid29yZHMiLCJyZUFwb3MiLCJhY2N1bXVsYXRvciIsImluaXRBY2N1bSIsImRlYnVyckxldHRlciIsInJlTGF0aW4iLCJyZUNvbWJvTWFyayIsImJhc2VQcm9wZXJ0eU9mIiwiw4AiLCLDgSIsIsOCIiwiw4MiLCLDhCIsIsOFIiwiw6AiLCLDoSIsIsOiIiwiw6MiLCLDpCIsIsOlIiwiw4ciLCLDpyIsIsOQIiwiw7AiLCLDiCIsIsOJIiwiw4oiLCLDiyIsIsOoIiwiw6kiLCLDqiIsIsOrIiwiw4wiLCLDjSIsIsOOIiwiw48iLCLDrCIsIsOtIiwiw64iLCLDryIsIsORIiwiw7EiLCLDkiIsIsOTIiwiw5QiLCLDlSIsIsOWIiwiw5giLCLDsiIsIsOzIiwiw7QiLCLDtSIsIsO2Iiwiw7giLCLDmSIsIsOaIiwiw5siLCLDnCIsIsO5Iiwiw7oiLCLDuyIsIsO8Iiwiw50iLCLDvSIsIsO/Iiwiw4YiLCLDpiIsIsOeIiwiw74iLCLDnyIsIsSAIiwixIIiLCLEhCIsIsSBIiwixIMiLCLEhSIsIsSGIiwixIgiLCLEiiIsIsSMIiwixIciLCLEiSIsIsSLIiwixI0iLCLEjiIsIsSQIiwixI8iLCLEkSIsIsSSIiwixJQiLCLEliIsIsSYIiwixJoiLCLEkyIsIsSVIiwixJciLCLEmSIsIsSbIiwixJwiLCLEniIsIsSgIiwixKIiLCLEnSIsIsSfIiwixKEiLCLEoyIsIsSkIiwixKYiLCLEpSIsIsSnIiwixKgiLCLEqiIsIsSsIiwixK4iLCLEsCIsIsSpIiwixKsiLCLErSIsIsSvIiwixLEiLCLEtCIsIsS1IiwixLYiLCLEtyIsIsS4IiwixLkiLCLEuyIsIsS9IiwixL8iLCLFgSIsIsS6IiwixLwiLCLEviIsIsWAIiwixYIiLCLFgyIsIsWFIiwixYciLCLFiiIsIsWEIiwixYYiLCLFiCIsIsWLIiwixYwiLCLFjiIsIsWQIiwixY0iLCLFjyIsIsWRIiwixZQiLCLFliIsIsWYIiwixZUiLCLFlyIsIsWZIiwixZoiLCLFnCIsIsWeIiwixaAiLCLFmyIsIsWdIiwixZ8iLCLFoSIsIsWiIiwixaQiLCLFpiIsIsWjIiwixaUiLCLFpyIsIsWoIiwixaoiLCLFrCIsIsWuIiwixbAiLCLFsiIsIsWpIiwixasiLCLFrSIsIsWvIiwixbEiLCLFsyIsIsW0IiwixbUiLCLFtiIsIsW3IiwixbgiLCLFuSIsIsW7Iiwixb0iLCLFuiIsIsW8Iiwixb4iLCLEsiIsIsSzIiwixZIiLCLFkyIsIsWJIiwixb8iLCJhcnJheU1hcCIsIklORklOSVRZIiwic3ltYm9sUHJvdG8iLCJzeW1ib2xUb1N0cmluZyIsInN5bWJvbFRhZyIsImFzY2lpV29yZHMiLCJoYXNVbmljb2RlV29yZCIsInVuaWNvZGVXb3JkcyIsInBhdHRlcm4iLCJndWFyZCIsInJlQXNjaWlXb3JkIiwicmVIYXNVbmljb2RlV29yZCIsInJzQnJlYWtSYW5nZSIsInJzTWF0aE9wUmFuZ2UiLCJyc0JyZWFrIiwicnNEaWdpdHMiLCJyc0RpbmdiYXQiLCJyc0xvd2VyIiwicnNNaXNjIiwicnNSZWdpb25hbCIsInJzU3VyclBhaXIiLCJyc1VwcGVyIiwicnNNaXNjTG93ZXIiLCJyc01pc2NVcHBlciIsInJlT3B0TW9kIiwicnNNb2RpZmllciIsInJzU2VxIiwicnNFbW9qaSIsInJlVW5pY29kZVdvcmQiLCJjcmVhdGVDYXNlRmlyc3QiLCJjYXN0U2xpY2UiLCJoYXNVbmljb2RlIiwic3RyaW5nVG9BcnJheSIsIm1ldGhvZE5hbWUiLCJzdHJTeW1ib2xzIiwiY2hyIiwidHJhaWxpbmciLCJiYXNlU2xpY2UiLCJhc2NpaVRvQXJyYXkiLCJ1bmljb2RlVG9BcnJheSIsInJzQXN0cmFsIiwicnNDb21ibyIsInJzRml0eiIsInJzTm9uQXN0cmFsIiwicnNTeW1ib2wiLCJyZVVuaWNvZGUiLCJyZXF1ZXN0TGluZUFuZEhlYWRlcnMiLCJzdGF0dXNMaW5lQW5kSGVhZGVycyIsInJlcXVlc3RFdmVudCIsIl9yZXF1ZXN0QyIsInJlcXVlc3RXaWxsQmVTZW50IiwiYXR0YWNoIiwibWF5YmVOZXR3b3JrTWVzc2FnZSIsInJlc3BvbnNlUmVjZWl2ZWQiLCJjZHBDbGllbnQiLCJyZXNwIiwicGQiLCJ3cml0ZVJlc3BvbnNlUmVjb3JkIl0sIm1hcHBpbmdzIjoiMERBQ0EsSUFBQUEsRUFBQSxHQUdBLFNBQUFDLEVBQUFDLEdBR0EsR0FBQUYsRUFBQUUsR0FDQSxPQUFBRixFQUFBRSxHQUFBQyxRQUdBLElBQUFDLEVBQUFKLEVBQUFFLEdBQUEsQ0FDQUcsRUFBQUgsRUFDQUksR0FBQSxFQUNBSCxRQUFBLElBVUEsT0FOQUksRUFBQUwsR0FBQU0sS0FBQUosRUFBQUQsUUFBQUMsSUFBQUQsUUFBQUYsR0FHQUcsRUFBQUUsR0FBQSxFQUdBRixFQUFBRCxRQTBEQSxPQXJEQUYsRUFBQVEsRUFBQUYsRUFHQU4sRUFBQVMsRUFBQVYsRUFHQUMsRUFBQVUsRUFBQSxTQUFBUixFQUFBUyxFQUFBQyxHQUNBWixFQUFBYSxFQUFBWCxFQUFBUyxJQUNBRyxPQUFBQyxlQUFBYixFQUFBUyxFQUFBLENBQTBDSyxZQUFBLEVBQUFDLElBQUFMLEtBSzFDWixFQUFBa0IsRUFBQSxTQUFBaEIsR0FDQSxvQkFBQWlCLGVBQUFDLGFBQ0FOLE9BQUFDLGVBQUFiLEVBQUFpQixPQUFBQyxZQUFBLENBQXdEQyxNQUFBLFdBRXhEUCxPQUFBQyxlQUFBYixFQUFBLGNBQWlEbUIsT0FBQSxLQVFqRHJCLEVBQUFzQixF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QUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUNBQyxJQUFBLElBQUFDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQ0FDLElBQUEsSUFBQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFDLElBQUEsSUFDQUMsSUFBQSxJQUFBQyxJQUFBLElBQUFD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dHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA2MCk7XG4iLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuLypcbiAqIEV4cG9ydCBrTWF4TGVuZ3RoIGFmdGVyIHR5cGVkIGFycmF5IHN1cHBvcnQgaXMgZGV0ZXJtaW5lZC5cbiAqL1xuZXhwb3J0cy5rTWF4TGVuZ3RoID0ga01heExlbmd0aCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0ge19fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfX1cbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICBpZiAodGhhdCA9PT0gbnVsbCkge1xuICAgICAgdGhhdCA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuICAgIH1cbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aFxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0lmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUodGhpcywgYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKHRoaXMsIGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuLy8gVE9ETzogTGVnYWN5LCBub3QgbmVlZGVkIGFueW1vcmUuIFJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGFyci5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gZnJvbSAodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIHJldHVybiBmcm9tT2JqZWN0KHRoYXQsIHZhbHVlKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKG51bGwsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuc3BlY2llcyAmJlxuICAgICAgQnVmZmVyW1N5bWJvbC5zcGVjaWVzXSA9PT0gQnVmZmVyKSB7XG4gICAgLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywge1xuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAodGhhdCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2MobnVsbCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlICh0aGF0LCBzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICB0aGF0W2ldID0gMFxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJlbmNvZGluZ1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuXG4gIHZhciBhY3R1YWwgPSB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICB0aGF0ID0gdGhhdC5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGFycmF5LmJ5dGVMZW5ndGggLy8gdGhpcyB0aHJvd3MgaWYgYGFycmF5YCBpcyBub3QgYSB2YWxpZCBBcnJheUJ1ZmZlclxuXG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdvZmZzZXRcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ2xlbmd0aFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gYXJyYXlcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdCA9IGZyb21BcnJheUxpa2UodGhhdCwgYXJyYXkpXG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAodGhhdCwgb2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuKVxuXG4gICAgaWYgKHRoYXQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhhdFxuICAgIH1cblxuICAgIG9iai5jb3B5KHRoYXQsIDAsIDAsIGxlbilcbiAgICByZXR1cm4gdGhhdFxuICB9XG5cbiAgaWYgKG9iaikge1xuICAgIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBpc25hbihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicpXG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoKClgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIWlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IHN0cmluZyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHN0cmluZyA9ICcnICsgc3RyaW5nXG4gIH1cblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8IDBcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0ICAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAoaXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJlxuICAgICAgICB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbIHZhbCBdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICB2YXIgaW5kZXhTaXplID0gMVxuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgaVxuICBpZiAoZGlyKSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47ICsraSkge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmIChjb2RlIDwgMjU2KSB7XG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiB1dGY4VG9CeXRlcyhuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGlzbmFuICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBDUkxGID0gJ1xcclxcbidcblxuLyoqXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBDUkxGMnggPSAnXFxyXFxuXFxyXFxuJ1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHJlY29yZFNlcGFyYXRvciA9ICdcXHJcXG5cXHJcXG4nXG5cbi8qKlxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuY29uc3QgV0FSQ1YgPSAnMS4wJ1xuXG4vKipcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IFdBUkNTbGFzaFYgPSBgV0FSQy8ke1dBUkNWfSR7Q1JMRn1gXG5cbi8qKlxuICogQHR5cGUge3t3YXJjaW5mbzogc3RyaW5nLCBtZXRhZGF0YTogc3RyaW5nLCByZXF1ZXN0OiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcsIHJldmlzaXQ6IHN0cmluZywgcmVzb3VyY2U6IHN0cmluZywgY29udmVyc2lvbjogc3RyaW5nLCB1bmtub3duOiBzdHJpbmcsIGNvbnRpbnVhdGlvbjogc3RyaW5nfX1cbiAqL1xuY29uc3QgV0FSQ1R5cGVzID0ge1xuICB3YXJjaW5mbzogJ3dhcmNpbmZvJyxcbiAgbWV0YWRhdGE6ICdtZXRhZGF0YScsXG4gIHJlcXVlc3Q6ICdyZXF1ZXN0JyxcbiAgcmVzcG9uc2U6ICdyZXNwb25zZScsXG4gIHJldmlzaXQ6ICdyZXZpc2l0JyxcbiAgcmVzb3VyY2U6ICdyZXNvdXJjZScsXG4gIGNvbnZlcnNpb246ICdjb252ZXJzaW9uJyxcbiAgdW5rbm93bjogJ3Vua25vd24nLFxuICBjb250aW51YXRpb246ICdjb250aW51YXRpb24nXG59XG5cbmNvbnN0IFdBUkNDb250ZW50VHlwZXMgPSB7XG4gIHdhcmNGaWVsZHM6ICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3dhcmMtZmllbGRzXFxyXFxuJyxcbiAgaHR0cFJlcXVlc3Q6ICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2h0dHA7IG1zZ3R5cGU9cmVxdWVzdFxcclxcbicsXG4gIGh0dHBSZXNwb25zZTogJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vaHR0cDsgbXNndHlwZT1yZXNwb25zZVxcclxcbidcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXVpZFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiByZWNvcmRJZCAodXVpZCkge1xuICByZXR1cm4gYFdBUkMtUmVjb3JkLUlEOiA8dXJuOnV1aWQ6JHt1dWlkfT4ke0NSTEZ9YFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHdhcmNEYXRlIChkYXRlKSB7XG4gIHJldHVybiBgV0FSQy1EYXRlOiAke2RhdGV9JHtDUkxGfWBcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0VVJJXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHdhcmNUYXJnZXRVUkkgKHRhcmdldFVSSSkge1xuICByZXR1cm4gYFdBUkMtVGFyZ2V0LVVSSTogJHt0YXJnZXRVUkl9JHtDUkxGfWBcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB3YXJjVHlwZSAodHlwZSkge1xuICByZXR1cm4gYFdBUkMtVHlwZTogJHt0eXBlfSR7Q1JMRn1gXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbGVOYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHdhcmNGaWxlbmFtZSAoZmlsZU5hbWUpIHtcbiAgcmV0dXJuIGBXQVJDLUZpbGVuYW1lOiAke2ZpbGVOYW1lfSR7Q1JMRn1gXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBjb250ZW50TGVuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHdhcmNDb250ZW50TGVuZ3RoIChjb250ZW50TGVuKSB7XG4gIHJldHVybiBgQ29udGVudC1MZW5ndGg6ICR7Y29udGVudExlbn0ke0NSTEZ9YFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50VHlwZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB3YXJjQ29udGVudFR5cGUgKGNvbnRlbnRUeXBlKSB7XG4gIHJldHVybiBgQ29udGVudC1UeXBlOiAke2NvbnRlbnRUeXBlfSR7Q1JMRn1gXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbmN1cnJlbnRUb1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB3YXJjQ29uY3VycmVudFRvIChjb25jdXJyZW50VG8pIHtcbiAgcmV0dXJuIGBXQVJDLUNvbmN1cnJlbnQtVG86IDx1cm46dXVpZDoke2NvbmN1cnJlbnRUb30+JHtDUkxGfWBcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gd2lkXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHdhcmNXYXJjSW5mb0lkICh3aWQpIHtcbiAgcmV0dXJuIGBXQVJDLVdhcmNpbmZvLUlEOiA8dXJuOnV1aWQ6JHt3aWR9PiR7Q1JMRn1gXG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge09iamVjdH0gcmVxRmllbGRzXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVxRmllbGRzLnJpZFxuICogQHBhcmFtIHtzdHJpbmd9IHJlcUZpZWxkcy5kYXRlXG4gKiBAcGFyYW0ge251bWJlcn0gcmVxRmllbGRzLmxlblxuICogQHBhcmFtIHs/c3RyaW5nfSBbcmVxRmllbGRzLnRhcmdldFVSSV1cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZWRIZWFkZXJGaWVsZHMgKHR5cGUsIHsgcmlkLCBkYXRlLCBsZW4sIHRhcmdldFVSSSB9KSB7XG4gIGlmICh0YXJnZXRVUkkgIT0gbnVsbCkge1xuICAgIHJldHVybiBgJHtXQVJDU2xhc2hWfSR7d2FyY1R5cGUodHlwZSl9JHtyZWNvcmRJZChyaWQpfSR7d2FyY0RhdGUoXG4gICAgICBkYXRlXG4gICAgKX0ke3dhcmNUYXJnZXRVUkkodGFyZ2V0VVJJKX0ke3dhcmNDb250ZW50TGVuZ3RoKGxlbil9YFxuICB9XG4gIHJldHVybiBgJHtXQVJDU2xhc2hWfSR7d2FyY1R5cGUodHlwZSl9JHtyZWNvcmRJZChyaWQpfSR7d2FyY0RhdGUoXG4gICAgZGF0ZVxuICApfSR7d2FyY0NvbnRlbnRMZW5ndGgobGVuKX1gXG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV0FSQ0luZm9IZWFkZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRlIC0gVGhlIGRhdGUgdmFsdWUgZm9yIFdBUkMtRGF0ZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBbZmlsZU5hbWVdIC0gVGhlIG5hbWUgb2YgdGhlIHdhcmMgZmlsZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBbdGFyZ2V0VVJJXSAtIFRoZSB0YXJnZXQgVVJJIGZvciB0aGUgcmVjb3JkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmlkIC0gVGhlIGlkIG9mIHRoZSByZWNvcmRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZW4gLSBUaGUgbGVuZ3RoIG9mIHRoZSByZWNvcmRzIGNvbnRlbnRcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7V0FSQ0luZm9IZWFkZXJ9IGluZm9IZWFkZXJcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gd2FyY0luZm9IZWFkZXIgKGluZm9IZWFkZXIpIHtcbiAgY29uc3QgcmVxdWlyZWQgPSBgJHtyZXF1aXJlZEhlYWRlckZpZWxkcyhXQVJDVHlwZXMud2FyY2luZm8sIGluZm9IZWFkZXIpfSR7XG4gICAgV0FSQ0NvbnRlbnRUeXBlcy53YXJjRmllbGRzXG4gIH1gXG4gIGlmIChpbmZvSGVhZGVyLmZpbGVOYW1lICE9IG51bGwpIHtcbiAgICByZXR1cm4gYCR7cmVxdWlyZWR9JHt3YXJjRmlsZW5hbWUoaW5mb0hlYWRlci5maWxlTmFtZSl9YFxuICB9XG4gIHJldHVybiByZXF1aXJlZFxufVxuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvQ29udGVudFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiB3YXJjSW5mb0NvbnRlbnQgKGluZm9Db250ZW50KSB7XG4gIGNvbnN0IGJhc2UgPSBbYGZvcm1hdDogV0FSQyBGaWxlIEZvcm1hdCAke1dBUkNWfSR7Q1JMRn1gXVxuICBmb3IgKGxldCBrZXkgaW4gaW5mb0NvbnRlbnQpIHtcbiAgICBiYXNlLnB1c2goYCR7a2V5fTogJHtpbmZvQ29udGVudFtrZXldfSR7Q1JMRn1gKVxuICB9XG4gIHJldHVybiBiYXNlLmpvaW4oJycpXG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV0FSQ01ldGFkYXRhSGVhZGVyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0VVJJIC0gVGhlIFVSSSB0aGUgcmVjb3JkcyBhcmUgZm9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbm93IC0gVGhlIGRhdGUgdmFsdWUgZm9yIFdBUkMtRGF0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbmN1cnJlbnRUbyAtIFRoZSByZWNvcmQgaWQgdGhpcyBtZXRhZGF0YSByZWNvcmQgaXMgYXNzb2NpYXRlZCB3aXRoXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmlkIC0gVGhlIHJlY29yZCBpZCBvZiB0aGlzIHJlY29yZFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlbiAtIFRoZSBsZW5ndGggb2YgdGhpcyByZWNvcmRzIGNvbnRlbnRcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gd2lkIC0gVGhlIHJlY29yZCBpZCBvZiB0aGUgV2FyY2luZm8gcmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1dBUkNNZXRhZGF0YUhlYWRlcn0gbWV0YWRhdGFIZWFkZXJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHdhcmNNZXRhZGF0YUhlYWRlciAoeyB0YXJnZXRVUkksIG5vdywgY29uY3VycmVudFRvLCByaWQsIGxlbiwgd2lkIH0pIHtcbiAgY29uc3QgYmFzZSA9IFtcbiAgICByZXF1aXJlZEhlYWRlckZpZWxkcyhXQVJDVHlwZXMubWV0YWRhdGEsIHtcbiAgICAgIGRhdGU6IG5vdyxcbiAgICAgIGxlbixcbiAgICAgIHJpZCxcbiAgICAgIHRhcmdldFVSSVxuICAgIH0pLFxuICAgIFdBUkNDb250ZW50VHlwZXMud2FyY0ZpZWxkc1xuICBdXG4gIGlmIChjb25jdXJyZW50VG8gIT0gbnVsbCkge1xuICAgIGJhc2UucHVzaCh3YXJjQ29uY3VycmVudFRvKGNvbmN1cnJlbnRUbykpXG4gIH1cbiAgaWYgKHdpZCAhPSBudWxsKSB7XG4gICAgYmFzZS5wdXNoKHdhcmNXYXJjSW5mb0lkKHdpZCkpXG4gIH1cbiAgcmV0dXJuIGJhc2Uuam9pbignJylcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXQVJDUmVxdWVzdEhlYWRlclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldFVSSSAtIFRoZSBVUkkgdGhlIHJlY29yZCBpcyBmb3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBub3cgLSBUaGUgZGF0ZSB2YWx1ZSBmb3IgV0FSQy1EYXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29uY3VycmVudFRvIC0gVGhlIHJlY29yZCBpZCBvZiB0aGUgcmVjb3JkIHRoaXMgcmVjb3JkIGFzc29jaWF0ZWQgd2l0aFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJpZCAtIFRoZSByZWNvcmQgaWQgb2YgdGhpcyByZWNvcmRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZW4gLSBUaGUgbGVuZ3RoIG9mIHRoaXMgcmVjb3JkcyBjb250ZW50XG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHdpZCAtIFRoZSByZWNvcmQgaWQgb2YgdGhlIFdhcmNpbmZvIHJlY29yZFxuICovXG5cbi8qKlxuICogQHBhcmFtIHtXQVJDUmVxdWVzdEhlYWRlcn0gcmVxdWVzdEhlYWRlclxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gd2FyY1JlcXVlc3RIZWFkZXIgKHsgdGFyZ2V0VVJJLCBub3csIGNvbmN1cnJlbnRUbywgcmlkLCBsZW4sIHdpZCB9KSB7XG4gIGNvbnN0IGJhc2UgPSBbXG4gICAgcmVxdWlyZWRIZWFkZXJGaWVsZHMoV0FSQ1R5cGVzLnJlcXVlc3QsIHsgZGF0ZTogbm93LCBsZW4sIHJpZCwgdGFyZ2V0VVJJIH0pLFxuICAgIFdBUkNDb250ZW50VHlwZXMuaHR0cFJlcXVlc3RcbiAgXVxuICBpZiAoY29uY3VycmVudFRvICE9IG51bGwpIHtcbiAgICBiYXNlLnB1c2god2FyY0NvbmN1cnJlbnRUbyhjb25jdXJyZW50VG8pKVxuICB9XG4gIGlmICh3aWQgIT0gbnVsbCkge1xuICAgIGJhc2UucHVzaCh3YXJjV2FyY0luZm9JZCh3aWQpKVxuICB9XG4gIHJldHVybiBiYXNlLmpvaW4oJycpXG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV0FSQ1Jlc3BvbnNlSGVhZGVyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0VVJJIC0gVGhlIFVSSSB0aGUgcmVjb3JkIGlzIGZvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5vdyAtIFRoZSBkYXRlIHZhbHVlIGZvciBXQVJDLURhdGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByaWQgLSBUaGUgcmVjb3JkIGlkIG9mIHRoaXMgcmVjb3JkXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVuIC0gVGhlIGxlbmd0aCBvZiB0aGlzIHJlY29yZHMgY29udGVudFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB3aWQgLSBUaGUgcmVjb3JkIGlkIG9mIHRoZSBXYXJjaW5mbyByZWNvcmRcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7V0FSQ1Jlc3BvbnNlSGVhZGVyfSByZXNwb25zZUhlYWRlclxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gd2FyY1Jlc3BvbnNlSGVhZGVyICh7IHRhcmdldFVSSSwgbm93LCByaWQsIGxlbiwgd2lkIH0pIHtcbiAgY29uc3QgYmFzZSA9IFtcbiAgICByZXF1aXJlZEhlYWRlckZpZWxkcyhXQVJDVHlwZXMucmVzcG9uc2UsIHtcbiAgICAgIGRhdGU6IG5vdyxcbiAgICAgIGxlbixcbiAgICAgIHJpZCxcbiAgICAgIHRhcmdldFVSSVxuICAgIH0pLFxuICAgIFdBUkNDb250ZW50VHlwZXMuaHR0cFJlc3BvbnNlXG4gIF1cbiAgaWYgKHdpZCAhPSBudWxsKSB7XG4gICAgYmFzZS5wdXNoKHdhcmNXYXJjSW5mb0lkKHdpZCkpXG4gIH1cbiAgcmV0dXJuIGJhc2Uuam9pbignJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJlcXVpcmVkSGVhZGVyRmllbGRzLFxuICAvKipcbiAgICogQHR5cGUge2Z1bmN0aW9uKGhlYWRlckluZm86IFdBUkNJbmZvSGVhZGVyKTogc3RyaW5nfVxuICAgKi9cbiAgd2FyY0luZm9IZWFkZXIsXG4gIC8qKlxuICAgKiBAdHlwZSB7ZnVuY3Rpb24oaW5mb0NvbnRlbnQ6IE9iamVjdCk6IHN0cmluZ31cbiAgICovXG4gIHdhcmNJbmZvQ29udGVudCxcbiAgLyoqXG4gICAqIEB0eXBlIHtmdW5jdGlvbihyZXFpZXN0RGF0YTogV0FSQ1JlcXVlc3RIZWFkZXIpOiBzdHJpbmd9XG4gICAqL1xuICB3YXJjUmVxdWVzdEhlYWRlcixcbiAgd2FyY1Jlc3BvbnNlSGVhZGVyLFxuICB3YXJjTWV0YWRhdGFIZWFkZXIsXG4gIHJlY29yZFNlcGFyYXRvcixcbiAgQ1JMRixcbiAgQ1JMRjJ4LFxuICBXQVJDVHlwZXMsXG4gIFdBUkNWLFxuICBXQVJDQ29udGVudFR5cGVzXG59XG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcm9vdDtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UsIHRoaXMgY2xhc3Ncbi8vIHByb3RvdHlwYWxseSBpbmhlcml0cyBmcm9tIFJlYWRhYmxlLCBhbmQgdGhlbiBwYXJhc2l0aWNhbGx5IGZyb21cbi8vIFdyaXRhYmxlLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwbmEgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9cmV0dXJuIGtleXM7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gRHVwbGV4O1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV9yZWFkYWJsZScpO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3dyaXRhYmxlJyk7XG5cbnV0aWwuaW5oZXJpdHMoRHVwbGV4LCBSZWFkYWJsZSk7XG5cbntcbiAgLy8gYXZvaWQgc2NvcGUgY3JlZXAsIHRoZSBrZXlzIGFycmF5IGNhbiB0aGVuIGJlIGNvbGxlY3RlZFxuICB2YXIga2V5cyA9IG9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKTtcbiAgZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gICAgdmFyIG1ldGhvZCA9IGtleXNbdl07XG4gICAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pIER1cGxleC5wcm90b3R5cGVbbWV0aG9kXSA9IFdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdO1xuICB9XG59XG5cbmZ1bmN0aW9uIER1cGxleChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSByZXR1cm4gbmV3IER1cGxleChvcHRpb25zKTtcblxuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVhZGFibGUgPT09IGZhbHNlKSB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcblxuICB0aGlzLmFsbG93SGFsZk9wZW4gPSB0cnVlO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmFsbG93SGFsZk9wZW4gPT09IGZhbHNlKSB0aGlzLmFsbG93SGFsZk9wZW4gPSBmYWxzZTtcblxuICB0aGlzLm9uY2UoJ2VuZCcsIG9uZW5kKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gaWYgd2UgYWxsb3cgaGFsZi1vcGVuIHN0YXRlLCBvciBpZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCxcbiAgLy8gdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuYWxsb3dIYWxmT3BlbiB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgcG5hLm5leHRUaWNrKG9uRW5kTlQsIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTtcblxuRHVwbGV4LnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHRoaXMucHVzaChudWxsKTtcbiAgdGhpcy5lbmQoKTtcblxuICBwbmEubmV4dFRpY2soY2IsIGVycik7XG59OyIsImNvbnN0IGZzID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0U3RyZWFtJykuZnM7XG5jb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpXG5jb25zdCBQYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCB1dWlkID0gcmVxdWlyZSgndXVpZC92MScpXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJylcbmNvbnN0IHtcbiAgd2FyY0luZm9IZWFkZXIsXG4gIHdhcmNJbmZvQ29udGVudCxcbiAgd2FyY1JlcXVlc3RIZWFkZXIsXG4gIHdhcmNSZXNwb25zZUhlYWRlcixcbiAgd2FyY01ldGFkYXRhSGVhZGVyLFxuICByZWNvcmRTZXBhcmF0b3IsXG4gIENSTEYsXG4gIENSTEYyeFxufSA9IHJlcXVpcmUoJy4vd2FyY0ZpZWxkcycpXG5jb25zdCBlbnN1cmVXQVJDRmlsZU5hbWUgPSByZXF1aXJlKCcuLi91dGlscy9lbnN1cmVXQVJDRmlsZW5hbWUnKVxuXG4vKipcbiAqIEB0eXBlIHtCdWZmZXJ9XG4gKi9cbmNvbnN0IHJlY29yZFNlcGFyYXRvckJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHJlY29yZFNlcGFyYXRvciwgJ3V0ZjgnKVxuXG4vKipcbiAqIEB0eXBlIHtCdWZmZXJ9XG4gKi9cbmNvbnN0IENSTEZCdWZmZXIgPSBCdWZmZXIuZnJvbShDUkxGLCAndXRmOCcpXG5cbi8qKlxuICogQHR5cGUge251bWJlcn1cbiAqL1xuY29uc3QgV0FSQ1NlcFRTaXplID0gcmVjb3JkU2VwYXJhdG9yQnVmZmVyLmxlbmd0aCArIENSTEZCdWZmZXIubGVuZ3RoXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEBwYXJhbSB7P0J1ZmZlcnw/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+IGV4cG9ydHMuWl9NQVhfV0lORE9XQklUUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHdpbmRvd0JpdHM6ICcgKyBvcHRzLndpbmRvd0JpdHMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLmxldmVsKSB7XG4gICAgaWYgKG9wdHMubGV2ZWwgPCBleHBvcnRzLlpfTUlOX0xFVkVMIHx8IG9wdHMubGV2ZWwgPiBleHBvcnRzLlpfTUFYX0xFVkVMKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29tcHJlc3Npb24gbGV2ZWw6ICcgKyBvcHRzLmxldmVsKTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5tZW1MZXZlbCkge1xuICAgIGlmIChvcHRzLm1lbUxldmVsIDwgZXhwb3J0cy5aX01JTl9NRU1MRVZFTCB8fCBvcHRzLm1lbUxldmVsID4gZXhwb3J0cy5aX01BWF9NRU1MRVZFTCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1lbUxldmVsOiAnICsgb3B0cy5tZW1MZXZlbCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdHMuc3RyYXRlZ3kpIHtcbiAgICBpZiAob3B0cy5zdHJhdGVneSAhPSBleHBvcnRzLlpfRklMVEVSRUQgJiYgb3B0cy5zdHJhdGVneSAhPSBleHBvcnRzLlpfSFVGRk1BTl9PTkxZICYmIG9wdHMuc3RyYXRlZ3kgIT0gZXhwb3J0cy5aX1JMRSAmJiBvcHRzLnN0cmF0ZWd5ICE9IGV4cG9ydHMuWl9GSVhFRCAmJiBvcHRzLnN0cmF0ZWd5ICE9IGV4cG9ydHMuWl9ERUZBVUxUX1NUUkFURUdZKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyYXRlZ3k6ICcgKyBvcHRzLnN0cmF0ZWd5KTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5kaWN0aW9uYXJ5KSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIob3B0cy5kaWN0aW9uYXJ5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRpY3Rpb25hcnk6IGl0IHNob3VsZCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuX2hhbmRsZSA9IG5ldyBiaW5kaW5nLlpsaWIobW9kZSk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLl9oYWRFcnJvciA9IGZhbHNlO1xuICB0aGlzLl9oYW5kbGUub25lcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBlcnJubykge1xuICAgIC8vIHRoZXJlIGlzIG5vIHdheSB0byBjbGVhbmx5IHJlY292ZXIuXG4gICAgLy8gY29udGludWluZyBvbmx5IG9ic2N1cmVzIHByb2JsZW1zLlxuICAgIF9jbG9zZShzZWxmKTtcbiAgICBzZWxmLl9oYWRFcnJvciA9IHRydWU7XG5cbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgZXJyb3IuZXJybm8gPSBlcnJubztcbiAgICBlcnJvci5jb2RlID0gZXhwb3J0cy5jb2Rlc1tlcnJub107XG4gICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgfTtcblxuICB2YXIgbGV2ZWwgPSBleHBvcnRzLlpfREVGQVVMVF9DT01QUkVTU0lPTjtcbiAgaWYgKHR5cGVvZiBvcHRzLmxldmVsID09PSAnbnVtYmVyJykgbGV2ZWwgPSBvcHRzLmxldmVsO1xuXG4gIHZhciBzdHJhdGVneSA9IGV4cG9ydHMuWl9ERUZBVUxUX1NUUkFURUdZO1xuICBpZiAodHlwZW9mIG9wdHMuc3RyYXRlZ3kgPT09ICdudW1iZXInKSBzdHJhdGVneSA9IG9wdHMuc3RyYXRlZ3k7XG5cbiAgdGhpcy5faGFuZGxlLmluaXQob3B0cy53aW5kb3dCaXRzIHx8IGV4cG9ydHMuWl9ERUZBVUxUX1dJTkRPV0JJVFMsIGxldmVsLCBvcHRzLm1lbUxldmVsIHx8IGV4cG9ydHMuWl9ERUZBVUxUX01FTUxFVkVMLCBzdHJhdGVneSwgb3B0cy5kaWN0aW9uYXJ5KTtcblxuICB0aGlzLl9idWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUodGhpcy5fY2h1bmtTaXplKTtcbiAgdGhpcy5fb2Zmc2V0ID0gMDtcbiAgdGhpcy5fbGV2ZWwgPSBsZXZlbDtcbiAgdGhpcy5fc3RyYXRlZ3kgPSBzdHJhdGVneTtcblxuICB0aGlzLm9uY2UoJ2VuZCcsIHRoaXMuY2xvc2UpO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX2Nsb3NlZCcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhX3RoaXMuX2hhbmRsZTtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG51dGlsLmluaGVyaXRzKFpsaWIsIFRyYW5zZm9ybSk7XG5cblpsaWIucHJvdG90eXBlLnBhcmFtcyA9IGZ1bmN0aW9uIChsZXZlbCwgc3RyYXRlZ3ksIGNhbGxiYWNrKSB7XG4gIGlmIChsZXZlbCA8IGV4cG9ydHMuWl9NSU5fTEVWRUwgfHwgbGV2ZWwgPiBleHBvcnRzLlpfTUFYX0xFVkVMKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgY29tcHJlc3Npb24gbGV2ZWw6ICcgKyBsZXZlbCk7XG4gIH1cbiAgaWYgKHN0cmF0ZWd5ICE9IGV4cG9ydHMuWl9GSUxURVJFRCAmJiBzdHJhdGVneSAhPSBleHBvcnRzLlpfSFVGRk1BTl9PTkxZICYmIHN0cmF0ZWd5ICE9IGV4cG9ydHMuWl9STEUgJiYgc3RyYXRlZ3kgIT0gZXhwb3J0cy5aX0ZJWEVEICYmIHN0cmF0ZWd5ICE9IGV4cG9ydHMuWl9ERUZBVUxUX1NUUkFURUdZKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBzdHJhdGVneTogJyArIHN0cmF0ZWd5KTtcbiAgfVxuXG4gIGlmICh0aGlzLl9sZXZlbCAhPT0gbGV2ZWwgfHwgdGhpcy5fc3RyYXRlZ3kgIT09IHN0cmF0ZWd5KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuZmx1c2goYmluZGluZy5aX1NZTkNfRkxVU0gsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydChzZWxmLl9oYW5kbGUsICd6bGliIGJpbmRpbmcgY2xvc2VkJyk7XG4gICAgICBzZWxmLl9oYW5kbGUucGFyYW1zKGxldmVsLCBzdHJhdGVneSk7XG4gICAgICBpZiAoIXNlbGYuX2hhZEVycm9yKSB7XG4gICAgICAgIHNlbGYuX2xldmVsID0gbGV2ZWw7XG4gICAgICAgIHNlbGYuX3N0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4gICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKTtcbiAgfVxufTtcblxuWmxpYi5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIGFzc2VydCh0aGlzLl9oYW5kbGUsICd6bGliIGJpbmRpbmcgY2xvc2VkJyk7XG4gIHJldHVybiB0aGlzLl9oYW5kbGUucmVzZXQoKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIF9mbHVzaCBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlIHRyYW5zZm9ybSBjbGFzcyxcbi8vIGludGVybmFsbHksIHdoZW4gdGhlIGxhc3QgY2h1bmsgaGFzIGJlZW4gd3JpdHRlbi5cblpsaWIucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLl90cmFuc2Zvcm0oQnVmZmVyLmFsbG9jKDApLCAnJywgY2FsbGJhY2spO1xufTtcblxuWmxpYi5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoa2luZCwgY2FsbGJhY2spIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgdmFyIHdzID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGtpbmQgPT09ICdmdW5jdGlvbicgfHwga2luZCA9PT0gdW5kZWZpbmVkICYmICFjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0ga2luZDtcbiAgICBraW5kID0gYmluZGluZy5aX0ZVTExfRkxVU0g7XG4gIH1cblxuICBpZiAod3MuZW5kZWQpIHtcbiAgICBpZiAoY2FsbGJhY2spIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spO1xuICB9IGVsc2UgaWYgKHdzLmVuZGluZykge1xuICAgIGlmIChjYWxsYmFjaykgdGhpcy5vbmNlKCdlbmQnLCBjYWxsYmFjayk7XG4gIH0gZWxzZSBpZiAod3MubmVlZERyYWluKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9uY2UoJ2RyYWluJywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLmZsdXNoKGtpbmQsIGNhbGxiYWNrKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9mbHVzaEZsYWcgPSBraW5kO1xuICAgIHRoaXMud3JpdGUoQnVmZmVyLmFsbG9jKDApLCAnJywgY2FsbGJhY2spO1xuICB9XG59O1xuXG5abGliLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICBfY2xvc2UodGhpcywgY2FsbGJhY2spO1xuICBwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZU5ULCB0aGlzKTtcbn07XG5cbmZ1bmN0aW9uIF9jbG9zZShlbmdpbmUsIGNhbGxiYWNrKSB7XG4gIGlmIChjYWxsYmFjaykgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjayk7XG5cbiAgLy8gQ2FsbGVyIG1heSBpbnZva2UgLmNsb3NlIGFmdGVyIGEgemxpYiBlcnJvciAod2hpY2ggd2lsbCBudWxsIF9oYW5kbGUpLlxuICBpZiAoIWVuZ2luZS5faGFuZGxlKSByZXR1cm47XG5cbiAgZW5naW5lLl9oYW5kbGUuY2xvc2UoKTtcbiAgZW5naW5lLl9oYW5kbGUgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBlbWl0Q2xvc2VOVChzZWxmKSB7XG4gIHNlbGYuZW1pdCgnY2xvc2UnKTtcbn1cblxuWmxpYi5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBmbHVzaEZsYWc7XG4gIHZhciB3cyA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBlbmRpbmcgPSB3cy5lbmRpbmcgfHwgd3MuZW5kZWQ7XG4gIHZhciBsYXN0ID0gZW5kaW5nICYmICghY2h1bmsgfHwgd3MubGVuZ3RoID09PSBjaHVuay5sZW5ndGgpO1xuXG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiAhQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgcmV0dXJuIGNiKG5ldyBFcnJvcignaW52YWxpZCBpbnB1dCcpKTtcblxuICBpZiAoIXRoaXMuX2hhbmRsZSkgcmV0dXJuIGNiKG5ldyBFcnJvcignemxpYiBiaW5kaW5nIGNsb3NlZCcpKTtcblxuICAvLyBJZiBpdCdzIHRoZSBsYXN0IGNodW5rLCBvciBhIGZpbmFsIGZsdXNoLCB3ZSB1c2UgdGhlIFpfRklOSVNIIGZsdXNoIGZsYWdcbiAgLy8gKG9yIHdoYXRldmVyIGZsYWcgd2FzIHByb3ZpZGVkIHVzaW5nIG9wdHMuZmluaXNoRmx1c2gpLlxuICAvLyBJZiBpdCdzIGV4cGxpY2l0bHkgZmx1c2hpbmcgYXQgc29tZSBvdGhlciB0aW1lLCB0aGVuIHdlIHVzZVxuICAvLyBaX0ZVTExfRkxVU0guIE90aGVyd2lzZSwgdXNlIFpfTk9fRkxVU0ggZm9yIG1heGltdW0gY29tcHJlc3Npb25cbiAgLy8gZ29vZG5lc3MuXG4gIGlmIChsYXN0KSBmbHVzaEZsYWcgPSB0aGlzLl9maW5pc2hGbHVzaEZsYWc7ZWxzZSB7XG4gICAgZmx1c2hGbGFnID0gdGhpcy5fZmx1c2hGbGFnO1xuICAgIC8vIG9uY2Ugd2UndmUgZmx1c2hlZCB0aGUgbGFzdCBvZiB0aGUgcXVldWUsIHN0b3AgZmx1c2hpbmcgYW5kXG4gICAgLy8gZ28gYmFjayB0byB0aGUgbm9ybWFsIGJlaGF2aW9yLlxuICAgIGlmIChjaHVuay5sZW5ndGggPj0gd3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9mbHVzaEZsYWcgPSB0aGlzLl9vcHRzLmZsdXNoIHx8IGJpbmRpbmcuWl9OT19GTFVTSDtcbiAgICB9XG4gIH1cblxuICB0aGlzLl9wcm9jZXNzQ2h1bmsoY2h1bmssIGZsdXNoRmxhZywgY2IpO1xufTtcblxuWmxpYi5wcm90b3R5cGUuX3Byb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaywgZmx1c2hGbGFnLCBjYikge1xuICB2YXIgYXZhaWxJbkJlZm9yZSA9IGNodW5rICYmIGNodW5rLmxlbmd0aDtcbiAgdmFyIGF2YWlsT3V0QmVmb3JlID0gdGhpcy5fY2h1bmtTaXplIC0gdGhpcy5fb2Zmc2V0O1xuICB2YXIgaW5PZmYgPSAwO1xuXG4gIHZhciBzZWxmID0gdGhpcztcblxuICB2YXIgYXN5bmMgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbic7XG5cbiAgaWYgKCFhc3luYykge1xuICAgIHZhciBidWZmZXJzID0gW107XG4gICAgdmFyIG5yZWFkID0gMDtcblxuICAgIHZhciBlcnJvcjtcbiAgICB0aGlzLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcikge1xuICAgICAgZXJyb3IgPSBlcjtcbiAgICB9KTtcblxuICAgIGFzc2VydCh0aGlzLl9oYW5kbGUsICd6bGliIGJpbmRpbmcgY2xvc2VkJyk7XG4gICAgZG8ge1xuICAgICAgdmFyIHJlcyA9IHRoaXMuX2hhbmRsZS53cml0ZVN5bmMoZmx1c2hGbGFnLCBjaHVuaywgLy8gaW5cbiAgICAgIGluT2ZmLCAvLyBpbl9vZmZcbiAgICAgIGF2YWlsSW5CZWZvcmUsIC8vIGluX2xlblxuICAgICAgdGhpcy5fYnVmZmVyLCAvLyBvdXRcbiAgICAgIHRoaXMuX29mZnNldCwgLy9vdXRfb2ZmXG4gICAgICBhdmFpbE91dEJlZm9yZSk7IC8vIG91dF9sZW5cbiAgICB9IHdoaWxlICghdGhpcy5faGFkRXJyb3IgJiYgY2FsbGJhY2socmVzWzBdLCByZXNbMV0pKTtcblxuICAgIGlmICh0aGlzLl9oYWRFcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKG5yZWFkID49IGtNYXhMZW5ndGgpIHtcbiAgICAgIF9jbG9zZSh0aGlzKTtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGtSYW5nZUVycm9yTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdmFyIGJ1ZiA9IEJ1ZmZlci5jb25jYXQoYnVmZmVycywgbnJlYWQpO1xuICAgIF9jbG9zZSh0aGlzKTtcblxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICBhc3NlcnQodGhpcy5faGFuZGxlLCAnemxpYiBiaW5kaW5nIGNsb3NlZCcpO1xuICB2YXIgcmVxID0gdGhpcy5faGFuZGxlLndyaXRlKGZsdXNoRmxhZywgY2h1bmssIC8vIGluXG4gIGluT2ZmLCAvLyBpbl9vZmZcbiAgYXZhaWxJbkJlZm9yZSwgLy8gaW5fbGVuXG4gIHRoaXMuX2J1ZmZlciwgLy8gb3V0XG4gIHRoaXMuX29mZnNldCwgLy9vdXRfb2ZmXG4gIGF2YWlsT3V0QmVmb3JlKTsgLy8gb3V0X2xlblxuXG4gIHJlcS5idWZmZXIgPSBjaHVuaztcbiAgcmVxLmNhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgZnVuY3Rpb24gY2FsbGJhY2soYXZhaWxJbkFmdGVyLCBhdmFpbE91dEFmdGVyKSB7XG4gICAgLy8gV2hlbiB0aGUgY2FsbGJhY2sgaXMgdXNlZCBpbiBhbiBhc3luYyB3cml0ZSwgdGhlIGNhbGxiYWNrJ3NcbiAgICAvLyBjb250ZXh0IGlzIHRoZSBgcmVxYCBvYmplY3QgdGhhdCB3YXMgY3JlYXRlZC4gVGhlIHJlcSBvYmplY3RcbiAgICAvLyBpcyA9PT0gdGhpcy5faGFuZGxlLCBhbmQgdGhhdCdzIHdoeSBpdCdzIGltcG9ydGFudCB0byBudWxsXG4gICAgLy8gb3V0IHRoZSB2YWx1ZXMgYWZ0ZXIgdGhleSBhcmUgZG9uZSBiZWluZyB1c2VkLiBgdGhpcy5faGFuZGxlYFxuICAgIC8vIGNhbiBzdGF5IGluIG1lbW9yeSBsb25nZXIgdGhhbiB0aGUgY2FsbGJhY2sgYW5kIGJ1ZmZlciBhcmUgbmVlZGVkLlxuICAgIGlmICh0aGlzKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IG51bGw7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoc2VsZi5faGFkRXJyb3IpIHJldHVybjtcblxuICAgIHZhciBoYXZlID0gYXZhaWxPdXRCZWZvcmUgLSBhdmFpbE91dEFmdGVyO1xuICAgIGFzc2VydChoYXZlID49IDAsICdoYXZlIHNob3VsZCBub3QgZ28gZG93bicpO1xuXG4gICAgaWYgKGhhdmUgPiAwKSB7XG4gICAgICB2YXIgb3V0ID0gc2VsZi5fYnVmZmVyLnNsaWNlKHNlbGYuX29mZnNldCwgc2VsZi5fb2Zmc2V0ICsgaGF2ZSk7XG4gICAgICBzZWxmLl9vZmZzZXQgKz0gaGF2ZTtcbiAgICAgIC8vIHNlcnZlIHNvbWUgb3V0cHV0IHRvIHRoZSBjb25zdW1lci5cbiAgICAgIGlmIChhc3luYykge1xuICAgICAgICBzZWxmLnB1c2gob3V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1ZmZlcnMucHVzaChvdXQpO1xuICAgICAgICBucmVhZCArPSBvdXQubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGV4aGF1c3RlZCB0aGUgb3V0cHV0IGJ1ZmZlciwgb3IgdXNlZCBhbGwgdGhlIGlucHV0IGNyZWF0ZSBhIG5ldyBvbmUuXG4gICAgaWYgKGF2YWlsT3V0QWZ0ZXIgPT09IDAgfHwgc2VsZi5fb2Zmc2V0ID49IHNlbGYuX2NodW5rU2l6ZSkge1xuICAgICAgYXZhaWxPdXRCZWZvcmUgPSBzZWxmLl9jaHVua1NpemU7XG4gICAgICBzZWxmLl9vZmZzZXQgPSAwO1xuICAgICAgc2VsZi5fYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKHNlbGYuX2NodW5rU2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKGF2YWlsT3V0QWZ0ZXIgPT09IDApIHtcbiAgICAgIC8vIE5vdCBhY3R1YWxseSBkb25lLiAgTmVlZCB0byByZXByb2Nlc3MuXG4gICAgICAvLyBBbHNvLCB1cGRhdGUgdGhlIGF2YWlsSW5CZWZvcmUgdG8gdGhlIGF2YWlsSW5BZnRlciB2YWx1ZSxcbiAgICAgIC8vIHNvIHRoYXQgaWYgd2UgaGF2ZSB0byBoaXQgaXQgYSB0aGlyZCAoZm91cnRoLCBldGMuKSB0aW1lLFxuICAgICAgLy8gaXQnbGwgaGF2ZSB0aGUgY29ycmVjdCBieXRlIGNvdW50cy5cbiAgICAgIGluT2ZmICs9IGF2YWlsSW5CZWZvcmUgLSBhdmFpbEluQWZ0ZXI7XG4gICAgICBhdmFpbEluQmVmb3JlID0gYXZhaWxJbkFmdGVyO1xuXG4gICAgICBpZiAoIWFzeW5jKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgdmFyIG5ld1JlcSA9IHNlbGYuX2hhbmRsZS53cml0ZShmbHVzaEZsYWcsIGNodW5rLCBpbk9mZiwgYXZhaWxJbkJlZm9yZSwgc2VsZi5fYnVmZmVyLCBzZWxmLl9vZmZzZXQsIHNlbGYuX2NodW5rU2l6ZSk7XG4gICAgICBuZXdSZXEuY2FsbGJhY2sgPSBjYWxsYmFjazsgLy8gdGhpcyBzYW1lIGZ1bmN0aW9uXG4gICAgICBuZXdSZXEuYnVmZmVyID0gY2h1bms7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFhc3luYykgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gZmluaXNoZWQgd2l0aCB0aGUgY2h1bmsuXG4gICAgY2IoKTtcbiAgfVxufTtcblxudXRpbC5pbmhlcml0cyhEZWZsYXRlLCBabGliKTtcbnV0aWwuaW5oZXJpdHMoSW5mbGF0ZSwgWmxpYik7XG51dGlsLmluaGVyaXRzKEd6aXAsIFpsaWIpO1xudXRpbC5pbmhlcml0cyhHdW56aXAsIFpsaWIpO1xudXRpbC5pbmhlcml0cyhEZWZsYXRlUmF3LCBabGliKTtcbnV0aWwuaW5oZXJpdHMoSW5mbGF0ZVJhdywgWmxpYik7XG51dGlsLmluaGVyaXRzKFVuemlwLCBabGliKTsiLCIndXNlIHN0cmljdCc7XG5cbmlmICghcHJvY2Vzcy52ZXJzaW9uIHx8XG4gICAgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YwLicpID09PSAwIHx8XG4gICAgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLicpID09PSAwICYmIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS44LicpICE9PSAwKSB7XG4gIG1vZHVsZS5leHBvcnRzID0geyBuZXh0VGljazogbmV4dFRpY2sgfTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcHJvY2Vzc1xufVxuXG5mdW5jdGlvbiBuZXh0VGljayhmbiwgYXJnMSwgYXJnMiwgYXJnMykge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJjYWxsYmFja1wiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG4gIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgYXJncywgaTtcbiAgc3dpdGNoIChsZW4pIHtcbiAgY2FzZSAwOlxuICBjYXNlIDE6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZm4pO1xuICBjYXNlIDI6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrT25lKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxKTtcbiAgICB9KTtcbiAgY2FzZSAzOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja1R3bygpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSwgYXJnMik7XG4gICAgfSk7XG4gIGNhc2UgNDpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUaHJlZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgfSk7XG4gIGRlZmF1bHQ6XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gLSAxKTtcbiAgICBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGFyZ3MubGVuZ3RoKSB7XG4gICAgICBhcmdzW2krK10gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGljaygpIHtcbiAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0pO1xuICB9XG59XG5cbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIFRZUEVEX09LID0gICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBVaW50MTZBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyk7XG5cbmZ1bmN0aW9uIF9oYXMob2JqLCBrZXkpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG59XG5cbmV4cG9ydHMuYXNzaWduID0gZnVuY3Rpb24gKG9iaiAvKmZyb20xLCBmcm9tMiwgZnJvbTMsIC4uLiovKSB7XG4gIHZhciBzb3VyY2VzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgd2hpbGUgKHNvdXJjZXMubGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKTtcbiAgICBpZiAoIXNvdXJjZSkgeyBjb250aW51ZTsgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICdtdXN0IGJlIG5vbi1vYmplY3QnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwIGluIHNvdXJjZSkge1xuICAgICAgaWYgKF9oYXMoc291cmNlLCBwKSkge1xuICAgICAgICBvYmpbcF0gPSBzb3VyY2VbcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cblxuLy8gcmVkdWNlIGJ1ZmZlciBzaXplLCBhdm9pZGluZyBtZW0gY29weVxuZXhwb3J0cy5zaHJpbmtCdWYgPSBmdW5jdGlvbiAoYnVmLCBzaXplKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBzaXplKSB7IHJldHVybiBidWY7IH1cbiAgaWYgKGJ1Zi5zdWJhcnJheSkgeyByZXR1cm4gYnVmLnN1YmFycmF5KDAsIHNpemUpOyB9XG4gIGJ1Zi5sZW5ndGggPSBzaXplO1xuICByZXR1cm4gYnVmO1xufTtcblxuXG52YXIgZm5UeXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGlmIChzcmMuc3ViYXJyYXkgJiYgZGVzdC5zdWJhcnJheSkge1xuICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY19vZmZzLCBzcmNfb2ZmcyArIGxlbiksIGRlc3Rfb2Zmcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIHRvIG9yZGluYXJ5IGFycmF5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICAgIH1cbiAgfSxcbiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxuICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbiAoY2h1bmtzKSB7XG4gICAgdmFyIGksIGwsIGxlbiwgcG9zLCBjaHVuaywgcmVzdWx0O1xuXG4gICAgLy8gY2FsY3VsYXRlIGRhdGEgbGVuZ3RoXG4gICAgbGVuID0gMDtcbiAgICBmb3IgKGkgPSAwLCBsID0gY2h1bmtzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgbGVuICs9IGNodW5rc1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gam9pbiBjaHVua3NcbiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgIHBvcyA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNodW5rID0gY2h1bmtzW2ldO1xuICAgICAgcmVzdWx0LnNldChjaHVuaywgcG9zKTtcbiAgICAgIHBvcyArPSBjaHVuay5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxudmFyIGZuVW50eXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGNodW5rcyk7XG4gIH1cbn07XG5cblxuLy8gRW5hYmxlL0Rpc2FibGUgdHlwZWQgYXJyYXlzIHVzZSwgZm9yIHRlc3Rpbmdcbi8vXG5leHBvcnRzLnNldFR5cGVkID0gZnVuY3Rpb24gKG9uKSB7XG4gIGlmIChvbikge1xuICAgIGV4cG9ydHMuQnVmOCAgPSBVaW50OEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBVaW50MTZBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gSW50MzJBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblR5cGVkKTtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gQXJyYXk7XG4gICAgZXhwb3J0cy5CdWYxNiA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMzIgPSBBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblVudHlwZWQpO1xuICB9XG59O1xuXG5leHBvcnRzLnNldFR5cGVkKFRZUEVEX09LKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBwcmVmaXggPSAnfic7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgc3RvcmFnZSBmb3Igb3VyIGBFRWAgb2JqZWN0cy5cbiAqIEFuIGBFdmVudHNgIGluc3RhbmNlIGlzIGEgcGxhaW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRXZlbnRzKCkge31cblxuLy9cbi8vIFdlIHRyeSB0byBub3QgaW5oZXJpdCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC4gSW4gc29tZSBlbmdpbmVzIGNyZWF0aW5nIGFuXG4vLyBpbnN0YW5jZSBpbiB0aGlzIHdheSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCBkaXJlY3RseS5cbi8vIElmIGBPYmplY3QuY3JlYXRlKG51bGwpYCBpcyBub3Qgc3VwcG9ydGVkIHdlIHByZWZpeCB0aGUgZXZlbnQgbmFtZXMgd2l0aCBhXG4vLyBjaGFyYWN0ZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0LWluIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBub3Rcbi8vIG92ZXJyaWRkZW4gb3IgdXNlZCBhcyBhbiBhdHRhY2sgdmVjdG9yLlxuLy9cbmlmIChPYmplY3QuY3JlYXRlKSB7XG4gIEV2ZW50cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vXG4gIC8vIFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgaXMgc3RpbGwgaW5oZXJpdGVkIGluXG4gIC8vIHNvbWUgb2xkIGJyb3dzZXJzIGxpa2UgQW5kcm9pZCA0LCBpUGhvbmUgNS4xLCBPcGVyYSAxMSBhbmQgU2FmYXJpIDUuXG4gIC8vXG4gIGlmICghbmV3IEV2ZW50cygpLl9fcHJvdG9fXykgcHJlZml4ID0gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEVFKGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHRoaXMuZm4gPSBmbjtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5vbmNlID0gb25jZSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gbmV3IEVFKGZuLCBjb250ZXh0IHx8IGVtaXR0ZXIsIG9uY2UpXG4gICAgLCBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0pIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gbGlzdGVuZXIsIGVtaXR0ZXIuX2V2ZW50c0NvdW50Kys7XG4gIGVsc2UgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XS5mbikgZW1pdHRlci5fZXZlbnRzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2UgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBbZW1pdHRlci5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXTtcblxuICByZXR1cm4gZW1pdHRlcjtcbn1cblxuLyoqXG4gKiBDbGVhciBldmVudCBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZ0IFRoZSBFdmVudCBuYW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJFdmVudChlbWl0dGVyLCBldnQpIHtcbiAgaWYgKC0tZW1pdHRlci5fZXZlbnRzQ291bnQgPT09IDApIGVtaXR0ZXIuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgZWxzZSBkZWxldGUgZW1pdHRlci5fZXZlbnRzW2V2dF07XG59XG5cbi8qKlxuICogTWluaW1hbCBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UgdGhhdCBpcyBtb2xkZWQgYWdhaW5zdCB0aGUgTm9kZS5qc1xuICogYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkXG4gKiBsaXN0ZW5lcnMuXG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICB2YXIgbmFtZXMgPSBbXVxuICAgICwgZXZlbnRzXG4gICAgLCBuYW1lO1xuXG4gIGlmICh0aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgcmV0dXJuIG5hbWVzO1xuXG4gIGZvciAobmFtZSBpbiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzKSkge1xuICAgIGlmIChoYXMuY2FsbChldmVudHMsIG5hbWUpKSBuYW1lcy5wdXNoKHByZWZpeCA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lKTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgcmV0dXJuIG5hbWVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV2ZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgaGFuZGxlcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWhhbmRsZXJzKSByZXR1cm4gW107XG4gIGlmIChoYW5kbGVycy5mbikgcmV0dXJuIFtoYW5kbGVycy5mbl07XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGgsIGVlID0gbmV3IEFycmF5KGwpOyBpIDwgbDsgaSsrKSB7XG4gICAgZWVbaV0gPSBoYW5kbGVyc1tpXS5mbjtcbiAgfVxuXG4gIHJldHVybiBlZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIDA7XG4gIGlmIChsaXN0ZW5lcnMuZm4pIHJldHVybiAxO1xuICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQ2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuICAgICwgbGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgYXJnc1xuICAgICwgaTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKGxpc3RlbmVycy5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnMuZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQpLCB0cnVlO1xuICAgICAgY2FzZSAyOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExKSwgdHJ1ZTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIpLCB0cnVlO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMpLCB0cnVlO1xuICAgICAgY2FzZSA1OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCwgYTUpLCB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMuZm4uYXBwbHkobGlzdGVuZXJzLmNvbnRleHQsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAsIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0ZW5lcnNbaV0ub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzW2ldLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDE6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0KTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMik7IGJyZWFrO1xuICAgICAgICBjYXNlIDQ6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIsIGEzKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFhcmdzKSBmb3IgKGogPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmZuLmFwcGx5KGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiBvbihldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZShldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IGhhdmUgdGhpcyBjb250ZXh0LlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIE9ubHkgcmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVycy5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gdGhpcztcbiAgaWYgKCFmbikge1xuICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKFxuICAgICAgbGlzdGVuZXJzLmZuID09PSBmbiAmJlxuICAgICAgKCFvbmNlIHx8IGxpc3RlbmVycy5vbmNlKSAmJlxuICAgICAgKCFjb250ZXh0IHx8IGxpc3RlbmVycy5jb250ZXh0ID09PSBjb250ZXh0KVxuICAgICkge1xuICAgICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMCwgZXZlbnRzID0gW10sIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBsaXN0ZW5lcnNbaV0uZm4gIT09IGZuIHx8XG4gICAgICAgIChvbmNlICYmICFsaXN0ZW5lcnNbaV0ub25jZSkgfHxcbiAgICAgICAgKGNvbnRleHQgJiYgbGlzdGVuZXJzW2ldLmNvbnRleHQgIT09IGNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIFJlc2V0IHRoZSBhcnJheSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycy5cbiAgICAvL1xuICAgIGlmIChldmVudHMubGVuZ3RoKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGV2ZW50cy5sZW5ndGggPT09IDEgPyBldmVudHNbMF0gOiBldmVudHM7XG4gICAgZWxzZSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IFtldmVudF0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQ7XG5cbiAgaWYgKGV2ZW50KSB7XG4gICAgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcbiAgICBpZiAodGhpcy5fZXZlbnRzW2V2dF0pIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vL1xuLy8gQWxpYXMgbWV0aG9kcyBuYW1lcyBiZWNhdXNlIHBlb3BsZSByb2xsIGxpa2UgdGhhdC5cbi8vXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgcHJlZml4LlxuLy9cbkV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuLy9cbi8vIEFsbG93IGBFdmVudEVtaXR0ZXJgIHRvIGJlIGltcG9ydGVkIGFzIG1vZHVsZSBuYW1lc3BhY2UuXG4vL1xuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuLy9cbmlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbn1cbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0TGlrZTtcbiIsImNvbnN0IENhcHR1cmVkUmVxdWVzdCA9IHJlcXVpcmUoJy4vY2FwdHVyZWRSZXF1ZXN0JylcblxuLyoqXG4gKiBDbGFzcyBSZXNwb25zaWJsZSBGb3IgTWFuYWdpbmcgVGhlIENhcHR1cmVkIFJlcXVlc3QgLyBSZXNwb25zZXMgRm9yIEEgUGFnZVxuICovXG5jbGFzcyBSZXF1ZXN0SGFuZGxlciB7XG4gIC8qKlxuICAgKiBAZGVzYyBDcmVhdGUgQSBOZXcgUmVxdWVzdEhhbmRsZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBUbyBDYXB0dXJlIFJlcXVlc3RzIE9yIE5vdCBUbyBDYXB0dXJlIFJlcXVlc3RzXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl9jYXB0dXJlID0gdHJ1ZVxuXG4gICAgLyoqXG4gICAgICogQGRlc2MgQXNzb2NpYXRpb24gT2YgUmVxdWVzdElkcyBUbyBDYXB0dXJlZFJlcXVlc3RzXG4gICAgICogQHR5cGUge01hcDxzdHJpbmcsQ2FwdHVyZWRSZXF1ZXN0Pn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX3JlcXVlc3RzID0gbmV3IE1hcCgpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgU2V0cyBhbiBpbnRlcm5hbCBmbGFnIHRvIGJlZ2luIGNhcHR1cmluZyBuZXR3b3JrIHJlcXVlc3RzLlxuICAgKiBDbGVhcnMgQW55IFByZXZpb3VzbHkgQ2FwdHVyZWQgUmVxdWVzdCBJbmZvcm1hdGlvblxuICAgKi9cbiAgc3RhcnRDYXB0dXJpbmcgKCkge1xuICAgIHRoaXMuX3JlcXVlc3RzLmNsZWFyKClcbiAgICB0aGlzLl9jYXB0dXJlID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFNldHMgYW4gaW50ZXJuYWwgZmxhZyB0byBzdG9wIHRoZSBjYXB0dXJpbmcgbmV0d29yayByZXF1ZXN0c1xuICAgKi9cbiAgc3RvcENhcHR1cmluZyAoKSB7XG4gICAgdGhpcy5fY2FwdHVyZSA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgSGFuZGxlcyBlaXRoZXIgdGhlIE5ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnQgb3IgdGhlIE5ldHdvcmsucmVzcG9uc2VSZWNlaXZlZCBldmVudHNcbiAgICogQHNlZSBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvTmV0d29yay8jZXZlbnQtcmVxdWVzdFdpbGxCZVNlbnRcbiAgICogQHNlZSBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvTmV0d29yay8jZXZlbnQtcmVzcG9uc2VSZWNlaXZlZFxuICAgKiBAcGFyYW0ge09iamVjdH0gaW5mb1xuICAgKi9cbiAgYWRkUmVxdWVzdEluZm8gKGluZm8pIHtcbiAgICBpZiAodGhpcy5fY2FwdHVyZSkge1xuICAgICAgaWYgKHRoaXMuX3JlcXVlc3RzLmhhcyhpbmZvLnJlcXVlc3RJZCkpIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdHMuZ2V0KGluZm8ucmVxdWVzdElkKS5hZGRSZXF1ZXN0SW5mbyhpbmZvKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdHMuc2V0KGluZm8ucmVxdWVzdElkLCBuZXcgQ2FwdHVyZWRSZXF1ZXN0KGluZm8pKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBIYW5kbGVzIHRoZSBOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50IGV2ZW50XG4gICAqIEBzZWUgaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvdG90L05ldHdvcmsvI2V2ZW50LXJlcXVlc3RXaWxsQmVTZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvXG4gICAqL1xuICByZXF1ZXN0V2lsbEJlU2VudCAoaW5mbykge1xuICAgIGlmICh0aGlzLl9jYXB0dXJlKSB7XG4gICAgICBpZiAodGhpcy5fcmVxdWVzdHMuaGFzKGluZm8ucmVxdWVzdElkKSkge1xuICAgICAgICB0aGlzLl9yZXF1ZXN0cy5nZXQoaW5mby5yZXF1ZXN0SWQpLmFkZFJlcXVlc3RJbmZvKGluZm8pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXF1ZXN0cy5zZXQoaW5mby5yZXF1ZXN0SWQsIG5ldyBDYXB0dXJlZFJlcXVlc3QoaW5mbykpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEhhbmRsZXMgdGhlIE5ldHdvcmsucmVzcG9uc2VSZWNlaXZlZCBldmVudFxuICAgKiBAc2VlIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL3RvdC9OZXR3b3JrLyNldmVudC1yZXNwb25zZVJlY2VpdmVkXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvXG4gICAqL1xuICByZXNwb25zZVJlY2VpdmVkIChpbmZvKSB7XG4gICAgaWYgKHRoaXMuX2NhcHR1cmUpIHtcbiAgICAgIGlmICghdGhpcy5fcmVxdWVzdHMuaGFzKGluZm8ucmVxdWVzdElkKSkge1xuICAgICAgICB0aGlzLl9yZXF1ZXN0cy5zZXQoaW5mby5yZXF1ZXN0SWQsIG5ldyBDYXB0dXJlZFJlcXVlc3QoaW5mbykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXF1ZXN0cy5nZXQoaW5mby5yZXF1ZXN0SWQpLmFkZFJlcXVlc3RJbmZvKGluZm8pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWFwL0BAaXRlcmF0b3JcbiAgICogQGRlc2MgR2V0IEFuIEl0ZXJhdG9yIE92ZXIgVGhlIFJlcXVlc3QgSWQsIFJlcXVlc3QgT2JqZWN0IFBhaXJzXG4gICAqIEByZXR1cm5zIHtJdGVyYXRvcn1cbiAgICovXG4gIFtTeW1ib2wuaXRlcmF0b3JdICgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdHNbU3ltYm9sLml0ZXJhdG9yXSgpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgUmVtb3ZlIEFsbCBSZXF1ZXN0c1xuICAgKi9cbiAgY2xlYXIgKCkge1xuICAgIHRoaXMuX3JlcXVlc3RzLmNsZWFyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBEb2VzIFRoZSBJbnRlcmNlcHRvciBIYXZlIFRoZSBSZXF1ZXN0IE9iamVjdCBBc3NvY2lhdGVkIFdpdGggQSBSZXF1ZXN0IElkXG4gICAqIEBwYXJhbSB7IXN0cmluZ30gcmVxdWVzdElkXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaGFzIChyZXF1ZXN0SWQpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdHMuaGFzKHJlcXVlc3RJZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBSZXRyaWV2ZSBUaGUgQ29ycmVzcG9uZGluZyBSZXF1ZXN0IE9iamVjdCBGb3IgQSBSZXF1ZXN0IElkXG4gICAqIEBwYXJhbSB7IXN0cmluZ30gcmVxdWVzdElkXG4gICAqIEByZXR1cm5zIHtDYXB0dXJlZFJlcXVlc3R9XG4gICAqL1xuICBnZXQgKHJlcXVlc3RJZCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0cy5nZXQocmVxdWVzdElkKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBzaXplICgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdHMuc2l6ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEdldCBBbiBJdGVyYXRvciBPdmVyIFRoZSBSZXF1ZXN0IElkLCBSZXF1ZXN0IE9iamVjdCBQYWlyc1xuICAgKiBAcmV0dXJucyB7SXRlcmF0b3J9XG4gICAqL1xuICBlbnRyaWVzICgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdHMuZW50cmllcygpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgR2V0IEFuIEl0ZXJhdG9yIE92ZXIgVGhlIFJlcXVlc3QgSWRzXG4gICAqIEByZXR1cm5zIHtJdGVyYXRvcjxzdHJpbmc+fVxuICAgKi9cbiAga2V5cyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RzLmtleXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEdldCBBbiBJdGVyYXRvciBPdmVyIFRoZSBSZXF1ZXN0IE9iamVjdHNcbiAgICogQHJldHVybnMge0l0ZXJhdG9yPENhcHR1cmVkUmVxdWVzdD59XG4gICAqL1xuICB2YWx1ZXMgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0cy52YWx1ZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEFwcGx5IEFuIEl0ZXJhdGVlIE9uY2UgRm9yIEVhY2ggTWFwcGVkIFJlcXVlc3QgSWQsIFJlcXVlc3QgT2JqZWN0IFBhaXJcbiAgICogQHBhcmFtIHshZnVuY3Rpb259IGl0ZXJhdGVlIHRoZSBmdW5jdGlvbiB0byBiZSBhcHBsaWVkXG4gICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIG9wdGlvbmFsIHRoaXMgYXJndW1lbnRcbiAgICovXG4gIGZvckVhY2ggKGl0ZXJhdGVlLCB0aGlzQXJnKSB7XG4gICAgdGhpcy5fcmVxdWVzdHMuZm9yRWFjaChpdGVyYXRlZSwgdGhpc0FyZylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtJdGVyYXRvcjxDRFBSZXF1ZXN0SW5mbz59XG4gICAqL1xuICAqIGl0ZXJhdGVSZXF1ZXN0cyAoKSB7XG4gICAgZm9yIChsZXQgY3Igb2YgdGhpcy5fcmVxdWVzdHMudmFsdWVzKCkpIHtcbiAgICAgIGZvciAobGV0IHJpIG9mIGNyLnZhbHVlcygpKSB7XG4gICAgICAgIHlpZWxkIHJpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHR5cGUge1JlcXVlc3RIYW5kbGVyfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IFJlcXVlc3RIYW5kbGVyXG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxubW9kdWxlLmV4cG9ydHMgPSBTdHJlYW07XG5cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmluaGVyaXRzKFN0cmVhbSwgRUUpO1xuU3RyZWFtLlJlYWRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLmpzJyk7XG5TdHJlYW0uV3JpdGFibGUgPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vd3JpdGFibGUuanMnKTtcblN0cmVhbS5EdXBsZXggPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vZHVwbGV4LmpzJyk7XG5TdHJlYW0uVHJhbnNmb3JtID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3RyYW5zZm9ybS5qcycpO1xuU3RyZWFtLlBhc3NUaHJvdWdoID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3Bhc3N0aHJvdWdoLmpzJyk7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuNC54XG5TdHJlYW0uU3RyZWFtID0gU3RyZWFtO1xuXG5cblxuLy8gb2xkLXN0eWxlIHN0cmVhbXMuICBOb3RlIHRoYXQgdGhlIHBpcGUgbWV0aG9kICh0aGUgb25seSByZWxldmFudFxuLy8gcGFydCBvZiB0aGlzIGNsYXNzKSBpcyBvdmVycmlkZGVuIGluIHRoZSBSZWFkYWJsZSBjbGFzcy5cblxuZnVuY3Rpb24gU3RyZWFtKCkge1xuICBFRS5jYWxsKHRoaXMpO1xufVxuXG5TdHJlYW0ucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBvcHRpb25zKSB7XG4gIHZhciBzb3VyY2UgPSB0aGlzO1xuXG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGlmIChkZXN0LndyaXRhYmxlKSB7XG4gICAgICBpZiAoZmFsc2UgPT09IGRlc3Qud3JpdGUoY2h1bmspICYmIHNvdXJjZS5wYXVzZSkge1xuICAgICAgICBzb3VyY2UucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzb3VyY2Uub24oJ2RhdGEnLCBvbmRhdGEpO1xuXG4gIGZ1bmN0aW9uIG9uZHJhaW4oKSB7XG4gICAgaWYgKHNvdXJjZS5yZWFkYWJsZSAmJiBzb3VyY2UucmVzdW1lKSB7XG4gICAgICBzb3VyY2UucmVzdW1lKCk7XG4gICAgfVxuICB9XG5cbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICAvLyBJZiB0aGUgJ2VuZCcgb3B0aW9uIGlzIG5vdCBzdXBwbGllZCwgZGVzdC5lbmQoKSB3aWxsIGJlIGNhbGxlZCB3aGVuXG4gIC8vIHNvdXJjZSBnZXRzIHRoZSAnZW5kJyBvciAnY2xvc2UnIGV2ZW50cy4gIE9ubHkgZGVzdC5lbmQoKSBvbmNlLlxuICBpZiAoIWRlc3QuX2lzU3RkaW8gJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMuZW5kICE9PSBmYWxzZSkpIHtcbiAgICBzb3VyY2Uub24oJ2VuZCcsIG9uZW5kKTtcbiAgICBzb3VyY2Uub24oJ2Nsb3NlJywgb25jbG9zZSk7XG4gIH1cblxuICB2YXIgZGlkT25FbmQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBpZiAoZGlkT25FbmQpIHJldHVybjtcbiAgICBkaWRPbkVuZCA9IHRydWU7XG5cbiAgICBpZiAodHlwZW9mIGRlc3QuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgZGVzdC5kZXN0cm95KCk7XG4gIH1cblxuICAvLyBkb24ndCBsZWF2ZSBkYW5nbGluZyBwaXBlcyB3aGVuIHRoZXJlIGFyZSBlcnJvcnMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBjbGVhbnVwKCk7XG4gICAgaWYgKEVFLmxpc3RlbmVyQ291bnQodGhpcywgJ2Vycm9yJykgPT09IDApIHtcbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgc3RyZWFtIGVycm9yIGluIHBpcGUuXG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuICBkZXN0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIHJlbW92ZSBhbGwgdGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKTtcblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG4gIH1cblxuICBzb3VyY2Uub24oJ2VuZCcsIGNsZWFudXApO1xuICBzb3VyY2Uub24oJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgZGVzdC5vbignY2xvc2UnLCBjbGVhbnVwKTtcblxuICBkZXN0LmVtaXQoJ3BpcGUnLCBzb3VyY2UpO1xuXG4gIC8vIEFsbG93IGZvciB1bml4LWxpa2UgdXNhZ2U6IEEucGlwZShCKS5waXBlKEMpXG4gIHJldHVybiBkZXN0O1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnID8gUmVmbGVjdCA6IG51bGxcbnZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nXG4gID8gUi5hcHBseVxuICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpO1xuICB9XG5cbnZhciBSZWZsZWN0T3duS2V5c1xuaWYgKFIgJiYgdHlwZW9mIFIub3duS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICBSZWZsZWN0T3duS2V5cyA9IFIub3duS2V5c1xufSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldClcbiAgICAgIC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKTtcbiAgfTtcbn0gZWxzZSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFByb2Nlc3NFbWl0V2FybmluZyh3YXJuaW5nKSB7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKHdhcm5pbmcpO1xufVxuXG52YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG52YXIgZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRFbWl0dGVyLCAnZGVmYXVsdE1heExpc3RlbmVycycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGVmYXVsdE1heExpc3RlbmVycztcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ251bWJlcicgfHwgYXJnIDwgMCB8fCBOdW1iZXJJc05hTihhcmcpKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBhcmcgKyAnLicpO1xuICAgIH1cbiAgICBkZWZhdWx0TWF4TGlzdGVuZXJzID0gYXJnO1xuICB9XG59KTtcblxuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbigpIHtcblxuICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHtcbiAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59O1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBzZXRNYXhMaXN0ZW5lcnMobikge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPCAwIHx8IE51bWJlcklzTmFOKG4pKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcIm5cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgbiArICcuJyk7XG4gIH1cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiAkZ2V0TWF4TGlzdGVuZXJzKHRoYXQpIHtcbiAgaWYgKHRoYXQuX21heExpc3RlbmVycyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgcmV0dXJuIHRoYXQuX21heExpc3RlbmVycztcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7XG4gIHJldHVybiAkZ2V0TWF4TGlzdGVuZXJzKHRoaXMpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdCh0eXBlKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgdmFyIGRvRXJyb3IgPSAodHlwZSA9PT0gJ2Vycm9yJyk7XG5cbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKVxuICAgIGRvRXJyb3IgPSAoZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT09IHVuZGVmaW5lZCk7XG4gIGVsc2UgaWYgKCFkb0Vycm9yKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgdmFyIGVyO1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApXG4gICAgICBlciA9IGFyZ3NbMF07XG4gICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvd1xuICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi5cbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH1cbiAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7XG4gICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IGV2ZW50c1t0eXBlXTtcblxuICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuXG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgfVxuXG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGFyZ2V0Ll9ldmVudHNDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gICAgaWYgKGV2ZW50cy5uZXdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICAgICsrdGFyZ2V0Ll9ldmVudHNDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID1cbiAgICAgICAgcHJlcGVuZCA/IFtsaXN0ZW5lciwgZXhpc3RpbmddIDogW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgfSBlbHNlIGlmIChwcmVwZW5kKSB7XG4gICAgICBleGlzdGluZy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgICBtID0gJGdldE1heExpc3RlbmVycyh0YXJnZXQpO1xuICAgIGlmIChtID4gMCAmJiBleGlzdGluZy5sZW5ndGggPiBtICYmICFleGlzdGluZy53YXJuZWQpIHtcbiAgICAgIGV4aXN0aW5nLndhcm5lZCA9IHRydWU7XG4gICAgICAvLyBObyBlcnJvciBjb2RlIGZvciB0aGlzIHNpbmNlIGl0IGlzIGEgV2FybmluZ1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICB2YXIgdyA9IG5ldyBFcnJvcignUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcubGVuZ3RoICsgJyAnICsgU3RyaW5nKHR5cGUpICsgJyBsaXN0ZW5lcnMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNyZWFzZSBsaW1pdCcpO1xuICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICB3LmVtaXR0ZXIgPSB0YXJnZXQ7XG4gICAgICB3LnR5cGUgPSB0eXBlO1xuICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgIFByb2Nlc3NFbWl0V2FybmluZyh3KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH07XG5cbmZ1bmN0aW9uIG9uY2VXcmFwcGVyKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIGlmICghdGhpcy5maXJlZCkge1xuICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pO1xuICAgIHRoaXMuZmlyZWQgPSB0cnVlO1xuICAgIFJlZmxlY3RBcHBseSh0aGlzLmxpc3RlbmVyLCB0aGlzLnRhcmdldCwgYXJncyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX29uY2VXcmFwKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIHN0YXRlID0geyBmaXJlZDogZmFsc2UsIHdyYXBGbjogdW5kZWZpbmVkLCB0YXJnZXQ6IHRhcmdldCwgdHlwZTogdHlwZSwgbGlzdGVuZXI6IGxpc3RlbmVyIH07XG4gIHZhciB3cmFwcGVkID0gb25jZVdyYXBwZXIuYmluZChzdGF0ZSk7XG4gIHdyYXBwZWQubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgc3RhdGUud3JhcEZuID0gd3JhcHBlZDtcbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpO1xuICB9XG4gIHRoaXMub24odHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBsaXN0ID0gZXZlbnRzW3R5cGVdO1xuICAgICAgaWYgKGxpc3QgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcG9zaXRpb24gPSAtMTtcblxuICAgICAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8IGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICBldmVudHNbdHlwZV0gPSBsaXN0WzBdO1xuXG4gICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgb3JpZ2luYWxMaXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzLCBldmVudHMsIGk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c1t0eXBlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhldmVudHMpO1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gICAgICB9IGVsc2UgaWYgKGxpc3RlbmVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIExJRk8gb3JkZXJcbiAgICAgICAgZm9yIChpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbmZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHtcbiAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG4gIGlmIChldmxpc3RlbmVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIHVud3JhcCA/XG4gICAgdW53cmFwTGlzdGVuZXJzKGV2bGlzdGVuZXIpIDogYXJyYXlDbG9uZShldmxpc3RlbmVyLCBldmxpc3RlbmVyLmxlbmd0aCk7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgdHJ1ZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIubGlzdGVuZXJDb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyQ291bnQuY2FsbChlbWl0dGVyLCB0eXBlKTtcbiAgfVxufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gbGlzdGVuZXJDb3VudDtcbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2UgaWYgKGV2bGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdO1xufTtcblxuZnVuY3Rpb24gYXJyYXlDbG9uZShhcnIsIG4pIHtcbiAgdmFyIGNvcHkgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKVxuICAgIGNvcHlbaV0gPSBhcnJbaV07XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHtcbiAgZm9yICg7IGluZGV4ICsgMSA8IGxpc3QubGVuZ3RoOyBpbmRleCsrKVxuICAgIGxpc3RbaW5kZXhdID0gbGlzdFtpbmRleCArIDFdO1xuICBsaXN0LnBvcCgpO1xufVxuXG5mdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7XG4gICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIEEgYml0IHNpbXBsZXIgdGhhbiByZWFkYWJsZSBzdHJlYW1zLlxuLy8gSW1wbGVtZW50IGFuIGFzeW5jIC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYiksIGFuZCBpdCdsbCBoYW5kbGUgYWxsXG4vLyB0aGUgZHJhaW4gZXZlbnQgZW1pc3Npb24gYW5kIGJ1ZmZlcmluZy5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgcG5hID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdyaXRhYmxlO1xuXG4vKiA8cmVwbGFjZW1lbnQ+ICovXG5mdW5jdGlvbiBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB0aGlzLmNhbGxiYWNrID0gY2I7XG4gIHRoaXMubmV4dCA9IG51bGw7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG4gIHRoaXMuZmluaXNoID0gZnVuY3Rpb24gKCkge1xuICAgIG9uQ29ya2VkRmluaXNoKF90aGlzLCBzdGF0ZSk7XG4gIH07XG59XG4vKiA8L3JlcGxhY2VtZW50PiAqL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGFzeW5jV3JpdGUgPSAhcHJvY2Vzcy5icm93c2VyICYmIFsndjAuMTAnLCAndjAuOS4nXS5pbmRleE9mKHByb2Nlc3MudmVyc2lvbi5zbGljZSgwLCA1KSkgPiAtMSA/IHNldEltbWVkaWF0ZSA6IHBuYS5uZXh0VGljaztcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIER1cGxleDtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBPdXJVaW50OEFycmF5ID0gZ2xvYmFsLlVpbnQ4QXJyYXkgfHwgZnVuY3Rpb24gKCkge307XG5mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuayk7XG59XG5mdW5jdGlvbiBfaXNVaW50OEFycmF5KG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheTtcbn1cblxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0uXG4gIC8vIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgcmVhZGFibGVYWFggYW5kIHdyaXRhYmxlWFhYLlxuICB2YXIgaXNEdXBsZXggPSBzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXg7XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIHdyaXRhYmxlSHdtID0gb3B0aW9ucy53cml0YWJsZUhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG5cbiAgaWYgKGh3bSB8fCBod20gPT09IDApIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bTtlbHNlIGlmIChpc0R1cGxleCAmJiAod3JpdGFibGVId20gfHwgd3JpdGFibGVId20gPT09IDApKSB0aGlzLmhpZ2hXYXRlck1hcmsgPSB3cml0YWJsZUh3bTtlbHNlIHRoaXMuaGlnaFdhdGVyTWFyayA9IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBNYXRoLmZsb29yKHRoaXMuaGlnaFdhdGVyTWFyayk7XG5cbiAgLy8gaWYgX2ZpbmFsIGhhcyBiZWVuIGNhbGxlZFxuICB0aGlzLmZpbmFsQ2FsbGVkID0gZmFsc2U7XG5cbiAgLy8gZHJhaW4gZXZlbnQgZmxhZy5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gaGFzIGl0IGJlZW4gZGVzdHJveWVkXG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gdHJ1ZSBhbGwgd3JpdGVzIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgLnVuY29yaygpIGNhbGxcbiAgdGhpcy5jb3JrZWQgPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24gKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcblxuICAvLyBudW1iZXIgb2YgcGVuZGluZyB1c2VyLXN1cHBsaWVkIHdyaXRlIGNhbGxiYWNrc1xuICAvLyB0aGlzIG11c3QgYmUgMCBiZWZvcmUgJ2ZpbmlzaCcgY2FuIGJlIGVtaXR0ZWRcbiAgdGhpcy5wZW5kaW5nY2IgPSAwO1xuXG4gIC8vIGVtaXQgcHJlZmluaXNoIGlmIHRoZSBvbmx5IHRoaW5nIHdlJ3JlIHdhaXRpbmcgZm9yIGlzIF93cml0ZSBjYnNcbiAgLy8gVGhpcyBpcyByZWxldmFudCBmb3Igc3luY2hyb25vdXMgVHJhbnNmb3JtIHN0cmVhbXNcbiAgdGhpcy5wcmVmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG5cbiAgLy8gY291bnQgYnVmZmVyZWQgcmVxdWVzdHNcbiAgdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG5cbiAgLy8gYWxsb2NhdGUgdGhlIGZpcnN0IENvcmtlZFJlcXVlc3QsIHRoZXJlIGlzIGFsd2F5c1xuICAvLyBvbmUgYWxsb2NhdGVkIGFuZCBmcmVlIHRvIHVzZSwgYW5kIHdlIG1haW50YWluIGF0IG1vc3QgdHdvXG4gIHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3QodGhpcyk7XG59XG5cbldyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uIGdldEJ1ZmZlcigpIHtcbiAgdmFyIGN1cnJlbnQgPSB0aGlzLmJ1ZmZlcmVkUmVxdWVzdDtcbiAgdmFyIG91dCA9IFtdO1xuICB3aGlsZSAoY3VycmVudCkge1xuICAgIG91dC5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn07XG5cbihmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLCAnYnVmZmVyJywge1xuICAgICAgZ2V0OiBpbnRlcm5hbFV0aWwuZGVwcmVjYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCk7XG4gICAgICB9LCAnX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgJyArICdpbnN0ZWFkLicsICdERVAwMDAzJylcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge31cbn0pKCk7XG5cbi8vIFRlc3QgX3dyaXRhYmxlU3RhdGUgZm9yIGluaGVyaXRhbmNlIHRvIGFjY291bnQgZm9yIER1cGxleCBzdHJlYW1zLFxuLy8gd2hvc2UgcHJvdG90eXBlIGNoYWluIG9ubHkgcG9pbnRzIHRvIFJlYWRhYmxlLlxudmFyIHJlYWxIYXNJbnN0YW5jZTtcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5oYXNJbnN0YW5jZSAmJiB0eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgcmVhbEhhc0luc3RhbmNlID0gRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZSwgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgIGlmIChyZWFsSGFzSW5zdGFuY2UuY2FsbCh0aGlzLCBvYmplY3QpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh0aGlzICE9PSBXcml0YWJsZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIFdyaXRhYmxlU3RhdGU7XG4gICAgfVxuICB9KTtcbn0gZWxzZSB7XG4gIHJlYWxIYXNJbnN0YW5jZSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIC8vIFdyaXRhYmxlIGN0b3IgaXMgYXBwbGllZCB0byBEdXBsZXhlcywgdG9vLlxuICAvLyBgcmVhbEhhc0luc3RhbmNlYCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB1c2luZyBwbGFpbiBgaW5zdGFuY2VvZmBcbiAgLy8gd291bGQgcmV0dXJuIGZhbHNlLCBhcyBubyBgX3dyaXRhYmxlU3RhdGVgIHByb3BlcnR5IGlzIGF0dGFjaGVkLlxuXG4gIC8vIFRyeWluZyB0byB1c2UgdGhlIGN1c3RvbSBgaW5zdGFuY2VvZmAgZm9yIFdyaXRhYmxlIGhlcmUgd2lsbCBhbHNvIGJyZWFrIHRoZVxuICAvLyBOb2RlLmpzIExhenlUcmFuc2Zvcm0gaW1wbGVtZW50YXRpb24sIHdoaWNoIGhhcyBhIG5vbi10cml2aWFsIGdldHRlciBmb3JcbiAgLy8gYF93cml0YWJsZVN0YXRlYCB0aGF0IHdvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICBpZiAoIXJlYWxIYXNJbnN0YW5jZS5jYWxsKFdyaXRhYmxlLCB0aGlzKSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSB7XG4gICAgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcbiAgfVxuXG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBuZXcgV3JpdGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3kuXG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRlID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZSA9IG9wdGlvbnMud3JpdGU7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGV2ID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZXYgPSBvcHRpb25zLndyaXRldjtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbmFsID09PSAnZnVuY3Rpb24nKSB0aGlzLl9maW5hbCA9IG9wdGlvbnMuZmluYWw7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnKSk7XG59O1xuXG5mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSwgY2IpIHtcbiAgdmFyIGVyID0gbmV3IEVycm9yKCd3cml0ZSBhZnRlciBlbmQnKTtcbiAgLy8gVE9ETzogZGVmZXIgZXJyb3IgZXZlbnRzIGNvbnNpc3RlbnRseSBldmVyeXdoZXJlLCBub3QganVzdCB0aGUgY2JcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICBwbmEubmV4dFRpY2soY2IsIGVyKTtcbn1cblxuLy8gQ2hlY2tzIHRoYXQgYSB1c2VyLXN1cHBsaWVkIGNodW5rIGlzIHZhbGlkLCBlc3BlY2lhbGx5IGZvciB0aGUgcGFydGljdWxhclxuLy8gbW9kZSB0aGUgc3RyZWFtIGlzIGluLiBDdXJyZW50bHkgdGhpcyBtZWFucyB0aGF0IGBudWxsYCBpcyBuZXZlciBhY2NlcHRlZFxuLy8gYW5kIHVuZGVmaW5lZC9ub24tc3RyaW5nIHZhbHVlcyBhcmUgb25seSBhbGxvd2VkIGluIG9iamVjdCBtb2RlLlxuZnVuY3Rpb24gdmFsaWRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgY2IpIHtcbiAgdmFyIHZhbGlkID0gdHJ1ZTtcbiAgdmFyIGVyID0gZmFsc2U7XG5cbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbScpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICBwbmEubmV4dFRpY2soY2IsIGVyKTtcbiAgICB2YWxpZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiB2YWxpZDtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuICB2YXIgaXNCdWYgPSAhc3RhdGUub2JqZWN0TW9kZSAmJiBfaXNVaW50OEFycmF5KGNodW5rKTtcblxuICBpZiAoaXNCdWYgJiYgIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICBjaHVuayA9IF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGlzQnVmKSBlbmNvZGluZyA9ICdidWZmZXInO2Vsc2UgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG5cbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3A7XG5cbiAgaWYgKHN0YXRlLmVuZGVkKSB3cml0ZUFmdGVyRW5kKHRoaXMsIGNiKTtlbHNlIGlmIChpc0J1ZiB8fCB2YWxpZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgY2IpKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgcmV0ID0gd3JpdGVPckJ1ZmZlcih0aGlzLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG5cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgLy8gbm9kZTo6UGFyc2VFbmNvZGluZygpIHJlcXVpcmVzIGxvd2VyIGNhc2UuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghKFsnaGV4JywgJ3V0ZjgnLCAndXRmLTgnLCAnYXNjaWknLCAnYmluYXJ5JywgJ2Jhc2U2NCcsICd1Y3MyJywgJ3Vjcy0yJywgJ3V0ZjE2bGUnLCAndXRmLTE2bGUnLCAncmF3J10uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZykge1xuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgc3RhdGUuZGVjb2RlU3RyaW5ncyAhPT0gZmFsc2UgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgfVxuICByZXR1cm4gY2h1bms7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBpc0J1ZiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBpZiAoIWlzQnVmKSB7XG4gICAgdmFyIG5ld0NodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG4gICAgaWYgKGNodW5rICE9PSBuZXdDaHVuaykge1xuICAgICAgaXNCdWYgPSB0cnVlO1xuICAgICAgZW5jb2RpbmcgPSAnYnVmZmVyJztcbiAgICAgIGNodW5rID0gbmV3Q2h1bms7XG4gICAgfVxuICB9XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG5cbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKSB7XG4gICAgdmFyIGxhc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSB7XG4gICAgICBjaHVuazogY2h1bmssXG4gICAgICBlbmNvZGluZzogZW5jb2RpbmcsXG4gICAgICBpc0J1ZjogaXNCdWYsXG4gICAgICBjYWxsYmFjazogY2IsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcbiAgICBpZiAobGFzdCkge1xuICAgICAgbGFzdC5uZXh0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgKz0gMTtcbiAgfSBlbHNlIHtcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlbjtcbiAgc3RhdGUud3JpdGVjYiA9IGNiO1xuICBzdGF0ZS53cml0aW5nID0gdHJ1ZTtcbiAgc3RhdGUuc3luYyA9IHRydWU7XG4gIGlmICh3cml0ZXYpIHN0cmVhbS5fd3JpdGV2KGNodW5rLCBzdGF0ZS5vbndyaXRlKTtlbHNlIHN0cmVhbS5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBzdGF0ZS5vbndyaXRlKTtcbiAgc3RhdGUuc3luYyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKSB7XG4gIC0tc3RhdGUucGVuZGluZ2NiO1xuXG4gIGlmIChzeW5jKSB7XG4gICAgLy8gZGVmZXIgdGhlIGNhbGxiYWNrIGlmIHdlIGFyZSBiZWluZyBjYWxsZWQgc3luY2hyb25vdXNseVxuICAgIC8vIHRvIGF2b2lkIHBpbGluZyB1cCB0aGluZ3Mgb24gdGhlIHN0YWNrXG4gICAgcG5hLm5leHRUaWNrKGNiLCBlcik7XG4gICAgLy8gdGhpcyBjYW4gZW1pdCBmaW5pc2gsIGFuZCBpdCB3aWxsIGFsd2F5cyBoYXBwZW5cbiAgICAvLyBhZnRlciBlcnJvclxuICAgIHBuYS5uZXh0VGljayhmaW5pc2hNYXliZSwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9IGVsc2Uge1xuICAgIC8vIHRoZSBjYWxsZXIgZXhwZWN0IHRoaXMgdG8gaGFwcGVuIGJlZm9yZSBpZlxuICAgIC8vIGl0IGlzIGFzeW5jXG4gICAgY2IoZXIpO1xuICAgIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICAvLyB0aGlzIGNhbiBlbWl0IGZpbmlzaCwgYnV0IGZpbmlzaCBtdXN0XG4gICAgLy8gYWx3YXlzIGZvbGxvdyBlcnJvclxuICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuXG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG5cbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8qPHJlcGxhY2VtZW50PiovXG4gICAgICBhc3luY1dyaXRlKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICAvKjwvcmVwbGFjZW1lbnQ+Ki9cbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYikge1xuICBpZiAoIWZpbmlzaGVkKSBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSk7XG4gIHN0YXRlLnBlbmRpbmdjYi0tO1xuICBjYigpO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuLy8gTXVzdCBmb3JjZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gbmV4dFRpY2ssIHNvIHRoYXQgd2UgZG9uJ3Rcbi8vIGVtaXQgJ2RyYWluJyBiZWZvcmUgdGhlIHdyaXRlKCkgY29uc3VtZXIgZ2V0cyB0aGUgJ2ZhbHNlJyByZXR1cm5cbi8vIHZhbHVlLCBhbmQgaGFzIGEgY2hhbmNlIHRvIGF0dGFjaCBhICdkcmFpbicgbGlzdGVuZXIuXG5mdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpO1xuICB9XG59XG5cbi8vIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGluIHRoZSBidWZmZXIgd2FpdGluZywgdGhlbiBwcm9jZXNzIGl0XG5mdW5jdGlvbiBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKSB7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSB0cnVlO1xuICB2YXIgZW50cnkgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3Q7XG5cbiAgaWYgKHN0cmVhbS5fd3JpdGV2ICYmIGVudHJ5ICYmIGVudHJ5Lm5leHQpIHtcbiAgICAvLyBGYXN0IGNhc2UsIHdyaXRlIGV2ZXJ5dGhpbmcgdXNpbmcgX3dyaXRldigpXG4gICAgdmFyIGwgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudDtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KGwpO1xuICAgIHZhciBob2xkZXIgPSBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7XG4gICAgaG9sZGVyLmVudHJ5ID0gZW50cnk7XG5cbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHZhciBhbGxCdWZmZXJzID0gdHJ1ZTtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGlmICghZW50cnkuaXNCdWYpIGFsbEJ1ZmZlcnMgPSBmYWxzZTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuICAgIGJ1ZmZlci5hbGxCdWZmZXJzID0gYWxsQnVmZmVycztcblxuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgdHJ1ZSwgc3RhdGUubGVuZ3RoLCBidWZmZXIsICcnLCBob2xkZXIuZmluaXNoKTtcblxuICAgIC8vIGRvV3JpdGUgaXMgYWxtb3N0IGFsd2F5cyBhc3luYywgZGVmZXIgdGhlc2UgdG8gc2F2ZSBhIGJpdCBvZiB0aW1lXG4gICAgLy8gYXMgdGhlIGhvdCBwYXRoIGVuZHMgd2l0aCBkb1dyaXRlXG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gICAgaWYgKGhvbGRlci5uZXh0KSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBob2xkZXIubmV4dDtcbiAgICAgIGhvbGRlci5uZXh0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3Qoc3RhdGUpO1xuICAgIH1cbiAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gU2xvdyBjYXNlLCB3cml0ZSBjaHVua3Mgb25lLWJ5LW9uZVxuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBlbnRyeS5lbmNvZGluZztcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gICAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQtLTtcbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBjYWxsIHRoZSBvbndyaXRlIGltbWVkaWF0ZWx5LCB0aGVuXG4gICAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgICAgLy8gYWxzbywgdGhhdCBtZWFucyB0aGF0IHRoZSBjaHVuayBhbmQgY2IgYXJlIGN1cnJlbnRseVxuICAgICAgLy8gYmVpbmcgcHJvY2Vzc2VkLCBzbyBtb3ZlIHRoZSBidWZmZXIgY291bnRlciBwYXN0IHRoZW0uXG4gICAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkgPT09IG51bGwpIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB9XG5cbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignX3dyaXRlKCkgaXMgbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcblxuICAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9XG5cbiAgLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuICBpZiAoIXN0YXRlLmVuZGluZyAmJiAhc3RhdGUuZmluaXNoZWQpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5mdW5jdGlvbiBjYWxsRmluYWwoc3RyZWFtLCBzdGF0ZSkge1xuICBzdHJlYW0uX2ZpbmFsKGZ1bmN0aW9uIChlcnIpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH1cbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQgJiYgIXN0YXRlLmZpbmFsQ2FsbGVkKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJlYW0uX2ZpbmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICAgIHN0YXRlLmZpbmFsQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIHBuYS5uZXh0VGljayhjYWxsRmluYWwsIHN0cmVhbSwgc3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgaWYgKHN0YXRlLnBlbmRpbmdjYiA9PT0gMCkge1xuICAgICAgc3RhdGUuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZCkgcG5hLm5leHRUaWNrKGNiKTtlbHNlIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb25Db3JrZWRGaW5pc2goY29ya1JlcSwgc3RhdGUsIGVycikge1xuICB2YXIgZW50cnkgPSBjb3JrUmVxLmVudHJ5O1xuICBjb3JrUmVxLmVudHJ5ID0gbnVsbDtcbiAgd2hpbGUgKGVudHJ5KSB7XG4gICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgY2IoZXJyKTtcbiAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gIH1cbiAgaWYgKHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSkge1xuICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gY29ya1JlcTtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBjb3JrUmVxO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveTtcbldyaXRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95O1xuV3JpdGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5lbmQoKTtcbiAgY2IoZXJyKTtcbn07IiwiLyoqXG4gKiBAdHlwZSB7U2V0PHN0cmluZz59XG4gKi9cbmNvbnN0IGNhblJlcGxheVByb3RvY29scyA9IG5ldyBTZXQoW1xuICAnSFRUUC8wLjknLFxuICAnSFRUUC8xLjAnLFxuICAnSFRUUC8xLjEnLFxuICAnREFUQScsXG4gICdkYXRhJ1xuXSlcblxuLyoqXG4gKiBAdHlwZSB7e2NhblJlcGxheVByb3RvY29sczogU2V0PHN0cmluZz4sIFNQQUNFOiBzdHJpbmcsIEgyTWV0aG9kOiBzdHJpbmcsIEhUVFAxRDE6IHN0cmluZywgREFTSDogc3RyaW5nLCBIMnBhdGg6IHN0cmluZ319XG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjYW5SZXBsYXlQcm90b2NvbHMsXG4gIFNQQUNFOiAnICcsXG4gIEgyTWV0aG9kOiAnOm1ldGhvZCcsXG4gIEgycGF0aDogJzpwYXRoJyxcbiAgSFRUUDFEMTogJ0hUVFAvMS4xJyxcbiAgREFTSDogJy0nXG59XG4iLCIndXNlIHN0cmljdCdcblxuLyoqXG4gKiBAZGVzYyBCdWZmZXJzIGZyb20gaGV4IHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSBhIFdBUkMgcmVjb3JkcyBXQVJDLVRZUEUgb3IgcmVjb3JkL3JlY29yZC1zZWN0aW9uIHNlcGFyYXRvclxuICogYXMgc2VlbiBieSB0aGUgcGFyc2VyLiBEdWUgdG8gdGhlIGxhcmdlIHNpemUgb2YgV0FSQyBmaWxlcyBhbmQgdGhlIGJpbmFyeSBkYXRhIGNvbnRhaW5lZCB3aXRoaW4gaXQgaXMgbW9yZSBlZmZpY2llbnRcbiAqIHRvIHBhcnNlIHRoZSBmaWxlcyBjb250ZW50cyBsb29raW5nIGZvciB0aGVzZSBzZW50aW5lbHMgdGhhbiBjb252ZXJ0aW5nIHRoZSBidWZmZXIgdG8gYW4gVVRGLTggc3RyaW5nIGZpcnN0XG4gKiBAdHlwZSB7e2JlZ2luOiBCdWZmZXIsIGluZm86IEJ1ZmZlciwgbWRhdGE6IEJ1ZmZlciwgcmVxOiBCdWZmZXIsIHJlczogQnVmZmVyLCByZXZpc2l0OiBCdWZmZXIsIHJlc291cmNlOiBCdWZmZXIsIGNybGY6IEJ1ZmZlciwgZW1wdHk6IEJ1ZmZlcn19XG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvKipcbiAgICogQHR5cGUge0J1ZmZlcn1cbiAgICovXG4gIGJlZ2luOiBCdWZmZXIuZnJvbSgnNTc0MTUyNDMyZicsICdoZXgnKSxcblxuICAvKipcbiAgICogQHR5cGUge0J1ZmZlcn1cbiAgICovXG4gIGluZm86IEJ1ZmZlci5mcm9tKCc1NzQxNTI0MzJkNTQ3OTcwNjUzYTIwNzc2MTcyNjM2OTZlNjY2ZicsICdoZXgnKSxcblxuICAvKipcbiAgICogQHR5cGUge0J1ZmZlcn1cbiAgICovXG4gIG1kYXRhOiBCdWZmZXIuZnJvbSgnNTc0MTUyNDMyZDU0Nzk3MDY1M2EyMDZkNjU3NDYxNjQ2MTc0NjEnLCAnaGV4JyksXG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCdWZmZXJ9XG4gICAqL1xuICByZXE6IEJ1ZmZlci5mcm9tKCc1NzQxNTI0MzJkNTQ3OTcwNjUzYTIwNzI2NTcxNzU2NTczNzQnLCAnaGV4JyksXG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCdWZmZXJ9XG4gICAqL1xuICByZXM6IEJ1ZmZlci5mcm9tKCc1NzQxNTI0MzJkNTQ3OTcwNjUzYTIwNzI2NTczNzA2ZjZlNzM2NScsICdoZXgnKSxcblxuICAvKipcbiAgICogQHR5cGUge0J1ZmZlcn1cbiAgICovXG4gIHJldmlzaXQ6IEJ1ZmZlci5mcm9tKCc1NzQxNTI0MzJkNTQ3OTcwNjUzYTIwNzI2NTc2Njk3MzY5NzQnLCAnaGV4JyksXG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCdWZmZXJ9XG4gICAqL1xuICByZXNvdXJjZTogQnVmZmVyLmZyb20oJzU3NDE1MjQzMmQ1NDc5NzA2NTNhMjA3MjY1NzM2Zjc1NzI2MzY1JywgJ2hleCcpLFxuXG4gIC8qKlxuICAgKiBAdHlwZSB7QnVmZmVyfVxuICAgKi9cbiAgY3JsZjogQnVmZmVyLmZyb20oJzBkMGEnLCAnaGV4JyksXG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCdWZmZXJ9XG4gICAqL1xuICBlbXB0eTogQnVmZmVyLmZyb20oJzBkJywgJ2hleCcpXG59XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0aWYgKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XG5cdFx0bW9kdWxlLnBhdGhzID0gW107XG5cdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XG5cdFx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwibG9hZGVkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJpZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xuXHR9XG5cdHJldHVybiBtb2R1bGU7XG59O1xuIiwidmFyIENsaWVudFJlcXVlc3QgPSByZXF1aXJlKCcuL2xpYi9yZXF1ZXN0JylcbnZhciByZXNwb25zZSA9IHJlcXVpcmUoJy4vbGliL3Jlc3BvbnNlJylcbnZhciBleHRlbmQgPSByZXF1aXJlKCd4dGVuZCcpXG52YXIgc3RhdHVzQ29kZXMgPSByZXF1aXJlKCdidWlsdGluLXN0YXR1cy1jb2RlcycpXG52YXIgdXJsID0gcmVxdWlyZSgndXJsJylcblxudmFyIGh0dHAgPSBleHBvcnRzXG5cbmh0dHAucmVxdWVzdCA9IGZ1bmN0aW9uIChvcHRzLCBjYikge1xuXHRpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKVxuXHRcdG9wdHMgPSB1cmwucGFyc2Uob3B0cylcblx0ZWxzZVxuXHRcdG9wdHMgPSBleHRlbmQob3B0cylcblxuXHQvLyBOb3JtYWxseSwgdGhlIHBhZ2UgaXMgbG9hZGVkIGZyb20gaHR0cCBvciBodHRwcywgc28gbm90IHNwZWNpZnlpbmcgYSBwcm90b2NvbFxuXHQvLyB3aWxsIHJlc3VsdCBpbiBhICh2YWxpZCkgcHJvdG9jb2wtcmVsYXRpdmUgdXJsLiBIb3dldmVyLCB0aGlzIHdvbid0IHdvcmsgaWZcblx0Ly8gdGhlIHByb3RvY29sIGlzIHNvbWV0aGluZyBlbHNlLCBsaWtlICdmaWxlOidcblx0dmFyIGRlZmF1bHRQcm90b2NvbCA9IGdsb2JhbC5sb2NhdGlvbi5wcm90b2NvbC5zZWFyY2goL15odHRwcz86JC8pID09PSAtMSA/ICdodHRwOicgOiAnJ1xuXG5cdHZhciBwcm90b2NvbCA9IG9wdHMucHJvdG9jb2wgfHwgZGVmYXVsdFByb3RvY29sXG5cdHZhciBob3N0ID0gb3B0cy5ob3N0bmFtZSB8fCBvcHRzLmhvc3Rcblx0dmFyIHBvcnQgPSBvcHRzLnBvcnRcblx0dmFyIHBhdGggPSBvcHRzLnBhdGggfHwgJy8nXG5cblx0Ly8gTmVjZXNzYXJ5IGZvciBJUHY2IGFkZHJlc3Nlc1xuXHRpZiAoaG9zdCAmJiBob3N0LmluZGV4T2YoJzonKSAhPT0gLTEpXG5cdFx0aG9zdCA9ICdbJyArIGhvc3QgKyAnXSdcblxuXHQvLyBUaGlzIG1heSBiZSBhIHJlbGF0aXZlIHVybC4gVGhlIGJyb3dzZXIgc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIGludGVycHJldCBpdCBjb3JyZWN0bHkuXG5cdG9wdHMudXJsID0gKGhvc3QgPyAocHJvdG9jb2wgKyAnLy8nICsgaG9zdCkgOiAnJykgKyAocG9ydCA/ICc6JyArIHBvcnQgOiAnJykgKyBwYXRoXG5cdG9wdHMubWV0aG9kID0gKG9wdHMubWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpXG5cdG9wdHMuaGVhZGVycyA9IG9wdHMuaGVhZGVycyB8fCB7fVxuXG5cdC8vIEFsc28gdmFsaWQgb3B0cy5hdXRoLCBvcHRzLm1vZGVcblxuXHR2YXIgcmVxID0gbmV3IENsaWVudFJlcXVlc3Qob3B0cylcblx0aWYgKGNiKVxuXHRcdHJlcS5vbigncmVzcG9uc2UnLCBjYilcblx0cmV0dXJuIHJlcVxufVxuXG5odHRwLmdldCA9IGZ1bmN0aW9uIGdldCAob3B0cywgY2IpIHtcblx0dmFyIHJlcSA9IGh0dHAucmVxdWVzdChvcHRzLCBjYilcblx0cmVxLmVuZCgpXG5cdHJldHVybiByZXFcbn1cblxuaHR0cC5DbGllbnRSZXF1ZXN0ID0gQ2xpZW50UmVxdWVzdFxuaHR0cC5JbmNvbWluZ01lc3NhZ2UgPSByZXNwb25zZS5JbmNvbWluZ01lc3NhZ2VcblxuaHR0cC5BZ2VudCA9IGZ1bmN0aW9uICgpIHt9XG5odHRwLkFnZW50LmRlZmF1bHRNYXhTb2NrZXRzID0gNFxuXG5odHRwLmdsb2JhbEFnZW50ID0gbmV3IGh0dHAuQWdlbnQoKVxuXG5odHRwLlNUQVRVU19DT0RFUyA9IHN0YXR1c0NvZGVzXG5cbmh0dHAuTUVUSE9EUyA9IFtcblx0J0NIRUNLT1VUJyxcblx0J0NPTk5FQ1QnLFxuXHQnQ09QWScsXG5cdCdERUxFVEUnLFxuXHQnR0VUJyxcblx0J0hFQUQnLFxuXHQnTE9DSycsXG5cdCdNLVNFQVJDSCcsXG5cdCdNRVJHRScsXG5cdCdNS0FDVElWSVRZJyxcblx0J01LQ09MJyxcblx0J01PVkUnLFxuXHQnTk9USUZZJyxcblx0J09QVElPTlMnLFxuXHQnUEFUQ0gnLFxuXHQnUE9TVCcsXG5cdCdQUk9QRklORCcsXG5cdCdQUk9QUEFUQ0gnLFxuXHQnUFVSR0UnLFxuXHQnUFVUJyxcblx0J1JFUE9SVCcsXG5cdCdTRUFSQ0gnLFxuXHQnU1VCU0NSSUJFJyxcblx0J1RSQUNFJyxcblx0J1VOTE9DSycsXG5cdCdVTlNVQlNDUklCRSdcbl0iLCJjb25zdCBzdGFydENhc2UgPSByZXF1aXJlKCdsb2Rhc2gvc3RhcnRDYXNlJylcbmNvbnN0IHsgREFTSCB9ID0gcmVxdWlyZSgnLi4vdXRpbHMvY29uc3RhbnRzJylcbmNvbnN0IHsgQ1JMRiB9ID0gcmVxdWlyZSgnLi4vd3JpdGVycy93YXJjRmllbGRzJylcblxuLyoqXG4gKiBAdHlwZSB7UmVnRXhwfVxuICovXG5jb25zdCBTUEFDRVJlID0gL1xccy9nXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlcktleVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlbnN1cmVIVFRQMkhlYWRlcnMgKGhlYWRlcktleSkge1xuICBpZiAoaGVhZGVyS2V5WzBdID09PSAnOicpIHJldHVybiBoZWFkZXJLZXlcbiAgcmV0dXJuIHN0YXJ0Q2FzZShoZWFkZXJLZXkpLnJlcGxhY2UoU1BBQ0VSZSwgREFTSClcbn1cblxuLyoqXG4gKiBAZGVzYyBDb252ZXJ0cyBhbiBIVFRQIGhlYWRlcnMgb2JqZWN0IGludG8gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvblxuICogQHBhcmFtIHtPYmplY3R9IGhlYWRlcnMgLSBUaGUgSFRUUCBoZWFkZXIgb2JqZWN0IHRvIGJlIHN0cmluZ2lmaWVkXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnRzLnN0cmluZ2lmeUhlYWRlcnMgPSBmdW5jdGlvbiBzdHJpbmdpZnlIZWFkZXJzIChoZWFkZXJzKSB7XG4gIGxldCBoZWFkZXJLZXlcbiAgbGV0IG91dFN0cmluZyA9IFtdXG4gIGZvciAoaGVhZGVyS2V5IGluIGhlYWRlcnMpIHtcbiAgICBvdXRTdHJpbmcucHVzaChgJHtlbnN1cmVIVFRQMkhlYWRlcnMoaGVhZGVyS2V5KX06ICR7aGVhZGVyc1toZWFkZXJLZXldfSR7Q1JMRn1gKVxuICB9XG4gIC8vIGpvaW4gdXNlZCB0byBmaXggbWVtb3J5IGlzc3VlIGNhdXNlZCBieSBjb25jYXRlbmF0aW9uOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMTc1I2M0XG4gIC8vIGFmZmVjdHMgbm9kZVxuICByZXR1cm4gb3V0U3RyaW5nLmpvaW4oJycpXG59XG5cbi8qKlxuICogQGRlc2MgQ29udmVydHMgYW4gSFRUUCByZXF1ZXN0IGhlYWRlcnMgb2JqZWN0IGludG8gaXRzIHN0cmluZyByZXByZXNlbnRhdGlvblxuICogQHBhcmFtIHtPYmplY3R9IGhlYWRlcnMgLSBUaGUgSFRUUCBoZWFkZXJzIG9iamVjdCBmb3IgdGhlIHJlcXVlc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBob3N0IC0gVGhlIGhvc3QgZm9yIHRoZSByZXF1ZXN0IHRvIGJlIHVzZWQgaWYgdGhlIEhUVFAgaGVhZGVycyBvYmplY3QgZG9lcyBub3QgY29udGFpbiB0aGUgSG9zdCBmaWVsZFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0cy5zdHJpbmdpZnlSZXF1ZXN0SGVhZGVycyA9IGZ1bmN0aW9uIHN0cmluZ2lmeVJlcXVlc3RIZWFkZXJzIChoZWFkZXJzLCBob3N0KSB7XG4gIGxldCBoYXNIb3N0ID0gZmFsc2VcbiAgbGV0IGhlYWRlcktleVxuICBsZXQgb3V0U3RyaW5nID0gW11cbiAgZm9yIChoZWFkZXJLZXkgaW4gaGVhZGVycykge1xuICAgIGlmIChoZWFkZXJLZXkgPT09ICdob3N0JyB8fCBoZWFkZXJLZXkgPT09ICdIb3N0Jykge1xuICAgICAgaGFzSG9zdCA9IHRydWVcbiAgICB9XG4gICAgb3V0U3RyaW5nLnB1c2goYCR7ZW5zdXJlSFRUUDJIZWFkZXJzKGhlYWRlcktleSl9OiAke2hlYWRlcnNbaGVhZGVyS2V5XX0ke0NSTEZ9YClcbiAgfVxuICBpZiAoIWhhc0hvc3QpIHtcbiAgICBvdXRTdHJpbmcucHVzaChgSG9zdDogJHtob3N0fSR7Q1JMRn1gKVxuICB9XG4gIC8vIGpvaW4gdXNlZCB0byBmaXggbWVtb3J5IGlzc3VlIGNhdXNlZCBieSBjb25jYXRlbmF0aW9uOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMTc1I2M0XG4gIC8vIGFmZmVjdHMgbm9kZVxuICByZXR1cm4gb3V0U3RyaW5nLmpvaW4oJycpXG59XG4iLCJ2YXIgYmFzZVRvU3RyaW5nID0gcmVxdWlyZSgnLi9fYmFzZVRvU3RyaW5nJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b1N0cmluZyhudWxsKTtcbiAqIC8vID0+ICcnXG4gKlxuICogXy50b1N0cmluZygtMCk7XG4gKiAvLyA9PiAnLTAnXG4gKlxuICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICogLy8gPT4gJzEsMiwzJ1xuICovXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1N0cmluZztcbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIE91clVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheSB8fCBmdW5jdGlvbiAoKSB7fTtcbmZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKTtcbn1cbmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5O1xufVxuXG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGRlYnVnVXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBkZWJ1ZyA9IHZvaWQgMDtcbmlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7XG4gIGRlYnVnID0gZGVidWdVdGlsLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gKCkge307XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlckxpc3QgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvQnVmZmVyTGlzdCcpO1xudmFyIGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3knKTtcbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIga1Byb3h5RXZlbnRzID0gWydlcnJvcicsICdjbG9zZScsICdkZXN0cm95JywgJ3BhdXNlJywgJ3Jlc3VtZSddO1xuXG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKTtcblxuICAvLyBUaGlzIGlzIGEgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgYW55XG4gIC8vIHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIHRoaXMgY29kZSBuZWVkc1xuICAvLyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgTm9kZS5qcyB0aGF0IGRvIG5vdCBpbmNsdWRlXG4gIC8vIHRoZSBwcmVwZW5kTGlzdGVuZXIoKSBtZXRob2QuIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVtb3ZlIHRoaXMgaGFjay5cbiAgaWYgKCFlbWl0dGVyLl9ldmVudHMgfHwgIWVtaXR0ZXIuX2V2ZW50c1tldmVudF0pIGVtaXR0ZXIub24oZXZlbnQsIGZuKTtlbHNlIGlmIChpc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pKSBlbWl0dGVyLl9ldmVudHNbZXZlbnRdLnVuc2hpZnQoZm4pO2Vsc2UgZW1pdHRlci5fZXZlbnRzW2V2ZW50XSA9IFtmbiwgZW1pdHRlci5fZXZlbnRzW2V2ZW50XV07XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0uXG4gIC8vIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgcmVhZGFibGVYWFggYW5kIHdyaXRhYmxlWFhYLlxuICB2YXIgaXNEdXBsZXggPSBzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXg7XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciByZWFkYWJsZUh3bSA9IG9wdGlvbnMucmVhZGFibGVIaWdoV2F0ZXJNYXJrO1xuICB2YXIgZGVmYXVsdEh3bSA9IHRoaXMub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xuXG4gIGlmIChod20gfHwgaHdtID09PSAwKSB0aGlzLmhpZ2hXYXRlck1hcmsgPSBod207ZWxzZSBpZiAoaXNEdXBsZXggJiYgKHJlYWRhYmxlSHdtIHx8IHJlYWRhYmxlSHdtID09PSAwKSkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gcmVhZGFibGVId207ZWxzZSB0aGlzLmhpZ2hXYXRlck1hcmsgPSBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gTWF0aC5mbG9vcih0aGlzLmhpZ2hXYXRlck1hcmspO1xuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KClcbiAgdGhpcy5idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBldmVudCAncmVhZGFibGUnLydkYXRhJyBpcyBlbWl0dGVkXG4gIC8vIGltbWVkaWF0ZWx5LCBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlXG4gIC8vIGFueSBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCByZWFkIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAvLyBoYXMgaXQgYmVlbiBkZXN0cm95ZWRcbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyB0aGUgbnVtYmVyIG9mIHdyaXRlcnMgdGhhdCBhcmUgYXdhaXRpbmcgYSBkcmFpbiBldmVudCBpbiAucGlwZSgpc1xuICB0aGlzLmF3YWl0RHJhaW4gPSAwO1xuXG4gIC8vIGlmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWRcbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlO1xuXG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIGlmICghU3RyaW5nRGVjb2RlcikgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyLycpLlN0cmluZ0RlY29kZXI7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRpb25zLmRlc3Ryb3k7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ2Rlc3Ryb3llZCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gd2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgLy8gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldFxuICAgIGlmICghdGhpcy5fcmVhZGFibGVTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICB9XG59KTtcblxuUmVhZGFibGUucHJvdG90eXBlLmRlc3Ryb3kgPSBkZXN0cm95SW1wbC5kZXN0cm95O1xuUmVhZGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3kgPSBkZXN0cm95SW1wbC51bmRlc3Ryb3k7XG5SZWFkYWJsZS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICB0aGlzLnB1c2gobnVsbCk7XG4gIGNiKGVycik7XG59O1xuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHNraXBDaHVua0NoZWNrO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcbiAgICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgICBlbmNvZGluZyA9ICcnO1xuICAgICAgfVxuICAgICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBza2lwQ2h1bmtDaGVjayA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlLCBza2lwQ2h1bmtDaGVjayk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIG51bGwsIHRydWUsIGZhbHNlKTtcbn07XG5cbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQsIHNraXBDaHVua0NoZWNrKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGVyO1xuICAgIGlmICghc2tpcENodW5rQ2hlY2spIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gICAgaWYgKGVyKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICh0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmICFzdGF0ZS5vYmplY3RNb2RlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihjaHVuaykgIT09IEJ1ZmZlci5wcm90b3R5cGUpIHtcbiAgICAgICAgY2h1bmsgPSBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFkZFRvRnJvbnQpIHtcbiAgICAgICAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKSk7ZWxzZSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZGVkKSB7XG4gICAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFlbmNvZGluZykge1xuICAgICAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG4gICAgICAgICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsubGVuZ3RoICE9PSAwKSBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZmFsc2UpO2Vsc2UgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkTW9yZURhdGEoc3RhdGUpO1xufVxuXG5mdW5jdGlvbiBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgYWRkVG9Gcm9udCkge1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO2Vsc2Ugc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuXG4gICAgaWYgKHN0YXRlLm5lZWRSZWFkYWJsZSkgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gIH1cbiAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXI7XG4gIGlmICghX2lzVWludDhBcnJheShjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG4vLyBpZiBpdCdzIHBhc3QgdGhlIGhpZ2ggd2F0ZXIgbWFyaywgd2UgY2FuIHB1c2ggaW4gc29tZSBtb3JlLlxuLy8gQWxzbywgaWYgd2UgaGF2ZSBubyBkYXRhIHlldCwgd2UgY2FuIHN0YW5kIHNvbWVcbi8vIG1vcmUgYnl0ZXMuICBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGNhc2VzIHdoZXJlIGh3bT0wLFxuLy8gc3VjaCBhcyB0aGUgcmVwbC4gIEFsc28sIGlmIHRoZSBwdXNoKCkgdHJpZ2dlcmVkIGFcbi8vIHJlYWRhYmxlIGV2ZW50LCBhbmQgdGhlIHVzZXIgY2FsbGVkIHJlYWQobGFyZ2VOdW1iZXIpIHN1Y2ggdGhhdFxuLy8gbmVlZFJlYWRhYmxlIHdhcyBzZXQsIHRoZW4gd2Ugb3VnaHQgdG8gcHVzaCBtb3JlLCBzbyB0aGF0IGFub3RoZXJcbi8vICdyZWFkYWJsZScgZXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQuXG5mdW5jdGlvbiBuZWVkTW9yZURhdGEoc3RhdGUpIHtcbiAgcmV0dXJuICFzdGF0ZS5lbmRlZCAmJiAoc3RhdGUubmVlZFJlYWRhYmxlIHx8IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUubGVuZ3RoID09PSAwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID09PSBmYWxzZTtcbn07XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24gKGVuYykge1xuICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiA4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyIHRvIHByZXZlbnQgaW5jcmVhc2luZyBod20gZXhjZXNzaXZlbHkgaW5cbiAgICAvLyB0aW55IGFtb3VudHNcbiAgICBuLS07XG4gICAgbiB8PSBuID4+PiAxO1xuICAgIG4gfD0gbiA+Pj4gMjtcbiAgICBuIHw9IG4gPj4+IDQ7XG4gICAgbiB8PSBuID4+PiA4O1xuICAgIG4gfD0gbiA+Pj4gMTY7XG4gICAgbisrO1xuICB9XG4gIHJldHVybiBuO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKG4gPD0gMCB8fCBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIHJldHVybiAwO1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIDE7XG4gIGlmIChuICE9PSBuKSB7XG4gICAgLy8gT25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg7ZWxzZSByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSBjdXJyZW50IGh3bSwgdGhlbiByYWlzZSB0aGUgaHdtLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcbiAgaWYgKG4gPD0gc3RhdGUubGVuZ3RoKSByZXR1cm4gbjtcbiAgLy8gRG9uJ3QgaGF2ZSBlbm91Z2hcbiAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKTtcbiAgbiA9IHBhcnNlSW50KG4sIDEwKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIG5PcmlnID0gbjtcblxuICBpZiAobiAhPT0gMCkgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5uZWVkUmVhZGFibGUgJiYgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGRlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKTtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtlbHNlIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfSBlbHNlIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuICB9XG5cbiAgdmFyIHJldDtcbiAgaWYgKG4gPiAwKSByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7ZWxzZSByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxlbmd0aCAtPSBuO1xuICB9XG5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAgIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgICBpZiAoIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gICAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICAgIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7XG4gIH1cblxuICBpZiAocmV0ICE9PSBudWxsKSB0aGlzLmVtaXQoJ2RhdGEnLCByZXQpO1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIHBuYS5uZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcG5hLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ19yZWFkKCkgaXMgbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG5cbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcblxuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogdW5waXBlO1xuICBpZiAoc3RhdGUuZW5kRW1pdHRlZCkgcG5hLm5leHRUaWNrKGVuZEZuKTtlbHNlIHNyYy5vbmNlKCdlbmQnLCBlbmRGbik7XG5cbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSwgdW5waXBlSW5mbykge1xuICAgIGRlYnVnKCdvbnVucGlwZScpO1xuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBpZiAodW5waXBlSW5mbyAmJiB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHVucGlwZUluZm8uaGFzVW5waXBlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIHVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuXG4gIC8vIElmIHRoZSB1c2VyIHB1c2hlcyBtb3JlIGRhdGEgd2hpbGUgd2UncmUgd3JpdGluZyB0byBkZXN0IHRoZW4gd2UnbGwgZW5kIHVwXG4gIC8vIGluIG9uZGF0YSBhZ2Fpbi4gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIGluY3JlYXNlIGF3YWl0RHJhaW4gb25jZSBiZWNhdXNlXG4gIC8vIGRlc3Qgd2lsbCBvbmx5IGVtaXQgb25lICdkcmFpbicgZXZlbnQgZm9yIHRoZSBtdWx0aXBsZSB3cml0ZXMuXG4gIC8vID0+IEludHJvZHVjZSBhIGd1YXJkIG9uIGluY3JlYXNpbmcgYXdhaXREcmFpbi5cbiAgdmFyIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgc3JjLm9uKCdkYXRhJywgb25kYXRhKTtcbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgZGVidWcoJ29uZGF0YScpO1xuICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQgJiYgIWluY3JlYXNlZEF3YWl0RHJhaW4pIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICAvLyA9PiBDaGVjayB3aGV0aGVyIGBkZXN0YCBpcyBzdGlsbCBhIHBpcGluZyBkZXN0aW5hdGlvbi5cbiAgICAgIGlmICgoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJiBzdGF0ZS5waXBlcyA9PT0gZGVzdCB8fCBzdGF0ZS5waXBlc0NvdW50ID4gMSAmJiBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KSAhPT0gLTEpICYmICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgICAgaW5jcmVhc2VkQXdhaXREcmFpbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUVsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKSBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG5cbiAgLy8gTWFrZSBzdXJlIG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSB1c2VybGFuZCBvbmVzLlxuICBwcmVwZW5kTGlzdGVuZXIoZGVzdCwgJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJyk7XG4gICAgc3JjLnVucGlwZShkZXN0KTtcbiAgfVxuXG4gIC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG4gIGRlc3QuZW1pdCgncGlwZScsIHNyYyk7XG5cbiAgLy8gc3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGlwZSByZXN1bWUnKTtcbiAgICBzcmMucmVzdW1lKCk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbikgc3RhdGUuYXdhaXREcmFpbi0tO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluID09PSAwICYmIEVFbGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciB1bnBpcGVJbmZvID0geyBoYXNVbnBpcGVkOiBmYWxzZSB9O1xuXG4gIC8vIGlmIHdlJ3JlIG5vdCBwaXBpbmcgYW55d2hlcmUsIHRoZW4gZG8gbm90aGluZy5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDApIHJldHVybiB0aGlzO1xuXG4gIC8vIGp1c3Qgb25lIGRlc3RpbmF0aW9uLiAgbW9zdCBjb21tb24gY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHtcbiAgICAvLyBwYXNzZWQgaW4gb25lLCBidXQgaXQncyBub3QgdGhlIHJpZ2h0IG9uZS5cbiAgICBpZiAoZGVzdCAmJiBkZXN0ICE9PSBzdGF0ZS5waXBlcykgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoIWRlc3QpIGRlc3QgPSBzdGF0ZS5waXBlcztcblxuICAgIC8vIGdvdCBhIG1hdGNoLlxuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgaWYgKGRlc3QpIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RzW2ldLmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuICAgIH1yZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpbmRleCA9IGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAvLyBTdGFydCBmbG93aW5nIG9uIG5leHQgdGljayBpZiBzdHJlYW0gaXNuJ3QgZXhwbGljaXRseSBwYXVzZWRcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nICE9PSBmYWxzZSkgdGhpcy5yZXN1bWUoKTtcbiAgfSBlbHNlIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmICFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcG5hLm5leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuXG5mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpIHtcbiAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpO1xuICBzZWxmLnJlYWQoMCk7XG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHBuYS5uZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdGF0ZS5hd2FpdERyYWluID0gMDtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIHdoaWxlIChzdGF0ZS5mbG93aW5nICYmIHN0cmVhbS5yZWFkKCkgIT09IG51bGwpIHt9XG59XG5cbi8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBwYXVzZWQgPSBmYWxzZTtcblxuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSBfdGhpcy5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBfdGhpcy5wdXNoKG51bGwpO1xuICB9KTtcblxuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBkYXRhJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAvLyBkb24ndCBza2lwIG92ZXIgZmFsc3kgdmFsdWVzIGluIG9iamVjdE1vZGVcbiAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkpIHJldHVybjtlbHNlIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpKSByZXR1cm47XG5cbiAgICB2YXIgcmV0ID0gX3RoaXMucHVzaChjaHVuayk7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHBhdXNlZCA9IHRydWU7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy5cbiAgLy8gaW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGZvciAodmFyIGkgaW4gc3RyZWFtKSB7XG4gICAgaWYgKHRoaXNbaV0gPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ldID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb3h5IGNlcnRhaW4gaW1wb3J0YW50IGV2ZW50cy5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCBrUHJveHlFdmVudHMubGVuZ3RoOyBuKyspIHtcbiAgICBzdHJlYW0ub24oa1Byb3h5RXZlbnRzW25dLCB0aGlzLmVtaXQuYmluZCh0aGlzLCBrUHJveHlFdmVudHNbbl0pKTtcbiAgfVxuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHRoaXMuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwgJ3JlYWRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgfVxufSk7XG5cbi8vIGV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0O1xuXG4vLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICAvLyBub3RoaW5nIGJ1ZmZlcmVkXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIHZhciByZXQ7XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXQgPSBzdGF0ZS5idWZmZXIuc2hpZnQoKTtlbHNlIGlmICghbiB8fCBuID49IHN0YXRlLmxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgbGlzdFxuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSByZXQgPSBzdGF0ZS5idWZmZXIuam9pbignJyk7ZWxzZSBpZiAoc3RhdGUuYnVmZmVyLmxlbmd0aCA9PT0gMSkgcmV0ID0gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YTtlbHNlIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKTtcbiAgICBzdGF0ZS5idWZmZXIuY2xlYXIoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdFxuICAgIHJldCA9IGZyb21MaXN0UGFydGlhbChuLCBzdGF0ZS5idWZmZXIsIHN0YXRlLmRlY29kZXIpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gRXh0cmFjdHMgb25seSBlbm91Z2ggYnVmZmVyZWQgZGF0YSB0byBzYXRpc2Z5IHRoZSBhbW91bnQgcmVxdWVzdGVkLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdFBhcnRpYWwobiwgbGlzdCwgaGFzU3RyaW5ncykge1xuICB2YXIgcmV0O1xuICBpZiAobiA8IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzXG4gICAgcmV0ID0gbGlzdC5oZWFkLmRhdGEuc2xpY2UoMCwgbik7XG4gICAgbGlzdC5oZWFkLmRhdGEgPSBsaXN0LmhlYWQuZGF0YS5zbGljZShuKTtcbiAgfSBlbHNlIGlmIChuID09PSBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBmaXJzdCBjaHVuayBpcyBhIHBlcmZlY3QgbWF0Y2hcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzdWx0IHNwYW5zIG1vcmUgdGhhbiBvbmUgYnVmZmVyXG4gICAgcmV0ID0gaGFzU3RyaW5ncyA/IGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIDogY29weUZyb21CdWZmZXIobiwgbGlzdCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YVxuLy8gY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSB7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHZhciByZXQgPSBwLmRhdGE7XG4gIG4gLT0gcmV0Lmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgc3RyID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBzdHIubGVuZ3RoID8gc3RyLmxlbmd0aCA6IG47XG4gICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSByZXQgKz0gc3RyO2Vsc2UgcmV0ICs9IHN0ci5zbGljZSgwLCBuKTtcbiAgICBuIC09IG5iO1xuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gc3RyLnNsaWNlKG5iKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICArK2M7XG4gIH1cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGEgY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KSB7XG4gIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobik7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHAuZGF0YS5jb3B5KHJldCk7XG4gIG4gLT0gcC5kYXRhLmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgYnVmID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgYnVmLmNvcHkocmV0LCByZXQubGVuZ3RoIC0gbiwgMCwgbmIpO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBidWYuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICBpZiAoc3RhdGUubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKCdcImVuZFJlYWRhYmxlKClcIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBwbmEubmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLy8gdW5kb2N1bWVudGVkIGNiKCkgQVBJLCBuZWVkZWQgZm9yIGNvcmUsIG5vdCBmb3IgcHVibGljIEFQSVxuZnVuY3Rpb24gZGVzdHJveShlcnIsIGNiKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIHJlYWRhYmxlRGVzdHJveWVkID0gdGhpcy5fcmVhZGFibGVTdGF0ZSAmJiB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgdmFyIHdyaXRhYmxlRGVzdHJveWVkID0gdGhpcy5fd3JpdGFibGVTdGF0ZSAmJiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcblxuICBpZiAocmVhZGFibGVEZXN0cm95ZWQgfHwgd3JpdGFibGVEZXN0cm95ZWQpIHtcbiAgICBpZiAoY2IpIHtcbiAgICAgIGNiKGVycik7XG4gICAgfSBlbHNlIGlmIChlcnIgJiYgKCF0aGlzLl93cml0YWJsZVN0YXRlIHx8ICF0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCkpIHtcbiAgICAgIHBuYS5uZXh0VGljayhlbWl0RXJyb3JOVCwgdGhpcywgZXJyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB3ZSBzZXQgZGVzdHJveWVkIHRvIHRydWUgYmVmb3JlIGZpcmluZyBlcnJvciBjYWxsYmFja3MgaW4gb3JkZXJcbiAgLy8gdG8gbWFrZSBpdCByZS1lbnRyYW5jZSBzYWZlIGluIGNhc2UgZGVzdHJveSgpIGlzIGNhbGxlZCB3aXRoaW4gY2FsbGJhY2tzXG5cbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHRydWU7XG4gIH1cblxuICAvLyBpZiB0aGlzIGlzIGEgZHVwbGV4IHN0cmVhbSBtYXJrIHRoZSB3cml0YWJsZSBwYXJ0IGFzIGRlc3Ryb3llZCBhcyB3ZWxsXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG5cbiAgdGhpcy5fZGVzdHJveShlcnIgfHwgbnVsbCwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmICghY2IgJiYgZXJyKSB7XG4gICAgICBwbmEubmV4dFRpY2soZW1pdEVycm9yTlQsIF90aGlzLCBlcnIpO1xuICAgICAgaWYgKF90aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICAgIF90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjYikge1xuICAgICAgY2IoZXJyKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufVxuXG5mdW5jdGlvbiB1bmRlc3Ryb3koKSB7XG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIH1cblxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdEVycm9yTlQoc2VsZiwgZXJyKSB7XG4gIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGVzdHJveTogZGVzdHJveSxcbiAgdW5kZXN0cm95OiB1bmRlc3Ryb3lcbn07IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBpc0VuY29kaW5nID0gQnVmZmVyLmlzRW5jb2RpbmcgfHwgZnVuY3Rpb24gKGVuY29kaW5nKSB7XG4gIGVuY29kaW5nID0gJycgKyBlbmNvZGluZztcbiAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpjYXNlICd1dGY4JzpjYXNlICd1dGYtOCc6Y2FzZSAnYXNjaWknOmNhc2UgJ2JpbmFyeSc6Y2FzZSAnYmFzZTY0JzpjYXNlICd1Y3MyJzpjYXNlICd1Y3MtMic6Y2FzZSAndXRmMTZsZSc6Y2FzZSAndXRmLTE2bGUnOmNhc2UgJ3Jhdyc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBfbm9ybWFsaXplRW5jb2RpbmcoZW5jKSB7XG4gIGlmICghZW5jKSByZXR1cm4gJ3V0ZjgnO1xuICB2YXIgcmV0cmllZDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuYykge1xuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiAndXRmOCc7XG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gJ3V0ZjE2bGUnO1xuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiAnbGF0aW4xJztcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gZW5jO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHJldHJpZWQpIHJldHVybjsgLy8gdW5kZWZpbmVkXG4gICAgICAgIGVuYyA9ICgnJyArIGVuYykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0cmllZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG4vLyBEbyBub3QgY2FjaGUgYEJ1ZmZlci5pc0VuY29kaW5nYCB3aGVuIGNoZWNraW5nIGVuY29kaW5nIG5hbWVzIGFzIHNvbWVcbi8vIG1vZHVsZXMgbW9ua2V5LXBhdGNoIGl0IHRvIHN1cHBvcnQgYWRkaXRpb25hbCBlbmNvZGluZ3NcbmZ1bmN0aW9uIG5vcm1hbGl6ZUVuY29kaW5nKGVuYykge1xuICB2YXIgbmVuYyA9IF9ub3JtYWxpemVFbmNvZGluZyhlbmMpO1xuICBpZiAodHlwZW9mIG5lbmMgIT09ICdzdHJpbmcnICYmIChCdWZmZXIuaXNFbmNvZGluZyA9PT0gaXNFbmNvZGluZyB8fCAhaXNFbmNvZGluZyhlbmMpKSkgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jKTtcbiAgcmV0dXJuIG5lbmMgfHwgZW5jO1xufVxuXG4vLyBTdHJpbmdEZWNvZGVyIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgZWZmaWNpZW50bHkgc3BsaXR0aW5nIGEgc2VyaWVzIG9mXG4vLyBidWZmZXJzIGludG8gYSBzZXJpZXMgb2YgSlMgc3RyaW5ncyB3aXRob3V0IGJyZWFraW5nIGFwYXJ0IG11bHRpLWJ5dGVcbi8vIGNoYXJhY3RlcnMuXG5leHBvcnRzLlN0cmluZ0RlY29kZXIgPSBTdHJpbmdEZWNvZGVyO1xuZnVuY3Rpb24gU3RyaW5nRGVjb2RlcihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gbm9ybWFsaXplRW5jb2RpbmcoZW5jb2RpbmcpO1xuICB2YXIgbmI7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgdGhpcy50ZXh0ID0gdXRmMTZUZXh0O1xuICAgICAgdGhpcy5lbmQgPSB1dGYxNkVuZDtcbiAgICAgIG5iID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgdGhpcy5maWxsTGFzdCA9IHV0ZjhGaWxsTGFzdDtcbiAgICAgIG5iID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICB0aGlzLnRleHQgPSBiYXNlNjRUZXh0O1xuICAgICAgdGhpcy5lbmQgPSBiYXNlNjRFbmQ7XG4gICAgICBuYiA9IDM7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhpcy53cml0ZSA9IHNpbXBsZVdyaXRlO1xuICAgICAgdGhpcy5lbmQgPSBzaW1wbGVFbmQ7XG4gICAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5sYXN0TmVlZCA9IDA7XG4gIHRoaXMubGFzdFRvdGFsID0gMDtcbiAgdGhpcy5sYXN0Q2hhciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuYik7XG59XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICB2YXIgcjtcbiAgdmFyIGk7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSB7XG4gICAgciA9IHRoaXMuZmlsbExhc3QoYnVmKTtcbiAgICBpZiAociA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XG4gICAgaSA9IHRoaXMubGFzdE5lZWQ7XG4gICAgdGhpcy5sYXN0TmVlZCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgaSA9IDA7XG4gIH1cbiAgaWYgKGkgPCBidWYubGVuZ3RoKSByZXR1cm4gciA/IHIgKyB0aGlzLnRleHQoYnVmLCBpKSA6IHRoaXMudGV4dChidWYsIGkpO1xuICByZXR1cm4gciB8fCAnJztcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IHV0ZjhFbmQ7XG5cbi8vIFJldHVybnMgb25seSBjb21wbGV0ZSBjaGFyYWN0ZXJzIGluIGEgQnVmZmVyXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS50ZXh0ID0gdXRmOFRleHQ7XG5cbi8vIEF0dGVtcHRzIHRvIGNvbXBsZXRlIGEgcGFydGlhbCBub24tVVRGLTggY2hhcmFjdGVyIHVzaW5nIGJ5dGVzIGZyb20gYSBCdWZmZXJcblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmZpbGxMYXN0ID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAodGhpcy5sYXN0TmVlZCA8PSBidWYubGVuZ3RoKSB7XG4gICAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkLCAwLCB0aGlzLmxhc3ROZWVkKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCB0aGlzLmxhc3RUb3RhbCk7XG4gIH1cbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkLCAwLCBidWYubGVuZ3RoKTtcbiAgdGhpcy5sYXN0TmVlZCAtPSBidWYubGVuZ3RoO1xufTtcblxuLy8gQ2hlY2tzIHRoZSB0eXBlIG9mIGEgVVRGLTggYnl0ZSwgd2hldGhlciBpdCdzIEFTQ0lJLCBhIGxlYWRpbmcgYnl0ZSwgb3IgYVxuLy8gY29udGludWF0aW9uIGJ5dGUuIElmIGFuIGludmFsaWQgYnl0ZSBpcyBkZXRlY3RlZCwgLTIgaXMgcmV0dXJuZWQuXG5mdW5jdGlvbiB1dGY4Q2hlY2tCeXRlKGJ5dGUpIHtcbiAgaWYgKGJ5dGUgPD0gMHg3RikgcmV0dXJuIDA7ZWxzZSBpZiAoYnl0ZSA+PiA1ID09PSAweDA2KSByZXR1cm4gMjtlbHNlIGlmIChieXRlID4+IDQgPT09IDB4MEUpIHJldHVybiAzO2Vsc2UgaWYgKGJ5dGUgPj4gMyA9PT0gMHgxRSkgcmV0dXJuIDQ7XG4gIHJldHVybiBieXRlID4+IDYgPT09IDB4MDIgPyAtMSA6IC0yO1xufVxuXG4vLyBDaGVja3MgYXQgbW9zdCAzIGJ5dGVzIGF0IHRoZSBlbmQgb2YgYSBCdWZmZXIgaW4gb3JkZXIgdG8gZGV0ZWN0IGFuXG4vLyBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyLiBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzICgyLCAzLCBvciA0KVxuLy8gbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBVVEYtOCBjaGFyYWN0ZXIgKGlmIGFwcGxpY2FibGUpIGFyZSByZXR1cm5lZC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0luY29tcGxldGUoc2VsZiwgYnVmLCBpKSB7XG4gIHZhciBqID0gYnVmLmxlbmd0aCAtIDE7XG4gIGlmIChqIDwgaSkgcmV0dXJuIDA7XG4gIHZhciBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAxO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSB8fCBuYiA9PT0gLTIpIHJldHVybiAwO1xuICBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSBzZWxmLmxhc3ROZWVkID0gbmIgLSAyO1xuICAgIHJldHVybiBuYjtcbiAgfVxuICBpZiAoLS1qIDwgaSB8fCBuYiA9PT0gLTIpIHJldHVybiAwO1xuICBuYiA9IHV0ZjhDaGVja0J5dGUoYnVmW2pdKTtcbiAgaWYgKG5iID49IDApIHtcbiAgICBpZiAobmIgPiAwKSB7XG4gICAgICBpZiAobmIgPT09IDIpIG5iID0gMDtlbHNlIHNlbGYubGFzdE5lZWQgPSBuYiAtIDM7XG4gICAgfVxuICAgIHJldHVybiBuYjtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy8gVmFsaWRhdGVzIGFzIG1hbnkgY29udGludWF0aW9uIGJ5dGVzIGZvciBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyIGFzXG4vLyBuZWVkZWQgb3IgYXJlIGF2YWlsYWJsZS4gSWYgd2Ugc2VlIGEgbm9uLWNvbnRpbnVhdGlvbiBieXRlIHdoZXJlIHdlIGV4cGVjdFxuLy8gb25lLCB3ZSBcInJlcGxhY2VcIiB0aGUgdmFsaWRhdGVkIGNvbnRpbnVhdGlvbiBieXRlcyB3ZSd2ZSBzZWVuIHNvIGZhciB3aXRoXG4vLyBhIHNpbmdsZSBVVEYtOCByZXBsYWNlbWVudCBjaGFyYWN0ZXIgKCdcXHVmZmZkJyksIHRvIG1hdGNoIHY4J3MgVVRGLTggZGVjb2Rpbmdcbi8vIGJlaGF2aW9yLiBUaGUgY29udGludWF0aW9uIGJ5dGUgY2hlY2sgaXMgaW5jbHVkZWQgdGhyZWUgdGltZXMgaW4gdGhlIGNhc2Vcbi8vIHdoZXJlIGFsbCBvZiB0aGUgY29udGludWF0aW9uIGJ5dGVzIGZvciBhIGNoYXJhY3RlciBleGlzdCBpbiB0aGUgc2FtZSBidWZmZXIuXG4vLyBJdCBpcyBhbHNvIGRvbmUgdGhpcyB3YXkgYXMgYSBzbGlnaHQgcGVyZm9ybWFuY2UgaW5jcmVhc2UgaW5zdGVhZCBvZiB1c2luZyBhXG4vLyBsb29wLlxuZnVuY3Rpb24gdXRmOENoZWNrRXh0cmFCeXRlcyhzZWxmLCBidWYsIHApIHtcbiAgaWYgKChidWZbMF0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgIHNlbGYubGFzdE5lZWQgPSAwO1xuICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gIH1cbiAgaWYgKHNlbGYubGFzdE5lZWQgPiAxICYmIGJ1Zi5sZW5ndGggPiAxKSB7XG4gICAgaWYgKChidWZbMV0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgc2VsZi5sYXN0TmVlZCA9IDE7XG4gICAgICByZXR1cm4gJ1xcdWZmZmQnO1xuICAgIH1cbiAgICBpZiAoc2VsZi5sYXN0TmVlZCA+IDIgJiYgYnVmLmxlbmd0aCA+IDIpIHtcbiAgICAgIGlmICgoYnVmWzJdICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgc2VsZi5sYXN0TmVlZCA9IDI7XG4gICAgICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIEF0dGVtcHRzIHRvIGNvbXBsZXRlIGEgbXVsdGktYnl0ZSBVVEYtOCBjaGFyYWN0ZXIgdXNpbmcgYnl0ZXMgZnJvbSBhIEJ1ZmZlci5cbmZ1bmN0aW9uIHV0ZjhGaWxsTGFzdChidWYpIHtcbiAgdmFyIHAgPSB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQ7XG4gIHZhciByID0gdXRmOENoZWNrRXh0cmFCeXRlcyh0aGlzLCBidWYsIHApO1xuICBpZiAociAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcjtcbiAgaWYgKHRoaXMubGFzdE5lZWQgPD0gYnVmLmxlbmd0aCkge1xuICAgIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHAsIDAsIHRoaXMubGFzdE5lZWQpO1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIHRoaXMubGFzdFRvdGFsKTtcbiAgfVxuICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCBwLCAwLCBidWYubGVuZ3RoKTtcbiAgdGhpcy5sYXN0TmVlZCAtPSBidWYubGVuZ3RoO1xufVxuXG4vLyBSZXR1cm5zIGFsbCBjb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXJzIGluIGEgQnVmZmVyLiBJZiB0aGUgQnVmZmVyIGVuZGVkIG9uIGFcbi8vIHBhcnRpYWwgY2hhcmFjdGVyLCB0aGUgY2hhcmFjdGVyJ3MgYnl0ZXMgYXJlIGJ1ZmZlcmVkIHVudGlsIHRoZSByZXF1aXJlZFxuLy8gbnVtYmVyIG9mIGJ5dGVzIGFyZSBhdmFpbGFibGUuXG5mdW5jdGlvbiB1dGY4VGV4dChidWYsIGkpIHtcbiAgdmFyIHRvdGFsID0gdXRmOENoZWNrSW5jb21wbGV0ZSh0aGlzLCBidWYsIGkpO1xuICBpZiAoIXRoaXMubGFzdE5lZWQpIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjgnLCBpKTtcbiAgdGhpcy5sYXN0VG90YWwgPSB0b3RhbDtcbiAgdmFyIGVuZCA9IGJ1Zi5sZW5ndGggLSAodG90YWwgLSB0aGlzLmxhc3ROZWVkKTtcbiAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgMCwgZW5kKTtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmOCcsIGksIGVuZCk7XG59XG5cbi8vIEZvciBVVEYtOCwgYSByZXBsYWNlbWVudCBjaGFyYWN0ZXIgaXMgYWRkZWQgd2hlbiBlbmRpbmcgb24gYSBwYXJ0aWFsXG4vLyBjaGFyYWN0ZXIuXG5mdW5jdGlvbiB1dGY4RW5kKGJ1Zikge1xuICB2YXIgciA9IGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG4gIGlmICh0aGlzLmxhc3ROZWVkKSByZXR1cm4gciArICdcXHVmZmZkJztcbiAgcmV0dXJuIHI7XG59XG5cbi8vIFVURi0xNkxFIHR5cGljYWxseSBuZWVkcyB0d28gYnl0ZXMgcGVyIGNoYXJhY3RlciwgYnV0IGV2ZW4gaWYgd2UgaGF2ZSBhbiBldmVuXG4vLyBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHdlIGVuZCBvbiBhIGxlYWRpbmcvaGlnaFxuLy8gc3Vycm9nYXRlLiBJbiB0aGF0IGNhc2UsIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIG5leHQgdHdvIGJ5dGVzIGluIG9yZGVyIHRvXG4vLyBkZWNvZGUgdGhlIGxhc3QgY2hhcmFjdGVyIHByb3Blcmx5LlxuZnVuY3Rpb24gdXRmMTZUZXh0KGJ1ZiwgaSkge1xuICBpZiAoKGJ1Zi5sZW5ndGggLSBpKSAlIDIgPT09IDApIHtcbiAgICB2YXIgciA9IGJ1Zi50b1N0cmluZygndXRmMTZsZScsIGkpO1xuICAgIGlmIChyKSB7XG4gICAgICB2YXIgYyA9IHIuY2hhckNvZGVBdChyLmxlbmd0aCAtIDEpO1xuICAgICAgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhEQkZGKSB7XG4gICAgICAgIHRoaXMubGFzdE5lZWQgPSAyO1xuICAgICAgICB0aGlzLmxhc3RUb3RhbCA9IDQ7XG4gICAgICAgIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDJdO1xuICAgICAgICB0aGlzLmxhc3RDaGFyWzFdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIHIuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuICB0aGlzLmxhc3ROZWVkID0gMTtcbiAgdGhpcy5sYXN0VG90YWwgPSAyO1xuICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmMTZsZScsIGksIGJ1Zi5sZW5ndGggLSAxKTtcbn1cblxuLy8gRm9yIFVURi0xNkxFIHdlIGRvIG5vdCBleHBsaWNpdGx5IGFwcGVuZCBzcGVjaWFsIHJlcGxhY2VtZW50IGNoYXJhY3RlcnMgaWYgd2Vcbi8vIGVuZCBvbiBhIHBhcnRpYWwgY2hhcmFjdGVyLCB3ZSBzaW1wbHkgbGV0IHY4IGhhbmRsZSB0aGF0LlxuZnVuY3Rpb24gdXRmMTZFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHtcbiAgICB2YXIgZW5kID0gdGhpcy5sYXN0VG90YWwgLSB0aGlzLmxhc3ROZWVkO1xuICAgIHJldHVybiByICsgdGhpcy5sYXN0Q2hhci50b1N0cmluZygndXRmMTZsZScsIDAsIGVuZCk7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRleHQoYnVmLCBpKSB7XG4gIHZhciBuID0gKGJ1Zi5sZW5ndGggLSBpKSAlIDM7XG4gIGlmIChuID09PSAwKSByZXR1cm4gYnVmLnRvU3RyaW5nKCdiYXNlNjQnLCBpKTtcbiAgdGhpcy5sYXN0TmVlZCA9IDMgLSBuO1xuICB0aGlzLmxhc3RUb3RhbCA9IDM7XG4gIGlmIChuID09PSAxKSB7XG4gICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMl07XG4gICAgdGhpcy5sYXN0Q2hhclsxXSA9IGJ1ZltidWYubGVuZ3RoIC0gMV07XG4gIH1cbiAgcmV0dXJuIGJ1Zi50b1N0cmluZygnYmFzZTY0JywgaSwgYnVmLmxlbmd0aCAtIG4pO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHJldHVybiByICsgdGhpcy5sYXN0Q2hhci50b1N0cmluZygnYmFzZTY0JywgMCwgMyAtIHRoaXMubGFzdE5lZWQpO1xuICByZXR1cm4gcjtcbn1cblxuLy8gUGFzcyBieXRlcyBvbiB0aHJvdWdoIGZvciBzaW5nbGUtYnl0ZSBlbmNvZGluZ3MgKGUuZy4gYXNjaWksIGxhdGluMSwgaGV4KVxuZnVuY3Rpb24gc2ltcGxlV3JpdGUoYnVmKSB7XG4gIHJldHVybiBidWYudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHNpbXBsZUVuZChidWYpIHtcbiAgcmV0dXJuIGJ1ZiAmJiBidWYubGVuZ3RoID8gdGhpcy53cml0ZShidWYpIDogJyc7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuZnVuY3Rpb24gYWZ0ZXJUcmFuc2Zvcm0oZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYikge1xuICAgIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCd3cml0ZSBjYWxsYmFjayBjYWxsZWQgbXVsdGlwbGUgdGltZXMnKSk7XG4gIH1cblxuICB0cy53cml0ZWNodW5rID0gbnVsbDtcbiAgdHMud3JpdGVjYiA9IG51bGw7XG5cbiAgaWYgKGRhdGEgIT0gbnVsbCkgLy8gc2luZ2xlIGVxdWFscyBjaGVjayBmb3IgYm90aCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgXG4gICAgdGhpcy5wdXNoKGRhdGEpO1xuXG4gIGNiKGVyKTtcblxuICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBycy5yZWFkaW5nID0gZmFsc2U7XG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0ge1xuICAgIGFmdGVyVHJhbnNmb3JtOiBhZnRlclRyYW5zZm9ybS5iaW5kKHRoaXMpLFxuICAgIG5lZWRUcmFuc2Zvcm06IGZhbHNlLFxuICAgIHRyYW5zZm9ybWluZzogZmFsc2UsXG4gICAgd3JpdGVjYjogbnVsbCxcbiAgICB3cml0ZWNodW5rOiBudWxsLFxuICAgIHdyaXRlZW5jb2Rpbmc6IG51bGxcbiAgfTtcblxuICAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB0aGlzLl90cmFuc2Zvcm0gPSBvcHRpb25zLnRyYW5zZm9ybTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoO1xuICB9XG5cbiAgLy8gV2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICB0aGlzLm9uKCdwcmVmaW5pc2gnLCBwcmVmaW5pc2gpO1xufVxuXG5mdW5jdGlvbiBwcmVmaW5pc2goKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgaWYgKHR5cGVvZiB0aGlzLl9mbHVzaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlciwgZGF0YSkge1xuICAgICAgZG9uZShfdGhpcywgZXIsIGRhdGEpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGRvbmUodGhpcywgbnVsbCwgbnVsbCk7XG4gIH1cbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHJldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xufTtcblxuLy8gVGhpcyBpcyB0aGUgcGFydCB3aGVyZSB5b3UgZG8gc3R1ZmYhXG4vLyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyAnY2h1bmsnIGlzIGFuIGlucHV0IGNodW5rLlxuLy9cbi8vIENhbGwgYHB1c2gobmV3Q2h1bmspYCB0byBwYXNzIGFsb25nIHRyYW5zZm9ybWVkIG91dHB1dFxuLy8gdG8gdGhlIHJlYWRhYmxlIHNpZGUuICBZb3UgbWF5IGNhbGwgJ3B1c2gnIHplcm8gb3IgbW9yZSB0aW1lcy5cbi8vXG4vLyBDYWxsIGBjYihlcnIpYCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsuICBJZiB5b3UgcGFzc1xuLy8gYW4gZXJyb3IsIHRoZW4gdGhhdCdsbCBwdXQgdGhlIGh1cnQgb24gdGhlIHdob2xlIG9wZXJhdGlvbi4gIElmIHlvdVxuLy8gbmV2ZXIgY2FsbCBjYigpLCB0aGVuIHlvdSdsbCBuZXZlciBnZXQgYW5vdGhlciBjaHVuay5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignX3RyYW5zZm9ybSgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gIER1cGxleC5wcm90b3R5cGUuX2Rlc3Ryb3kuY2FsbCh0aGlzLCBlcnIsIGZ1bmN0aW9uIChlcnIyKSB7XG4gICAgY2IoZXJyMik7XG4gICAgX3RoaXMyLmVtaXQoJ2Nsb3NlJyk7XG4gIH0pO1xufTtcblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcblxuICBpZiAoZGF0YSAhPSBudWxsKSAvLyBzaW5nbGUgZXF1YWxzIGNoZWNrIGZvciBib3RoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGBcbiAgICBzdHJlYW0ucHVzaChkYXRhKTtcblxuICAvLyBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlciwgdGhlbiB0aGF0IG1lYW5zXG4gIC8vIHRoYXQgbm90aGluZyBtb3JlIHdpbGwgZXZlciBiZSBwcm92aWRlZFxuICBpZiAoc3RyZWFtLl93cml0YWJsZVN0YXRlLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAoc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZS50cmFuc2Zvcm1pbmcpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZycpO1xuXG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbnZhciBvYmplY3RBc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbi8vIGNvbXBhcmUgYW5kIGlzQnVmZmVyIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvYmxvYi82ODBlOWU1ZTQ4OGYyMmFhYzI3NTk5YTU3ZGM4NDRhNjMxNTkyOGRkL2luZGV4LmpzXG4vLyBvcmlnaW5hbCBub3RpY2U6XG5cbi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIHggPSBhLmxlbmd0aDtcbiAgdmFyIHkgPSBiLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXTtcbiAgICAgIHkgPSBiW2ldO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmICh5IDwgeCkge1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxuZnVuY3Rpb24gaXNCdWZmZXIoYikge1xuICBpZiAoZ2xvYmFsLkJ1ZmZlciAmJiB0eXBlb2YgZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBnbG9iYWwuQnVmZmVyLmlzQnVmZmVyKGIpO1xuICB9XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpO1xufVxuXG4vLyBiYXNlZCBvbiBub2RlIGFzc2VydCwgb3JpZ2luYWwgbm90aWNlOlxuLy8gTkI6IFRoZSBVUkwgdG8gdGhlIENvbW1vbkpTIHNwZWMgaXMga2VwdCBqdXN0IGZvciB0cmFkaXRpb24uXG4vLyAgICAgbm9kZS1hc3NlcnQgaGFzIGV2b2x2ZWQgYSBsb3Qgc2luY2UgdGhlbiwgYm90aCBpbiBBUEkgYW5kIGJlaGF2aW9yLlxuXG4vLyBodHRwOi8vd2lraS5jb21tb25qcy5vcmcvd2lraS9Vbml0X1Rlc3RpbmcvMS4wXG4vL1xuLy8gVEhJUyBJUyBOT1QgVEVTVEVEIE5PUiBMSUtFTFkgVE8gV09SSyBPVVRTSURFIFY4IVxuLy9cbi8vIE9yaWdpbmFsbHkgZnJvbSBuYXJ3aGFsLmpzIChodHRwOi8vbmFyd2hhbGpzLm9yZylcbi8vIENvcHlyaWdodCAoYykgMjAwOSBUaG9tYXMgUm9iaW5zb24gPDI4MG5vcnRoLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAnU29mdHdhcmUnKSwgdG9cbi8vIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOXG4vLyBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsLycpO1xudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcFNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIGZ1bmN0aW9uc0hhdmVOYW1lcyA9IChmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb28oKSB7fS5uYW1lID09PSAnZm9vJztcbn0oKSk7XG5mdW5jdGlvbiBwVG9TdHJpbmcgKG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaik7XG59XG5mdW5jdGlvbiBpc1ZpZXcoYXJyYnVmKSB7XG4gIGlmIChpc0J1ZmZlcihhcnJidWYpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgZ2xvYmFsLkFycmF5QnVmZmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhcnJidWYpO1xuICB9XG4gIGlmICghYXJyYnVmKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChhcnJidWYgaW5zdGFuY2VvZiBEYXRhVmlldykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChhcnJidWYuYnVmZmVyICYmIGFycmJ1Zi5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbi8vIDEuIFRoZSBhc3NlcnQgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0aGF0IHRocm93XG4vLyBBc3NlcnRpb25FcnJvcidzIHdoZW4gcGFydGljdWxhciBjb25kaXRpb25zIGFyZSBub3QgbWV0LiBUaGVcbi8vIGFzc2VydCBtb2R1bGUgbXVzdCBjb25mb3JtIHRvIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlLlxuXG52YXIgYXNzZXJ0ID0gbW9kdWxlLmV4cG9ydHMgPSBvaztcblxuLy8gMi4gVGhlIEFzc2VydGlvbkVycm9yIGlzIGRlZmluZWQgaW4gYXNzZXJ0LlxuLy8gbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7IG1lc3NhZ2U6IG1lc3NhZ2UsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsOiBhY3R1YWwsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkIH0pXG5cbnZhciByZWdleCA9IC9cXHMqZnVuY3Rpb25cXHMrKFteXFwoXFxzXSopXFxzKi87XG4vLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL2Z1bmN0aW9uLnByb3RvdHlwZS5uYW1lL2Jsb2IvYWRlZWVlYzhiZmNjNjA2OGIxODdkN2Q5ZmIzZDViYjFkM2EzMDg5OS9pbXBsZW1lbnRhdGlvbi5qc1xuZnVuY3Rpb24gZ2V0TmFtZShmdW5jKSB7XG4gIGlmICghdXRpbC5pc0Z1bmN0aW9uKGZ1bmMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChmdW5jdGlvbnNIYXZlTmFtZXMpIHtcbiAgICByZXR1cm4gZnVuYy5uYW1lO1xuICB9XG4gIHZhciBzdHIgPSBmdW5jLnRvU3RyaW5nKCk7XG4gIHZhciBtYXRjaCA9IHN0ci5tYXRjaChyZWdleCk7XG4gIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXTtcbn1cbmFzc2VydC5Bc3NlcnRpb25FcnJvciA9IGZ1bmN0aW9uIEFzc2VydGlvbkVycm9yKG9wdGlvbnMpIHtcbiAgdGhpcy5uYW1lID0gJ0Fzc2VydGlvbkVycm9yJztcbiAgdGhpcy5hY3R1YWwgPSBvcHRpb25zLmFjdHVhbDtcbiAgdGhpcy5leHBlY3RlZCA9IG9wdGlvbnMuZXhwZWN0ZWQ7XG4gIHRoaXMub3BlcmF0b3IgPSBvcHRpb25zLm9wZXJhdG9yO1xuICBpZiAob3B0aW9ucy5tZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlO1xuICAgIHRoaXMuZ2VuZXJhdGVkTWVzc2FnZSA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubWVzc2FnZSA9IGdldE1lc3NhZ2UodGhpcyk7XG4gICAgdGhpcy5nZW5lcmF0ZWRNZXNzYWdlID0gdHJ1ZTtcbiAgfVxuICB2YXIgc3RhY2tTdGFydEZ1bmN0aW9uID0gb3B0aW9ucy5zdGFja1N0YXJ0RnVuY3Rpb24gfHwgZmFpbDtcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgc3RhY2tTdGFydEZ1bmN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBub24gdjggYnJvd3NlcnMgc28gd2UgY2FuIGhhdmUgYSBzdGFja3RyYWNlXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcigpO1xuICAgIGlmIChlcnIuc3RhY2spIHtcbiAgICAgIHZhciBvdXQgPSBlcnIuc3RhY2s7XG5cbiAgICAgIC8vIHRyeSB0byBzdHJpcCB1c2VsZXNzIGZyYW1lc1xuICAgICAgdmFyIGZuX25hbWUgPSBnZXROYW1lKHN0YWNrU3RhcnRGdW5jdGlvbik7XG4gICAgICB2YXIgaWR4ID0gb3V0LmluZGV4T2YoJ1xcbicgKyBmbl9uYW1lKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAvLyBvbmNlIHdlIGhhdmUgbG9jYXRlZCB0aGUgZnVuY3Rpb24gZnJhbWVcbiAgICAgICAgLy8gd2UgbmVlZCB0byBzdHJpcCBvdXQgZXZlcnl0aGluZyBiZWZvcmUgaXQgKGFuZCBpdHMgbGluZSlcbiAgICAgICAgdmFyIG5leHRfbGluZSA9IG91dC5pbmRleE9mKCdcXG4nLCBpZHggKyAxKTtcbiAgICAgICAgb3V0ID0gb3V0LnN1YnN0cmluZyhuZXh0X2xpbmUgKyAxKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGFjayA9IG91dDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIGFzc2VydC5Bc3NlcnRpb25FcnJvciBpbnN0YW5jZW9mIEVycm9yXG51dGlsLmluaGVyaXRzKGFzc2VydC5Bc3NlcnRpb25FcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiB0cnVuY2F0ZShzLCBuKSB7XG4gIGlmICh0eXBlb2YgcyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPCBuID8gcyA6IHMuc2xpY2UoMCwgbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHM7XG4gIH1cbn1cbmZ1bmN0aW9uIGluc3BlY3Qoc29tZXRoaW5nKSB7XG4gIGlmIChmdW5jdGlvbnNIYXZlTmFtZXMgfHwgIXV0aWwuaXNGdW5jdGlvbihzb21ldGhpbmcpKSB7XG4gICAgcmV0dXJuIHV0aWwuaW5zcGVjdChzb21ldGhpbmcpO1xuICB9XG4gIHZhciByYXduYW1lID0gZ2V0TmFtZShzb21ldGhpbmcpO1xuICB2YXIgbmFtZSA9IHJhd25hbWUgPyAnOiAnICsgcmF3bmFtZSA6ICcnO1xuICByZXR1cm4gJ1tGdW5jdGlvbicgKyAgbmFtZSArICddJztcbn1cbmZ1bmN0aW9uIGdldE1lc3NhZ2Uoc2VsZikge1xuICByZXR1cm4gdHJ1bmNhdGUoaW5zcGVjdChzZWxmLmFjdHVhbCksIDEyOCkgKyAnICcgK1xuICAgICAgICAgc2VsZi5vcGVyYXRvciArICcgJyArXG4gICAgICAgICB0cnVuY2F0ZShpbnNwZWN0KHNlbGYuZXhwZWN0ZWQpLCAxMjgpO1xufVxuXG4vLyBBdCBwcmVzZW50IG9ubHkgdGhlIHRocmVlIGtleXMgbWVudGlvbmVkIGFib3ZlIGFyZSB1c2VkIGFuZFxuLy8gdW5kZXJzdG9vZCBieSB0aGUgc3BlYy4gSW1wbGVtZW50YXRpb25zIG9yIHN1YiBtb2R1bGVzIGNhbiBwYXNzXG4vLyBvdGhlciBrZXlzIHRvIHRoZSBBc3NlcnRpb25FcnJvcidzIGNvbnN0cnVjdG9yIC0gdGhleSB3aWxsIGJlXG4vLyBpZ25vcmVkLlxuXG4vLyAzLiBBbGwgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbXVzdCB0aHJvdyBhbiBBc3NlcnRpb25FcnJvclxuLy8gd2hlbiBhIGNvcnJlc3BvbmRpbmcgY29uZGl0aW9uIGlzIG5vdCBtZXQsIHdpdGggYSBtZXNzYWdlIHRoYXRcbi8vIG1heSBiZSB1bmRlZmluZWQgaWYgbm90IHByb3ZpZGVkLiAgQWxsIGFzc2VydGlvbiBtZXRob2RzIHByb3ZpZGVcbi8vIGJvdGggdGhlIGFjdHVhbCBhbmQgZXhwZWN0ZWQgdmFsdWVzIHRvIHRoZSBhc3NlcnRpb24gZXJyb3IgZm9yXG4vLyBkaXNwbGF5IHB1cnBvc2VzLlxuXG5mdW5jdGlvbiBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIG9wZXJhdG9yLCBzdGFja1N0YXJ0RnVuY3Rpb24pIHtcbiAgdGhyb3cgbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBhY3R1YWw6IGFjdHVhbCxcbiAgICBleHBlY3RlZDogZXhwZWN0ZWQsXG4gICAgb3BlcmF0b3I6IG9wZXJhdG9yLFxuICAgIHN0YWNrU3RhcnRGdW5jdGlvbjogc3RhY2tTdGFydEZ1bmN0aW9uXG4gIH0pO1xufVxuXG4vLyBFWFRFTlNJT04hIGFsbG93cyBmb3Igd2VsbCBiZWhhdmVkIGVycm9ycyBkZWZpbmVkIGVsc2V3aGVyZS5cbmFzc2VydC5mYWlsID0gZmFpbDtcblxuLy8gNC4gUHVyZSBhc3NlcnRpb24gdGVzdHMgd2hldGhlciBhIHZhbHVlIGlzIHRydXRoeSwgYXMgZGV0ZXJtaW5lZFxuLy8gYnkgISFndWFyZC5cbi8vIGFzc2VydC5vayhndWFyZCwgbWVzc2FnZV9vcHQpO1xuLy8gVGhpcyBzdGF0ZW1lbnQgaXMgZXF1aXZhbGVudCB0byBhc3NlcnQuZXF1YWwodHJ1ZSwgISFndWFyZCxcbi8vIG1lc3NhZ2Vfb3B0KTsuIFRvIHRlc3Qgc3RyaWN0bHkgZm9yIHRoZSB2YWx1ZSB0cnVlLCB1c2Vcbi8vIGFzc2VydC5zdHJpY3RFcXVhbCh0cnVlLCBndWFyZCwgbWVzc2FnZV9vcHQpOy5cblxuZnVuY3Rpb24gb2sodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCF2YWx1ZSkgZmFpbCh2YWx1ZSwgdHJ1ZSwgbWVzc2FnZSwgJz09JywgYXNzZXJ0Lm9rKTtcbn1cbmFzc2VydC5vayA9IG9rO1xuXG4vLyA1LiBUaGUgZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIHNoYWxsb3csIGNvZXJjaXZlIGVxdWFsaXR5IHdpdGhcbi8vID09LlxuLy8gYXNzZXJ0LmVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9IGV4cGVjdGVkKSBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PScsIGFzc2VydC5lcXVhbCk7XG59O1xuXG4vLyA2LiBUaGUgbm9uLWVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBmb3Igd2hldGhlciB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsXG4vLyB3aXRoICE9IGFzc2VydC5ub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3RFcXVhbCA9IGZ1bmN0aW9uIG5vdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCA9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9JywgYXNzZXJ0Lm5vdEVxdWFsKTtcbiAgfVxufTtcblxuLy8gNy4gVGhlIGVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBhIGRlZXAgZXF1YWxpdHkgcmVsYXRpb24uXG4vLyBhc3NlcnQuZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmRlZXBFcXVhbCA9IGZ1bmN0aW9uIGRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmICghX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBmYWxzZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdkZWVwRXF1YWwnLCBhc3NlcnQuZGVlcEVxdWFsKTtcbiAgfVxufTtcblxuYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIGRlZXBTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmICghX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCB0cnVlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ2RlZXBTdHJpY3RFcXVhbCcsIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHN0cmljdCwgbWVtb3MpIHtcbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYWN0dWFsKSAmJiBpc0J1ZmZlcihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gY29tcGFyZShhY3R1YWwsIGV4cGVjdGVkKSA9PT0gMDtcblxuICAvLyA3LjIuIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIERhdGUgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIERhdGUgb2JqZWN0IHRoYXQgcmVmZXJzIHRvIHRoZSBzYW1lIHRpbWUuXG4gIH0gZWxzZSBpZiAodXRpbC5pc0RhdGUoYWN0dWFsKSAmJiB1dGlsLmlzRGF0ZShleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gYWN0dWFsLmdldFRpbWUoKSA9PT0gZXhwZWN0ZWQuZ2V0VGltZSgpO1xuXG4gIC8vIDcuMyBJZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIFJlZ0V4cCBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzb3VyY2UgYW5kXG4gIC8vIHByb3BlcnRpZXMgKGBnbG9iYWxgLCBgbXVsdGlsaW5lYCwgYGxhc3RJbmRleGAsIGBpZ25vcmVDYXNlYCkuXG4gIH0gZWxzZSBpZiAodXRpbC5pc1JlZ0V4cChhY3R1YWwpICYmIHV0aWwuaXNSZWdFeHAoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGFjdHVhbC5zb3VyY2UgPT09IGV4cGVjdGVkLnNvdXJjZSAmJlxuICAgICAgICAgICBhY3R1YWwuZ2xvYmFsID09PSBleHBlY3RlZC5nbG9iYWwgJiZcbiAgICAgICAgICAgYWN0dWFsLm11bHRpbGluZSA9PT0gZXhwZWN0ZWQubXVsdGlsaW5lICYmXG4gICAgICAgICAgIGFjdHVhbC5sYXN0SW5kZXggPT09IGV4cGVjdGVkLmxhc3RJbmRleCAmJlxuICAgICAgICAgICBhY3R1YWwuaWdub3JlQ2FzZSA9PT0gZXhwZWN0ZWQuaWdub3JlQ2FzZTtcblxuICAvLyA3LjQuIE90aGVyIHBhaXJzIHRoYXQgZG8gbm90IGJvdGggcGFzcyB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcsXG4gIC8vIGVxdWl2YWxlbmNlIGlzIGRldGVybWluZWQgYnkgPT0uXG4gIH0gZWxzZSBpZiAoKGFjdHVhbCA9PT0gbnVsbCB8fCB0eXBlb2YgYWN0dWFsICE9PSAnb2JqZWN0JykgJiZcbiAgICAgICAgICAgICAoZXhwZWN0ZWQgPT09IG51bGwgfHwgdHlwZW9mIGV4cGVjdGVkICE9PSAnb2JqZWN0JykpIHtcbiAgICByZXR1cm4gc3RyaWN0ID8gYWN0dWFsID09PSBleHBlY3RlZCA6IGFjdHVhbCA9PSBleHBlY3RlZDtcblxuICAvLyBJZiBib3RoIHZhbHVlcyBhcmUgaW5zdGFuY2VzIG9mIHR5cGVkIGFycmF5cywgd3JhcCB0aGVpciB1bmRlcmx5aW5nXG4gIC8vIEFycmF5QnVmZmVycyBpbiBhIEJ1ZmZlciBlYWNoIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlXG4gIC8vIFRoaXMgb3B0aW1pemF0aW9uIHJlcXVpcmVzIHRoZSBhcnJheXMgdG8gaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGNoZWNrZWQgYnlcbiAgLy8gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyAoYWthIHBUb1N0cmluZykuIE5ldmVyIHBlcmZvcm0gYmluYXJ5XG4gIC8vIGNvbXBhcmlzb25zIGZvciBGbG9hdCpBcnJheXMsIHRob3VnaCwgc2luY2UgZS5nLiArMCA9PT0gLTAgYnV0IHRoZWlyXG4gIC8vIGJpdCBwYXR0ZXJucyBhcmUgbm90IGlkZW50aWNhbC5cbiAgfSBlbHNlIGlmIChpc1ZpZXcoYWN0dWFsKSAmJiBpc1ZpZXcoZXhwZWN0ZWQpICYmXG4gICAgICAgICAgICAgcFRvU3RyaW5nKGFjdHVhbCkgPT09IHBUb1N0cmluZyhleHBlY3RlZCkgJiZcbiAgICAgICAgICAgICAhKGFjdHVhbCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSB8fFxuICAgICAgICAgICAgICAgYWN0dWFsIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSkge1xuICAgIHJldHVybiBjb21wYXJlKG5ldyBVaW50OEFycmF5KGFjdHVhbC5idWZmZXIpLFxuICAgICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KGV4cGVjdGVkLmJ1ZmZlcikpID09PSAwO1xuXG4gIC8vIDcuNSBGb3IgYWxsIG90aGVyIE9iamVjdCBwYWlycywgaW5jbHVkaW5nIEFycmF5IG9iamVjdHMsIGVxdWl2YWxlbmNlIGlzXG4gIC8vIGRldGVybWluZWQgYnkgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChhcyB2ZXJpZmllZFxuICAvLyB3aXRoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCksIHRoZSBzYW1lIHNldCBvZiBrZXlzXG4gIC8vIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLCBlcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnlcbiAgLy8gY29ycmVzcG9uZGluZyBrZXksIGFuZCBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuIE5vdGU6IHRoaXNcbiAgLy8gYWNjb3VudHMgZm9yIGJvdGggbmFtZWQgYW5kIGluZGV4ZWQgcHJvcGVydGllcyBvbiBBcnJheXMuXG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYWN0dWFsKSAhPT0gaXNCdWZmZXIoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIG1lbW9zID0gbWVtb3MgfHwge2FjdHVhbDogW10sIGV4cGVjdGVkOiBbXX07XG5cbiAgICB2YXIgYWN0dWFsSW5kZXggPSBtZW1vcy5hY3R1YWwuaW5kZXhPZihhY3R1YWwpO1xuICAgIGlmIChhY3R1YWxJbmRleCAhPT0gLTEpIHtcbiAgICAgIGlmIChhY3R1YWxJbmRleCA9PT0gbWVtb3MuZXhwZWN0ZWQuaW5kZXhPZihleHBlY3RlZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWVtb3MuYWN0dWFsLnB1c2goYWN0dWFsKTtcbiAgICBtZW1vcy5leHBlY3RlZC5wdXNoKGV4cGVjdGVkKTtcblxuICAgIHJldHVybiBvYmpFcXVpdihhY3R1YWwsIGV4cGVjdGVkLCBzdHJpY3QsIG1lbW9zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyhvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xufVxuXG5mdW5jdGlvbiBvYmpFcXVpdihhLCBiLCBzdHJpY3QsIGFjdHVhbFZpc2l0ZWRPYmplY3RzKSB7XG4gIGlmIChhID09PSBudWxsIHx8IGEgPT09IHVuZGVmaW5lZCB8fCBiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG4gIC8vIGlmIG9uZSBpcyBhIHByaW1pdGl2ZSwgdGhlIG90aGVyIG11c3QgYmUgc2FtZVxuICBpZiAodXRpbC5pc1ByaW1pdGl2ZShhKSB8fCB1dGlsLmlzUHJpbWl0aXZlKGIpKVxuICAgIHJldHVybiBhID09PSBiO1xuICBpZiAoc3RyaWN0ICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSAhPT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGIpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgdmFyIGFJc0FyZ3MgPSBpc0FyZ3VtZW50cyhhKTtcbiAgdmFyIGJJc0FyZ3MgPSBpc0FyZ3VtZW50cyhiKTtcbiAgaWYgKChhSXNBcmdzICYmICFiSXNBcmdzKSB8fCAoIWFJc0FyZ3MgJiYgYklzQXJncykpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoYUlzQXJncykge1xuICAgIGEgPSBwU2xpY2UuY2FsbChhKTtcbiAgICBiID0gcFNsaWNlLmNhbGwoYik7XG4gICAgcmV0dXJuIF9kZWVwRXF1YWwoYSwgYiwgc3RyaWN0KTtcbiAgfVxuICB2YXIga2EgPSBvYmplY3RLZXlzKGEpO1xuICB2YXIga2IgPSBvYmplY3RLZXlzKGIpO1xuICB2YXIga2V5LCBpO1xuICAvLyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGtleXMgaW5jb3Jwb3JhdGVzXG4gIC8vIGhhc093blByb3BlcnR5KVxuICBpZiAoa2EubGVuZ3RoICE9PSBrYi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvL3RoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy9+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPT0ga2JbaV0pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy9lcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnkgY29ycmVzcG9uZGluZyBrZXksIGFuZFxuICAvL35+fnBvc3NpYmx5IGV4cGVuc2l2ZSBkZWVwIHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBrZXkgPSBrYVtpXTtcbiAgICBpZiAoIV9kZWVwRXF1YWwoYVtrZXldLCBiW2tleV0sIHN0cmljdCwgYWN0dWFsVmlzaXRlZE9iamVjdHMpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyA4LiBUaGUgbm9uLWVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBmb3IgYW55IGRlZXAgaW5lcXVhbGl0eS5cbi8vIGFzc2VydC5ub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90RGVlcEVxdWFsID0gZnVuY3Rpb24gbm90RGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgZmFsc2UpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnbm90RGVlcEVxdWFsJywgYXNzZXJ0Lm5vdERlZXBFcXVhbCk7XG4gIH1cbn07XG5cbmFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWwgPSBub3REZWVwU3RyaWN0RXF1YWw7XG5mdW5jdGlvbiBub3REZWVwU3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCB0cnVlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ25vdERlZXBTdHJpY3RFcXVhbCcsIG5vdERlZXBTdHJpY3RFcXVhbCk7XG4gIH1cbn1cblxuXG4vLyA5LiBUaGUgc3RyaWN0IGVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBzdHJpY3QgZXF1YWxpdHksIGFzIGRldGVybWluZWQgYnkgPT09LlxuLy8gYXNzZXJ0LnN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LnN0cmljdEVxdWFsID0gZnVuY3Rpb24gc3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJz09PScsIGFzc2VydC5zdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbi8vIDEwLiBUaGUgc3RyaWN0IG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHN0cmljdCBpbmVxdWFsaXR5LCBhc1xuLy8gZGV0ZXJtaW5lZCBieSAhPT0uICBhc3NlcnQubm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90U3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnIT09JywgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkge1xuICBpZiAoIWFjdHVhbCB8fCAhZXhwZWN0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGV4cGVjdGVkKSA9PSAnW29iamVjdCBSZWdFeHBdJykge1xuICAgIHJldHVybiBleHBlY3RlZC50ZXN0KGFjdHVhbCk7XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSWdub3JlLiAgVGhlIGluc3RhbmNlb2YgY2hlY2sgZG9lc24ndCB3b3JrIGZvciBhcnJvdyBmdW5jdGlvbnMuXG4gIH1cblxuICBpZiAoRXJyb3IuaXNQcm90b3R5cGVPZihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZXhwZWN0ZWQuY2FsbCh7fSwgYWN0dWFsKSA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gX3RyeUJsb2NrKGJsb2NrKSB7XG4gIHZhciBlcnJvcjtcbiAgdHJ5IHtcbiAgICBibG9jaygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyb3IgPSBlO1xuICB9XG4gIHJldHVybiBlcnJvcjtcbn1cblxuZnVuY3Rpb24gX3Rocm93cyhzaG91bGRUaHJvdywgYmxvY2ssIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIHZhciBhY3R1YWw7XG5cbiAgaWYgKHR5cGVvZiBibG9jayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYmxvY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXhwZWN0ZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgbWVzc2FnZSA9IGV4cGVjdGVkO1xuICAgIGV4cGVjdGVkID0gbnVsbDtcbiAgfVxuXG4gIGFjdHVhbCA9IF90cnlCbG9jayhibG9jayk7XG5cbiAgbWVzc2FnZSA9IChleHBlY3RlZCAmJiBleHBlY3RlZC5uYW1lID8gJyAoJyArIGV4cGVjdGVkLm5hbWUgKyAnKS4nIDogJy4nKSArXG4gICAgICAgICAgICAobWVzc2FnZSA/ICcgJyArIG1lc3NhZ2UgOiAnLicpO1xuXG4gIGlmIChzaG91bGRUaHJvdyAmJiAhYWN0dWFsKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnTWlzc2luZyBleHBlY3RlZCBleGNlcHRpb24nICsgbWVzc2FnZSk7XG4gIH1cblxuICB2YXIgdXNlclByb3ZpZGVkTWVzc2FnZSA9IHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJztcbiAgdmFyIGlzVW53YW50ZWRFeGNlcHRpb24gPSAhc2hvdWxkVGhyb3cgJiYgdXRpbC5pc0Vycm9yKGFjdHVhbCk7XG4gIHZhciBpc1VuZXhwZWN0ZWRFeGNlcHRpb24gPSAhc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmICFleHBlY3RlZDtcblxuICBpZiAoKGlzVW53YW50ZWRFeGNlcHRpb24gJiZcbiAgICAgIHVzZXJQcm92aWRlZE1lc3NhZ2UgJiZcbiAgICAgIGV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpKSB8fFxuICAgICAgaXNVbmV4cGVjdGVkRXhjZXB0aW9uKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnR290IHVud2FudGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIGlmICgoc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmIGV4cGVjdGVkICYmXG4gICAgICAhZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkpIHx8ICghc2hvdWxkVGhyb3cgJiYgYWN0dWFsKSkge1xuICAgIHRocm93IGFjdHVhbDtcbiAgfVxufVxuXG4vLyAxMS4gRXhwZWN0ZWQgdG8gdGhyb3cgYW4gZXJyb3I6XG4vLyBhc3NlcnQudGhyb3dzKGJsb2NrLCBFcnJvcl9vcHQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LnRocm93cyA9IGZ1bmN0aW9uKGJsb2NrLCAvKm9wdGlvbmFsKi9lcnJvciwgLypvcHRpb25hbCovbWVzc2FnZSkge1xuICBfdGhyb3dzKHRydWUsIGJsb2NrLCBlcnJvciwgbWVzc2FnZSk7XG59O1xuXG4vLyBFWFRFTlNJT04hIFRoaXMgaXMgYW5ub3lpbmcgdG8gd3JpdGUgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbmFzc2VydC5kb2VzTm90VGhyb3cgPSBmdW5jdGlvbihibG9jaywgLypvcHRpb25hbCovZXJyb3IsIC8qb3B0aW9uYWwqL21lc3NhZ2UpIHtcbiAgX3Rocm93cyhmYWxzZSwgYmxvY2ssIGVycm9yLCBtZXNzYWdlKTtcbn07XG5cbmFzc2VydC5pZkVycm9yID0gZnVuY3Rpb24oZXJyKSB7IGlmIChlcnIpIHRocm93IGVycjsgfTtcblxuLy8gRXhwb3NlIGEgc3RyaWN0IG9ubHkgdmFyaWFudCBvZiBhc3NlcnRcbmZ1bmN0aW9uIHN0cmljdCh2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAoIXZhbHVlKSBmYWlsKHZhbHVlLCB0cnVlLCBtZXNzYWdlLCAnPT0nLCBzdHJpY3QpO1xufVxuYXNzZXJ0LnN0cmljdCA9IG9iamVjdEFzc2lnbihzdHJpY3QsIGFzc2VydCwge1xuICBlcXVhbDogYXNzZXJ0LnN0cmljdEVxdWFsLFxuICBkZWVwRXF1YWw6IGFzc2VydC5kZWVwU3RyaWN0RXF1YWwsXG4gIG5vdEVxdWFsOiBhc3NlcnQubm90U3RyaWN0RXF1YWwsXG4gIG5vdERlZXBFcXVhbDogYXNzZXJ0Lm5vdERlZXBTdHJpY3RFcXVhbFxufSk7XG5hc3NlcnQuc3RyaWN0LnN0cmljdCA9IGFzc2VydC5zdHJpY3Q7XG5cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKGhhc093bi5jYWxsKG9iaiwga2V5KSkga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgfHxcbiAgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmopIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgdmFyIGRlc2NyaXB0b3JzID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZXNjcmlwdG9yc1trZXlzW2ldXSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXlzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0b3JzO1xuICB9O1xuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRpbmcgdGhpbmdzIGluIHRoZSBwcm9jZXNzIG9mIHN0YXJ0aW5nIHVwLlxuICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCcuL3N1cHBvcnQvaXNCdWZmZXInKTtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbigpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKSk7XG59O1xuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5leHBvcnRzLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5fZXh0ZW5kID0gZnVuY3Rpb24ob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn07XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG5cbnZhciBrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyA/IFN5bWJvbCgndXRpbC5wcm9taXNpZnkuY3VzdG9tJykgOiB1bmRlZmluZWQ7XG5cbmV4cG9ydHMucHJvbWlzaWZ5ID0gZnVuY3Rpb24gcHJvbWlzaWZ5KG9yaWdpbmFsKSB7XG4gIGlmICh0eXBlb2Ygb3JpZ2luYWwgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwib3JpZ2luYWxcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24nKTtcblxuICBpZiAoa0N1c3RvbVByb21pc2lmaWVkU3ltYm9sICYmIG9yaWdpbmFsW2tDdXN0b21Qcm9taXNpZmllZFN5bWJvbF0pIHtcbiAgICB2YXIgZm4gPSBvcmlnaW5hbFtrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2xdO1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInV0aWwucHJvbWlzaWZ5LmN1c3RvbVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbicpO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sIGtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCwge1xuICAgICAgdmFsdWU6IGZuLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICBmdW5jdGlvbiBmbigpIHtcbiAgICB2YXIgcHJvbWlzZVJlc29sdmUsIHByb21pc2VSZWplY3Q7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBwcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICBwcm9taXNlUmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgfVxuICAgIGFyZ3MucHVzaChmdW5jdGlvbiAoZXJyLCB2YWx1ZSkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBwcm9taXNlUmVqZWN0KGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9taXNlUmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgb3JpZ2luYWwuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBwcm9taXNlUmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZm4sIE9iamVjdC5nZXRQcm90b3R5cGVPZihvcmlnaW5hbCkpO1xuXG4gIGlmIChrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2wpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwga0N1c3RvbVByb21pc2lmaWVkU3ltYm9sLCB7XG4gICAgdmFsdWU6IGZuLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhcbiAgICBmbixcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9yaWdpbmFsKVxuICApO1xufVxuXG5leHBvcnRzLnByb21pc2lmeS5jdXN0b20gPSBrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2xcblxuZnVuY3Rpb24gY2FsbGJhY2tpZnlPblJlamVjdGVkKHJlYXNvbiwgY2IpIHtcbiAgLy8gYCFyZWFzb25gIGd1YXJkIGluc3BpcmVkIGJ5IGJsdWViaXJkIChSZWY6IGh0dHBzOi8vZ29vLmdsL3Q1SVM2TSkuXG4gIC8vIEJlY2F1c2UgYG51bGxgIGlzIGEgc3BlY2lhbCBlcnJvciB2YWx1ZSBpbiBjYWxsYmFja3Mgd2hpY2ggbWVhbnMgXCJubyBlcnJvclxuICAvLyBvY2N1cnJlZFwiLCB3ZSBlcnJvci13cmFwIHNvIHRoZSBjYWxsYmFjayBjb25zdW1lciBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlblxuICAvLyBcInRoZSBwcm9taXNlIHJlamVjdGVkIHdpdGggbnVsbFwiIG9yIFwidGhlIHByb21pc2UgZnVsZmlsbGVkIHdpdGggdW5kZWZpbmVkXCIuXG4gIGlmICghcmVhc29uKSB7XG4gICAgdmFyIG5ld1JlYXNvbiA9IG5ldyBFcnJvcignUHJvbWlzZSB3YXMgcmVqZWN0ZWQgd2l0aCBhIGZhbHN5IHZhbHVlJyk7XG4gICAgbmV3UmVhc29uLnJlYXNvbiA9IHJlYXNvbjtcbiAgICByZWFzb24gPSBuZXdSZWFzb247XG4gIH1cbiAgcmV0dXJuIGNiKHJlYXNvbik7XG59XG5cbmZ1bmN0aW9uIGNhbGxiYWNraWZ5KG9yaWdpbmFsKSB7XG4gIGlmICh0eXBlb2Ygb3JpZ2luYWwgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJvcmlnaW5hbFwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbicpO1xuICB9XG5cbiAgLy8gV2UgRE8gTk9UIHJldHVybiB0aGUgcHJvbWlzZSBhcyBpdCBnaXZlcyB0aGUgdXNlciBhIGZhbHNlIHNlbnNlIHRoYXRcbiAgLy8gdGhlIHByb21pc2UgaXMgYWN0dWFsbHkgc29tZWhvdyByZWxhdGVkIHRvIHRoZSBjYWxsYmFjaydzIGV4ZWN1dGlvblxuICAvLyBhbmQgdGhhdCB0aGUgY2FsbGJhY2sgdGhyb3dpbmcgd2lsbCByZWplY3QgdGhlIHByb21pc2UuXG4gIGZ1bmN0aW9uIGNhbGxiYWNraWZpZWQoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgfVxuXG4gICAgdmFyIG1heWJlQ2IgPSBhcmdzLnBvcCgpO1xuICAgIGlmICh0eXBlb2YgbWF5YmVDYiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxhc3QgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY2IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBtYXliZUNiLmFwcGx5KHNlbGYsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICAvLyBJbiB0cnVlIG5vZGUgc3R5bGUgd2UgcHJvY2VzcyB0aGUgY2FsbGJhY2sgb24gYG5leHRUaWNrYCB3aXRoIGFsbCB0aGVcbiAgICAvLyBpbXBsaWNhdGlvbnMgKHN0YWNrLCBgdW5jYXVnaHRFeGNlcHRpb25gLCBgYXN5bmNfaG9va3NgKVxuICAgIG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpXG4gICAgICAudGhlbihmdW5jdGlvbihyZXQpIHsgcHJvY2Vzcy5uZXh0VGljayhjYiwgbnVsbCwgcmV0KSB9LFxuICAgICAgICAgICAgZnVuY3Rpb24ocmVqKSB7IHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2tpZnlPblJlamVjdGVkLCByZWosIGNiKSB9KTtcbiAgfVxuXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihjYWxsYmFja2lmaWVkLCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY2FsbGJhY2tpZmllZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvcmlnaW5hbCkpO1xuICByZXR1cm4gY2FsbGJhY2tpZmllZDtcbn1cbmV4cG9ydHMuY2FsbGJhY2tpZnkgPSBjYWxsYmFja2lmeTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gTm90ZTogYWRsZXIzMiB0YWtlcyAxMiUgZm9yIGxldmVsIDAgYW5kIDIlIGZvciBsZXZlbCA2LlxuLy8gSXQgaXNuJ3Qgd29ydGggaXQgdG8gbWFrZSBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgYXMgaW4gb3JpZ2luYWwuXG4vLyBTbWFsbCBzaXplIGlzIHByZWZlcmFibGUuXG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuZnVuY3Rpb24gYWRsZXIzMihhZGxlciwgYnVmLCBsZW4sIHBvcykge1xuICB2YXIgczEgPSAoYWRsZXIgJiAweGZmZmYpIHwwLFxuICAgICAgczIgPSAoKGFkbGVyID4+PiAxNikgJiAweGZmZmYpIHwwLFxuICAgICAgbiA9IDA7XG5cbiAgd2hpbGUgKGxlbiAhPT0gMCkge1xuICAgIC8vIFNldCBsaW1pdCB+IHR3aWNlIGxlc3MgdGhhbiA1NTUyLCB0byBrZWVwXG4gICAgLy8gczIgaW4gMzEtYml0cywgYmVjYXVzZSB3ZSBmb3JjZSBzaWduZWQgaW50cy5cbiAgICAvLyBpbiBvdGhlciBjYXNlICU9IHdpbGwgZmFpbC5cbiAgICBuID0gbGVuID4gMjAwMCA/IDIwMDAgOiBsZW47XG4gICAgbGVuIC09IG47XG5cbiAgICBkbyB7XG4gICAgICBzMSA9IChzMSArIGJ1Zltwb3MrK10pIHwwO1xuICAgICAgczIgPSAoczIgKyBzMSkgfDA7XG4gICAgfSB3aGlsZSAoLS1uKTtcblxuICAgIHMxICU9IDY1NTIxO1xuICAgIHMyICU9IDY1NTIxO1xuICB9XG5cbiAgcmV0dXJuIChzMSB8IChzMiA8PCAxNikpIHwwO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gYWRsZXIzMjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gTm90ZTogd2UgY2FuJ3QgZ2V0IHNpZ25pZmljYW50IHNwZWVkIGJvb3N0IGhlcmUuXG4vLyBTbyB3cml0ZSBjb2RlIHRvIG1pbmltaXplIHNpemUgLSBubyBwcmVnZW5lcmF0ZWQgdGFibGVzXG4vLyBhbmQgYXJyYXkgdG9vbHMgZGVwZW5kZW5jaWVzLlxuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbi8vIFVzZSBvcmRpbmFyeSBhcnJheSwgc2luY2UgdW50eXBlZCBtYWtlcyBubyBib29zdCBoZXJlXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gIHZhciBjLCB0YWJsZSA9IFtdO1xuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgMjU2OyBuKyspIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IDg7IGsrKykge1xuICAgICAgYyA9ICgoYyAmIDEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICB9XG4gICAgdGFibGVbbl0gPSBjO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciB0ID0gY3JjVGFibGUsXG4gICAgICBlbmQgPSBwb3MgKyBsZW47XG5cbiAgY3JjIF49IC0xO1xuXG4gIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKykge1xuICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gYnVmW2ldKSAmIDB4RkZdO1xuICB9XG5cbiAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjcmMzMjtcbiIsIi8vaW1wb3J0IHsgZnMsIHVudGlsZGlmeSB9IGZyb20gJy4uL3V0aWxzL2dldFN0cmVhbSdcbmNvbnN0IGdzID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0U3RyZWFtJyk7XG5jb25zdCBmcyA9IGdzLmZzO1xuY29uc3QgdW50aWxkaWZ5ID0gZ3MudW50aWxkaWZ5O1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR3ppcFxuICogQGRlc2MgR2l6cGVkIHdhcmMgbWFnaWMgbnVtOlxuICogLSBCdWZmZXIuZnJvbSgnMWY4YjA4JywgJ2hleCcpXG4gKiAtIFVpbnQ4QXJyYXkgWyAzMSwgMTM5LCA4IF1cbiAqIE5vdCBnemlwZWQgd2FyYyBtYWdpYyBudW06XG4gKiAtIFVpbnQ4QXJyYXkgWyA4NywgNjUsIDgyIF1cbiAqIEB0eXBlIHtCdWZmZXJ9XG4gKi9cbmNvbnN0IGd6aXBNYWdpY051bSA9IEJ1ZmZlci5mcm9tKCcxZjhiMDgnLCAnaGV4JylcblxuLyoqXG4gKiBAdHlwZSB7bnVtYmVyfSBsZW5ndGggb2YgdGhlIGd6aXAgbWFnaWMgbnVtYmVyIF9oZWFkZXIgMyBieXRlc1xuICovXG5jb25zdCBnemlwTWFnaWNOdW1MZW4gPSBnemlwTWFnaWNOdW0ubGVuZ3RoXG5cbi8qKlxuICogVXRpbGl0eSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBtZWFucyB0byBkZXRlY3QgaWYgYSBmaWxlIGlzIGd6aXBwZWQgb3Igbm90XG4gKi9cbmNsYXNzIEd6aXBEZXRlY3RvciB7XG4gIC8qKlxuICAgKiBAZGVzYyBEZXRlcm1pbmVzIGlmIGEgZmlsZSBpcyBnemlwcGVkIG9yIG5vdCBieSByZWFkaW5nIGl0cyB0aGUgbWFnaWMgbnVtYmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aCAtIHBhdGggdG8gdGhlIGZpbGUgdG8gZGV0ZWN0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBmaWxlIGlzIGd6aXBwZWQgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgZmlsZVBhdGggaXMgbnVsbCBvciB1bmRlZmluZWQgb3IgaWYgYW5vdGhlciBlcnJvciBvY2N1cnJlZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGlzR3ppcHBlZCAoZmlsZVBhdGgpIHtcbiAgICBpZiAoZmlsZVBhdGggPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZmlsZVBhdGggcGF0aCBpcyAke2ZpbGVQYXRofWApXG4gICAgfVxuICAgIGZpbGVQYXRoID0gdW50aWxkaWZ5KGZpbGVQYXRoKVxuICAgIGNvbnN0IGZkID0gYXdhaXQgZnMub3BlbihmaWxlUGF0aCwgJ3InKVxuICAgIGNvbnN0IGZpbGxNZSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgzKVxuICAgIGF3YWl0IGZzLnJlYWQoZmQsIGZpbGxNZSwgMCwgMywgdW5kZWZpbmVkKVxuICAgIGF3YWl0IGZzLmNsb3NlKGZkKVxuICAgIGxldCBpID0gMFxuICAgIGxldCBpc0d6aXBwZWQgPSB0cnVlXG4gICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiBhcyB3ZSBjcmVhdGUgdGhlIFVuaXQ4QXJyYXkgdG8gYmUgc2l6ZSAzXG4gICAgLy8gYnV0IGp1c3QgaW4gY2FzZVxuICAgIGlmIChnemlwTWFnaWNOdW1MZW4gIT09IGZpbGxNZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBmb3IgKDsgaSA8IGd6aXBNYWdpY051bUxlbjsgKytpKSB7XG4gICAgICBpZiAoZ3ppcE1hZ2ljTnVtW2ldICE9PSBmaWxsTWVbaV0pIHtcbiAgICAgICAgaXNHemlwcGVkID0gZmFsc2VcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlzR3ppcHBlZFxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFN5bmNocm9ub3VzIHZlcnNpb24gb2Yge0BsaW5rIGlzR3ppcHBlZH1cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoIC0gcGF0aCB0byB0aGUgZmlsZSB0byBkZXRlY3RcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZmlsZSBpcyBnemlwcGVkIGZhbHNlIG90aGVyd2lzZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGZpbGVQYXRoIGlzIG51bGwgb3IgdW5kZWZpbmVkIG9yIGlmIGFub3RoZXIgZXJyb3Igb2NjdXJyZWRcbiAgICovXG4gIHN0YXRpYyBpc0d6aXBwZWRTeW5jIChmaWxlUGF0aCkge1xuICAgIGlmIChmaWxlUGF0aCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBmaWxlUGF0aCBwYXRoIGlzICR7ZmlsZVBhdGh9YClcbiAgICB9XG4gICAgZmlsZVBhdGggPSB1bnRpbGRpZnkoZmlsZVBhdGgpXG4gICAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhmaWxlUGF0aCwgJ3InKVxuICAgIGNvbnN0IGZpbGxNZSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgzKVxuICAgIGZzLnJlYWRTeW5jKGZkLCBmaWxsTWUsIDAsIDMsIHVuZGVmaW5lZClcbiAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgbGV0IGkgPSAwXG4gICAgbGV0IGlzR3ppcHBlZCA9IHRydWVcbiAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuIGFzIHdlIGNyZWF0ZSB0aGUgVW5pdDhBcnJheSB0byBiZSBzaXplIDNcbiAgICAvLyBidXQganVzdCBpbiBjYXNlXG4gICAgaWYgKGd6aXBNYWdpY051bUxlbiAhPT0gZmlsbE1lLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGZvciAoOyBpIDwgZ3ppcE1hZ2ljTnVtTGVuOyArK2kpIHtcbiAgICAgIGlmIChnemlwTWFnaWNOdW1baV0gIT09IGZpbGxNZVtpXSkge1xuICAgICAgICBpc0d6aXBwZWQgPSBmYWxzZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNHemlwcGVkXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7R3ppcERldGVjdG9yfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IEd6aXBEZXRlY3RvclxuIiwidmFyIHJuZyA9IHJlcXVpcmUoJy4vbGliL3JuZycpO1xudmFyIGJ5dGVzVG9VdWlkID0gcmVxdWlyZSgnLi9saWIvYnl0ZXNUb1V1aWQnKTtcblxuLy8gKipgdjEoKWAgLSBHZW5lcmF0ZSB0aW1lLWJhc2VkIFVVSUQqKlxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9MaW9zSy9VVUlELmpzXG4vLyBhbmQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3V1aWQuaHRtbFxuXG52YXIgX25vZGVJZDtcbnZhciBfY2xvY2tzZXE7XG5cbi8vIFByZXZpb3VzIHV1aWQgY3JlYXRpb24gdGltZVxudmFyIF9sYXN0TVNlY3MgPSAwO1xudmFyIF9sYXN0TlNlY3MgPSAwO1xuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Jyb29mYS9ub2RlLXV1aWQgZm9yIEFQSSBkZXRhaWxzXG5mdW5jdGlvbiB2MShvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICB2YXIgaSA9IGJ1ZiAmJiBvZmZzZXQgfHwgMDtcbiAgdmFyIGIgPSBidWYgfHwgW107XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBub2RlID0gb3B0aW9ucy5ub2RlIHx8IF9ub2RlSWQ7XG4gIHZhciBjbG9ja3NlcSA9IG9wdGlvbnMuY2xvY2tzZXEgIT09IHVuZGVmaW5lZCA/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+fVxuICAgKi9cbiAgdXJsICgpIHtcbiAgICBsZXQgdXJscyA9IEFycmF5LmZyb20odGhpcy5fcmVxcy5rZXlzKCkpXG4gICAgaWYgKHVybHMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdXJsc1swXVxuICAgIH1cbiAgICByZXR1cm4gdXJsc1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEl0ZXJhdGUgb3ZlciB0aGUgUmVxdWVzdEluZm8jdXJsIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ2FwdHVyZWRSZXF1ZXN0cyNyZXF1ZXN0SWRcbiAgICogQHJldHVybiB7SXRlcmF0b3I8c3RyaW5nPn1cbiAgICovXG4gIGtleXMgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXFzLmtleXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIEl0ZXJhdGUgb3ZlciB0aGUgQ0RQUmVxdWVzdEluZm8gYXNzb2NpYXRlZCB3aXRoIHRoZSBDYXB0dXJlZFJlcXVlc3RzI3JlcXVlc3RJZFxuICAgKiBAcmV0dXJuIHtJdGVyYXRvcjxDRFBSZXF1ZXN0SW5mbz59XG4gICAqL1xuICB2YWx1ZXMgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXFzLnZhbHVlcygpXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7Q2FwdHVyZWRSZXF1ZXN0fVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IENhcHR1cmVkUmVxdWVzdFxuIiwiJ3VzZSBzdHJpY3QnXG5jb25zdCB7XG4gIFdBUkNTdHJlYW1UcmFuc2Zvcm0sXG4gIEF1dG9XQVJDUGFyc2VyLFxuICBXQVJDR3pQYXJzZXIsXG4gIFdBUkNQYXJzZXJcbn0gPSByZXF1aXJlKCcuL2xpYi9wYXJzZXJzJylcblxuY29uc3Qge1xuICBDUklFeHRyYVdBUkNHZW5lcmF0b3IsXG4gIEVsZWN0cm9uV0FSQ1dyaXRlcixcbiAgUHVwcGV0ZWVyQ0RQV0FSQ0dlbmVyYXRvcixcbiAgUHVwcGV0ZWVyV0FSQ0dlbmVyYXRvcixcbiAgUmVtb3RlQ2hyb21lV0FSQ1dyaXRlcixcbiAgV0FSQ1dyaXRlckJhc2Vcbn0gPSByZXF1aXJlKCcuL2xpYi93cml0ZXJzJylcblxuY29uc3Qge1xuICBDUklFeHRyYUNhcHR1cmVyLFxuICBFbGVjdHJvbkNhcHR1cmVyLFxuICBQdXBwZXRlZXJDYXB0dXJlcixcbiAgUHVwcGV0ZWVyQ0RQQ2FwdHVyZXIsXG4gIFJlbW90ZUNocm9tZUNhcHR1cmVyLFxuICBSZXF1ZXN0SGFuZGxlclxufSA9IHJlcXVpcmUoJy4vbGliL3JlcXVlc3RDYXB0dXJlcnMnKVxuXG4vKipcbiAqIEB0eXBlIHtBdXRvV0FSQ1BhcnNlcn1cbiAqL1xuZXhwb3J0cy5BdXRvV0FSQ1BhcnNlciA9IEF1dG9XQVJDUGFyc2VyXG5cbi8qKlxuICogQHR5cGUge0NSSUV4dHJhUmVxdWVzdENhcHR1cmVyfVxuICovXG5leHBvcnRzLkNSSUV4dHJhQ2FwdHVyZXIgPSBDUklFeHRyYUNhcHR1cmVyXG5cbi8qKlxuICogQHR5cGUge0NSSUV4dHJhV0FSQ0dlbmVyYXRvcn1cbiAqL1xuZXhwb3J0cy5DUklFeHRyYVdBUkNHZW5lcmF0b3IgPSBDUklFeHRyYVdBUkNHZW5lcmF0b3JcblxuLyoqXG4gKiBAdHlwZSB7RWxlY3Ryb25SZXF1ZXN0Q2FwdHVyZXJ9XG4gKi9cbmV4cG9ydHMuRWxlY3Ryb25DYXB0dXJlciA9IEVsZWN0cm9uQ2FwdHVyZXJcblxuLyoqXG4gKiBAdHlwZSB7RWxlY3Ryb25XQVJDR2VuZXJhdG9yfVxuICovXG5leHBvcnRzLkVsZWN0cm9uV0FSQ1dyaXRlciA9IEVsZWN0cm9uV0FSQ1dyaXRlclxuXG4vKipcbiAqIEB0eXBlIHtQdXBwZXRlZXJDRFBSZXF1ZXN0Q2FwdHVyZXJ9XG4gKi9cbmV4cG9ydHMuUHVwcGV0ZWVyQ0RQQ2FwdHVyZXIgPSBQdXBwZXRlZXJDRFBDYXB0dXJlclxuXG4vKipcbiAqIEB0eXBlIHtQdXBwZXRlZXJDRFBXQVJDR2VuZXJhdG9yfVxuICovXG5leHBvcnRzLlB1cHBldGVlckNEUFdBUkNHZW5lcmF0b3IgPSBQdXBwZXRlZXJDRFBXQVJDR2VuZXJhdG9yXG5cbi8qKlxuICogQHR5cGUge1B1cHBldGVlclJlcXVlc3RDYXB0dXJlcn1cbiAqL1xuZXhwb3J0cy5QdXBwZXRlZXJDYXB0dXJlciA9IFB1cHBldGVlckNhcHR1cmVyXG5cbi8qKlxuICogQHR5cGUge1B1cHBldGVlcldBUkNHZW5lcmF0b3J9XG4gKi9cbmV4cG9ydHMuUHVwcGV0ZWVyV0FSQ0dlbmVyYXRvciA9IFB1cHBldGVlcldBUkNHZW5lcmF0b3JcblxuLyoqXG4gKiBAdHlwZSB7UmVtb3RlQ2hyb21lUmVxdWVzdENhcHR1cmVyfVxuICovXG5leHBvcnRzLlJlbW90ZUNocm9tZUNhcHR1cmVyID0gUmVtb3RlQ2hyb21lQ2FwdHVyZXJcblxuLyoqXG4gKiBAdHlwZSB7UmVtb3RlQ2hyb21lV0FSQ0dlbmVyYXRvcn1cbiAqL1xuZXhwb3J0cy5SZW1vdGVDaHJvbWVXQVJDV3JpdGVyID0gUmVtb3RlQ2hyb21lV0FSQ1dyaXRlclxuXG4vKipcbiAqIEB0eXBlIHtSZXF1ZXN0SGFuZGxlcn1cbiAqL1xuZXhwb3J0cy5SZXF1ZXN0SGFuZGxlciA9IFJlcXVlc3RIYW5kbGVyXG5cbi8qKlxuICogQHR5cGUge1dBUkNHelBhcnNlcn1cbiAqL1xuZXhwb3J0cy5XQVJDR3pQYXJzZXIgPSBXQVJDR3pQYXJzZXJcblxuLyoqXG4gKiBAdHlwZSB7V0FSQ1BhcnNlcn1cbiAqL1xuZXhwb3J0cy5XQVJDUGFyc2VyID0gV0FSQ1BhcnNlclxuXG4vKipcbiAqIEB0eXBlIHtXQVJDU3RyZWFtVHJhbnNmb3JtfVxuICovXG5leHBvcnRzLldBUkNTdHJlYW1UcmFuc2Zvcm0gPSBXQVJDU3RyZWFtVHJhbnNmb3JtXG5cbi8qKlxuICogQHR5cGUge1dBUkNXcml0ZXJCYXNlfVxuICovXG5leHBvcnRzLldBUkNXcml0ZXJCYXNlID0gV0FSQ1dyaXRlckJhc2VcblxuLyoqXG4gKiBAdHlwZSB7UmVxdWVzdExpYldBUkNHZW5lcmF0b3J9XG4gKi9cbmV4cG9ydHMuUmVxdWVzdExpYldBUkNXcml0ZXIgPSByZXF1aXJlKCcuL2xpYi93cml0ZXJzL3JlcXVlc3RMaWInKVxuXG5pZiAocmVxdWlyZSgnLi9saWIvcGFyc2Vycy9fY2FuVXNlUmVjb3JkSXRlcmF0b3InKSkge1xuICAvKipcbiAgICogQHR5cGUge2Z1bmN0aW9uKFJlYWRTdHJlYW0pOiBBc3luY0l0ZXJhdG9yPFdBUkNSZWNvcmQ+fVxuICAgKi9cbiAgZXhwb3J0cy5yZWNvcmRJdGVyYXRvciA9IHJlcXVpcmUoJy4vbGliL3BhcnNlcnMvcmVjb3JkdGVyYXRvcicpXG59XG5cbmV4cG9ydHMuc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbmV4cG9ydHMuemxpYiA9IHJlcXVpcmUoJ3psaWInKVxuXG4iLCIvKipcbiAqIEB0eXBlIHtBdXRvV0FSQ1BhcnNlcn1cbiAqL1xuZXhwb3J0cy5BdXRvV0FSQ1BhcnNlciA9IHJlcXVpcmUoJy4vYXV0b1dBUkNQYXJzZXInKVxuXG4vKipcbiAqIEB0eXBlIHtHemlwRGV0ZWN0b3J9XG4gKi9cbmV4cG9ydHMuR3ppcERldGVjdG9yID0gcmVxdWlyZSgnLi9nemlwRGV0ZWN0b3InKVxuXG4vKipcbiAqIEB0eXBlIHtXQVJDR3pQYXJzZXJ9XG4gKi9cbmV4cG9ydHMuV0FSQ0d6UGFyc2VyID0gcmVxdWlyZSgnLi93YXJjR3pQYXJzZXInKVxuXG4vKipcbiAqIEB0eXBlIHtXQVJDUGFyc2VyfVxuICovXG5leHBvcnRzLldBUkNQYXJzZXIgPSByZXF1aXJlKCcuL3dhcmNQYXJzZXInKVxuXG4vKipcbiAqIEB0eXBlIHtXQVJDU3RyZWFtVHJhbnNmb3JtfVxuICovXG5leHBvcnRzLldBUkNTdHJlYW1UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL3dhcmNTdHJlYW1UcmFuc2Zvcm0nKVxuXG5pZiAocmVxdWlyZSgnLi9fY2FuVXNlUmVjb3JkSXRlcmF0b3InKSkge1xuICAvKipcbiAgICogQHR5cGUge2Z1bmN0aW9uKHdhcmNTdHJlYW06IFJlYWRTdHJlYW18R3VuemlwKTogQXN5bmNJdGVyYXRvcjxXQVJDUmVjb3JkPn1cbiAgICovXG4gIGV4cG9ydHMucmVjb3JkSXRlcmF0b3IgPSByZXF1aXJlKCcuL3JlY29yZHRlcmF0b3InKVxufVxuIiwiY29uc3QgZ2V0U3RyZWFtID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0U3RyZWFtJykuZ2V0U3RyZWFtXG5jb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudGVtaXR0ZXIzJylcbmNvbnN0IFdBUkNTdHJlYW1UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL3dhcmNTdHJlYW1UcmFuc2Zvcm0nKVxuY29uc3QgR3ppcERldGVjdG9yID0gcmVxdWlyZSgnLi9nemlwRGV0ZWN0b3InKVxuY29uc3QgY2FuVXNlUmVjb3JkSXRlcmF0b3IgPSByZXF1aXJlKCcuL19jYW5Vc2VSZWNvcmRJdGVyYXRvcicpXG5cbi8qKlxuICogQGRlc2MgUGFyc2VzIGEgV0FSQyBmaWxlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0aW5nIGlmIGl0IGlzIGd6aXBwZWQuXG4gKiBAZXh0ZW5kcyB7RXZlbnRFbWl0dGVyfVxuICogQGV4YW1wbGVcbiAqICBjb25zdCBwYXJzZXIgPSBuZXcgQXV0b1dBUkNQYXJzZXIoJzxwYXRoLXRvLXdhcmNmaWxlPicpXG4gKiAgcGFyc2VyLm9uKCdyZWNvcmQnLCByZWNvcmQgPT4geyBjb25zb2xlLmxvZyhyZWNvcmQpIH0pXG4gKiAgcGFyc2VyLm9uKCdlcnJvcicsIGVycm9yID0+IHsgY29uc29sZS5lcnJvcihlcnJvcikgfSlcbiAqICBwYXJzZXIuc3RhcnQoKVxuICogQGV4YW1wbGVcbiAqICBjb25zdCBwYXJzZXIgPSBuZXcgQXV0b1dBUkNQYXJzZXIoKVxuICogIHBhcnNlci5vbigncmVjb3JkJywgcmVjb3JkID0+IHsgY29uc29sZS5sb2cocmVjb3JkKSB9KVxuICogIHBhcnNlci5vbignZXJyb3InLCBlcnJvciA9PiB7IGNvbnNvbGUuZXJyb3IoZXJyb3IpIH0pXG4gKiAgcGFyc2VyLnBhcnNlV0FSQygnPHBhdGgtdG8td2FyY2ZpbGU+JylcbiAqICBAZXhhbXBsZVxuICogIC8vIHJlcXVpcmVzIG5vZGUgPj0gMTBcbiAqICBmb3IgYXdhaXQgKGNvbnN0IHJlY29yZCBvZiBuZXcgQXV0b1dBUkNQYXJzZXIoJzxwYXRoLXRvLXdhcmNmaWxlPicpKSB7XG4gKiAgICBjb25zb2xlLmxvZyhyZWNvcmQpXG4gKiAgfVxuICovXG5jbGFzcyBBdXRvV0FSQ1BhcnNlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBAZGVzYyBDcmVhdGUgYSBuZXcgQXV0b1dBUkNQYXJzZXJcbiAgICogQHBhcmFtIHs/c3RyaW5nfSBbd3BdIC0gcGF0aCB0byB0aGUgd2FyYyBmaWxlIHRvIGJlIHBhcnNlZFxuICAgKi9cbiAgY29uc3RydWN0b3IgKHdwKSB7XG4gICAgc3VwZXIoKVxuICAgIC8qKlxuICAgICAqIEB0eXBlIHs/c3RyaW5nfSB0aGUgcGF0aCB0byB0aGUgV0FSQyBmaWxlIHRvIGJlIHBhcnNlZFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5fd3AgPSB3cFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59IGlzIHRoZSBwYXJzZXIgY3VycmVudGx5IHBhcnNpbmcgdGhlIFdBUkNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX3BhcnNpbmcgPSBmYWxzZVxuXG4gICAgdGhpcy5fb25SZWNvcmQgPSB0aGlzLl9vblJlY29yZC5iaW5kKHRoaXMpXG4gICAgdGhpcy5fb25FbmQgPSB0aGlzLl9vbkVuZC5iaW5kKHRoaXMpXG4gICAgdGhpcy5fb25FcnJvciA9IHRoaXMuX29uRXJyb3IuYmluZCh0aGlzKVxuXG4gICAgaWYgKGNhblVzZVJlY29yZEl0ZXJhdG9yKSB7XG4gICAgICBjb25zdCByZWNvcmRJdGVyYXRvciA9IHJlcXVpcmUoJy4vcmVjb3JkdGVyYXRvcicpXG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm5zIHtBc3luY0l0ZXJhdG9yPFdBUkNSZWNvcmQ+fVxuICAgICAgICovXG4gICAgICB0aGlzW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlY29yZEl0ZXJhdG9yKHRoaXMuX2dldFN0cmVhbSgpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBCZWdpbiBwYXJzaW5nIHRoZSBXQVJDIGZpbGUuIE9uY2UgdGhlIHN0YXJ0IG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgdGhlIHBhcnNlciB3aWxsIGJlZ2luIGVtaXR0aW5nXG4gICAqIEBlbWl0cyB7cmVjb3JkfSBlbWl0dGVkIHdoZW4gdGhlIHBhcnNlciBoYXMgcGFyc2VkIGEgZnVsbCByZWNvcmQsIHRoZSBhcmd1bWVudCBzdXBwbGllZCB0byB0aGUgbGlzdGVuZXIgd2lsbCBiZSB0aGUgcGFyc2VkIHJlY29yZFxuICAgKiBAZW1pdHMge2RvbmV9IGVtaXR0ZWQgd2hlbiB0aGUgV0FSQyBmaWxlIGhhcyBiZWVuIGNvbXBsZXRlbHkgcGFyc2VkXG4gICAqIEBlbWl0cyB7ZXJyb3J9IGVtaXR0ZWQgaWYgYW4gZXhjZXB0aW9uIG9jY3VycywgdGhlIGFyZ3VtZW50IHN1cHBsaWVkIHRvIHRoZSBsaXN0ZW5lciB3aWxsIGJlIHRoZSBlcnJvciB0aGF0IG9jY3VycmVkLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSAgaWYgdGhlIHBhcnNlciBoYXMgYmVndW4gb3IgaXMgY3VycmVudGx5IHBhcnNpbmcgYSBXQVJDIGZpbGVcbiAgICogLSB0cnVlOiBpbmRpY2F0ZXMgdGhlIHBhcnNlciBoYXMgYmVndW4gcGFyc2luZyB0aGUgV0FSQyBmaWxlIHRydWVcbiAgICogLSBmYWxzZTogaW5kaWNhdGVkIHRoZSBwYXJzZXIgaXMgY3VycmVudGx5IHBhcnNpbmcgYSBXQVJDIGZpbGVcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBwYXRoIHRvIHRoZSBXQVJDIGZpbGUgaXMgbnVsbCBvciB1bmRlZmluZWQgb3IgYW5vdGhlciBlcnJvciBvY2N1cnJlZFxuICAgKi9cbiAgc3RhcnQgKCkge1xuICAgIGxldCBzdGFydGVkUGFyc2luZyA9IGZhbHNlXG4gICAgaWYgKCF0aGlzLl9wYXJzaW5nKSB7XG4gICAgICBpZiAodGhpcy5fd3AgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzdXBwbGllZCBwYXRoIHRvIHRoZSBXQVJDIGZpbGUgaXMgbnVsbC91bmRlZmluZWQnKVxuICAgICAgfVxuICAgICAgdGhpcy5fcGFyc2luZyA9IHRydWVcbiAgICAgIHRoaXMuX2dldFN0cmVhbSgpXG4gICAgICAgIC5waXBlKG5ldyBXQVJDU3RyZWFtVHJhbnNmb3JtKCkpXG4gICAgICAgIC5vbignZGF0YScsIHRoaXMuX29uUmVjb3JkKVxuICAgICAgICAub24oJ2Vycm9yJywgdGhpcy5fb25FcnJvcilcbiAgICAgICAgLm9uKCdlbmQnLCB0aGlzLl9vbkVuZClcbiAgICAgIHN0YXJ0ZWRQYXJzaW5nID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gc3RhcnRlZFBhcnNpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBBbGlhcyBmb3Ige0BsaW5rIHN0YXJ0fSBleGNlcHQgdGhhdCB5b3UgY2FuIHN1cHBseSB0aGUgcGF0aCB0byB0aGUgV0FSQyBmaWxlIHRvIGJlIHBhcnNlZFxuICAgKiBpZiBvbmUgd2FzIG5vdCBzdXBwbGllZCB2aWEgdGhlIGNvbnN0cnVjdG9yIG9yIHRvIHBhcnNlIGFub3RoZXIgV0FSQyBmaWxlLiBJZiB0aGUgcGF0aCB0byBXQVJDIGZpbGVcbiAgICogdG8gYmUgcGFyc2VkIHdhcyBzdXBwbGllZCB2aWEgdGhlIGNvbnN0cnVjdG9yIGFuZCB5b3Ugc3VwcGx5IGEgZGlmZmVyZW50IHBhdGggdG8gdGhpcyBtZXRob2QuXG4gICAqIEl0IHdpbGwgb3ZlcnJpZGUgdGhlIG9uZSBzdXBwbGllZCB2aWEgdGhlIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gW3dwXSAtIHBhdGggdG8gdGhlIFdBUkMgZmlsZSB0byBiZSBwYXJzZWRcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gaW5kaWNhdGlvbiBpZiB0aGUgcGFyc2VyIGhhcyBiZWd1biBvciBpcyBjdXJyZW50bHkgcGFyc2luZyBhIFdBUkMgZmlsZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIHBhdGggdG8gdGhlIFdBUkMgZmlsZSBpcyBudWxsIG9yIHVuZGVmaW5lZCBvciBhbm90aGVyIGVycm9yIG9jY3VycmVkXG4gICAqL1xuICBwYXJzZVdBUkMgKHdwKSB7XG4gICAgaWYgKCF0aGlzLl9wYXJzaW5nKSB7XG4gICAgICB0aGlzLl93cCA9IHdwIHx8IHRoaXMuX3dwXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXJ0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBMaXN0ZW5lciBmb3IgYSBwYXJzZXJzIHJlY29yZCBldmVudFxuICAgKiBAcGFyYW0ge1dBUkNSZWNvcmR9IHJlY29yZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uUmVjb3JkIChyZWNvcmQpIHtcbiAgICB0aGlzLmVtaXQoJ3JlY29yZCcsIHJlY29yZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBMaXN0ZW5lciBmb3IgYSBwYXJzZXJzIGRvbmUgZXZlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbkVuZCAoKSB7XG4gICAgdGhpcy5fcGFyc2luZyA9IGZhbHNlXG4gICAgdGhpcy5lbWl0KCdkb25lJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBMaXN0ZW5lciBmb3IgYSBwYXJzZXJzIGVycm9yIGV2ZW50XG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25FcnJvciAoZXJyb3IpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgUmV0dXJucyBhIFJlYWRTdHJlYW0gZm9yIHRoZSBXQVJDIHRvIGJlIHBhcnNlZC5cbiAgICogSWYgdGhlIFdBUkMgZmlsZSBpcyBnemlwZWQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgdGhlXG4gICAqIHJlc3VsdHMgb2YgYGBSZWFkU3RyZWFtLnBpcGUoemxpYi5jcmVhdGVHdW56aXAoKSlgYFxuICAgKiBAcmV0dXJucyB7UmVhZFN0cmVhbXxHdW56aXB9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZ2V0U3RyZWFtICgpIHtcbiAgICBjb25zdCBpc0d6ID0gR3ppcERldGVjdG9yLmlzR3ppcHBlZFN5bmModGhpcy5fd3ApXG4gICAgY29uc3Qgc3RyZWFtID0gZ2V0U3RyZWFtKHRoaXMuX3dwLCB0cnVlKVxuICAgIGlmIChpc0d6KSByZXR1cm4gc3RyZWFtLnBpcGUoemxpYi5jcmVhdGVHdW56aXAoKSlcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7QXV0b1dBUkNQYXJzZXJ9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gQXV0b1dBUkNQYXJzZXJcbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArXG4gICAgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9XG4gICAgICAoKHVpbnQ4W2ldIDw8IDE2KSAmIDB4RkYwMDAwKSArXG4gICAgICAoKHVpbnQ4W2kgKyAxXSA8PCA4KSAmIDB4RkYwMCkgK1xuICAgICAgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsoXG4gICAgICB1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpXG4gICAgKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSAoZSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSAobSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICgodmFsdWUgKiBjKSAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuZnVuY3Rpb24gY29weUJ1ZmZlcihzcmMsIHRhcmdldCwgb2Zmc2V0KSB7XG4gIHNyYy5jb3B5KHRhcmdldCwgb2Zmc2V0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEJ1ZmZlckxpc3QoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJ1ZmZlckxpc3QpO1xuXG4gICAgdGhpcy5oZWFkID0gbnVsbDtcbiAgICB0aGlzLnRhaWwgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgfVxuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiBwdXNoKHYpIHtcbiAgICB2YXIgZW50cnkgPSB7IGRhdGE6IHYsIG5leHQ6IG51bGwgfTtcbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB0aGlzLnRhaWwubmV4dCA9IGVudHJ5O2Vsc2UgdGhpcy5oZWFkID0gZW50cnk7XG4gICAgdGhpcy50YWlsID0gZW50cnk7XG4gICAgKyt0aGlzLmxlbmd0aDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gdW5zaGlmdCh2KSB7XG4gICAgdmFyIGVudHJ5ID0geyBkYXRhOiB2LCBuZXh0OiB0aGlzLmhlYWQgfTtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHRoaXMudGFpbCA9IGVudHJ5O1xuICAgIHRoaXMuaGVhZCA9IGVudHJ5O1xuICAgICsrdGhpcy5sZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbiBzaGlmdCgpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB2YXIgcmV0ID0gdGhpcy5oZWFkLmRhdGE7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxKSB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsO2Vsc2UgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHQ7XG4gICAgLS10aGlzLmxlbmd0aDtcbiAgICByZXR1cm4gcmV0O1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIGpvaW4ocykge1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICAgIHZhciBwID0gdGhpcy5oZWFkO1xuICAgIHZhciByZXQgPSAnJyArIHAuZGF0YTtcbiAgICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgICAgcmV0ICs9IHMgKyBwLmRhdGE7XG4gICAgfXJldHVybiByZXQ7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0KG4pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxKSByZXR1cm4gdGhpcy5oZWFkLmRhdGE7XG4gICAgdmFyIHJldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuID4+PiAwKTtcbiAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKHApIHtcbiAgICAgIGNvcHlCdWZmZXIocC5kYXRhLCByZXQsIGkpO1xuICAgICAgaSArPSBwLmRhdGEubGVuZ3RoO1xuICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICByZXR1cm4gQnVmZmVyTGlzdDtcbn0oKTtcblxuaWYgKHV0aWwgJiYgdXRpbC5pbnNwZWN0ICYmIHV0aWwuaW5zcGVjdC5jdXN0b20pIHtcbiAgbW9kdWxlLmV4cG9ydHMucHJvdG90eXBlW3V0aWwuaW5zcGVjdC5jdXN0b21dID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBvYmogPSB1dGlsLmluc3BlY3QoeyBsZW5ndGg6IHRoaXMubGVuZ3RoIH0pO1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnICcgKyBvYmo7XG4gIH07XG59IiwidmFyIHNjb3BlID0gKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsKSB8fFxuICAgICAgICAgICAgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYpIHx8XG4gICAgICAgICAgICB3aW5kb3c7XG52YXIgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG5cbi8vIERPTSBBUElzLCBmb3IgY29tcGxldGVuZXNzXG5cbmV4cG9ydHMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRUaW1lb3V0LCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJUaW1lb3V0KTtcbn07XG5leHBvcnRzLnNldEludGVydmFsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldEludGVydmFsLCBzY29wZSwgYXJndW1lbnRzKSwgY2xlYXJJbnRlcnZhbCk7XG59O1xuZXhwb3J0cy5jbGVhclRpbWVvdXQgPVxuZXhwb3J0cy5jbGVhckludGVydmFsID0gZnVuY3Rpb24odGltZW91dCkge1xuICBpZiAodGltZW91dCkge1xuICAgIHRpbWVvdXQuY2xvc2UoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gVGltZW91dChpZCwgY2xlYXJGbikge1xuICB0aGlzLl9pZCA9IGlkO1xuICB0aGlzLl9jbGVhckZuID0gY2xlYXJGbjtcbn1cblRpbWVvdXQucHJvdG90eXBlLnVucmVmID0gVGltZW91dC5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24oKSB7fTtcblRpbWVvdXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2NsZWFyRm4uY2FsbChzY29wZSwgdGhpcy5faWQpO1xufTtcblxuLy8gRG9lcyBub3Qgc3RhcnQgdGhlIHRpbWUsIGp1c3Qgc2V0cyB1cCB0aGUgbWVtYmVycyBuZWVkZWQuXG5leHBvcnRzLmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0sIG1zZWNzKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSBtc2Vjcztcbn07XG5cbmV4cG9ydHMudW5lbnJvbGwgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSAtMTtcbn07XG5cbmV4cG9ydHMuX3VucmVmQWN0aXZlID0gZXhwb3J0cy5hY3RpdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcblxuICB2YXIgbXNlY3MgPSBpdGVtLl9pZGxlVGltZW91dDtcbiAgaWYgKG1zZWNzID49IDApIHtcbiAgICBpdGVtLl9pZGxlVGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICBpZiAoaXRlbS5fb25UaW1lb3V0KVxuICAgICAgICBpdGVtLl9vblRpbWVvdXQoKTtcbiAgICB9LCBtc2Vjcyk7XG4gIH1cbn07XG5cbi8vIHNldGltbWVkaWF0ZSBhdHRhY2hlcyBpdHNlbGYgdG8gdGhlIGdsb2JhbCBvYmplY3RcbnJlcXVpcmUoXCJzZXRpbW1lZGlhdGVcIik7XG4vLyBPbiBzb21lIGV4b3RpYyBlbnZpcm9ubWVudHMsIGl0J3Mgbm90IGNsZWFyIHdoaWNoIG9iamVjdCBgc2V0aW1tZWRpYXRlYCB3YXNcbi8vIGFibGUgdG8gaW5zdGFsbCBvbnRvLiAgU2VhcmNoIGVhY2ggcG9zc2liaWxpdHkgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlXG4vLyBgc2V0aW1tZWRpYXRlYCBsaWJyYXJ5LlxuZXhwb3J0cy5zZXRJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuc2V0SW1tZWRpYXRlKTtcbmV4cG9ydHMuY2xlYXJJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5jbGVhckltbWVkaWF0ZSk7XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxOyAvLyBTcGVjIHNheXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgICB2YXIgdGFza3NCeUhhbmRsZSA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIHZhciByZWdpc3RlckltbWVkaWF0ZTtcblxuICAgIGZ1bmN0aW9uIHNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuICAgICAgLy8gQ2FsbGJhY2sgY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24oXCJcIiArIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIENvcHkgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAxXTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIGFuZCByZWdpc3RlciB0aGUgdGFza1xuICAgICAgdmFyIHRhc2sgPSB7IGNhbGxiYWNrOiBjYWxsYmFjaywgYXJnczogYXJncyB9O1xuICAgICAgdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXSA9IHRhc2s7XG4gICAgICByZWdpc3RlckltbWVkaWF0ZShuZXh0SGFuZGxlKTtcbiAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7XG4gICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuKHRhc2spIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgdmFyIGFyZ3MgPSB0YXNrLmFyZ3M7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSWZQcmVzZW50KGhhbmRsZSkge1xuICAgICAgICAvLyBGcm9tIHRoZSBzcGVjOiBcIldhaXQgdW50aWwgYW55IGludm9jYXRpb25zIG9mIHRoaXMgYWxnb3JpdGhtIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgb25lIGhhdmUgY29tcGxldGVkLlwiXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nQVRhc2spIHtcbiAgICAgICAgICAgIC8vIERlbGF5IGJ5IGRvaW5nIGEgc2V0VGltZW91dC4gc2V0SW1tZWRpYXRlIHdhcyB0cmllZCBpbnN0ZWFkLCBidXQgaW4gRmlyZWZveCA3IGl0IGdlbmVyYXRlZCBhXG4gICAgICAgICAgICAvLyBcInRvbyBtdWNoIHJlY3Vyc2lvblwiIGVycm9yLlxuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBydW4odGFzayk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcnVuSWZQcmVzZW50KGhhbmRsZSk7IH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsIFwiKlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaHRtbC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaHRtbC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiID8gdHlwZW9mIGdsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMgOiBnbG9iYWwgOiBzZWxmKSk7XG4iLCJcbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXByZWNhdGU7XG5cbi8qKlxuICogTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbiAqIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS5ub0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50aHJvd0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIHRocm93IGFuIEVycm9yIHdoZW4gaW52b2tlZC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRyYWNlRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgaW52b2tlIGBjb25zb2xlLnRyYWNlKClgIGluc3RlYWQgb2YgYGNvbnNvbGUuZXJyb3IoKWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0aGUgZnVuY3Rpb24gdG8gZGVwcmVjYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnIC0gdGhlIHN0cmluZyB0byBwcmludCB0byB0aGUgY29uc29sZSB3aGVuIGBmbmAgaXMgaW52b2tlZFxuICogQHJldHVybnMge0Z1bmN0aW9ufSBhIG5ldyBcImRlcHJlY2F0ZWRcIiB2ZXJzaW9uIG9mIGBmbmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGVwcmVjYXRlIChmbiwgbXNnKSB7XG4gIGlmIChjb25maWcoJ25vRGVwcmVjYXRpb24nKSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKGNvbmZpZygndGhyb3dEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChjb25maWcoJ3RyYWNlRGVwcmVjYXRpb24nKSkge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGBsb2NhbFN0b3JhZ2VgIGZvciBib29sZWFuIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGBuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb25maWcgKG5hbWUpIHtcbiAgLy8gYWNjZXNzaW5nIGdsb2JhbC5sb2NhbFN0b3JhZ2UgY2FuIHRyaWdnZXIgYSBET01FeGNlcHRpb24gaW4gc2FuZGJveGVkIGlmcmFtZXNcbiAgdHJ5IHtcbiAgICBpZiAoIWdsb2JhbC5sb2NhbFN0b3JhZ2UpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdmFsID0gZ2xvYmFsLmxvY2FsU3RvcmFnZVtuYW1lXTtcbiAgaWYgKG51bGwgPT0gdmFsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG5cbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fd3JpdGFibGUuanMnKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpLlRyYW5zZm9ybVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL3JlYWRhYmxlJykuUGFzc1Rocm91Z2hcbiIsIid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludCBjYW1lbGNhc2U6IFwib2ZmXCIgKi9cblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuXG52YXIgWnN0cmVhbSA9IHJlcXVpcmUoJ3Bha28vbGliL3psaWIvenN0cmVhbScpO1xudmFyIHpsaWJfZGVmbGF0ZSA9IHJlcXVpcmUoJ3Bha28vbGliL3psaWIvZGVmbGF0ZS5qcycpO1xudmFyIHpsaWJfaW5mbGF0ZSA9IHJlcXVpcmUoJ3Bha28vbGliL3psaWIvaW5mbGF0ZS5qcycpO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJ3Bha28vbGliL3psaWIvY29uc3RhbnRzJyk7XG5cbmZvciAodmFyIGtleSBpbiBjb25zdGFudHMpIHtcbiAgZXhwb3J0c1trZXldID0gY29uc3RhbnRzW2tleV07XG59XG5cbi8vIHpsaWIgbW9kZXNcbmV4cG9ydHMuTk9ORSA9IDA7XG5leHBvcnRzLkRFRkxBVEUgPSAxO1xuZXhwb3J0cy5JTkZMQVRFID0gMjtcbmV4cG9ydHMuR1pJUCA9IDM7XG5leHBvcnRzLkdVTlpJUCA9IDQ7XG5leHBvcnRzLkRFRkxBVEVSQVcgPSA1O1xuZXhwb3J0cy5JTkZMQVRFUkFXID0gNjtcbmV4cG9ydHMuVU5aSVAgPSA3O1xuXG52YXIgR1pJUF9IRUFERVJfSUQxID0gMHgxZjtcbnZhciBHWklQX0hFQURFUl9JRDIgPSAweDhiO1xuXG4vKipcbiAqIEVtdWxhdGUgTm9kZSdzIHpsaWIgQysrIGxheWVyIGZvciB1c2UgYnkgdGhlIEpTIGxheWVyIGluIGluZGV4LmpzXG4gKi9cbmZ1bmN0aW9uIFpsaWIobW9kZSkge1xuICBpZiAodHlwZW9mIG1vZGUgIT09ICdudW1iZXInIHx8IG1vZGUgPCBleHBvcnRzLkRFRkxBVEUgfHwgbW9kZSA+IGV4cG9ydHMuVU5aSVApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCYWQgYXJndW1lbnQnKTtcbiAgfVxuXG4gIHRoaXMuZGljdGlvbmFyeSA9IG51bGw7XG4gIHRoaXMuZXJyID0gMDtcbiAgdGhpcy5mbHVzaCA9IDA7XG4gIHRoaXMuaW5pdF9kb25lID0gZmFsc2U7XG4gIHRoaXMubGV2ZWwgPSAwO1xuICB0aGlzLm1lbUxldmVsID0gMDtcbiAgdGhpcy5tb2RlID0gbW9kZTtcbiAgdGhpcy5zdHJhdGVneSA9IDA7XG4gIHRoaXMud2luZG93Qml0cyA9IDA7XG4gIHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MgPSBmYWxzZTtcbiAgdGhpcy5wZW5kaW5nX2Nsb3NlID0gZmFsc2U7XG4gIHRoaXMuZ3ppcF9pZF9ieXRlc19yZWFkID0gMDtcbn1cblxuWmxpYi5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLndyaXRlX2luX3Byb2dyZXNzKSB7XG4gICAgdGhpcy5wZW5kaW5nX2Nsb3NlID0gdHJ1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnBlbmRpbmdfY2xvc2UgPSBmYWxzZTtcblxuICBhc3NlcnQodGhpcy5pbml0X2RvbmUsICdjbG9zZSBiZWZvcmUgaW5pdCcpO1xuICBhc3NlcnQodGhpcy5tb2RlIDw9IGV4cG9ydHMuVU5aSVApO1xuXG4gIGlmICh0aGlzLm1vZGUgPT09IGV4cG9ydHMuREVGTEFURSB8fCB0aGlzLm1vZGUgPT09IGV4cG9ydHMuR1pJUCB8fCB0aGlzLm1vZGUgPT09IGV4cG9ydHMuREVGTEFURVJBVykge1xuICAgIHpsaWJfZGVmbGF0ZS5kZWZsYXRlRW5kKHRoaXMuc3RybSk7XG4gIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSBleHBvcnRzLklORkxBVEUgfHwgdGhpcy5tb2RlID09PSBleHBvcnRzLkdVTlpJUCB8fCB0aGlzLm1vZGUgPT09IGV4cG9ydHMuSU5GTEFURVJBVyB8fCB0aGlzLm1vZGUgPT09IGV4cG9ydHMuVU5aSVApIHtcbiAgICB6bGliX2luZmxhdGUuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICB9XG5cbiAgdGhpcy5tb2RlID0gZXhwb3J0cy5OT05FO1xuXG4gIHRoaXMuZGljdGlvbmFyeSA9IG51bGw7XG59O1xuXG5abGliLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChmbHVzaCwgaW5wdXQsIGluX29mZiwgaW5fbGVuLCBvdXQsIG91dF9vZmYsIG91dF9sZW4pIHtcbiAgcmV0dXJuIHRoaXMuX3dyaXRlKHRydWUsIGZsdXNoLCBpbnB1dCwgaW5fb2ZmLCBpbl9sZW4sIG91dCwgb3V0X29mZiwgb3V0X2xlbik7XG59O1xuXG5abGliLnByb3RvdHlwZS53cml0ZVN5bmMgPSBmdW5jdGlvbiAoZmx1c2gsIGlucHV0LCBpbl9vZmYsIGluX2xlbiwgb3V0LCBvdXRfb2ZmLCBvdXRfbGVuKSB7XG4gIHJldHVybiB0aGlzLl93cml0ZShmYWxzZSwgZmx1c2gsIGlucHV0LCBpbl9vZmYsIGluX2xlbiwgb3V0LCBvdXRfb2ZmLCBvdXRfbGVuKTtcbn07XG5cblpsaWIucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChhc3luYywgZmx1c2gsIGlucHV0LCBpbl9vZmYsIGluX2xlbiwgb3V0LCBvdXRfb2ZmLCBvdXRfbGVuKSB7XG4gIGFzc2VydC5lcXVhbChhcmd1bWVudHMubGVuZ3RoLCA4KTtcblxuICBhc3NlcnQodGhpcy5pbml0X2RvbmUsICd3cml0ZSBiZWZvcmUgaW5pdCcpO1xuICBhc3NlcnQodGhpcy5tb2RlICE9PSBleHBvcnRzLk5PTkUsICdhbHJlYWR5IGZpbmFsaXplZCcpO1xuICBhc3NlcnQuZXF1YWwoZmFsc2UsIHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MsICd3cml0ZSBhbHJlYWR5IGluIHByb2dyZXNzJyk7XG4gIGFzc2VydC5lcXVhbChmYWxzZSwgdGhpcy5wZW5kaW5nX2Nsb3NlLCAnY2xvc2UgaXMgcGVuZGluZycpO1xuXG4gIHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MgPSB0cnVlO1xuXG4gIGFzc2VydC5lcXVhbChmYWxzZSwgZmx1c2ggPT09IHVuZGVmaW5lZCwgJ211c3QgcHJvdmlkZSBmbHVzaCB2YWx1ZScpO1xuXG4gIHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MgPSB0cnVlO1xuXG4gIGlmIChmbHVzaCAhPT0gZXhwb3J0cy5aX05PX0ZMVVNIICYmIGZsdXNoICE9PSBleHBvcnRzLlpfUEFSVElBTF9GTFVTSCAmJiBmbHVzaCAhPT0gZXhwb3J0cy5aX1NZTkNfRkxVU0ggJiYgZmx1c2ggIT09IGV4cG9ydHMuWl9GVUxMX0ZMVVNIICYmIGZsdXNoICE9PSBleHBvcnRzLlpfRklOSVNIICYmIGZsdXNoICE9PSBleHBvcnRzLlpfQkxPQ0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZmx1c2ggdmFsdWUnKTtcbiAgfVxuXG4gIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgaW5wdXQgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgaW5fbGVuID0gMDtcbiAgICBpbl9vZmYgPSAwO1xuICB9XG5cbiAgdGhpcy5zdHJtLmF2YWlsX2luID0gaW5fbGVuO1xuICB0aGlzLnN0cm0uaW5wdXQgPSBpbnB1dDtcbiAgdGhpcy5zdHJtLm5leHRfaW4gPSBpbl9vZmY7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSBvdXRfbGVuO1xuICB0aGlzLnN0cm0ub3V0cHV0ID0gb3V0O1xuICB0aGlzLnN0cm0ubmV4dF9vdXQgPSBvdXRfb2ZmO1xuICB0aGlzLmZsdXNoID0gZmx1c2g7XG5cbiAgaWYgKCFhc3luYykge1xuICAgIC8vIHN5bmMgdmVyc2lvblxuICAgIHRoaXMuX3Byb2Nlc3MoKTtcblxuICAgIGlmICh0aGlzLl9jaGVja0Vycm9yKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hZnRlclN5bmMoKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gYXN5bmMgdmVyc2lvblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgIHNlbGYuX3Byb2Nlc3MoKTtcbiAgICBzZWxmLl9hZnRlcigpO1xuICB9KTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cblpsaWIucHJvdG90eXBlLl9hZnRlclN5bmMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhdmFpbF9vdXQgPSB0aGlzLnN0cm0uYXZhaWxfb3V0O1xuICB2YXIgYXZhaWxfaW4gPSB0aGlzLnN0cm0uYXZhaWxfaW47XG5cbiAgdGhpcy53cml0ZV9pbl9wcm9ncmVzcyA9IGZhbHNlO1xuXG4gIHJldHVybiBbYXZhaWxfaW4sIGF2YWlsX291dF07XG59O1xuXG5abGliLnByb3RvdHlwZS5fcHJvY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5leHRfZXhwZWN0ZWRfaGVhZGVyX2J5dGUgPSBudWxsO1xuXG4gIC8vIElmIHRoZSBhdmFpbF9vdXQgaXMgbGVmdCBhdCAwLCB0aGVuIGl0IG1lYW5zIHRoYXQgaXQgcmFuIG91dFxuICAvLyBvZiByb29tLiAgSWYgdGhlcmUgd2FzIGF2YWlsX291dCBsZWZ0IG92ZXIsIHRoZW4gaXQgbWVhbnNcbiAgLy8gdGhhdCBhbGwgb2YgdGhlIGlucHV0IHdhcyBjb25zdW1lZC5cbiAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgICBjYXNlIGV4cG9ydHMuREVGTEFURTpcbiAgICBjYXNlIGV4cG9ydHMuR1pJUDpcbiAgICBjYXNlIGV4cG9ydHMuREVGTEFURVJBVzpcbiAgICAgIHRoaXMuZXJyID0gemxpYl9kZWZsYXRlLmRlZmxhdGUodGhpcy5zdHJtLCB0aGlzLmZsdXNoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgZXhwb3J0cy5VTlpJUDpcbiAgICAgIGlmICh0aGlzLnN0cm0uYXZhaWxfaW4gPiAwKSB7XG4gICAgICAgIG5leHRfZXhwZWN0ZWRfaGVhZGVyX2J5dGUgPSB0aGlzLnN0cm0ubmV4dF9pbjtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoICh0aGlzLmd6aXBfaWRfYnl0ZXNfcmVhZCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgaWYgKG5leHRfZXhwZWN0ZWRfaGVhZGVyX2J5dGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLnN0cm0uaW5wdXRbbmV4dF9leHBlY3RlZF9oZWFkZXJfYnl0ZV0gPT09IEdaSVBfSEVBREVSX0lEMSkge1xuICAgICAgICAgICAgdGhpcy5nemlwX2lkX2J5dGVzX3JlYWQgPSAxO1xuICAgICAgICAgICAgbmV4dF9leHBlY3RlZF9oZWFkZXJfYnl0ZSsrO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zdHJtLmF2YWlsX2luID09PSAxKSB7XG4gICAgICAgICAgICAgIC8vIFRoZSBvbmx5IGF2YWlsYWJsZSBieXRlIHdhcyBhbHJlYWR5IHJlYWQuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1vZGUgPSBleHBvcnRzLklORkxBVEU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChuZXh0X2V4cGVjdGVkX2hlYWRlcl9ieXRlID09PSBudWxsKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5zdHJtLmlucHV0W25leHRfZXhwZWN0ZWRfaGVhZGVyX2J5dGVdID09PSBHWklQX0hFQURFUl9JRDIpIHtcbiAgICAgICAgICAgIHRoaXMuZ3ppcF9pZF9ieXRlc19yZWFkID0gMjtcbiAgICAgICAgICAgIHRoaXMubW9kZSA9IGV4cG9ydHMuR1VOWklQO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBhY3R1YWwgZGlmZmVyZW5jZSBiZXR3ZWVuIElORkxBVEUgYW5kIElORkxBVEVSQVdcbiAgICAgICAgICAgIC8vIChhZnRlciBpbml0aWFsaXphdGlvbikuXG4gICAgICAgICAgICB0aGlzLm1vZGUgPSBleHBvcnRzLklORkxBVEU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG51bWJlciBvZiBnemlwIG1hZ2ljIG51bWJlciBieXRlcyByZWFkJyk7XG4gICAgICB9XG5cbiAgICAvLyBmYWxsdGhyb3VnaFxuICAgIGNhc2UgZXhwb3J0cy5JTkZMQVRFOlxuICAgIGNhc2UgZXhwb3J0cy5HVU5aSVA6XG4gICAgY2FzZSBleHBvcnRzLklORkxBVEVSQVc6XG4gICAgICB0aGlzLmVyciA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlKHRoaXMuc3RybSwgdGhpcy5mbHVzaFxuXG4gICAgICAvLyBJZiBkYXRhIHdhcyBlbmNvZGVkIHdpdGggZGljdGlvbmFyeVxuICAgICAgKTtpZiAodGhpcy5lcnIgPT09IGV4cG9ydHMuWl9ORUVEX0RJQ1QgJiYgdGhpcy5kaWN0aW9uYXJ5KSB7XG4gICAgICAgIC8vIExvYWQgaXRcbiAgICAgICAgdGhpcy5lcnIgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCB0aGlzLmRpY3Rpb25hcnkpO1xuICAgICAgICBpZiAodGhpcy5lcnIgPT09IGV4cG9ydHMuWl9PSykge1xuICAgICAgICAgIC8vIEFuZCB0cnkgdG8gZGVjb2RlIGFnYWluXG4gICAgICAgICAgdGhpcy5lcnIgPSB6bGliX2luZmxhdGUuaW5mbGF0ZSh0aGlzLnN0cm0sIHRoaXMuZmx1c2gpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXJyID09PSBleHBvcnRzLlpfREFUQV9FUlJPUikge1xuICAgICAgICAgIC8vIEJvdGggaW5mbGF0ZVNldERpY3Rpb25hcnkoKSBhbmQgaW5mbGF0ZSgpIHJldHVybiBaX0RBVEFfRVJST1IuXG4gICAgICAgICAgLy8gTWFrZSBpdCBwb3NzaWJsZSBmb3IgQWZ0ZXIoKSB0byB0ZWxsIGEgYmFkIGRpY3Rpb25hcnkgZnJvbSBiYWRcbiAgICAgICAgICAvLyBpbnB1dC5cbiAgICAgICAgICB0aGlzLmVyciA9IGV4cG9ydHMuWl9ORUVEX0RJQ1Q7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlICh0aGlzLnN0cm0uYXZhaWxfaW4gPiAwICYmIHRoaXMubW9kZSA9PT0gZXhwb3J0cy5HVU5aSVAgJiYgdGhpcy5lcnIgPT09IGV4cG9ydHMuWl9TVFJFQU1fRU5EICYmIHRoaXMuc3RybS5uZXh0X2luWzBdICE9PSAweDAwKSB7XG4gICAgICAgIC8vIEJ5dGVzIHJlbWFpbiBpbiBpbnB1dCBidWZmZXIuIFBlcmhhcHMgdGhpcyBpcyBhbm90aGVyIGNvbXByZXNzZWRcbiAgICAgICAgLy8gbWVtYmVyIGluIHRoZSBzYW1lIGFyY2hpdmUsIG9yIGp1c3QgdHJhaWxpbmcgZ2FyYmFnZS5cbiAgICAgICAgLy8gVHJhaWxpbmcgemVybyBieXRlcyBhcmUgb2theSwgdGhvdWdoLCBzaW5jZSB0aGV5IGFyZSBmcmVxdWVudGx5XG4gICAgICAgIC8vIHVzZWQgZm9yIHBhZGRpbmcuXG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB0aGlzLmVyciA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlKHRoaXMuc3RybSwgdGhpcy5mbHVzaCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1vZGUgJyArIHRoaXMubW9kZSk7XG4gIH1cbn07XG5cblpsaWIucHJvdG90eXBlLl9jaGVja0Vycm9yID0gZnVuY3Rpb24gKCkge1xuICAvLyBBY2NlcHRhYmxlIGVycm9yIHN0YXRlcyBkZXBlbmQgb24gdGhlIHR5cGUgb2YgemxpYiBzdHJlYW0uXG4gIHN3aXRjaCAodGhpcy5lcnIpIHtcbiAgICBjYXNlIGV4cG9ydHMuWl9PSzpcbiAgICBjYXNlIGV4cG9ydHMuWl9CVUZfRVJST1I6XG4gICAgICBpZiAodGhpcy5zdHJtLmF2YWlsX291dCAhPT0gMCAmJiB0aGlzLmZsdXNoID09PSBleHBvcnRzLlpfRklOSVNIKSB7XG4gICAgICAgIHRoaXMuX2Vycm9yKCd1bmV4cGVjdGVkIGVuZCBvZiBmaWxlJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgZXhwb3J0cy5aX1NUUkVBTV9FTkQ6XG4gICAgICAvLyBub3JtYWwgc3RhdHVzZXMsIG5vdCBmYXRhbFxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBleHBvcnRzLlpfTkVFRF9ESUNUOlxuICAgICAgaWYgKHRoaXMuZGljdGlvbmFyeSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2Vycm9yKCdNaXNzaW5nIGRpY3Rpb25hcnknKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2Vycm9yKCdCYWQgZGljdGlvbmFyeScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBzb21ldGhpbmcgZWxzZS5cbiAgICAgIHRoaXMuX2Vycm9yKCdabGliIGVycm9yJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblpsaWIucHJvdG90eXBlLl9hZnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLl9jaGVja0Vycm9yKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgYXZhaWxfb3V0ID0gdGhpcy5zdHJtLmF2YWlsX291dDtcbiAgdmFyIGF2YWlsX2luID0gdGhpcy5zdHJtLmF2YWlsX2luO1xuXG4gIHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAvLyBjYWxsIHRoZSB3cml0ZSgpIGNiXG4gIHRoaXMuY2FsbGJhY2soYXZhaWxfaW4sIGF2YWlsX291dCk7XG5cbiAgaWYgKHRoaXMucGVuZGluZ19jbG9zZSkge1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxufTtcblxuWmxpYi5wcm90b3R5cGUuX2Vycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgaWYgKHRoaXMuc3RybS5tc2cpIHtcbiAgICBtZXNzYWdlID0gdGhpcy5zdHJtLm1zZztcbiAgfVxuICB0aGlzLm9uZXJyb3IobWVzc2FnZSwgdGhpcy5lcnJcblxuICAvLyBubyBob3BlIG9mIHJlc2N1ZS5cbiAgKTt0aGlzLndyaXRlX2luX3Byb2dyZXNzID0gZmFsc2U7XG4gIGlmICh0aGlzLnBlbmRpbmdfY2xvc2UpIHtcbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cbn07XG5cblpsaWIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAod2luZG93Qml0cywgbGV2ZWwsIG1lbUxldmVsLCBzdHJhdGVneSwgZGljdGlvbmFyeSkge1xuICBhc3NlcnQoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCB8fCBhcmd1bWVudHMubGVuZ3RoID09PSA1LCAnaW5pdCh3aW5kb3dCaXRzLCBsZXZlbCwgbWVtTGV2ZWwsIHN0cmF0ZWd5LCBbZGljdGlvbmFyeV0pJyk7XG5cbiAgYXNzZXJ0KHdpbmRvd0JpdHMgPj0gOCAmJiB3aW5kb3dCaXRzIDw9IDE1LCAnaW52YWxpZCB3aW5kb3dCaXRzJyk7XG4gIGFzc2VydChsZXZlbCA+PSAtMSAmJiBsZXZlbCA8PSA5LCAnaW52YWxpZCBjb21wcmVzc2lvbiBsZXZlbCcpO1xuXG4gIGFzc2VydChtZW1MZXZlbCA+PSAxICYmIG1lbUxldmVsIDw9IDksICdpbnZhbGlkIG1lbWxldmVsJyk7XG5cbiAgYXNzZXJ0KHN0cmF0ZWd5ID09PSBleHBvcnRzLlpfRklMVEVSRUQgfHwgc3RyYXRlZ3kgPT09IGV4cG9ydHMuWl9IVUZGTUFOX09OTFkgfHwgc3RyYXRlZ3kgPT09IGV4cG9ydHMuWl9STEUgfHwgc3RyYXRlZ3kgPT09IGV4cG9ydHMuWl9GSVhFRCB8fCBzdHJhdGVneSA9PT0gZXhwb3J0cy5aX0RFRkFVTFRfU1RSQVRFR1ksICdpbnZhbGlkIHN0cmF0ZWd5Jyk7XG5cbiAgdGhpcy5faW5pdChsZXZlbCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5LCBkaWN0aW9uYXJ5KTtcbiAgdGhpcy5fc2V0RGljdGlvbmFyeSgpO1xufTtcblxuWmxpYi5wcm90b3R5cGUucGFyYW1zID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ2RlZmxhdGVQYXJhbXMgTm90IHN1cHBvcnRlZCcpO1xufTtcblxuWmxpYi5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX3Jlc2V0KCk7XG4gIHRoaXMuX3NldERpY3Rpb25hcnkoKTtcbn07XG5cblpsaWIucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gKGxldmVsLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksIGRpY3Rpb25hcnkpIHtcbiAgdGhpcy5sZXZlbCA9IGxldmVsO1xuICB0aGlzLndpbmRvd0JpdHMgPSB3aW5kb3dCaXRzO1xuICB0aGlzLm1lbUxldmVsID0gbWVtTGV2ZWw7XG4gIHRoaXMuc3RyYXRlZ3kgPSBzdHJhdGVneTtcblxuICB0aGlzLmZsdXNoID0gZXhwb3J0cy5aX05PX0ZMVVNIO1xuXG4gIHRoaXMuZXJyID0gZXhwb3J0cy5aX09LO1xuXG4gIGlmICh0aGlzLm1vZGUgPT09IGV4cG9ydHMuR1pJUCB8fCB0aGlzLm1vZGUgPT09IGV4cG9ydHMuR1VOWklQKSB7XG4gICAgdGhpcy53aW5kb3dCaXRzICs9IDE2O1xuICB9XG5cbiAgaWYgKHRoaXMubW9kZSA9PT0gZXhwb3J0cy5VTlpJUCkge1xuICAgIHRoaXMud2luZG93Qml0cyArPSAzMjtcbiAgfVxuXG4gIGlmICh0aGlzLm1vZGUgPT09IGV4cG9ydHMuREVGTEFURVJBVyB8fCB0aGlzLm1vZGUgPT09IGV4cG9ydHMuSU5GTEFURVJBVykge1xuICAgIHRoaXMud2luZG93Qml0cyA9IC0xICogdGhpcy53aW5kb3dCaXRzO1xuICB9XG5cbiAgdGhpcy5zdHJtID0gbmV3IFpzdHJlYW0oKTtcblxuICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgIGNhc2UgZXhwb3J0cy5ERUZMQVRFOlxuICAgIGNhc2UgZXhwb3J0cy5HWklQOlxuICAgIGNhc2UgZXhwb3J0cy5ERUZMQVRFUkFXOlxuICAgICAgdGhpcy5lcnIgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUluaXQyKHRoaXMuc3RybSwgdGhpcy5sZXZlbCwgZXhwb3J0cy5aX0RFRkxBVEVELCB0aGlzLndpbmRvd0JpdHMsIHRoaXMubWVtTGV2ZWwsIHRoaXMuc3RyYXRlZ3kpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBleHBvcnRzLklORkxBVEU6XG4gICAgY2FzZSBleHBvcnRzLkdVTlpJUDpcbiAgICBjYXNlIGV4cG9ydHMuSU5GTEFURVJBVzpcbiAgICBjYXNlIGV4cG9ydHMuVU5aSVA6XG4gICAgICB0aGlzLmVyciA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlSW5pdDIodGhpcy5zdHJtLCB0aGlzLndpbmRvd0JpdHMpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBtb2RlICcgKyB0aGlzLm1vZGUpO1xuICB9XG5cbiAgaWYgKHRoaXMuZXJyICE9PSBleHBvcnRzLlpfT0spIHtcbiAgICB0aGlzLl9lcnJvcignSW5pdCBlcnJvcicpO1xuICB9XG5cbiAgdGhpcy5kaWN0aW9uYXJ5ID0gZGljdGlvbmFyeTtcblxuICB0aGlzLndyaXRlX2luX3Byb2dyZXNzID0gZmFsc2U7XG4gIHRoaXMuaW5pdF9kb25lID0gdHJ1ZTtcbn07XG5cblpsaWIucHJvdG90eXBlLl9zZXREaWN0aW9uYXJ5ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5kaWN0aW9uYXJ5ID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLmVyciA9IGV4cG9ydHMuWl9PSztcblxuICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgIGNhc2UgZXhwb3J0cy5ERUZMQVRFOlxuICAgIGNhc2UgZXhwb3J0cy5ERUZMQVRFUkFXOlxuICAgICAgdGhpcy5lcnIgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCB0aGlzLmRpY3Rpb25hcnkpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgaWYgKHRoaXMuZXJyICE9PSBleHBvcnRzLlpfT0spIHtcbiAgICB0aGlzLl9lcnJvcignRmFpbGVkIHRvIHNldCBkaWN0aW9uYXJ5Jyk7XG4gIH1cbn07XG5cblpsaWIucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lcnIgPSBleHBvcnRzLlpfT0s7XG5cbiAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgICBjYXNlIGV4cG9ydHMuREVGTEFURTpcbiAgICBjYXNlIGV4cG9ydHMuREVGTEFURVJBVzpcbiAgICBjYXNlIGV4cG9ydHMuR1pJUDpcbiAgICAgIHRoaXMuZXJyID0gemxpYl9kZWZsYXRlLmRlZmxhdGVSZXNldCh0aGlzLnN0cm0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBleHBvcnRzLklORkxBVEU6XG4gICAgY2FzZSBleHBvcnRzLklORkxBVEVSQVc6XG4gICAgY2FzZSBleHBvcnRzLkdVTlpJUDpcbiAgICAgIHRoaXMuZXJyID0gemxpYl9pbmZsYXRlLmluZmxhdGVSZXNldCh0aGlzLnN0cm0pO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgaWYgKHRoaXMuZXJyICE9PSBleHBvcnRzLlpfT0spIHtcbiAgICB0aGlzLl9lcnJvcignRmFpbGVkIHRvIHJlc2V0IHN0cmVhbScpO1xuICB9XG59O1xuXG5leHBvcnRzLlpsaWIgPSBabGliOyIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbmZ1bmN0aW9uIFpTdHJlYW0oKSB7XG4gIC8qIG5leHQgaW5wdXQgYnl0ZSAqL1xuICB0aGlzLmlucHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfaW4gPSAwO1xuICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IGlucHV0ICovXG4gIHRoaXMuYXZhaWxfaW4gPSAwO1xuICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9pbiA9IDA7XG4gIC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqL1xuICB0aGlzLm91dHB1dCA9IG51bGw7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcbiAgdGhpcy5uZXh0X291dCA9IDA7XG4gIC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG91dHB1dCAqL1xuICB0aGlzLmF2YWlsX291dCA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovXG4gIHRoaXMudG90YWxfb3V0ID0gMDtcbiAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovXG4gIHRoaXMubXNnID0gJycvKlpfTlVMTCovO1xuICAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi9cbiAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYmluYXJ5IG9yIHRleHQgKi9cbiAgdGhpcy5kYXRhX3R5cGUgPSAyLypaX1VOS05PV04qLztcbiAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi9cbiAgdGhpcy5hZGxlciA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gWlN0cmVhbTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG52YXIgdXRpbHMgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIHRyZWVzICAgPSByZXF1aXJlKCcuL3RyZWVzJyk7XG52YXIgYWRsZXIzMiA9IHJlcXVpcmUoJy4vYWRsZXIzMicpO1xudmFyIGNyYzMyICAgPSByZXF1aXJlKCcuL2NyYzMyJyk7XG52YXIgbXNnICAgICA9IHJlcXVpcmUoJy4vbWVzc2FnZXMnKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9QQVJUSUFMX0ZMVVNIID0gMTtcbi8vdmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG52YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG4vL3ZhciBaX1RSRUVTICAgICAgICAgPSA2O1xuXG5cbi8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAqL1xudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbi8vdmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbi8vdmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cblxuLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4vL3ZhciBaX05PX0NPTVBSRVNTSU9OICAgICAgPSAwO1xuLy92YXIgWl9CRVNUX1NQRUVEICAgICAgICAgID0gMTtcbi8vdmFyIFpfQkVTVF9DT01QUkVTU0lPTiAgICA9IDk7XG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cblxudmFyIFpfRklMVEVSRUQgICAgICAgICAgICA9IDE7XG52YXIgWl9IVUZGTUFOX09OTFkgICAgICAgID0gMjtcbnZhciBaX1JMRSAgICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG52YXIgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuLy92YXIgWl9CSU5BUlkgICAgICAgICAgICAgID0gMDtcbi8vdmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cblxuLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbnZhciBNQVhfTUVNX0xFVkVMID0gOTtcbi8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqL1xudmFyIE1BWF9XQklUUyA9IDE1O1xuLyogMzJLIExaNzcgd2luZG93ICovXG52YXIgREVGX01FTV9MRVZFTCA9IDg7XG5cblxudmFyIExFTkdUSF9DT0RFUyAgPSAyOTtcbi8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG52YXIgRF9DT0RFUyAgICAgICA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG52YXIgTUFYX0JJVFMgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIE1JTl9NQVRDSCA9IDM7XG52YXIgTUFYX01BVENIID0gMjU4O1xudmFyIE1JTl9MT09LQUhFQUQgPSAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSk7XG5cbnZhciBQUkVTRVRfRElDVCA9IDB4MjA7XG5cbnZhciBJTklUX1NUQVRFID0gNDI7XG52YXIgRVhUUkFfU1RBVEUgPSA2OTtcbnZhciBOQU1FX1NUQVRFID0gNzM7XG52YXIgQ09NTUVOVF9TVEFURSA9IDkxO1xudmFyIEhDUkNfU1RBVEUgPSAxMDM7XG52YXIgQlVTWV9TVEFURSA9IDExMztcbnZhciBGSU5JU0hfU1RBVEUgPSA2NjY7XG5cbnZhciBCU19ORUVEX01PUkUgICAgICA9IDE7IC8qIGJsb2NrIG5vdCBjb21wbGV0ZWQsIG5lZWQgbW9yZSBpbnB1dCBvciBtb3JlIG91dHB1dCAqL1xudmFyIEJTX0JMT0NLX0RPTkUgICAgID0gMjsgLyogYmxvY2sgZmx1c2ggcGVyZm9ybWVkICovXG52YXIgQlNfRklOSVNIX1NUQVJURUQgPSAzOyAvKiBmaW5pc2ggc3RhcnRlZCwgbmVlZCBvbmx5IG1vcmUgb3V0cHV0IGF0IG5leHQgZGVmbGF0ZSAqL1xudmFyIEJTX0ZJTklTSF9ET05FICAgID0gNDsgLyogZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dCAqL1xuXG52YXIgT1NfQ09ERSA9IDB4MDM7IC8vIFVuaXggOikgLiBEb24ndCBkZXRlY3QsIHVzZSB0aGlzIGRlZmF1bHQuXG5cbmZ1bmN0aW9uIGVycihzdHJtLCBlcnJvckNvZGUpIHtcbiAgc3RybS5tc2cgPSBtc2dbZXJyb3JDb2RlXTtcbiAgcmV0dXJuIGVycm9yQ29kZTtcbn1cblxuZnVuY3Rpb24gcmFuayhmKSB7XG4gIHJldHVybiAoKGYpIDw8IDEpIC0gKChmKSA+IDQgPyA5IDogMCk7XG59XG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXNcbiAqIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXRcbiAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5vdXRwdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuXG4gKiAoU2VlIGFsc28gcmVhZF9idWYoKSkuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoX3BlbmRpbmcoc3RybSkge1xuICB2YXIgcyA9IHN0cm0uc3RhdGU7XG5cbiAgLy9fdHJfZmx1c2hfYml0cyhzKTtcbiAgdmFyIGxlbiA9IHMucGVuZGluZztcbiAgaWYgKGxlbiA+IHN0cm0uYXZhaWxfb3V0KSB7XG4gICAgbGVuID0gc3RybS5hdmFpbF9vdXQ7XG4gIH1cbiAgaWYgKGxlbiA9PT0gMCkgeyByZXR1cm47IH1cblxuICB1dGlscy5hcnJheVNldChzdHJtLm91dHB1dCwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nX291dCwgbGVuLCBzdHJtLm5leHRfb3V0KTtcbiAgc3RybS5uZXh0X291dCArPSBsZW47XG4gIHMucGVuZGluZ19vdXQgKz0gbGVuO1xuICBzdHJtLnRvdGFsX291dCArPSBsZW47XG4gIHN0cm0uYXZhaWxfb3V0IC09IGxlbjtcbiAgcy5wZW5kaW5nIC09IGxlbjtcbiAgaWYgKHMucGVuZGluZyA9PT0gMCkge1xuICAgIHMucGVuZGluZ19vdXQgPSAwO1xuICB9XG59XG5cblxuZnVuY3Rpb24gZmx1c2hfYmxvY2tfb25seShzLCBsYXN0KSB7XG4gIHRyZWVzLl90cl9mbHVzaF9ibG9jayhzLCAocy5ibG9ja19zdGFydCA+PSAwID8gcy5ibG9ja19zdGFydCA6IC0xKSwgcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQsIGxhc3QpO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgZmx1c2hfcGVuZGluZyhzLnN0cm0pO1xufVxuXG5cbmZ1bmN0aW9uIHB1dF9ieXRlKHMsIGIpIHtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluXG4gKiBwZW5kaW5nX2J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0U2hvcnRNU0IocywgYikge1xuLy8gIHB1dF9ieXRlKHMsIChCeXRlKShiID4+IDgpKTtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiAmIDB4ZmYpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAoYiA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGIgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMlxuICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2hcbiAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkXG4gKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+aW5wdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGZyb20gaXQuXG4gKiAoU2VlIGFsc28gZmx1c2hfcGVuZGluZygpKS5cbiAqL1xuZnVuY3Rpb24gcmVhZF9idWYoc3RybSwgYnVmLCBzdGFydCwgc2l6ZSkge1xuICB2YXIgbGVuID0gc3RybS5hdmFpbF9pbjtcblxuICBpZiAobGVuID4gc2l6ZSkgeyBsZW4gPSBzaXplOyB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuIDA7IH1cblxuICBzdHJtLmF2YWlsX2luIC09IGxlbjtcblxuICAvLyB6bWVtY3B5KGJ1Ziwgc3RybS0+bmV4dF9pbiwgbGVuKTtcbiAgdXRpbHMuYXJyYXlTZXQoYnVmLCBzdHJtLmlucHV0LCBzdHJtLm5leHRfaW4sIGxlbiwgc3RhcnQpO1xuICBpZiAoc3RybS5zdGF0ZS53cmFwID09PSAxKSB7XG4gICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIGVsc2UgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMikge1xuICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBidWYsIGxlbiwgc3RhcnQpO1xuICB9XG5cbiAgc3RybS5uZXh0X2luICs9IGxlbjtcbiAgc3RybS50b3RhbF9pbiArPSBsZW47XG5cbiAgcmV0dXJuIGxlbjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNldCBtYXRjaF9zdGFydCB0byB0aGUgbG9uZ2VzdCBtYXRjaCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIGFuZFxuICogcmV0dXJuIGl0cyBsZW5ndGguIE1hdGNoZXMgc2hvcnRlciBvciBlcXVhbCB0byBwcmV2X2xlbmd0aCBhcmUgZGlzY2FyZGVkLFxuICogaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFuZCBtYXRjaF9zdGFydCBpc1xuICogZ2FyYmFnZS5cbiAqIElOIGFzc2VydGlvbnM6IGN1cl9tYXRjaCBpcyB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhlIGN1cnJlbnRcbiAqICAgc3RyaW5nIChzdHJzdGFydCkgYW5kIGl0cyBkaXN0YW5jZSBpcyA8PSBNQVhfRElTVCwgYW5kIHByZXZfbGVuZ3RoID49IDFcbiAqIE9VVCBhc3NlcnRpb246IHRoZSBtYXRjaCBsZW5ndGggaXMgbm90IGdyZWF0ZXIgdGhhbiBzLT5sb29rYWhlYWQuXG4gKi9cbmZ1bmN0aW9uIGxvbmdlc3RfbWF0Y2gocywgY3VyX21hdGNoKSB7XG4gIHZhciBjaGFpbl9sZW5ndGggPSBzLm1heF9jaGFpbl9sZW5ndGg7ICAgICAgLyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovXG4gIHZhciBzY2FuID0gcy5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi9cbiAgdmFyIG1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqL1xuICB2YXIgYmVzdF9sZW4gPSBzLnByZXZfbGVuZ3RoOyAgICAgICAgICAgICAgLyogYmVzdCBtYXRjaCBsZW5ndGggc28gZmFyICovXG4gIHZhciBuaWNlX21hdGNoID0gcy5uaWNlX21hdGNoOyAgICAgICAgICAgICAvKiBzdG9wIGlmIG1hdGNoIGxvbmcgZW5vdWdoICovXG4gIHZhciBsaW1pdCA9IChzLnN0cnN0YXJ0ID4gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpID9cbiAgICAgIHMuc3Ryc3RhcnQgLSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSA6IDAvKk5JTCovO1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7IC8vIHNob3J0Y3V0XG5cbiAgdmFyIHdtYXNrID0gcy53X21hc2s7XG4gIHZhciBwcmV2ICA9IHMucHJldjtcblxuICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLFxuICAgKiB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nIG9mIHdpbmRvdyBpbmRleCAwLlxuICAgKi9cblxuICB2YXIgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgdmFyIHNjYW5fZW5kMSAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdO1xuICB2YXIgc2Nhbl9lbmQgICA9IF93aW5bc2NhbiArIGJlc3RfbGVuXTtcblxuICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi5cbiAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIC8vIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCBcIkNvZGUgdG9vIGNsZXZlclwiKTtcblxuICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqL1xuICBpZiAocy5wcmV2X2xlbmd0aCA+PSBzLmdvb2RfbWF0Y2gpIHtcbiAgICBjaGFpbl9sZW5ndGggPj49IDI7XG4gIH1cbiAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeVxuICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIGlmIChuaWNlX21hdGNoID4gcy5sb29rYWhlYWQpIHsgbmljZV9tYXRjaCA9IHMubG9va2FoZWFkOyB9XG5cbiAgLy8gQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgXCJuZWVkIGxvb2thaGVhZFwiKTtcblxuICBkbyB7XG4gICAgLy8gQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCBcIm5vIGZ1dHVyZVwiKTtcbiAgICBtYXRjaCA9IGN1cl9tYXRjaDtcblxuICAgIC8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZVxuICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDIuICBOb3RlIHRoYXQgdGhlIGNoZWNrcyBiZWxvd1xuICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZVxuICAgICAqIHJlYXNvbnMuICBUaGVyZWZvcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgd2lsbCBiZSBhY2Nlc3NlZCwgYW5kXG4gICAgICogY29uZGl0aW9uYWwganVtcHMgd2lsbCBiZSBtYWRlIHRoYXQgZGVwZW5kIG9uIHRob3NlIHZhbHVlcy5cbiAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc29cbiAgICAgKiB0aGUgb3V0cHV0IG9mIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSB1bmluaXRpYWxpemVkIHZhbHVlcy5cbiAgICAgKi9cblxuICAgIGlmIChfd2luW21hdGNoICsgYmVzdF9sZW5dICAgICAhPT0gc2Nhbl9lbmQgIHx8XG4gICAgICAgIF93aW5bbWF0Y2ggKyBiZXN0X2xlbiAtIDFdICE9PSBzY2FuX2VuZDEgfHxcbiAgICAgICAgX3dpblttYXRjaF0gICAgICAgICAgICAgICAgIT09IF93aW5bc2Nhbl0gfHxcbiAgICAgICAgX3dpblsrK21hdGNoXSAgICAgICAgICAgICAgIT09IF93aW5bc2NhbiArIDFdKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZVxuICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pXG4gICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXlcbiAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0XG4gICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguXG4gICAgICovXG4gICAgc2NhbiArPSAyO1xuICAgIG1hdGNoKys7XG4gICAgLy8gQXNzZXJ0KCpzY2FuID09ICptYXRjaCwgXCJtYXRjaFsyXT9cIik7XG5cbiAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uO1xuICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LlxuICAgICAqL1xuICAgIGRvIHtcbiAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgIH0gd2hpbGUgKF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTtcblxuICAgIC8vIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCBcIndpbGQgc2NhblwiKTtcblxuICAgIGxlbiA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIO1xuXG4gICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7XG4gICAgICBzLm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoO1xuICAgICAgYmVzdF9sZW4gPSBsZW47XG4gICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgICAgIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG4gICAgfVxuICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQgJiYgLS1jaGFpbl9sZW5ndGggIT09IDApO1xuXG4gIGlmIChiZXN0X2xlbiA8PSBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBiZXN0X2xlbjtcbiAgfVxuICByZXR1cm4gcy5sb29rYWhlYWQ7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LlxuICogVXBkYXRlcyBzdHJzdGFydCBhbmQgbG9va2FoZWFkLlxuICpcbiAqIElOIGFzc2VydGlvbjogbG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRFxuICogT1VUIGFzc2VydGlvbnM6IHN0cnN0YXJ0IDw9IHdpbmRvd19zaXplLU1JTl9MT09LQUhFQURcbiAqICAgIEF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGF2YWlsX2luID09IDA7IHJlYWRzIGFyZVxuICogICAgcGVyZm9ybWVkIGZvciBhdCBsZWFzdCB0d28gYnl0ZXMgKHJlcXVpcmVkIGZvciB0aGUgemlwIHRyYW5zbGF0ZV9lb2xcbiAqICAgIG9wdGlvbiAtLSBub3Qgc3VwcG9ydGVkIGhlcmUpLlxuICovXG5mdW5jdGlvbiBmaWxsX3dpbmRvdyhzKSB7XG4gIHZhciBfd19zaXplID0gcy53X3NpemU7XG4gIHZhciBwLCBuLCBtLCBtb3JlLCBzdHI7XG5cbiAgLy9Bc3NlcnQocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCwgXCJhbHJlYWR5IGVub3VnaCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIG1vcmUgPSBzLndpbmRvd19zaXplIC0gcy5sb29rYWhlYWQgLSBzLnN0cnN0YXJ0O1xuXG4gICAgLy8gSlMgaW50cyBoYXZlIDMyIGJpdCwgYmxvY2sgYmVsb3cgbm90IG5lZWRlZFxuICAgIC8qIERlYWwgd2l0aCAhQCMkJSA2NEsgbGltaXQ6ICovXG4gICAgLy9pZiAoc2l6ZW9mKGludCkgPD0gMikge1xuICAgIC8vICAgIGlmIChtb3JlID09IDAgJiYgcy0+c3Ryc3RhcnQgPT0gMCAmJiBzLT5sb29rYWhlYWQgPT0gMCkge1xuICAgIC8vICAgICAgICBtb3JlID0gd3NpemU7XG4gICAgLy9cbiAgICAvLyAgfSBlbHNlIGlmIChtb3JlID09ICh1bnNpZ25lZCkoLTEpKSB7XG4gICAgLy8gICAgICAgIC8qIFZlcnkgdW5saWtlbHksIGJ1dCBwb3NzaWJsZSBvbiAxNiBiaXQgbWFjaGluZSBpZlxuICAgIC8vICAgICAgICAgKiBzdHJzdGFydCA9PSAwICYmIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIGEgYnl0ZSBhdCB0aW1lKVxuICAgIC8vICAgICAgICAgKi9cbiAgICAvLyAgICAgICAgbW9yZS0tO1xuICAgIC8vICAgIH1cbiAgICAvL31cblxuXG4gICAgLyogSWYgdGhlIHdpbmRvdyBpcyBhbG1vc3QgZnVsbCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGxvb2thaGVhZCxcbiAgICAgKiBtb3ZlIHRoZSB1cHBlciBoYWxmIHRvIHRoZSBsb3dlciBvbmUgdG8gbWFrZSByb29tIGluIHRoZSB1cHBlciBoYWxmLlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0ID49IF93X3NpemUgKyAoX3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG5cbiAgICAgIHV0aWxzLmFycmF5U2V0KHMud2luZG93LCBzLndpbmRvdywgX3dfc2l6ZSwgX3dfc2l6ZSwgMCk7XG4gICAgICBzLm1hdGNoX3N0YXJ0IC09IF93X3NpemU7XG4gICAgICBzLnN0cnN0YXJ0IC09IF93X3NpemU7XG4gICAgICAvKiB3ZSBub3cgaGF2ZSBzdHJzdGFydCA+PSBNQVhfRElTVCAqL1xuICAgICAgcy5ibG9ja19zdGFydCAtPSBfd19zaXplO1xuXG4gICAgICAvKiBTbGlkZSB0aGUgaGFzaCB0YWJsZSAoY291bGQgYmUgYXZvaWRlZCB3aXRoIDMyIGJpdCB2YWx1ZXNcbiAgICAgICBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UpLiBXZSBzbGlkZSBldmVuIHdoZW4gbGV2ZWwgPT0gMFxuICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDBcbiAgICAgICBsYXRlci4gKFVzaW5nIGxldmVsIDAgcGVybWFuZW50bHkgaXMgbm90IGFuIG9wdGltYWwgdXNhZ2Ugb2ZcbiAgICAgICB6bGliLCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcGF0aG9sb2dpY2FsIGNhc2UuKVxuICAgICAgICovXG5cbiAgICAgIG4gPSBzLmhhc2hfc2l6ZTtcbiAgICAgIHAgPSBuO1xuICAgICAgZG8ge1xuICAgICAgICBtID0gcy5oZWFkWy0tcF07XG4gICAgICAgIHMuaGVhZFtwXSA9IChtID49IF93X3NpemUgPyBtIC0gX3dfc2l6ZSA6IDApO1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbiA9IF93X3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMucHJldlstLXBdO1xuICAgICAgICBzLnByZXZbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgICAgLyogSWYgbiBpcyBub3Qgb24gYW55IGhhc2ggY2hhaW4sIHByZXZbbl0gaXMgZ2FyYmFnZSBidXRcbiAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC5cbiAgICAgICAgICovXG4gICAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgICBtb3JlICs9IF93X3NpemU7XG4gICAgfVxuICAgIGlmIChzLnN0cm0uYXZhaWxfaW4gPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8qIElmIHRoZXJlIHdhcyBubyBzbGlkaW5nOlxuICAgICAqICAgIHN0cnN0YXJ0IDw9IFdTSVpFK01BWF9ESVNULTEgJiYgbG9va2FoZWFkIDw9IE1JTl9MT09LQUhFQUQgLSAxICYmXG4gICAgICogICAgbW9yZSA9PSB3aW5kb3dfc2l6ZSAtIGxvb2thaGVhZCAtIHN0cnN0YXJ0XG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIChNSU5fTE9PS0FIRUFELTEgKyBXU0laRSArIE1BWF9ESVNULTEpXG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIDIqV1NJWkUgKyAyXG4gICAgICogSW4gdGhlIEJJR19NRU0gb3IgTU1BUCBjYXNlIChub3QgeWV0IHN1cHBvcnRlZCksXG4gICAgICogICB3aW5kb3dfc2l6ZSA9PSBpbnB1dF9zaXplICsgTUlOX0xPT0tBSEVBRCAgJiZcbiAgICAgKiAgIHN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIDw9IGlucHV0X3NpemUgPT4gbW9yZSA+PSBNSU5fTE9PS0FIRUFELlxuICAgICAqIE90aGVyd2lzZSwgd2luZG93X3NpemUgPT0gMipXU0laRSBzbyBtb3JlID49IDIuXG4gICAgICogSWYgdGhlcmUgd2FzIHNsaWRpbmcsIG1vcmUgPj0gV1NJWkUuIFNvIGluIGFsbCBjYXNlcywgbW9yZSA+PSAyLlxuICAgICAqL1xuICAgIC8vQXNzZXJ0KG1vcmUgPj0gMiwgXCJtb3JlIDwgMlwiKTtcbiAgICBuID0gcmVhZF9idWYocy5zdHJtLCBzLndpbmRvdywgcy5zdHJzdGFydCArIHMubG9va2FoZWFkLCBtb3JlKTtcbiAgICBzLmxvb2thaGVhZCArPSBuO1xuXG4gICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6ICovXG4gICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPj0gTUlOX01BVENIKSB7XG4gICAgICBzdHIgPSBzLnN0cnN0YXJ0IC0gcy5pbnNlcnQ7XG4gICAgICBzLmluc19oID0gcy53aW5kb3dbc3RyXTtcblxuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyAxXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyAxXSkgJiBzLmhhc2hfbWFzaztcbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgQ2FsbCB1cGRhdGVfaGFzaCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICB3aGlsZSAocy5pbnNlcnQpIHtcbiAgICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgICBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI7XG4gICAgICAgIHN0cisrO1xuICAgICAgICBzLmluc2VydC0tO1xuICAgICAgICBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA8IE1JTl9NQVRDSCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZSB3aG9sZSBpbnB1dCBoYXMgbGVzcyB0aGFuIE1JTl9NQVRDSCBieXRlcywgaW5zX2ggaXMgZ2FyYmFnZSxcbiAgICAgKiBidXQgdGhpcyBpcyBub3QgaW1wb3J0YW50IHNpbmNlIG9ubHkgbGl0ZXJhbCBieXRlcyB3aWxsIGJlIGVtaXR0ZWQuXG4gICAgICovXG5cbiAgfSB3aGlsZSAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIHMuc3RybS5hdmFpbF9pbiAhPT0gMCk7XG5cbiAgLyogSWYgdGhlIFdJTl9JTklUIGJ5dGVzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZGF0YSBoYXZlIG5ldmVyIGJlZW5cbiAgICogd3JpdHRlbiwgdGhlbiB6ZXJvIHRob3NlIGJ5dGVzIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayByZXBvcnRzIG9mXG4gICAqIHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCAob3IgdW5pbml0aWFsaXNlZCBhcyBKdWxpYW4gd3JpdGVzKSBieXRlcyBieVxuICAgKiB0aGUgbG9uZ2VzdCBtYXRjaCByb3V0aW5lcy4gIFVwZGF0ZSB0aGUgaGlnaCB3YXRlciBtYXJrIGZvciB0aGUgbmV4dFxuICAgKiB0aW1lIHRocm91Z2ggaGVyZS4gIFdJTl9JTklUIGlzIHNldCB0byBNQVhfTUFUQ0ggc2luY2UgdGhlIGxvbmdlc3QgbWF0Y2hcbiAgICogcm91dGluZXMgYWxsb3cgc2Nhbm5pbmcgdG8gc3Ryc3RhcnQgKyBNQVhfTUFUQ0gsIGlnbm9yaW5nIGxvb2thaGVhZC5cbiAgICovXG4vLyAgaWYgKHMuaGlnaF93YXRlciA8IHMud2luZG93X3NpemUpIHtcbi8vICAgIHZhciBjdXJyID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkO1xuLy8gICAgdmFyIGluaXQgPSAwO1xuLy9cbi8vICAgIGlmIChzLmhpZ2hfd2F0ZXIgPCBjdXJyKSB7XG4vLyAgICAgIC8qIFByZXZpb3VzIGhpZ2ggd2F0ZXIgbWFyayBiZWxvdyBjdXJyZW50IGRhdGEgLS0gemVybyBXSU5fSU5JVFxuLy8gICAgICAgKiBieXRlcyBvciB1cCB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy5cbi8vICAgICAgICovXG4vLyAgICAgIGluaXQgPSBzLndpbmRvd19zaXplIC0gY3Vycjtcbi8vICAgICAgaWYgKGluaXQgPiBXSU5fSU5JVClcbi8vICAgICAgICBpbml0ID0gV0lOX0lOSVQ7XG4vLyAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIGN1cnIsICh1bnNpZ25lZClpbml0KTtcbi8vICAgICAgcy0+aGlnaF93YXRlciA9IGN1cnIgKyBpbml0O1xuLy8gICAgfVxuLy8gICAgZWxzZSBpZiAocy0+aGlnaF93YXRlciA8ICh1bGcpY3VyciArIFdJTl9JTklUKSB7XG4vLyAgICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBhdCBvciBhYm92ZSBjdXJyZW50IGRhdGEsIGJ1dCBiZWxvdyBjdXJyZW50IGRhdGFcbi8vICAgICAgICogcGx1cyBXSU5fSU5JVCAtLSB6ZXJvIG91dCB0byBjdXJyZW50IGRhdGEgcGx1cyBXSU5fSU5JVCwgb3IgdXBcbi8vICAgICAgICogdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gKHVsZyljdXJyICsgV0lOX0lOSVQgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICBpZiAoaW5pdCA+IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcilcbi8vICAgICAgICBpbml0ID0gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBzLT5oaWdoX3dhdGVyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgKz0gaW5pdDtcbi8vICAgIH1cbi8vICB9XG4vL1xuLy8gIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplIC0gTUlOX0xPT0tBSEVBRCxcbi8vICAgIFwibm90IGVub3VnaCByb29tIGZvciBzZWFyY2hcIik7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weSB3aXRob3V0IGNvbXByZXNzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm5cbiAqIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgc2luY2VcbiAqIHVuY29tcHJlc3NpYmxlIGRhdGEgaXMgcHJvYmFibHkgbm90IHVzZWZ1bC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkXG4gKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uXG4gKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgZXh0cmEgY29weWluZyBmcm9tXG4gKiB3aW5kb3cgdG8gcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc3RvcmVkKHMsIGZsdXNoKSB7XG4gIC8qIFN0b3JlZCBibG9ja3MgYXJlIGxpbWl0ZWQgdG8gMHhmZmZmIGJ5dGVzLCBwZW5kaW5nX2J1ZiBpcyBsaW1pdGVkXG4gICAqIHRvIHBlbmRpbmdfYnVmX3NpemUsIGFuZCBlYWNoIHN0b3JlZCBibG9jayBoYXMgYSA1IGJ5dGUgaGVhZGVyOlxuICAgKi9cbiAgdmFyIG1heF9ibG9ja19zaXplID0gMHhmZmZmO1xuXG4gIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMucGVuZGluZ19idWZfc2l6ZSAtIDUpIHtcbiAgICBtYXhfYmxvY2tfc2l6ZSA9IHMucGVuZGluZ19idWZfc2l6ZSAtIDU7XG4gIH1cblxuICAvKiBDb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSBpbnB1dCB0byBvdXRwdXQ6ICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBGaWxsIHRoZSB3aW5kb3cgYXMgbXVjaCBhcyBwb3NzaWJsZTogKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPD0gMSkge1xuXG4gICAgICAvL0Fzc2VydChzLT5zdHJzdGFydCA8IHMtPndfc2l6ZStNQVhfRElTVChzKSB8fFxuICAgICAgLy8gIHMtPmJsb2NrX3N0YXJ0ID49IChsb25nKXMtPndfc2l6ZSwgXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgaWYgKCEocy5zdHJzdGFydCA8IHMud19zaXplICsgKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgfHxcbi8vICAgICAgICBzLmJsb2NrX3N0YXJ0ID49IHMud19zaXplKSkge1xuLy8gICAgICAgIHRocm93ICBuZXcgRXJyb3IoXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgfVxuXG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuXG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cbiAgICAvL0Fzc2VydChzLT5ibG9ja19zdGFydCA+PSAwTCwgXCJibG9jayBnb25lXCIpO1xuLy8gICAgaWYgKHMuYmxvY2tfc3RhcnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJibG9jayBnb25lXCIpO1xuXG4gICAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgICBzLmxvb2thaGVhZCA9IDA7XG5cbiAgICAvKiBFbWl0IGEgc3RvcmVkIGJsb2NrIGlmIHBlbmRpbmdfYnVmIHdpbGwgYmUgZnVsbDogKi9cbiAgICB2YXIgbWF4X3N0YXJ0ID0gcy5ibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplO1xuXG4gICAgaWYgKHMuc3Ryc3RhcnQgPT09IDAgfHwgcy5zdHJzdGFydCA+PSBtYXhfc3RhcnQpIHtcbiAgICAgIC8qIHN0cnN0YXJ0ID09IDAgaXMgcG9zc2libGUgd2hlbiB3cmFwYXJvdW5kIG9uIDE2LWJpdCBtYWNoaW5lICovXG4gICAgICBzLmxvb2thaGVhZCA9IHMuc3Ryc3RhcnQgLSBtYXhfc3RhcnQ7XG4gICAgICBzLnN0cnN0YXJ0ID0gbWF4X3N0YXJ0O1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cblxuXG4gICAgfVxuICAgIC8qIEZsdXNoIGlmIHdlIG1heSBoYXZlIHRvIHNsaWRlLCBvdGhlcndpc2UgYmxvY2tfc3RhcnQgbWF5IGJlY29tZVxuICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6XG4gICAgICovXG4gICAgaWYgKHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0ID49IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuXG4gIHMuaW5zZXJ0ID0gMDtcblxuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cblxuICBpZiAocy5zdHJzdGFydCA+IHMuYmxvY2tfc3RhcnQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfTkVFRF9NT1JFO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXByZXNzIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4gdGhlIGN1cnJlbnRcbiAqIGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGFuZCBpbnNlcnRzXG4gKiBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBvbmx5IGZvciB1bm1hdGNoZWQgc3RyaW5ncyBvciBmb3Igc2hvcnRcbiAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9mYXN0KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovXG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGVcbiAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjpcbiAgICAgKi9cbiAgICBoYXNoX2hlYWQgPSAwLypOSUwqLztcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgLyoqKi9cbiAgICB9XG5cbiAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLlxuICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENIXG4gICAgICovXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgKChzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkKSA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkpIHtcbiAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nXG4gICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2hcbiAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKHMsIGhhc2hfaGVhZCk7XG4gICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqL1xuICAgIH1cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvLyBjaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LCBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCk7IC8vIGZvciBkZWJ1ZyBvbmx5XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuXG4gICAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgICAgICovXG4gICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gcy5tYXhfbGF6eV9tYXRjaC8qbWF4X2luc2VydF9sZW5ndGgqLyAmJiBzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGgtLTsgLyogc3RyaW5nIGF0IHN0cnN0YXJ0IGFscmVhZHkgaW4gdGFibGUgKi9cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgICAgLyogc3Ryc3RhcnQgbmV2ZXIgZXhjZWVkcyBXU0laRS1NQVhfTUFUQ0gsIHNvIHRoZXJlIGFyZVxuICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuXG4gICAgICAgICAgICovXG4gICAgICAgIH0gd2hpbGUgKC0tcy5tYXRjaF9sZW5ndGggIT09IDApO1xuICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICB9IGVsc2VcbiAgICAgIHtcbiAgICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgICAgICBzLmluc19oID0gcy53aW5kb3dbcy5zdHJzdGFydF07XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMuaW5zX2gsIHMud2luZG93W3Muc3Ryc3RhcnQrMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgMV0pICYgcy5oYXNoX21hc2s7XG5cbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lc1xuLy8jZW5kaWZcbiAgICAgICAgLyogSWYgbG9va2FoZWFkIDwgTUlOX01BVENILCBpbnNfaCBpcyBnYXJiYWdlLCBidXQgaXQgZG9lcyBub3RcbiAgICAgICAgICogbWF0dGVyIHNpbmNlIGl0IHdpbGwgYmUgcmVjb21wdXRlZCBhdCBuZXh0IGRlZmxhdGUgY2FsbC5cbiAgICAgICAgICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy53aW5kb3dbcy5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAoKHMuc3Ryc3RhcnQgPCAoTUlOX01BVENIIC0gMSkpID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDEpO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2FtZSBhcyBhYm92ZSwgYnV0IGFjaGlldmVzIGJldHRlciBjb21wcmVzc2lvbi4gV2UgdXNlIGEgbGF6eVxuICogZXZhbHVhdGlvbiBmb3IgbWF0Y2hlczogYSBtYXRjaCBpcyBmaW5hbGx5IGFkb3B0ZWQgb25seSBpZiB0aGVyZSBpc1xuICogbm8gYmV0dGVyIG1hdGNoIGF0IHRoZSBuZXh0IHdpbmRvdyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9zbG93KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAgIC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgdmFyIG1heF9pbnNlcnQ7XG5cbiAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKi9cbiAgICBzLnByZXZfbGVuZ3RoID0gcy5tYXRjaF9sZW5ndGg7XG4gICAgcy5wcmV2X21hdGNoID0gcy5tYXRjaF9zdGFydDtcbiAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG5cbiAgICBpZiAoaGFzaF9oZWFkICE9PSAwLypOSUwqLyAmJiBzLnByZXZfbGVuZ3RoIDwgcy5tYXhfbGF6eV9tYXRjaCAmJlxuICAgICAgICBzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpLypNQVhfRElTVChzKSovKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cblxuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IDUgJiZcbiAgICAgICAgIChzLnN0cmF0ZWd5ID09PSBaX0ZJTFRFUkVEIHx8IChzLm1hdGNoX2xlbmd0aCA9PT0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0ID4gNDA5Ni8qVE9PX0ZBUiovKSkpIHtcblxuICAgICAgICAvKiBJZiBwcmV2X21hdGNoIGlzIGFsc28gTUlOX01BVENILCBtYXRjaF9zdGFydCBpcyBnYXJiYWdlXG4gICAgICAgICAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuXG4gICAgICAgICAqL1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudFxuICAgICAqIG1hdGNoIGlzIG5vdCBiZXR0ZXIsIG91dHB1dCB0aGUgcHJldmlvdXMgbWF0Y2g6XG4gICAgICovXG4gICAgaWYgKHMucHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMubWF0Y2hfbGVuZ3RoIDw9IHMucHJldl9sZW5ndGgpIHtcbiAgICAgIG1heF9pbnNlcnQgPSBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQgLSBNSU5fTUFUQ0g7XG4gICAgICAvKiBEbyBub3QgaW5zZXJ0IHN0cmluZ3MgaW4gaGFzaCB0YWJsZSBiZXlvbmQgdGhpcy4gKi9cblxuICAgICAgLy9jaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LTEsIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCk7XG5cbiAgICAgIC8qKipfdHJfdGFsbHlfZGlzdChzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgIHMucHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7KioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSAxIC0gcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENIKTtcbiAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLlxuICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdFxuICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpblxuICAgICAgICogdGhlIGhhc2ggdGFibGUuXG4gICAgICAgKi9cbiAgICAgIHMubG9va2FoZWFkIC09IHMucHJldl9sZW5ndGggLSAxO1xuICAgICAgcy5wcmV2X2xlbmd0aCAtPSAyO1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoKytzLnN0cnN0YXJ0IDw9IG1heF9pbnNlcnQpIHtcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKC0tcy5wcmV2X2xlbmd0aCAhPT0gMCk7XG4gICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICBzLnN0cnN0YXJ0Kys7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIC8qKiovXG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYVxuICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaFxuICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC5cbiAgICAgICAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTtcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLX09OTFkocywgMCkgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgLyoqKi9cbiAgICAgIH1cbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCB0byBjb21wYXJlIHdpdGgsIHdhaXQgZm9yXG4gICAgICAgKiB0aGUgbmV4dCBzdGVwIHRvIGRlY2lkZS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGZsdXNoICE9IFpfTk9fRkxVU0gsIFwibm8gZmx1c2g/XCIpO1xuICBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIH1cbiAgcy5pbnNlcnQgPSBzLnN0cnN0YXJ0IDwgTUlOX01BVENIIC0gMSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZVxuICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mXG4gKiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBaX1JMRS4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfcmxlKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG4gIHZhciBwcmV2OyAgICAgICAgICAgICAgLyogYnl0ZSBhdCBkaXN0YW5jZSBvbmUgdG8gbWF0Y2ggKi9cbiAgdmFyIHNjYW4sIHN0cmVuZDsgICAgICAvKiBzY2FuIGdvZXMgdXAgdG8gc3RyZW5kIGZvciBsZW5ndGggb2YgcnVuICovXG5cbiAgdmFyIF93aW4gPSBzLndpbmRvdztcblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIGxvbmdlc3QgcnVuLCBwbHVzIG9uZSBmb3IgdGhlIHVucm9sbGVkIGxvb3AuXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBTZWUgaG93IG1hbnkgdGltZXMgdGhlIHByZXZpb3VzIGJ5dGUgcmVwZWF0cyAqL1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgPiAwKSB7XG4gICAgICBzY2FuID0gcy5zdHJzdGFydCAtIDE7XG4gICAgICBwcmV2ID0gX3dpbltzY2FuXTtcbiAgICAgIGlmIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSkge1xuICAgICAgICBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLypqc2hpbnQgbm9lbXB0eTpmYWxzZSovXG4gICAgICAgIH0gd2hpbGUgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pO1xuICAgICAgICBpZiAocy5tYXRjaF9sZW5ndGggPiBzLmxvb2thaGVhZCkge1xuICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gcy5sb29rYWhlYWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1SW50KShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG4gICAgfVxuXG4gICAgLyogRW1pdCBtYXRjaCBpZiBoYXZlIHJ1biBvZiBNSU5fTUFUQ0ggb3IgbG9uZ2VyLCBlbHNlIGVtaXQgbGl0ZXJhbCAqL1xuICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5zdHJzdGFydCAtIDEsIHMubWF0Y2hfbGVuZ3RoKTtcblxuICAgICAgLyoqKiBfdHJfdGFsbHlfZGlzdChzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDEsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTtcblxuICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRm9yIFpfSFVGRk1BTl9PTkxZLCBkbyBub3QgbG9vayBmb3IgbWF0Y2hlcy4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuXG4gKiAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBIdWZmbWFuLilcbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgbGl0ZXJhbCB0byB3cml0ZS4gKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7ICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcbiAgICBzLmxvb2thaGVhZC0tO1xuICAgIHMuc3Ryc3RhcnQrKztcbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uXG4gKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG9cbiAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZVxuICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLlxuICovXG5mdW5jdGlvbiBDb25maWcoZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluLCBmdW5jKSB7XG4gIHRoaXMuZ29vZF9sZW5ndGggPSBnb29kX2xlbmd0aDtcbiAgdGhpcy5tYXhfbGF6eSA9IG1heF9sYXp5O1xuICB0aGlzLm5pY2VfbGVuZ3RoID0gbmljZV9sZW5ndGg7XG4gIHRoaXMubWF4X2NoYWluID0gbWF4X2NoYWluO1xuICB0aGlzLmZ1bmMgPSBmdW5jO1xufVxuXG52YXIgY29uZmlndXJhdGlvbl90YWJsZTtcblxuY29uZmlndXJhdGlvbl90YWJsZSA9IFtcbiAgLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqL1xuICBuZXcgQ29uZmlnKDAsIDAsIDAsIDAsIGRlZmxhdGVfc3RvcmVkKSwgICAgICAgICAgLyogMCBzdG9yZSBvbmx5ICovXG4gIG5ldyBDb25maWcoNCwgNCwgOCwgNCwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgICAvKiAxIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoNCwgNSwgMTYsIDgsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAvKiAyICovXG4gIG5ldyBDb25maWcoNCwgNiwgMzIsIDMyLCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAvKiAzICovXG5cbiAgbmV3IENvbmZpZyg0LCA0LCAxNiwgMTYsIGRlZmxhdGVfc2xvdyksICAgICAgICAgIC8qIDQgbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDMyLCAzMiwgZGVmbGF0ZV9zbG93KSwgICAgICAgICAvKiA1ICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA2ICovXG4gIG5ldyBDb25maWcoOCwgMzIsIDEyOCwgMjU2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA3ICovXG4gIG5ldyBDb25maWcoMzIsIDEyOCwgMjU4LCAxMDI0LCBkZWZsYXRlX3Nsb3cpLCAgICAvKiA4ICovXG4gIG5ldyBDb25maWcoMzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3cpICAgICAvKiA5IG1heCBjb21wcmVzc2lvbiAqL1xuXTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIFwibG9uZ2VzdCBtYXRjaFwiIHJvdXRpbmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbVxuICovXG5mdW5jdGlvbiBsbV9pbml0KHMpIHtcbiAgcy53aW5kb3dfc2l6ZSA9IDIgKiBzLndfc2l6ZTtcblxuICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6XG4gICAqL1xuICBzLm1heF9sYXp5X21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfbGF6eTtcbiAgcy5nb29kX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5nb29kX2xlbmd0aDtcbiAgcy5uaWNlX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5uaWNlX2xlbmd0aDtcbiAgcy5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfY2hhaW47XG5cbiAgcy5zdHJzdGFydCA9IDA7XG4gIHMuYmxvY2tfc3RhcnQgPSAwO1xuICBzLmxvb2thaGVhZCA9IDA7XG4gIHMuaW5zZXJ0ID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzLmluc19oID0gMDtcbn1cblxuXG5mdW5jdGlvbiBEZWZsYXRlU3RhdGUoKSB7XG4gIHRoaXMuc3RybSA9IG51bGw7ICAgICAgICAgICAgLyogcG9pbnRlciBiYWNrIHRvIHRoaXMgemxpYiBzdHJlYW0gKi9cbiAgdGhpcy5zdGF0dXMgPSAwOyAgICAgICAgICAgIC8qIGFzIHRoZSBuYW1lIGltcGxpZXMgKi9cbiAgdGhpcy5wZW5kaW5nX2J1ZiA9IG51bGw7ICAgICAgLyogb3V0cHV0IHN0aWxsIHBlbmRpbmcgKi9cbiAgdGhpcy5wZW5kaW5nX2J1Zl9zaXplID0gMDsgIC8qIHNpemUgb2YgcGVuZGluZ19idWYgKi9cbiAgdGhpcy5wZW5kaW5nX291dCA9IDA7ICAgICAgIC8qIG5leHQgcGVuZGluZyBieXRlIHRvIG91dHB1dCB0byB0aGUgc3RyZWFtICovXG4gIHRoaXMucGVuZGluZyA9IDA7ICAgICAgICAgICAvKiBuYiBvZiBieXRlcyBpbiB0aGUgcGVuZGluZyBidWZmZXIgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5nemhlYWQgPSBudWxsOyAgICAgICAgIC8qIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHRvIHdyaXRlICovXG4gIHRoaXMuZ3ppbmRleCA9IDA7ICAgICAgICAgICAvKiB3aGVyZSBpbiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCAqL1xuICB0aGlzLm1ldGhvZCA9IFpfREVGTEFURUQ7IC8qIGNhbiBvbmx5IGJlIERFRkxBVEVEICovXG4gIHRoaXMubGFzdF9mbHVzaCA9IC0xOyAgIC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi9cblxuICB0aGlzLndfc2l6ZSA9IDA7ICAvKiBMWjc3IHdpbmRvdyBzaXplICgzMksgYnkgZGVmYXVsdCkgKi9cbiAgdGhpcy53X2JpdHMgPSAwOyAgLyogbG9nMih3X3NpemUpICAoOC4uMTYpICovXG4gIHRoaXMud19tYXNrID0gMDsgIC8qIHdfc2l6ZSAtIDEgKi9cblxuICB0aGlzLndpbmRvdyA9IG51bGw7XG4gIC8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LFxuICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZVxuICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mXG4gICAqIHdTaXplLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5c1xuICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS5cbiAgICovXG5cbiAgdGhpcy53aW5kb3dfc2l6ZSA9IDA7XG4gIC8qIEFjdHVhbCBzaXplIG9mIHdpbmRvdzogMip3U2l6ZSwgZXhjZXB0IHdoZW4gdGhlIHVzZXIgaW5wdXQgYnVmZmVyXG4gICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuXG4gICAqL1xuXG4gIHRoaXMucHJldiA9IG51bGw7XG4gIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzXG4gICAqIGFycmF5IHRvIDY0SywgdGhpcyBsaW5rIGlzIG1haW50YWluZWQgb25seSBmb3IgdGhlIGxhc3QgMzJLIHN0cmluZ3MuXG4gICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLlxuICAgKi9cblxuICB0aGlzLmhlYWQgPSBudWxsOyAgIC8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovXG5cbiAgdGhpcy5pbnNfaCA9IDA7ICAgICAgIC8qIGhhc2ggaW5kZXggb2Ygc3RyaW5nIHRvIGJlIGluc2VydGVkICovXG4gIHRoaXMuaGFzaF9zaXplID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGFzaCB0YWJsZSAqL1xuICB0aGlzLmhhc2hfYml0cyA9IDA7ICAgLyogbG9nMihoYXNoX3NpemUpICovXG4gIHRoaXMuaGFzaF9tYXNrID0gMDsgICAvKiBoYXNoX3NpemUtMSAqL1xuXG4gIHRoaXMuaGFzaF9zaGlmdCA9IDA7XG4gIC8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoIGlucHV0XG4gICAqIHN0ZXAuIEl0IG11c3QgYmUgc3VjaCB0aGF0IGFmdGVyIE1JTl9NQVRDSCBzdGVwcywgdGhlIG9sZGVzdFxuICAgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczpcbiAgICogICBoYXNoX3NoaWZ0ICogTUlOX01BVENIID49IGhhc2hfYml0c1xuICAgKi9cblxuICB0aGlzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgLyogV2luZG93IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGJsb2NrLiBHZXRzXG4gICAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuXG4gICAqL1xuXG4gIHRoaXMubWF0Y2hfbGVuZ3RoID0gMDsgICAgICAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqL1xuICB0aGlzLnByZXZfbWF0Y2ggPSAwOyAgICAgICAgLyogcHJldmlvdXMgbWF0Y2ggKi9cbiAgdGhpcy5tYXRjaF9hdmFpbGFibGUgPSAwOyAgIC8qIHNldCBpZiBwcmV2aW91cyBtYXRjaCBleGlzdHMgKi9cbiAgdGhpcy5zdHJzdGFydCA9IDA7ICAgICAgICAgIC8qIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgKi9cbiAgdGhpcy5tYXRjaF9zdGFydCA9IDA7ICAgICAgIC8qIHN0YXJ0IG9mIG1hdGNoaW5nIHN0cmluZyAqL1xuICB0aGlzLmxvb2thaGVhZCA9IDA7ICAgICAgICAgLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdyAqL1xuXG4gIHRoaXMucHJldl9sZW5ndGggPSAwO1xuICAvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXNcbiAgICogYXJlIGRpc2NhcmRlZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uXG4gICAqL1xuXG4gIHRoaXMubWF4X2NoYWluX2xlbmd0aCA9IDA7XG4gIC8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzXG4gICAqIGxlbmd0aC4gIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGVcbiAgICogc3BlZWQuXG4gICAqL1xuXG4gIHRoaXMubWF4X2xhenlfbWF0Y2ggPSAwO1xuICAvKiBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgbWF0Y2ggb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoIGlzIHN0cmljdGx5XG4gICAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uXG4gICAqIGxldmVscyA+PSA0LlxuICAgKi9cbiAgLy8gVGhhdCdzIGFsaWFzIHRvIG1heF9sYXp5X21hdGNoLCBkb24ndCB1c2UgZGlyZWN0bHlcbiAgLy90aGlzLm1heF9pbnNlcnRfbGVuZ3RoID0gMDtcbiAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBub3RcbiAgICogZ3JlYXRlciB0aGFuIHRoaXMgbGVuZ3RoLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uIGxldmVscyA8PSAzLlxuICAgKi9cblxuICB0aGlzLmxldmVsID0gMDsgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICgxLi45KSAqL1xuICB0aGlzLnN0cmF0ZWd5ID0gMDsgIC8qIGZhdm9yIG9yIGZvcmNlIEh1ZmZtYW4gY29kaW5nKi9cblxuICB0aGlzLmdvb2RfbWF0Y2ggPSAwO1xuICAvKiBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMgKi9cblxuICB0aGlzLm5pY2VfbWF0Y2ggPSAwOyAvKiBTdG9wIHNlYXJjaGluZyB3aGVuIGN1cnJlbnQgbWF0Y2ggZXhjZWVkcyB0aGlzICovXG5cbiAgICAgICAgICAgICAgLyogdXNlZCBieSB0cmVlcy5jOiAqL1xuXG4gIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi9cblxuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgZHluX2R0cmVlWzIqRF9DT0RFUysxXTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi9cblxuICAvLyBVc2UgZmxhdCBhcnJheSBvZiBET1VCTEUgc2l6ZSwgd2l0aCBpbnRlcmxlYXZlZCBmYXRhLFxuICAvLyBiZWNhdXNlIEpTIGRvZXMgbm90IHN1cHBvcnQgZWZmZWN0aXZlXG4gIHRoaXMuZHluX2x0cmVlICA9IG5ldyB1dGlscy5CdWYxNihIRUFQX1NJWkUgKiAyKTtcbiAgdGhpcy5keW5fZHRyZWUgID0gbmV3IHV0aWxzLkJ1ZjE2KCgyICogRF9DT0RFUyArIDEpICogMik7XG4gIHRoaXMuYmxfdHJlZSAgICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIEJMX0NPREVTICsgMSkgKiAyKTtcbiAgemVybyh0aGlzLmR5bl9sdHJlZSk7XG4gIHplcm8odGhpcy5keW5fZHRyZWUpO1xuICB6ZXJvKHRoaXMuYmxfdHJlZSk7XG5cbiAgdGhpcy5sX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqL1xuICB0aGlzLmRfZGVzYyAgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgZGlzdGFuY2UgdHJlZSAqL1xuICB0aGlzLmJsX2Rlc2MgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovXG5cbiAgLy91c2ggYmxfY291bnRbTUFYX0JJVFMrMV07XG4gIHRoaXMuYmxfY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy9pbnQgaGVhcFsyKkxfQ09ERVMrMV07ICAgICAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHRoaXMuaGVhcCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHplcm8odGhpcy5oZWFwKTtcblxuICB0aGlzLmhlYXBfbGVuID0gMDsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhlYXAgKi9cbiAgdGhpcy5oZWFwX21heCA9IDA7ICAgICAgICAgICAgICAgLyogZWxlbWVudCBvZiBsYXJnZXN0IGZyZXF1ZW5jeSAqL1xuICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLlxuICAgKi9cblxuICB0aGlzLmRlcHRoID0gbmV3IHV0aWxzLkJ1ZjE2KDIgKiBMX0NPREVTICsgMSk7IC8vdWNoIGRlcHRoWzIqTF9DT0RFUysxXTtcbiAgemVybyh0aGlzLmRlcHRoKTtcbiAgLyogRGVwdGggb2YgZWFjaCBzdWJ0cmVlIHVzZWQgYXMgdGllIGJyZWFrZXIgZm9yIHRyZWVzIG9mIGVxdWFsIGZyZXF1ZW5jeVxuICAgKi9cblxuICB0aGlzLmxfYnVmID0gMDsgICAgICAgICAgLyogYnVmZmVyIGluZGV4IGZvciBsaXRlcmFscyBvciBsZW5ndGhzICovXG5cbiAgdGhpcy5saXRfYnVmc2l6ZSA9IDA7XG4gIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3JcbiAgICogbGltaXRpbmcgbGl0X2J1ZnNpemUgdG8gNjRLOlxuICAgKiAgIC0gZnJlcXVlbmNpZXMgY2FuIGJlIGtlcHQgaW4gMTYgYml0IGNvdW50ZXJzXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXRcbiAgICogICAgIGRhdGEgaXMgc3RpbGwgaW4gdGhlIHdpbmRvdyBzbyB3ZSBjYW4gc3RpbGwgZW1pdCBhIHN0b3JlZCBibG9jayBldmVuXG4gICAqICAgICB3aGVuIGlucHV0IGNvbWVzIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZvclxuICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYSBmaWxlIHNtYWxsZXIgdGhhbiA2NEssIHdlIGNhblxuICAgKiAgICAgZXZlbiBlbWl0IGEgc3RvcmVkIGZpbGUgaW5zdGVhZCBvZiBhIHN0b3JlZCBibG9jayAoc2F2aW5nIDUgYnl0ZXMpLlxuICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuXG4gICAqICAgLSBjcmVhdGluZyBuZXcgSHVmZm1hbiB0cmVlcyBsZXNzIGZyZXF1ZW50bHkgbWF5IG5vdCBwcm92aWRlIGZhc3RcbiAgICogICAgIGFkYXB0YXRpb24gdG8gY2hhbmdlcyBpbiB0aGUgaW5wdXQgZGF0YSBzdGF0aXN0aWNzLiAoVGFrZSBmb3JcbiAgICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieVxuICAgKiAgICAgYSBoaWdobHkgY29tcHJlc3NpYmxlIHN0cmluZyB0YWJsZS4pIFNtYWxsZXIgYnVmZmVyIHNpemVzIGdpdmVcbiAgICogICAgIGZhc3QgYWRhcHRhdGlvbiBidXQgaGF2ZSBvZiBjb3Vyc2UgdGhlIG92ZXJoZWFkIG9mIHRyYW5zbWl0dGluZ1xuICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LlxuICAgKiAgIC0gSSBjYW4ndCBjb3VudCBhYm92ZSA0XG4gICAqL1xuXG4gIHRoaXMubGFzdF9saXQgPSAwOyAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cblxuICB0aGlzLmRfYnVmID0gMDtcbiAgLyogQnVmZmVyIGluZGV4IGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZVxuICAgKiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZ1xuICAgKiBhcnJheSB3b3VsZCBiZSBuZWNlc3NhcnkuXG4gICAqL1xuXG4gIHRoaXMub3B0X2xlbiA9IDA7ICAgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIG9wdGltYWwgdHJlZXMgKi9cbiAgdGhpcy5zdGF0aWNfbGVuID0gMDsgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovXG4gIHRoaXMubWF0Y2hlcyA9IDA7ICAgICAgIC8qIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrICovXG4gIHRoaXMuaW5zZXJ0ID0gMDsgICAgICAgIC8qIGJ5dGVzIGF0IGVuZCBvZiB3aW5kb3cgbGVmdCB0byBpbnNlcnQgKi9cblxuXG4gIHRoaXMuYmlfYnVmID0gMDtcbiAgLyogT3V0cHV0IGJ1ZmZlci4gYml0cyBhcmUgaW5zZXJ0ZWQgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbSAobGVhc3RcbiAgICogc2lnbmlmaWNhbnQgYml0cykuXG4gICAqL1xuICB0aGlzLmJpX3ZhbGlkID0gMDtcbiAgLyogTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYmlfYnVmLiAgQWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QgdmFsaWQgYml0XG4gICAqIGFyZSBhbHdheXMgemVyby5cbiAgICovXG5cbiAgLy8gVXNlZCBmb3Igd2luZG93IG1lbW9yeSBpbml0LiBXZSBzYWZlbHkgaWdub3JlIGl0IGZvciBKUy4gVGhhdCBtYWtlc1xuICAvLyBzZW5zZSBvbmx5IGZvciBwb2ludGVycyBhbmQgbWVtb3J5IGNoZWNrIHRvb2xzLlxuICAvL3RoaXMuaGlnaF93YXRlciA9IDA7XG4gIC8qIEhpZ2ggd2F0ZXIgbWFyayBvZmZzZXQgaW4gd2luZG93IGZvciBpbml0aWFsaXplZCBieXRlcyAtLSBieXRlcyBhYm92ZVxuICAgKiB0aGlzIGFyZSBzZXQgdG8gemVybyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgd2FybmluZ3Mgd2hlblxuICAgKiBsb25nZXN0IG1hdGNoIHJvdXRpbmVzIGFjY2VzcyBieXRlcyBwYXN0IHRoZSBpbnB1dC4gIFRoaXMgaXMgdGhlblxuICAgKiB1cGRhdGVkIHRvIHRoZSBuZXcgaGlnaCB3YXRlciBtYXJrLlxuICAgKi9cbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHM7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSAwO1xuICBzdHJtLmRhdGFfdHlwZSA9IFpfVU5LTk9XTjtcblxuICBzID0gc3RybS5zdGF0ZTtcbiAgcy5wZW5kaW5nID0gMDtcbiAgcy5wZW5kaW5nX291dCA9IDA7XG5cbiAgaWYgKHMud3JhcCA8IDApIHtcbiAgICBzLndyYXAgPSAtcy53cmFwO1xuICAgIC8qIHdhcyBtYWRlIG5lZ2F0aXZlIGJ5IGRlZmxhdGUoLi4uLCBaX0ZJTklTSCk7ICovXG4gIH1cbiAgcy5zdGF0dXMgPSAocy53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEUpO1xuICBzdHJtLmFkbGVyID0gKHMud3JhcCA9PT0gMikgP1xuICAgIDAgIC8vIGNyYzMyKDAsIFpfTlVMTCwgMClcbiAgOlxuICAgIDE7IC8vIGFkbGVyMzIoMCwgWl9OVUxMLCAwKVxuICBzLmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIO1xuICB0cmVlcy5fdHJfaW5pdChzKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0KHN0cm0pIHtcbiAgdmFyIHJldCA9IGRlZmxhdGVSZXNldEtlZXAoc3RybSk7XG4gIGlmIChyZXQgPT09IFpfT0spIHtcbiAgICBsbV9pbml0KHN0cm0uc3RhdGUpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVNldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgaWYgKHN0cm0uc3RhdGUud3JhcCAhPT0gMikgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RybS5zdGF0ZS5nemhlYWQgPSBoZWFkO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KSB7XG4gIGlmICghc3RybSkgeyAvLyA9PT0gWl9OVUxMXG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIHZhciB3cmFwID0gMTtcblxuICBpZiAobGV2ZWwgPT09IFpfREVGQVVMVF9DT01QUkVTU0lPTikge1xuICAgIGxldmVsID0gNjtcbiAgfVxuXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkgeyAvKiBzdXBwcmVzcyB6bGliIHdyYXBwZXIgKi9cbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cblxuICBlbHNlIGlmICh3aW5kb3dCaXRzID4gMTUpIHtcbiAgICB3cmFwID0gMjsgICAgICAgICAgIC8qIHdyaXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkICovXG4gICAgd2luZG93Qml0cyAtPSAxNjtcbiAgfVxuXG5cbiAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9PSBaX0RFRkxBVEVEIHx8XG4gICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHxcbiAgICBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuXG4gIGlmICh3aW5kb3dCaXRzID09PSA4KSB7XG4gICAgd2luZG93Qml0cyA9IDk7XG4gIH1cbiAgLyogdW50aWwgMjU2LWJ5dGUgd2luZG93IGJ1ZyBmaXhlZCAqL1xuXG4gIHZhciBzID0gbmV3IERlZmxhdGVTdGF0ZSgpO1xuXG4gIHN0cm0uc3RhdGUgPSBzO1xuICBzLnN0cm0gPSBzdHJtO1xuXG4gIHMud3JhcCA9IHdyYXA7XG4gIHMuZ3poZWFkID0gbnVsbDtcbiAgcy53X2JpdHMgPSB3aW5kb3dCaXRzO1xuICBzLndfc2l6ZSA9IDEgPDwgcy53X2JpdHM7XG4gIHMud19tYXNrID0gcy53X3NpemUgLSAxO1xuXG4gIHMuaGFzaF9iaXRzID0gbWVtTGV2ZWwgKyA3O1xuICBzLmhhc2hfc2l6ZSA9IDEgPDwgcy5oYXNoX2JpdHM7XG4gIHMuaGFzaF9tYXNrID0gcy5oYXNoX3NpemUgLSAxO1xuICBzLmhhc2hfc2hpZnQgPSB+figocy5oYXNoX2JpdHMgKyBNSU5fTUFUQ0ggLSAxKSAvIE1JTl9NQVRDSCk7XG5cbiAgcy53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSAqIDIpO1xuICBzLmhlYWQgPSBuZXcgdXRpbHMuQnVmMTYocy5oYXNoX3NpemUpO1xuICBzLnByZXYgPSBuZXcgdXRpbHMuQnVmMTYocy53X3NpemUpO1xuXG4gIC8vIERvbid0IG5lZWQgbWVtIGluaXQgbWFnaWMgZm9yIEpTLlxuICAvL3MuaGlnaF93YXRlciA9IDA7ICAvKiBub3RoaW5nIHdyaXR0ZW4gdG8gcy0+d2luZG93IHlldCAqL1xuXG4gIHMubGl0X2J1ZnNpemUgPSAxIDw8IChtZW1MZXZlbCArIDYpOyAvKiAxNksgZWxlbWVudHMgYnkgZGVmYXVsdCAqL1xuXG4gIHMucGVuZGluZ19idWZfc2l6ZSA9IHMubGl0X2J1ZnNpemUgKiA0O1xuXG4gIC8vb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhzdHJtLCBzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7XG4gIC8vcy0+cGVuZGluZ19idWYgPSAodWNoZiAqKSBvdmVybGF5O1xuICBzLnBlbmRpbmdfYnVmID0gbmV3IHV0aWxzLkJ1Zjgocy5wZW5kaW5nX2J1Zl9zaXplKTtcblxuICAvLyBJdCBpcyBvZmZzZXQgZnJvbSBgcy5wZW5kaW5nX2J1ZmAgKHNpemUgaXMgYHMubGl0X2J1ZnNpemUgKiAyYClcbiAgLy9zLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTtcbiAgcy5kX2J1ZiA9IDEgKiBzLmxpdF9idWZzaXplO1xuXG4gIC8vcy0+bF9idWYgPSBzLT5wZW5kaW5nX2J1ZiArICgxK3NpemVvZih1c2gpKSpzLT5saXRfYnVmc2l6ZTtcbiAgcy5sX2J1ZiA9ICgxICsgMikgKiBzLmxpdF9idWZzaXplO1xuXG4gIHMubGV2ZWwgPSBsZXZlbDtcbiAgcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICBzLm1ldGhvZCA9IG1ldGhvZDtcblxuICByZXR1cm4gZGVmbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkge1xuICByZXR1cm4gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBaX0RFRkxBVEVELCBNQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSk7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZShzdHJtLCBmbHVzaCkge1xuICB2YXIgb2xkX2ZsdXNoLCBzO1xuICB2YXIgYmVnLCB2YWw7IC8vIGZvciBnemlwIGhlYWRlciB3cml0ZSBvbmx5XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8XG4gICAgZmx1c2ggPiBaX0JMT0NLIHx8IGZsdXNoIDwgMCkge1xuICAgIHJldHVybiBzdHJtID8gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKSA6IFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKCFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHx8XG4gICAgICAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPT0gWl9GSU5JU0gpKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCAoc3RybS5hdmFpbF9vdXQgPT09IDApID8gWl9CVUZfRVJST1IgOiBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzLnN0cm0gPSBzdHJtOyAvKiBqdXN0IGluIGNhc2UgKi9cbiAgb2xkX2ZsdXNoID0gcy5sYXN0X2ZsdXNoO1xuICBzLmxhc3RfZmx1c2ggPSBmbHVzaDtcblxuICAvKiBXcml0ZSB0aGUgaGVhZGVyICovXG4gIGlmIChzLnN0YXR1cyA9PT0gSU5JVF9TVEFURSkge1xuXG4gICAgaWYgKHMud3JhcCA9PT0gMikgeyAvLyBHWklQIGhlYWRlclxuICAgICAgc3RybS5hZGxlciA9IDA7ICAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgcHV0X2J5dGUocywgMzEpO1xuICAgICAgcHV0X2J5dGUocywgMTM5KTtcbiAgICAgIHB1dF9ieXRlKHMsIDgpO1xuICAgICAgaWYgKCFzLmd6aGVhZCkgeyAvLyBzLT5nemhlYWQgPT0gWl9OVUxMXG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBPU19DT0RFKTtcbiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50ZXh0ID8gMSA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHMuZ3poZWFkLmhjcmMgPyAyIDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoIXMuZ3poZWFkLmV4dHJhID8gMCA6IDQpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5uYW1lID8gMCA6IDgpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5jb21tZW50ID8gMCA6IDE2KVxuICAgICAgICApO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC50aW1lICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDgpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDE2KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiAyNCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5vcyAmIDB4ZmYpO1xuICAgICAgICBpZiAocy5nemhlYWQuZXh0cmEgJiYgcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhmZik7XG4gICAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZywgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBFWFRSQV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSAvLyBERUZMQVRFIGhlYWRlclxuICAgIHtcbiAgICAgIHZhciBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgocy53X2JpdHMgLSA4KSA8PCA0KSkgPDwgODtcbiAgICAgIHZhciBsZXZlbF9mbGFncyA9IC0xO1xuXG4gICAgICBpZiAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPCA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMTtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA9PT0gNikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDM7XG4gICAgICB9XG4gICAgICBoZWFkZXIgfD0gKGxldmVsX2ZsYWdzIDw8IDYpO1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHsgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOyB9XG4gICAgICBoZWFkZXIgKz0gMzEgLSAoaGVhZGVyICUgMzEpO1xuXG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICBwdXRTaG9ydE1TQihzLCBoZWFkZXIpO1xuXG4gICAgICAvKiBTYXZlIHRoZSBhZGxlcjMyIG9mIHRoZSBwcmVzZXQgZGljdGlvbmFyeTogKi9cbiAgICAgIGlmIChzLnN0cnN0YXJ0ICE9PSAwKSB7XG4gICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gMTsgLy8gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTtcbiAgICB9XG4gIH1cblxuLy8jaWZkZWYgR1pJUFxuICBpZiAocy5zdGF0dXMgPT09IEVYVFJBX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmV4dHJhLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cblxuICAgICAgd2hpbGUgKHMuZ3ppbmRleCA8IChzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmZmYpKSB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmFbcy5nemluZGV4XSAmIDB4ZmYpO1xuICAgICAgICBzLmd6aW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3ppbmRleCA9PT0gcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gTkFNRV9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5uYW1lLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIC8vaW50IHZhbDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKUyBzcGVjaWZpYzogbGl0dGxlIG1hZ2ljIHRvIGFkZCB6ZXJvIHRlcm1pbmF0b3IgdG8gZW5kIG9mIHN0cmluZ1xuICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQubmFtZS5sZW5ndGgpIHtcbiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7XG4gICAgICB9IHdoaWxlICh2YWwgIT09IDApO1xuXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWwgPT09IDApIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gQ09NTUVOVF9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBDT01NRU5UX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmNvbW1lbnQvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5jb21tZW50Lmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IEhDUkNfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgaWYgKHMucGVuZGluZyArIDIgPiBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIH1cbiAgICAgIGlmIChzLnBlbmRpbmcgKyAyIDw9IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7XG4gICAgICAgIHN0cm0uYWRsZXIgPSAwOyAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgIH1cbiAgfVxuLy8jZW5kaWZcblxuICAvKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlICovXG4gIGlmIChzLnBlbmRpbmcgIT09IDApIHtcbiAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aFxuICAgICAgICogbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmRcbiAgICAgICAqIGF2YWlsX2luIGVxdWFsIHRvIHplcm8uIFRoZXJlIHdvbid0IGJlIGFueXRoaW5nIHRvIGRvLFxuICAgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2VcbiAgICAgICAqIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZTpcbiAgICAgICAqL1xuICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7XG4gICAgICByZXR1cm4gWl9PSztcbiAgICB9XG5cbiAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGFuZCBhdm9pZCBkdXBsaWNhdGUgY29uc2VjdXRpdmVcbiAgICAgKiBmbHVzaGVzLiBGb3IgcmVwZWF0ZWQgYW5kIHVzZWxlc3MgY2FsbHMgd2l0aCBaX0ZJTklTSCwgd2Uga2VlcFxuICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRl9FUlJPUi5cbiAgICAgKi9cbiAgfSBlbHNlIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHJhbmsoZmx1c2gpIDw9IHJhbmsob2xkX2ZsdXNoKSAmJlxuICAgIGZsdXNoICE9PSBaX0ZJTklTSCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogVXNlciBtdXN0IG5vdCBwcm92aWRlIG1vcmUgaW5wdXQgYWZ0ZXIgdGhlIGZpcnN0IEZJTklTSDogKi9cbiAgaWYgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogU3RhcnQgYSBuZXcgYmxvY2sgb3IgY29udGludWUgdGhlIGN1cnJlbnQgb25lLlxuICAgKi9cbiAgaWYgKHN0cm0uYXZhaWxfaW4gIT09IDAgfHwgcy5sb29rYWhlYWQgIT09IDAgfHxcbiAgICAoZmx1c2ggIT09IFpfTk9fRkxVU0ggJiYgcy5zdGF0dXMgIT09IEZJTklTSF9TVEFURSkpIHtcbiAgICB2YXIgYnN0YXRlID0gKHMuc3RyYXRlZ3kgPT09IFpfSFVGRk1BTl9PTkxZKSA/IGRlZmxhdGVfaHVmZihzLCBmbHVzaCkgOlxuICAgICAgKHMuc3RyYXRlZ3kgPT09IFpfUkxFID8gZGVmbGF0ZV9ybGUocywgZmx1c2gpIDpcbiAgICAgICAgY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5mdW5jKHMsIGZsdXNoKSk7XG5cbiAgICBpZiAoYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9ET05FKSB7XG4gICAgICBzLnN0YXR1cyA9IEZJTklTSF9TVEFURTtcbiAgICB9XG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfTkVFRF9NT1JFIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQpIHtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgICAgLyogYXZvaWQgQlVGX0VSUk9SIG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICB9XG4gICAgICByZXR1cm4gWl9PSztcbiAgICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGxcbiAgICAgICAqIG9mIGRlZmxhdGUgc2hvdWxkIHVzZSB0aGUgc2FtZSBmbHVzaCBwYXJhbWV0ZXIgdG8gbWFrZSBzdXJlXG4gICAgICAgKiB0aGF0IHRoZSBmbHVzaCBpcyBjb21wbGV0ZS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBvdXRwdXQgYW5cbiAgICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvXG4gICAgICAgKiBlbnN1cmVzIHRoYXQgZm9yIGEgdmVyeSBzbWFsbCBvdXRwdXQgYnVmZmVyLCB3ZSBlbWl0IGF0IG1vc3RcbiAgICAgICAqIG9uZSBlbXB0eSBibG9jay5cbiAgICAgICAqL1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19CTE9DS19ET05FKSB7XG4gICAgICBpZiAoZmx1c2ggPT09IFpfUEFSVElBTF9GTFVTSCkge1xuICAgICAgICB0cmVlcy5fdHJfYWxpZ24ocyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChmbHVzaCAhPT0gWl9CTE9DSykgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi9cblxuICAgICAgICB0cmVlcy5fdHJfc3RvcmVkX2Jsb2NrKHMsIDAsIDAsIGZhbHNlKTtcbiAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWRcbiAgICAgICAgICogYXMgYSBzcGVjaWFsIG1hcmtlciBieSBpbmZsYXRlX3N5bmMoKS5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9GVUxMX0ZMVVNIKSB7XG4gICAgICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovICAgICAgICAgICAgIC8qIGZvcmdldCBoaXN0b3J5ICovXG4gICAgICAgICAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gICAgICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgICAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5pbnNlcnQgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICAgIHJldHVybiBaX09LO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvL0Fzc2VydChzdHJtLT5hdmFpbF9vdXQgPiAwLCBcImJ1ZzJcIik7XG4gIC8vaWYgKHN0cm0uYXZhaWxfb3V0IDw9IDApIHsgdGhyb3cgbmV3IEVycm9yKFwiYnVnMlwiKTt9XG5cbiAgaWYgKGZsdXNoICE9PSBaX0ZJTklTSCkgeyByZXR1cm4gWl9PSzsgfVxuICBpZiAocy53cmFwIDw9IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VORDsgfVxuXG4gIC8qIFdyaXRlIHRoZSB0cmFpbGVyICovXG4gIGlmIChzLndyYXAgPT09IDIpIHtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAyNCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLnRvdGFsX2luICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAyNCkgJiAweGZmKTtcbiAgfVxuICBlbHNlXG4gIHtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyID4+PiAxNik7XG4gICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gIH1cblxuICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAvKiBJZiBhdmFpbF9vdXQgaXMgemVybywgdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCBkZWZsYXRlIGFnYWluXG4gICAqIHRvIGZsdXNoIHRoZSByZXN0LlxuICAgKi9cbiAgaWYgKHMud3JhcCA+IDApIHsgcy53cmFwID0gLXMud3JhcDsgfVxuICAvKiB3cml0ZSB0aGUgdHJhaWxlciBvbmx5IG9uY2UhICovXG4gIHJldHVybiBzLnBlbmRpbmcgIT09IDAgPyBaX09LIDogWl9TVFJFQU1fRU5EO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlRW5kKHN0cm0pIHtcbiAgdmFyIHN0YXR1cztcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHN0YXR1cyA9IHN0cm0uc3RhdGUuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSBJTklUX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBFWFRSQV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gTkFNRV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQ09NTUVOVF9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gSENSQ19TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQlVTWV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gRklOSVNIX1NUQVRFXG4gICkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG5cbiAgcmV0dXJuIHN0YXR1cyA9PT0gQlVTWV9TVEFURSA/IGVycihzdHJtLCBaX0RBVEFfRVJST1IpIDogWl9PSztcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlXG4gKiBzZXF1ZW5jZSB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgcztcbiAgdmFyIHN0ciwgbjtcbiAgdmFyIHdyYXA7XG4gIHZhciBhdmFpbDtcbiAgdmFyIG5leHQ7XG4gIHZhciBpbnB1dDtcbiAgdmFyIHRtcERpY3Q7XG5cbiAgaWYgKCFzdHJtLyo9PSBaX05VTEwqLyB8fCAhc3RybS5zdGF0ZS8qPT0gWl9OVUxMKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzID0gc3RybS5zdGF0ZTtcbiAgd3JhcCA9IHMud3JhcDtcblxuICBpZiAod3JhcCA9PT0gMiB8fCAod3JhcCA9PT0gMSAmJiBzLnN0YXR1cyAhPT0gSU5JVF9TVEFURSkgfHwgcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICAvKiB3aGVuIHVzaW5nIHpsaWIgd3JhcHBlcnMsIGNvbXB1dGUgQWRsZXItMzIgZm9yIHByb3ZpZGVkIGRpY3Rpb25hcnkgKi9cbiAgaWYgKHdyYXAgPT09IDEpIHtcbiAgICAvKiBhZGxlcjMyKHN0cm0tPmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBzdHJtLmFkbGVyID0gYWRsZXIzMihzdHJtLmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgfVxuXG4gIHMud3JhcCA9IDA7ICAgLyogYXZvaWQgY29tcHV0aW5nIEFkbGVyLTMyIGluIHJlYWRfYnVmICovXG5cbiAgLyogaWYgZGljdGlvbmFyeSB3b3VsZCBmaWxsIHdpbmRvdywganVzdCByZXBsYWNlIHRoZSBoaXN0b3J5ICovXG4gIGlmIChkaWN0TGVuZ3RoID49IHMud19zaXplKSB7XG4gICAgaWYgKHdyYXAgPT09IDApIHsgICAgICAgICAgICAvKiBhbHJlYWR5IGVtcHR5IG90aGVyd2lzZSAqL1xuICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG4gICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgcy5pbnNlcnQgPSAwO1xuICAgIH1cbiAgICAvKiB1c2UgdGhlIHRhaWwgKi9cbiAgICAvLyBkaWN0aW9uYXJ5ID0gZGljdGlvbmFyeS5zbGljZShkaWN0TGVuZ3RoIC0gcy53X3NpemUpO1xuICAgIHRtcERpY3QgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSk7XG4gICAgdXRpbHMuYXJyYXlTZXQodG1wRGljdCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCAtIHMud19zaXplLCBzLndfc2l6ZSwgMCk7XG4gICAgZGljdGlvbmFyeSA9IHRtcERpY3Q7XG4gICAgZGljdExlbmd0aCA9IHMud19zaXplO1xuICB9XG4gIC8qIGluc2VydCBkaWN0aW9uYXJ5IGludG8gd2luZG93IGFuZCBoYXNoICovXG4gIGF2YWlsID0gc3RybS5hdmFpbF9pbjtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBzdHJtLmF2YWlsX2luID0gZGljdExlbmd0aDtcbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5pbnB1dCA9IGRpY3Rpb25hcnk7XG4gIGZpbGxfd2luZG93KHMpO1xuICB3aGlsZSAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgc3RyID0gcy5zdHJzdGFydDtcbiAgICBuID0gcy5sb29rYWhlYWQgLSAoTUlOX01BVENIIC0gMSk7XG4gICAgZG8ge1xuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG5cbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHN0cjtcbiAgICAgIHN0cisrO1xuICAgIH0gd2hpbGUgKC0tbik7XG4gICAgcy5zdHJzdGFydCA9IHN0cjtcbiAgICBzLmxvb2thaGVhZCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgZmlsbF93aW5kb3cocyk7XG4gIH1cbiAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIHMuaW5zZXJ0ID0gcy5sb29rYWhlYWQ7XG4gIHMubG9va2FoZWFkID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmlucHV0ID0gaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBhdmFpbDtcbiAgcy53cmFwID0gd3JhcDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZXhwb3J0cy5kZWZsYXRlSW5pdCA9IGRlZmxhdGVJbml0O1xuZXhwb3J0cy5kZWZsYXRlSW5pdDIgPSBkZWZsYXRlSW5pdDI7XG5leHBvcnRzLmRlZmxhdGVSZXNldCA9IGRlZmxhdGVSZXNldDtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0S2VlcCA9IGRlZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmRlZmxhdGVTZXRIZWFkZXIgPSBkZWZsYXRlU2V0SGVhZGVyO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZUVuZCA9IGRlZmxhdGVFbmQ7XG5leHBvcnRzLmRlZmxhdGVTZXREaWN0aW9uYXJ5ID0gZGVmbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmRlZmxhdGVJbmZvID0gJ3Bha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuZGVmbGF0ZUJvdW5kID0gZGVmbGF0ZUJvdW5kO1xuZXhwb3J0cy5kZWZsYXRlQ29weSA9IGRlZmxhdGVDb3B5O1xuZXhwb3J0cy5kZWZsYXRlUGFyYW1zID0gZGVmbGF0ZVBhcmFtcztcbmV4cG9ydHMuZGVmbGF0ZVBlbmRpbmcgPSBkZWZsYXRlUGVuZGluZztcbmV4cG9ydHMuZGVmbGF0ZVByaW1lID0gZGVmbGF0ZVByaW1lO1xuZXhwb3J0cy5kZWZsYXRlVHVuZSA9IGRlZmxhdGVUdW5lO1xuKi9cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG4vKiBlc2xpbnQtZGlzYWJsZSBzcGFjZS11bmFyeS1vcHMgKi9cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8vdmFyIFpfRklMVEVSRUQgICAgICAgICAgPSAxO1xuLy92YXIgWl9IVUZGTUFOX09OTFkgICAgICA9IDI7XG4vL3ZhciBaX1JMRSAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xuLy92YXIgWl9ERUZBVUxUX1NUUkFURUdZICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbnZhciBaX0JJTkFSWSAgICAgICAgICAgICAgPSAwO1xudmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG4vLyBGcm9tIHp1dGlsLmhcblxudmFyIFNUT1JFRF9CTE9DSyA9IDA7XG52YXIgU1RBVElDX1RSRUVTID0gMTtcbnZhciBEWU5fVFJFRVMgICAgPSAyO1xuLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi9cblxudmFyIE1JTl9NQVRDSCAgICA9IDM7XG52YXIgTUFYX01BVENIICAgID0gMjU4O1xuLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAqL1xuXG4vLyBGcm9tIGRlZmxhdGUuaFxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS5cbiAqL1xuXG52YXIgTEVOR1RIX0NPREVTICA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG5cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBEX0NPREVTICAgICAgID0gMzA7XG4vKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi9cblxudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xuXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG5cbnZhciBNQVhfQklUUyAgICAgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIEJ1Zl9zaXplICAgICAgPSAxNjtcbi8qIHNpemUgb2YgYml0IGJ1ZmZlciBpbiBiaV9idWYgKi9cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0YW50c1xuICovXG5cbnZhciBNQVhfQkxfQklUUyA9IDc7XG4vKiBCaXQgbGVuZ3RoIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQkxfQklUUyBiaXRzICovXG5cbnZhciBFTkRfQkxPQ0sgICA9IDI1Njtcbi8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi9cblxudmFyIFJFUF8zXzYgICAgID0gMTY7XG4vKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzNfMTAgICA9IDE3O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMy0xMCB0aW1lcyAgKDMgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzExXzEzOCA9IDE4O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxuLyogZXNsaW50LWRpc2FibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi9cbnZhciBleHRyYV9sYml0cyA9ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqL1xuICBbMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXTtcblxudmFyIGV4dHJhX2RiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi9cbiAgWzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdO1xuXG52YXIgZXh0cmFfYmxiaXRzID0gIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggYml0IGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XTtcblxudmFyIGJsX29yZGVyID1cbiAgWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdO1xuLyogZXNsaW50LWVuYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xuXG4vKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nXG4gKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy5cbiAqL1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIExvY2FsIGRhdGEuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UuXG4gKi9cblxuLy8gV2UgcHJlLWZpbGwgYXJyYXlzIHdpdGggMCB0byBhdm9pZCB1bmluaXRpYWxpemVkIGdhcHNcblxudmFyIERJU1RfQ09ERV9MRU4gPSA1MTI7IC8qIHNlZSBkZWZpbml0aW9uIG9mIGFycmF5IGRpc3RfY29kZSBiZWxvdyAqL1xuXG4vLyAhISEhIFVzZSBmbGF0IGFycmF5IGluc3RlYWQgb2Ygc3RydWN0dXJlLCBGcmVxID0gaSoyLCBMZW4gPSBpKjIrMVxudmFyIHN0YXRpY19sdHJlZSAgPSBuZXcgQXJyYXkoKExfQ09ERVMgKyAyKSAqIDIpO1xuemVybyhzdGF0aWNfbHRyZWUpO1xuLyogVGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUuIFNpbmNlIHRoZSBiaXQgbGVuZ3RocyBhcmUgaW1wb3NlZCwgdGhlcmUgaXMgbm9cbiAqIG5lZWQgZm9yIHRoZSBMX0NPREVTIGV4dHJhIGNvZGVzIHVzZWQgZHVyaW5nIGhlYXAgY29uc3RydWN0aW9uLiBIb3dldmVyXG4gKiBUaGUgY29kZXMgMjg2IGFuZCAyODcgYXJlIG5lZWRlZCB0byBidWlsZCBhIGNhbm9uaWNhbCB0cmVlIChzZWUgX3RyX2luaXRcbiAqIGJlbG93KS5cbiAqL1xuXG52YXIgc3RhdGljX2R0cmVlICA9IG5ldyBBcnJheShEX0NPREVTICogMik7XG56ZXJvKHN0YXRpY19kdHJlZSk7XG4vKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlXG4gKiA1IGJpdHMuKVxuICovXG5cbnZhciBfZGlzdF9jb2RlICAgID0gbmV3IEFycmF5KERJU1RfQ09ERV9MRU4pO1xuemVybyhfZGlzdF9jb2RlKTtcbi8qIERpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBkaXN0YW5jZXNcbiAqIDMgLi4gMjU4LCB0aGUgbGFzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHRvcCA4IGJpdHMgb2ZcbiAqIHRoZSAxNSBiaXQgZGlzdGFuY2VzLlxuICovXG5cbnZhciBfbGVuZ3RoX2NvZGUgID0gbmV3IEFycmF5KE1BWF9NQVRDSCAtIE1JTl9NQVRDSCArIDEpO1xuemVybyhfbGVuZ3RoX2NvZGUpO1xuLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9sZW5ndGggICA9IG5ldyBBcnJheShMRU5HVEhfQ09ERVMpO1xuemVybyhiYXNlX2xlbmd0aCk7XG4vKiBGaXJzdCBub3JtYWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9kaXN0ICAgICA9IG5ldyBBcnJheShEX0NPREVTKTtcbnplcm8oYmFzZV9kaXN0KTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgZGlzdGFuY2UgZm9yIGVhY2ggY29kZSAoMCA9IGRpc3RhbmNlIG9mIDEpICovXG5cblxuZnVuY3Rpb24gU3RhdGljVHJlZURlc2Moc3RhdGljX3RyZWUsIGV4dHJhX2JpdHMsIGV4dHJhX2Jhc2UsIGVsZW1zLCBtYXhfbGVuZ3RoKSB7XG5cbiAgdGhpcy5zdGF0aWNfdHJlZSAgPSBzdGF0aWNfdHJlZTsgIC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iaXRzICAgPSBleHRyYV9iaXRzOyAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovXG4gIHRoaXMuZXh0cmFfYmFzZSAgID0gZXh0cmFfYmFzZTsgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovXG4gIHRoaXMuZWxlbXMgICAgICAgID0gZWxlbXM7ICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovXG4gIHRoaXMubWF4X2xlbmd0aCAgID0gbWF4X2xlbmd0aDsgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovXG5cbiAgLy8gc2hvdyBpZiBgc3RhdGljX3RyZWVgIGhhcyBkYXRhIG9yIGR1bW15IC0gbmVlZGVkIGZvciBtb25vbW9ycGhpYyBvYmplY3RzXG4gIHRoaXMuaGFzX3N0cmVlICAgID0gc3RhdGljX3RyZWUgJiYgc3RhdGljX3RyZWUubGVuZ3RoO1xufVxuXG5cbnZhciBzdGF0aWNfbF9kZXNjO1xudmFyIHN0YXRpY19kX2Rlc2M7XG52YXIgc3RhdGljX2JsX2Rlc2M7XG5cblxuZnVuY3Rpb24gVHJlZURlc2MoZHluX3RyZWUsIHN0YXRfZGVzYykge1xuICB0aGlzLmR5bl90cmVlID0gZHluX3RyZWU7ICAgICAvKiB0aGUgZHluYW1pYyB0cmVlICovXG4gIHRoaXMubWF4X2NvZGUgPSAwOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuICB0aGlzLnN0YXRfZGVzYyA9IHN0YXRfZGVzYzsgICAvKiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSAqL1xufVxuXG5cblxuZnVuY3Rpb24gZF9jb2RlKGRpc3QpIHtcbiAgcmV0dXJuIGRpc3QgPCAyNTYgPyBfZGlzdF9jb2RlW2Rpc3RdIDogX2Rpc3RfY29kZVsyNTYgKyAoZGlzdCA+Pj4gNyldO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogT3V0cHV0IGEgc2hvcnQgTFNCIGZpcnN0IG9uIHRoZSBzdHJlYW0uXG4gKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdCdWYuXG4gKi9cbmZ1bmN0aW9uIHB1dF9zaG9ydChzLCB3KSB7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodykgJiAweGZmKSk7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodXNoKSh3KSA+PiA4KSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKHcpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodyA+Pj4gOCkgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuXG4gKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy5cbiAqL1xuZnVuY3Rpb24gc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPiAoQnVmX3NpemUgLSBsZW5ndGgpKSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gICAgcy5iaV9idWYgPSB2YWx1ZSA+PiAoQnVmX3NpemUgLSBzLmJpX3ZhbGlkKTtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aCAtIEJ1Zl9zaXplO1xuICB9IGVsc2Uge1xuICAgIHMuYmlfYnVmIHw9ICh2YWx1ZSA8PCBzLmJpX3ZhbGlkKSAmIDB4ZmZmZjtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHNlbmRfY29kZShzLCBjLCB0cmVlKSB7XG4gIHNlbmRfYml0cyhzLCB0cmVlW2MgKiAyXS8qLkNvZGUqLywgdHJlZVtjICogMiArIDFdLyouTGVuKi8pO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXJcbiAqIG1ldGhvZCB3b3VsZCB1c2UgYSB0YWJsZSlcbiAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTVcbiAqL1xuZnVuY3Rpb24gYmlfcmV2ZXJzZShjb2RlLCBsZW4pIHtcbiAgdmFyIHJlcyA9IDA7XG4gIGRvIHtcbiAgICByZXMgfD0gY29kZSAmIDE7XG4gICAgY29kZSA+Pj49IDE7XG4gICAgcmVzIDw8PSAxO1xuICB9IHdoaWxlICgtLWxlbiA+IDApO1xuICByZXR1cm4gcmVzID4+PiAxO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIsIGtlZXBpbmcgYXQgbW9zdCA3IGJpdHMgaW4gaXQuXG4gKi9cbmZ1bmN0aW9uIGJpX2ZsdXNoKHMpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPT09IDE2KSB7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IDA7XG4gICAgcy5iaV92YWxpZCA9IDA7XG5cbiAgfSBlbHNlIGlmIChzLmJpX3ZhbGlkID49IDgpIHtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmICYgMHhmZjtcbiAgICBzLmJpX2J1ZiA+Pj0gODtcbiAgICBzLmJpX3ZhbGlkIC09IDg7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoXG4gKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZFxuICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGVcbiAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC5cbiAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXNcbiAqICAgICBub3QgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZ2VuX2JpdGxlbihzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgICAgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgICAgICAgID0gZGVzYy5keW5fdHJlZTtcbiAgdmFyIG1heF9jb2RlICAgICAgICA9IGRlc2MubWF4X2NvZGU7XG4gIHZhciBzdHJlZSAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGV4dHJhICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2JpdHM7XG4gIHZhciBiYXNlICAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iYXNlO1xuICB2YXIgbWF4X2xlbmd0aCAgICAgID0gZGVzYy5zdGF0X2Rlc2MubWF4X2xlbmd0aDtcbiAgdmFyIGg7ICAgICAgICAgICAgICAvKiBoZWFwIGluZGV4ICovXG4gIHZhciBuLCBtOyAgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqL1xuICB2YXIgeGJpdHM7ICAgICAgICAgIC8qIGV4dHJhIGJpdHMgKi9cbiAgdmFyIGY7ICAgICAgICAgICAgICAvKiBmcmVxdWVuY3kgKi9cbiAgdmFyIG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqL1xuXG4gIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIHMuYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgLyogSW4gYSBmaXJzdCBwYXNzLCBjb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzICh3aGljaCBtYXlcbiAgICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2YgdGhlIGJpdCBsZW5ndGggdHJlZSkuXG4gICAqL1xuICB0cmVlW3MuaGVhcFtzLmhlYXBfbWF4XSAqIDIgKyAxXS8qLkxlbiovID0gMDsgLyogcm9vdCBvZiB0aGUgaGVhcCAqL1xuXG4gIGZvciAoaCA9IHMuaGVhcF9tYXggKyAxOyBoIDwgSEVBUF9TSVpFOyBoKyspIHtcbiAgICBuID0gcy5oZWFwW2hdO1xuICAgIGJpdHMgPSB0cmVlW3RyZWVbbiAqIDIgKyAxXS8qLkRhZCovICogMiArIDFdLyouTGVuKi8gKyAxO1xuICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkge1xuICAgICAgYml0cyA9IG1heF9sZW5ndGg7XG4gICAgICBvdmVyZmxvdysrO1xuICAgIH1cbiAgICB0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgLyogV2Ugb3ZlcndyaXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi9cblxuICAgIGlmIChuID4gbWF4X2NvZGUpIHsgY29udGludWU7IH0gLyogbm90IGEgbGVhZiBub2RlICovXG5cbiAgICBzLmJsX2NvdW50W2JpdHNdKys7XG4gICAgeGJpdHMgPSAwO1xuICAgIGlmIChuID49IGJhc2UpIHtcbiAgICAgIHhiaXRzID0gZXh0cmFbbiAtIGJhc2VdO1xuICAgIH1cbiAgICBmID0gdHJlZVtuICogMl0vKi5GcmVxKi87XG4gICAgcy5vcHRfbGVuICs9IGYgKiAoYml0cyArIHhiaXRzKTtcbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gKz0gZiAqIChzdHJlZVtuICogMiArIDFdLyouTGVuKi8gKyB4Yml0cyk7XG4gICAgfVxuICB9XG4gIGlmIChvdmVyZmxvdyA9PT0gMCkgeyByZXR1cm47IH1cblxuICAvLyBUcmFjZSgoc3RkZXJyLFwiXFxuYml0IGxlbmd0aCBvdmVyZmxvd1xcblwiKSk7XG4gIC8qIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBvbiBvYmoyIGFuZCBwaWMgb2YgdGhlIENhbGdhcnkgY29ycHVzICovXG5cbiAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi9cbiAgZG8ge1xuICAgIGJpdHMgPSBtYXhfbGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAocy5ibF9jb3VudFtiaXRzXSA9PT0gMCkgeyBiaXRzLS07IH1cbiAgICBzLmJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovXG4gICAgcy5ibF9jb3VudFtiaXRzICsgMV0gKz0gMjsgLyogbW92ZSBvbmUgb3ZlcmZsb3cgaXRlbSBhcyBpdHMgYnJvdGhlciAqL1xuICAgIHMuYmxfY291bnRbbWF4X2xlbmd0aF0tLTtcbiAgICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVwIHVwLFxuICAgICAqIGJ1dCB0aGlzIGRvZXMgbm90IGFmZmVjdCBibF9jb3VudFttYXhfbGVuZ3RoXVxuICAgICAqL1xuICAgIG92ZXJmbG93IC09IDI7XG4gIH0gd2hpbGUgKG92ZXJmbG93ID4gMCk7XG5cbiAgLyogTm93IHJlY29tcHV0ZSBhbGwgYml0IGxlbmd0aHMsIHNjYW5uaW5nIGluIGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICAgKiBoIGlzIHN0aWxsIGVxdWFsIHRvIEhFQVBfU0laRS4gKEl0IGlzIHNpbXBsZXIgdG8gcmVjb25zdHJ1Y3QgYWxsXG4gICAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRha2VuXG4gICAqIGZyb20gJ2FyJyB3cml0dGVuIGJ5IEhhcnVoaWtvIE9rdW11cmEuKVxuICAgKi9cbiAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPT0gMDsgYml0cy0tKSB7XG4gICAgbiA9IHMuYmxfY291bnRbYml0c107XG4gICAgd2hpbGUgKG4gIT09IDApIHtcbiAgICAgIG0gPSBzLmhlYXBbLS1oXTtcbiAgICAgIGlmIChtID4gbWF4X2NvZGUpIHsgY29udGludWU7IH1cbiAgICAgIGlmICh0cmVlW20gKiAyICsgMV0vKi5MZW4qLyAhPT0gYml0cykge1xuICAgICAgICAvLyBUcmFjZSgoc3RkZXJyLFwiY29kZSAlZCBiaXRzICVkLT4lZFxcblwiLCBtLCB0cmVlW21dLkxlbiwgYml0cykpO1xuICAgICAgICBzLm9wdF9sZW4gKz0gKGJpdHMgLSB0cmVlW20gKiAyICsgMV0vKi5MZW4qLykgKiB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICAgICAgdHJlZVttICogMiArIDFdLyouTGVuKi8gPSBiaXRzO1xuICAgICAgfVxuICAgICAgbi0tO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogR2VuZXJhdGUgdGhlIGNvZGVzIGZvciBhIGdpdmVuIHRyZWUgYW5kIGJpdCBjb3VudHMgKHdoaWNoIG5lZWQgbm90IGJlXG4gKiBvcHRpbWFsKS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBiaXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yXG4gKiB0aGUgZ2l2ZW4gdHJlZSBhbmQgdGhlIGZpZWxkIGxlbiBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbjogdGhlIGZpZWxkIGNvZGUgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cyBvZiBub25cbiAqICAgICB6ZXJvIGNvZGUgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIGJsX2NvdW50KVxuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAgICAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuLy8gICAgdXNoZiAqYmxfY291bnQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCAqL1xue1xuICB2YXIgbmV4dF9jb2RlID0gbmV3IEFycmF5KE1BWF9CSVRTICsgMSk7IC8qIG5leHQgY29kZSB2YWx1ZSBmb3IgZWFjaCBiaXQgbGVuZ3RoICovXG4gIHZhciBjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY29kZSB2YWx1ZSAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi9cbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBpbmRleCAqL1xuXG4gIC8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlc1xuICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC5cbiAgICovXG4gIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSAoY29kZSArIGJsX2NvdW50W2JpdHMgLSAxXSkgPDwgMTtcbiAgfVxuICAvKiBDaGVjayB0aGF0IHRoZSBiaXQgY291bnRzIGluIGJsX2NvdW50IGFyZSBjb25zaXN0ZW50LiBUaGUgbGFzdCBjb2RlXG4gICAqIG11c3QgYmUgYWxsIG9uZXMuXG4gICAqL1xuICAvL0Fzc2VydCAoY29kZSArIGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSxcbiAgLy8gICAgICAgIFwiaW5jb25zaXN0ZW50IGJpdCBjb3VudHNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5nZW5fY29kZXM6IG1heF9jb2RlICVkIFwiLCBtYXhfY29kZSkpO1xuXG4gIGZvciAobiA9IDA7ICBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICB2YXIgbGVuID0gdHJlZVtuICogMiArIDFdLyouTGVuKi87XG4gICAgaWYgKGxlbiA9PT0gMCkgeyBjb250aW51ZTsgfVxuICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovXG4gICAgdHJlZVtuICogMl0vKi5Db2RlKi8gPSBiaV9yZXZlcnNlKG5leHRfY29kZVtsZW5dKyssIGxlbik7XG5cbiAgICAvL1RyYWNlY3YodHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsXCJcXG5uICUzZCAlYyBsICUyZCBjICU0eCAoJXgpIFwiLFxuICAgIC8vICAgICBuLCAoaXNncmFwaChuKSA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwgbmV4dF9jb2RlW2xlbl0tMSkpO1xuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzICdjb25zdGFudCcgdGFibGVzLlxuICovXG5mdW5jdGlvbiB0cl9zdGF0aWNfaW5pdCgpIHtcbiAgdmFyIG47ICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAvKiBiaXQgY291bnRlciAqL1xuICB2YXIgbGVuZ3RoOyAgIC8qIGxlbmd0aCB2YWx1ZSAqL1xuICB2YXIgY29kZTsgICAgIC8qIGNvZGUgdmFsdWUgKi9cbiAgdmFyIGRpc3Q7ICAgICAvKiBkaXN0YW5jZSBpbmRleCAqL1xuICB2YXIgYmxfY291bnQgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy8gZG8gY2hlY2sgaW4gX3RyX2luaXQoKVxuICAvL2lmIChzdGF0aWNfaW5pdF9kb25lKSByZXR1cm47XG5cbiAgLyogRm9yIHNvbWUgZW1iZWRkZWQgdGFyZ2V0cywgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm90IGluaXRpYWxpemVkOiAqL1xuLyojaWZkZWYgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlNcbiAgc3RhdGljX2xfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19sdHJlZTtcbiAgc3RhdGljX2xfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfbGJpdHM7XG4gIHN0YXRpY19kX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfZHRyZWU7XG4gIHN0YXRpY19kX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2RiaXRzO1xuICBzdGF0aWNfYmxfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfYmxiaXRzO1xuI2VuZGlmKi9cblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovXG4gIGxlbmd0aCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMgLSAxOyBjb2RlKyspIHtcbiAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfbGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9sZW5ndGhfY29kZVtsZW5ndGgrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAobGVuZ3RoID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogbGVuZ3RoICE9IDI1NlwiKTtcbiAgLyogTm90ZSB0aGF0IHRoZSBsZW5ndGggMjU1IChtYXRjaCBsZW5ndGggMjU4KSBjYW4gYmUgcmVwcmVzZW50ZWRcbiAgICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwgc28gd2VcbiAgICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOlxuICAgKi9cbiAgX2xlbmd0aF9jb2RlW2xlbmd0aCAtIDFdID0gY29kZTtcblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGRpc3QgKDAuLjMySykgLT4gZGlzdCBjb2RlICgwLi4yOSkgKi9cbiAgZGlzdCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCAxNjsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogZGlzdCAhPSAyNTZcIik7XG4gIGRpc3QgPj49IDc7IC8qIGZyb20gbm93IG9uLCBhbGwgZGlzdGFuY2VzIGFyZSBkaXZpZGVkIGJ5IDEyOCAqL1xuICBmb3IgKDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNztcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgKGV4dHJhX2RiaXRzW2NvZGVdIC0gNykpOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogMjU2K2Rpc3QgIT0gNTEyXCIpO1xuXG4gIC8qIENvbnN0cnVjdCB0aGUgY29kZXMgb2YgdGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUgKi9cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgbiA9IDA7XG4gIHdoaWxlIChuIDw9IDE0Mykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI1NSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA5O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs5XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI3OSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA3O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs3XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI4Nykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZVxuICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGVcbiAgICogYWxsIG9uZXMpXG4gICAqL1xuICBnZW5fY29kZXMoc3RhdGljX2x0cmVlLCBMX0NPREVTICsgMSwgYmxfY291bnQpO1xuXG4gIC8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDU7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobiwgNSk7XG4gIH1cblxuICAvLyBOb3cgZGF0YSByZWFkeSBhbmQgd2UgY2FuIGluaXQgc3RhdGljIHRyZWVzXG4gIHN0YXRpY19sX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMgKyAxLCBMX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19kX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgICAgICAgICAgRF9DT0RFUywgTUFYX0JJVFMpO1xuICBzdGF0aWNfYmxfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhuZXcgQXJyYXkoMCksIGV4dHJhX2JsYml0cywgMCwgICAgICAgICBCTF9DT0RFUywgTUFYX0JMX0JJVFMpO1xuXG4gIC8vc3RhdGljX2luaXRfZG9uZSA9IHRydWU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIGEgbmV3IGJsb2NrLlxuICovXG5mdW5jdGlvbiBpbml0X2Jsb2NrKHMpIHtcbiAgdmFyIG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIHRyZWVzLiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUzsgIG4rKykgeyBzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyAgbisrKSB7IHMuZHluX2R0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IEJMX0NPREVTOyBuKyspIHsgcy5ibF90cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cblxuICBzLmR5bl9sdHJlZVtFTkRfQkxPQ0sgKiAyXS8qLkZyZXEqLyA9IDE7XG4gIHMub3B0X2xlbiA9IHMuc3RhdGljX2xlbiA9IDA7XG4gIHMubGFzdF9saXQgPSBzLm1hdGNoZXMgPSAwO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5XG4gKi9cbmZ1bmN0aW9uIGJpX3dpbmR1cChzKVxue1xuICBpZiAocy5iaV92YWxpZCA+IDgpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPiAwKSB7XG4gICAgLy9wdXRfYnl0ZShzLCAoQnl0ZSlzLT5iaV9idWYpO1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWY7XG4gIH1cbiAgcy5iaV9idWYgPSAwO1xuICBzLmJpX3ZhbGlkID0gMDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0c1xuICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNvcHlfYmxvY2socywgYnVmLCBsZW4sIGhlYWRlcilcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAgICAqYnVmOyAgICAvKiB0aGUgaW5wdXQgZGF0YSAqL1xuLy91bnNpZ25lZCBsZW47ICAgICAvKiBpdHMgbGVuZ3RoICovXG4vL2ludCAgICAgIGhlYWRlcjsgIC8qIHRydWUgaWYgYmxvY2sgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiAqL1xue1xuICBiaV93aW5kdXAocyk7ICAgICAgICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovXG5cbiAgaWYgKGhlYWRlcikge1xuICAgIHB1dF9zaG9ydChzLCBsZW4pO1xuICAgIHB1dF9zaG9ydChzLCB+bGVuKTtcbiAgfVxuLy8gIHdoaWxlIChsZW4tLSkge1xuLy8gICAgcHV0X2J5dGUocywgKmJ1ZisrKTtcbi8vICB9XG4gIHV0aWxzLmFycmF5U2V0KHMucGVuZGluZ19idWYsIHMud2luZG93LCBidWYsIGxlbiwgcy5wZW5kaW5nKTtcbiAgcy5wZW5kaW5nICs9IGxlbjtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wYXJlcyB0byBzdWJ0cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlblxuICogdGhlIHN1YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIHtcbiAgdmFyIF9uMiA9IG4gKiAyO1xuICB2YXIgX20yID0gbSAqIDI7XG4gIHJldHVybiAodHJlZVtfbjJdLyouRnJlcSovIDwgdHJlZVtfbTJdLyouRnJlcSovIHx8XG4gICAgICAgICAodHJlZVtfbjJdLyouRnJlcSovID09PSB0cmVlW19tMl0vKi5GcmVxKi8gJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgayxcbiAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nXG4gKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzXG4gKiB0d28gc29ucykuXG4gKi9cbmZ1bmN0aW9uIHBxZG93bmhlYXAocywgdHJlZSwgaylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqL1xuLy8gICAgaW50IGs7ICAgICAgICAgICAgICAgLyogbm9kZSB0byBtb3ZlIGRvd24gKi9cbntcbiAgdmFyIHYgPSBzLmhlYXBba107XG4gIHZhciBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqL1xuICB3aGlsZSAoaiA8PSBzLmhlYXBfbGVuKSB7XG4gICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi9cbiAgICBpZiAoaiA8IHMuaGVhcF9sZW4gJiZcbiAgICAgIHNtYWxsZXIodHJlZSwgcy5oZWFwW2ogKyAxXSwgcy5oZWFwW2pdLCBzLmRlcHRoKSkge1xuICAgICAgaisrO1xuICAgIH1cbiAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqL1xuICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHsgYnJlYWs7IH1cblxuICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovXG4gICAgcy5oZWFwW2tdID0gcy5oZWFwW2pdO1xuICAgIGsgPSBqO1xuXG4gICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqL1xuICAgIGogPDw9IDE7XG4gIH1cbiAgcy5oZWFwW2tdID0gdjtcbn1cblxuXG4vLyBpbmxpbmVkIG1hbnVhbGx5XG4vLyB2YXIgU01BTExFU1QgPSAxO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGJsb2NrIGRhdGEgY29tcHJlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gSHVmZm1hbiB0cmVlc1xuICovXG5mdW5jdGlvbiBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY29uc3QgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqL1xuLy8gICAgY29uc3QgY3RfZGF0YSAqZHRyZWU7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbntcbiAgdmFyIGRpc3Q7ICAgICAgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuICB2YXIgbGM7ICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqL1xuICB2YXIgbHggPSAwOyAgICAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cbiAgdmFyIGNvZGU7ICAgICAgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovXG4gIHZhciBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqL1xuXG4gIGlmIChzLmxhc3RfbGl0ICE9PSAwKSB7XG4gICAgZG8ge1xuICAgICAgZGlzdCA9IChzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBseCAqIDJdIDw8IDgpIHwgKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMiArIDFdKTtcbiAgICAgIGxjID0gcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgbHhdO1xuICAgICAgbHgrKztcblxuICAgICAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJlZSk7IC8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgICAgLy9UcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLFwiICclYycgXCIsIGxjKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdO1xuICAgICAgICBzZW5kX2NvZGUocywgY29kZSArIExJVEVSQUxTICsgMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgbGMsIGV4dHJhKTsgICAgICAgLyogc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgICBkaXN0LS07IC8qIGRpc3QgaXMgbm93IHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAgICAgY29kZSA9IGRfY29kZShkaXN0KTtcbiAgICAgICAgLy9Bc3NlcnQgKGNvZGUgPCBEX0NPREVTLCBcImJhZCBkX2NvZGVcIik7XG5cbiAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUsIGR0cmVlKTsgICAgICAgLyogc2VuZCB0aGUgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBkaXN0IC09IGJhc2VfZGlzdFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgZGlzdCwgZXh0cmEpOyAgIC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqL1xuXG4gICAgICAvKiBDaGVjayB0aGF0IHRoZSBvdmVybGF5IGJldHdlZW4gcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmIGlzIG9rOiAqL1xuICAgICAgLy9Bc3NlcnQoKHVJbnQpKHMtPnBlbmRpbmcpIDwgcy0+bGl0X2J1ZnNpemUgKyAyKmx4LFxuICAgICAgLy8gICAgICAgXCJwZW5kaW5nQnVmIG92ZXJmbG93XCIpO1xuXG4gICAgfSB3aGlsZSAobHggPCBzLmxhc3RfbGl0KTtcbiAgfVxuXG4gIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLlxuICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhcbiAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpc1xuICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfdHJlZShzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgc3RyZWUgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGVsZW1zICAgID0gZGVzYy5zdGF0X2Rlc2MuZWxlbXM7XG4gIHZhciBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVhcCBlbGVtZW50cyAqL1xuICB2YXIgbWF4X2NvZGUgPSAtMTsgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHZhciBub2RlOyAgICAgICAgICAvKiBuZXcgbm9kZSBiZWluZyBjcmVhdGVkICovXG5cbiAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpblxuICAgKiBoZWFwW1NNQUxMRVNUXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS5cbiAgICogaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICovXG4gIHMuaGVhcF9sZW4gPSAwO1xuICBzLmhlYXBfbWF4ID0gSEVBUF9TSVpFO1xuXG4gIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7XG4gICAgaWYgKHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IG1heF9jb2RlID0gbjtcbiAgICAgIHMuZGVwdGhbbl0gPSAwO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gMDtcbiAgICB9XG4gIH1cblxuICAvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLFxuICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmVcbiAgICogcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3RcbiAgICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS5cbiAgICovXG4gIHdoaWxlIChzLmhlYXBfbGVuIDwgMikge1xuICAgIG5vZGUgPSBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7XG4gICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSAxO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAwO1xuICAgIHMub3B0X2xlbi0tO1xuXG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGUgKiAyICsgMV0vKi5MZW4qLztcbiAgICB9XG4gICAgLyogbm9kZSBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovXG4gIH1cbiAgZGVzYy5tYXhfY29kZSA9IG1heF9jb2RlO1xuXG4gIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVuLzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSxcbiAgICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6XG4gICAqL1xuICBmb3IgKG4gPSAocy5oZWFwX2xlbiA+PiAxLyppbnQgLzIqLyk7IG4gPj0gMTsgbi0tKSB7IHBxZG93bmhlYXAocywgdHJlZSwgbik7IH1cblxuICAvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvXG4gICAqIGZyZXF1ZW50IG5vZGVzLlxuICAgKi9cbiAgbm9kZSA9IGVsZW1zOyAgICAgICAgICAgICAgLyogbmV4dCBpbnRlcm5hbCBub2RlIG9mIHRoZSB0cmVlICovXG4gIGRvIHtcbiAgICAvL3BxcmVtb3ZlKHMsIHRyZWUsIG4pOyAgLyogbiA9IG5vZGUgb2YgbGVhc3QgZnJlcXVlbmN5ICovXG4gICAgLyoqKiBwcXJlbW92ZSAqKiovXG4gICAgbiA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTtcbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBzLmhlYXBbcy5oZWFwX2xlbi0tXTtcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuICAgIC8qKiovXG5cbiAgICBtID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dOyAvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqL1xuXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBuOyAvKiBrZWVwIHRoZSBub2RlcyBzb3J0ZWQgYnkgZnJlcXVlbmN5ICovXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBtO1xuXG4gICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUgZmF0aGVyIG9mIG4gYW5kIG0gKi9cbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IHRyZWVbbiAqIDJdLyouRnJlcSovICsgdHJlZVttICogMl0vKi5GcmVxKi87XG4gICAgcy5kZXB0aFtub2RlXSA9IChzLmRlcHRoW25dID49IHMuZGVwdGhbbV0gPyBzLmRlcHRoW25dIDogcy5kZXB0aFttXSkgKyAxO1xuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkRhZCovID0gdHJlZVttICogMiArIDFdLyouRGFkKi8gPSBub2RlO1xuXG4gICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi9cbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBub2RlKys7XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxLypTTUFMTEVTVCovKTtcblxuICB9IHdoaWxlIChzLmhlYXBfbGVuID49IDIpO1xuXG4gIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuXG4gIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3dcbiAgICogZ2VuZXJhdGUgdGhlIGJpdCBsZW5ndGhzLlxuICAgKi9cbiAgZ2VuX2JpdGxlbihzLCBkZXNjKTtcblxuICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovXG4gIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgcy5ibF9jb3VudCk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVzXG4gKiBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLlxuICovXG5mdW5jdGlvbiBzY2FuX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgIG1heF9jb3VudCA9IDEzODtcbiAgICBtaW5fY291bnQgPSAzO1xuICB9XG4gIHRyZWVbKG1heF9jb2RlICsgMSkgKiAyICsgMV0vKi5MZW4qLyA9IDB4ZmZmZjsgLyogZ3VhcmQgKi9cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBzLmJsX3RyZWVbY3VybGVuICogMl0vKi5GcmVxKi8gKz0gY291bnQ7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuXG4gICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7IHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLysrOyB9XG4gICAgICBzLmJsX3RyZWVbUkVQXzNfNiAqIDJdLyouRnJlcSovKys7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8zXzEwICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8xMV8xMzggKiAyXS8qLkZyZXEqLysrO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuXG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluXG4gKiBibF90cmVlLlxuICovXG5mdW5jdGlvbiBzZW5kX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi9cbntcbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovXG4gIHZhciBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi9cblxuICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXS8qLkxlbiovOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovXG5cbiAgdmFyIGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi9cbiAgdmFyIG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqL1xuICB2YXIgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBkbyB7IHNlbmRfY29kZShzLCBjdXJsZW4sIHMuYmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT09IDApO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHtcbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTtcbiAgICAgICAgY291bnQtLTtcbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KGNvdW50ID49IDMgJiYgY291bnQgPD0gNiwgXCIgM182P1wiKTtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMik7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8zXzEwLCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfMTFfMTM4LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMTEsIDcpO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuICAgIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIG1heF9jb3VudCA9IDY7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG1heF9jb3VudCA9IDc7XG4gICAgICBtaW5fY291bnQgPSA0O1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpblxuICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkX2JsX3RyZWUocykge1xuICB2YXIgbWF4X2JsaW5kZXg7ICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICBzY2FuX3RyZWUocywgcy5keW5fbHRyZWUsIHMubF9kZXNjLm1heF9jb2RlKTtcbiAgc2Nhbl90cmVlKHMsIHMuZHluX2R0cmVlLCBzLmRfZGVzYy5tYXhfY29kZSk7XG5cbiAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZTogKi9cbiAgYnVpbGRfdHJlZShzLCBzLmJsX2Rlc2MpO1xuICAvKiBvcHRfbGVuIG5vdyBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucywgZXhjZXB0XG4gICAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuXG4gICAqL1xuXG4gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdFxuICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5c1xuICAgKiAzIGJ1dCB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaXMgNC4pXG4gICAqL1xuICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMgLSAxOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7XG4gICAgaWYgKHMuYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF0gKiAyICsgMV0vKi5MZW4qLyAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8qIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5ndGggdHJlZSBhbmQgY291bnRzICovXG4gIHMub3B0X2xlbiArPSAzICogKG1heF9ibGluZGV4ICsgMSkgKyA1ICsgNSArIDQ7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVsZFwiLFxuICAvLyAgICAgICAgcy0+b3B0X2xlbiwgcy0+c3RhdGljX2xlbikpO1xuXG4gIHJldHVybiBtYXhfYmxpbmRleDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZVxuICogbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuXG4gKiBJTiBhc3NlcnRpb246IGxjb2RlcyA+PSAyNTcsIGRjb2RlcyA+PSAxLCBibGNvZGVzID49IDQuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfYWxsX3RyZWVzKHMsIGxjb2RlcywgZGNvZGVzLCBibGNvZGVzKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGludCBsY29kZXMsIGRjb2RlcywgYmxjb2RlczsgLyogbnVtYmVyIG9mIGNvZGVzIGZvciBlYWNoIHRyZWUgKi9cbntcbiAgdmFyIHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqL1xuXG4gIC8vQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgXCJub3QgZW5vdWdoIGNvZGVzXCIpO1xuICAvL0Fzc2VydCAobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUyxcbiAgLy8gICAgICAgIFwidG9vIG1hbnkgY29kZXNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgY291bnRzOiBcIikpO1xuICBzZW5kX2JpdHMocywgbGNvZGVzIC0gMjU3LCA1KTsgLyogbm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIHNlbmRfYml0cyhzLCBkY29kZXMgLSAxLCAgIDUpO1xuICBzZW5kX2JpdHMocywgYmxjb2RlcyAtIDQsICA0KTsgLyogbm90IC0zIGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqL1xuICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7XG4gICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb2RlICUyZCBcIiwgYmxfb3JkZXJbcmFua10pKTtcbiAgICBzZW5kX2JpdHMocywgcy5ibF90cmVlW2JsX29yZGVyW3JhbmtdICogMiArIDFdLyouTGVuKi8sIDMpO1xuICB9XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2x0cmVlLCBsY29kZXMgLSAxKTsgLyogbGl0ZXJhbCB0cmVlICovXG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xuXG4gIHNlbmRfdHJlZShzLCBzLmR5bl9kdHJlZSwgZGNvZGVzIC0gMSk7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ2hlY2sgaWYgdGhlIGRhdGEgdHlwZSBpcyBURVhUIG9yIEJJTkFSWSwgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06XG4gKiAtIFRFWFQgaWYgdGhlIHR3byBjb25kaXRpb25zIGJlbG93IGFyZSBzYXRpc2ZpZWQ6XG4gKiAgICBhKSBUaGVyZSBhcmUgbm8gbm9uLXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcImJsYWNrIGxpc3RcIiAoMC4uNiwgMTQuLjI1LCAyOC4uMzEpLlxuICogICAgYikgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHByaW50YWJsZSBjaGFyYWN0ZXIgYmVsb25naW5nIHRvIHRoZVxuICogICAgICAgXCJ3aGl0ZSBsaXN0XCIgKDkge1RBQn0sIDEwIHtMRn0sIDEzIHtDUn0sIDMyLi4yNTUpLlxuICogLSBCSU5BUlkgb3RoZXJ3aXNlLlxuICogLSBUaGUgZm9sbG93aW5nIHBhcnRpYWxseS1wb3J0YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgZm9ybSBhXG4gKiAgIFwiZ3JheSBsaXN0XCIgdGhhdCBpcyBpZ25vcmVkIGluIHRoaXMgZGV0ZWN0aW9uIGFsZ29yaXRobTpcbiAqICAgKDcge0JFTH0sIDgge0JTfSwgMTEge1ZUfSwgMTIge0ZGfSwgMjYge1NVQn0sIDI3IHtFU0N9KS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBGcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0LlxuICovXG5mdW5jdGlvbiBkZXRlY3RfZGF0YV90eXBlKHMpIHtcbiAgLyogYmxhY2tfbWFzayBpcyB0aGUgYml0IG1hc2sgb2YgYmxhY2stbGlzdGVkIGJ5dGVzXG4gICAqIHNldCBiaXRzIDAuLjYsIDE0Li4yNSwgYW5kIDI4Li4zMVxuICAgKiAweGYzZmZjMDdmID0gYmluYXJ5IDExMTEwMDExMTExMTExMTExMTAwMDAwMDAxMTExMTExXG4gICAqL1xuICB2YXIgYmxhY2tfbWFzayA9IDB4ZjNmZmMwN2Y7XG4gIHZhciBuO1xuXG4gIC8qIENoZWNrIGZvciBub24tdGV4dHVhbCAoXCJibGFjay1saXN0ZWRcIikgYnl0ZXMuICovXG4gIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj49IDEpIHtcbiAgICBpZiAoKGJsYWNrX21hc2sgJiAxKSAmJiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSkge1xuICAgICAgcmV0dXJuIFpfQklOQVJZO1xuICAgIH1cbiAgfVxuXG4gIC8qIENoZWNrIGZvciB0ZXh0dWFsIChcIndoaXRlLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgaWYgKHMuZHluX2x0cmVlWzkgKiAyXS8qLkZyZXEqLyAhPT0gMCB8fCBzLmR5bl9sdHJlZVsxMCAqIDJdLyouRnJlcSovICE9PSAwIHx8XG4gICAgICBzLmR5bl9sdHJlZVsxMyAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgcmV0dXJuIFpfVEVYVDtcbiAgfVxuICBmb3IgKG4gPSAzMjsgbiA8IExJVEVSQUxTOyBuKyspIHtcbiAgICBpZiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICByZXR1cm4gWl9URVhUO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZXJlIGFyZSBubyBcImJsYWNrLWxpc3RlZFwiIG9yIFwid2hpdGUtbGlzdGVkXCIgYnl0ZXM6XG4gICAqIHRoaXMgc3RyZWFtIGVpdGhlciBpcyBlbXB0eSBvciBoYXMgdG9sZXJhdGVkIChcImdyYXktbGlzdGVkXCIpIGJ5dGVzIG9ubHkuXG4gICAqL1xuICByZXR1cm4gWl9CSU5BUlk7XG59XG5cblxudmFyIHN0YXRpY19pbml0X2RvbmUgPSBmYWxzZTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIF90cl9pbml0KHMpXG57XG5cbiAgaWYgKCFzdGF0aWNfaW5pdF9kb25lKSB7XG4gICAgdHJfc3RhdGljX2luaXQoKTtcbiAgICBzdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbiAgfVxuXG4gIHMubF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9sdHJlZSwgc3RhdGljX2xfZGVzYyk7XG4gIHMuZF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSwgc3RhdGljX2RfZGVzYyk7XG4gIHMuYmxfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmJsX3RyZWUsIHN0YXRpY19ibF9kZXNjKTtcblxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqL1xuICBpbml0X2Jsb2NrKHMpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHN0b3JlZCBibG9ja1xuICovXG5mdW5jdGlvbiBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jayAqL1xuLy91bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi9cbi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqL1xue1xuICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTsgICAgLyogc2VuZCBibG9jayB0eXBlICovXG4gIGNvcHlfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCB0cnVlKTsgLyogd2l0aCBoZWFkZXIgKi9cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuXG4gKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gX3RyX2FsaWduKHMpIHtcbiAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUyA8PCAxLCAzKTtcbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTtcbiAgYmlfZmx1c2gocyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWNcbiAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS5cbiAqL1xuZnVuY3Rpb24gX3RyX2ZsdXNoX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHZhciBvcHRfbGVuYiwgc3RhdGljX2xlbmI7ICAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovXG4gIHZhciBtYXhfYmxpbmRleCA9IDA7ICAgICAgICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgdW5sZXNzIGEgc3RvcmVkIGJsb2NrIGlzIGZvcmNlZCAqL1xuICBpZiAocy5sZXZlbCA+IDApIHtcblxuICAgIC8qIENoZWNrIGlmIHRoZSBmaWxlIGlzIGJpbmFyeSBvciB0ZXh0ICovXG4gICAgaWYgKHMuc3RybS5kYXRhX3R5cGUgPT09IFpfVU5LTk9XTikge1xuICAgICAgcy5zdHJtLmRhdGFfdHlwZSA9IGRldGVjdF9kYXRhX3R5cGUocyk7XG4gICAgfVxuXG4gICAgLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICAgIGJ1aWxkX3RyZWUocywgcy5sX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgICBidWlsZF90cmVlKHMsIHMuZF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcbiAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2ZcbiAgICAgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLlxuICAgICAqL1xuXG4gICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXhcbiAgICAgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7XG5cbiAgICAvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgdGhlIGJsb2NrIGxlbmd0aHMgaW4gYnl0ZXMuICovXG4gICAgb3B0X2xlbmIgPSAocy5vcHRfbGVuICsgMyArIDcpID4+PiAzO1xuICAgIHN0YXRpY19sZW5iID0gKHMuc3RhdGljX2xlbiArIDMgKyA3KSA+Pj4gMztcblxuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbm9wdCAlbHUoJWx1KSBzdGF0ICVsdSglbHUpIHN0b3JlZCAlbHUgbGl0ICV1IFwiLFxuICAgIC8vICAgICAgICBvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sXG4gICAgLy8gICAgICAgIHMtPmxhc3RfbGl0KSk7XG5cbiAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIHsgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYjsgfVxuXG4gIH0gZWxzZSB7XG4gICAgLy8gQXNzZXJ0KGJ1ZiAhPSAoY2hhciopMCwgXCJsb3N0IGJ1ZlwiKTtcbiAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7IC8qIGZvcmNlIGEgc3RvcmVkIGJsb2NrICovXG4gIH1cblxuICBpZiAoKHN0b3JlZF9sZW4gKyA0IDw9IG9wdF9sZW5iKSAmJiAoYnVmICE9PSAtMSkpIHtcbiAgICAvKiA0OiB0d28gd29yZHMgZm9yIHRoZSBsZW5ndGhzICovXG5cbiAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLlxuICAgICAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2VcbiAgICAgKiB0aGUgbGFzdCBibG9jayBmbHVzaCwgYmVjYXVzZSBjb21wcmVzc2lvbiB3b3VsZCBoYXZlIGJlZW5cbiAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG9cbiAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLlxuICAgICAqL1xuICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTtcblxuICB9IGVsc2UgaWYgKHMuc3RyYXRlZ3kgPT09IFpfRklYRUQgfHwgc3RhdGljX2xlbmIgPT09IG9wdF9sZW5iKSB7XG5cbiAgICBzZW5kX2JpdHMocywgKFNUQVRJQ19UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzdGF0aWNfbHRyZWUsIHN0YXRpY19kdHJlZSk7XG5cbiAgfSBlbHNlIHtcbiAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBzZW5kX2FsbF90cmVlcyhzLCBzLmxfZGVzYy5tYXhfY29kZSArIDEsIHMuZF9kZXNjLm1heF9jb2RlICsgMSwgbWF4X2JsaW5kZXggKyAxKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzLmR5bl9sdHJlZSwgcy5keW5fZHRyZWUpO1xuICB9XG4gIC8vIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCBcImJhZCBjb21wcmVzc2VkIHNpemVcIik7XG4gIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CXG4gICAqIGFuZCB1TG9uZyBpbXBsZW1lbnRlZCBvbiAzMiBiaXRzLlxuICAgKi9cbiAgaW5pdF9ibG9jayhzKTtcblxuICBpZiAobGFzdCkge1xuICAgIGJpX3dpbmR1cChzKTtcbiAgfVxuICAvLyBUcmFjZXYoKHN0ZGVycixcIlxcbmNvbXBybGVuICVsdSglbHUpIFwiLCBzLT5jb21wcmVzc2VkX2xlbj4+MyxcbiAgLy8gICAgICAgcy0+Y29tcHJlc3NlZF9sZW4tNypsYXN0KSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2F2ZSB0aGUgbWF0Y2ggaW5mbyBhbmQgdGFsbHkgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFJldHVybiB0cnVlIGlmXG4gKiB0aGUgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQuXG4gKi9cbmZ1bmN0aW9uIF90cl90YWxseShzLCBkaXN0LCBsYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB1bnNpZ25lZCBkaXN0OyAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi9cbi8vICAgIHVuc2lnbmVkIGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqL1xue1xuICAvL3ZhciBvdXRfbGVuZ3RoLCBpbl9sZW5ndGgsIGRjb2RlO1xuXG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyXSAgICAgPSAoZGlzdCA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBzLmxhc3RfbGl0ICogMiArIDFdID0gZGlzdCAmIDB4ZmY7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgcy5sYXN0X2xpdF0gPSBsYyAmIDB4ZmY7XG4gIHMubGFzdF9saXQrKztcblxuICBpZiAoZGlzdCA9PT0gMCkge1xuICAgIC8qIGxjIGlzIHRoZSB1bm1hdGNoZWQgY2hhciAqL1xuICAgIHMuZHluX2x0cmVlW2xjICogMl0vKi5GcmVxKi8rKztcbiAgfSBlbHNlIHtcbiAgICBzLm1hdGNoZXMrKztcbiAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgZGlzdC0tOyAgICAgICAgICAgICAvKiBkaXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovXG4gICAgLy9Bc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJlxuICAgIC8vICAgICAgICh1c2gpbGMgPD0gKHVzaCkoTUFYX01BVENILU1JTl9NQVRDSCkgJiZcbiAgICAvLyAgICAgICAodXNoKWRfY29kZShkaXN0KSA8ICh1c2gpRF9DT0RFUywgIFwiX3RyX3RhbGx5OiBiYWQgbWF0Y2hcIik7XG5cbiAgICBzLmR5bl9sdHJlZVsoX2xlbmd0aF9jb2RlW2xjXSArIExJVEVSQUxTICsgMSkgKiAyXS8qLkZyZXEqLysrO1xuICAgIHMuZHluX2R0cmVlW2RfY29kZShkaXN0KSAqIDJdLyouRnJlcSovKys7XG4gIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhdWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcblxuLy8jaWZkZWYgVFJVTkNBVEVfQkxPQ0tcbi8vICAvKiBUcnkgdG8gZ3Vlc3MgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBzdG9wIHRoZSBjdXJyZW50IGJsb2NrIGhlcmUgKi9cbi8vICBpZiAoKHMubGFzdF9saXQgJiAweDFmZmYpID09PSAwICYmIHMubGV2ZWwgPiAyKSB7XG4vLyAgICAvKiBDb21wdXRlIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgY29tcHJlc3NlZCBsZW5ndGggKi9cbi8vICAgIG91dF9sZW5ndGggPSBzLmxhc3RfbGl0Kjg7XG4vLyAgICBpbl9sZW5ndGggPSBzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydDtcbi8vXG4vLyAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7XG4vLyAgICAgIG91dF9sZW5ndGggKz0gcy5keW5fZHRyZWVbZGNvZGUqMl0vKi5GcmVxKi8gKiAoNSArIGV4dHJhX2RiaXRzW2Rjb2RlXSk7XG4vLyAgICB9XG4vLyAgICBvdXRfbGVuZ3RoID4+Pj0gMztcbi8vICAgIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgXCIsXG4vLyAgICAvLyAgICAgICBzLT5sYXN0X2xpdCwgaW5fbGVuZ3RoLCBvdXRfbGVuZ3RoLFxuLy8gICAgLy8gICAgICAgMTAwTCAtIG91dF9sZW5ndGgqMTAwTC9pbl9sZW5ndGgpKTtcbi8vICAgIGlmIChzLm1hdGNoZXMgPCAocy5sYXN0X2xpdD4+MSkvKmludCAvMiovICYmIG91dF9sZW5ndGggPCAoaW5fbGVuZ3RoPj4xKS8qaW50IC8yKi8pIHtcbi8vICAgICAgcmV0dXJuIHRydWU7XG4vLyAgICB9XG4vLyAgfVxuLy8jZW5kaWZcblxuICByZXR1cm4gKHMubGFzdF9saXQgPT09IHMubGl0X2J1ZnNpemUgLSAxKTtcbiAgLyogV2UgYXZvaWQgZXF1YWxpdHkgd2l0aCBsaXRfYnVmc2l6ZSBiZWNhdXNlIG9mIHdyYXBhcm91bmQgYXQgNjRLXG4gICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvXG4gICAqIDY0Sy0xIGJ5dGVzLlxuICAgKi9cbn1cblxuZXhwb3J0cy5fdHJfaW5pdCAgPSBfdHJfaW5pdDtcbmV4cG9ydHMuX3RyX3N0b3JlZF9ibG9jayA9IF90cl9zdG9yZWRfYmxvY2s7XG5leHBvcnRzLl90cl9mbHVzaF9ibG9jayAgPSBfdHJfZmx1c2hfYmxvY2s7XG5leHBvcnRzLl90cl90YWxseSA9IF90cl90YWxseTtcbmV4cG9ydHMuX3RyX2FsaWduID0gX3RyX2FsaWduO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAyOiAgICAgICduZWVkIGRpY3Rpb25hcnknLCAgICAgLyogWl9ORUVEX0RJQ1QgICAgICAgMiAgKi9cbiAgMTogICAgICAnc3RyZWFtIGVuZCcsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovXG4gIDA6ICAgICAgJycsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqL1xuICAnLTEnOiAgICdmaWxlIGVycm9yJywgICAgICAgICAgLyogWl9FUlJOTyAgICAgICAgICgtMSkgKi9cbiAgJy0yJzogICAnc3RyZWFtIGVycm9yJywgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovXG4gICctMyc6ICAgJ2RhdGEgZXJyb3InLCAgICAgICAgICAvKiBaX0RBVEFfRVJST1IgICAgKC0zKSAqL1xuICAnLTQnOiAgICdpbnN1ZmZpY2llbnQgbWVtb3J5JywgLyogWl9NRU1fRVJST1IgICAgICgtNCkgKi9cbiAgJy01JzogICAnYnVmZmVyIGVycm9yJywgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICAoLTUpICovXG4gICctNic6ICAgJ2luY29tcGF0aWJsZSB2ZXJzaW9uJyAvKiBaX1ZFUlNJT05fRVJST1IgKC02KSAqL1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG52YXIgdXRpbHMgICAgICAgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIGFkbGVyMzIgICAgICAgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgICAgICAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIGluZmxhdGVfZmFzdCAgPSByZXF1aXJlKCcuL2luZmZhc3QnKTtcbnZhciBpbmZsYXRlX3RhYmxlID0gcmVxdWlyZSgnLi9pbmZ0cmVlcycpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuLy92YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbi8vdmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuLy92YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG52YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG52YXIgWl9ORUVEX0RJQ1QgICAgID0gMjtcbi8vdmFyIFpfRVJSTk8gICAgICAgICA9IC0xO1xudmFyIFpfU1RSRUFNX0VSUk9SICA9IC0yO1xudmFyIFpfREFUQV9FUlJPUiAgICA9IC0zO1xudmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuXG4vKiBTVEFURVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgICAgSEVBRCA9IDE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqL1xudmFyICAgIEZMQUdTID0gMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtZXRob2QgYW5kIGZsYWdzIChnemlwKSAqL1xudmFyICAgIFRJTUUgPSAzOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtb2RpZmljYXRpb24gdGltZSAoZ3ppcCkgKi9cbnZhciAgICBPUyA9IDQ7ICAgICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovXG52YXIgICAgRVhMRU4gPSA1OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBFWFRSQSA9IDY7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgYnl0ZXMgKGd6aXApICovXG52YXIgICAgTkFNRSA9IDc7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBmaWxlIG5hbWUgKGd6aXApICovXG52YXIgICAgQ09NTUVOVCA9IDg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBjb21tZW50IChnemlwKSAqL1xudmFyICAgIEhDUkMgPSA5OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBoZWFkZXIgY3JjIChnemlwKSAqL1xudmFyICAgIERJQ1RJRCA9IDEwOyAgICAvKiBpOiB3YWl0aW5nIGZvciBkaWN0aW9uYXJ5IGNoZWNrIHZhbHVlICovXG52YXIgICAgRElDVCA9IDExOyAgICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCAqL1xudmFyICAgICAgICBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xudmFyICAgICAgICBUWVBFRE8gPSAxMzsgICAgLyogaTogc2FtZSwgYnV0IHNraXAgY2hlY2sgdG8gZXhpdCBpbmZsYXRlIG9uIG5ldyBibG9jayAqL1xudmFyICAgICAgICBTVE9SRUQgPSAxNDsgICAgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi9cbnZhciAgICAgICAgQ09QWV8gPSAxNTsgICAgIC8qIGkvbzogc2FtZSBhcyBDT1BZIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgIENPUFkgPSAxNjsgICAgICAvKiBpL286IHdhaXRpbmcgZm9yIGlucHV0IG9yIG91dHB1dCB0byBjb3B5IHN0b3JlZCBibG9jayAqL1xudmFyICAgICAgICBUQUJMRSA9IDE3OyAgICAgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovXG52YXIgICAgICAgIExFTkxFTlMgPSAxODsgICAvKiBpOiB3YWl0aW5nIGZvciBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgQ09ERUxFTlMgPSAxOTsgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqL1xudmFyICAgICAgICAgICAgTEVOXyA9IDIwOyAgICAgIC8qIGk6IHNhbWUgYXMgTEVOIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgICAgICBMRU4gPSAyMTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdC9lb2IgY29kZSAqL1xudmFyICAgICAgICAgICAgTEVORVhUID0gMjI7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aCBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBESVNUID0gMjM7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgY29kZSAqL1xudmFyICAgICAgICAgICAgRElTVEVYVCA9IDI0OyAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi9cbnZhciAgICAgICAgICAgIE1BVENIID0gMjU7ICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gY29weSBzdHJpbmcgKi9cbnZhciAgICAgICAgICAgIExJVCA9IDI2OyAgICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgbGl0ZXJhbCAqL1xudmFyICAgIENIRUNLID0gMjc7ICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi9cbnZhciAgICBMRU5HVEggPSAyODsgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBET05FID0gMjk7ICAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIE1FTSA9IDMxOyAgICAgICAvKiBnb3QgYW4gaW5mbGF0ZSgpIG1lbW9yeSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIFNZTkMgPSAzMjsgICAgICAvKiBsb29raW5nIGZvciBzeW5jaHJvbml6YXRpb24gYnl0ZXMgdG8gcmVzdGFydCBpbmZsYXRlKCkgKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5cbnZhciBFTk9VR0hfTEVOUyA9IDg1MjtcbnZhciBFTk9VR0hfRElTVFMgPSA1OTI7XG4vL3ZhciBFTk9VR0ggPSAgKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9XQklUUyA9IE1BWF9XQklUUztcblxuXG5mdW5jdGlvbiB6c3dhcDMyKHEpIHtcbiAgcmV0dXJuICAoKChxID4+PiAyNCkgJiAweGZmKSArXG4gICAgICAgICAgKChxID4+PiA4KSAmIDB4ZmYwMCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYwMCkgPDwgOCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYpIDw8IDI0KSk7XG59XG5cblxuZnVuY3Rpb24gSW5mbGF0ZVN0YXRlKCkge1xuICB0aGlzLm1vZGUgPSAwOyAgICAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqL1xuICB0aGlzLmxhc3QgPSBmYWxzZTsgICAgICAgICAgLyogdHJ1ZSBpZiBwcm9jZXNzaW5nIGxhc3QgYmxvY2sgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5oYXZlZGljdCA9IGZhbHNlOyAgICAgIC8qIHRydWUgaWYgZGljdGlvbmFyeSBwcm92aWRlZCAqL1xuICB0aGlzLmZsYWdzID0gMDsgICAgICAgICAgICAgLyogZ3ppcCBoZWFkZXIgbWV0aG9kIGFuZCBmbGFncyAoMCBpZiB6bGliKSAqL1xuICB0aGlzLmRtYXggPSAwOyAgICAgICAgICAgICAgLyogemxpYiBoZWFkZXIgbWF4IGRpc3RhbmNlIChJTkZMQVRFX1NUUklDVCkgKi9cbiAgdGhpcy5jaGVjayA9IDA7ICAgICAgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovXG4gIHRoaXMudG90YWwgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBvdXRwdXQgY291bnQgKi9cbiAgLy8gVE9ETzogbWF5IGJlIHt9XG4gIHRoaXMuaGVhZCA9IG51bGw7ICAgICAgICAgICAvKiB3aGVyZSB0byBzYXZlIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uICovXG5cbiAgLyogc2xpZGluZyB3aW5kb3cgKi9cbiAgdGhpcy53Yml0cyA9IDA7ICAgICAgICAgICAgIC8qIGxvZyBiYXNlIDIgb2YgcmVxdWVzdGVkIHdpbmRvdyBzaXplICovXG4gIHRoaXMud3NpemUgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdGhpcy53aGF2ZSA9IDA7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdGhpcy53bmV4dCA9IDA7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICB0aGlzLndpbmRvdyA9IG51bGw7ICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi9cblxuICAvKiBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5ob2xkID0gMDsgICAgICAgICAgICAgIC8qIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqL1xuICB0aGlzLmJpdHMgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gXCJpblwiICovXG5cbiAgLyogZm9yIHN0cmluZyBhbmQgc3RvcmVkIGJsb2NrIGNvcHlpbmcgKi9cbiAgdGhpcy5sZW5ndGggPSAwOyAgICAgICAgICAgIC8qIGxpdGVyYWwgb3IgbGVuZ3RoIG9mIGRhdGEgdG8gY29weSAqL1xuICB0aGlzLm9mZnNldCA9IDA7ICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IHN0cmluZyBmcm9tICovXG5cbiAgLyogZm9yIHRhYmxlIGFuZCBjb2RlIGRlY29kaW5nICovXG4gIHRoaXMuZXh0cmEgPSAwOyAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG5lZWRlZCAqL1xuXG4gIC8qIGZpeGVkIGFuZCBkeW5hbWljIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuY29kZSA9IG51bGw7ICAgICAgICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAqL1xuICB0aGlzLmRpc3Rjb2RlID0gbnVsbDsgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi9cbiAgdGhpcy5sZW5iaXRzID0gMDsgICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGxlbmNvZGUgKi9cbiAgdGhpcy5kaXN0Yml0cyA9IDA7ICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGRpc3Rjb2RlICovXG5cbiAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqL1xuICB0aGlzLm5jb2RlID0gMDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLm5sZW4gPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5uZGlzdCA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5oYXZlID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgaW4gbGVuc1tdICovXG4gIHRoaXMubmV4dCA9IG51bGw7ICAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiBjb2Rlc1tdICovXG5cbiAgdGhpcy5sZW5zID0gbmV3IHV0aWxzLkJ1ZjE2KDMyMCk7IC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy53b3JrID0gbmV3IHV0aWxzLkJ1ZjE2KDI4OCk7IC8qIHdvcmsgYXJlYSBmb3IgY29kZSB0YWJsZSBidWlsZGluZyAqL1xuXG4gIC8qXG4gICBiZWNhdXNlIHdlIGRvbid0IGhhdmUgcG9pbnRlcnMgaW4ganMsIHdlIHVzZSBsZW5jb2RlIGFuZCBkaXN0Y29kZSBkaXJlY3RseVxuICAgYXMgYnVmZmVycyBzbyB3ZSBkb24ndCBuZWVkIGNvZGVzXG4gICovXG4gIC8vdGhpcy5jb2RlcyA9IG5ldyB1dGlscy5CdWYzMihFTk9VR0gpOyAgICAgICAvKiBzcGFjZSBmb3IgY29kZSB0YWJsZXMgKi9cbiAgdGhpcy5sZW5keW4gPSBudWxsOyAgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLmRpc3RkeW4gPSBudWxsOyAgICAgICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAoSlMgc3BlY2lmaWMpICovXG4gIHRoaXMuc2FuZSA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGlmIGZhbHNlLCBhbGxvdyBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgKi9cbiAgdGhpcy5iYWNrID0gMDsgICAgICAgICAgICAgICAgICAgLyogYml0cyBiYWNrIG9mIGxhc3QgdW5wcm9jZXNzZWQgbGVuZ3RoL2xpdCAqL1xuICB0aGlzLndhcyA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsIGxlbmd0aCBvZiBtYXRjaCAqL1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSBzdGF0ZS50b3RhbCA9IDA7XG4gIHN0cm0ubXNnID0gJyc7IC8qWl9OVUxMKi9cbiAgaWYgKHN0YXRlLndyYXApIHsgICAgICAgLyogdG8gc3VwcG9ydCBpbGwtY29uY2VpdmVkIEphdmEgdGVzdCBzdWl0ZSAqL1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS53cmFwICYgMTtcbiAgfVxuICBzdGF0ZS5tb2RlID0gSEVBRDtcbiAgc3RhdGUubGFzdCA9IDA7XG4gIHN0YXRlLmhhdmVkaWN0ID0gMDtcbiAgc3RhdGUuZG1heCA9IDMyNzY4O1xuICBzdGF0ZS5oZWFkID0gbnVsbC8qWl9OVUxMKi87XG4gIHN0YXRlLmhvbGQgPSAwO1xuICBzdGF0ZS5iaXRzID0gMDtcbiAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0xFTlMpO1xuICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0RJU1RTKTtcblxuICBzdGF0ZS5zYW5lID0gMTtcbiAgc3RhdGUuYmFjayA9IC0xO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IHJlc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RhdGUud3NpemUgPSAwO1xuICBzdGF0ZS53aGF2ZSA9IDA7XG4gIHN0YXRlLnduZXh0ID0gMDtcbiAgcmV0dXJuIGluZmxhdGVSZXNldEtlZXAoc3RybSk7XG5cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKSB7XG4gIHZhciB3cmFwO1xuICB2YXIgc3RhdGU7XG5cbiAgLyogZ2V0IHRoZSBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBleHRyYWN0IHdyYXAgcmVxdWVzdCBmcm9tIHdpbmRvd0JpdHMgcGFyYW1ldGVyICovXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkge1xuICAgIHdyYXAgPSAwO1xuICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0cztcbiAgfVxuICBlbHNlIHtcbiAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxO1xuICAgIGlmICh3aW5kb3dCaXRzIDwgNDgpIHtcbiAgICAgIHdpbmRvd0JpdHMgJj0gMTU7XG4gICAgfVxuICB9XG5cbiAgLyogc2V0IG51bWJlciBvZiB3aW5kb3cgYml0cywgZnJlZSB3aW5kb3cgaWYgZGlmZmVyZW50ICovXG4gIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIGlmIChzdGF0ZS53aW5kb3cgIT09IG51bGwgJiYgc3RhdGUud2JpdHMgIT09IHdpbmRvd0JpdHMpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXNldCB0aGUgcmVzdCBvZiBpdCAqL1xuICBzdGF0ZS53cmFwID0gd3JhcDtcbiAgc3RhdGUud2JpdHMgPSB3aW5kb3dCaXRzO1xuICByZXR1cm4gaW5mbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgcmV0O1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICAvL3N0cm0ubXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi9cblxuICBzdGF0ZSA9IG5ldyBJbmZsYXRlU3RhdGUoKTtcblxuICAvL2lmIChzdGF0ZSA9PT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogYWxsb2NhdGVkXFxuXCIpKTtcbiAgc3RybS5zdGF0ZSA9IHN0YXRlO1xuICBzdGF0ZS53aW5kb3cgPSBudWxsLypaX05VTEwqLztcbiAgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTtcbiAgaWYgKHJldCAhPT0gWl9PSykge1xuICAgIHN0cm0uc3RhdGUgPSBudWxsLypaX05VTEwqLztcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdChzdHJtKSB7XG4gIHJldHVybiBpbmZsYXRlSW5pdDIoc3RybSwgREVGX1dCSVRTKTtcbn1cblxuXG4vKlxuIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG9cbiBmaXhlZCBjb2RlIGRlY29kaW5nLiAgTm9ybWFsbHkgdGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguXG4gSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZVxuIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmRcbiB0aGVyZWFmdGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb2RlIGJ5IGFib3V0IDJLIGJ5dGVzLCBpblxuIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZVxuIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW5cbiBtYXkgbm90IGJlIHRocmVhZC1zYWZlLlxuICovXG52YXIgdmlyZ2luID0gdHJ1ZTtcblxudmFyIGxlbmZpeCwgZGlzdGZpeDsgLy8gV2UgaGF2ZSBubyBwb2ludGVycyBpbiBKUywgc28ga2VlcCB0YWJsZXMgc2VwYXJhdGVcblxuZnVuY3Rpb24gZml4ZWR0YWJsZXMoc3RhdGUpIHtcbiAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi9cbiAgaWYgKHZpcmdpbikge1xuICAgIHZhciBzeW07XG5cbiAgICBsZW5maXggPSBuZXcgdXRpbHMuQnVmMzIoNTEyKTtcbiAgICBkaXN0Zml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDMyKTtcblxuICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMTQ0KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuICAgIHdoaWxlIChzeW0gPCAyNTYpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA5OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4MCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDc7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjg4KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuXG4gICAgaW5mbGF0ZV90YWJsZShMRU5TLCAgc3RhdGUubGVucywgMCwgMjg4LCBsZW5maXgsICAgMCwgc3RhdGUud29yaywgeyBiaXRzOiA5IH0pO1xuXG4gICAgLyogZGlzdGFuY2UgdGFibGUgKi9cbiAgICBzeW0gPSAwO1xuICAgIHdoaWxlIChzeW0gPCAzMikgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDU7IH1cblxuICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIDAsIDMyLCAgIGRpc3RmaXgsIDAsIHN0YXRlLndvcmssIHsgYml0czogNSB9KTtcblxuICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovXG4gICAgdmlyZ2luID0gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5sZW5jb2RlID0gbGVuZml4O1xuICBzdGF0ZS5sZW5iaXRzID0gOTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBkaXN0Zml4O1xuICBzdGF0ZS5kaXN0Yml0cyA9IDU7XG59XG5cblxuLypcbiBVcGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0IHdzaXplIChub3JtYWxseSAzMkspIGJ5dGVzIHdyaXR0ZW4gYmVmb3JlXG4gcmV0dXJuaW5nLiAgSWYgd2luZG93IGRvZXMgbm90IGV4aXN0IHlldCwgY3JlYXRlIGl0LiAgVGhpcyBpcyBvbmx5IGNhbGxlZFxuIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXNcbiBpbmZsYXRlIGNhbGwsIGJ1dCB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIHN0cmVhbSBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQuXG4gSXQgaXMgYWxzbyBjYWxsZWQgdG8gY3JlYXRlIGEgd2luZG93IGZvciBkaWN0aW9uYXJ5IGRhdGEgd2hlbiBhIGRpY3Rpb25hcnlcbiBpcyBsb2FkZWQuXG5cbiBQcm92aWRpbmcgb3V0cHV0IGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gMzJLIHRvIGluZmxhdGUoKSBzaG91bGQgcHJvdmlkZSBhIHNwZWVkXG4gYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvd1xuIHVwb24gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLCBhbmQgc2luY2UgYWxsIGRpc3RhbmNlcyBhZnRlciB0aGUgZmlyc3QgMzJLIG9mXG4gb3V0cHV0IHdpbGwgZmFsbCBpbiB0aGUgb3V0cHV0IGRhdGEsIG1ha2luZyBtYXRjaCBjb3BpZXMgc2ltcGxlciBhbmQgZmFzdGVyLlxuIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZXdpbmRvdyhzdHJtLCBzcmMsIGVuZCwgY29weSkge1xuICB2YXIgZGlzdDtcbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBpZiBpdCBoYXNuJ3QgYmVlbiBkb25lIGFscmVhZHksIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2luZG93ICovXG4gIGlmIChzdGF0ZS53aW5kb3cgPT09IG51bGwpIHtcbiAgICBzdGF0ZS53c2l6ZSA9IDEgPDwgc3RhdGUud2JpdHM7XG4gICAgc3RhdGUud25leHQgPSAwO1xuICAgIHN0YXRlLndoYXZlID0gMDtcblxuICAgIHN0YXRlLndpbmRvdyA9IG5ldyB1dGlscy5CdWY4KHN0YXRlLndzaXplKTtcbiAgfVxuXG4gIC8qIGNvcHkgc3RhdGUtPndzaXplIG9yIGxlc3Mgb3V0cHV0IGJ5dGVzIGludG8gdGhlIGNpcmN1bGFyIHdpbmRvdyAqL1xuICBpZiAoY29weSA+PSBzdGF0ZS53c2l6ZSkge1xuICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBzdGF0ZS53c2l6ZSwgc3RhdGUud3NpemUsIDApO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplO1xuICB9XG4gIGVsc2Uge1xuICAgIGRpc3QgPSBzdGF0ZS53c2l6ZSAtIHN0YXRlLnduZXh0O1xuICAgIGlmIChkaXN0ID4gY29weSkge1xuICAgICAgZGlzdCA9IGNvcHk7XG4gICAgfVxuICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPnduZXh0LCBlbmQgLSBjb3B5LCBkaXN0KTtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgZGlzdCwgc3RhdGUud25leHQpO1xuICAgIGNvcHkgLT0gZGlzdDtcbiAgICBpZiAoY29weSkge1xuICAgICAgLy96bWVtY3B5KHN0YXRlLT53aW5kb3csIGVuZCAtIGNvcHksIGNvcHkpO1xuICAgICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGNvcHksIDApO1xuICAgICAgc3RhdGUud25leHQgPSBjb3B5O1xuICAgICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzdGF0ZS53bmV4dCArPSBkaXN0O1xuICAgICAgaWYgKHN0YXRlLnduZXh0ID09PSBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53bmV4dCA9IDA7IH1cbiAgICAgIGlmIChzdGF0ZS53aGF2ZSA8IHN0YXRlLndzaXplKSB7IHN0YXRlLndoYXZlICs9IGRpc3Q7IH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgaW5wdXQsIG91dHB1dDsgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGJ1ZmZlcnNcbiAgdmFyIG5leHQ7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgaW5wdXQgSU5ERVggKi9cbiAgdmFyIHB1dDsgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgb3V0cHV0IElOREVYICovXG4gIHZhciBoYXZlLCBsZWZ0OyAgICAgICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovXG4gIHZhciBfaW4sIF9vdXQ7ICAgICAgICAgICAgICAvKiBzYXZlIHN0YXJ0aW5nIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovXG4gIHZhciBjb3B5OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG4gIHZhciBoZXJlID0gMDsgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsOyAvLyBwYWtlZCBcImhlcmVcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICAvL3ZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi9cbiAgdmFyIGxhc3RfYml0cywgbGFzdF9vcCwgbGFzdF92YWw7IC8vIHBha2VkIFwibGFzdFwiIGRlbm9ybWFsaXplZCAoSlMgc3BlY2lmaWMpXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovXG4gIHZhciByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqL1xuICB2YXIgaGJ1ZiA9IG5ldyB1dGlscy5CdWY4KDQpOyAgICAvKiBidWZmZXIgZm9yIGd6aXAgaGVhZGVyIGNyYyBjYWxjdWxhdGlvbiAqL1xuICB2YXIgb3B0cztcblxuICB2YXIgbjsgLy8gdGVtcG9yYXJ5IHZhciBmb3IgTkVFRF9CSVRTXG5cbiAgdmFyIG9yZGVyID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovXG4gICAgWyAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1IF07XG5cblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgfHwgIXN0cm0ub3V0cHV0IHx8XG4gICAgICAoIXN0cm0uaW5wdXQgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7IHN0YXRlLm1vZGUgPSBUWVBFRE87IH0gICAgLyogc2tpcCBjaGVjayAqL1xuXG5cbiAgLy8tLS0gTE9BRCgpIC0tLVxuICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIC8vLS0tXG5cbiAgX2luID0gaGF2ZTtcbiAgX291dCA9IGxlZnQ7XG4gIHJldCA9IFpfT0s7XG5cbiAgaW5mX2xlYXZlOiAvLyBnb3RvIGVtdWxhdGlvblxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChzdGF0ZS5tb2RlKSB7XG4gICAgICBjYXNlIEhFQUQ6XG4gICAgICAgIGlmIChzdGF0ZS53cmFwID09PSAwKSB7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IFRZUEVETztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBORUVEQklUUygxNik7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKChzdGF0ZS53cmFwICYgMikgJiYgaG9sZCA9PT0gMHg4YjFmKSB7ICAvKiBnemlwIGhlYWRlciAqL1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gMC8qY3JjMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuXG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubW9kZSA9IEZMQUdTO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmZsYWdzID0gMDsgICAgICAgICAgIC8qIGV4cGVjdCB6bGliIGhlYWRlciAqL1xuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHN0YXRlLndyYXAgJiAxKSB8fCAgIC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi9cbiAgICAgICAgICAoKChob2xkICYgMHhmZikvKkJJVFMoOCkqLyA8PCA4KSArIChob2xkID4+IDgpKSAlIDMxKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGhlYWRlciBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICAgIGJpdHMgLT0gNDtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBsZW4gPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA4O1xuICAgICAgICBpZiAoc3RhdGUud2JpdHMgPT09IDApIHtcbiAgICAgICAgICBzdGF0ZS53Yml0cyA9IGxlbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsZW4gPiBzdGF0ZS53Yml0cykge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgd2luZG93IHNpemUnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZG1heCA9IDEgPDwgbGVuO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgemxpYiBoZWFkZXIgb2tcXG5cIikpO1xuICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAxLyphZGxlcjMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgIHN0YXRlLm1vZGUgPSBob2xkICYgMHgyMDAgPyBESUNUSUQgOiBUWVBFO1xuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZMQUdTOlxuICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUuZmxhZ3MgPSBob2xkO1xuICAgICAgICBpZiAoKHN0YXRlLmZsYWdzICYgMHhmZikgIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweGUwMDApIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGhlYWRlciBmbGFncyBzZXQnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLnRleHQgPSAoKGhvbGQgPj4gOCkgJiAxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gVElNRTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUSU1FOlxuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLnRpbWUgPSBob2xkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzQoc3RhdGUuY2hlY2ssIGhvbGQpXG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIGhidWZbMl0gPSAoaG9sZCA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzNdID0gKGhvbGQgPj4+IDI0KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgNCwgMCk7XG4gICAgICAgICAgLy89PT1cbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IE9TO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIE9TOlxuICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLnhmbGFncyA9IChob2xkICYgMHhmZik7XG4gICAgICAgICAgc3RhdGUuaGVhZC5vcyA9IChob2xkID4+IDgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBFWExFTjtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBFWExFTjpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkO1xuICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX2xlbiA9IGhvbGQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSA9IG51bGwvKlpfTlVMTCovO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1vZGUgPSBFWFRSQTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBFWFRSQTpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICAgICAgbGVuID0gc3RhdGUuaGVhZC5leHRyYV9sZW4gLSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICAgIGlmICghc3RhdGUuaGVhZC5leHRyYSkge1xuICAgICAgICAgICAgICAgIC8vIFVzZSB1bnR5cGVkIGFycmF5IGZvciBtb3JlIGNvbnZlbmllbnQgcHJvY2Vzc2luZyBsYXRlclxuICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBuZXcgQXJyYXkoc3RhdGUuaGVhZC5leHRyYV9sZW4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHV0aWxzLmFycmF5U2V0KFxuICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgICAgICAvLyBleHRyYSBmaWVsZCBpcyBsaW1pdGVkIHRvIDY1NTM2IGJ5dGVzXG4gICAgICAgICAgICAgICAgLy8gLSBubyBuZWVkIGZvciBhZGRpdGlvbmFsIHNpemUgY2hlY2tcbiAgICAgICAgICAgICAgICBjb3B5LFxuICAgICAgICAgICAgICAgIC8qbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuID8gc3RhdGUuaGVhZC5leHRyYV9tYXggOiBjb3B5LCovXG4gICAgICAgICAgICAgICAgbGVuXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vem1lbWNweShzdGF0ZS5oZWFkLmV4dHJhICsgbGVuLCBuZXh0LFxuICAgICAgICAgICAgICAvLyAgICAgICAgbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4ID9cbiAgICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuIDogY29weSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGgpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IE5BTUU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTkFNRTpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwODAwKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgY29weSA9IDA7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gVE9ETzogMiBvciAxIGJ5dGVzP1xuICAgICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqL1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmXG4gICAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5uYW1lX21heCovKSkge1xuICAgICAgICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG5cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT01NRU5UO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPTU1FTlQ6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MTAwMCkge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGNvcHkgPSAwO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQuY29tbV9tYXgqLykpIHtcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpO1xuICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgIGlmIChsZW4pIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuY29tbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IEhDUkM7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgSENSQzpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLmNoZWNrICYgMHhmZmZmKSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaGVhZGVyIGNyYyBtaXNtYXRjaCc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5oY3JjID0gKChzdGF0ZS5mbGFncyA+PiA5KSAmIDEpO1xuICAgICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBESUNUSUQ6XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSB6c3dhcDMyKGhvbGQpO1xuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IERJQ1Q7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRElDVDpcbiAgICAgICAgaWYgKHN0YXRlLmhhdmVkaWN0ID09PSAwKSB7XG4gICAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICAgICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgICAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gICAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgICAgLy8tLS1cbiAgICAgICAgICByZXR1cm4gWl9ORUVEX0RJQ1Q7XG4gICAgICAgIH1cbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUWVBFOlxuICAgICAgICBpZiAoZmx1c2ggPT09IFpfQkxPQ0sgfHwgZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVFlQRURPOlxuICAgICAgICBpZiAoc3RhdGUubGFzdCkge1xuICAgICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUubW9kZSA9IENIRUNLO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGFzdCA9IChob2xkICYgMHgwMSkvKkJJVFMoMSkqLztcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoMSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDE7XG4gICAgICAgIGJpdHMgLT0gMTtcbiAgICAgICAgLy8tLS0vL1xuXG4gICAgICAgIHN3aXRjaCAoKGhvbGQgJiAweDAzKS8qQklUUygyKSovKSB7XG4gICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovXG4gICAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBzdG9yZWQgYmxvY2slc1xcblwiLFxuICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBTVE9SRUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCBibG9jayAqL1xuICAgICAgICAgICAgZml4ZWR0YWJsZXMoc3RhdGUpO1xuICAgICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fOyAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi9cbiAgICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykge1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi9cbiAgICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUQUJMRTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYmxvY2sgdHlwZSc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNUT1JFRDpcbiAgICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vLyAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovXG4gICAgICAgIGhvbGQgPj4+PSBiaXRzICYgNztcbiAgICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPT0gKChob2xkID4+PiAxNikgXiAweGZmZmYpKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3Rocyc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkICYgMHhmZmZmO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcXG5cIixcbiAgICAgICAgLy8gICAgICAgIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IENPUFlfO1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgQ09QWV86XG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT1BZO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPUFk6XG4gICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7IGNvcHkgPSBoYXZlOyB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICAgICAgaWYgKGNvcHkgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgLy8tLS0gem1lbWNweShwdXQsIG5leHQsIGNvcHkpOyAtLS1cbiAgICAgICAgICB1dGlscy5hcnJheVNldChvdXRwdXQsIGlucHV0LCBuZXh0LCBjb3B5LCBwdXQpO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgICBwdXQgKz0gY29weTtcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcXG5cIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRBQkxFOlxuICAgICAgICAvLz09PSBORUVEQklUUygxNCk7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTQpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubmxlbiA9IChob2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDI1NztcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDU7XG4gICAgICAgIGJpdHMgLT0gNTtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5uZGlzdCA9IChob2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDE7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgICBiaXRzIC09IDU7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubmNvZGUgPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA0O1xuICAgICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNDtcbiAgICAgICAgYml0cyAtPSA0O1xuICAgICAgICAvLy0tLS8vXG4vLyNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkRcbiAgICAgICAgaWYgKHN0YXRlLm5sZW4gPiAyODYgfHwgc3RhdGUubmRpc3QgPiAzMCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ3RvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHRhYmxlIHNpemVzIG9rXFxuXCIpKTtcbiAgICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5MRU5TO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTkxFTlM6XG4gICAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmNvZGUpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygzKTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gKGhvbGQgJiAweDA3KTsvL0JJVFMoMyk7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICBiaXRzIC09IDM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgMTkpIHtcbiAgICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgICAvL3N0YXRlLm5leHQgPSBzdGF0ZS5jb2RlcztcbiAgICAgICAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcbiAgICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICAgIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW47XG4gICAgICAgIHN0YXRlLmxlbmJpdHMgPSA3O1xuXG4gICAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShDT0RFUywgc3RhdGUubGVucywgMCwgMTksIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuXG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcXG5cIikpO1xuICAgICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IENPREVMRU5TO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPREVMRU5TOlxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkge1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLSAxKV07LypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgICBpZiAoKGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhlcmVfdmFsIDwgMTYpIHtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGhlcmVfdmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChoZXJlX3ZhbCA9PT0gMTYpIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMik7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAyO1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBpZiAoc3RhdGUuaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGVuID0gc3RhdGUubGVuc1tzdGF0ZS5oYXZlIC0gMV07XG4gICAgICAgICAgICAgIGNvcHkgPSAzICsgKGhvbGQgJiAweDAzKTsvL0JJVFMoMik7XG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGhlcmVfdmFsID09PSAxNykge1xuICAgICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTtcbiAgICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDM7XG4gICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICAgIGNvcHkgPSAzICsgKGhvbGQgJiAweDA3KTsvL0JJVFMoMyk7XG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICAgICAgICBiaXRzIC09IDM7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTtcbiAgICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDc7XG4gICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICAgIGNvcHkgPSAxMSArIChob2xkICYgMHg3Zik7Ly9CSVRTKDcpO1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyg3KSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gNztcbiAgICAgICAgICAgICAgYml0cyAtPSA3O1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUuaGF2ZSArIGNvcHkgPiBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkge1xuICAgICAgICAgICAgICBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUrK10gPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyogaGFuZGxlIGVycm9yIGJyZWFrcyBpbiB3aGlsZSAqL1xuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gQkFEKSB7IGJyZWFrOyB9XG5cbiAgICAgICAgLyogY2hlY2sgZm9yIGVuZC1vZi1ibG9jayBjb2RlIChiZXR0ZXIgaGF2ZSBvbmUpICovXG4gICAgICAgIGlmIChzdGF0ZS5sZW5zWzI1Nl0gPT09IDApIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBidWlsZCBjb2RlIHRhYmxlcyAtLSBub3RlOiBkbyBub3QgY2hhbmdlIHRoZSBsZW5iaXRzIG9yIGRpc3RiaXRzXG4gICAgICAgICAgIHZhbHVlcyBoZXJlICg5IGFuZCA2KSB3aXRob3V0IHJlYWRpbmcgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqL1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gOTtcblxuICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgc3RhdGUubmxlbiwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuICAgICAgICAvLyBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUuZGlzdGJpdHMgPSA2O1xuICAgICAgICAvL3N0YXRlLmRpc3Rjb2RlLmNvcHkoc3RhdGUuY29kZXMpO1xuICAgICAgICAvLyBTd2l0Y2ggdG8gdXNlIGR5bmFtaWMgdGFibGVcbiAgICAgICAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluO1xuICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5kaXN0Yml0cyB9O1xuICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCBzdGF0ZS5ubGVuLCBzdGF0ZS5uZGlzdCwgc3RhdGUuZGlzdGNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgICAvLyBzdGF0ZS5uZXh0X2luZGV4ID0gb3B0cy50YWJsZV9pbmRleDtcbiAgICAgICAgc3RhdGUuZGlzdGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAgIC8vIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dDtcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZXMgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsICdpbmZsYXRlOiAgICAgICBjb2RlcyBva1xcbicpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTl87XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5fOlxuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTjpcbiAgICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkge1xuICAgICAgICAgIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICAgIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAgICAgICAgIC8vLS0tXG4gICAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIF9vdXQpO1xuICAgICAgICAgIC8vLS0tIExPQUQoKSAtLS1cbiAgICAgICAgICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICAgICAgICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICAgICAgICAgIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgICAgICAgICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICAgICAgICAgIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgICAgICAgICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgICAgICAgICBob2xkID0gc3RhdGUuaG9sZDtcbiAgICAgICAgICBiaXRzID0gc3RhdGUuYml0cztcbiAgICAgICAgICAvLy0tLVxuXG4gICAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFRZUEUpIHtcbiAgICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuYmFjayA9IDA7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOyAgLypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKGhlcmVfYml0cyA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX29wICYmIChoZXJlX29wICYgMHhmMCkgPT09IDApIHtcbiAgICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7XG4gICAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDtcbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtsYXN0X3ZhbCArXG4gICAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzO1xuICAgICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0cztcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzO1xuICAgICAgICBzdGF0ZS5sZW5ndGggPSBoZXJlX3ZhbDtcbiAgICAgICAgaWYgKGhlcmVfb3AgPT09IDApIHtcbiAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgP1xuICAgICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gTElUO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX29wICYgMzIpIHtcbiAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgICAgc3RhdGUuYmFjayA9IC0xO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX29wICYgNjQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZXh0cmEgPSBoZXJlX29wICYgMTU7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5FWFQ7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVORVhUOlxuICAgICAgICBpZiAoc3RhdGUuZXh0cmEpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgICAgbiA9IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLmxlbmd0aCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKHN0YXRlLmV4dHJhKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgICBzdGF0ZS53YXMgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBESVNUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERJU1Q6XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxKV07LypCSVRTKHN0YXRlLmRpc3RiaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgoaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICAgKChob2xkICYgKCgxIDw8IChsYXN0X2JpdHMgKyBsYXN0X29wKSkgLSAxKSkvKkJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkqLyA+PiBsYXN0X2JpdHMpXTtcbiAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7XG4gICAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7XG4gICAgICAgIGlmIChoZXJlX29wICYgNjQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUub2Zmc2V0ID0gaGVyZV92YWw7XG4gICAgICAgIHN0YXRlLmV4dHJhID0gKGhlcmVfb3ApICYgMTU7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBESVNURVhUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERJU1RFWFQ6XG4gICAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTtcbiAgICAgICAgICBuID0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUub2Zmc2V0ICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0gMSkvKkJJVFMoc3RhdGUuZXh0cmEpKi87XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICAgIH1cbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gICAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBzdGF0ZS5kbWF4KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcXG5cIiwgc3RhdGUub2Zmc2V0KSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBNQVRDSDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBNQVRDSDpcbiAgICAgICAgaWYgKGxlZnQgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSBfb3V0IC0gbGVmdDtcbiAgICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IGNvcHkpIHsgICAgICAgICAvKiBjb3B5IGZyb20gd2luZG93ICovXG4gICAgICAgICAgY29weSA9IHN0YXRlLm9mZnNldCAtIGNvcHk7XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53aGF2ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnNhbmUpIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYXVsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgIFRyYWNlKChzdGRlcnIsIFwiaW5mbGF0ZS5jIHRvbyBmYXJcXG5cIikpO1xuLy8gICAgICAgICAgY29weSAtPSBzdGF0ZS53aGF2ZTtcbi8vICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbi8vICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuLy8gICAgICAgICAgbGVmdCAtPSBjb3B5O1xuLy8gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4vLyAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgIG91dHB1dFtwdXQrK10gPSAwO1xuLy8gICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbi8vICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuLy8gICAgICAgICAgYnJlYWs7XG4vLyNlbmRpZlxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLnduZXh0KSB7XG4gICAgICAgICAgICBjb3B5IC09IHN0YXRlLnduZXh0O1xuICAgICAgICAgICAgZnJvbSA9IHN0YXRlLndzaXplIC0gY29weTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmcm9tID0gc3RhdGUud25leHQgLSBjb3B5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4gICAgICAgICAgZnJvbV9zb3VyY2UgPSBzdGF0ZS53aW5kb3c7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgIGZyb20gPSBwdXQgLSBzdGF0ZS5vZmZzZXQ7XG4gICAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbiAgICAgICAgbGVmdCAtPSBjb3B5O1xuICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIG91dHB1dFtwdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICB9IHdoaWxlICgtLWNvcHkpO1xuICAgICAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7IHN0YXRlLm1vZGUgPSBMRU47IH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExJVDpcbiAgICAgICAgaWYgKGxlZnQgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIG91dHB1dFtwdXQrK10gPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGxlZnQtLTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENIRUNLOlxuICAgICAgICBpZiAoc3RhdGUud3JhcCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIC8vIFVzZSAnfCcgaW5zdGVhZCBvZiAnKycgdG8gbWFrZSBzdXJlIHRoYXQgcmVzdWx0IGlzIHNpZ25lZFxuICAgICAgICAgICAgaG9sZCB8PSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBfb3V0IC09IGxlZnQ7XG4gICAgICAgICAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgICAgICAgICBzdGF0ZS50b3RhbCArPSBfb3V0O1xuICAgICAgICAgIGlmIChfb3V0KSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPVxuICAgICAgICAgICAgICAgIC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBwdXQgLSBfb3V0LCBfb3V0KTsqL1xuICAgICAgICAgICAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSk7XG5cbiAgICAgICAgICB9XG4gICAgICAgICAgX291dCA9IGxlZnQ7XG4gICAgICAgICAgLy8gTkI6IGNyYzMyIHN0b3JlZCBhcyBzaWduZWQgMzItYml0IGludCwgenN3YXAzMiByZXR1cm5zIHNpZ25lZCB0b29cbiAgICAgICAgICBpZiAoKHN0YXRlLmZsYWdzID8gaG9sZCA6IHpzd2FwMzIoaG9sZCkpICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGRhdGEgY2hlY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgY2hlY2sgbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOR1RIO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTkdUSDpcbiAgICAgICAgaWYgKHN0YXRlLndyYXAgJiYgc3RhdGUuZmxhZ3MpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUudG90YWwgJiAweGZmZmZmZmZmKSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGxlbmd0aCBjaGVjayc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBsZW5ndGggbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gRE9ORTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBET05FOlxuICAgICAgICByZXQgPSBaX1NUUkVBTV9FTkQ7XG4gICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgIGNhc2UgQkFEOlxuICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7XG4gICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgIGNhc2UgTUVNOlxuICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gICAgICBjYXNlIFNZTkM6XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgICB9XG4gIH1cblxuICAvLyBpbmZfbGVhdmUgPC0gaGVyZSBpcyByZWFsIHBsYWNlIGZvciBcImdvdG8gaW5mX2xlYXZlXCIsIGVtdWxhdGVkIHZpYSBcImJyZWFrIGluZl9sZWF2ZVwiXG5cbiAgLypcbiAgICAgUmV0dXJuIGZyb20gaW5mbGF0ZSgpLCB1cGRhdGluZyB0aGUgdG90YWwgY291bnRzIGFuZCB0aGUgY2hlY2sgdmFsdWUuXG4gICAgIElmIHRoZXJlIHdhcyBubyBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZmxhdGUoKSBjYWxsLCByZXR1cm4gYSBidWZmZXJcbiAgICAgZXJyb3IuICBDYWxsIHVwZGF0ZXdpbmRvdygpIHRvIGNyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSB3aW5kb3cgc3RhdGUuXG4gICAgIE5vdGU6IGEgbWVtb3J5IGVycm9yIGZyb20gaW5mbGF0ZSgpIGlzIG5vbi1yZWNvdmVyYWJsZS5cbiAgICovXG5cbiAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIC8vLS0tXG5cbiAgaWYgKHN0YXRlLndzaXplIHx8IChfb3V0ICE9PSBzdHJtLmF2YWlsX291dCAmJiBzdGF0ZS5tb2RlIDwgQkFEICYmXG4gICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPCBDSEVDSyB8fCBmbHVzaCAhPT0gWl9GSU5JU0gpKSkge1xuICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQsIF9vdXQgLSBzdHJtLmF2YWlsX291dCkpIHtcbiAgICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gICAgfVxuICB9XG4gIF9pbiAtPSBzdHJtLmF2YWlsX2luO1xuICBfb3V0IC09IHN0cm0uYXZhaWxfb3V0O1xuICBzdHJtLnRvdGFsX2luICs9IF9pbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgaWYgKHN0YXRlLndyYXAgJiYgX291dCkge1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBzdHJtLm5leHRfb3V0IC0gX291dCwgX291dCk7Ki9cbiAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpKTtcbiAgfVxuICBzdHJtLmRhdGFfdHlwZSA9IHN0YXRlLmJpdHMgKyAoc3RhdGUubGFzdCA/IDY0IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gVFlQRSA/IDEyOCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IExFTl8gfHwgc3RhdGUubW9kZSA9PT0gQ09QWV8gPyAyNTYgOiAwKTtcbiAgaWYgKCgoX2luID09PSAwICYmIF9vdXQgPT09IDApIHx8IGZsdXNoID09PSBaX0ZJTklTSCkgJiYgcmV0ID09PSBaX09LKSB7XG4gICAgcmV0ID0gWl9CVUZfRVJST1I7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUVuZChzdHJtKSB7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIC8qfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICB2YXIgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUud2luZG93KSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuICBzdHJtLnN0YXRlID0gbnVsbDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVHZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICB2YXIgc3RhdGU7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmICgoc3RhdGUud3JhcCAmIDIpID09PSAwKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuXG4gIC8qIHNhdmUgaGVhZGVyIHN0cnVjdHVyZSAqL1xuICBzdGF0ZS5oZWFkID0gaGVhZDtcbiAgaGVhZC5kb25lID0gZmFsc2U7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5KSB7XG4gIHZhciBkaWN0TGVuZ3RoID0gZGljdGlvbmFyeS5sZW5ndGg7XG5cbiAgdmFyIHN0YXRlO1xuICB2YXIgZGljdGlkO1xuICB2YXIgcmV0O1xuXG4gIC8qIGNoZWNrIHN0YXRlICovXG4gIGlmICghc3RybSAvKiA9PSBaX05VTEwgKi8gfHwgIXN0cm0uc3RhdGUgLyogPT0gWl9OVUxMICovKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKHN0YXRlLndyYXAgIT09IDAgJiYgc3RhdGUubW9kZSAhPT0gRElDVCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBjb3JyZWN0IGRpY3Rpb25hcnkgaWRlbnRpZmllciAqL1xuICBpZiAoc3RhdGUubW9kZSA9PT0gRElDVCkge1xuICAgIGRpY3RpZCA9IDE7IC8qIGFkbGVyMzIoMCwgbnVsbCwgMCkqL1xuICAgIC8qIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgMCk7XG4gICAgaWYgKGRpY3RpZCAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7XG4gICAgfVxuICB9XG4gIC8qIGNvcHkgZGljdGlvbmFyeSB0byB3aW5kb3cgdXNpbmcgdXBkYXRld2luZG93KCksIHdoaWNoIHdpbGwgYW1lbmQgdGhlXG4gICBleGlzdGluZyBkaWN0aW9uYXJ5IGlmIGFwcHJvcHJpYXRlICovXG4gIHJldCA9IHVwZGF0ZXdpbmRvdyhzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCBkaWN0TGVuZ3RoKTtcbiAgaWYgKHJldCkge1xuICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICB9XG4gIHN0YXRlLmhhdmVkaWN0ID0gMTtcbiAgLy8gVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBkaWN0aW9uYXJ5IHNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5leHBvcnRzLmluZmxhdGVSZXNldCA9IGluZmxhdGVSZXNldDtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0MiA9IGluZmxhdGVSZXNldDI7XG5leHBvcnRzLmluZmxhdGVSZXNldEtlZXAgPSBpbmZsYXRlUmVzZXRLZWVwO1xuZXhwb3J0cy5pbmZsYXRlSW5pdCA9IGluZmxhdGVJbml0O1xuZXhwb3J0cy5pbmZsYXRlSW5pdDIgPSBpbmZsYXRlSW5pdDI7XG5leHBvcnRzLmluZmxhdGUgPSBpbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlRW5kID0gaW5mbGF0ZUVuZDtcbmV4cG9ydHMuaW5mbGF0ZUdldEhlYWRlciA9IGluZmxhdGVHZXRIZWFkZXI7XG5leHBvcnRzLmluZmxhdGVTZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmluZmxhdGVJbmZvID0gJ3Bha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuaW5mbGF0ZUNvcHkgPSBpbmZsYXRlQ29weTtcbmV4cG9ydHMuaW5mbGF0ZUdldERpY3Rpb25hcnkgPSBpbmZsYXRlR2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZU1hcmsgPSBpbmZsYXRlTWFyaztcbmV4cG9ydHMuaW5mbGF0ZVByaW1lID0gaW5mbGF0ZVByaW1lO1xuZXhwb3J0cy5pbmZsYXRlU3luYyA9IGluZmxhdGVTeW5jO1xuZXhwb3J0cy5pbmZsYXRlU3luY1BvaW50ID0gaW5mbGF0ZVN5bmNQb2ludDtcbmV4cG9ydHMuaW5mbGF0ZVVuZGVybWluZSA9IGluZmxhdGVVbmRlcm1pbmU7XG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbi8vIFNlZSBzdGF0ZSBkZWZzIGZyb20gaW5mbGF0ZS5qc1xudmFyIEJBRCA9IDMwOyAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cblxuLypcbiAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmdcbiAgIGxpdGVyYWwgYW5kIG1hdGNoIGJ5dGVzIHVudGlsIGVpdGhlciBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBpc1xuICAgYXZhaWxhYmxlLCBhbiBlbmQtb2YtYmxvY2sgaXMgZW5jb3VudGVyZWQsIG9yIGEgZGF0YSBlcnJvciBpcyBlbmNvdW50ZXJlZC5cbiAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3JcbiAgIGV4YW1wbGUsIGEgMTZLIGlucHV0IGJ1ZmZlciBhbmQgYSA2NEsgb3V0cHV0IGJ1ZmZlciwgbW9yZSB0aGFuIDk1JSBvZiB0aGVcbiAgIGluZmxhdGUgZXhlY3V0aW9uIHRpbWUgaXMgc3BlbnQgaW4gdGhpcyByb3V0aW5lLlxuXG4gICBFbnRyeSBhc3N1bXB0aW9uczpcblxuICAgICAgICBzdGF0ZS5tb2RlID09PSBMRU5cbiAgICAgICAgc3RybS5hdmFpbF9pbiA+PSA2XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID49IDI1OFxuICAgICAgICBzdGFydCA+PSBzdHJtLmF2YWlsX291dFxuICAgICAgICBzdGF0ZS5iaXRzIDwgOFxuXG4gICBPbiByZXR1cm4sIHN0YXRlLm1vZGUgaXMgb25lIG9mOlxuXG4gICAgICAgIExFTiAtLSByYW4gb3V0IG9mIGVub3VnaCBvdXRwdXQgc3BhY2Ugb3IgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dFxuICAgICAgICBUWVBFIC0tIHJlYWNoZWQgZW5kIG9mIGJsb2NrIGNvZGUsIGluZmxhdGUoKSB0byBpbnRlcnByZXQgbmV4dCBibG9ja1xuICAgICAgICBCQUQgLS0gZXJyb3IgaW4gYmxvY2sgZGF0YVxuXG4gICBOb3RlczpcblxuICAgIC0gVGhlIG1heGltdW0gaW5wdXQgYml0cyB1c2VkIGJ5IGEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMgMTUgYml0cyBmb3IgdGhlXG4gICAgICBsZW5ndGggY29kZSwgNSBiaXRzIGZvciB0aGUgbGVuZ3RoIGV4dHJhLCAxNSBiaXRzIGZvciB0aGUgZGlzdGFuY2UgY29kZSxcbiAgICAgIGFuZCAxMyBiaXRzIGZvciB0aGUgZGlzdGFuY2UgZXh0cmEuICBUaGlzIHRvdGFscyA0OCBiaXRzLCBvciBzaXggYnl0ZXMuXG4gICAgICBUaGVyZWZvcmUgaWYgc3RybS5hdmFpbF9pbiA+PSA2LCB0aGVuIHRoZXJlIGlzIGVub3VnaCBpbnB1dCB0byBhdm9pZFxuICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy5cblxuICAgIC0gVGhlIG1heGltdW0gYnl0ZXMgdGhhdCBhIHNpbmdsZSBsZW5ndGgvZGlzdGFuY2UgcGFpciBjYW4gb3V0cHV0IGlzIDI1OFxuICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpXG4gICAgICByZXF1aXJlcyBzdHJtLmF2YWlsX291dCA+PSAyNTggZm9yIGVhY2ggbG9vcCB0byBhdm9pZCBjaGVja2luZyBmb3JcbiAgICAgIG91dHB1dCBzcGFjZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhcnQpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgX2luOyAgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5pbnB1dCAqL1xuICB2YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogaGF2ZSBlbm91Z2ggaW5wdXQgd2hpbGUgaW4gPCBsYXN0ICovXG4gIHZhciBfb3V0OyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLm91dHB1dCAqL1xuICB2YXIgYmVnOyAgICAgICAgICAgICAgICAgICAgLyogaW5mbGF0ZSgpJ3MgaW5pdGlhbCBzdHJtLm91dHB1dCAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgb3V0IDwgZW5kLCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlICovXG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICB2YXIgZG1heDsgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBkaXN0YW5jZSBmcm9tIHpsaWIgaGVhZGVyICovXG4vLyNlbmRpZlxuICB2YXIgd3NpemU7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHZhciB3aGF2ZTsgICAgICAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHZhciB3bmV4dDsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgLy8gVXNlIGBzX3dpbmRvd2AgaW5zdGVhZCBgd2luZG93YCwgYXZvaWQgY29uZmxpY3Qgd2l0aCBpbnN0cnVtZW50YXRpb24gdG9vbHNcbiAgdmFyIHNfd2luZG93OyAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgd3NpemUgIT0gMCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5ob2xkICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmJpdHMgKi9cbiAgdmFyIGxjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ubGVuY29kZSAqL1xuICB2YXIgZGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5kaXN0Y29kZSAqL1xuICB2YXIgbG1hc2s7ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgbGVuZ3RoIGNvZGVzICovXG4gIHZhciBkbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuICB2YXIgaGVyZTsgICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmVkIHRhYmxlIGVudHJ5ICovXG4gIHZhciBvcDsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMsIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgb3IgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICB3aW5kb3cgcG9zaXRpb24sIHdpbmRvdyBieXRlcyB0byBjb3B5ICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGgsIHVudXNlZCBieXRlcyAqL1xuICB2YXIgZGlzdDsgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggZGlzdGFuY2UgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG5cblxuICB2YXIgaW5wdXQsIG91dHB1dDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuXG4gIC8qIGNvcHkgc3RhdGUgdG8gbG9jYWwgdmFyaWFibGVzICovXG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgLy9oZXJlID0gc3RhdGUuaGVyZTtcbiAgX2luID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGxhc3QgPSBfaW4gKyAoc3RybS5hdmFpbF9pbiAtIDUpO1xuICBfb3V0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGJlZyA9IF9vdXQgLSAoc3RhcnQgLSBzdHJtLmF2YWlsX291dCk7XG4gIGVuZCA9IF9vdXQgKyAoc3RybS5hdmFpbF9vdXQgLSAyNTcpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgZG1heCA9IHN0YXRlLmRtYXg7XG4vLyNlbmRpZlxuICB3c2l6ZSA9IHN0YXRlLndzaXplO1xuICB3aGF2ZSA9IHN0YXRlLndoYXZlO1xuICB3bmV4dCA9IHN0YXRlLnduZXh0O1xuICBzX3dpbmRvdyA9IHN0YXRlLndpbmRvdztcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICBsY29kZSA9IHN0YXRlLmxlbmNvZGU7XG4gIGRjb2RlID0gc3RhdGUuZGlzdGNvZGU7XG4gIGxtYXNrID0gKDEgPDwgc3RhdGUubGVuYml0cykgLSAxO1xuICBkbWFzayA9ICgxIDw8IHN0YXRlLmRpc3RiaXRzKSAtIDE7XG5cblxuICAvKiBkZWNvZGUgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZXMgdW50aWwgZW5kLW9mLWJsb2NrIG9yIG5vdCBlbm91Z2hcbiAgICAgaW5wdXQgZGF0YSBvciBvdXRwdXQgc3BhY2UgKi9cblxuICB0b3A6XG4gIGRvIHtcbiAgICBpZiAoYml0cyA8IDE1KSB7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgIGJpdHMgKz0gODtcbiAgICB9XG5cbiAgICBoZXJlID0gbGNvZGVbaG9sZCAmIGxtYXNrXTtcblxuICAgIGRvbGVuOlxuICAgIGZvciAoOzspIHsgLy8gR290byBlbXVsYXRpb25cbiAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgYml0cyAtPSBvcDtcbiAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcbiAgICAgIGlmIChvcCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGl0ZXJhbCAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgP1xuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xcblwiIDpcbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxcblwiLCBoZXJlLnZhbCkpO1xuICAgICAgICBvdXRwdXRbX291dCsrXSA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGJhc2UgKi9cbiAgICAgICAgbGVuID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi9cbiAgICAgICAgaWYgKG9wKSB7XG4gICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGVuICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7XG4gICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcXG5cIiwgbGVuKSk7XG4gICAgICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBoZXJlID0gZGNvZGVbaG9sZCAmIGRtYXNrXTtcblxuICAgICAgICBkb2Rpc3Q6XG4gICAgICAgIGZvciAoOzspIHsgLy8gZ290byBlbXVsYXRpb25cbiAgICAgICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLztcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87XG5cbiAgICAgICAgICBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYXNlICovXG4gICAgICAgICAgICBkaXN0ID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi9cbiAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3QgKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gICAgICAgICAgICBpZiAoZGlzdCA+IGRtYXgpIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcXG5cIiwgZGlzdCkpO1xuICAgICAgICAgICAgb3AgPSBfb3V0IC0gYmVnOyAgICAgICAgICAgICAgICAvKiBtYXggZGlzdGFuY2UgaW4gb3V0cHV0ICovXG4gICAgICAgICAgICBpZiAoZGlzdCA+IG9wKSB7ICAgICAgICAgICAgICAgIC8qIHNlZSBpZiBjb3B5IGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgIG9wID0gZGlzdCAtIG9wOyAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgaW4gd2luZG93ICovXG4gICAgICAgICAgICAgIGlmIChvcCA+IHdoYXZlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLnNhbmUpIHtcbiAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgICAgICAgfVxuXG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmF1bHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSXG4vLyAgICAgICAgICAgICAgICBpZiAobGVuIDw9IG9wIC0gd2hhdmUpIHtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICBsZW4gLT0gb3AgLSB3aGF2ZTtcbi8vICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCA+IHdoYXZlKTtcbi8vICAgICAgICAgICAgICAgIGlmIChvcCA9PT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZnJvbSA9IDA7IC8vIHdpbmRvdyBpbmRleFxuICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IHNfd2luZG93O1xuICAgICAgICAgICAgICBpZiAod25leHQgPT09IDApIHsgICAgICAgICAgIC8qIHZlcnkgY29tbW9uIGNhc2UgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplIC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmICh3bmV4dCA8IG9wKSB7ICAgICAgLyogd3JhcCBhcm91bmQgd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSArIHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgb3AgLT0gd25leHQ7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIGVuZCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gMDtcbiAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA8IGxlbikgeyAgLyogc29tZSBmcm9tIHN0YXJ0IG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgICBvcCA9IHduZXh0O1xuICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpZ3VvdXMgaW4gd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDIpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgICAgICAvKiBjb3B5IGRpcmVjdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBsZW5ndGggaXMgdGhyZWUgKi9cbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfSB3aGlsZSAobGVuID4gMik7XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgLyogMm5kIGxldmVsIGRpc3RhbmNlIGNvZGUgKi9cbiAgICAgICAgICAgIGhlcmUgPSBkY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICAgICAgY29udGludWUgZG9kaXN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgY29kZSc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAgICAgLyogMm5kIGxldmVsIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGhlcmUgPSBsY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICBjb250aW51ZSBkb2xlbjtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMzIpIHsgICAgICAgICAgICAgICAgICAgICAvKiBlbmQtb2YtYmxvY2sgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcXG5cIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICB9XG4gIH0gd2hpbGUgKF9pbiA8IGxhc3QgJiYgX291dCA8IGVuZCk7XG5cbiAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovXG4gIGxlbiA9IGJpdHMgPj4gMztcbiAgX2luIC09IGxlbjtcbiAgYml0cyAtPSBsZW4gPDwgMztcbiAgaG9sZCAmPSAoMSA8PCBiaXRzKSAtIDE7XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXR1cm4gKi9cbiAgc3RybS5uZXh0X2luID0gX2luO1xuICBzdHJtLm5leHRfb3V0ID0gX291dDtcbiAgc3RybS5hdmFpbF9pbiA9IChfaW4gPCBsYXN0ID8gNSArIChsYXN0IC0gX2luKSA6IDUgLSAoX2luIC0gbGFzdCkpO1xuICBzdHJtLmF2YWlsX291dCA9IChfb3V0IDwgZW5kID8gMjU3ICsgKGVuZCAtIF9vdXQpIDogMjU3IC0gKF9vdXQgLSBlbmQpKTtcbiAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gIHN0YXRlLmJpdHMgPSBiaXRzO1xuICByZXR1cm47XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xuXG52YXIgTUFYQklUUyA9IDE1O1xudmFyIEVOT1VHSF9MRU5TID0gODUyO1xudmFyIEVOT1VHSF9ESVNUUyA9IDU5Mjtcbi8vdmFyIEVOT1VHSCA9IChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxudmFyIGxiYXNlID0gWyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgYmFzZSAqL1xuICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLFxuICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMFxuXTtcblxudmFyIGxleHQgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCxcbiAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDcyLCA3OFxuXTtcblxudmFyIGRiYXNlID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBiYXNlICovXG4gIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MyxcbiAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LFxuICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3LCAwLCAwXG5dO1xuXG52YXIgZGV4dCA9IFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgZXh0cmEgKi9cbiAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsXG4gIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LFxuICAyOCwgMjgsIDI5LCAyOSwgNjQsIDY0XG5dO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfdGFibGUodHlwZSwgbGVucywgbGVuc19pbmRleCwgY29kZXMsIHRhYmxlLCB0YWJsZV9pbmRleCwgd29yaywgb3B0cylcbntcbiAgdmFyIGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAvL2hlcmUgPSBvcHRzLmhlcmU7IC8qIHRhYmxlIGVudHJ5IGZvciBkdXBsaWNhdGlvbiAqL1xuXG4gIHZhciBsZW4gPSAwOyAgICAgICAgICAgICAgIC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovXG4gIHZhciBzeW0gPSAwOyAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGNvZGUgc3ltYm9scyAqL1xuICB2YXIgbWluID0gMCwgbWF4ID0gMDsgICAgICAgICAgLyogbWluaW11bSBhbmQgbWF4aW11bSBjb2RlIGxlbmd0aHMgKi9cbiAgdmFyIHJvb3QgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHJvb3QgdGFibGUgKi9cbiAgdmFyIGN1cnIgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIGN1cnJlbnQgdGFibGUgKi9cbiAgdmFyIGRyb3AgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqL1xuICB2YXIgbGVmdCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovXG4gIHZhciB1c2VkID0gMDsgICAgICAgICAgICAgIC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovXG4gIHZhciBodWZmID0gMDsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqL1xuICB2YXIgaW5jcjsgICAgICAgICAgICAgIC8qIGZvciBpbmNyZW1lbnRpbmcgY29kZSwgaW5kZXggKi9cbiAgdmFyIGZpbGw7ICAgICAgICAgICAgICAvKiBpbmRleCBmb3IgcmVwbGljYXRpbmcgZW50cmllcyAqL1xuICB2YXIgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi9cbiAgdmFyIG1hc2s7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsb3cgcm9vdCBiaXRzICovXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZSAqL1xuICB2YXIgYmFzZSA9IG51bGw7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgYmFzZV9pbmRleCA9IDA7XG4vLyAgdmFyIHNob2V4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPiBlbmQgKi9cbiAgdmFyIGNvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovXG4gIHZhciBvZmZzID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovXG4gIHZhciBleHRyYSA9IG51bGw7XG4gIHZhciBleHRyYV9pbmRleCA9IDA7XG5cbiAgdmFyIGhlcmVfYml0cywgaGVyZV9vcCwgaGVyZV92YWw7XG5cbiAgLypcbiAgIFByb2Nlc3MgYSBzZXQgb2YgY29kZSBsZW5ndGhzIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBIdWZmbWFuIGNvZGUuICBUaGVcbiAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZVxuICAgc3ltYm9scyAwLi5jb2Rlcy0xLiAgVGhlIEh1ZmZtYW4gY29kZSBpcyBnZW5lcmF0ZWQgYnkgZmlyc3Qgc29ydGluZyB0aGVcbiAgIHN5bWJvbHMgYnkgbGVuZ3RoIGZyb20gc2hvcnQgdG8gbG9uZywgYW5kIHJldGFpbmluZyB0aGUgc3ltYm9sIG9yZGVyXG4gICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzXG4gICBmb3IgdGhlIGZpcnN0IGNvZGUgb2YgdGhlIHNob3J0ZXN0IGxlbmd0aCwgYW5kIHRoZSBjb2RlcyBhcmUgaW50ZWdlclxuICAgaW5jcmVtZW50cyBmb3IgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgemVyb3MgYXJlIGFwcGVuZGVkIGFzIHRoZSBsZW5ndGhcbiAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHNcbiAgIGZyb20gdGhlaXIgbW9yZSBuYXR1cmFsIGludGVnZXIgaW5jcmVtZW50IG9yZGVyaW5nLCBhbmQgc28gd2hlbiB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcyBhcmUgYnVpbHQgaW4gdGhlIGxhcmdlIGxvb3AgYmVsb3csIHRoZSBpbnRlZ2VyIGNvZGVzXG4gICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLlxuXG4gICBUaGlzIHJvdXRpbmUgYXNzdW1lcywgYnV0IGRvZXMgbm90IGNoZWNrLCB0aGF0IGFsbCBvZiB0aGUgZW50cmllcyBpblxuICAgbGVuc1tdIGFyZSBpbiB0aGUgcmFuZ2UgMC4uTUFYQklUUy4gIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhpcy5cbiAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0XG4gICBzeW1ib2wgZG9lcyBub3Qgb2NjdXIgaW4gdGhpcyBjb2RlLlxuXG4gICBUaGUgY29kZXMgYXJlIHNvcnRlZCBieSBjb21wdXRpbmcgYSBjb3VudCBvZiBjb2RlcyBmb3IgZWFjaCBsZW5ndGgsXG4gICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGVcbiAgIHNvcnRlZCB0YWJsZSwgYW5kIHRoZW4gZW50ZXJpbmcgdGhlIHN5bWJvbHMgaW4gb3JkZXIgaW4gdGhlIHNvcnRlZFxuICAgdGFibGUuICBUaGUgc29ydGVkIHRhYmxlIGlzIHdvcmtbXSwgd2l0aCB0aGF0IHNwYWNlIGJlaW5nIHByb3ZpZGVkIGJ5XG4gICB0aGUgY2FsbGVyLlxuXG4gICBUaGUgbGVuZ3RoIGNvdW50cyBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYXMgd2VsbCwgaS5lLiBmaW5kaW5nXG4gICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggY29kZXMsIGRldGVybWluaW5nIGlmIHRoZXJlIGFyZSBhbnlcbiAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkXG4gICBhdCBsZW5ndGggY291bnRzIHRvIGRldGVybWluZSBzdWItdGFibGUgc2l6ZXMgd2hlbiBidWlsZGluZyB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcy5cbiAgICovXG5cbiAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovXG4gIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgY291bnRbbGVuXSA9IDA7XG4gIH1cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBjb3VudFtsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrO1xuICB9XG5cbiAgLyogYm91bmQgY29kZSBsZW5ndGhzLCBmb3JjZSByb290IHRvIGJlIHdpdGhpbiBjb2RlIGxlbmd0aHMgKi9cbiAgcm9vdCA9IGJpdHM7XG4gIGZvciAobWF4ID0gTUFYQklUUzsgbWF4ID49IDE7IG1heC0tKSB7XG4gICAgaWYgKGNvdW50W21heF0gIT09IDApIHsgYnJlYWs7IH1cbiAgfVxuICBpZiAocm9vdCA+IG1heCkge1xuICAgIHJvb3QgPSBtYXg7XG4gIH1cbiAgaWYgKG1heCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHN5bWJvbHMgdG8gY29kZSBhdCBhbGwgKi9cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7ICAvL2hlcmUub3AgPSAodmFyIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxOyAgIC8vaGVyZS5iaXRzID0gKHZhciBjaGFyKTE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7ICAgLy9oZXJlLnZhbCA9ICh2YXIgc2hvcnQpMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG5cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7XG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG4gICAgb3B0cy5iaXRzID0gMTtcbiAgICByZXR1cm4gMDsgICAgIC8qIG5vIHN5bWJvbHMsIGJ1dCB3YWl0IGZvciBkZWNvZGluZyB0byByZXBvcnQgZXJyb3IgKi9cbiAgfVxuICBmb3IgKG1pbiA9IDE7IG1pbiA8IG1heDsgbWluKyspIHtcbiAgICBpZiAoY291bnRbbWluXSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290IDwgbWluKSB7XG4gICAgcm9vdCA9IG1pbjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqL1xuICBsZWZ0ID0gMTtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBsZWZ0IDw8PSAxO1xuICAgIGxlZnQgLT0gY291bnRbbGVuXTtcbiAgICBpZiAobGVmdCA8IDApIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9ICAgICAgICAvKiBvdmVyLXN1YnNjcmliZWQgKi9cbiAgfVxuICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT09IENPREVTIHx8IG1heCAhPT0gMSkpIHtcbiAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovXG4gIH1cblxuICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqL1xuICBvZmZzWzFdID0gMDtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykge1xuICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dO1xuICB9XG5cbiAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqL1xuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGlmIChsZW5zW2xlbnNfaW5kZXggKyBzeW1dICE9PSAwKSB7XG4gICAgICB3b3JrW29mZnNbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rK10gPSBzeW07XG4gICAgfVxuICB9XG5cbiAgLypcbiAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZ1xuICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmZcbiAgIHdpdGggbGVuZ3RoIGxlbi4gIFRoYXQgY29kZSBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5kZXggYnkgZHJvcHBpbmcgZHJvcFxuICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLFxuICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0b1xuICAgZmlsbCB0aGUgdGFibGUgd2l0aCByZXBsaWNhdGVkIGVudHJpZXMuXG5cbiAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHNcbiAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4XG4gICBvZiB0aGUgbG93IHJvb3QgYml0cyBvZiBodWZmLiAgVGhpcyBpcyBzYXZlZCBpbiBsb3cgdG8gY2hlY2sgZm9yIHdoZW4gYVxuICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3AgaXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzXG4gICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuXG5cbiAgIFdoZW4gYSBuZXcgc3ViLXRhYmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlXG4gICBjb2RlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIHdoYXQgc2l6ZSBzdWItdGFibGUgaXMgbmVlZGVkLiAgVGhlIGxlbmd0aFxuICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmVcbiAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy5cblxuICAgdXNlZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB0aGVcbiAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3RcbiAgIHRoZSBjb25zdGFudHMgRU5PVUdIX0xFTlMgYW5kIEVOT1VHSF9ESVNUUyB0byBndWFyZCBhZ2FpbnN0IGNoYW5nZXMgaW5cbiAgIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG4gICBzeW0gaW5jcmVtZW50cyB0aHJvdWdoIGFsbCBzeW1ib2xzLCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcyB3aGVuXG4gICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzXG4gICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzXG4gICBpbiB0aGUgcmVzdCBvZiB0aGUgZGVjb2RpbmcgdGFibGVzIHdpdGggaW52YWxpZCBjb2RlIG1hcmtlcnMuXG4gICAqL1xuXG4gIC8qIHNldCB1cCBmb3IgY29kZSB0eXBlICovXG4gIC8vIHBvb3IgbWFuIG9wdGltaXphdGlvbiAtIHVzZSBpZi1lbHNlIGluc3RlYWQgb2Ygc3dpdGNoLFxuICAvLyB0byBhdm9pZCBkZW9wdHMgaW4gb2xkIHY4XG4gIGlmICh0eXBlID09PSBDT0RFUykge1xuICAgIGJhc2UgPSBleHRyYSA9IHdvcms7ICAgIC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqL1xuICAgIGVuZCA9IDE5O1xuXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTEVOUykge1xuICAgIGJhc2UgPSBsYmFzZTtcbiAgICBiYXNlX2luZGV4IC09IDI1NztcbiAgICBleHRyYSA9IGxleHQ7XG4gICAgZXh0cmFfaW5kZXggLT0gMjU3O1xuICAgIGVuZCA9IDI1NjtcblxuICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogRElTVFMgKi9cbiAgICBiYXNlID0gZGJhc2U7XG4gICAgZXh0cmEgPSBkZXh0O1xuICAgIGVuZCA9IC0xO1xuICB9XG5cbiAgLyogaW5pdGlhbGl6ZSBvcHRzIGZvciBsb29wICovXG4gIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovXG4gIHN5bSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIHN5bWJvbCAqL1xuICBsZW4gPSBtaW47ICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBsZW5ndGggKi9cbiAgbmV4dCA9IHRhYmxlX2luZGV4OyAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSB0byBmaWxsIGluICovXG4gIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi9cbiAgZHJvcCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgYml0cyB0byBkcm9wIGZyb20gY29kZSBmb3IgaW5kZXggKi9cbiAgbG93ID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIHRyaWdnZXIgbmV3IHN1Yi10YWJsZSB3aGVuIGxlbiA+IHJvb3QgKi9cbiAgdXNlZCA9IDEgPDwgcm9vdDsgICAgICAgICAgLyogdXNlIHJvb3QgdGFibGUgZW50cmllcyAqL1xuICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqL1xuXG4gIC8qIGNoZWNrIGF2YWlsYWJsZSB0YWJsZSBzcGFjZSAqL1xuICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICh0eXBlID09PSBESVNUUyAmJiB1c2VkID4gRU5PVUdIX0RJU1RTKSkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgLyogcHJvY2VzcyBhbGwgY29kZXMgYW5kIG1ha2UgdGFibGUgZW50cmllcyAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogY3JlYXRlIHRhYmxlIGVudHJ5ICovXG4gICAgaGVyZV9iaXRzID0gbGVuIC0gZHJvcDtcbiAgICBpZiAod29ya1tzeW1dIDwgZW5kKSB7XG4gICAgICBoZXJlX29wID0gMDtcbiAgICAgIGhlcmVfdmFsID0gd29ya1tzeW1dO1xuICAgIH1cbiAgICBlbHNlIGlmICh3b3JrW3N5bV0gPiBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSBleHRyYVtleHRyYV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgICBoZXJlX3ZhbCA9IGJhc2VbYmFzZV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaGVyZV9vcCA9IDMyICsgNjQ7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovXG4gICAgICBoZXJlX3ZhbCA9IDA7XG4gICAgfVxuXG4gICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gZHJvcCk7XG4gICAgZmlsbCA9IDEgPDwgY3VycjtcbiAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqL1xuICAgIGRvIHtcbiAgICAgIGZpbGwgLT0gaW5jcjtcbiAgICAgIHRhYmxlW25leHQgKyAoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gKGhlcmVfYml0cyA8PCAyNCkgfCAoaGVyZV9vcCA8PCAxNikgfCBoZXJlX3ZhbCB8MDtcbiAgICB9IHdoaWxlIChmaWxsICE9PSAwKTtcblxuICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIDEpO1xuICAgIHdoaWxlIChodWZmICYgaW5jcikge1xuICAgICAgaW5jciA+Pj0gMTtcbiAgICB9XG4gICAgaWYgKGluY3IgIT09IDApIHtcbiAgICAgIGh1ZmYgJj0gaW5jciAtIDE7XG4gICAgICBodWZmICs9IGluY3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh1ZmYgPSAwO1xuICAgIH1cblxuICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqL1xuICAgIHN5bSsrO1xuICAgIGlmICgtLWNvdW50W2xlbl0gPT09IDApIHtcbiAgICAgIGlmIChsZW4gPT09IG1heCkgeyBicmVhazsgfVxuICAgICAgbGVuID0gbGVuc1tsZW5zX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG5cbiAgICAvKiBjcmVhdGUgbmV3IHN1Yi10YWJsZSBpZiBuZWVkZWQgKi9cbiAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9PSBsb3cpIHtcbiAgICAgIC8qIGlmIGZpcnN0IHRpbWUsIHRyYW5zaXRpb24gdG8gc3ViLXRhYmxlcyAqL1xuICAgICAgaWYgKGRyb3AgPT09IDApIHtcbiAgICAgICAgZHJvcCA9IHJvb3Q7XG4gICAgICB9XG5cbiAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi9cbiAgICAgIG5leHQgKz0gbWluOyAgICAgICAgICAgIC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqL1xuXG4gICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi9cbiAgICAgIGN1cnIgPSBsZW4gLSBkcm9wO1xuICAgICAgbGVmdCA9IDEgPDwgY3VycjtcbiAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkge1xuICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTtcbiAgICAgICAgaWYgKGxlZnQgPD0gMCkgeyBicmVhazsgfVxuICAgICAgICBjdXJyKys7XG4gICAgICAgIGxlZnQgPDw9IDE7XG4gICAgICB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbm91Z2ggc3BhY2UgKi9cbiAgICAgIHVzZWQgKz0gMSA8PCBjdXJyO1xuICAgICAgaWYgKCh0eXBlID09PSBMRU5TICYmIHVzZWQgPiBFTk9VR0hfTEVOUykgfHxcbiAgICAgICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqL1xuICAgICAgbG93ID0gaHVmZiAmIG1hc2s7XG4gICAgICAvKnRhYmxlLm9wW2xvd10gPSBjdXJyO1xuICAgICAgdGFibGUuYml0c1tsb3ddID0gcm9vdDtcbiAgICAgIHRhYmxlLnZhbFtsb3ddID0gbmV4dCAtIG9wdHMudGFibGVfaW5kZXg7Ki9cbiAgICAgIHRhYmxlW2xvd10gPSAocm9vdCA8PCAyNCkgfCAoY3VyciA8PCAxNikgfCAobmV4dCAtIHRhYmxlX2luZGV4KSB8MDtcbiAgICB9XG4gIH1cblxuICAvKiBmaWxsIGluIHJlbWFpbmluZyB0YWJsZSBlbnRyeSBpZiBjb2RlIGlzIGluY29tcGxldGUgKGd1YXJhbnRlZWQgdG8gaGF2ZVxuICAgYXQgbW9zdCBvbmUgcmVtYWluaW5nIGVudHJ5LCBzaW5jZSBpZiB0aGUgY29kZSBpcyBpbmNvbXBsZXRlLCB0aGVcbiAgIG1heGltdW0gY29kZSBsZW5ndGggdGhhdCB3YXMgYWxsb3dlZCB0byBnZXQgdGhpcyBmYXIgaXMgb25lIGJpdCkgKi9cbiAgaWYgKGh1ZmYgIT09IDApIHtcbiAgICAvL3RhYmxlLm9wW25leHQgKyBodWZmXSA9IDY0OyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbbmV4dCArIGh1ZmZdID0gbGVuIC0gZHJvcDtcbiAgICAvL3RhYmxlLnZhbFtuZXh0ICsgaHVmZl0gPSAwO1xuICAgIHRhYmxlW25leHQgKyBodWZmXSA9ICgobGVuIC0gZHJvcCkgPDwgMjQpIHwgKDY0IDw8IDE2KSB8MDtcbiAgfVxuXG4gIC8qIHNldCByZXR1cm4gcGFyYW1ldGVycyAqL1xuICAvL29wdHMudGFibGVfaW5kZXggKz0gdXNlZDtcbiAgb3B0cy5iaXRzID0gcm9vdDtcbiAgcmV0dXJuIDA7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbiAgWl9OT19GTFVTSDogICAgICAgICAwLFxuICBaX1BBUlRJQUxfRkxVU0g6ICAgIDEsXG4gIFpfU1lOQ19GTFVTSDogICAgICAgMixcbiAgWl9GVUxMX0ZMVVNIOiAgICAgICAzLFxuICBaX0ZJTklTSDogICAgICAgICAgIDQsXG4gIFpfQkxPQ0s6ICAgICAgICAgICAgNSxcbiAgWl9UUkVFUzogICAgICAgICAgICA2LFxuXG4gIC8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAgKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gICovXG4gIFpfT0s6ICAgICAgICAgICAgICAgMCxcbiAgWl9TVFJFQU1fRU5EOiAgICAgICAxLFxuICBaX05FRURfRElDVDogICAgICAgIDIsXG4gIFpfRVJSTk86ICAgICAgICAgICAtMSxcbiAgWl9TVFJFQU1fRVJST1I6ICAgIC0yLFxuICBaX0RBVEFfRVJST1I6ICAgICAgLTMsXG4gIC8vWl9NRU1fRVJST1I6ICAgICAtNCxcbiAgWl9CVUZfRVJST1I6ICAgICAgIC01LFxuICAvL1pfVkVSU0lPTl9FUlJPUjogLTYsXG5cbiAgLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4gIFpfTk9fQ09NUFJFU1NJT046ICAgICAgICAgMCxcbiAgWl9CRVNUX1NQRUVEOiAgICAgICAgICAgICAxLFxuICBaX0JFU1RfQ09NUFJFU1NJT046ICAgICAgIDksXG4gIFpfREVGQVVMVF9DT01QUkVTU0lPTjogICAtMSxcblxuXG4gIFpfRklMVEVSRUQ6ICAgICAgICAgICAgICAgMSxcbiAgWl9IVUZGTUFOX09OTFk6ICAgICAgICAgICAyLFxuICBaX1JMRTogICAgICAgICAgICAgICAgICAgIDMsXG4gIFpfRklYRUQ6ICAgICAgICAgICAgICAgICAgNCxcbiAgWl9ERUZBVUxUX1NUUkFURUdZOiAgICAgICAwLFxuXG4gIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbiAgWl9CSU5BUlk6ICAgICAgICAgICAgICAgICAwLFxuICBaX1RFWFQ6ICAgICAgICAgICAgICAgICAgIDEsXG4gIC8vWl9BU0NJSTogICAgICAgICAgICAgICAgMSwgLy8gPSBaX1RFWFQgKGRlcHJlY2F0ZWQpXG4gIFpfVU5LTk9XTjogICAgICAgICAgICAgICAgMixcblxuICAvKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbiAgWl9ERUZMQVRFRDogICAgICAgICAgICAgICA4XG4gIC8vWl9OVUxMOiAgICAgICAgICAgICAgICAgbnVsbCAvLyBVc2UgLTEgb3IgbnVsbCBpbmxpbmUsIGRlcGVuZGluZyBvbiB2YXIgdHlwZVxufTtcbiIsIid1c2Ugc3RyaWN0J1xuY29uc3QgV0FSQ1JlY29yZCA9IHJlcXVpcmUoJy4vcmVjb3JkJylcbmNvbnN0IHsgY3JsZiwgYmVnaW4gfSA9IHJlcXVpcmUoJy4vZmllbGRJZGVudGlmaWVycycpXG5cbi8qKlxuICogQHR5cGUge3toZWFkZXI6IHN5bWJvbCwgY29udGVudDE6IHN5bWJvbCwgY29udGVudDI6IHN5bWJvbCwgY29uc3VtZUNSTEZIZWFkZXI6IHN5bWJvbCwgY29uc3VtZUNSTEZDb250ZW50MTogc3ltYm9sLCBjb25zdW1lQ1JMRkNvbnRlbnQyOiBzeW1ib2x9fVxuICovXG5jb25zdCBwYXJzaW5nU3RhdGVzID0ge1xuICBoZWFkZXI6IFN5bWJvbCgnd2FyYy1wYXJzaW5nLWhlYWRlcicpLFxuICBjb250ZW50MTogU3ltYm9sKCd3YXJjLXBhcnNpbmctY29udGVudDEnKSxcbiAgY29udGVudDI6IFN5bWJvbCgnd2FyYy1wYXJzaW5nLWNvbnRlbnQyJyksXG4gIGNvbnN1bWVDUkxGSGVhZGVyOiBTeW1ib2woJ3dhcmMtcGFyc2luZy1jb21zdW1lLWNybGYtaGVhZGVyJyksXG4gIGNvbnN1bWVDUkxGQ29udGVudDE6IFN5bWJvbCgnd2FyYy1wYXJzaW5nLWNvbXN1bWUtY3JsZi1jMScpLFxuICBjb25zdW1lQ1JMRkNvbnRlbnQyOiBTeW1ib2woJ3dhcmMtcGFyc2luZy1jb21zdW1lLWNybGYtYzInKVxufVxuXG4vKipcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmNvbnN0IFdGSUJlZ2luTGVuID0gYmVnaW4ubGVuZ3RoXG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJ9IGxpbmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0p1c3RDUkxGIChsaW5lKSB7XG4gIGlmIChsaW5lLmxlbmd0aCAhPT0gMikgcmV0dXJuIGZhbHNlXG4gIHJldHVybiBsaW5lWzBdID09PSBjcmxmWzBdICYmIGxpbmVbMV0gPT09IGNybGZbMV1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gbGluZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzV0FSQ1JldmlzaW9uTGluZSAobGluZSkge1xuICBpZiAobGluZS5sZW5ndGggPiAxMSkgcmV0dXJuIGZhbHNlXG4gIGxldCBpID0gMFxuICB3aGlsZSAoaSA8IFdGSUJlZ2luTGVuKSB7XG4gICAgaWYgKGJlZ2luW2ldICE9PSBsaW5lW2ldKSByZXR1cm4gZmFsc2VcbiAgICBpICs9IDFcbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIEBkZXNjIFByb2dyZXNzaXZlbHkgYnVpbGRzIHdhcmMgcmVjb3JkcyBieSBjb25zdW1pbmcgdGhlIGZpbGUgbGluZSBieSBsaW5lXG4gKi9cbmNsYXNzIFJlY29yZEJ1aWxkZXIge1xuICAvKipcbiAgICogQGRlc2MgQ3JlYXRlIGEgbmV3IFJlY29yZEJ1aWxkZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7e2hlYWRlcjogQnVmZmVyW10sIGMxOiBCdWZmZXJbXSwgYzI6IEJ1ZmZlcltdfX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX3BhcnRzID0ge1xuICAgICAgaGVhZGVyOiBbXSxcbiAgICAgIGMxOiBbXSxcbiAgICAgIGMyOiBbXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtzeW1ib2x9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLl9wYXJzaW5nU3RhdGUgPSBwYXJzaW5nU3RhdGVzLmhlYWRlclxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFJldHVybnMgYSBuZXcgV0FSQyByZWNvcmQgaWYgb25lIGNhbiBiZSBjcmVhdGVkIG90aGVyd2lzZSByZXR1cm5zIG51bGxcbiAgICogQHJldHVybnMgez9XQVJDUmVjb3JkfVxuICAgKi9cbiAgYnVpbGRSZWNvcmQgKCkge1xuICAgIGlmICh0aGlzLl9wYXJ0cy5oZWFkZXIubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IG5ld1JlY29yZCA9IG5ldyBXQVJDUmVjb3JkKHRoaXMuX3BhcnRzKVxuICAgIHRoaXMuX3BhcnRzLmhlYWRlciA9IFtdXG4gICAgdGhpcy5fcGFydHMuYzEgPSBbXVxuICAgIHRoaXMuX3BhcnRzLmMyID0gW11cbiAgICByZXR1cm4gbmV3UmVjb3JkXG4gIH1cblxuICAvKipcbiAgICogQGRlc2MgQ29uc3VtZXMgYSBsaW5lIG9mIGEgV0FSQyBmaWxlLlxuICAgKiBJZiBhIHJlY29yZCBjYW4gYmUgYnVpbHQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IFdBUkNSZWNvcmQgb3RoZXJ3aXNlIG51bGxcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGxpbmUgLSBUaGUgbGluZSB0byBiZSBjb25zdW1lZFxuICAgKiBAcmV0dXJucyB7P1dBUkNSZWNvcmR9XG4gICAqL1xuICBjb25zdW1lTGluZSAobGluZSkge1xuICAgIGxldCBuZXdSZWNvcmQgPSBudWxsXG4gICAgaWYgKGlzV0FSQ1JldmlzaW9uTGluZShsaW5lKSkge1xuICAgICAgdGhpcy5fcGFyc2luZ1N0YXRlID0gcGFyc2luZ1N0YXRlcy5oZWFkZXJcbiAgICAgIG5ld1JlY29yZCA9IHRoaXMuYnVpbGRSZWNvcmQoKVxuICAgIH1cbiAgICBjb25zdCBpc1NlcCA9IGlzSnVzdENSTEYobGluZSlcbiAgICBzd2l0Y2ggKHRoaXMuX3BhcnNpbmdTdGF0ZSkge1xuICAgICAgY2FzZSBwYXJzaW5nU3RhdGVzLmhlYWRlcjpcbiAgICAgICAgaWYgKCFpc1NlcCkge1xuICAgICAgICAgIHRoaXMuX3BhcnRzLmhlYWRlci5wdXNoKGxpbmUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcGFyc2luZ1N0YXRlID0gcGFyc2luZ1N0YXRlcy5jb25zdW1lQ1JMRkhlYWRlclxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIHBhcnNpbmdTdGF0ZXMuY29uc3VtZUNSTEZIZWFkZXI6XG4gICAgICAgIGlmICghaXNTZXApIHtcbiAgICAgICAgICB0aGlzLl9wYXJ0cy5jMS5wdXNoKGxpbmUpXG4gICAgICAgICAgdGhpcy5fcGFyc2luZ1N0YXRlID0gcGFyc2luZ1N0YXRlcy5jb250ZW50MVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIHBhcnNpbmdTdGF0ZXMuY29udGVudDE6XG4gICAgICAgIGlmICghaXNTZXApIHtcbiAgICAgICAgICB0aGlzLl9wYXJ0cy5jMS5wdXNoKGxpbmUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcGFyc2luZ1N0YXRlID0gcGFyc2luZ1N0YXRlcy5jb25zdW1lQ1JMRkNvbnRlbnQxXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgcGFyc2luZ1N0YXRlcy5jb25zdW1lQ1JMRkNvbnRlbnQxOlxuICAgICAgICBpZiAoIWlzU2VwKSB7XG4gICAgICAgICAgdGhpcy5fcGFydHMuYzIucHVzaChsaW5lKVxuICAgICAgICAgIHRoaXMuX3BhcnNpbmdTdGF0ZSA9IHBhcnNpbmdTdGF0ZXMuY29udGVudDJcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBwYXJzaW5nU3RhdGVzLmNvbnRlbnQyOlxuICAgICAgICBpZiAoIWlzU2VwKSB7XG4gICAgICAgICAgdGhpcy5fcGFydHMuYzIucHVzaChsaW5lKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3BhcnNpbmdTdGF0ZSA9IHBhcnNpbmdTdGF0ZXMuY29uc3VtZUNSTEZDb250ZW50MlxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIHBhcnNpbmdTdGF0ZXMuY29uc3VtZUNSTEZDb250ZW50MjpcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1JlY29yZFxuICB9XG59XG5cbi8qKlxuICogQHR5cGUge1JlY29yZEJ1aWxkZXJ9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gUmVjb3JkQnVpbGRlclxuIiwiJ3VzZSBzdHJpY3QnXG5jb25zdCBDb250ZW50UGFyc2VyID0gcmVxdWlyZSgnLi93YXJjQ29udGVudFBhcnNlcnMnKVxuY29uc3QgeyBXQVJDVHlwZXMgfSA9IHJlcXVpcmUoJy4uL3dyaXRlcnMvd2FyY0ZpZWxkcycpXG5cbi8qKlxuICogQGRlc2MgV0FSQyByZWNvcmQgY2xhc3MuIFRoZSBXQVJDIG5hbWVkIGZpZWxkcyBhcmUgcHJvcGVydGllcyBvbiB0aGlzIG9iamVjdFxuICovXG5jbGFzcyBXQVJDUmVjb3JkIHtcbiAgLyoqXG4gICAqIEBkZXNjIENyZWF0ZSBhIG5ldyBXQVJDUmVjb3JkXG4gICAqIEBwYXJhbSB7e2hlYWRlcjogQnVmZmVyW10sIGMxOiBCdWZmZXJbXSwgYzI6IEJ1ZmZlcltdfX0gd2FyY1BhcnRzIC0gVGhlIHBhcnRzIG9mIGEgd2FyYyByZWNvcmRcbiAgICovXG4gIGNvbnN0cnVjdG9yICh3YXJjUGFydHMpIHtcbiAgICAvKipcbiAgICAgKiBAZGVzYyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcGFyc2VkIFdBUkMgaGVhZGVyXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLndhcmNIZWFkZXIgPSBDb250ZW50UGFyc2VyLnBhcnNlV2FyY1JlY29yZEhlYWRlcih3YXJjUGFydHMuaGVhZGVyKVxuXG4gICAgLyoqXG4gICAgICogQGRlc2MgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcnNlZCByZXF1ZXN0IG9yIHJlc3BvbnNlIHJlY29yZHMgSFRUUCBpbmZvcm1hdGlvblxuICAgICAqIEB0eXBlIHs/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/IHJlc3AucmVxdWVzdC5ib2R5IDogbnVsbFxuXG4gICAgLy8gbm93LCB3cml0ZSBvdXIgcmVxdWVzdCByZWNvcmRcbiAgICBhd2FpdCB0aGlzLndyaXRlUmVxdWVzdFJlY29yZCh0aGlzLl9VUC5ocmVmLCByZXFIVFRQLCBwZClcblxuICAgIC8vIHdyaXRlIHRoZSByZXNwb25zZSAtIHdlIHdvbid0IGhhdmUgYSByZXNwIGlmIHdlJ3ZlIG9ubHkgbWFkZSBhIHJlcXVlc3RcbiAgICBsZXQgcmVzSFRUUCA9IGBIVFRQLzEuMSAke3Jlc3Auc3RhdHVzQ29kZX0gJHtcbiAgICAgIFNUQVRVU19DT0RFU1tyZXNwLnN0YXR1c0NvZGVdXG4gICAgfSAke0NSTEZ9JHtzdHJpbmdpZnlIZWFkZXJzKHJlc3AuaGVhZGVycyl9YFxuICAgIGxldCBib2R5ID0gcmVzcC5ib2R5XG5cbiAgICBpZiAoYm9keSkge1xuICAgICAgcmVzSFRUUCA9IHJlc0hUVFAucmVwbGFjZShub0daLCAnJylcbiAgICAgIHJlc0hUVFAgPSByZXNIVFRQLnJlcGxhY2UoXG4gICAgICAgIHJlcGxhY2VDb250ZW50TGVuLFxuICAgICAgICBgQ29udGVudC1MZW5ndGg6ICR7QnVmZmVyLmJ5dGVMZW5ndGgoYm9keSwgJ3V0ZjgnKX0ke0NSTEZ9YFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoaXMgcmVjb3JkIGhhcyAwIGNvbnRlbnRcbiAgICAgIHJlc0hUVFAgPSByZXNIVFRQLnJlcGxhY2UocmVwbGFjZUNvbnRlbnRMZW4sIGBDb250ZW50LUxlbmd0aDogMCR7Q1JMRn1gKVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLndyaXRlUmVzcG9uc2VSZWNvcmQodGhpcy5fVVAuaHJlZiwgcmVzSFRUUCwgYm9keSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlcXVlc3RMaWJXQVJDR2VuZXJhdG9yXG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +*/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 index 9621507..a349f4e 100644 --- a/index.html +++ b/index.html @@ -6,15 +6,32 @@ let reader = new FileReader(); reader.onloadend = function() { + var inflator, strm, _in, len, pos = 0; + var rstream = new stream.Readable(); rstream._read = () => {}; - rstream.push(new Uint8Array(reader.result)); + + const data = reader.result; + + do { + len = data.byteLength - pos; + _in = new Uint8Array(data, pos, len); + + inflator = new pako.Inflate(); + strm = inflator.strm; + inflator.push(_in, true); + + rstream.push(inflator.result); + + pos += strm.next_in; + } while (strm.avail_in); + rstream.push(null); // attempt to set large window to avoid error - var gunzip = rstream.pipe(zlib.createGunzip({chunkSize: 1024*1024*16, windowBits: 15, flush: zlib.Z_NO_FLUSH, finishFlush: zlib.Z_SYNC_FLUSH})); + //var gunzip = rstream.pipe(zlib.createGunzip({chunkSize: 1024*1024*16, windowBits: 15, flush: zlib.Z_NO_FLUSH, finishFlush: zlib.Z_SYNC_FLUSH})); - const parser = new WARCParser(gunzip); + const parser = new WARCParser(rstream); parser.on('record', record => { console.log(record) }) parser.on('done', () => { console.log('finished') }) parser.on('error', error => { console.error(error) }) diff --git a/index.js b/index.js index 558f48e..5805d12 100755 --- a/index.js +++ b/index.js @@ -119,4 +119,4 @@ if (require('./lib/parsers/_canUseRecordIterator')) { // Testing for Browser exports.stream = require('stream') exports.zlib = require('zlib') - +exports.pako = require('pako') From 17783a1f566fa4a031c9bc7651a2eea67db622a7 Mon Sep 17 00:00:00 2001 From: Ilya Kreymer Date: Sun, 2 Jun 2019 16:52:16 -0700 Subject: [PATCH 3/3] remove extras from index.js --- index.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/index.js b/index.js index 5805d12..4761671 100755 --- a/index.js +++ b/index.js @@ -116,7 +116,4 @@ if (require('./lib/parsers/_canUseRecordIterator')) { exports.recordIterator = require('./lib/parsers/recordterator') } -// Testing for Browser -exports.stream = require('stream') -exports.zlib = require('zlib') -exports.pako = require('pako') +