@datagrok/peptides 1.17.19 → 1.17.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/796.js DELETED
@@ -1,2 +0,0 @@
1
- var peptides;(()=>{"use strict";var t,n,e={7905:(t,n,e)=>{e.d(n,{g:()=>i}),t=e.hmd(t);var r,i=(r="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0,function(t={}){var n,e,i=void 0!==t?t:{};i.ready=new Promise((function(t,r){n=t,e=r}));var o,a=Object.assign({},i),s="object"==typeof window,u="function"==typeof importScripts,c=("object"==typeof process&&"object"==typeof process.versions&&process.versions.node,"");(s||u)&&(u?c=self.location.href:"undefined"!=typeof document&&document.currentScript&&(c=document.currentScript.src),r&&(c=r),c=0!==c.indexOf("blob:")?c.substr(0,c.replace(/[?#].*/,"").lastIndexOf("/")+1):"",u&&(o=t=>{var n=new XMLHttpRequest;return n.open("GET",t,!1),n.responseType="arraybuffer",n.send(null),new Uint8Array(n.response)})),i.print||console.log.bind(console);var f,l,p=i.printErr||console.warn.bind(console);Object.assign(i,a),a=null,i.arguments&&i.arguments,i.thisProgram&&i.thisProgram,i.quit&&i.quit,i.wasmBinary&&(f=i.wasmBinary),i.noExitRuntime,"object"!=typeof WebAssembly&&E("no native wasm support detected");var h,d,m,y=!1;function b(){var t=l.buffer;i.HEAP8=h=new Int8Array(t),i.HEAP16=new Int16Array(t),i.HEAP32=new Int32Array(t),i.HEAPU8=d=new Uint8Array(t),i.HEAPU16=new Uint16Array(t),i.HEAPU32=m=new Uint32Array(t),i.HEAPF32=new Float32Array(t),i.HEAPF64=new Float64Array(t)}var w=[],v=[],g=[],_=0,A=null,x=null;function E(t){i.onAbort&&i.onAbort(t),p(t="Aborted("+t+")"),y=!0,t+=". Build with -sASSERTIONS for more info.";var n=new WebAssembly.RuntimeError(t);throw e(n),n}var R,P;function S(t){return t.startsWith("data:application/octet-stream;base64,")}function U(t){try{if(t==R&&f)return new Uint8Array(f);if(o)return o(t);throw"both async and sync fetching of the wasm failed"}catch(t){E(t)}}function j(t,n,e){return function(t){return f||!s&&!u||"function"!=typeof fetch?Promise.resolve().then((function(){return U(t)})):fetch(t,{credentials:"same-origin"}).then((function(n){if(!n.ok)throw"failed to load wasm binary file at '"+t+"'";return n.arrayBuffer()})).catch((function(){return U(t)}))}(t).then((function(t){return WebAssembly.instantiate(t,n)})).then((function(t){return t})).then(e,(function(t){p("failed to asynchronously prepare wasm: "+t),E(t)}))}function O(t){for(;t.length>0;)t.shift()(i)}function I(t){this.excPtr=t,this.ptr=t-24,this.set_type=function(t){m[this.ptr+4>>2]=t},this.get_type=function(){return m[this.ptr+4>>2]},this.set_destructor=function(t){m[this.ptr+8>>2]=t},this.get_destructor=function(){return m[this.ptr+8>>2]},this.set_caught=function(t){t=t?1:0,h[this.ptr+12>>0]=t},this.get_caught=function(){return 0!=h[this.ptr+12>>0]},this.set_rethrown=function(t){t=t?1:0,h[this.ptr+13>>0]=t},this.get_rethrown=function(){return 0!=h[this.ptr+13>>0]},this.init=function(t,n){this.set_adjusted_ptr(0),this.set_type(t),this.set_destructor(n)},this.set_adjusted_ptr=function(t){m[this.ptr+16>>2]=t},this.get_adjusted_ptr=function(){return m[this.ptr+16>>2]},this.get_exception_ptr=function(){if(L(this.get_type()))return m[this.excPtr>>2];var t=this.get_adjusted_ptr();return 0!==t?t:this.excPtr}}function C(t){var n=l.buffer;try{return l.grow(t-n.byteLength+65535>>>16),b(),1}catch(t){}}function H(t){return i["_"+t]}S(R="wasmDbscan.wasm")||(P=R,R=i.locateFile?i.locateFile(P,c):c+P);var T="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function k(t,n,e,r,i){var o={string:t=>{var n=0;return null!=t&&0!==t&&(n=function(t){var n=function(t){for(var n=0,e=0;e<t.length;++e){var r=t.charCodeAt(e);r<=127?n++:r<=2047?n+=2:r>=55296&&r<=57343?(n+=4,++e):n+=3}return n}(t)+1,e=B(n);return function(t,n,e){!function(t,n,e,r){if(!(r>0))return 0;for(var i=e+r-1,o=0;o<t.length;++o){var a=t.charCodeAt(o);if(a>=55296&&a<=57343&&(a=65536+((1023&a)<<10)|1023&t.charCodeAt(++o)),a<=127){if(e>=i)break;n[e++]=a}else if(a<=2047){if(e+1>=i)break;n[e++]=192|a>>6,n[e++]=128|63&a}else if(a<=65535){if(e+2>=i)break;n[e++]=224|a>>12,n[e++]=128|a>>6&63,n[e++]=128|63&a}else{if(e+3>=i)break;n[e++]=240|a>>18,n[e++]=128|a>>12&63,n[e++]=128|a>>6&63,n[e++]=128|63&a}}n[e]=0}(t,d,n,e)}(t,e,n),e}(t)),n},array:t=>{var n,e,r=B(t.length);return n=t,e=r,h.set(n,e),r}},a=H(t),s=[],u=0;if(r)for(var c=0;c<r.length;c++){var f=o[e[c]];f?(0===u&&(u=W()),s[c]=f(r[c])):s[c]=r[c]}var l=a.apply(null,s);return function(t){return 0!==u&&D(u),function(t){return"string"===n?(e=t)?function(t,n,e){for(var r=n+e,i=n;t[i]&&!(i>=r);)++i;if(i-n>16&&t.buffer&&T)return T.decode(t.subarray(n,i));for(var o="";n<i;){var a=t[n++];if(128&a){var s=63&t[n++];if(192!=(224&a)){var u=63&t[n++];if((a=224==(240&a)?(15&a)<<12|s<<6|u:(7&a)<<18|s<<12|u<<6|63&t[n++])<65536)o+=String.fromCharCode(a);else{var c=a-65536;o+=String.fromCharCode(55296|c>>10,56320|1023&c)}}else o+=String.fromCharCode((31&a)<<6|s)}else o+=String.fromCharCode(a)}return o}(d,e,r):"":"boolean"===n?Boolean(t):t;var e,r}(t)}(l)}var F,M={__cxa_throw:function(t,n,e){throw new I(t).init(n,e),t},abort:function(){E("")},emscripten_memcpy_big:function(t,n,e){d.copyWithin(t,n,n+e)},emscripten_resize_heap:function(t){var n,e=d.length,r=2147483648;if((t>>>=0)>r)return!1;for(var i=1;i<=4;i*=2){var o=e*(1+.2/i);if(o=Math.min(o,t+100663296),C(Math.min(r,(n=Math.max(t,o))+(65536-n%65536)%65536)))return!0}return!1}},W=(function(){var t,n,r,o,a={env:M,wasi_snapshot_preview1:M};function s(t,n){var e,r=t.exports;return i.asm=r,l=i.asm.memory,b(),i.asm.__indirect_function_table,e=i.asm.__wasm_call_ctors,v.unshift(e),function(t){if(_--,i.monitorRunDependencies&&i.monitorRunDependencies(_),0==_&&(null!==A&&(clearInterval(A),A=null),x)){var n=x;x=null,n()}}(),r}if(_++,i.monitorRunDependencies&&i.monitorRunDependencies(_),i.instantiateWasm)try{return i.instantiateWasm(a,s)}catch(t){p("Module.instantiateWasm callback failed with error: "+t),e(t)}(t=f,n=R,r=a,o=function(t){s(t.instance)},t||"function"!=typeof WebAssembly.instantiateStreaming||S(n)||"function"!=typeof fetch?j(n,r,o):fetch(n,{credentials:"same-origin"}).then((function(t){return WebAssembly.instantiateStreaming(t,r).then(o,(function(t){return p("wasm streaming compile failed: "+t),p("falling back to ArrayBuffer instantiation"),j(n,r,o)}))}))).catch(e)}(),i._dbscan=function(){return(i._dbscan=i.asm.dbscan).apply(null,arguments)},i._malloc=function(){return(i._malloc=i.asm.malloc).apply(null,arguments)},i._free=function(){return(i._free=i.asm.free).apply(null,arguments)},function(){return(W=i.asm.stackSave).apply(null,arguments)}),D=function(){return(D=i.asm.stackRestore).apply(null,arguments)},B=function(){return(B=i.asm.stackAlloc).apply(null,arguments)},L=function(){return(L=i.asm.__cxa_is_pointer_type).apply(null,arguments)};function q(){function t(){F||(F=!0,i.calledRun=!0,y||(O(v),n(i),i.onRuntimeInitialized&&i.onRuntimeInitialized(),function(){if(i.postRun)for("function"==typeof i.postRun&&(i.postRun=[i.postRun]);i.postRun.length;)t=i.postRun.shift(),g.unshift(t);var t;O(g)}()))}_>0||(function(){if(i.preRun)for("function"==typeof i.preRun&&(i.preRun=[i.preRun]);i.preRun.length;)t=i.preRun.shift(),w.unshift(t);var t;O(w)}(),_>0||(i.setStatus?(i.setStatus("Running..."),setTimeout((function(){setTimeout((function(){i.setStatus("")}),1),t()}),1)):t()))}if(i.ccall=k,i.cwrap=function(t,n,e,r){var i=!e||e.every((t=>"number"===t||"boolean"===t));return"string"!==n&&i&&!r?H(t):function(){return k(t,n,e,arguments)}},x=function t(){F||q(),F||(x=t)},i.preInit)for("function"==typeof i.preInit&&(i.preInit=[i.preInit]);i.preInit.length>0;)i.preInit.pop()();return q(),t.ready});"object"==typeof exports?t.exports=i:"function"==typeof define&&e.amdO?define([],(function(){return i})):"object"==typeof exports&&(exports.exportCppDbscanLib=i)},3962:(t,n,e)=>{t.exports=e.p+"9a8fbf37666e32487835.wasm"}},r={};function i(t){var n=r[t];if(void 0!==n)return n.exports;var o=r[t]={id:t,loaded:!1,exports:{}};return e[t](o,o.exports,i),o.loaded=!0,o.exports}i.m=e,i.amdO={},i.d=(t,n)=>{for(var e in n)i.o(n,e)&&!i.o(t,e)&&Object.defineProperty(t,e,{enumerable:!0,get:n[e]})},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),i.hmd=t=>((t=Object.create(t)).children||(t.children=[]),Object.defineProperty(t,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+t.id)}}),t),i.o=(t,n)=>Object.prototype.hasOwnProperty.call(t,n),(()=>{var t;i.g.importScripts&&(t=i.g.location+"");var n=i.g.document;if(!t&&n&&(n.currentScript&&(t=n.currentScript.src),!t)){var e=n.getElementsByTagName("script");if(e.length)for(var r=e.length-1;r>-1&&!t;)t=e[r--].src}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),i.p=t})(),i.b=self.location+"",t=i(7905),n=function(t,n,e,r){return new(e||(e=Promise))((function(i,o){function a(t){try{u(r.next(t))}catch(t){o(t)}}function s(t){try{u(r.throw(t))}catch(t){o(t)}}function u(t){var n;t.done?i(t.value):(n=t.value,n instanceof e?n:new e((function(t){t(n)}))).then(a,s)}u((r=r.apply(t,n||[])).next())}))},onmessage=e=>{const{embedX:r,embedY:o,epsilon:a,minPts:s}=e.data,u={};n(void 0,void 0,void 0,(function*(){try{const n=yield async function(n,e,r,o){const a=new URL(i(3962),i.b).href,s=a.substring(0,a.lastIndexOf("/")+1)+"wasmDbscan.wasm";let u;try{u=await(0,t.g)({locateFile:()=>a,printErr:t=>{}})}catch(n){try{u=await(0,t.g)({locateFile:()=>s,printErr:t=>{}})}catch(t){throw console.error(t),new Error("Unable to load wasm file for dbscan")}}const c=u.cwrap("dbscan","null",["number","number","number","number","number","number"]),f=Float32Array.BYTES_PER_ELEMENT*n.length,l=u._malloc(f),p=u._malloc(f),h=new Uint8Array(u.HEAPU8.buffer,l,f);h.set(new Uint8Array(n.buffer));const d=new Uint8Array(u.HEAPU8.buffer,p,f);d.set(new Uint8Array(e.buffer));const m=u._malloc(f),y=new Uint8Array(u.HEAPU8.buffer,m,f);c(l,p,n.length,r,o,m);const b=new Int32Array(y.buffer,y.byteOffset,n.length);return u._free(h.byteOffset),u._free(d.byteOffset),u._free(y.byteOffset),b}(r,o,a,s);u.clusters=n,postMessage(u)}catch(t){u.error=t,postMessage(u)}}))},peptides={}})();
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QixJQUFJcE8sV0FBV21PLEVBQVl0TyxPQUFRc08sRUFBWUUsV0FBWTVCLEVBQU9wSyxRQUl4RixPQUhBK0ssRUFBYWtCLE1BQU1OLEVBQU1LLFlBQ3pCakIsRUFBYWtCLE1BQU1MLEVBQU1JLFlBQ3pCakIsRUFBYWtCLE1BQU1ILEVBQVlFLFlBQ3hCRCxDQUNYLENWckJtQ0csQ0FBTzlCLEVBQVFDLEVBQVFDLEVBQVNDLEdBQ3ZEQyxFQUFLQyxTQUFXQSxFQUNoQjBCLFlBQVkzQixFQUNoQixDQUNBLE1BQU9qTSxHQUNIaU0sRUFBS1csTUFBUTVNLEVBQ2I0TixZQUFZM0IsRUFDaEIsQ0FDSixHQUFLLEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wZXB0aWRlcy8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL2Ric2Nhbi93YXNtL2NsdXN0ZXJpbmctd29ya2VyLmpzIiwid2VicGFjazovL3BlcHRpZGVzLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvZGJzY2FuL3dhc20vd2FzbURic2Nhbi5qcyIsIndlYnBhY2s6Ly9wZXB0aWRlcy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9wZXB0aWRlcy93ZWJwYWNrL3J1bnRpbWUvYW1kIG9wdGlvbnMiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3BlcHRpZGVzL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvd2VicGFjay9ydW50aW1lL2hhcm1vbnkgbW9kdWxlIGRlY29yYXRvciIsIndlYnBhY2s6Ly9wZXB0aWRlcy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3BlcHRpZGVzL3dlYnBhY2svcnVudGltZS9wdWJsaWNQYXRoIiwid2VicGFjazovL3BlcHRpZGVzL3dlYnBhY2svcnVudGltZS9pbXBvcnRTY3JpcHRzIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy9kYnNjYW4vd2FzbS9kYnNjYW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBkYnNjYW4gfSBmcm9tICcuL2Ric2Nhbic7XG5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB7IGVtYmVkWCwgZW1iZWRZLCBlcHNpbG9uLCBtaW5QdHMgfSA9IGV2ZW50LmRhdGE7XG4gICAgY29uc3QgZGF0YSA9IHt9O1xuICAgICgoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNsdXN0ZXJzID0geWllbGQgZGJzY2FuKGVtYmVkWCwgZW1iZWRZLCBlcHNpbG9uLCBtaW5QdHMpO1xuICAgICAgICAgICAgZGF0YS5jbHVzdGVycyA9IGNsdXN0ZXJzO1xuICAgICAgICAgICAgcG9zdE1lc3NhZ2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRhdGEuZXJyb3IgPSBlO1xuICAgICAgICAgICAgcG9zdE1lc3NhZ2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICB9KSkoKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jbHVzdGVyaW5nLXdvcmtlci5qcy5tYXAiLCJcclxuZXhwb3J0IHZhciBleHBvcnRDcHBEYnNjYW5MaWIgPSAoKCkgPT4ge1xyXG4gIHZhciBfc2NyaXB0RGlyID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMgOiB1bmRlZmluZWQ7XHJcbiAgXHJcbiAgcmV0dXJuIChcclxuZnVuY3Rpb24oZXhwb3J0Q3BwRGJzY2FuTGliID0ge30pICB7XHJcblxyXG4vLyBpbmNsdWRlOiBzaGVsbC5qc1xyXG4vLyBUaGUgTW9kdWxlIG9iamVjdDogT3VyIGludGVyZmFjZSB0byB0aGUgb3V0c2lkZSB3b3JsZC4gV2UgaW1wb3J0XHJcbi8vIGFuZCBleHBvcnQgdmFsdWVzIG9uIGl0LiBUaGVyZSBhcmUgdmFyaW91cyB3YXlzIE1vZHVsZSBjYW4gYmUgdXNlZDpcclxuLy8gMS4gTm90IGRlZmluZWQuIFdlIGNyZWF0ZSBpdCBoZXJlXHJcbi8vIDIuIEEgZnVuY3Rpb24gcGFyYW1ldGVyLCBmdW5jdGlvbihNb2R1bGUpIHsgLi5nZW5lcmF0ZWQgY29kZS4uIH1cclxuLy8gMy4gcHJlLXJ1biBhcHBlbmRlZCBpdCwgdmFyIE1vZHVsZSA9IHt9OyAuLmdlbmVyYXRlZCBjb2RlLi5cclxuLy8gNC4gRXh0ZXJuYWwgc2NyaXB0IHRhZyBkZWZpbmVzIHZhciBNb2R1bGUuXHJcbi8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgTW9kdWxlIGFscmVhZHkgZXhpc3RzIChlLmcuIGNhc2UgMyBhYm92ZSkuXHJcbi8vIFN1YnN0aXR1dGlvbiB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYWN0dWFsIGNvZGUgb24gbGF0ZXIgc3RhZ2Ugb2YgdGhlIGJ1aWxkLFxyXG4vLyB0aGlzIHdheSBDbG9zdXJlIENvbXBpbGVyIHdpbGwgbm90IG1hbmdsZSBpdCAoZS5nLiBjYXNlIDQuIGFib3ZlKS5cclxuLy8gTm90ZSB0aGF0IGlmIHlvdSB3YW50IHRvIHJ1biBjbG9zdXJlLCBhbmQgYWxzbyB0byB1c2UgTW9kdWxlXHJcbi8vIGFmdGVyIHRoZSBnZW5lcmF0ZWQgY29kZSwgeW91IHdpbGwgbmVlZCB0byBkZWZpbmUgICB2YXIgTW9kdWxlID0ge307XHJcbi8vIGJlZm9yZSB0aGUgY29kZS4gVGhlbiB0aGF0IG9iamVjdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGNvZGUsIGFuZCB5b3VcclxuLy8gY2FuIGNvbnRpbnVlIHRvIHVzZSBNb2R1bGUgYWZ0ZXJ3YXJkcyBhcyB3ZWxsLlxyXG52YXIgTW9kdWxlID0gdHlwZW9mIGV4cG9ydENwcERic2NhbkxpYiAhPSAndW5kZWZpbmVkJyA/IGV4cG9ydENwcERic2NhbkxpYiA6IHt9O1xyXG5cclxuLy8gU2V0IHVwIHRoZSBwcm9taXNlIHRoYXQgaW5kaWNhdGVzIHRoZSBNb2R1bGUgaXMgaW5pdGlhbGl6ZWRcclxudmFyIHJlYWR5UHJvbWlzZVJlc29sdmUsIHJlYWR5UHJvbWlzZVJlamVjdDtcclxuTW9kdWxlWydyZWFkeSddID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgcmVhZHlQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7XHJcbiAgcmVhZHlQcm9taXNlUmVqZWN0ID0gcmVqZWN0O1xyXG59KTtcclxuXHJcbi8vIC0tcHJlLWpzZXMgYXJlIGVtaXR0ZWQgYWZ0ZXIgdGhlIE1vZHVsZSBpbnRlZ3JhdGlvbiBjb2RlLCBzbyB0aGF0IHRoZXkgY2FuXHJcbi8vIHJlZmVyIHRvIE1vZHVsZSAoaWYgdGhleSBjaG9vc2U7IHRoZXkgY2FuIGFsc28gZGVmaW5lIE1vZHVsZSlcclxuXHJcblxyXG4vLyBTb21ldGltZXMgYW4gZXhpc3RpbmcgTW9kdWxlIG9iamVjdCBleGlzdHMgd2l0aCBwcm9wZXJ0aWVzXHJcbi8vIG1lYW50IHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBtb2R1bGUgZnVuY3Rpb25hbGl0eS4gSGVyZVxyXG4vLyB3ZSBjb2xsZWN0IHRob3NlIHByb3BlcnRpZXMgYW5kIHJlYXBwbHkgX2FmdGVyXyB3ZSBjb25maWd1cmVcclxuLy8gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQncyBkZWZhdWx0cyB0byBhdm9pZCBoYXZpbmcgdG8gYmUgc29cclxuLy8gZGVmZW5zaXZlIGR1cmluZyBpbml0aWFsaXphdGlvbi5cclxudmFyIG1vZHVsZU92ZXJyaWRlcyA9IE9iamVjdC5hc3NpZ24oe30sIE1vZHVsZSk7XHJcblxyXG52YXIgYXJndW1lbnRzXyA9IFtdO1xyXG52YXIgdGhpc1Byb2dyYW0gPSAnLi90aGlzLnByb2dyYW0nO1xyXG52YXIgcXVpdF8gPSAoc3RhdHVzLCB0b1Rocm93KSA9PiB7XHJcbiAgdGhyb3cgdG9UaHJvdztcclxufTtcclxuXHJcbi8vIERldGVybWluZSB0aGUgcnVudGltZSBlbnZpcm9ubWVudCB3ZSBhcmUgaW4uIFlvdSBjYW4gY3VzdG9taXplIHRoaXMgYnlcclxuLy8gc2V0dGluZyB0aGUgRU5WSVJPTk1FTlQgc2V0dGluZyBhdCBjb21waWxlIHRpbWUgKHNlZSBzZXR0aW5ncy5qcykuXHJcblxyXG4vLyBBdHRlbXB0IHRvIGF1dG8tZGV0ZWN0IHRoZSBlbnZpcm9ubWVudFxyXG52YXIgRU5WSVJPTk1FTlRfSVNfV0VCID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JztcclxudmFyIEVOVklST05NRU5UX0lTX1dPUktFUiA9IHR5cGVvZiBpbXBvcnRTY3JpcHRzID09ICdmdW5jdGlvbic7XHJcbi8vIE4uYi4gRWxlY3Ryb24uanMgZW52aXJvbm1lbnQgaXMgc2ltdWx0YW5lb3VzbHkgYSBOT0RFLWVudmlyb25tZW50LCBidXRcclxuLy8gYWxzbyBhIHdlYiBlbnZpcm9ubWVudC5cclxudmFyIEVOVklST05NRU5UX0lTX05PREUgPSB0eXBlb2YgcHJvY2VzcyA9PSAnb2JqZWN0JyAmJiB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyA9PSAnb2JqZWN0JyAmJiB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlID09ICdzdHJpbmcnO1xyXG52YXIgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSAhRU5WSVJPTk1FTlRfSVNfV0VCICYmICFFTlZJUk9OTUVOVF9JU19OT0RFICYmICFFTlZJUk9OTUVOVF9JU19XT1JLRVI7XHJcblxyXG4vLyBgL2Agc2hvdWxkIGJlIHByZXNlbnQgYXQgdGhlIGVuZCBpZiBgc2NyaXB0RGlyZWN0b3J5YCBpcyBub3QgZW1wdHlcclxudmFyIHNjcmlwdERpcmVjdG9yeSA9ICcnO1xyXG5mdW5jdGlvbiBsb2NhdGVGaWxlKHBhdGgpIHtcclxuICBpZiAoTW9kdWxlWydsb2NhdGVGaWxlJ10pIHtcclxuICAgIHJldHVybiBNb2R1bGVbJ2xvY2F0ZUZpbGUnXShwYXRoLCBzY3JpcHREaXJlY3RvcnkpO1xyXG4gIH1cclxuICByZXR1cm4gc2NyaXB0RGlyZWN0b3J5ICsgcGF0aDtcclxufVxyXG5cclxuLy8gSG9va3MgdGhhdCBhcmUgaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgaW4gZGlmZmVyZW50IHJ1bnRpbWUgZW52aXJvbm1lbnRzLlxyXG52YXIgcmVhZF8sXHJcbiAgICByZWFkQXN5bmMsXHJcbiAgICByZWFkQmluYXJ5LFxyXG4gICAgc2V0V2luZG93VGl0bGU7XHJcblxyXG4vLyBOb3RlIHRoYXQgdGhpcyBpbmNsdWRlcyBOb2RlLmpzIHdvcmtlcnMgd2hlbiByZWxldmFudCAocHRocmVhZHMgaXMgZW5hYmxlZCkuXHJcbi8vIE5vZGUuanMgd29ya2VycyBhcmUgZGV0ZWN0ZWQgYXMgYSBjb21iaW5hdGlvbiBvZiBFTlZJUk9OTUVOVF9JU19XT1JLRVIgYW5kXHJcbi8vIEVOVklST05NRU5UX0lTX05PREUuXHJcbmlmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7XHJcbiAgaWYgKEVOVklST05NRU5UX0lTX1dPUktFUikgeyAvLyBDaGVjayB3b3JrZXIsIG5vdCB3ZWIsIHNpbmNlIHdpbmRvdyBjb3VsZCBiZSBwb2x5ZmlsbGVkXHJcbiAgICBzY3JpcHREaXJlY3RvcnkgPSBzZWxmLmxvY2F0aW9uLmhyZWY7XHJcbiAgfSBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgIT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCkgeyAvLyB3ZWJcclxuICAgIHNjcmlwdERpcmVjdG9yeSA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjO1xyXG4gIH1cclxuICAvLyBXaGVuIE1PRFVMQVJJWkUsIHRoaXMgSlMgbWF5IGJlIGV4ZWN1dGVkIGxhdGVyLCBhZnRlciBkb2N1bWVudC5jdXJyZW50U2NyaXB0XHJcbiAgLy8gaXMgZ29uZSwgc28gd2Ugc2F2ZWQgaXQsIGFuZCB3ZSB1c2UgaXQgaGVyZSBpbnN0ZWFkIG9mIGFueSBvdGhlciBpbmZvLlxyXG4gIGlmIChfc2NyaXB0RGlyKSB7XHJcbiAgICBzY3JpcHREaXJlY3RvcnkgPSBfc2NyaXB0RGlyO1xyXG4gIH1cclxuICAvLyBibG9iIHVybHMgbG9vayBsaWtlIGJsb2I6aHR0cDovL3NpdGUuY29tL2V0Yy9ldGMgYW5kIHdlIGNhbm5vdCBpbmZlciBhbnl0aGluZyBmcm9tIHRoZW0uXHJcbiAgLy8gb3RoZXJ3aXNlLCBzbGljZSBvZmYgdGhlIGZpbmFsIHBhcnQgb2YgdGhlIHVybCB0byBmaW5kIHRoZSBzY3JpcHQgZGlyZWN0b3J5LlxyXG4gIC8vIGlmIHNjcmlwdERpcmVjdG9yeSBkb2VzIG5vdCBjb250YWluIGEgc2xhc2gsIGxhc3RJbmRleE9mIHdpbGwgcmV0dXJuIC0xLFxyXG4gIC8vIGFuZCBzY3JpcHREaXJlY3Rvcnkgd2lsbCBjb3JyZWN0bHkgYmUgcmVwbGFjZWQgd2l0aCBhbiBlbXB0eSBzdHJpbmcuXHJcbiAgLy8gSWYgc2NyaXB0RGlyZWN0b3J5IGNvbnRhaW5zIGEgcXVlcnkgKHN0YXJ0aW5nIHdpdGggPykgb3IgYSBmcmFnbWVudCAoc3RhcnRpbmcgd2l0aCAjKSxcclxuICAvLyB0aGV5IGFyZSByZW1vdmVkIGJlY2F1c2UgdGhleSBjb3VsZCBjb250YWluIGEgc2xhc2guXHJcbiAgaWYgKHNjcmlwdERpcmVjdG9yeS5pbmRleE9mKCdibG9iOicpICE9PSAwKSB7XHJcbiAgICBzY3JpcHREaXJlY3RvcnkgPSBzY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsIHNjcmlwdERpcmVjdG9yeS5yZXBsYWNlKC9bPyNdLiovLCBcIlwiKS5sYXN0SW5kZXhPZignLycpKzEpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBzY3JpcHREaXJlY3RvcnkgPSAnJztcclxuICB9XHJcblxyXG4gIC8vIERpZmZlcmVudGlhdGUgdGhlIFdlYiBXb3JrZXIgZnJvbSB0aGUgTm9kZSBXb3JrZXIgY2FzZSwgYXMgcmVhZGluZyBtdXN0XHJcbiAgLy8gYmUgZG9uZSBkaWZmZXJlbnRseS5cclxuICB7XHJcbi8vIGluY2x1ZGU6IHdlYl9vcl93b3JrZXJfc2hlbGxfcmVhZC5qc1xyXG5yZWFkXyA9ICh1cmwpID0+IHtcclxuICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICB4aHIub3BlbignR0VUJywgdXJsLCBmYWxzZSk7XHJcbiAgICAgIHhoci5zZW5kKG51bGwpO1xyXG4gICAgICByZXR1cm4geGhyLnJlc3BvbnNlVGV4dDtcclxuICB9XHJcblxyXG4gIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHtcclxuICAgIHJlYWRCaW5hcnkgPSAodXJsKSA9PiB7XHJcbiAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIGZhbHNlKTtcclxuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcclxuICAgICAgICB4aHIuc2VuZChudWxsKTtcclxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoLyoqIEB0eXBleyFBcnJheUJ1ZmZlcn0gKi8oeGhyLnJlc3BvbnNlKSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcmVhZEFzeW5jID0gKHVybCwgb25sb2FkLCBvbmVycm9yKSA9PiB7XHJcbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICB4aHIub3BlbignR0VUJywgdXJsLCB0cnVlKTtcclxuICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xyXG4gICAgeGhyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwIHx8ICh4aHIuc3RhdHVzID09IDAgJiYgeGhyLnJlc3BvbnNlKSkgeyAvLyBmaWxlIFVSTHMgY2FuIHJldHVybiAwXHJcbiAgICAgICAgb25sb2FkKHhoci5yZXNwb25zZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIG9uZXJyb3IoKTtcclxuICAgIH07XHJcbiAgICB4aHIub25lcnJvciA9IG9uZXJyb3I7XHJcbiAgICB4aHIuc2VuZChudWxsKTtcclxuICB9XHJcblxyXG4vLyBlbmQgaW5jbHVkZTogd2ViX29yX3dvcmtlcl9zaGVsbF9yZWFkLmpzXHJcbiAgfVxyXG5cclxuICBzZXRXaW5kb3dUaXRsZSA9ICh0aXRsZSkgPT4gZG9jdW1lbnQudGl0bGUgPSB0aXRsZTtcclxufSBlbHNlXHJcbntcclxufVxyXG5cclxudmFyIG91dCA9IE1vZHVsZVsncHJpbnQnXSB8fCBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xyXG52YXIgZXJyID0gTW9kdWxlWydwcmludEVyciddIHx8IGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO1xyXG5cclxuLy8gTWVyZ2UgYmFjayBpbiB0aGUgb3ZlcnJpZGVzXHJcbk9iamVjdC5hc3NpZ24oTW9kdWxlLCBtb2R1bGVPdmVycmlkZXMpO1xyXG4vLyBGcmVlIHRoZSBvYmplY3QgaGllcmFyY2h5IGNvbnRhaW5lZCBpbiB0aGUgb3ZlcnJpZGVzLCB0aGlzIGxldHMgdGhlIEdDXHJcbi8vIHJlY2xhaW0gZGF0YSB1c2VkIGUuZy4gaW4gbWVtb3J5SW5pdGlhbGl6ZXJSZXF1ZXN0LCB3aGljaCBpcyBhIGxhcmdlIHR5cGVkIGFycmF5LlxyXG5tb2R1bGVPdmVycmlkZXMgPSBudWxsO1xyXG5cclxuLy8gRW1pdCBjb2RlIHRvIGhhbmRsZSBleHBlY3RlZCB2YWx1ZXMgb24gdGhlIE1vZHVsZSBvYmplY3QuIFRoaXMgYXBwbGllcyBNb2R1bGUueFxyXG4vLyB0byB0aGUgcHJvcGVyIGxvY2FsIHguIFRoaXMgaGFzIHR3byBiZW5lZml0czogZmlyc3QsIHdlIG9ubHkgZW1pdCBpdCBpZiBpdCBpc1xyXG4vLyBleHBlY3RlZCB0byBhcnJpdmUsIGFuZCBzZWNvbmQsIGJ5IHVzaW5nIGEgbG9jYWwgZXZlcnl3aGVyZSBlbHNlIHRoYXQgY2FuIGJlXHJcbi8vIG1pbmlmaWVkLlxyXG5cclxuaWYgKE1vZHVsZVsnYXJndW1lbnRzJ10pIGFyZ3VtZW50c18gPSBNb2R1bGVbJ2FyZ3VtZW50cyddO1xyXG5cclxuaWYgKE1vZHVsZVsndGhpc1Byb2dyYW0nXSkgdGhpc1Byb2dyYW0gPSBNb2R1bGVbJ3RoaXNQcm9ncmFtJ107XHJcblxyXG5pZiAoTW9kdWxlWydxdWl0J10pIHF1aXRfID0gTW9kdWxlWydxdWl0J107XHJcblxyXG4vLyBwZXJmb3JtIGFzc2VydGlvbnMgaW4gc2hlbGwuanMgYWZ0ZXIgd2Ugc2V0IHVwIG91dCgpIGFuZCBlcnIoKSwgYXMgb3RoZXJ3aXNlIGlmIGFuIGFzc2VydGlvbiBmYWlscyBpdCBjYW5ub3QgcHJpbnQgdGhlIG1lc3NhZ2VcclxuXHJcblxyXG4vLyBlbmQgaW5jbHVkZTogc2hlbGwuanNcclxuLy8gaW5jbHVkZTogcHJlYW1ibGUuanNcclxuLy8gPT09IFByZWFtYmxlIGxpYnJhcnkgc3R1ZmYgPT09XHJcblxyXG4vLyBEb2N1bWVudGF0aW9uIGZvciB0aGUgcHVibGljIEFQSXMgZGVmaW5lZCBpbiB0aGlzIGZpbGUgbXVzdCBiZSB1cGRhdGVkIGluOlxyXG4vLyAgICBzaXRlL3NvdXJjZS9kb2NzL2FwaV9yZWZlcmVuY2UvcHJlYW1ibGUuanMucnN0XHJcbi8vIEEgcHJlYnVpbHQgbG9jYWwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgYXQ6XHJcbi8vICAgIHNpdGUvYnVpbGQvdGV4dC9kb2NzL2FwaV9yZWZlcmVuY2UvcHJlYW1ibGUuanMudHh0XHJcbi8vIFlvdSBjYW4gYWxzbyBidWlsZCBkb2NzIGxvY2FsbHkgYXMgSFRNTCBvciBvdGhlciBmb3JtYXRzIGluIHNpdGUvXHJcbi8vIEFuIG9ubGluZSBIVE1MIHZlcnNpb24gKHdoaWNoIG1heSBiZSBvZiBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIEVtc2NyaXB0ZW4pXHJcbi8vICAgIGlzIHVwIGF0IGh0dHA6Ly9rcmlwa2VuLmdpdGh1Yi5pby9lbXNjcmlwdGVuLXNpdGUvZG9jcy9hcGlfcmVmZXJlbmNlL3ByZWFtYmxlLmpzLmh0bWxcclxuXHJcbnZhciB3YXNtQmluYXJ5O1xyXG5pZiAoTW9kdWxlWyd3YXNtQmluYXJ5J10pIHdhc21CaW5hcnkgPSBNb2R1bGVbJ3dhc21CaW5hcnknXTtcclxudmFyIG5vRXhpdFJ1bnRpbWUgPSBNb2R1bGVbJ25vRXhpdFJ1bnRpbWUnXSB8fCB0cnVlO1xyXG5cclxuaWYgKHR5cGVvZiBXZWJBc3NlbWJseSAhPSAnb2JqZWN0Jykge1xyXG4gIGFib3J0KCdubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkJyk7XHJcbn1cclxuXHJcbi8vIFdhc20gZ2xvYmFsc1xyXG5cclxudmFyIHdhc21NZW1vcnk7XHJcblxyXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuLy8gUnVudGltZSBlc3NlbnRpYWxzXHJcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuLy8gd2hldGhlciB3ZSBhcmUgcXVpdHRpbmcgdGhlIGFwcGxpY2F0aW9uLiBubyBjb2RlIHNob3VsZCBydW4gYWZ0ZXIgdGhpcy5cclxuLy8gc2V0IGluIGV4aXQoKSBhbmQgYWJvcnQoKVxyXG52YXIgQUJPUlQgPSBmYWxzZTtcclxuXHJcbi8vIHNldCBieSBleGl0KCkgYW5kIGFib3J0KCkuICBQYXNzZWQgdG8gJ29uRXhpdCcgaGFuZGxlci5cclxuLy8gTk9URTogVGhpcyBpcyBhbHNvIHVzZWQgYXMgdGhlIHByb2Nlc3MgcmV0dXJuIGNvZGUgY29kZSBpbiBzaGVsbCBlbnZpcm9ubWVudHNcclxuLy8gYnV0IG9ubHkgd2hlbiBub0V4aXRSdW50aW1lIGlzIGZhbHNlLlxyXG52YXIgRVhJVFNUQVRVUztcclxuXHJcbi8qKiBAdHlwZSB7ZnVuY3Rpb24oKiwgc3RyaW5nPSl9ICovXHJcbmZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIHRleHQpIHtcclxuICBpZiAoIWNvbmRpdGlvbikge1xyXG4gICAgLy8gVGhpcyBidWlsZCB3YXMgY3JlYXRlZCB3aXRob3V0IEFTU0VSVElPTlMgZGVmaW5lZC4gIGBhc3NlcnQoKWAgc2hvdWxkIG5vdFxyXG4gICAgLy8gZXZlciBiZSBjYWxsZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uIGJ1dCBpbiBjYXNlIHRoZXJlIGFyZSBjYWxsZXJzIGluXHJcbiAgICAvLyB0aGUgd2lsZCBsZWF2ZSB0aGlzIHNpbXBsZSBhYm9ydCgpIGltcGxlbWVuYXRpb24gaGVyZSBmb3Igbm93LlxyXG4gICAgYWJvcnQodGV4dCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBNZW1vcnkgbWFuYWdlbWVudFxyXG5cclxudmFyIEhFQVAsXHJcbi8qKiBAdHlwZSB7IUludDhBcnJheX0gKi9cclxuICBIRUFQOCxcclxuLyoqIEB0eXBlIHshVWludDhBcnJheX0gKi9cclxuICBIRUFQVTgsXHJcbi8qKiBAdHlwZSB7IUludDE2QXJyYXl9ICovXHJcbiAgSEVBUDE2LFxyXG4vKiogQHR5cGUgeyFVaW50MTZBcnJheX0gKi9cclxuICBIRUFQVTE2LFxyXG4vKiogQHR5cGUgeyFJbnQzMkFycmF5fSAqL1xyXG4gIEhFQVAzMixcclxuLyoqIEB0eXBlIHshVWludDMyQXJyYXl9ICovXHJcbiAgSEVBUFUzMixcclxuLyoqIEB0eXBlIHshRmxvYXQzMkFycmF5fSAqL1xyXG4gIEhFQVBGMzIsXHJcbi8qKiBAdHlwZSB7IUZsb2F0NjRBcnJheX0gKi9cclxuICBIRUFQRjY0O1xyXG5cclxuZnVuY3Rpb24gdXBkYXRlTWVtb3J5Vmlld3MoKSB7XHJcbiAgdmFyIGIgPSB3YXNtTWVtb3J5LmJ1ZmZlcjtcclxuICBNb2R1bGVbJ0hFQVA4J10gPSBIRUFQOCA9IG5ldyBJbnQ4QXJyYXkoYik7XHJcbiAgTW9kdWxlWydIRUFQMTYnXSA9IEhFQVAxNiA9IG5ldyBJbnQxNkFycmF5KGIpO1xyXG4gIE1vZHVsZVsnSEVBUDMyJ10gPSBIRUFQMzIgPSBuZXcgSW50MzJBcnJheShiKTtcclxuICBNb2R1bGVbJ0hFQVBVOCddID0gSEVBUFU4ID0gbmV3IFVpbnQ4QXJyYXkoYik7XHJcbiAgTW9kdWxlWydIRUFQVTE2J10gPSBIRUFQVTE2ID0gbmV3IFVpbnQxNkFycmF5KGIpO1xyXG4gIE1vZHVsZVsnSEVBUFUzMiddID0gSEVBUFUzMiA9IG5ldyBVaW50MzJBcnJheShiKTtcclxuICBNb2R1bGVbJ0hFQVBGMzInXSA9IEhFQVBGMzIgPSBuZXcgRmxvYXQzMkFycmF5KGIpO1xyXG4gIE1vZHVsZVsnSEVBUEY2NCddID0gSEVBUEY2NCA9IG5ldyBGbG9hdDY0QXJyYXkoYik7XHJcbn1cclxuXHJcbi8vIGluY2x1ZGU6IHJ1bnRpbWVfaW5pdF90YWJsZS5qc1xyXG4vLyBJbiByZWd1bGFyIG5vbi1SRUxPQ0FUQUJMRSBtb2RlIHRoZSB0YWJsZSBpcyBleHBvcnRlZFxyXG4vLyBmcm9tIHRoZSB3YXNtIG1vZHVsZSBhbmQgdGhpcyB3aWxsIGJlIGFzc2lnbmVkIG9uY2VcclxuLy8gdGhlIGV4cG9ydHMgYXJlIGF2YWlsYWJsZS5cclxudmFyIHdhc21UYWJsZTtcclxuXHJcbi8vIGVuZCBpbmNsdWRlOiBydW50aW1lX2luaXRfdGFibGUuanNcclxuLy8gaW5jbHVkZTogcnVudGltZV9zdGFja19jaGVjay5qc1xyXG4vLyBlbmQgaW5jbHVkZTogcnVudGltZV9zdGFja19jaGVjay5qc1xyXG4vLyBpbmNsdWRlOiBydW50aW1lX2Fzc2VydGlvbnMuanNcclxuLy8gZW5kIGluY2x1ZGU6IHJ1bnRpbWVfYXNzZXJ0aW9ucy5qc1xyXG52YXIgX19BVFBSRVJVTl9fICA9IFtdOyAvLyBmdW5jdGlvbnMgY2FsbGVkIGJlZm9yZSB0aGUgcnVudGltZSBpcyBpbml0aWFsaXplZFxyXG52YXIgX19BVElOSVRfXyAgICA9IFtdOyAvLyBmdW5jdGlvbnMgY2FsbGVkIGR1cmluZyBzdGFydHVwXHJcbnZhciBfX0FURVhJVF9fICAgID0gW107IC8vIGZ1bmN0aW9ucyBjYWxsZWQgZHVyaW5nIHNodXRkb3duXHJcbnZhciBfX0FUUE9TVFJVTl9fID0gW107IC8vIGZ1bmN0aW9ucyBjYWxsZWQgYWZ0ZXIgdGhlIG1haW4oKSBpcyBjYWxsZWRcclxuXHJcbnZhciBydW50aW1lSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuXHJcbnZhciBydW50aW1lS2VlcGFsaXZlQ291bnRlciA9IDA7XHJcblxyXG5mdW5jdGlvbiBrZWVwUnVudGltZUFsaXZlKCkge1xyXG4gIHJldHVybiBub0V4aXRSdW50aW1lIHx8IHJ1bnRpbWVLZWVwYWxpdmVDb3VudGVyID4gMDtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJlUnVuKCkge1xyXG4gIGlmIChNb2R1bGVbJ3ByZVJ1biddKSB7XHJcbiAgICBpZiAodHlwZW9mIE1vZHVsZVsncHJlUnVuJ10gPT0gJ2Z1bmN0aW9uJykgTW9kdWxlWydwcmVSdW4nXSA9IFtNb2R1bGVbJ3ByZVJ1biddXTtcclxuICAgIHdoaWxlIChNb2R1bGVbJ3ByZVJ1biddLmxlbmd0aCkge1xyXG4gICAgICBhZGRPblByZVJ1bihNb2R1bGVbJ3ByZVJ1biddLnNoaWZ0KCkpO1xyXG4gICAgfVxyXG4gIH1cclxuICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0UnVudGltZSgpIHtcclxuICBydW50aW1lSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cclxuICBcclxuICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUSU5JVF9fKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcG9zdFJ1bigpIHtcclxuXHJcbiAgaWYgKE1vZHVsZVsncG9zdFJ1biddKSB7XHJcbiAgICBpZiAodHlwZW9mIE1vZHVsZVsncG9zdFJ1biddID09ICdmdW5jdGlvbicpIE1vZHVsZVsncG9zdFJ1biddID0gW01vZHVsZVsncG9zdFJ1biddXTtcclxuICAgIHdoaWxlIChNb2R1bGVbJ3Bvc3RSdW4nXS5sZW5ndGgpIHtcclxuICAgICAgYWRkT25Qb3N0UnVuKE1vZHVsZVsncG9zdFJ1biddLnNoaWZ0KCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBPU1RSVU5fXyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZE9uUHJlUnVuKGNiKSB7XHJcbiAgX19BVFBSRVJVTl9fLnVuc2hpZnQoY2IpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRPbkluaXQoY2IpIHtcclxuICBfX0FUSU5JVF9fLnVuc2hpZnQoY2IpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRPbkV4aXQoY2IpIHtcclxufVxyXG5cclxuZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKSB7XHJcbiAgX19BVFBPU1RSVU5fXy51bnNoaWZ0KGNiKTtcclxufVxyXG5cclxuLy8gaW5jbHVkZTogcnVudGltZV9tYXRoLmpzXHJcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvaW11bFxyXG5cclxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9mcm91bmRcclxuXHJcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvY2x6MzJcclxuXHJcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvdHJ1bmNcclxuXHJcbi8vIGVuZCBpbmNsdWRlOiBydW50aW1lX21hdGguanNcclxuLy8gQSBjb3VudGVyIG9mIGRlcGVuZGVuY2llcyBmb3IgY2FsbGluZyBydW4oKS4gSWYgd2UgbmVlZCB0b1xyXG4vLyBkbyBhc3luY2hyb25vdXMgd29yayBiZWZvcmUgcnVubmluZywgaW5jcmVtZW50IHRoaXMgYW5kXHJcbi8vIGRlY3JlbWVudCBpdC4gSW5jcmVtZW50aW5nIG11c3QgaGFwcGVuIGluIGEgcGxhY2UgbGlrZVxyXG4vLyBNb2R1bGUucHJlUnVuICh1c2VkIGJ5IGVtY2MgdG8gYWRkIGZpbGUgcHJlbG9hZGluZykuXHJcbi8vIE5vdGUgdGhhdCB5b3UgY2FuIGFkZCBkZXBlbmRlbmNpZXMgaW4gcHJlUnVuLCBldmVuIHRob3VnaFxyXG4vLyBpdCBoYXBwZW5zIHJpZ2h0IGJlZm9yZSBydW4gLSBydW4gd2lsbCBiZSBwb3N0cG9uZWQgdW50aWxcclxuLy8gdGhlIGRlcGVuZGVuY2llcyBhcmUgbWV0LlxyXG52YXIgcnVuRGVwZW5kZW5jaWVzID0gMDtcclxudmFyIHJ1bkRlcGVuZGVuY3lXYXRjaGVyID0gbnVsbDtcclxudmFyIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7IC8vIG92ZXJyaWRkZW4gdG8gdGFrZSBkaWZmZXJlbnQgYWN0aW9ucyB3aGVuIGFsbCBydW4gZGVwZW5kZW5jaWVzIGFyZSBmdWxmaWxsZWRcclxuXHJcbmZ1bmN0aW9uIGdldFVuaXF1ZVJ1bkRlcGVuZGVuY3koaWQpIHtcclxuICByZXR1cm4gaWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZFJ1bkRlcGVuZGVuY3koaWQpIHtcclxuICBydW5EZXBlbmRlbmNpZXMrKztcclxuXHJcbiAgaWYgKE1vZHVsZVsnbW9uaXRvclJ1bkRlcGVuZGVuY2llcyddKSB7XHJcbiAgICBNb2R1bGVbJ21vbml0b3JSdW5EZXBlbmRlbmNpZXMnXShydW5EZXBlbmRlbmNpZXMpO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbW92ZVJ1bkRlcGVuZGVuY3koaWQpIHtcclxuICBydW5EZXBlbmRlbmNpZXMtLTtcclxuXHJcbiAgaWYgKE1vZHVsZVsnbW9uaXRvclJ1bkRlcGVuZGVuY2llcyddKSB7XHJcbiAgICBNb2R1bGVbJ21vbml0b3JSdW5EZXBlbmRlbmNpZXMnXShydW5EZXBlbmRlbmNpZXMpO1xyXG4gIH1cclxuXHJcbiAgaWYgKHJ1bkRlcGVuZGVuY2llcyA9PSAwKSB7XHJcbiAgICBpZiAocnVuRGVwZW5kZW5jeVdhdGNoZXIgIT09IG51bGwpIHtcclxuICAgICAgY2xlYXJJbnRlcnZhbChydW5EZXBlbmRlbmN5V2F0Y2hlcik7XHJcbiAgICAgIHJ1bkRlcGVuZGVuY3lXYXRjaGVyID0gbnVsbDtcclxuICAgIH1cclxuICAgIGlmIChkZXBlbmRlbmNpZXNGdWxmaWxsZWQpIHtcclxuICAgICAgdmFyIGNhbGxiYWNrID0gZGVwZW5kZW5jaWVzRnVsZmlsbGVkO1xyXG4gICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBudWxsO1xyXG4gICAgICBjYWxsYmFjaygpOyAvLyBjYW4gYWRkIGFub3RoZXIgZGVwZW5kZW5jaWVzRnVsZmlsbGVkXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKiogQHBhcmFtIHtzdHJpbmd8bnVtYmVyPX0gd2hhdCAqL1xyXG5mdW5jdGlvbiBhYm9ydCh3aGF0KSB7XHJcbiAgaWYgKE1vZHVsZVsnb25BYm9ydCddKSB7XHJcbiAgICBNb2R1bGVbJ29uQWJvcnQnXSh3aGF0KTtcclxuICB9XHJcblxyXG4gIHdoYXQgPSAnQWJvcnRlZCgnICsgd2hhdCArICcpJztcclxuICAvLyBUT0RPKHNiYyk6IFNob3VsZCB3ZSByZW1vdmUgcHJpbnRpbmcgYW5kIGxlYXZlIGl0IHVwIHRvIHdob2V2ZXJcclxuICAvLyBjYXRjaGVzIHRoZSBleGNlcHRpb24/XHJcbiAgZXJyKHdoYXQpO1xyXG5cclxuICBBQk9SVCA9IHRydWU7XHJcbiAgRVhJVFNUQVRVUyA9IDE7XHJcblxyXG4gIHdoYXQgKz0gJy4gQnVpbGQgd2l0aCAtc0FTU0VSVElPTlMgZm9yIG1vcmUgaW5mby4nO1xyXG5cclxuICAvLyBVc2UgYSB3YXNtIHJ1bnRpbWUgZXJyb3IsIGJlY2F1c2UgYSBKUyBlcnJvciBtaWdodCBiZSBzZWVuIGFzIGEgZm9yZWlnblxyXG4gIC8vIGV4Y2VwdGlvbiwgd2hpY2ggbWVhbnMgd2UnZCBydW4gZGVzdHJ1Y3RvcnMgb24gaXQuIFdlIG5lZWQgdGhlIGVycm9yIHRvXHJcbiAgLy8gc2ltcGx5IG1ha2UgdGhlIHByb2dyYW0gc3RvcC5cclxuICAvLyBGSVhNRSBUaGlzIGFwcHJvYWNoIGRvZXMgbm90IHdvcmsgaW4gV2FzbSBFSCBiZWNhdXNlIGl0IGN1cnJlbnRseSBkb2VzIG5vdCBhc3N1bWVcclxuICAvLyBhbGwgUnVudGltZUVycm9ycyBhcmUgZnJvbSB0cmFwczsgaXQgZGVjaWRlcyB3aGV0aGVyIGEgUnVudGltZUVycm9yIGlzIGZyb21cclxuICAvLyBhIHRyYXAgb3Igbm90IGJhc2VkIG9uIGEgaGlkZGVuIGZpZWxkIHdpdGhpbiB0aGUgb2JqZWN0LiBTbyBhdCB0aGUgbW9tZW50XHJcbiAgLy8gd2UgZG9uJ3QgaGF2ZSBhIHdheSBvZiB0aHJvd2luZyBhIHdhc20gdHJhcCBmcm9tIEpTLiBUT0RPIE1ha2UgYSBKUyBBUEkgdGhhdFxyXG4gIC8vIGFsbG93cyB0aGlzIGluIHRoZSB3YXNtIHNwZWMuXHJcblxyXG4gIC8vIFN1cHByZXNzIGNsb3N1cmUgY29tcGlsZXIgd2FybmluZyBoZXJlLiBDbG9zdXJlIGNvbXBpbGVyJ3MgYnVpbHRpbiBleHRlcm5cclxuICAvLyBkZWZpbnRpb24gZm9yIFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvciBjbGFpbXMgaXQgdGFrZXMgbm8gYXJndW1lbnRzIGV2ZW5cclxuICAvLyB0aG91Z2ggaXQgY2FuLlxyXG4gIC8vIFRPRE8oaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL3B1bGwvMzkxMyk6IFJlbW92ZSBpZi93aGVuIHVwc3RyZWFtIGNsb3N1cmUgZ2V0cyBmaXhlZC5cclxuICAvKiogQHN1cHByZXNzIHtjaGVja1R5cGVzfSAqL1xyXG4gIHZhciBlID0gbmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcih3aGF0KTtcclxuXHJcbiAgcmVhZHlQcm9taXNlUmVqZWN0KGUpO1xyXG4gIC8vIFRocm93IHRoZSBlcnJvciB3aGV0aGVyIG9yIG5vdCBNT0RVTEFSSVpFIGlzIHNldCBiZWNhdXNlIGFib3J0IGlzIHVzZWRcclxuICAvLyBpbiBjb2RlIHBhdGhzIGFwYXJ0IGZyb20gaW5zdGFudGlhdGlvbiB3aGVyZSBhbiBleGNlcHRpb24gaXMgZXhwZWN0ZWRcclxuICAvLyB0byBiZSB0aHJvd24gd2hlbiBhYm9ydCBpcyBjYWxsZWQuXHJcbiAgdGhyb3cgZTtcclxufVxyXG5cclxuLy8gaW5jbHVkZTogbWVtb3J5cHJvZmlsZXIuanNcclxuLy8gZW5kIGluY2x1ZGU6IG1lbW9yeXByb2ZpbGVyLmpzXHJcbi8vIGluY2x1ZGU6IFVSSVV0aWxzLmpzXHJcbi8vIFByZWZpeCBvZiBkYXRhIFVSSXMgZW1pdHRlZCBieSBTSU5HTEVfRklMRSBhbmQgcmVsYXRlZCBvcHRpb25zLlxyXG52YXIgZGF0YVVSSVByZWZpeCA9ICdkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsJztcclxuXHJcbi8vIEluZGljYXRlcyB3aGV0aGVyIGZpbGVuYW1lIGlzIGEgYmFzZTY0IGRhdGEgVVJJLlxyXG5mdW5jdGlvbiBpc0RhdGFVUkkoZmlsZW5hbWUpIHtcclxuICAvLyBQcmVmaXggb2YgZGF0YSBVUklzIGVtaXR0ZWQgYnkgU0lOR0xFX0ZJTEUgYW5kIHJlbGF0ZWQgb3B0aW9ucy5cclxuICByZXR1cm4gZmlsZW5hbWUuc3RhcnRzV2l0aChkYXRhVVJJUHJlZml4KTtcclxufVxyXG5cclxuLy8gSW5kaWNhdGVzIHdoZXRoZXIgZmlsZW5hbWUgaXMgZGVsaXZlcmVkIHZpYSBmaWxlIHByb3RvY29sIChhcyBvcHBvc2VkIHRvIGh0dHAvaHR0cHMpXHJcbmZ1bmN0aW9uIGlzRmlsZVVSSShmaWxlbmFtZSkge1xyXG4gIHJldHVybiBmaWxlbmFtZS5zdGFydHNXaXRoKCdmaWxlOi8vJyk7XHJcbn1cclxuXHJcbi8vIGVuZCBpbmNsdWRlOiBVUklVdGlscy5qc1xyXG4vLyBpbmNsdWRlOiBydW50aW1lX2V4Y2VwdGlvbnMuanNcclxuLy8gZW5kIGluY2x1ZGU6IHJ1bnRpbWVfZXhjZXB0aW9ucy5qc1xyXG52YXIgd2FzbUJpbmFyeUZpbGU7XHJcbiAgd2FzbUJpbmFyeUZpbGUgPSAnd2FzbURic2Nhbi53YXNtJztcclxuICBpZiAoIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkpIHtcclxuICAgIHdhc21CaW5hcnlGaWxlID0gbG9jYXRlRmlsZSh3YXNtQmluYXJ5RmlsZSk7XHJcbiAgfVxyXG5cclxuZnVuY3Rpb24gZ2V0QmluYXJ5KGZpbGUpIHtcclxuICB0cnkge1xyXG4gICAgaWYgKGZpbGUgPT0gd2FzbUJpbmFyeUZpbGUgJiYgd2FzbUJpbmFyeSkge1xyXG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkod2FzbUJpbmFyeSk7XHJcbiAgICB9XHJcbiAgICBpZiAocmVhZEJpbmFyeSkge1xyXG4gICAgICByZXR1cm4gcmVhZEJpbmFyeShmaWxlKTtcclxuICAgIH1cclxuICAgIHRocm93IFwiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWRcIjtcclxuICB9XHJcbiAgY2F0Y2ggKGVycikge1xyXG4gICAgYWJvcnQoZXJyKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEJpbmFyeVByb21pc2UoYmluYXJ5RmlsZSkge1xyXG4gIC8vIElmIHdlIGRvbid0IGhhdmUgdGhlIGJpbmFyeSB5ZXQsIHRyeSB0byBsb2FkIGl0IGFzeW5jaHJvbm91c2x5LlxyXG4gIC8vIEZldGNoIGhhcyBzb21lIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zIG92ZXIgWEhSLCBsaWtlIGl0IGNhbid0IGJlIHVzZWQgb24gYSBmaWxlOi8vIHVybC5cclxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2dpdGh1Yi9mZXRjaC9wdWxsLzkyI2lzc3VlY29tbWVudC0xNDA2NjU5MzJcclxuICAvLyBDb3Jkb3ZhIG9yIEVsZWN0cm9uIGFwcHMgYXJlIHR5cGljYWxseSBsb2FkZWQgZnJvbSBhIGZpbGU6Ly8gdXJsLlxyXG4gIC8vIFNvIHVzZSBmZXRjaCBpZiBpdCBpcyBhdmFpbGFibGUgYW5kIHRoZSB1cmwgaXMgbm90IGEgZmlsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBYSFIuXHJcbiAgaWYgKCF3YXNtQmluYXJ5ICYmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSkge1xyXG4gICAgaWYgKHR5cGVvZiBmZXRjaCA9PSAnZnVuY3Rpb24nXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIGZldGNoKGJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicgfSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xyXG4gICAgICAgIGlmICghcmVzcG9uc2VbJ29rJ10pIHtcclxuICAgICAgICAgIHRocm93IFwiZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnXCIgKyBiaW5hcnlGaWxlICsgXCInXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNwb25zZVsnYXJyYXlCdWZmZXInXSgpO1xyXG4gICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5KGJpbmFyeUZpbGUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIE90aGVyd2lzZSwgZ2V0QmluYXJ5IHNob3VsZCBiZSBhYmxlIHRvIGdldCBpdCBzeW5jaHJvbm91c2x5XHJcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKSB7IHJldHVybiBnZXRCaW5hcnkoYmluYXJ5RmlsZSk7IH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKGJpbmFyeUZpbGUsIGltcG9ydHMsIHJlY2VpdmVyKSB7XHJcbiAgcmV0dXJuIGdldEJpbmFyeVByb21pc2UoYmluYXJ5RmlsZSkudGhlbihmdW5jdGlvbihiaW5hcnkpIHtcclxuICAgIHJldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShiaW5hcnksIGltcG9ydHMpO1xyXG4gIH0pLnRoZW4oZnVuY3Rpb24gKGluc3RhbmNlKSB7XHJcbiAgICByZXR1cm4gaW5zdGFuY2U7XHJcbiAgfSkudGhlbihyZWNlaXZlciwgZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICBlcnIoJ2ZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICcgKyByZWFzb24pO1xyXG5cclxuICAgIGFib3J0KHJlYXNvbik7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluc3RhbnRpYXRlQXN5bmMoYmluYXJ5LCBiaW5hcnlGaWxlLCBpbXBvcnRzLCBjYWxsYmFjaykge1xyXG4gIGlmICghYmluYXJ5ICYmXHJcbiAgICAgIHR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyA9PSAnZnVuY3Rpb24nICYmXHJcbiAgICAgICFpc0RhdGFVUkkoYmluYXJ5RmlsZSkgJiZcclxuICAgICAgdHlwZW9mIGZldGNoID09ICdmdW5jdGlvbicpIHtcclxuICAgIHJldHVybiBmZXRjaChiaW5hcnlGaWxlLCB7IGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nIH0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcclxuICAgICAgLy8gU3VwcHJlc3MgY2xvc3VyZSB3YXJuaW5nIGhlcmUgc2luY2UgdGhlIHVwc3RyZWFtIGRlZmluaXRpb24gZm9yXHJcbiAgICAgIC8vIGluc3RhbnRpYXRlU3RyZWFtaW5nIG9ubHkgYWxsb3dzIFByb21pc2U8UmVwc3BvbnNlPiByYXRoZXIgdGhhblxyXG4gICAgICAvLyBhbiBhY3R1YWwgUmVzcG9uc2UuXHJcbiAgICAgIC8vIFRPRE8oaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL3B1bGwvMzkxMyk6IFJlbW92ZSBpZi93aGVuIHVwc3RyZWFtIGNsb3N1cmUgaXMgZml4ZWQuXHJcbiAgICAgIC8qKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXN9ICovXHJcbiAgICAgIHZhciByZXN1bHQgPSBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXNwb25zZSwgaW1wb3J0cyk7XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0LnRoZW4oXHJcbiAgICAgICAgY2FsbGJhY2ssXHJcbiAgICAgICAgZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICAgICAgICAvLyBXZSBleHBlY3QgdGhlIG1vc3QgY29tbW9uIGZhaWx1cmUgY2F1c2UgdG8gYmUgYSBiYWQgTUlNRSB0eXBlIGZvciB0aGUgYmluYXJ5LFxyXG4gICAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSBmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiBzaG91bGQgd29yay5cclxuICAgICAgICAgIGVycignd2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICcgKyByZWFzb24pO1xyXG4gICAgICAgICAgZXJyKCdmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbicpO1xyXG4gICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIoYmluYXJ5RmlsZSwgaW1wb3J0cywgY2FsbGJhY2spO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKGJpbmFyeUZpbGUsIGltcG9ydHMsIGNhbGxiYWNrKTtcclxuICB9XHJcbn1cclxuXHJcbi8vIENyZWF0ZSB0aGUgd2FzbSBpbnN0YW5jZS5cclxuLy8gUmVjZWl2ZXMgdGhlIHdhc20gaW1wb3J0cywgcmV0dXJucyB0aGUgZXhwb3J0cy5cclxuZnVuY3Rpb24gY3JlYXRlV2FzbSgpIHtcclxuICAvLyBwcmVwYXJlIGltcG9ydHNcclxuICB2YXIgaW5mbyA9IHtcclxuICAgICdlbnYnOiB3YXNtSW1wb3J0cyxcclxuICAgICd3YXNpX3NuYXBzaG90X3ByZXZpZXcxJzogd2FzbUltcG9ydHMsXHJcbiAgfTtcclxuICAvLyBMb2FkIHRoZSB3YXNtIG1vZHVsZSBhbmQgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHVzaW5nIG5hdGl2ZSBzdXBwb3J0IGluIHRoZSBKUyBlbmdpbmUuXHJcbiAgLy8gaGFuZGxlIGEgZ2VuZXJhdGVkIHdhc20gaW5zdGFuY2UsIHJlY2VpdmluZyBpdHMgZXhwb3J0cyBhbmRcclxuICAvLyBwZXJmb3JtaW5nIG90aGVyIG5lY2Vzc2FyeSBzZXR1cFxyXG4gIC8qKiBAcGFyYW0ge1dlYkFzc2VtYmx5Lk1vZHVsZT19IG1vZHVsZSovXHJcbiAgZnVuY3Rpb24gcmVjZWl2ZUluc3RhbmNlKGluc3RhbmNlLCBtb2R1bGUpIHtcclxuICAgIHZhciBleHBvcnRzID0gaW5zdGFuY2UuZXhwb3J0cztcclxuXHJcbiAgICBNb2R1bGVbJ2FzbSddID0gZXhwb3J0cztcclxuXHJcbiAgICB3YXNtTWVtb3J5ID0gTW9kdWxlWydhc20nXVsnbWVtb3J5J107XHJcbiAgICB1cGRhdGVNZW1vcnlWaWV3cygpO1xyXG5cclxuICAgIHdhc21UYWJsZSA9IE1vZHVsZVsnYXNtJ11bJ19faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUnXTtcclxuXHJcbiAgICBhZGRPbkluaXQoTW9kdWxlWydhc20nXVsnX193YXNtX2NhbGxfY3RvcnMnXSk7XHJcblxyXG4gICAgcmVtb3ZlUnVuRGVwZW5kZW5jeSgnd2FzbS1pbnN0YW50aWF0ZScpO1xyXG5cclxuICAgIHJldHVybiBleHBvcnRzO1xyXG4gIH1cclxuICAvLyB3YWl0IGZvciB0aGUgcHRocmVhZCBwb29sIChpZiBhbnkpXHJcbiAgYWRkUnVuRGVwZW5kZW5jeSgnd2FzbS1pbnN0YW50aWF0ZScpO1xyXG5cclxuICAvLyBQcmVmZXIgc3RyZWFtaW5nIGluc3RhbnRpYXRpb24gaWYgYXZhaWxhYmxlLlxyXG4gIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW50aWF0aW9uUmVzdWx0KHJlc3VsdCkge1xyXG4gICAgLy8gJ3Jlc3VsdCcgaXMgYSBSZXN1bHRPYmplY3Qgb2JqZWN0IHdoaWNoIGhhcyBib3RoIHRoZSBtb2R1bGUgYW5kIGluc3RhbmNlLlxyXG4gICAgLy8gcmVjZWl2ZUluc3RhbmNlKCkgd2lsbCBzd2FwIGluIHRoZSBleHBvcnRzICh0byBNb2R1bGUuYXNtKSBzbyB0aGV5IGNhbiBiZSBjYWxsZWRcclxuICAgIC8vIFRPRE86IER1ZSB0byBDbG9zdXJlIHJlZ3Jlc3Npb24gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL2lzc3Vlcy8zMTkzLCB0aGUgYWJvdmUgbGluZSBubyBsb25nZXIgb3B0aW1pemVzIG91dCBkb3duIHRvIHRoZSBmb2xsb3dpbmcgbGluZS5cclxuICAgIC8vIFdoZW4gdGhlIHJlZ3Jlc3Npb24gaXMgZml4ZWQsIGNhbiByZXN0b3JlIHRoZSBhYm92ZSBQVEhSRUFEUy1lbmFibGVkIHBhdGguXHJcbiAgICByZWNlaXZlSW5zdGFuY2UocmVzdWx0WydpbnN0YW5jZSddKTtcclxuICB9XHJcblxyXG4gIC8vIFVzZXIgc2hlbGwgcGFnZXMgY2FuIHdyaXRlIHRoZWlyIG93biBNb2R1bGUuaW5zdGFudGlhdGVXYXNtID0gZnVuY3Rpb24oaW1wb3J0cywgc3VjY2Vzc0NhbGxiYWNrKSBjYWxsYmFja1xyXG4gIC8vIHRvIG1hbnVhbGx5IGluc3RhbnRpYXRlIHRoZSBXYXNtIG1vZHVsZSB0aGVtc2VsdmVzLiBUaGlzIGFsbG93cyBwYWdlcyB0b1xyXG4gIC8vIHJ1biB0aGUgaW5zdGFudGlhdGlvbiBwYXJhbGxlbCB0byBhbnkgb3RoZXIgYXN5bmMgc3RhcnR1cCBhY3Rpb25zIHRoZXkgYXJlXHJcbiAgLy8gcGVyZm9ybWluZy5cclxuICAvLyBBbHNvIHB0aHJlYWRzIGFuZCB3YXNtIHdvcmtlcnMgaW5pdGlhbGl6ZSB0aGUgd2FzbSBpbnN0YW5jZSB0aHJvdWdoIHRoaXNcclxuICAvLyBwYXRoLlxyXG4gIGlmIChNb2R1bGVbJ2luc3RhbnRpYXRlV2FzbSddKSB7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIE1vZHVsZVsnaW5zdGFudGlhdGVXYXNtJ10oaW5mbywgcmVjZWl2ZUluc3RhbmNlKTtcclxuICAgIH0gY2F0Y2goZSkge1xyXG4gICAgICBlcnIoJ01vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICcgKyBlKTtcclxuICAgICAgICAvLyBJZiBpbnN0YW50aWF0aW9uIGZhaWxzLCByZWplY3QgdGhlIG1vZHVsZSByZWFkeSBwcm9taXNlLlxyXG4gICAgICAgIHJlYWR5UHJvbWlzZVJlamVjdChlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIElmIGluc3RhbnRpYXRpb24gZmFpbHMsIHJlamVjdCB0aGUgbW9kdWxlIHJlYWR5IHByb21pc2UuXHJcbiAgaW5zdGFudGlhdGVBc3luYyh3YXNtQmluYXJ5LCB3YXNtQmluYXJ5RmlsZSwgaW5mbywgcmVjZWl2ZUluc3RhbnRpYXRpb25SZXN1bHQpLmNhdGNoKHJlYWR5UHJvbWlzZVJlamVjdCk7XHJcbiAgcmV0dXJuIHt9OyAvLyBubyBleHBvcnRzIHlldDsgd2UnbGwgZmlsbCB0aGVtIGluIGxhdGVyXHJcbn1cclxuXHJcbi8vIEdsb2JhbHMgdXNlZCBieSBKUyBpNjQgY29udmVyc2lvbnMgKHNlZSBtYWtlU2V0VmFsdWUpXHJcbnZhciB0ZW1wRG91YmxlO1xyXG52YXIgdGVtcEk2NDtcclxuXHJcbi8vIGluY2x1ZGU6IHJ1bnRpbWVfZGVidWcuanNcclxuLy8gZW5kIGluY2x1ZGU6IHJ1bnRpbWVfZGVidWcuanNcclxuLy8gPT09IEJvZHkgPT09XHJcblxyXG5cclxuLy8gZW5kIGluY2x1ZGU6IHByZWFtYmxlLmpzXHJcblxyXG4gIC8qKiBAY29uc3RydWN0b3IgKi9cclxuICBmdW5jdGlvbiBFeGl0U3RhdHVzKHN0YXR1cykge1xyXG4gICAgICB0aGlzLm5hbWUgPSAnRXhpdFN0YXR1cyc7XHJcbiAgICAgIHRoaXMubWVzc2FnZSA9ICdQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCcgKyBzdGF0dXMgKyAnKSc7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgfVxyXG5cclxuICBmdW5jdGlvbiBjYWxsUnVudGltZUNhbGxiYWNrcyhjYWxsYmFja3MpIHtcclxuICAgICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgLy8gUGFzcyB0aGUgbW9kdWxlIGFzIHRoZSBmaXJzdCBhcmd1bWVudC5cclxuICAgICAgICBjYWxsYmFja3Muc2hpZnQoKShNb2R1bGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIFxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcHRyXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxyXG4gICAgICovXHJcbiAgZnVuY3Rpb24gZ2V0VmFsdWUocHRyLCB0eXBlID0gJ2k4Jykge1xyXG4gICAgaWYgKHR5cGUuZW5kc1dpdGgoJyonKSkgdHlwZSA9ICcqJztcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlICdpMSc6IHJldHVybiBIRUFQOFsoKHB0cik+PjApXTtcclxuICAgICAgY2FzZSAnaTgnOiByZXR1cm4gSEVBUDhbKChwdHIpPj4wKV07XHJcbiAgICAgIGNhc2UgJ2kxNic6IHJldHVybiBIRUFQMTZbKChwdHIpPj4xKV07XHJcbiAgICAgIGNhc2UgJ2kzMic6IHJldHVybiBIRUFQMzJbKChwdHIpPj4yKV07XHJcbiAgICAgIGNhc2UgJ2k2NCc6IHJldHVybiBIRUFQMzJbKChwdHIpPj4yKV07XHJcbiAgICAgIGNhc2UgJ2Zsb2F0JzogcmV0dXJuIEhFQVBGMzJbKChwdHIpPj4yKV07XHJcbiAgICAgIGNhc2UgJ2RvdWJsZSc6IHJldHVybiBIRUFQRjY0WygocHRyKT4+MyldO1xyXG4gICAgICBjYXNlICcqJzogcmV0dXJuIEhFQVBVMzJbKChwdHIpPj4yKV07XHJcbiAgICAgIGRlZmF1bHQ6IGFib3J0KCdpbnZhbGlkIHR5cGUgZm9yIGdldFZhbHVlOiAnICsgdHlwZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBcclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHB0clxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxyXG4gICAgICovXHJcbiAgZnVuY3Rpb24gc2V0VmFsdWUocHRyLCB2YWx1ZSwgdHlwZSA9ICdpOCcpIHtcclxuICAgIGlmICh0eXBlLmVuZHNXaXRoKCcqJykpIHR5cGUgPSAnKic7XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSAnaTEnOiBIRUFQOFsoKHB0cik+PjApXSA9IHZhbHVlOyBicmVhaztcclxuICAgICAgY2FzZSAnaTgnOiBIRUFQOFsoKHB0cik+PjApXSA9IHZhbHVlOyBicmVhaztcclxuICAgICAgY2FzZSAnaTE2JzogSEVBUDE2WygocHRyKT4+MSldID0gdmFsdWU7IGJyZWFrO1xyXG4gICAgICBjYXNlICdpMzInOiBIRUFQMzJbKChwdHIpPj4yKV0gPSB2YWx1ZTsgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2k2NCc6ICh0ZW1wSTY0ID0gW3ZhbHVlPj4+MCwodGVtcERvdWJsZT12YWx1ZSwoKyhNYXRoLmFicyh0ZW1wRG91YmxlKSkpID49IDEuMCA/ICh0ZW1wRG91YmxlID4gMC4wID8gKChNYXRoLm1pbigoKyhNYXRoLmZsb29yKCh0ZW1wRG91YmxlKS80Mjk0OTY3Mjk2LjApKSksIDQyOTQ5NjcyOTUuMCkpfDApPj4+MCA6ICh+figoKyhNYXRoLmNlaWwoKHRlbXBEb3VibGUgLSArKCgofn4odGVtcERvdWJsZSkpKT4+PjApKS80Mjk0OTY3Mjk2LjApKSkpKT4+PjApIDogMCldLEhFQVAzMlsoKHB0cik+PjIpXSA9IHRlbXBJNjRbMF0sSEVBUDMyWygoKHB0cikrKDQpKT4+MildID0gdGVtcEk2NFsxXSk7IGJyZWFrO1xyXG4gICAgICBjYXNlICdmbG9hdCc6IEhFQVBGMzJbKChwdHIpPj4yKV0gPSB2YWx1ZTsgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2RvdWJsZSc6IEhFQVBGNjRbKChwdHIpPj4zKV0gPSB2YWx1ZTsgYnJlYWs7XHJcbiAgICAgIGNhc2UgJyonOiBIRUFQVTMyWygocHRyKT4+MildID0gdmFsdWU7IGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OiBhYm9ydCgnaW52YWxpZCB0eXBlIGZvciBzZXRWYWx1ZTogJyArIHR5cGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEBjb25zdHJ1Y3RvciAqL1xyXG4gIGZ1bmN0aW9uIEV4Y2VwdGlvbkluZm8oZXhjUHRyKSB7XHJcbiAgICAgIHRoaXMuZXhjUHRyID0gZXhjUHRyO1xyXG4gICAgICB0aGlzLnB0ciA9IGV4Y1B0ciAtIDI0O1xyXG4gIFxyXG4gICAgICB0aGlzLnNldF90eXBlID0gZnVuY3Rpb24odHlwZSkge1xyXG4gICAgICAgIEhFQVBVMzJbKCgodGhpcy5wdHIpKyg0KSk+PjIpXSA9IHR5cGU7XHJcbiAgICAgIH07XHJcbiAgXHJcbiAgICAgIHRoaXMuZ2V0X3R5cGUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gSEVBUFUzMlsoKCh0aGlzLnB0cikrKDQpKT4+MildO1xyXG4gICAgICB9O1xyXG4gIFxyXG4gICAgICB0aGlzLnNldF9kZXN0cnVjdG9yID0gZnVuY3Rpb24oZGVzdHJ1Y3Rvcikge1xyXG4gICAgICAgIEhFQVBVMzJbKCgodGhpcy5wdHIpKyg4KSk+PjIpXSA9IGRlc3RydWN0b3I7XHJcbiAgICAgIH07XHJcbiAgXHJcbiAgICAgIHRoaXMuZ2V0X2Rlc3RydWN0b3IgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gSEVBUFUzMlsoKCh0aGlzLnB0cikrKDgpKT4+MildO1xyXG4gICAgICB9O1xyXG4gIFxyXG4gICAgICB0aGlzLnNldF9jYXVnaHQgPSBmdW5jdGlvbiAoY2F1Z2h0KSB7XHJcbiAgICAgICAgY2F1Z2h0ID0gY2F1Z2h0ID8gMSA6IDA7XHJcbiAgICAgICAgSEVBUDhbKCgodGhpcy5wdHIpKygxMikpPj4wKV0gPSBjYXVnaHQ7XHJcbiAgICAgIH07XHJcbiAgXHJcbiAgICAgIHRoaXMuZ2V0X2NhdWdodCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gSEVBUDhbKCgodGhpcy5wdHIpKygxMikpPj4wKV0gIT0gMDtcclxuICAgICAgfTtcclxuICBcclxuICAgICAgdGhpcy5zZXRfcmV0aHJvd24gPSBmdW5jdGlvbiAocmV0aHJvd24pIHtcclxuICAgICAgICByZXRocm93biA9IHJldGhyb3duID8gMSA6IDA7XHJcbiAgICAgICAgSEVBUDhbKCgodGhpcy5wdHIpKygxMykpPj4wKV0gPSByZXRocm93bjtcclxuICAgICAgfTtcclxuICBcclxuICAgICAgdGhpcy5nZXRfcmV0aHJvd24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIEhFQVA4WygoKHRoaXMucHRyKSsoMTMpKT4+MCldICE9IDA7XHJcbiAgICAgIH07XHJcbiAgXHJcbiAgICAgIC8vIEluaXRpYWxpemUgbmF0aXZlIHN0cnVjdHVyZSBmaWVsZHMuIFNob3VsZCBiZSBjYWxsZWQgb25jZSBhZnRlciBhbGxvY2F0ZWQuXHJcbiAgICAgIHRoaXMuaW5pdCA9IGZ1bmN0aW9uKHR5cGUsIGRlc3RydWN0b3IpIHtcclxuICAgICAgICB0aGlzLnNldF9hZGp1c3RlZF9wdHIoMCk7XHJcbiAgICAgICAgdGhpcy5zZXRfdHlwZSh0eXBlKTtcclxuICAgICAgICB0aGlzLnNldF9kZXN0cnVjdG9yKGRlc3RydWN0b3IpO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIHRoaXMuc2V0X2FkanVzdGVkX3B0ciA9IGZ1bmN0aW9uKGFkanVzdGVkUHRyKSB7XHJcbiAgICAgICAgSEVBUFUzMlsoKCh0aGlzLnB0cikrKDE2KSk+PjIpXSA9IGFkanVzdGVkUHRyO1xyXG4gICAgICB9O1xyXG4gIFxyXG4gICAgICB0aGlzLmdldF9hZGp1c3RlZF9wdHIgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gSEVBUFUzMlsoKCh0aGlzLnB0cikrKDE2KSk+PjIpXTtcclxuICAgICAgfTtcclxuICBcclxuICAgICAgLy8gR2V0IHBvaW50ZXIgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYmUgcmVjZWl2ZWQgYnkgY2F0Y2ggY2xhdXNlIGluIEMrKyBjb2RlLiBJdCBtYXkgYmUgYWRqdXN0ZWRcclxuICAgICAgLy8gd2hlbiB0aGUgcG9pbnRlciBpcyBjYXN0ZWQgdG8gc29tZSBvZiB0aGUgZXhjZXB0aW9uIG9iamVjdCBiYXNlIGNsYXNzZXMgKGUuZy4gd2hlbiB2aXJ0dWFsXHJcbiAgICAgIC8vIGluaGVyaXRhbmNlIGlzIHVzZWQpLiBXaGVuIGEgcG9pbnRlciBpcyB0aHJvd24gdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgdGhyb3duIHBvaW50ZXJcclxuICAgICAgLy8gaXRzZWxmLlxyXG4gICAgICB0aGlzLmdldF9leGNlcHRpb25fcHRyID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgLy8gV29yayBhcm91bmQgYSBmYXN0Y29tcCBidWcsIHRoaXMgY29kZSBpcyBzdGlsbCBpbmNsdWRlZCBmb3Igc29tZSByZWFzb24gaW4gYSBidWlsZCB3aXRob3V0XHJcbiAgICAgICAgLy8gZXhjZXB0aW9ucyBzdXBwb3J0LlxyXG4gICAgICAgIHZhciBpc1BvaW50ZXIgPSBfX19jeGFfaXNfcG9pbnRlcl90eXBlKHRoaXMuZ2V0X3R5cGUoKSk7XHJcbiAgICAgICAgaWYgKGlzUG9pbnRlcikge1xyXG4gICAgICAgICAgcmV0dXJuIEhFQVBVMzJbKCh0aGlzLmV4Y1B0cik+PjIpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGFkanVzdGVkID0gdGhpcy5nZXRfYWRqdXN0ZWRfcHRyKCk7XHJcbiAgICAgICAgaWYgKGFkanVzdGVkICE9PSAwKSByZXR1cm4gYWRqdXN0ZWQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhjUHRyO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIFxyXG4gIHZhciBleGNlcHRpb25MYXN0ID0gMDtcclxuICBcclxuICB2YXIgdW5jYXVnaHRFeGNlcHRpb25Db3VudCA9IDA7XHJcbiAgZnVuY3Rpb24gX19fY3hhX3Rocm93KHB0ciwgdHlwZSwgZGVzdHJ1Y3Rvcikge1xyXG4gICAgICB2YXIgaW5mbyA9IG5ldyBFeGNlcHRpb25JbmZvKHB0cik7XHJcbiAgICAgIC8vIEluaXRpYWxpemUgRXhjZXB0aW9uSW5mbyBjb250ZW50IGFmdGVyIGl0IHdhcyBhbGxvY2F0ZWQgaW4gX19jeGFfYWxsb2NhdGVfZXhjZXB0aW9uLlxyXG4gICAgICBpbmZvLmluaXQodHlwZSwgZGVzdHJ1Y3Rvcik7XHJcbiAgICAgIGV4Y2VwdGlvbkxhc3QgPSBwdHI7XHJcbiAgICAgIHVuY2F1Z2h0RXhjZXB0aW9uQ291bnQrKztcclxuICAgICAgdGhyb3cgZXhjZXB0aW9uTGFzdDtcclxuICAgIH1cclxuXHJcbiAgZnVuY3Rpb24gX2Fib3J0KCkge1xyXG4gICAgICBhYm9ydCgnJyk7XHJcbiAgICB9XHJcblxyXG4gIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX21lbWNweV9iaWcoZGVzdCwgc3JjLCBudW0pIHtcclxuICAgICAgSEVBUFU4LmNvcHlXaXRoaW4oZGVzdCwgc3JjLCBzcmMgKyBudW0pO1xyXG4gICAgfVxyXG5cclxuICBmdW5jdGlvbiBnZXRIZWFwTWF4KCkge1xyXG4gICAgICAvLyBTdGF5IG9uZSBXYXNtIHBhZ2Ugc2hvcnQgb2YgNEdCOiB3aGlsZSBlLmcuIENocm9tZSBpcyBhYmxlIHRvIGFsbG9jYXRlXHJcbiAgICAgIC8vIGZ1bGwgNEdCIFdhc20gbWVtb3JpZXMsIHRoZSBzaXplIHdpbGwgd3JhcCBiYWNrIHRvIDAgYnl0ZXMgaW4gV2FzbSBzaWRlXHJcbiAgICAgIC8vIGZvciBhbnkgY29kZSB0aGF0IGRlYWxzIHdpdGggaGVhcCBzaXplcywgd2hpY2ggd291bGQgcmVxdWlyZSBzcGVjaWFsXHJcbiAgICAgIC8vIGNhc2luZyBhbGwgaGVhcCBzaXplIHJlbGF0ZWQgY29kZSB0byB0cmVhdCAwIHNwZWNpYWxseS5cclxuICAgICAgcmV0dXJuIDIxNDc0ODM2NDg7XHJcbiAgICB9XHJcbiAgXHJcbiAgZnVuY3Rpb24gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihzaXplKSB7XHJcbiAgICAgIHZhciBiID0gd2FzbU1lbW9yeS5idWZmZXI7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gcm91bmQgc2l6ZSBncm93IHJlcXVlc3QgdXAgdG8gd2FzbSBwYWdlIHNpemUgKGZpeGVkIDY0S0IgcGVyIHNwZWMpXHJcbiAgICAgICAgd2FzbU1lbW9yeS5ncm93KChzaXplIC0gYi5ieXRlTGVuZ3RoICsgNjU1MzUpID4+PiAxNik7IC8vIC5ncm93KCkgdGFrZXMgYSBkZWx0YSBjb21wYXJlZCB0byB0aGUgcHJldmlvdXMgc2l6ZVxyXG4gICAgICAgIHVwZGF0ZU1lbW9yeVZpZXdzKCk7XHJcbiAgICAgICAgcmV0dXJuIDEgLypzdWNjZXNzKi87XHJcbiAgICAgIH0gY2F0Y2goZSkge1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGltcGxpY2l0IDAgcmV0dXJuIHRvIHNhdmUgY29kZSBzaXplIChjYWxsZXIgd2lsbCBjYXN0IFwidW5kZWZpbmVkXCIgaW50byAwXHJcbiAgICAgIC8vIGFueWhvdylcclxuICAgIH1cclxuICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcChyZXF1ZXN0ZWRTaXplKSB7XHJcbiAgICAgIHZhciBvbGRTaXplID0gSEVBUFU4Lmxlbmd0aDtcclxuICAgICAgcmVxdWVzdGVkU2l6ZSA9IHJlcXVlc3RlZFNpemUgPj4+IDA7XHJcbiAgICAgIC8vIFdpdGggbXVsdGl0aHJlYWRlZCBidWlsZHMsIHJhY2VzIGNhbiBoYXBwZW4gKGFub3RoZXIgdGhyZWFkIG1pZ2h0IGluY3JlYXNlIHRoZSBzaXplXHJcbiAgICAgIC8vIGluIGJldHdlZW4pLCBzbyByZXR1cm4gYSBmYWlsdXJlLCBhbmQgbGV0IHRoZSBjYWxsZXIgcmV0cnkuXHJcbiAgXHJcbiAgICAgIC8vIE1lbW9yeSByZXNpemUgcnVsZXM6XHJcbiAgICAgIC8vIDEuICBBbHdheXMgaW5jcmVhc2UgaGVhcCBzaXplIHRvIGF0IGxlYXN0IHRoZSByZXF1ZXN0ZWQgc2l6ZSwgcm91bmRlZCB1cFxyXG4gICAgICAvLyAgICAgdG8gbmV4dCBwYWdlIG11bHRpcGxlLlxyXG4gICAgICAvLyAyYS4gSWYgTUVNT1JZX0dST1dUSF9MSU5FQVJfU1RFUCA9PSAtMSwgZXhjZXNzaXZlbHkgcmVzaXplIHRoZSBoZWFwXHJcbiAgICAgIC8vICAgICBnZW9tZXRyaWNhbGx5OiBpbmNyZWFzZSB0aGUgaGVhcCBzaXplIGFjY29yZGluZyB0b1xyXG4gICAgICAvLyAgICAgTUVNT1JZX0dST1dUSF9HRU9NRVRSSUNfU1RFUCBmYWN0b3IgKGRlZmF1bHQgKzIwJSksIEF0IG1vc3RcclxuICAgICAgLy8gICAgIG92ZXJyZXNlcnZlIGJ5IE1FTU9SWV9HUk9XVEhfR0VPTUVUUklDX0NBUCBieXRlcyAoZGVmYXVsdCA5Nk1CKS5cclxuICAgICAgLy8gMmIuIElmIE1FTU9SWV9HUk9XVEhfTElORUFSX1NURVAgIT0gLTEsIGV4Y2Vzc2l2ZWx5IHJlc2l6ZSB0aGUgaGVhcFxyXG4gICAgICAvLyAgICAgbGluZWFybHk6IGluY3JlYXNlIHRoZSBoZWFwIHNpemUgYnkgYXQgbGVhc3RcclxuICAgICAgLy8gICAgIE1FTU9SWV9HUk9XVEhfTElORUFSX1NURVAgYnl0ZXMuXHJcbiAgICAgIC8vIDMuICBNYXggc2l6ZSBmb3IgdGhlIGhlYXAgaXMgY2FwcGVkIGF0IDIwNDhNQi1XQVNNX1BBR0VfU0laRSwgb3IgYnlcclxuICAgICAgLy8gICAgIE1BWElNVU1fTUVNT1JZLCBvciBieSBBU0FOIGxpbWl0LCBkZXBlbmRpbmcgb24gd2hpY2ggaXMgc21hbGxlc3RcclxuICAgICAgLy8gNC4gIElmIHdlIHdlcmUgdW5hYmxlIHRvIGFsbG9jYXRlIGFzIG11Y2ggbWVtb3J5LCBpdCBtYXkgYmUgZHVlIHRvXHJcbiAgICAgIC8vICAgICBvdmVyLWVhZ2VyIGRlY2lzaW9uIHRvIGV4Y2Vzc2l2ZWx5IHJlc2VydmUgZHVlIHRvICgzKSBhYm92ZS5cclxuICAgICAgLy8gICAgIEhlbmNlIGlmIGFuIGFsbG9jYXRpb24gZmFpbHMsIGN1dCBkb3duIG9uIHRoZSBhbW91bnQgb2YgZXhjZXNzXHJcbiAgICAgIC8vICAgICBncm93dGgsIGluIGFuIGF0dGVtcHQgdG8gc3VjY2VlZCB0byBwZXJmb3JtIGEgc21hbGxlciBhbGxvY2F0aW9uLlxyXG4gIFxyXG4gICAgICAvLyBBIGxpbWl0IGlzIHNldCBmb3IgaG93IG11Y2ggd2UgY2FuIGdyb3cuIFdlIHNob3VsZCBub3QgZXhjZWVkIHRoYXRcclxuICAgICAgLy8gKHRoZSB3YXNtIGJpbmFyeSBzcGVjaWZpZXMgaXQsIHNvIGlmIHdlIHRyaWVkLCB3ZSdkIGZhaWwgYW55aG93KS5cclxuICAgICAgdmFyIG1heEhlYXBTaXplID0gZ2V0SGVhcE1heCgpO1xyXG4gICAgICBpZiAocmVxdWVzdGVkU2l6ZSA+IG1heEhlYXBTaXplKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIGxldCBhbGlnblVwID0gKHgsIG11bHRpcGxlKSA9PiB4ICsgKG11bHRpcGxlIC0geCAlIG11bHRpcGxlKSAlIG11bHRpcGxlO1xyXG4gIFxyXG4gICAgICAvLyBMb29wIHRocm91Z2ggcG90ZW50aWFsIGhlYXAgc2l6ZSBpbmNyZWFzZXMuIElmIHdlIGF0dGVtcHQgYSB0b28gZWFnZXJcclxuICAgICAgLy8gcmVzZXJ2YXRpb24gdGhhdCBmYWlscywgY3V0IGRvd24gb24gdGhlIGF0dGVtcHRlZCBzaXplIGFuZCByZXNlcnZlIGFcclxuICAgICAgLy8gc21hbGxlciBidW1wIGluc3RlYWQuIChtYXggMyB0aW1lcywgY2hvc2VuIHNvbWV3aGF0IGFyYml0cmFyaWx5KVxyXG4gICAgICBmb3IgKHZhciBjdXREb3duID0gMTsgY3V0RG93biA8PSA0OyBjdXREb3duICo9IDIpIHtcclxuICAgICAgICB2YXIgb3Zlckdyb3duSGVhcFNpemUgPSBvbGRTaXplICogKDEgKyAwLjIgLyBjdXREb3duKTsgLy8gZW5zdXJlIGdlb21ldHJpYyBncm93dGhcclxuICAgICAgICAvLyBidXQgbGltaXQgb3ZlcnJlc2VydmluZyAoZGVmYXVsdCB0byBjYXBwaW5nIGF0ICs5Nk1CIG92ZXJncm93dGggYXQgbW9zdClcclxuICAgICAgICBvdmVyR3Jvd25IZWFwU2l6ZSA9IE1hdGgubWluKG92ZXJHcm93bkhlYXBTaXplLCByZXF1ZXN0ZWRTaXplICsgMTAwNjYzMjk2ICk7XHJcbiAgXHJcbiAgICAgICAgdmFyIG5ld1NpemUgPSBNYXRoLm1pbihtYXhIZWFwU2l6ZSwgYWxpZ25VcChNYXRoLm1heChyZXF1ZXN0ZWRTaXplLCBvdmVyR3Jvd25IZWFwU2l6ZSksIDY1NTM2KSk7XHJcbiAgXHJcbiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihuZXdTaXplKTtcclxuICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHtcclxuICBcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldENGdW5jKGlkZW50KSB7XHJcbiAgICAgIHZhciBmdW5jID0gTW9kdWxlWydfJyArIGlkZW50XTsgLy8gY2xvc3VyZSBleHBvcnRlZCBmdW5jdGlvblxyXG4gICAgICByZXR1cm4gZnVuYztcclxuICAgIH1cclxuICBcclxuICBcclxuICBmdW5jdGlvbiB3cml0ZUFycmF5VG9NZW1vcnkoYXJyYXksIGJ1ZmZlcikge1xyXG4gICAgICBIRUFQOC5zZXQoYXJyYXksIGJ1ZmZlcik7XHJcbiAgICB9XHJcbiAgXHJcbiAgZnVuY3Rpb24gbGVuZ3RoQnl0ZXNVVEY4KHN0cikge1xyXG4gICAgICB2YXIgbGVuID0gMDtcclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcclxuICAgICAgICAvLyBHb3RjaGE6IGNoYXJDb2RlQXQgcmV0dXJucyBhIDE2LWJpdCB3b3JkIHRoYXQgaXMgYSBVVEYtMTYgZW5jb2RlZCBjb2RlXHJcbiAgICAgICAgLy8gdW5pdCwgbm90IGEgVW5pY29kZSBjb2RlIHBvaW50IG9mIHRoZSBjaGFyYWN0ZXIhIFNvIGRlY29kZVxyXG4gICAgICAgIC8vIFVURjE2LT5VVEYzMi0+VVRGOC5cclxuICAgICAgICAvLyBTZWUgaHR0cDovL3VuaWNvZGUub3JnL2ZhcS91dGZfYm9tLmh0bWwjdXRmMTYtM1xyXG4gICAgICAgIHZhciBjID0gc3RyLmNoYXJDb2RlQXQoaSk7IC8vIHBvc3NpYmx5IGEgbGVhZCBzdXJyb2dhdGVcclxuICAgICAgICBpZiAoYyA8PSAweDdGKSB7XHJcbiAgICAgICAgICBsZW4rKztcclxuICAgICAgICB9IGVsc2UgaWYgKGMgPD0gMHg3RkYpIHtcclxuICAgICAgICAgIGxlbiArPSAyO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYpIHtcclxuICAgICAgICAgIGxlbiArPSA0OyArK2k7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxlbiArPSAzO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbGVuO1xyXG4gICAgfVxyXG4gIFxyXG4gIGZ1bmN0aW9uIHN0cmluZ1RvVVRGOEFycmF5KHN0ciwgaGVhcCwgb3V0SWR4LCBtYXhCeXRlc1RvV3JpdGUpIHtcclxuICAgICAgLy8gUGFyYW1ldGVyIG1heEJ5dGVzVG9Xcml0ZSBpcyBub3Qgb3B0aW9uYWwuIE5lZ2F0aXZlIHZhbHVlcywgMCwgbnVsbCxcclxuICAgICAgLy8gdW5kZWZpbmVkIGFuZCBmYWxzZSBlYWNoIGRvbid0IHdyaXRlIG91dCBhbnkgYnl0ZXMuXHJcbiAgICAgIGlmICghKG1heEJ5dGVzVG9Xcml0ZSA+IDApKVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gIFxyXG4gICAgICB2YXIgc3RhcnRJZHggPSBvdXRJZHg7XHJcbiAgICAgIHZhciBlbmRJZHggPSBvdXRJZHggKyBtYXhCeXRlc1RvV3JpdGUgLSAxOyAvLyAtMSBmb3Igc3RyaW5nIG51bGwgdGVybWluYXRvci5cclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcclxuICAgICAgICAvLyBHb3RjaGE6IGNoYXJDb2RlQXQgcmV0dXJucyBhIDE2LWJpdCB3b3JkIHRoYXQgaXMgYSBVVEYtMTYgZW5jb2RlZCBjb2RlXHJcbiAgICAgICAgLy8gdW5pdCwgbm90IGEgVW5pY29kZSBjb2RlIHBvaW50IG9mIHRoZSBjaGFyYWN0ZXIhIFNvIGRlY29kZVxyXG4gICAgICAgIC8vIFVURjE2LT5VVEYzMi0+VVRGOC5cclxuICAgICAgICAvLyBTZWUgaHR0cDovL3VuaWNvZGUub3JnL2ZhcS91dGZfYm9tLmh0bWwjdXRmMTYtM1xyXG4gICAgICAgIC8vIEZvciBVVEY4IGJ5dGUgc3RydWN0dXJlLCBzZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtOCNEZXNjcmlwdGlvblxyXG4gICAgICAgIC8vIGFuZCBodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjI3OS50eHRcclxuICAgICAgICAvLyBhbmQgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM2MjlcclxuICAgICAgICB2YXIgdSA9IHN0ci5jaGFyQ29kZUF0KGkpOyAvLyBwb3NzaWJseSBhIGxlYWQgc3Vycm9nYXRlXHJcbiAgICAgICAgaWYgKHUgPj0gMHhEODAwICYmIHUgPD0gMHhERkZGKSB7XHJcbiAgICAgICAgICB2YXIgdTEgPSBzdHIuY2hhckNvZGVBdCgrK2kpO1xyXG4gICAgICAgICAgdSA9IDB4MTAwMDAgKyAoKHUgJiAweDNGRikgPDwgMTApIHwgKHUxICYgMHgzRkYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodSA8PSAweDdGKSB7XHJcbiAgICAgICAgICBpZiAob3V0SWR4ID49IGVuZElkeCkgYnJlYWs7XHJcbiAgICAgICAgICBoZWFwW291dElkeCsrXSA9IHU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh1IDw9IDB4N0ZGKSB7XHJcbiAgICAgICAgICBpZiAob3V0SWR4ICsgMSA+PSBlbmRJZHgpIGJyZWFrO1xyXG4gICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAweEMwIHwgKHUgPj4gNik7XHJcbiAgICAgICAgICBoZWFwW291dElkeCsrXSA9IDB4ODAgfCAodSAmIDYzKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHUgPD0gMHhGRkZGKSB7XHJcbiAgICAgICAgICBpZiAob3V0SWR4ICsgMiA+PSBlbmRJZHgpIGJyZWFrO1xyXG4gICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAweEUwIHwgKHUgPj4gMTIpO1xyXG4gICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAweDgwIHwgKCh1ID4+IDYpICYgNjMpO1xyXG4gICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAweDgwIHwgKHUgJiA2Myk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChvdXRJZHggKyAzID49IGVuZElkeCkgYnJlYWs7XHJcbiAgICAgICAgICBoZWFwW291dElkeCsrXSA9IDB4RjAgfCAodSA+PiAxOCk7XHJcbiAgICAgICAgICBoZWFwW291dElkeCsrXSA9IDB4ODAgfCAoKHUgPj4gMTIpICYgNjMpO1xyXG4gICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAweDgwIHwgKCh1ID4+IDYpICYgNjMpO1xyXG4gICAgICAgICAgaGVhcFtvdXRJZHgrK10gPSAweDgwIHwgKHUgJiA2Myk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIE51bGwtdGVybWluYXRlIHRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIuXHJcbiAgICAgIGhlYXBbb3V0SWR4XSA9IDA7XHJcbiAgICAgIHJldHVybiBvdXRJZHggLSBzdGFydElkeDtcclxuICAgIH1cclxuICBmdW5jdGlvbiBzdHJpbmdUb1VURjgoc3RyLCBvdXRQdHIsIG1heEJ5dGVzVG9Xcml0ZSkge1xyXG4gICAgICByZXR1cm4gc3RyaW5nVG9VVEY4QXJyYXkoc3RyLCBIRUFQVTgsb3V0UHRyLCBtYXhCeXRlc1RvV3JpdGUpO1xyXG4gICAgfVxyXG4gIGZ1bmN0aW9uIHN0cmluZ1RvVVRGOE9uU3RhY2soc3RyKSB7XHJcbiAgICAgIHZhciBzaXplID0gbGVuZ3RoQnl0ZXNVVEY4KHN0cikgKyAxO1xyXG4gICAgICB2YXIgcmV0ID0gc3RhY2tBbGxvYyhzaXplKTtcclxuICAgICAgc3RyaW5nVG9VVEY4KHN0ciwgcmV0LCBzaXplKTtcclxuICAgICAgcmV0dXJuIHJldDtcclxuICAgIH1cclxuICBcclxuICB2YXIgVVRGOERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgIT0gJ3VuZGVmaW5lZCcgPyBuZXcgVGV4dERlY29kZXIoJ3V0ZjgnKSA6IHVuZGVmaW5lZDtcclxuICBcclxuICAgIC8qKlxyXG4gICAgICogR2l2ZW4gYSBwb2ludGVyICdpZHgnIHRvIGEgbnVsbC10ZXJtaW5hdGVkIFVURjgtZW5jb2RlZCBzdHJpbmcgaW4gdGhlIGdpdmVuXHJcbiAgICAgKiBhcnJheSB0aGF0IGNvbnRhaW5zIHVpbnQ4IHZhbHVlcywgcmV0dXJucyBhIGNvcHkgb2YgdGhhdCBzdHJpbmcgYXMgYVxyXG4gICAgICogSmF2YXNjcmlwdCBTdHJpbmcgb2JqZWN0LlxyXG4gICAgICogaGVhcE9yQXJyYXkgaXMgZWl0aGVyIGEgcmVndWxhciBhcnJheSwgb3IgYSBKYXZhU2NyaXB0IHR5cGVkIGFycmF5IHZpZXcuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaWR4XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG1heEJ5dGVzVG9SZWFkXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICAgKi9cclxuICBmdW5jdGlvbiBVVEY4QXJyYXlUb1N0cmluZyhoZWFwT3JBcnJheSwgaWR4LCBtYXhCeXRlc1RvUmVhZCkge1xyXG4gICAgICB2YXIgZW5kSWR4ID0gaWR4ICsgbWF4Qnl0ZXNUb1JlYWQ7XHJcbiAgICAgIHZhciBlbmRQdHIgPSBpZHg7XHJcbiAgICAgIC8vIFRleHREZWNvZGVyIG5lZWRzIHRvIGtub3cgdGhlIGJ5dGUgbGVuZ3RoIGluIGFkdmFuY2UsIGl0IGRvZXNuJ3Qgc3RvcCBvblxyXG4gICAgICAvLyBudWxsIHRlcm1pbmF0b3IgYnkgaXRzZWxmLiAgQWxzbywgdXNlIHRoZSBsZW5ndGggaW5mbyB0byBhdm9pZCBydW5uaW5nIHRpbnlcclxuICAgICAgLy8gc3RyaW5ncyB0aHJvdWdoIFRleHREZWNvZGVyLCBzaW5jZSAuc3ViYXJyYXkoKSBhbGxvY2F0ZXMgZ2FyYmFnZS5cclxuICAgICAgLy8gKEFzIGEgdGlueSBjb2RlIHNhdmUgdHJpY2ssIGNvbXBhcmUgZW5kUHRyIGFnYWluc3QgZW5kSWR4IHVzaW5nIGEgbmVnYXRpb24sXHJcbiAgICAgIC8vIHNvIHRoYXQgdW5kZWZpbmVkIG1lYW5zIEluZmluaXR5KVxyXG4gICAgICB3aGlsZSAoaGVhcE9yQXJyYXlbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKSArK2VuZFB0cjtcclxuICBcclxuICAgICAgaWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXBPckFycmF5LmJ1ZmZlciAmJiBVVEY4RGVjb2Rlcikge1xyXG4gICAgICAgIHJldHVybiBVVEY4RGVjb2Rlci5kZWNvZGUoaGVhcE9yQXJyYXkuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTtcclxuICAgICAgfVxyXG4gICAgICB2YXIgc3RyID0gJyc7XHJcbiAgICAgIC8vIElmIGJ1aWxkaW5nIHdpdGggVGV4dERlY29kZXIsIHdlIGhhdmUgYWxyZWFkeSBjb21wdXRlZCB0aGUgc3RyaW5nIGxlbmd0aFxyXG4gICAgICAvLyBhYm92ZSwgc28gdGVzdCBsb29wIGVuZCBjb25kaXRpb24gYWdhaW5zdCB0aGF0XHJcbiAgICAgIHdoaWxlIChpZHggPCBlbmRQdHIpIHtcclxuICAgICAgICAvLyBGb3IgVVRGOCBieXRlIHN0cnVjdHVyZSwgc2VlOlxyXG4gICAgICAgIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTgjRGVzY3JpcHRpb25cclxuICAgICAgICAvLyBodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjI3OS50eHRcclxuICAgICAgICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzYyOVxyXG4gICAgICAgIHZhciB1MCA9IGhlYXBPckFycmF5W2lkeCsrXTtcclxuICAgICAgICBpZiAoISh1MCAmIDB4ODApKSB7IHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTsgY29udGludWU7IH1cclxuICAgICAgICB2YXIgdTEgPSBoZWFwT3JBcnJheVtpZHgrK10gJiA2MztcclxuICAgICAgICBpZiAoKHUwICYgMHhFMCkgPT0gMHhDMCkgeyBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKHUwICYgMzEpIDw8IDYpIHwgdTEpOyBjb250aW51ZTsgfVxyXG4gICAgICAgIHZhciB1MiA9IGhlYXBPckFycmF5W2lkeCsrXSAmIDYzO1xyXG4gICAgICAgIGlmICgodTAgJiAweEYwKSA9PSAweEUwKSB7XHJcbiAgICAgICAgICB1MCA9ICgodTAgJiAxNSkgPDwgMTIpIHwgKHUxIDw8IDYpIHwgdTI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHUwID0gKCh1MCAmIDcpIDw8IDE4KSB8ICh1MSA8PCAxMikgfCAodTIgPDwgNikgfCAoaGVhcE9yQXJyYXlbaWR4KytdICYgNjMpO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICBpZiAodTAgPCAweDEwMDAwKSB7XHJcbiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZhciBjaCA9IHUwIC0gMHgxMDAwMDtcclxuICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RDgwMCB8IChjaCA+PiAxMCksIDB4REMwMCB8IChjaCAmIDB4M0ZGKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcbiAgXHJcbiAgXHJcbiAgICAvKipcclxuICAgICAqIEdpdmVuIGEgcG9pbnRlciAncHRyJyB0byBhIG51bGwtdGVybWluYXRlZCBVVEY4LWVuY29kZWQgc3RyaW5nIGluIHRoZVxyXG4gICAgICogZW1zY3JpcHRlbiBIRUFQLCByZXR1cm5zIGEgY29weSBvZiB0aGF0IHN0cmluZyBhcyBhIEphdmFzY3JpcHQgU3RyaW5nIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcHRyXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IG1heEJ5dGVzVG9SZWFkIC0gQW4gb3B0aW9uYWwgbGVuZ3RoIHRoYXQgc3BlY2lmaWVzIHRoZVxyXG4gICAgICogICBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkLiBZb3UgY2FuIG9taXQgdGhpcyBwYXJhbWV0ZXIgdG8gc2NhbiB0aGVcclxuICAgICAqICAgc3RyaW5nIHVudGlsIHRoZSBmaXJzdCBcdTAwMDAgYnl0ZS4gSWYgbWF4Qnl0ZXNUb1JlYWQgaXMgcGFzc2VkLCBhbmQgdGhlIHN0cmluZ1xyXG4gICAgICogICBhdCBbcHRyLCBwdHIrbWF4Qnl0ZXNUb1JlYWRyWyBjb250YWlucyBhIG51bGwgYnl0ZSBpbiB0aGUgbWlkZGxlLCB0aGVuIHRoZVxyXG4gICAgICogICBzdHJpbmcgd2lsbCBjdXQgc2hvcnQgYXQgdGhhdCBieXRlIGluZGV4IChpLmUuIG1heEJ5dGVzVG9SZWFkIHdpbGwgbm90XHJcbiAgICAgKiAgIHByb2R1Y2UgYSBzdHJpbmcgb2YgZXhhY3QgbGVuZ3RoIFtwdHIsIHB0cittYXhCeXRlc1RvUmVhZFspIE4uQi4gbWl4aW5nXHJcbiAgICAgKiAgIGZyZXF1ZW50IHVzZXMgb2YgVVRGOFRvU3RyaW5nKCkgd2l0aCBhbmQgd2l0aG91dCBtYXhCeXRlc1RvUmVhZCBtYXkgdGhyb3dcclxuICAgICAqICAgSlMgSklUIG9wdGltaXphdGlvbnMgb2ZmLCBzbyBpdCBpcyB3b3J0aCB0byBjb25zaWRlciBjb25zaXN0ZW50bHkgdXNpbmcgb25lXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICAgKi9cclxuICBmdW5jdGlvbiBVVEY4VG9TdHJpbmcocHRyLCBtYXhCeXRlc1RvUmVhZCkge1xyXG4gICAgICByZXR1cm4gcHRyID8gVVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LCBwdHIsIG1heEJ5dGVzVG9SZWFkKSA6ICcnO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsPX0gcmV0dXJuVHlwZVxyXG4gICAgICogQHBhcmFtIHtBcnJheT19IGFyZ1R5cGVzXHJcbiAgICAgKiBAcGFyYW0ge0FyZ3VtZW50c3xBcnJheT19IGFyZ3NcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0c1xyXG4gICAgICovXHJcbiAgZnVuY3Rpb24gY2NhbGwoaWRlbnQsIHJldHVyblR5cGUsIGFyZ1R5cGVzLCBhcmdzLCBvcHRzKSB7XHJcbiAgICAgIC8vIEZvciBmYXN0IGxvb2t1cCBvZiBjb252ZXJzaW9uIGZ1bmN0aW9uc1xyXG4gICAgICB2YXIgdG9DID0ge1xyXG4gICAgICAgICdzdHJpbmcnOiAoc3RyKSA9PiB7XHJcbiAgICAgICAgICB2YXIgcmV0ID0gMDtcclxuICAgICAgICAgIGlmIChzdHIgIT09IG51bGwgJiYgc3RyICE9PSB1bmRlZmluZWQgJiYgc3RyICE9PSAwKSB7IC8vIG51bGwgc3RyaW5nXHJcbiAgICAgICAgICAgIC8vIGF0IG1vc3QgNCBieXRlcyBwZXIgVVRGLTggY29kZSBwb2ludCwgKzEgZm9yIHRoZSB0cmFpbGluZyAnXFwwJ1xyXG4gICAgICAgICAgICByZXQgPSBzdHJpbmdUb1VURjhPblN0YWNrKHN0cik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2FycmF5JzogKGFycikgPT4ge1xyXG4gICAgICAgICAgdmFyIHJldCA9IHN0YWNrQWxsb2MoYXJyLmxlbmd0aCk7XHJcbiAgICAgICAgICB3cml0ZUFycmF5VG9NZW1vcnkoYXJyLCByZXQpO1xyXG4gICAgICAgICAgcmV0dXJuIHJldDtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgXHJcbiAgICAgIGZ1bmN0aW9uIGNvbnZlcnRSZXR1cm5WYWx1ZShyZXQpIHtcclxuICAgICAgICBpZiAocmV0dXJuVHlwZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgcmV0dXJuIFVURjhUb1N0cmluZyhyZXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmV0dXJuVHlwZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gQm9vbGVhbihyZXQpO1xyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgdmFyIGZ1bmMgPSBnZXRDRnVuYyhpZGVudCk7XHJcbiAgICAgIHZhciBjQXJncyA9IFtdO1xyXG4gICAgICB2YXIgc3RhY2sgPSAwO1xyXG4gICAgICBpZiAoYXJncykge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgdmFyIGNvbnZlcnRlciA9IHRvQ1thcmdUeXBlc1tpXV07XHJcbiAgICAgICAgICBpZiAoY29udmVydGVyKSB7XHJcbiAgICAgICAgICAgIGlmIChzdGFjayA9PT0gMCkgc3RhY2sgPSBzdGFja1NhdmUoKTtcclxuICAgICAgICAgICAgY0FyZ3NbaV0gPSBjb252ZXJ0ZXIoYXJnc1tpXSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjQXJnc1tpXSA9IGFyZ3NbaV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHZhciByZXQgPSBmdW5jLmFwcGx5KG51bGwsIGNBcmdzKTtcclxuICAgICAgZnVuY3Rpb24gb25Eb25lKHJldCkge1xyXG4gICAgICAgIGlmIChzdGFjayAhPT0gMCkgc3RhY2tSZXN0b3JlKHN0YWNrKTtcclxuICAgICAgICByZXR1cm4gY29udmVydFJldHVyblZhbHVlKHJldCk7XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgcmV0ID0gb25Eb25lKHJldCk7XHJcbiAgICAgIHJldHVybiByZXQ7XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gcmV0dXJuVHlwZVxyXG4gICAgICogQHBhcmFtIHtBcnJheT19IGFyZ1R5cGVzXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IG9wdHNcclxuICAgICAqL1xyXG4gIGZ1bmN0aW9uIGN3cmFwKGlkZW50LCByZXR1cm5UeXBlLCBhcmdUeXBlcywgb3B0cykge1xyXG4gICAgICAvLyBXaGVuIHRoZSBmdW5jdGlvbiB0YWtlcyBudW1iZXJzIGFuZCByZXR1cm5zIGEgbnVtYmVyLCB3ZSBjYW4ganVzdCByZXR1cm5cclxuICAgICAgLy8gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uXHJcbiAgICAgIHZhciBudW1lcmljQXJncyA9ICFhcmdUeXBlcyB8fCBhcmdUeXBlcy5ldmVyeSgodHlwZSkgPT4gdHlwZSA9PT0gJ251bWJlcicgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKTtcclxuICAgICAgdmFyIG51bWVyaWNSZXQgPSByZXR1cm5UeXBlICE9PSAnc3RyaW5nJztcclxuICAgICAgaWYgKG51bWVyaWNSZXQgJiYgbnVtZXJpY0FyZ3MgJiYgIW9wdHMpIHtcclxuICAgICAgICByZXR1cm4gZ2V0Q0Z1bmMoaWRlbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gY2NhbGwoaWRlbnQsIHJldHVyblR5cGUsIGFyZ1R5cGVzLCBhcmd1bWVudHMsIG9wdHMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG52YXIgd2FzbUltcG9ydHMgPSB7XHJcbiAgXCJfX2N4YV90aHJvd1wiOiBfX19jeGFfdGhyb3csXHJcbiAgXCJhYm9ydFwiOiBfYWJvcnQsXHJcbiAgXCJlbXNjcmlwdGVuX21lbWNweV9iaWdcIjogX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyxcclxuICBcImVtc2NyaXB0ZW5fcmVzaXplX2hlYXBcIjogX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXBcclxufTtcclxudmFyIGFzbSA9IGNyZWF0ZVdhc20oKTtcclxuLyoqIEB0eXBlIHtmdW5jdGlvbiguLi4qKTo/fSAqL1xyXG52YXIgX19fd2FzbV9jYWxsX2N0b3JzID0gZnVuY3Rpb24oKSB7XHJcbiAgcmV0dXJuIChfX193YXNtX2NhbGxfY3RvcnMgPSBNb2R1bGVbXCJhc21cIl1bXCJfX3dhc21fY2FsbF9jdG9yc1wiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcclxufTtcclxuXHJcbi8qKiBAdHlwZSB7ZnVuY3Rpb24oLi4uKik6P30gKi9cclxudmFyIF9kYnNjYW4gPSBNb2R1bGVbXCJfZGJzY2FuXCJdID0gZnVuY3Rpb24oKSB7XHJcbiAgcmV0dXJuIChfZGJzY2FuID0gTW9kdWxlW1wiX2Ric2NhblwiXSA9IE1vZHVsZVtcImFzbVwiXVtcImRic2NhblwiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcclxufTtcclxuXHJcbi8qKiBAdHlwZSB7ZnVuY3Rpb24oLi4uKik6P30gKi9cclxudmFyIF9fX2Vycm5vX2xvY2F0aW9uID0gZnVuY3Rpb24oKSB7XHJcbiAgcmV0dXJuIChfX19lcnJub19sb2NhdGlvbiA9IE1vZHVsZVtcImFzbVwiXVtcIl9fZXJybm9fbG9jYXRpb25cIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XHJcbn07XHJcblxyXG4vKiogQHR5cGUge2Z1bmN0aW9uKC4uLiopOj99ICovXHJcbnZhciBfbWFsbG9jID0gTW9kdWxlW1wiX21hbGxvY1wiXSA9IGZ1bmN0aW9uKCkge1xyXG4gIHJldHVybiAoX21hbGxvYyA9IE1vZHVsZVtcIl9tYWxsb2NcIl0gPSBNb2R1bGVbXCJhc21cIl1bXCJtYWxsb2NcIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XHJcbn07XHJcblxyXG4vKiogQHR5cGUge2Z1bmN0aW9uKC4uLiopOj99ICovXHJcbnZhciBfZnJlZSA9IE1vZHVsZVtcIl9mcmVlXCJdID0gZnVuY3Rpb24oKSB7XHJcbiAgcmV0dXJuIChfZnJlZSA9IE1vZHVsZVtcIl9mcmVlXCJdID0gTW9kdWxlW1wiYXNtXCJdW1wiZnJlZVwiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcclxufTtcclxuXHJcbi8qKiBAdHlwZSB7ZnVuY3Rpb24oLi4uKik6P30gKi9cclxudmFyIHN0YWNrU2F2ZSA9IGZ1bmN0aW9uKCkge1xyXG4gIHJldHVybiAoc3RhY2tTYXZlID0gTW9kdWxlW1wiYXNtXCJdW1wic3RhY2tTYXZlXCJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xyXG59O1xyXG5cclxuLyoqIEB0eXBlIHtmdW5jdGlvbiguLi4qKTo/fSAqL1xyXG52YXIgc3RhY2tSZXN0b3JlID0gZnVuY3Rpb24oKSB7XHJcbiAgcmV0dXJuIChzdGFja1Jlc3RvcmUgPSBNb2R1bGVbXCJhc21cIl1bXCJzdGFja1Jlc3RvcmVcIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XHJcbn07XHJcblxyXG4vKiogQHR5cGUge2Z1bmN0aW9uKC4uLiopOj99ICovXHJcbnZhciBzdGFja0FsbG9jID0gZnVuY3Rpb24oKSB7XHJcbiAgcmV0dXJuIChzdGFja0FsbG9jID0gTW9kdWxlW1wiYXNtXCJdW1wic3RhY2tBbGxvY1wiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcclxufTtcclxuXHJcbi8qKiBAdHlwZSB7ZnVuY3Rpb24oLi4uKik6P30gKi9cclxudmFyIF9fX2N4YV9pc19wb2ludGVyX3R5cGUgPSBmdW5jdGlvbigpIHtcclxuICByZXR1cm4gKF9fX2N4YV9pc19wb2ludGVyX3R5cGUgPSBNb2R1bGVbXCJhc21cIl1bXCJfX2N4YV9pc19wb2ludGVyX3R5cGVcIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XHJcbn07XHJcblxyXG5cclxuXHJcbi8vIGluY2x1ZGU6IHBvc3RhbWJsZS5qc1xyXG4vLyA9PT0gQXV0by1nZW5lcmF0ZWQgcG9zdGFtYmxlIHNldHVwIGVudHJ5IHN0dWZmID09PVxyXG5cclxuTW9kdWxlW1wiY2NhbGxcIl0gPSBjY2FsbDtcclxuTW9kdWxlW1wiY3dyYXBcIl0gPSBjd3JhcDtcclxuXHJcblxyXG52YXIgY2FsbGVkUnVuO1xyXG5cclxuZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gZnVuY3Rpb24gcnVuQ2FsbGVyKCkge1xyXG4gIC8vIElmIHJ1biBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQsIGFuZCB3ZSBzaG91bGQgY2FsbCBydW4gKElOVk9LRV9SVU4gaXMgdHJ1ZSwgYW5kIE1vZHVsZS5ub0luaXRpYWxSdW4gaXMgbm90IGZhbHNlKVxyXG4gIGlmICghY2FsbGVkUnVuKSBydW4oKTtcclxuICBpZiAoIWNhbGxlZFJ1bikgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gcnVuQ2FsbGVyOyAvLyB0cnkgdGhpcyBhZ2FpbiBsYXRlciwgYWZ0ZXIgbmV3IGRlcHMgYXJlIGZ1bGZpbGxlZFxyXG59O1xyXG5cclxuZnVuY3Rpb24gcnVuKCkge1xyXG5cclxuICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgcHJlUnVuKCk7XHJcblxyXG4gIC8vIGEgcHJlUnVuIGFkZGVkIGEgZGVwZW5kZW5jeSwgcnVuIHdpbGwgYmUgY2FsbGVkIGxhdGVyXHJcbiAgaWYgKHJ1bkRlcGVuZGVuY2llcyA+IDApIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGRvUnVuKCkge1xyXG4gICAgLy8gcnVuIG1heSBoYXZlIGp1c3QgYmVlbiBjYWxsZWQgdGhyb3VnaCBkZXBlbmRlbmNpZXMgYmVpbmcgZnVsZmlsbGVkIGp1c3QgaW4gdGhpcyB2ZXJ5IGZyYW1lLFxyXG4gICAgLy8gb3Igd2hpbGUgdGhlIGFzeW5jIHNldFN0YXR1cyB0aW1lIGJlbG93IHdhcyBoYXBwZW5pbmdcclxuICAgIGlmIChjYWxsZWRSdW4pIHJldHVybjtcclxuICAgIGNhbGxlZFJ1biA9IHRydWU7XHJcbiAgICBNb2R1bGVbJ2NhbGxlZFJ1biddID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAoQUJPUlQpIHJldHVybjtcclxuXHJcbiAgICBpbml0UnVudGltZSgpO1xyXG5cclxuICAgIHJlYWR5UHJvbWlzZVJlc29sdmUoTW9kdWxlKTtcclxuICAgIGlmIChNb2R1bGVbJ29uUnVudGltZUluaXRpYWxpemVkJ10pIE1vZHVsZVsnb25SdW50aW1lSW5pdGlhbGl6ZWQnXSgpO1xyXG5cclxuICAgIHBvc3RSdW4oKTtcclxuICB9XHJcblxyXG4gIGlmIChNb2R1bGVbJ3NldFN0YXR1cyddKSB7XHJcbiAgICBNb2R1bGVbJ3NldFN0YXR1cyddKCdSdW5uaW5nLi4uJyk7XHJcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIE1vZHVsZVsnc2V0U3RhdHVzJ10oJycpO1xyXG4gICAgICB9LCAxKTtcclxuICAgICAgZG9SdW4oKTtcclxuICAgIH0sIDEpO1xyXG4gIH0gZWxzZVxyXG4gIHtcclxuICAgIGRvUnVuKCk7XHJcbiAgfVxyXG59XHJcblxyXG5pZiAoTW9kdWxlWydwcmVJbml0J10pIHtcclxuICBpZiAodHlwZW9mIE1vZHVsZVsncHJlSW5pdCddID09ICdmdW5jdGlvbicpIE1vZHVsZVsncHJlSW5pdCddID0gW01vZHVsZVsncHJlSW5pdCddXTtcclxuICB3aGlsZSAoTW9kdWxlWydwcmVJbml0J10ubGVuZ3RoID4gMCkge1xyXG4gICAgTW9kdWxlWydwcmVJbml0J10ucG9wKCkoKTtcclxuICB9XHJcbn1cclxuXHJcbnJ1bigpO1xyXG5cclxuXHJcbi8vIGVuZCBpbmNsdWRlOiBwb3N0YW1ibGUuanNcclxuXHJcblxyXG4gIHJldHVybiBleHBvcnRDcHBEYnNjYW5MaWIucmVhZHlcclxufVxyXG5cclxuKTtcclxufSkoKTtcclxuaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JylcclxuICBtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydENwcERic2NhbkxpYjtcclxuZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbJ2FtZCddKVxyXG4gIGRlZmluZShbXSwgZnVuY3Rpb24oKSB7IHJldHVybiBleHBvcnRDcHBEYnNjYW5MaWI7IH0pO1xyXG5lbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXHJcbiAgZXhwb3J0c1tcImV4cG9ydENwcERic2NhbkxpYlwiXSA9IGV4cG9ydENwcERic2NhbkxpYjtcclxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0bG9hZGVkOiBmYWxzZSxcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG5cdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbl9fd2VicGFja19yZXF1aXJlX18ubSA9IF9fd2VicGFja19tb2R1bGVzX187XG5cbiIsIl9fd2VicGFja19yZXF1aXJlX18uYW1kTyA9IHt9OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5obWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZSA9IE9iamVjdC5jcmVhdGUobW9kdWxlKTtcblx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCAnZXhwb3J0cycsIHtcblx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdHNldDogKCkgPT4ge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdFUyBNb2R1bGVzIG1heSBub3QgYXNzaWduIG1vZHVsZS5leHBvcnRzIG9yIGV4cG9ydHMuKiwgVXNlIEVTTSBleHBvcnQgc3ludGF4LCBpbnN0ZWFkOiAnICsgbW9kdWxlLmlkKTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gbW9kdWxlO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwidmFyIHNjcmlwdFVybDtcbmlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLmcuaW1wb3J0U2NyaXB0cykgc2NyaXB0VXJsID0gX193ZWJwYWNrX3JlcXVpcmVfXy5nLmxvY2F0aW9uICsgXCJcIjtcbnZhciBkb2N1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5kb2N1bWVudDtcbmlmICghc2NyaXB0VXJsICYmIGRvY3VtZW50KSB7XG5cdGlmIChkb2N1bWVudC5jdXJyZW50U2NyaXB0KVxuXHRcdHNjcmlwdFVybCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjO1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHtcblx0XHRcdHZhciBpID0gc2NyaXB0cy5sZW5ndGggLSAxO1xuXHRcdFx0d2hpbGUgKGkgPiAtMSAmJiAhc2NyaXB0VXJsKSBzY3JpcHRVcmwgPSBzY3JpcHRzW2ktLV0uc3JjO1xuXHRcdH1cblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5iID0gc2VsZi5sb2NhdGlvbiArIFwiXCI7XG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgY2h1bmtzXG4vLyBcIjFcIiBtZWFucyBcImFscmVhZHkgbG9hZGVkXCJcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdDc5NjogMVxufTtcblxuLy8gbm8gY2h1bmsgaW5zdGFsbCBmdW5jdGlvbiBuZWVkZWRcbi8vIG5vIGNodW5rIGxvYWRpbmdcblxuLy8gbm8gSE1SXG5cbi8vIG5vIEhNUiBtYW5pZmVzdCIsImltcG9ydCB7IGV4cG9ydENwcERic2NhbkxpYiB9IGZyb20gXCIuL3dhc21EYnNjYW4uanNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRic2NhbihlbWJlZFgsIGVtYmVkWSwgZXBzaWxvbiwgbWluUHRzKSB7XG4gICAgY29uc3Qgd2FzbVVybCA9IG5ldyBVUkwoJy4vd2FzbURic2Nhbi53YXNtJywgaW1wb3J0Lm1ldGEudXJsKS5ocmVmO1xuICAgIGNvbnN0IHdhc21QYXRoID0gd2FzbVVybC5zdWJzdHJpbmcoMCwgd2FzbVVybC5sYXN0SW5kZXhPZignLycpICsgMSkgKyAnd2FzbURic2Nhbi53YXNtJztcbiAgICBsZXQgd2FzbUluc3RhbmNlO1xuICAgIHRyeSB7XG4gICAgICAgIHdhc21JbnN0YW5jZSA9IGF3YWl0IGV4cG9ydENwcERic2NhbkxpYih7bG9jYXRlRmlsZTogKCkgPT4gd2FzbVVybCwgcHJpbnRFcnI6IChfKSA9PiB7fX0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdhc21JbnN0YW5jZSA9IGF3YWl0IGV4cG9ydENwcERic2NhbkxpYih7bG9jYXRlRmlsZTogKCkgPT4gd2FzbVBhdGgsIHByaW50RXJyOiAoXykgPT4ge319KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGxvYWQgd2FzbSBmaWxlIGZvciBkYnNjYW4nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBnZXREYnNjYW5XYXNtID1cbiAgICB3YXNtSW5zdGFuY2UuY3dyYXAoJ2Ric2NhbicsICdudWxsJywgWydudW1iZXInLCAnbnVtYmVyJywgJ251bWJlcicsICdudW1iZXInLCAnbnVtYmVyJywgJ251bWJlciddKTtcbiAgICBjb25zdCBieXRlc0ZvckVtYmVkWCA9IEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCAqIGVtYmVkWC5sZW5ndGg7XG4gICAgY29uc3QgZGF0YVB0clggPSB3YXNtSW5zdGFuY2UuX21hbGxvYyhieXRlc0ZvckVtYmVkWCk7IC8vIGFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIG9uIHRoZSB3YXNtIGhlYXAgZm9yIHRoZSBlbWJlZFhcbiAgICBjb25zdCBkYXRhUHRyWSA9IHdhc21JbnN0YW5jZS5fbWFsbG9jKGJ5dGVzRm9yRW1iZWRYKTsgLy8gYWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgb24gdGhlIHdhc20gaGVhcCBmb3IgdGhlIGVtYmVkWVxuICAgIGNvbnN0IHhIZWFwID0gbmV3IFVpbnQ4QXJyYXkod2FzbUluc3RhbmNlLkhFQVBVOC5idWZmZXIsIGRhdGFQdHJYLCBieXRlc0ZvckVtYmVkWCk7XG4gICAgeEhlYXAuc2V0KG5ldyBVaW50OEFycmF5KGVtYmVkWC5idWZmZXIpKTsgLy8gY29weSBlbWJlZFggdG8gdGhlIHdhc20gaGVhcFxuICAgIGNvbnN0IHlIZWFwID0gbmV3IFVpbnQ4QXJyYXkod2FzbUluc3RhbmNlLkhFQVBVOC5idWZmZXIsIGRhdGFQdHJZLCBieXRlc0ZvckVtYmVkWCk7XG4gICAgeUhlYXAuc2V0KG5ldyBVaW50OEFycmF5KGVtYmVkWS5idWZmZXIpKTsgLy8gY29weSBlbWJlZFkgdG8gdGhlIHdhc20gaGVhcFxuICAgIFxuICAgIGNvbnN0IGNsdXN0ZXJQdHIgPSB3YXNtSW5zdGFuY2UuX21hbGxvYyhieXRlc0ZvckVtYmVkWCk7XG4gICAgY29uc3QgY2x1c3RlckhlYXAgPSBuZXcgVWludDhBcnJheSh3YXNtSW5zdGFuY2UuSEVBUFU4LmJ1ZmZlciwgY2x1c3RlclB0ciwgYnl0ZXNGb3JFbWJlZFgpO1xuXG4gICAgZ2V0RGJzY2FuV2FzbShkYXRhUHRyWCwgZGF0YVB0clksIGVtYmVkWC5sZW5ndGgsIGVwc2lsb24sIG1pblB0cywgY2x1c3RlclB0cik7XG4gICAgY29uc3QgY2x1c3RlclJlc3VsdCA9IG5ldyBJbnQzMkFycmF5KGNsdXN0ZXJIZWFwLmJ1ZmZlciwgY2x1c3RlckhlYXAuYnl0ZU9mZnNldCwgZW1iZWRYLmxlbmd0aCk7XG4gICAgd2FzbUluc3RhbmNlLl9mcmVlKHhIZWFwLmJ5dGVPZmZzZXQpO1xuICAgIHdhc21JbnN0YW5jZS5fZnJlZSh5SGVhcC5ieXRlT2Zmc2V0KTtcbiAgICB3YXNtSW5zdGFuY2UuX2ZyZWUoY2x1c3RlckhlYXAuYnl0ZU9mZnNldCk7XG4gICAgcmV0dXJuIGNsdXN0ZXJSZXN1bHQ7XG59Il0sIm5hbWVzIjpbIl9fYXdhaXRlciIsIl9zY3JpcHREaXIiLCJleHBvcnRDcHBEYnNjYW5MaWIiLCJkb2N1bWVudCIsImN1cnJlbnRTY3JpcHQiLCJzcmMiLCJ1bmRlZmluZWQiLCJyZWFkeVByb21pc2VSZXNvbHZlIiwicmVhZHlQcm9taXNlUmVqZWN0IiwiTW9kdWxlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZWFkQmluYXJ5IiwibW9kdWxlT3ZlcnJpZGVzIiwiT2JqZWN0IiwiYXNzaWduIiwiRU5WSVJPTk1FTlRfSVNfV0VCIiwid2luZG93IiwiRU5WSVJPTk1FTlRfSVNfV09SS0VSIiwiaW1wb3J0U2NyaXB0cyIsInNjcmlwdERpcmVjdG9yeSIsInByb2Nlc3MiLCJ2ZXJzaW9ucyIsIm5vZGUiLCJzZWxmIiwibG9jYXRpb24iLCJocmVmIiwiaW5kZXhPZiIsInN1YnN0ciIsInJlcGxhY2UiLCJsYXN0SW5kZXhPZiIsInVybCIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInJlc3BvbnNlVHlwZSIsInNlbmQiLCJVaW50OEFycmF5IiwiY29uc29sZSIsImxvZyIsImJpbmQiLCJ3YXNtQmluYXJ5Iiwid2FzbU1lbW9yeSIsImVyciIsIndhcm4iLCJXZWJBc3NlbWJseSIsImFib3J0IiwiSEVBUDgiLCJIRUFQVTgiLCJIRUFQVTMyIiwiQUJPUlQiLCJ1cGRhdGVNZW1vcnlWaWV3cyIsImIiLCJidWZmZXIiLCJJbnQ4QXJyYXkiLCJJbnQxNkFycmF5IiwiSW50MzJBcnJheSIsIlVpbnQxNkFycmF5IiwiVWludDMyQXJyYXkiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJfX0FUUFJFUlVOX18iLCJfX0FUSU5JVF9fIiwiX19BVFBPU1RSVU5fXyIsInJ1bkRlcGVuZGVuY2llcyIsInJ1bkRlcGVuZGVuY3lXYXRjaGVyIiwiZGVwZW5kZW5jaWVzRnVsZmlsbGVkIiwid2hhdCIsImUiLCJSdW50aW1lRXJyb3IiLCJ3YXNtQmluYXJ5RmlsZSIsInBhdGgiLCJpc0RhdGFVUkkiLCJmaWxlbmFtZSIsInN0YXJ0c1dpdGgiLCJnZXRCaW5hcnkiLCJmaWxlIiwiaW5zdGFudGlhdGVBcnJheUJ1ZmZlciIsImJpbmFyeUZpbGUiLCJpbXBvcnRzIiwicmVjZWl2ZXIiLCJmZXRjaCIsInRoZW4iLCJjcmVkZW50aWFscyIsInJlc3BvbnNlIiwiY2F0Y2giLCJnZXRCaW5hcnlQcm9taXNlIiwiYmluYXJ5IiwiaW5zdGFudGlhdGUiLCJpbnN0YW5jZSIsInJlYXNvbiIsImNhbGxSdW50aW1lQ2FsbGJhY2tzIiwiY2FsbGJhY2tzIiwibGVuZ3RoIiwic2hpZnQiLCJFeGNlcHRpb25JbmZvIiwiZXhjUHRyIiwidGhpcyIsInB0ciIsInNldF90eXBlIiwidHlwZSIsImdldF90eXBlIiwic2V0X2Rlc3RydWN0b3IiLCJkZXN0cnVjdG9yIiwiZ2V0X2Rlc3RydWN0b3IiLCJzZXRfY2F1Z2h0IiwiY2F1Z2h0IiwiZ2V0X2NhdWdodCIsInNldF9yZXRocm93biIsInJldGhyb3duIiwiZ2V0X3JldGhyb3duIiwiaW5pdCIsInNldF9hZGp1c3RlZF9wdHIiLCJhZGp1c3RlZFB0ciIsImdldF9hZGp1c3RlZF9wdHIiLCJnZXRfZXhjZXB0aW9uX3B0ciIsIl9fX2N4YV9pc19wb2ludGVyX3R5cGUiLCJhZGp1c3RlZCIsImVtc2NyaXB0ZW5fcmVhbGxvY19idWZmZXIiLCJzaXplIiwiZ3JvdyIsImJ5dGVMZW5ndGgiLCJnZXRDRnVuYyIsImlkZW50IiwiVVRGOERlY29kZXIiLCJUZXh0RGVjb2RlciIsImNjYWxsIiwicmV0dXJuVHlwZSIsImFyZ1R5cGVzIiwiYXJncyIsIm9wdHMiLCJ0b0MiLCJzdHIiLCJyZXQiLCJsZW4iLCJpIiwiYyIsImNoYXJDb2RlQXQiLCJsZW5ndGhCeXRlc1VURjgiLCJzdGFja0FsbG9jIiwib3V0UHRyIiwibWF4Qnl0ZXNUb1dyaXRlIiwiaGVhcCIsIm91dElkeCIsImVuZElkeCIsInUiLCJzdHJpbmdUb1VURjhBcnJheSIsInN0cmluZ1RvVVRGOCIsInN0cmluZ1RvVVRGOE9uU3RhY2siLCJhcnIiLCJhcnJheSIsInNldCIsImZ1bmMiLCJjQXJncyIsInN0YWNrIiwiY29udmVydGVyIiwic3RhY2tTYXZlIiwiYXBwbHkiLCJzdGFja1Jlc3RvcmUiLCJoZWFwT3JBcnJheSIsImlkeCIsIm1heEJ5dGVzVG9SZWFkIiwiZW5kUHRyIiwiZGVjb2RlIiwic3ViYXJyYXkiLCJ1MCIsInUxIiwidTIiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJjaCIsIlVURjhBcnJheVRvU3RyaW5nIiwiQm9vbGVhbiIsImNvbnZlcnRSZXR1cm5WYWx1ZSIsIm9uRG9uZSIsImNhbGxlZFJ1biIsIndhc21JbXBvcnRzIiwiZGVzdCIsIm51bSIsImNvcHlXaXRoaW4iLCJyZXF1ZXN0ZWRTaXplIiwieCIsIm9sZFNpemUiLCJtYXhIZWFwU2l6ZSIsImN1dERvd24iLCJvdmVyR3Jvd25IZWFwU2l6ZSIsIk1hdGgiLCJtaW4iLCJtYXgiLCJjYWxsYmFjayIsImluZm8iLCJyZWNlaXZlSW5zdGFuY2UiLCJtb2R1bGUiLCJjYiIsImV4cG9ydHMiLCJ1bnNoaWZ0IiwiaWQiLCJjbGVhckludGVydmFsIiwicmVtb3ZlUnVuRGVwZW5kZW5jeSIsInJlc3VsdCIsImluc3RhbnRpYXRlU3RyZWFtaW5nIiwiY3JlYXRlV2FzbSIsImFyZ3VtZW50cyIsInJ1biIsImRvUnVuIiwicG9zdFJ1biIsInByZVJ1biIsInNldFRpbWVvdXQiLCJudW1lcmljQXJncyIsImV2ZXJ5IiwicnVuQ2FsbGVyIiwicG9wIiwicmVhZHkiLCJkZWZpbmUiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJsb2FkZWQiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwibSIsImFtZE8iLCJkIiwiZGVmaW5pdGlvbiIsImtleSIsIm8iLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJnIiwiZ2xvYmFsVGhpcyIsIkZ1bmN0aW9uIiwiaG1kIiwiY3JlYXRlIiwiY2hpbGRyZW4iLCJFcnJvciIsIm9iaiIsInByb3AiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJzY3JpcHRVcmwiLCJzY3JpcHRzIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJwIiwidGhpc0FyZyIsIl9hcmd1bWVudHMiLCJQIiwiZ2VuZXJhdG9yIiwiZnVsZmlsbGVkIiwidmFsdWUiLCJzdGVwIiwibmV4dCIsInJlamVjdGVkIiwiZG9uZSIsIm9ubWVzc2FnZSIsImV2ZW50IiwiZW1iZWRYIiwiZW1iZWRZIiwiZXBzaWxvbiIsIm1pblB0cyIsImRhdGEiLCJjbHVzdGVycyIsImFzeW5jIiwid2FzbVVybCIsIlVSTCIsIndhc21QYXRoIiwic3Vic3RyaW5nIiwid2FzbUluc3RhbmNlIiwibG9jYXRlRmlsZSIsInByaW50RXJyIiwiXyIsImVycm9yIiwiZ2V0RGJzY2FuV2FzbSIsImN3cmFwIiwiYnl0ZXNGb3JFbWJlZFgiLCJCWVRFU19QRVJfRUxFTUVOVCIsImRhdGFQdHJYIiwiX21hbGxvYyIsImRhdGFQdHJZIiwieEhlYXAiLCJ5SGVhcCIsImNsdXN0ZXJQdHIiLCJjbHVzdGVySGVhcCIsImNsdXN0ZXJSZXN1bHQiLCJieXRlT2Zmc2V0IiwiX2ZyZWUiLCJkYnNjYW4iLCJwb3N0TWVzc2FnZSJdLCJzb3VyY2VSb290IjoiIn0=