@whereby.com/browser-sdk 3.16.1 → 3.17.0
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/cdn/v3-react.js
CHANGED
|
@@ -131,4 +131,4 @@ this.whereby=this.whereby||{},this.whereby.react=function(e,t,n){"use strict";va
|
|
|
131
131
|
float personMask = texture(u_personMask, v_texCoord).a;
|
|
132
132
|
personMask = smoothstep(u_coverage.x, u_coverage.y, personMask);
|
|
133
133
|
outColor = vec4(frameColor * personMask + backgroundColor * (1.0 - personMask), 1.0);
|
|
134
|
-
}`,d=s/o,C=B_(e,e.VERTEX_SHADER,c),I=B_(e,e.FRAGMENT_SHADER,g),l=G_(e,C,I,t,n),u=e.getUniformLocation(l,"u_backgroundScale"),A=e.getUniformLocation(l,"u_backgroundOffset"),p=e.getUniformLocation(l,"u_inputFrame"),h=e.getUniformLocation(l,"u_personMask"),m=e.getUniformLocation(l,"u_background"),f=e.getUniformLocation(l,"u_coverage");e.useProgram(l),e.uniform2f(u,1,1),e.uniform2f(A,0,0),e.uniform1i(p,0),e.uniform1i(h,1);let b=null;function y(t){const n=t.naturalWidth||t.videoWidth||t.width,i=t.naturalHeight||t.videoHeight||t.height;b=W_(e,e.RGBA8,n,i,e.LINEAR,e.LINEAR),e.texSubImage2D(e.TEXTURE_2D,0,0,0,n,i,e.RGBA,e.UNSIGNED_BYTE,t);let r=0,s=0,o=n,a=i;o/a<d?(a=o/d,s=(i-a)/2):(o=a*d,r=(n-o)/2);const c=o/n,g=a/i;r/=n,s/=i,e.uniform2f(u,c,g),e.uniform2f(A,r,s)}function v(t){e.useProgram(l);const n=t.coverage||[0,1];e.uniform2f(f,n[0],n[1])}return v(a),r&&y(r),{render:function(){e.viewport(0,0,s,o),e.useProgram(l),e.activeTexture(e.TEXTURE1),e.bindTexture(e.TEXTURE_2D,i),null!==b&&(e.activeTexture(e.TEXTURE2),e.bindTexture(e.TEXTURE_2D,b),e.uniform1i(m,2)),e.bindFramebuffer(e.FRAMEBUFFER,null),e.drawArrays(e.TRIANGLE_STRIP,0,4)},updateParams:v,cleanUp:function(){e.deleteTexture(b),e.deleteProgram(l),e.deleteShader(I),e.deleteShader(C)},updateBackgroundImage:function(t,n){n&&(b=null),t?b?(e.bindTexture(e.TEXTURE_2D,b),e.texSubImage2D(e.TEXTURE_2D,0,0,0,t.naturalWidth||t.videoWidth||t.width,t.naturalHeight||t.videoHeight||t.height,e.RGBA,e.UNSIGNED_BYTE,t)):y(t):b&&(b=null)}}}(u,h,m,w,s,e,t,I);return{effectCtx:u,updateBackgroundFrame(e,t,n){k.updateBackgroundImage(e,n)},updateParams(e){I=X_(r=e),V.updateParams(I),k.updateParams(I)},processFrame(e){u.clearColor(0,0,0,0),u.clear(u.COLOR_BUFFER_BIT),u.activeTexture(u.TEXTURE0),u.bindTexture(u.TEXTURE_2D,f),u.texImage2D(u.TEXTURE_2D,0,u.RGBA,u.RGBA,u.UNSIGNED_BYTE,e),u.bindVertexArray(p),S.render(),o._runInference(),R.render(),Z.render(),r.backgroundUrl?k.render():V.render()},dispose(){k.cleanUp(),V.cleanUp(),Z.cleanUp(),R.cleanUp(),S.cleanUp(),u.deleteTexture(w),u.deleteTexture(b),u.deleteTexture(f),u.deleteBuffer(m),u.deleteBuffer(h),u.deleteVertexArray(p),u.deleteShader(A)}}})}function F_(e,t,n){var i=function(e){return atob(e)}(e),r=i.indexOf("\n",10)+1,s=i.substring(r)+"",o=new Blob([s],{type:"application/javascript"});return URL.createObjectURL(o)}function O_(e,t,n){var i;return function(t){return i=i||F_(e),new Worker(i,t)}}var x_=O_("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGxldCB0aW1lciA9IG51bGw7CiAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiAocmVxdWVzdCkgewogICAgICAgIGNvbnN0IHRpbWUgPSByZXF1ZXN0LmRhdGE7CiAgICAgICAgaWYgKHRpbWUgPj0gMCkKICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHBvc3RNZXNzYWdlKCIiKSwgdGltZSk7CiAgICAgICAgZWxzZSBpZiAodGltZXIpCiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICB9OwoKfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGltZXIud29ya2VyLmpzLm1hcAoK");class D_ extends A_.EventEmitter{constructor({setup:e,params:t,videoWidth:n,videoHeight:i,emit:r}){super(),this.setup=e,this.params=t,this.videoWidth=n,this.videoHeight=i,r&&(this.emit=r)}setupEngine(e,t,n,i){return $T(this,void 0,void 0,function*(){this.videoWidth=e,this.videoHeight=t,this.videoAspectRatio=this.videoWidth/this.videoHeight,this.effectCanvas=n||m_(this.videoWidth,this.videoHeight);const r=this.setup.useWebGL?N_:T_;this.engine=yield r(this.videoWidth,this.videoHeight,this.setup,this.effectCanvas,this.params,i),this.effectCtx=this.engine.effectCtx,i&&this.updateBackgroundFrame({frame:i})})}updateVideoSize(e){return $T(this,arguments,void 0,function*({videoWidth:e,videoHeight:t}){const n=this.currentBackgroundFrame;this.currentBackgroundFrame=null;const i=this.engine;yield this.setupEngine(e,t,this.effectCanvas,n),i.dispose()})}init(e){return $T(this,arguments,void 0,function*({initialBackgroundFrame:e,useInsertableStreams:t,effectCanvas:n}){if(yield this.setupEngine(this.videoWidth,this.videoHeight,n,e),t){let e=5,t=0,n=0,i=!1;this.transformer=new TransformStream({transform:(r,s)=>$T(this,void 0,void 0,function*(){this.transformController=s;const o=r.timestamp,a=performance.now();t||(t=a,n=o/1e3);e>0||a-t<o/1e3-n+200?(this.processAndRenderFrame(r),r.close(),this.hasVideoBackground&&"canvas"!==this.setup.transferType&&this.emit("getbackgroundframe"),e>0&&(e--,t=a,n=o/1e3),s.enqueue(new VideoFrame(this.effectCanvas,{timestamp:o})),i||(i=!0,this.emit("firstframerendered"))):r.close()})})}else this.setup.useBackgroundWorker||(this.timerWorker=new x_,this.timerWorker.addEventListener("message",()=>{this.emit("output",{frame:this.currentOutputFrame},[this.currentOutputFrame])}));this.emit("ready")})}updateParams({params:e,initialBackgroundFrame:t}){this.params=e,this.currentBackgroundFrame=null,this.currentBackgroundFrameCtx=null,t?this.updateBackgroundFrame({frame:t,reInit:!0}):this.engine.updateBackgroundFrame(null),this.engine.updateParams(e)}updateBackgroundFrame({frame:e,reInit:t}){let n;switch(this.currentBackgroundFrame||(this.hasVideoBackground=this.params.backgroundUrl&&"video"===this.params.backgroundType,n={x:0,y:0,width:this.videoWidth,height:this.videoHeight}),this.setup.transferType){case"imagebitmap":this.currentBackgroundFrame=e;break;case"imagedata":this.currentBackgroundFrame||(this.currentBackgroundFrame=m_(this.videoWidth,this.videoHeight),this.currentBackgroundFrameCtx=this.currentBackgroundFrame.getContext("2d")),e=new ImageData(new Uint8ClampedArray(e),this.videoWidth,this.videoHeight),this.currentBackgroundFrameCtx.putImageData(e,0,0);break;case"canvas":if(!this.currentBackgroundFrame){n.width=e.videoWidth||e.naturalWidth||e.width,n.height=e.videoHeight||e.naturalHeight||e.height;const t=n.width/n.height;if(t>this.videoAspectRatio){const e=n.width-n.height*this.videoAspectRatio;n.width-=e,n.x=Math.floor(e/2)}else if(t<this.videoAspectRatio){const e=n.height-n.width/this.videoAspectRatio;n.height-=e,n.y=Math.floor(e/2)}}this.currentBackgroundFrame=e}this.engine.updateBackgroundFrame(this.currentBackgroundFrame,n,t)}terminate(){this.transformController&&this.transformController.terminate(),this.timerWorker&&this.timerWorker.terminate(),this.engine&&(this.engine.dispose(),this.engine=null),this._terminated=!0,this.emit("terminated")}start({inputStream:e,outputStream:t}){e&&e.pipeThrough(this.transformer).pipeTo(t),this.frameCounter=0,this.frameCounterTime=performance.now()}input(e){return $T(this,arguments,void 0,function*({videoFrame:e,backgroundFrame:t,requestTime:n,lastRenderTime:i,delay:r}){var s;if(this._terminated)return;const o=i+r-2*(Date.now()-n);let a;switch(t&&this.updateBackgroundFrame({frame:t}),this.setup.transferType){case"imagebitmap":null===(s=this.prevVideoFrame)||void 0===s||s.close(),this.prevVideoFrame=e,this.processAndRenderFrame(e),a=yield createImageBitmap(this.effectCanvas);break;case"imagedata":e=new ImageData(new Uint8ClampedArray(e),this.videoWidth,this.videoHeight),this.inputCanvas||(this.inputCanvas=m_(this.videoWidth,this.videoHeight),this.inputCanvasCtx=this.inputCanvas.getContext("2d")),this.inputCanvasCtx.putImageData(e,0,0),this.processAndRenderFrame(this.inputCanvas),a=this.effectCtx.getImageData(0,0,this.videoWidth,this.videoHeight).data.buffer;break;case"canvas":this.processAndRenderFrame(e),a=this.effectCanvas}const c=Math.max(0,o-Date.now());this.timerWorker?(this.currentOutputFrame=a,this.timerWorker.postMessage(c)):setTimeout(()=>{this.emit("output",{frame:a},[a])},c)})}processAndRenderFrame(e){if(this.engine.processFrame(e),this.setup.logToConsole){this.frameCounter++;const e=performance.now();e-this.frameCounterTime>1e3&&(console.log(`Running camera effects, ${Math.round(1e3*this.frameCounter/(e-this.frameCounterTime))} fps`),this.frameCounter=0,this.frameCounterTime=e)}}}let M_=0;class H_ extends A_.EventEmitter{constructor(e,t){super();const n=M_++,i=(t,i)=>{this[t]=r=>{e.postMessage(Object.assign({type:t,processorId:n},r),i&&i(r).filter(e=>e))}};i("init",e=>[e.initialBackgroundFrame]),i("start",e=>[e.inputStream,e.outputStream]),i("input",e=>[e.videoFrame,e.backgroundFrame]),i("updateBackgroundFrame",e=>[e.frame]),i("updateParams",e=>[e.initialBackgroundFrame]),i("updateVideoSize"),i("terminate");const r=t=>$T(this,void 0,void 0,function*(){if(t.data.processorId!==n)return;const i=t.data,{type:s}=i,o=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(i=Object.getOwnPropertySymbols(e);r<i.length;r++)t.indexOf(i[r])<0&&Object.prototype.propertyIsEnumerable.call(e,i[r])&&(n[i[r]]=e[i[r]])}return n}(i,["type"]);this.emit(s,o),"terminated"===s&&e.removeEventListener("message",r)});e.postMessage(Object.assign({type:"create",processorId:n},t)),e.addEventListener("message",r)}}var j_=O_("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKHdhc21GZWF0dXJlRGV0ZWN0KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIF9kb2N1bWVudEN1cnJlbnRTY3JpcHQgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdCA6IG51bGw7CiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uDQoNCiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkNCiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuDQoNCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSA0KICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQ0KICAgIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwNCiAgICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUg0KICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1INCiAgICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQogICAgLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqLw0KDQoNCiAgICBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7DQogICAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQ0KICAgICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsNCiAgICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9DQogICAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09ICJmdW5jdGlvbiIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHsNCiAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7DQogICAgICAgIHJldHVybiBlLm5hbWUgPSAiU3VwcHJlc3NlZEVycm9yIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlOw0KICAgIH07CgogICAgdmFyIGV2ZW50cyA9IHtleHBvcnRzOiB7fX07CgogICAgdmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbDsKICAgIHZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nCiAgICAgID8gUi5hcHBseQogICAgICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7CiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpOwogICAgICB9OwoKICAgIHZhciBSZWZsZWN0T3duS2V5czsKICAgIGlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXM7CiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KQogICAgICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpOwogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykgewogICAgICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTsKICAgIH0KCiAgICB2YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTsKICAgIH07CgogICAgZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkgewogICAgICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpOwogICAgfQogICAgZXZlbnRzLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7CiAgICBldmVudHMuZXhwb3J0cy5vbmNlID0gb25jZTsKCiAgICAvLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLngKICAgIEV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkOwogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwOwogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkOwoKICAgIC8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZQogICAgLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy4KICAgIHZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7CgogICAgZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikgewogICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpOwogICAgICB9CiAgICB9CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7CiAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24oYXJnKSB7CiAgICAgICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkgewogICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7CiAgICAgIH0KICAgIH0pOwoKICAgIEV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7CgogICAgICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHwKICAgICAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHsKICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfQoKICAgICAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDsKICAgIH07CgogICAgLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzCiAgICAvLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC4KICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHsKICAgICAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgIm4iIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTsKICAgICAgfQogICAgICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7CiAgICAgIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICAgIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7CiAgICB9CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7CiAgICAgIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpOwogICAgfTsKCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHsKICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTsKCiAgICAgIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7CiAgICAgIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkKICAgICAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpOwogICAgICBlbHNlIGlmICghZG9FcnJvcikKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuCiAgICAgIGlmIChkb0Vycm9yKSB7CiAgICAgICAgdmFyIGVyOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApCiAgICAgICAgICBlciA9IGFyZ3NbMF07CiAgICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvdwogICAgICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi4KICAgICAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudAogICAgICAgIH0KICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyCiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7CiAgICAgICAgZXJyLmNvbnRleHQgPSBlcjsKICAgICAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50CiAgICAgIH0KCiAgICAgIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdOwoKICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoOwogICAgICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkKICAgICAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpOwogICAgICB9CgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHsKICAgICAgdmFyIG07CiAgICAgIHZhciBldmVudHM7CiAgICAgIHZhciBleGlzdGluZzsKCiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7CiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSAibmV3TGlzdGVuZXIiISBCZWZvcmUKICAgICAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCAibmV3TGlzdGVuZXIiLgogICAgICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7CgogICAgICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZQogICAgICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdAogICAgICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7CiAgICAgICAgfQogICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdOwogICAgICB9CgogICAgICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkgewogICAgICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LgogICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7CiAgICAgICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50OwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LgogICAgICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPQogICAgICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTsKICAgICAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC4KICAgICAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHsKICAgICAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrCiAgICAgICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTsKICAgICAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7CiAgICAgICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlOwogICAgICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmcKICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheAogICAgICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTsKICAgICAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnOwogICAgICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0OwogICAgICAgICAgdy50eXBlID0gdHlwZTsKICAgICAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7CiAgICAgICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikgewogICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7CiAgICB9OwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyOwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID0KICAgICAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpOwogICAgICAgIH07CgogICAgZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7CiAgICAgIGlmICghdGhpcy5maXJlZCkgewogICAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pOwogICAgICAgIHRoaXMuZmlyZWQgPSB0cnVlOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7CiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikgewogICAgICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTsKICAgICAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTsKICAgICAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyOwogICAgICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkOwogICAgICByZXR1cm4gd3JhcHBlZDsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID0KICAgICAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpOwogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKCiAgICAvLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9CiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyOwoKICAgICAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgogICAgICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTsKICAgICAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikgewogICAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdOwogICAgICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpCiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgcG9zaXRpb24gPSAtMTsKCiAgICAgICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyOwogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocG9zaXRpb24gPCAwKQogICAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKQogICAgICAgICAgICAgIGxpc3Quc2hpZnQoKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKQogICAgICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07CgogICAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyOwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0KICAgICAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkgewogICAgICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpOwoKICAgICAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgogICAgICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdAogICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHMKICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICBrZXkgPSBrZXlzW2ldOwogICAgICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlOwogICAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CgogICAgICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdOwoKICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTsKICAgICAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgLy8gTElGTyBvcmRlcgogICAgICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwoKICAgIGZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHsKICAgICAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzOwoKICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBbXTsKCiAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdOwogICAgICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBbXTsKCiAgICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykKICAgICAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07CgogICAgICByZXR1cm4gdW53cmFwID8KICAgICAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7CiAgICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpOwogICAgfTsKCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7CiAgICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTsKICAgIH07CgogICAgRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpOwogICAgICB9CiAgICB9OwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7CiAgICBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHsKICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKCiAgICAgIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdOwoKICAgICAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkgewogICAgICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdOwogICAgfTsKCiAgICBmdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikgewogICAgICB2YXIgY29weSA9IG5ldyBBcnJheShuKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpCiAgICAgICAgY29weVtpXSA9IGFycltpXTsKICAgICAgcmV0dXJuIGNvcHk7CiAgICB9CgogICAgZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7CiAgICAgIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKykKICAgICAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTsKICAgICAgbGlzdC5wb3AoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7CiAgICAgIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTsKICAgICAgfQogICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIGZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkgewogICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7CiAgICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTsKICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTsKICAgICAgICB9CiAgICAgICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7CiAgICAgICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHsKICAgICAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAnZXJyb3InLCBoYW5kbGVyLCBmbGFncyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlCiAgICAgICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS4KICAgICAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykgewogICAgICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZQogICAgICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS4KICAgICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpOwogICAgICAgICAgfQogICAgICAgICAgbGlzdGVuZXIoYXJnKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTsKICAgICAgfQogICAgfQoKICAgIHZhciBldmVudHNFeHBvcnRzID0gZXZlbnRzLmV4cG9ydHM7CgogICAgZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICBpZiAoc2VsZi5kb2N1bWVudCkgewogICAgICAgICAgICBjb25zdCBjYW52YXMgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDsKICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgICAgcmV0dXJuIGNhbnZhczsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc2VsZi5PZmZzY3JlZW5DYW52YXMpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IENETl9CQVNFX1VSTCA9ICJodHRwczovL2Nkbi5zcnYud2hlcmVieS5jb20vY2FtZXJhLWVmZmVjdHMvdjEtMC0wIjsKICAgIGNvbnN0IGdldEFzc2V0VXJsID0gKHBhdGgpID0+IHsKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBgJHtDRE5fQkFTRV9VUkx9LyR7cGF0aH1gOwogICAgICAgIH0KICAgIH07CiAgICBjb25zdCBhc3NldFVybHMgPSB7CiAgICAgICAgdGZsaXRlOiB7CiAgICAgICAgICAgIHdhc206IGdldEFzc2V0VXJsKCJhc3NldHMvdGZsaXRlL3RmbGl0ZS53YXNtIikgLAogICAgICAgICAgICB3YXNtU2ltZDogZ2V0QXNzZXRVcmwoImFzc2V0cy90ZmxpdGUvdGZsaXRlLXNpbWQud2FzbSIpICwKICAgICAgICB9LAogICAgICAgIG1vZGVsczogewogICAgICAgICAgICBzZWdtTGl0ZTogZ2V0QXNzZXRVcmwoImFzc2V0cy90ZmxpdGUvbW9kZWxzL3NlZ21fbGl0ZV92NjgxLnRmbGl0ZSIpICwKICAgICAgICAgICAgc2VnbUZ1bGw6IGdldEFzc2V0VXJsKCJhc3NldHMvdGZsaXRlL21vZGVscy9zZWdtX2Z1bGxfdjY3OS50ZmxpdGUiKSAsCiAgICAgICAgICAgIG1sa2l0OiBnZXRBc3NldFVybCgiYXNzZXRzL3RmbGl0ZS9tb2RlbHMvc2VsZmllc2VnbWVudGF0aW9uX21sa2l0LTI1NngyNTYtMjAyMV8wMV8xOS12MTIxNS5mMTYudGZsaXRlIikKICAgICAgICAgICAgICAgICwKICAgICAgICB9fTsKCiAgICBjb25zdCBsb2FkVGZsaXRlTW9kdWxlID0gKGlzU2ltZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgY29uc3QgY3JlYXRlVGZsaXRlTW9kdWxlID0gaXNTaW1kCiAgICAgICAgICAgID8geWllbGQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB0ZmxpdGVTaW1kOyB9KS50aGVuKChtKSA9PiBtLmRlZmF1bHQpCiAgICAgICAgICAgIDogeWllbGQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB0ZmxpdGU7IH0pLnRoZW4oKG0pID0+IG0uZGVmYXVsdCk7CiAgICAgICAgcmV0dXJuIGNyZWF0ZVRmbGl0ZU1vZHVsZTsKICAgIH0pOwogICAgY29uc3QgZ2V0TW9kZWxVcmwgPSAobW9kZWxJZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2ggKG1vZGVsSWQpIHsKICAgICAgICAgICAgICAgIGNhc2UgIm1lZXRsaXRlIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5zZWdtTGl0ZTsKICAgICAgICAgICAgICAgIGNhc2UgIm1lZXRmdWxsIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5zZWdtRnVsbDsKICAgICAgICAgICAgICAgIGNhc2UgIm1sa2l0IjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5tbGtpdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwogICAgY29uc3QgZ2V0V2FzbVVybCA9IChpc1NpbWQpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGlzU2ltZCA/IGFzc2V0VXJscy50ZmxpdGUud2FzbVNpbWQgOiBhc3NldFVybHMudGZsaXRlLndhc207CiAgICAgICAgfQogICAgfSk7CiAgICBjb25zdCBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX0JBQ0tHUk9VTkRfUEVSU09OID0gMTsKICAgIGNvbnN0IFNFR01FTlRBVElPTk1PREVMX1RZUEVfUEVSU09OID0gMjsKICAgIGNvbnN0IHJlc29sdmVBc3NldFVybCA9ICh1cmwpID0+IHsKICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSB8fCB1cmwuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSB8fCB1cmwuc3RhcnRzV2l0aCgiYmxvYjoiKSB8fCB1cmwuc3RhcnRzV2l0aCgiZGF0YToiKSkgewogICAgICAgICAgICByZXR1cm4gdXJsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmwsIChfZG9jdW1lbnRDdXJyZW50U2NyaXB0ICYmIF9kb2N1bWVudEN1cnJlbnRTY3JpcHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnU0NSSVBUJyAmJiBfZG9jdW1lbnRDdXJyZW50U2NyaXB0LnNyYyB8fCBuZXcgVVJMKCdQcm9jZXNzb3JQcm94eS53b3JrZXIuanMnLCBkb2N1bWVudC5iYXNlVVJJKS5ocmVmKSkuaHJlZjsKICAgIH07CiAgICBjb25zdCBtb2RlbHMgPSB7CiAgICAgICAgbWVldGxpdGU6IHsKICAgICAgICAgICAgaWQ6ICJtZWV0bGl0ZSIsCiAgICAgICAgICAgIHR5cGU6IFNFR01FTlRBVElPTk1PREVMX1RZUEVfQkFDS0dST1VORF9QRVJTT04sCiAgICAgICAgfSwKICAgICAgICBtZWV0ZnVsbDogewogICAgICAgICAgICBpZDogIm1lZXRmdWxsIiwKICAgICAgICAgICAgdHlwZTogU0VHTUVOVEFUSU9OTU9ERUxfVFlQRV9CQUNLR1JPVU5EX1BFUlNPTiwKICAgICAgICB9LAogICAgICAgIG1sa2l0OiB7CiAgICAgICAgICAgIGlkOiAibWxraXQiLAogICAgICAgICAgICB0eXBlOiBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX1BFUlNPTiwKICAgICAgICB9LAogICAgfTsKICAgIGxldCBfdGZsaXRlID0gbnVsbDsKICAgIGNvbnN0IGxvYWRURkxpdGUgPSAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICBpZiAoX3RmbGl0ZSkKICAgICAgICAgICAgcmV0dXJuIF90ZmxpdGU7CiAgICAgICAgY29uc3Qgc2ltZElzU3VwcG9ydGVkID0geWllbGQgd2FzbUZlYXR1cmVEZXRlY3Quc2ltZCgpOwogICAgICAgIGNvbnN0IGNyZWF0ZVRmbGl0ZU1vZHVsZSA9IHlpZWxkIGxvYWRUZmxpdGVNb2R1bGUoc2ltZElzU3VwcG9ydGVkKTsKICAgICAgICBjb25zdCB3YXNtVXJsID0geWllbGQgZ2V0V2FzbVVybChzaW1kSXNTdXBwb3J0ZWQpOwogICAgICAgIF90ZmxpdGUgPSB5aWVsZCBjcmVhdGVUZmxpdGVNb2R1bGUoewogICAgICAgICAgICBsb2NhdGVGaWxlKHBhdGgpIHsKICAgICAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIud2FzbSIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVBc3NldFVybCh3YXNtVXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBwYXRoOwogICAgICAgICAgICB9LAogICAgICAgIH0pOwogICAgICAgIHJldHVybiBfdGZsaXRlOwogICAgfSk7CiAgICBsZXQgX2N1cnJlbnRNb2RlbEFuZEluZm87CiAgICBjb25zdCBsb2FkU2VnbWVudGF0aW9uTW9kZWwgPSAoc2VnbWVudGF0aW9uTW9kZWxJZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgY29uc3QgbW9kZWwgPSBtb2RlbHNbc2VnbWVudGF0aW9uTW9kZWxJZF07CiAgICAgICAgY29uc3QgbW9kZWxVcmwgPSByZXNvbHZlQXNzZXRVcmwoeWllbGQgZ2V0TW9kZWxVcmwobW9kZWwuaWQpKTsKICAgICAgICBjb25zdCB0ZmxpdGUgPSB5aWVsZCBsb2FkVEZMaXRlKCk7CiAgICAgICAgaWYgKChfY3VycmVudE1vZGVsQW5kSW5mbyA9PT0gbnVsbCB8fCBfY3VycmVudE1vZGVsQW5kSW5mbyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2N1cnJlbnRNb2RlbEFuZEluZm8udXJsKSA9PT0gbW9kZWxVcmwpCiAgICAgICAgICAgIHJldHVybiBfY3VycmVudE1vZGVsQW5kSW5mbzsKICAgICAgICBjb25zdCBtb2RlbFJlc3BvbnNlID0geWllbGQgZmV0Y2gobW9kZWxVcmwpOwogICAgICAgIGNvbnN0IG1vZGVsQnVmZmVyID0geWllbGQgbW9kZWxSZXNwb25zZS5hcnJheUJ1ZmZlcigpOwogICAgICAgIGNvbnN0IG1vZGVsQnVmZmVyT2Zmc2V0ID0gdGZsaXRlLl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCgpOwogICAgICAgIHRmbGl0ZS5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KG1vZGVsQnVmZmVyKSwgbW9kZWxCdWZmZXJPZmZzZXQpOwogICAgICAgIHRmbGl0ZS5fbG9hZE1vZGVsKG1vZGVsQnVmZmVyLmJ5dGVMZW5ndGgpOwogICAgICAgIGNvbnN0IGlucHV0SGVpZ2h0ID0gdGZsaXRlLl9nZXRJbnB1dEhlaWdodCgpOwogICAgICAgIGNvbnN0IGlucHV0V2lkdGggPSB0ZmxpdGUuX2dldElucHV0V2lkdGgoKTsKICAgICAgICBjb25zdCBpbnB1dE1lbW9yeU9mZnNldCA9IHRmbGl0ZS5fZ2V0SW5wdXRNZW1vcnlPZmZzZXQoKSAvIDQ7CiAgICAgICAgY29uc3Qgb3V0cHV0TWVtb3J5T2Zmc2V0ID0gdGZsaXRlLl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQoKSAvIDQ7CiAgICAgICAgY29uc3Qgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCA9IGlucHV0V2lkdGggKiBpbnB1dEhlaWdodDsKICAgICAgICB0ZmxpdGUuX3J1bkluZmVyZW5jZSgpOwogICAgICAgIF9jdXJyZW50TW9kZWxBbmRJbmZvID0gewogICAgICAgICAgICB0ZmxpdGUsCiAgICAgICAgICAgIG1vZGVsLAogICAgICAgICAgICB1cmw6IG1vZGVsVXJsLAogICAgICAgICAgICBpbnB1dEhlaWdodCwKICAgICAgICAgICAgaW5wdXRXaWR0aCwKICAgICAgICAgICAgaW5wdXRNZW1vcnlPZmZzZXQsCiAgICAgICAgICAgIG91dHB1dE1lbW9yeU9mZnNldCwKICAgICAgICAgICAgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwKICAgICAgICB9OwogICAgICAgIHJldHVybiBfY3VycmVudE1vZGVsQW5kSW5mbzsKICAgIH0pOwoKICAgIGNvbnN0IGJhc2VDYW52YXNQYXJhbXMgPSB7CiAgICAgICAgbWFza09wZXJhdGlvbjogImNvcHkiLAogICAgICAgIG1hc2tGaWx0ZXI6ICJibHVyKDRweCkiLAogICAgICAgIHBlcnNvbk9wZXJhdGlvbjogInNvdXJjZS1pbiIsCiAgICAgICAgcGVyc29uRmlsdGVyOiAibm9uZSIsCiAgICAgICAgYmFja2dyb3VuZE9wZXJhdGlvbjogImRlc3RpbmF0aW9uLW92ZXIiLAogICAgICAgIGJhY2tncm91bmRGaWx0ZXI6ICJub25lIiwKICAgIH07CiAgICBmdW5jdGlvbiBnZXRCbHVyQ2FudmFzUGFyYW1zKGFtb3VudCkgewogICAgICAgIHN3aXRjaCAoYW1vdW50KSB7CiAgICAgICAgICAgIGNhc2UgInNsaWdodCI6IHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDYW52YXNQYXJhbXMpLCB7IGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDRweCkiLCBjcm9wOiA0IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImhlYXZ5IjogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNhbnZhc1BhcmFtcyksIHsgbWFza0ZpbHRlcjogImJsdXIoOHB4KSIsIGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDE2cHgpIiwgY3JvcDogMTYgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNhbnZhc1BhcmFtcyksIHsgbWFza0ZpbHRlcjogImJsdXIoOHB4KSIsIGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDhweCkiLCBjcm9wOiA4IH0pOwogICAgfQogICAgZnVuY3Rpb24gZ2V0Q2FudmFzUGFyYW1zKHBhcmFtcykgewogICAgICAgIGlmIChwYXJhbXMuYmFja2dyb3VuZEJsdXIpCiAgICAgICAgICAgIHJldHVybiBnZXRCbHVyQ2FudmFzUGFyYW1zKHBhcmFtcy5iYWNrZ3JvdW5kQmx1ci5hbW91bnQpOwogICAgICAgIHJldHVybiBiYXNlQ2FudmFzUGFyYW1zOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlQ2FudmFzRW5naW5lKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBzZXR1cCwgZWZmZWN0Q2FudmFzLCBwYXJhbXMpIHsKICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICBjb25zdCB7IHRmbGl0ZSwgbW9kZWw6IHNlZ21lbnRhdGlvbk1vZGVsLCBpbnB1dEhlaWdodCwgaW5wdXRXaWR0aCwgaW5wdXRNZW1vcnlPZmZzZXQsIG91dHB1dE1lbW9yeU9mZnNldCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwgfSA9IHlpZWxkIGxvYWRTZWdtZW50YXRpb25Nb2RlbChzZXR1cC5zZWdtZW50YXRpb25Nb2RlbElkKTsKICAgICAgICAgICAgbGV0IGNhbnZhc1BhcmFtcyA9IGdldENhbnZhc1BhcmFtcyhwYXJhbXMpOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25DYW52YXMgPSBjcmVhdGVDYW52YXMoaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25DdHggPSBzZWdtZW50YXRpb25DYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CiAgICAgICAgICAgICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25NYXNrID0gbmV3IEltYWdlRGF0YShpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCk7CiAgICAgICAgICAgIGxldCBjdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgbGV0IGJhY2tncm91bmREaW1lbnNpb25zID0geyB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH07CiAgICAgICAgICAgIGNvbnN0IHZpZGVvQXNwZWN0UmF0aW8gPSB2aWRlb1dpZHRoIC8gdmlkZW9IZWlnaHQ7CiAgICAgICAgICAgIGxldCBjcm9wWCA9IDA7CiAgICAgICAgICAgIGxldCBjcm9wWSA9IDA7CiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUNyb3AgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBjcm9wID0gY2FudmFzUGFyYW1zLmNyb3AgfHwgMDsKICAgICAgICAgICAgICAgIGlmIChjcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgY3JvcFggPSB2aWRlb0FzcGVjdFJhdGlvID4gMSA/IE1hdGgucm91bmQoY3JvcCAqIHZpZGVvQXNwZWN0UmF0aW8pIDogY3JvcDsKICAgICAgICAgICAgICAgICAgICBjcm9wWSA9IHZpZGVvQXNwZWN0UmF0aW8gPCAxID8gTWF0aC5yb3VuZChjcm9wIC8gdmlkZW9Bc3BlY3RSYXRpbykgOiBjcm9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY3JvcFggPSAwOwogICAgICAgICAgICAgICAgICAgIGNyb3BZID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdXBkYXRlQ3JvcCgpOwogICAgICAgICAgICBjb25zdCBlZmZlY3RDdHggPSBlZmZlY3RDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGVmZmVjdEN0eCwKICAgICAgICAgICAgICAgIHVwZGF0ZUJhY2tncm91bmRGcmFtZShmcmFtZSwgZGltZW5zaW9ucykgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICBpZiAoZGltZW5zaW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZERpbWVuc2lvbnMgPSBkaW1lbnNpb25zOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtcyh1cGRhdGVkUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgY2FudmFzUGFyYW1zID0gZ2V0Q2FudmFzUGFyYW1zKHVwZGF0ZWRQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNyb3AoKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzRnJhbWUoZnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25DdHguZHJhd0ltYWdlKGZyYW1lLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgMCwgMCwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IHNlZ21lbnRhdGlvbkN0eC5nZXRJbWFnZURhdGEoMCwgMCwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZS5IRUFQRjMyW2lucHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDNdID0gaW1hZ2VEYXRhLmRhdGFbaSAqIDRdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuSEVBUEYzMltpbnB1dE1lbW9yeU9mZnNldCArIGkgKiAzICsgMV0gPSBpbWFnZURhdGEuZGF0YVtpICogNCArIDFdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuSEVBUEYzMltpbnB1dE1lbW9yeU9mZnNldCArIGkgKiAzICsgMl0gPSBpbWFnZURhdGEuZGF0YVtpICogNCArIDJdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuX3J1bkluZmVyZW5jZSgpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50YXRpb25Nb2RlbC50eXBlID09PSBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX0JBQ0tHUk9VTkRfUEVSU09OKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDIgKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gTWF0aC5tYXgoYmFja2dyb3VuZCwgcGVyc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRFeHAgPSBNYXRoLmV4cChiYWNrZ3JvdW5kIC0gc2hpZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uRXhwID0gTWF0aC5leHAocGVyc29uIC0gc2hpZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudGF0aW9uTWFzay5kYXRhW2kgKiA0ICsgM10gPSAoMjU1ICogcGVyc29uRXhwKSAvIChiYWNrZ3JvdW5kRXhwICsgcGVyc29uRXhwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWdtZW50YXRpb25Nb2RlbC50eXBlID09PSBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX1BFUlNPTikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25NYXNrLmRhdGFbaSAqIDQgKyAzXSA9IDI1NSAqIHBlcnNvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25DdHgucHV0SW1hZ2VEYXRhKHNlZ21lbnRhdGlvbk1hc2ssIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBjYW52YXNQYXJhbXMubWFza09wZXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZmlsdGVyID0gY2FudmFzUGFyYW1zLm1hc2tGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmRyYXdJbWFnZShzZWdtZW50YXRpb25DYW52YXMsIDAsIDAsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNhbnZhc1BhcmFtcy5wZXJzb25PcGVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmZpbHRlciA9IGNhbnZhc1BhcmFtcy5wZXJzb25GaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmRyYXdJbWFnZShmcmFtZSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNhbnZhc1BhcmFtcy5iYWNrZ3JvdW5kT3BlcmF0aW9uOwogICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5maWx0ZXIgPSBjYW52YXNQYXJhbXMuYmFja2dyb3VuZEZpbHRlcjsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZHJhd0ltYWdlKGN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUsIGJhY2tncm91bmREaW1lbnNpb25zLngsIGJhY2tncm91bmREaW1lbnNpb25zLnksIGJhY2tncm91bmREaW1lbnNpb25zLndpZHRoLCBiYWNrZ3JvdW5kRGltZW5zaW9ucy5oZWlnaHQsIDAsIDAsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5kcmF3SW1hZ2UoZnJhbWUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY3JvcFggfHwgY3JvcFkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICJzb3VyY2Utb3ZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5maWx0ZXIgPSAibm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5kcmF3SW1hZ2UoZWZmZWN0Q2FudmFzLCBjcm9wWCwgY3JvcFksIHZpZGVvV2lkdGggLSBjcm9wWCAqIDIsIHZpZGVvSGVpZ2h0IC0gY3JvcFkgKiAyLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICB9CgogICAgY29uc3QgZ2xzbCA9IFN0cmluZy5yYXc7CiAgICBmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyKSB7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTsKICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGlmICghZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbGluayBXZWJHTCBwcm9ncmFtOiAke2dsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvZ3JhbTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVBpcGxlbGluZVN0YWdlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyKSB7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV9wb3NpdGlvbiIpOwogICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uQXR0cmlidXRlTG9jYXRpb24pOwogICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBwb3NpdGlvbkJ1ZmZlcik7CiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwb3NpdGlvbkF0dHJpYnV0ZUxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwogICAgICAgIGNvbnN0IHRleENvb3JkQXR0cmlidXRlTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV90ZXhDb29yZCIpOwogICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3JkQXR0cmlidXRlTG9jYXRpb24pOwogICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZEF0dHJpYnV0ZUxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwogICAgICAgIHJldHVybiBwcm9ncmFtOwogICAgfQogICAgZnVuY3Rpb24gY29tcGlsZVNoYWRlcihnbCwgc2hhZGVyVHlwZSwgc2hhZGVyU291cmNlKSB7CiAgICAgICAgY29uc3Qgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwogICAgICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNoYWRlclNvdXJjZSk7CiAgICAgICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpOwogICAgICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyOiAke2dsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKX1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNoYWRlcjsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoZ2wsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBtaW5GaWx0ZXIgPSBnbC5ORUFSRVNULCBtYWdGaWx0ZXIgPSBnbC5ORUFSRVNUKSB7CiAgICAgICAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTsKICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgbWluRmlsdGVyKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgbWFnRmlsdGVyKTsKICAgICAgICBnbC50ZXhTdG9yYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMSwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgIHJldHVybiB0ZXh0dXJlOwogICAgfQoKICAgIGZ1bmN0aW9uIGdlbmVyYXRlT3B0aW1pemVkR2F1c3NpYW5LZXJuZWwoc2lnbWEpIHsKICAgICAgICBjb25zdCBnID0gKHgpID0+IE1hdGguZXhwKC0oeCAqIHgpIC8gKDIgKiBzaWdtYSAqIHNpZ21hKSk7CiAgICAgICAgY29uc3QgbnVtYmVycyA9IFtdOwogICAgICAgIGxldCB4ID0gMDsKICAgICAgICBsZXQgY3VycmVudFN1bSA9IDA7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgY29uc3QgbiA9IGcoeCk7CiAgICAgICAgICAgIGNvbnN0IG5leHRTdW0gPSBjdXJyZW50U3VtICsgKGN1cnJlbnRTdW0gPyBuICogMiA6IG4pOwogICAgICAgICAgICBpZiAoY3VycmVudFN1bSAmJiBuIC8gbmV4dFN1bSA8IDAuMDEgJiYgbnVtYmVycy5sZW5ndGggJSAyKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGN1cnJlbnRTdW0gPSBuZXh0U3VtOwogICAgICAgICAgICBudW1iZXJzLnB1c2gobik7CiAgICAgICAgICAgIHgrKzsKICAgICAgICB9CiAgICAgICAgY29uc3Qgd2VpZ2h0cyA9IG51bWJlcnMubWFwKChuKSA9PiBuIC8gY3VycmVudFN1bSk7CiAgICAgICAgY29uc3Qgb3B0aW1pemVkV2VpZ2h0cyA9IFt3ZWlnaHRzWzBdXTsKICAgICAgICBjb25zdCBvcHRpbWl6ZWRQb3NpdGlvbnMgPSBbMF07CiAgICAgICAgaWYgKHdlaWdodHMubGVuZ3RoID49IDMgJiYgd2VpZ2h0cy5sZW5ndGggJSAyID09PSAxKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgd2VpZ2h0cy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgY29uc3QgdzEgPSB3ZWlnaHRzW2ldOwogICAgICAgICAgICAgICAgY29uc3QgdzIgPSB3ZWlnaHRzW2kgKyAxXTsKICAgICAgICAgICAgICAgIGNvbnN0IHcgPSB3MSArIHcyOwogICAgICAgICAgICAgICAgY29uc3QgcCA9IHcyIC8gKHcxICsgdzIpOwogICAgICAgICAgICAgICAgb3B0aW1pemVkV2VpZ2h0cy5wdXNoKHcpOwogICAgICAgICAgICAgICAgb3B0aW1pemVkUG9zaXRpb25zLnB1c2goaSArIHApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHdlaWdodHM6IG9wdGltaXplZFdlaWdodHMsCiAgICAgICAgICAgIHBvc2l0aW9uczogb3B0aW1pemVkUG9zaXRpb25zLAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBidWlsZEJsdXJQYXNzKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X3BlcnNvbk1hc2s7CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X3dlaWdodFsyMF07CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X29mZnNldFsyMF07CiAgICAgICAgdW5pZm9ybSBpbnQgdV9rc2l6ZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV90ZXhlbFNpemU7CiAgICAgICAgaW4gdmVjMiB2X3RleENvb3JkOwogICAgICAgIG91dCB2ZWM0IG91dENvbG9yOwogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgdmVjNCBjZW50ZXJDb2xvciA9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB2X3RleENvb3JkKTsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICB2ZWM0IGZyYW1lQ29sb3IgPSBjZW50ZXJDb2xvciAqIHVfd2VpZ2h0WzBdICogKDEuMCAtIHBlcnNvbk1hc2spOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHVfa3NpemU7IGkrKykgewogICAgICAgICAgICAgICAgdmVjMiBvZmZzZXQgPSB2ZWMyKHVfb2Zmc2V0W2ldKSAqIHVfdGV4ZWxTaXplOwogICAgICAgICAgICAgICAgdmVjMiB0ZXhDb29yZCA9IHZfdGV4Q29vcmQgKyBvZmZzZXQ7CiAgICAgICAgICAgICAgICBmcmFtZUNvbG9yICs9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB0ZXhDb29yZCkgKiB1X3dlaWdodFtpXSAqCiAgICAgICAgICAgICAgICAgICAgKDEuMCAtIHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSk7CiAgICAgICAgICAgICAgICB0ZXhDb29yZCA9IHZfdGV4Q29vcmQgLSBvZmZzZXQ7CiAgICAgICAgICAgICAgICBmcmFtZUNvbG9yICs9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB0ZXhDb29yZCkgKiB1X3dlaWdodFtpXSAqCiAgICAgICAgICAgICAgICAgICAgKDEuMCAtIHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KGZyYW1lQ29sb3IucmdiICsgKDEuMCAtIGZyYW1lQ29sb3IuYSkgKiBjZW50ZXJDb2xvci5yZ2IsIDEuMCk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3Qgc2NhbGUgPSBwYXJhbXMuYmFja2dyb3VuZFJlc2FtcGxlU2NhbGUgfHwgMC4yOwogICAgICAgIGNvbnN0IGJsdXJyZWRCYWNrZ3JvdW5kV2lkdGggPSBNYXRoLnJvdW5kKG91dHB1dFdpZHRoICogc2NhbGUpOwogICAgICAgIGNvbnN0IGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0ID0gTWF0aC5yb3VuZChvdXRwdXRIZWlnaHQgKiBzY2FsZSk7CiAgICAgICAgY29uc3QgdGV4ZWxXaWR0aCA9IDEgLyBibHVycmVkQmFja2dyb3VuZFdpZHRoOwogICAgICAgIGNvbnN0IHRleGVsSGVpZ2h0ID0gMSAvIGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0OwogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudFNoYWRlclNvdXJjZSk7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVBpcGxlbGluZVN0YWdlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyKTsKICAgICAgICBjb25zdCBpbnB1dEZyYW1lTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW5wdXRGcmFtZSIpOwogICAgICAgIGNvbnN0IHBlcnNvbk1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9wZXJzb25NYXNrIik7CiAgICAgICAgY29uc3QgdGV4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfdGV4ZWxTaXplIik7CiAgICAgICAgY29uc3Qgd2VpZ2h0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfd2VpZ2h0Iik7CiAgICAgICAgY29uc3Qgb2Zmc2V0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfb2Zmc2V0Iik7CiAgICAgICAgY29uc3Qga2VybmVsc2l6ZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2tzaXplIik7CiAgICAgICAgY29uc3QgdGV4dHVyZTEgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgYmx1cnJlZEJhY2tncm91bmRXaWR0aCwgYmx1cnJlZEJhY2tncm91bmRIZWlnaHQsIGdsLk5FQVJFU1QsIGdsLkxJTkVBUik7CiAgICAgICAgY29uc3QgdGV4dHVyZTIgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgYmx1cnJlZEJhY2tncm91bmRXaWR0aCwgYmx1cnJlZEJhY2tncm91bmRIZWlnaHQsIGdsLk5FQVJFU1QsIGdsLkxJTkVBUik7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIxID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSwgMCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMiwgMCk7CiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICBnbC51bmlmb3JtMWkocGVyc29uTWFza0xvY2F0aW9uLCAxKTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVLZXJuZWwoa2VybmVsID0gIjV4NSIpIHsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgaWYgKGtlcm5lbCA9PT0gIjl4OSIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDUpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWzAuMjI3MDI3MDI3LCAwLjE5NDU5NDU5NDYsIDAuMTIxNjIxNjIxNiwgMC4wNTQwNTQwNTQxLCAwLjAxNjIxNjIxNjJdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMCwgMi4wLCAzLjAsIDQuMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbCA9PT0gIjl4OW8iKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjI3MzQzNzUsIDAuMzI4MTI1LCAwLjAzNTE1NjI1XSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KG9mZnNldExvY2F0aW9uLCBbMC4wLCAxLjMzMzMzMzMzMzMzMzMzMzMsIDMuMTExMTExMTExMTExMTExXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2VybmVsID09PSAiN3g3IikgewogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGtlcm5lbHNpemVMb2NhdGlvbiwgNCk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KHdlaWdodExvY2F0aW9uLCBbMC4zMTI1LCAwLjIzNDM3NSwgMC4wOTM3NSwgMC4wMTU2MjVdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMCwgMi4wLCAzLjBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwgPT09ICI1eDUiKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjM3MTUsIDAuMjUsIDAuMDYyNV0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAuMCwgMS4wLCAyLjBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwgPT09ICIzeDMiKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAyKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjUsIDAuMjVdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbCA9PT0gIjEwMW8iKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCA2KTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFsKICAgICAgICAgICAgICAgICAgICAwLjA4MjQ5MzAwNzc3NzUwNzcsIDAuMTU3MDg1MTAxNTM3MTA5MywgMC4xMjkwOTI5OTc0ODk2MTYwNiwgMC4wOTA2MTY1NzgxMDc5NzA3NSwKICAgICAgICAgICAgICAgICAgICAwLjA1NDI3MTI3MTgyNTEwMDQ0LCAwLjAyNzY4NzU0NzE1MTQ0OTU0NCwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAsIDEuNDg1MTQ4NTE0ODUxNDg1MSwgMy40NjUzNDY1MzQ2NTM0NjUzLCA1LjQ0NTU0NDU1NDQ1NTQ0NiwgNy40MjU3NDI1NzQyNTc0MjYsIDkuNDA1OTQwNTk0MDU5NDA1XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2VybmVsID09PSAiMTcxbyIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDcpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWwogICAgICAgICAgICAgICAgICAgIDAuMDY0NjUyMTgwMDU4MTExODUsIDAuMTI1NTk3MzU4NjEzMjkyNywgMC4xMTE4MDYwMjQ1NDY5NzA5OSwgMC4wOTA2NzM0NTcyNjk5NjEwNywKICAgICAgICAgICAgICAgICAgICAwLjA2Njk3NzEyMTMxMjA3OTcxLCAwLjA0NTA0NjQyNjcxODk2NDI1LCAwLjAyNzU3MzUyMTUwOTY3NTI3OCwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWwogICAgICAgICAgICAgICAgICAgIDAsIDEuNDkxMjI4MDcwMTc1NDM4OCwgMy40Nzk1MzIxNjM3NDI2OTA0LCA1LjQ2NzgzNjI1NzMwOTk0MTUsIDcuNDU2MTQwMzUwODc3MTkzLCA5LjQ0NDQ0NDQ0NDQ0NDQ0NSwKICAgICAgICAgICAgICAgICAgICAxMS40MzI3NDg1MzgwMTE2OTYsCiAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwuc3RhcnRzV2l0aCgib2ciKSkgewogICAgICAgICAgICAgICAgY29uc3QgcyA9IHBhcnNlRmxvYXQoa2VybmVsLnN1YnN0cmluZygyKSk7CiAgICAgICAgICAgICAgICBjb25zdCB7IHdlaWdodHMsIHBvc2l0aW9ucyB9ID0gZ2VuZXJhdGVPcHRpbWl6ZWRHYXVzc2lhbktlcm5lbChzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIHdlaWdodHMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIHdlaWdodHMpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgcG9zaXRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgbnVtUGFzc2VzID0gMTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIHVwZGF0ZUtlcm5lbChwYXJhbXMua2VybmVsKTsKICAgICAgICAgICAgbnVtUGFzc2VzID0gcGFyYW1zLm51bVBhc3NlcyB8fCAxOwogICAgICAgIH0KICAgICAgICB1cGRhdGVQYXJhbXMocGFyYW1zKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIGJsdXJyZWRCYWNrZ3JvdW5kV2lkdGgsIGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGlucHV0RnJhbWVMb2NhdGlvbiwgMCk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUGFzc2VzOyBpKyspIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgMCwgdGV4ZWxIZWlnaHQpOwogICAgICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcjEpOwogICAgICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUyKTsKICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUxKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShpbnB1dEZyYW1lTG9jYXRpb24sIDIpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTJmKHRleGVsU2l6ZUxvY2F0aW9uLCB0ZXhlbFdpZHRoLCAwKTsKICAgICAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIyKTsKICAgICAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZTIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMik7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZTIpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKHRleHR1cmUxKTsKICAgICAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkQmxlbmRQYXNzKGdsLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIGluIHZlYzIgYV9wb3NpdGlvbjsKICAgICAgICBpbiB2ZWMyIGFfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzIgdl90ZXhDb29yZDsKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIC8vIEZsaXBwaW5nIFkgaXMgcmVxdWlyZWQgd2hlbiByZW5kZXJpbmcgdG8gY2FudmFzCiAgICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChhX3Bvc2l0aW9uICogdmVjMigxLjAsIC0xLjApLCAwLjAsIDEuMCk7CiAgICAgICAgICAgIHZfdGV4Q29vcmQgPSBhX3RleENvb3JkOwogICAgICAgIH1gOwogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X3BlcnNvbk1hc2s7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9ibHVycmVkSW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV9jb3ZlcmFnZTsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICB2ZWMzIGNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgdmVjMyBibHVycmVkQ29sb3IgPSB0ZXh0dXJlKHVfYmx1cnJlZElucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICBwZXJzb25NYXNrID0gc21vb3Roc3RlcCh1X2NvdmVyYWdlLngsIHVfY292ZXJhZ2UueSwgcGVyc29uTWFzayk7CiAgICAgICAgICAgIG91dENvbG9yID0gdmVjNChtaXgoYmx1cnJlZENvbG9yLCBjb2xvciwgcGVyc29uTWFzayksIDEuMCk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpOwogICAgICAgIGNvbnN0IHByb2dyYW0gPSBjcmVhdGVQaXBsZWxpbmVTdGFnZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgY29uc3QgaW5wdXRGcmFtZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2lucHV0RnJhbWUiKTsKICAgICAgICBjb25zdCBwZXJzb25NYXNrTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGVyc29uTWFzayIpOwogICAgICAgIGNvbnN0IGJsdXJyZWRJbnB1dEZyYW1lID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JsdXJyZWRJbnB1dEZyYW1lIik7CiAgICAgICAgY29uc3QgY292ZXJhZ2VMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9jb3ZlcmFnZSIpOwogICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgZ2wudW5pZm9ybTFpKGlucHV0RnJhbWVMb2NhdGlvbiwgMCk7CiAgICAgICAgZ2wudW5pZm9ybTFpKHBlcnNvbk1hc2tMb2NhdGlvbiwgMSk7CiAgICAgICAgZ2wudW5pZm9ybTFpKGJsdXJyZWRJbnB1dEZyYW1lLCAyKTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGNvbnN0IGNvdmVyYWdlID0gcGFyYW1zLmNvdmVyYWdlIHx8IFswLCAxXTsKICAgICAgICAgICAgZ2wudW5pZm9ybTJmKGNvdmVyYWdlTG9jYXRpb24sIGNvdmVyYWdlWzBdLCBjb3ZlcmFnZVsxXSk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVBhcmFtcyhwYXJhbXMpOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkQmFja2dyb3VuZEJsdXJTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBwYXJhbXMpIHsKICAgICAgICBsZXQgYmx1clBhc3MgPSBidWlsZEJsdXJQYXNzKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcyk7CiAgICAgICAgY29uc3QgYmxlbmRQYXNzID0gYnVpbGRCbGVuZFBhc3MoZ2wsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgICAgIGJsdXJQYXNzLnJlbmRlcigpOwogICAgICAgICAgICBibGVuZFBhc3MucmVuZGVyKCk7CiAgICAgICAgfQogICAgICAgIGxldCBjdXJyZW50UmVzYW1wbGVTY2FsZSA9IHBhcmFtcy5iYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIGlmIChjdXJyZW50UmVzYW1wbGVTY2FsZSAhPT0gcGFyYW1zLmJhY2tncm91bmRSZXNhbXBsZVNjYWxlKSB7CiAgICAgICAgICAgICAgICBibHVyUGFzcy5jbGVhblVwKCk7CiAgICAgICAgICAgICAgICBibHVyUGFzcyA9IGJ1aWxkQmx1clBhc3MoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBwZXJzb25NYXNrVGV4dHVyZSwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRSZXNhbXBsZVNjYWxlID0gcGFyYW1zLmJhY2tncm91bmRSZXNhbXBsZVNjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJsdXJQYXNzLnVwZGF0ZVBhcmFtcyhwYXJhbXMpOwogICAgICAgICAgICBibGVuZFBhc3MudXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGJsZW5kUGFzcy5jbGVhblVwKCk7CiAgICAgICAgICAgIGJsdXJQYXNzLmNsZWFuVXAoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZEJhY2tncm91bmRJbWFnZVN0YWdlKGdsLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBiYWNrZ3JvdW5kSW1hZ2UsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHVuaWZvcm0gdmVjMiB1X2JhY2tncm91bmRTY2FsZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV9iYWNrZ3JvdW5kT2Zmc2V0OwogICAgICAgIGluIHZlYzIgYV9wb3NpdGlvbjsKICAgICAgICBpbiB2ZWMyIGFfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzIgdl90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjMiB2X2JhY2tncm91bmRDb29yZDsKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIC8vIEZsaXBwaW5nIFkgZm9yIGNhbnZhcwogICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoYV9wb3NpdGlvbiAqIHZlYzIoMS4wLCAtMS4wKSwgMC4wLCAxLjApOwogICAgICAgICAgICB2X3RleENvb3JkID0gYV90ZXhDb29yZDsKICAgICAgICAgICAgdl9iYWNrZ3JvdW5kQ29vcmQgPSBhX3RleENvb3JkICogdV9iYWNrZ3JvdW5kU2NhbGUgKyB1X2JhY2tncm91bmRPZmZzZXQ7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9pbnB1dEZyYW1lOwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfcGVyc29uTWFzazsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2JhY2tncm91bmQ7CiAgICAgICAgdW5pZm9ybSB2ZWMyIHVfY292ZXJhZ2U7CiAgICAgICAgaW4gdmVjMiB2X3RleENvb3JkOwogICAgICAgIGluIHZlYzIgdl9iYWNrZ3JvdW5kQ29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CgogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgdmVjMyBmcmFtZUNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgdmVjMyBiYWNrZ3JvdW5kQ29sb3IgPSB0ZXh0dXJlKHVfYmFja2dyb3VuZCwgdl9iYWNrZ3JvdW5kQ29vcmQpLnJnYjsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICBwZXJzb25NYXNrID0gc21vb3Roc3RlcCh1X2NvdmVyYWdlLngsIHVfY292ZXJhZ2UueSwgcGVyc29uTWFzayk7CiAgICAgICAgICAgIG91dENvbG9yID0gdmVjNChmcmFtZUNvbG9yICogcGVyc29uTWFzayArIGJhY2tncm91bmRDb2xvciAqICgxLjAgLSBwZXJzb25NYXNrKSwgMS4wKTsKICAgICAgICB9YDsKICAgICAgICBjb25zdCBvdXRwdXRSYXRpbyA9IG91dHB1dFdpZHRoIC8gb3V0cHV0SGVpZ2h0OwogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLlZFUlRFWF9TSEFERVIsIHZlcnRleFNoYWRlclNvdXJjZSk7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRTY2FsZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JhY2tncm91bmRTY2FsZSIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRPZmZzZXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9iYWNrZ3JvdW5kT2Zmc2V0Iik7CiAgICAgICAgY29uc3QgaW5wdXRGcmFtZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2lucHV0RnJhbWUiKTsKICAgICAgICBjb25zdCBwZXJzb25NYXNrTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGVyc29uTWFzayIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9iYWNrZ3JvdW5kIik7CiAgICAgICAgY29uc3QgY292ZXJhZ2VMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9jb3ZlcmFnZSIpOwogICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgZ2wudW5pZm9ybTJmKGJhY2tncm91bmRTY2FsZUxvY2F0aW9uLCAxLCAxKTsKICAgICAgICBnbC51bmlmb3JtMmYoYmFja2dyb3VuZE9mZnNldExvY2F0aW9uLCAwLCAwKTsKICAgICAgICBnbC51bmlmb3JtMWkoaW5wdXRGcmFtZUxvY2F0aW9uLCAwKTsKICAgICAgICBnbC51bmlmb3JtMWkocGVyc29uTWFza0xvY2F0aW9uLCAxKTsKICAgICAgICBsZXQgYmFja2dyb3VuZFRleHR1cmUgPSBudWxsOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kVGV4dHVyZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMik7CiAgICAgICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBiYWNrZ3JvdW5kVGV4dHVyZSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoYmFja2dyb3VuZExvY2F0aW9uLCAyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpOwogICAgICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCA0KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpIHsKICAgICAgICAgICAgY29uc3Qgc291cmNlV2lkdGggPSBiYWNrZ3JvdW5kSW1hZ2UubmF0dXJhbFdpZHRoIHx8IGJhY2tncm91bmRJbWFnZS52aWRlb1dpZHRoIHx8IGJhY2tncm91bmRJbWFnZS53aWR0aDsKICAgICAgICAgICAgY29uc3Qgc291cmNlSGVpZ2h0ID0gYmFja2dyb3VuZEltYWdlLm5hdHVyYWxIZWlnaHQgfHwgYmFja2dyb3VuZEltYWdlLnZpZGVvSGVpZ2h0IHx8IGJhY2tncm91bmRJbWFnZS5oZWlnaHQ7CiAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgZ2wuUkdCQTgsIHNvdXJjZVdpZHRoLCBzb3VyY2VIZWlnaHQsIGdsLkxJTkVBUiwgZ2wuTElORUFSKTsKICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBzb3VyY2VXaWR0aCwgc291cmNlSGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICBsZXQgeE9mZnNldCA9IDA7CiAgICAgICAgICAgIGxldCB5T2Zmc2V0ID0gMDsKICAgICAgICAgICAgbGV0IGJhY2tncm91bmRXaWR0aCA9IHNvdXJjZVdpZHRoOwogICAgICAgICAgICBsZXQgYmFja2dyb3VuZEhlaWdodCA9IHNvdXJjZUhlaWdodDsKICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZFJhdGlvID0gYmFja2dyb3VuZFdpZHRoIC8gYmFja2dyb3VuZEhlaWdodDsKICAgICAgICAgICAgaWYgKGJhY2tncm91bmRSYXRpbyA8IG91dHB1dFJhdGlvKSB7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSGVpZ2h0ID0gYmFja2dyb3VuZFdpZHRoIC8gb3V0cHV0UmF0aW87CiAgICAgICAgICAgICAgICB5T2Zmc2V0ID0gKHNvdXJjZUhlaWdodCAtIGJhY2tncm91bmRIZWlnaHQpIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmRXaWR0aCA9IGJhY2tncm91bmRIZWlnaHQgKiBvdXRwdXRSYXRpbzsKICAgICAgICAgICAgICAgIHhPZmZzZXQgPSAoc291cmNlV2lkdGggLSBiYWNrZ3JvdW5kV2lkdGgpIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB4U2NhbGUgPSBiYWNrZ3JvdW5kV2lkdGggLyBzb3VyY2VXaWR0aDsKICAgICAgICAgICAgY29uc3QgeVNjYWxlID0gYmFja2dyb3VuZEhlaWdodCAvIHNvdXJjZUhlaWdodDsKICAgICAgICAgICAgeE9mZnNldCAvPSBzb3VyY2VXaWR0aDsKICAgICAgICAgICAgeU9mZnNldCAvPSBzb3VyY2VIZWlnaHQ7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZihiYWNrZ3JvdW5kU2NhbGVMb2NhdGlvbiwgeFNjYWxlLCB5U2NhbGUpOwogICAgICAgICAgICBnbC51bmlmb3JtMmYoYmFja2dyb3VuZE9mZnNldExvY2F0aW9uLCB4T2Zmc2V0LCB5T2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQmFja2dyb3VuZEltYWdlKGJhY2tncm91bmRJbWFnZSwgcmVJbml0KSB7CiAgICAgICAgICAgIGlmIChyZUluaXQpIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJhY2tncm91bmRJbWFnZSkgewogICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmRUZXh0dXJlKQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYmFja2dyb3VuZFRleHR1cmUpIHsKICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGJhY2tncm91bmRUZXh0dXJlKTsKICAgICAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgYmFja2dyb3VuZEltYWdlLm5hdHVyYWxXaWR0aCB8fCBiYWNrZ3JvdW5kSW1hZ2UudmlkZW9XaWR0aCB8fCBiYWNrZ3JvdW5kSW1hZ2Uud2lkdGgsIGJhY2tncm91bmRJbWFnZS5uYXR1cmFsSGVpZ2h0IHx8IGJhY2tncm91bmRJbWFnZS52aWRlb0hlaWdodCB8fCBiYWNrZ3JvdW5kSW1hZ2UuaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgY29uc3QgY292ZXJhZ2UgPSBwYXJhbXMuY292ZXJhZ2UgfHwgWzAsIDFdOwogICAgICAgICAgICBnbC51bmlmb3JtMmYoY292ZXJhZ2VMb2NhdGlvbiwgY292ZXJhZ2VbMF0sIGNvdmVyYWdlWzFdKTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgaWYgKGJhY2tncm91bmRJbWFnZSkKICAgICAgICAgICAgaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoYmFja2dyb3VuZFRleHR1cmUpOwogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgICAgIHVwZGF0ZUJhY2tncm91bmRJbWFnZSwKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1aWxkSW1wcm92ZU1hc2tTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBpbXByb3ZlZE1hc2tUZXh0dXJlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KSB7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9wZXJzb25NYXNrOwogICAgICAgIHVuaWZvcm0gdmVjMiB1X3RleGVsU2l6ZTsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CiAgICAgICAgY29uc3QgZmxvYXQgb2Zmc2V0WzNdID0gZmxvYXRbXSgwLjAsIDEuMCwgMi4wKTsKICAgICAgICBjb25zdCBmbG9hdCB3ZWlnaHRbM10gPSBmbG9hdFtdKDAuMzg3NzQsIDAuMjQ0NzcsIDAuMDYxMzYpOwogICAgICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIGZsb2F0IGJsdXJyZWRBbHBoYSA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hICogd2VpZ2h0WzBdOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDM7IGkrKykgewogICAgICAgICAgICAgICAgdmVjMiBvZmZzZXQgPSB2ZWMyKG9mZnNldFtpXSkgKiB1X3RleGVsU2l6ZTsKICAgICAgICAgICAgICAgIHZlYzIgdGV4Q29vcmQgPSB2X3RleENvb3JkICsgb2Zmc2V0OwogICAgICAgICAgICAgICAgYmx1cnJlZEFscGhhICs9IHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSAqIHdlaWdodFtpXTsKICAgICAgICAgICAgICAgIHRleENvb3JkID0gdl90ZXhDb29yZCAtIG9mZnNldDsKICAgICAgICAgICAgICAgIGJsdXJyZWRBbHBoYSArPSB0ZXh0dXJlKHVfcGVyc29uTWFzaywgdGV4Q29vcmQpLmEgKiB3ZWlnaHRbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KDAsMCwwLGJsdXJyZWRBbHBoYSk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgdGV4ZWxXaWR0aCA9IDEgLyBvdXRwdXRXaWR0aDsKICAgICAgICBjb25zdCB0ZXhlbEhlaWdodCA9IDEgLyBvdXRwdXRIZWlnaHQ7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IHBlcnNvbk1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9wZXJzb25NYXNrIik7CiAgICAgICAgY29uc3QgdGV4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfdGV4ZWxTaXplIik7CiAgICAgICAgY29uc3QgdGV4dHVyZTEgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuTkVBUkVTVCwgZ2wuTkVBUkVTVCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIxID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSwgMCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBpbXByb3ZlZE1hc2tUZXh0dXJlLCAwKTsKICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGdsLnVuaWZvcm0xaShwZXJzb25NYXNrTG9jYXRpb24sIDEpOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgMCwgdGV4ZWxIZWlnaHQpOwogICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSk7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgdGV4ZWxXaWR0aCwgMCk7CiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIyKTsKICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMik7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZTEpOwogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyByZW5kZXIsIGNsZWFuVXAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZFRGTGl0ZU91dHB1dFRvTWFza1N0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgb3V0cHV0VGV4dHVyZSwgdGZsaXRlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBvdXRwdXRNZW1vcnlPZmZzZXQpIHsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2lucHV0U2VnbWVudGF0aW9uOwoKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CgogICAgICAgIGZsb2F0IGdldE1hc2sodmVjMiBzZWdtZW50YXRpb24pIHsKICAgICAgICAgICAgZmxvYXQgc2hpZnQgPSBtYXgoc2VnbWVudGF0aW9uLnIsIHNlZ21lbnRhdGlvbi5nKTsKICAgICAgICAgICAgZmxvYXQgYmFja2dyb3VuZEV4cCA9IGV4cChzZWdtZW50YXRpb24uciAtIHNoaWZ0KTsKICAgICAgICAgICAgZmxvYXQgcGVyc29uRXhwID0gZXhwKHNlZ21lbnRhdGlvbi5nIC0gc2hpZnQpOwogICAgICAgICAgICByZXR1cm4gcGVyc29uRXhwIC8gKGJhY2tncm91bmRFeHAgKyBwZXJzb25FeHApOwogICAgICAgIH0KCiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICBmbG9hdCBtYXNrID0gZ2V0TWFzayh0ZXh0dXJlKHVfaW5wdXRTZWdtZW50YXRpb24sIHZfdGV4Q29vcmQpLnJnKTsKICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KHZlYzMoMC4wKSwgbWFzayk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGlucHV0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW5wdXRTZWdtZW50YXRpb24iKTsKICAgICAgICBjb25zdCBpbnB1dFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SRzMyRiwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuTkVBUkVTVCwgZ2wuTkVBUkVTVCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIpOwogICAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgb3V0cHV0VGV4dHVyZSwgMCk7CiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICBnbC51bmlmb3JtMWkoaW5wdXRMb2NhdGlvbiwgMSk7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMSk7CiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGlucHV0VGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuUkcsIGdsLkZMT0FULCB0ZmxpdGUuSEVBUEYzMiwgb3V0cHV0TWVtb3J5T2Zmc2V0KTsKICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgICAgICAgICBnbC5kZWxldGVGcmFtZWJ1ZmZlcihmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoaW5wdXRUZXh0dXJlKTsKICAgICAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgcmVuZGVyLCBjbGVhblVwIH07CiAgICB9CgogICAgZnVuY3Rpb24gYnVpbGRURkxpdGVJbnB1dFN0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgdGZsaXRlLCBpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwgaW5wdXRNZW1vcnlPZmZzZXQpIHsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2lucHV0RnJhbWU7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9mbG9hdGx1dDsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X3BpeGVsU2l6ZTsKICAgICAgICBvdXQgdmVjNCBvdXRDb2xvcjsKCiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICBmbG9hdCB4ID0gdl90ZXhDb29yZC54OwogICAgICAgICAgICB2ZWM0IGNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpOwogICAgICAgICAgICBmbG9hdCByID0gbW9kKHggKiB1X3BpeGVsU2l6ZSwgMy4wKTsKICAgICAgICAgICAgZmxvYXQgYyA9IDAuMDsKICAgICAgICAgICAgaWYgKHIgPj0gMi4wICkgYyA9IGNvbG9yLmI7CiAgICAgICAgICAgIGVsc2UgaWYgKHIgPj0gMS4wKSBjID0gY29sb3IuZzsKICAgICAgICAgICAgZWxzZSBjID0gY29sb3IucjsKICAgICAgICAgICAgb3V0Q29sb3IgPSB0ZXh0dXJlKHVfZmxvYXRsdXQsIHZlYzIoYywgMC41KSk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGlucHV0RnJhbWVMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9pbnB1dEZyYW1lIik7CiAgICAgICAgY29uc3QgcGl4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGl4ZWxTaXplIik7CiAgICAgICAgY29uc3QgZmxvYXRsdXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9mbG9hdGx1dCIpOwogICAgICAgIGNvbnN0IG91dHB1dFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgaW5wdXRXaWR0aCAqIDMsIGlucHV0SGVpZ2h0KTsKICAgICAgICBjb25zdCBmcmFtZUJ1ZmZlciA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7CiAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBvdXRwdXRUZXh0dXJlLCAwKTsKICAgICAgICBjb25zdCBvdXRwdXRQaXhlbHMgPSBuZXcgVWludDhBcnJheSh0ZmxpdGUuSEVBUEYzMi5idWZmZXIsIGlucHV0TWVtb3J5T2Zmc2V0ICogNCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCAqIDQgKiAzKTsKICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGdsLnVuaWZvcm0xaShpbnB1dEZyYW1lTG9jYXRpb24sIDApOwogICAgICAgIGdsLnVuaWZvcm0xZihwaXhlbFNpemVMb2NhdGlvbiwgaW5wdXRXaWR0aCAqIDMpOwogICAgICAgIGdsLnVuaWZvcm0xaShmbG9hdGx1dExvY2F0aW9uLCAzKTsKICAgICAgICBjb25zdCBmbG9hdEx1dFRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7CiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmxvYXRMdXRUZXh0dXJlKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgICAgIGNvbnN0IGx1dCA9IG5ldyBGbG9hdDMyQXJyYXkoMjU2KTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKQogICAgICAgICAgICBsdXRbaV0gPSBpIC8gMjU2OwogICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgMjU2LCAxLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBuZXcgVWludDhBcnJheShsdXQuYnVmZmVyLCAwLCAyNTYgKiA0KSk7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBpbnB1dFdpZHRoICogMywgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUzKTsKICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmxvYXRMdXRUZXh0dXJlKTsKICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICBnbC5yZWFkUGl4ZWxzKDAsIDAsIGlucHV0V2lkdGggKiAzLCBpbnB1dEhlaWdodCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgb3V0cHV0UGl4ZWxzKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgICAgICAgICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKG91dHB1dFRleHR1cmUpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKGZsb2F0THV0VGV4dHVyZSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHJlbmRlciwgY2xlYW5VcCB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEJsdXJFbmdpbmVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgc3dpdGNoIChwYXJhbXMuYW1vdW50KSB7CiAgICAgICAgICAgIGNhc2UgInNsaWdodCI6IHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsga2VybmVsOiAib2c1IiwgbnVtUGFzc2VzOiAxLCBiYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTogMSB9LCBwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImhlYXZ5IjogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBrZXJuZWw6ICJvZzEwIiwgbnVtUGFzc2VzOiAxLCBiYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTogMC41IH0sIHBhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBrZXJuZWw6ICJvZzUiLCBudW1QYXNzZXM6IDEsIGJhY2tncm91bmRSZXNhbXBsZVNjYWxlOiAwLjUgfSwgcGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGdldEVuZ2luZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICBjb25zdCBiYXNlRW5naW5lUGFyYW1zID0gewogICAgICAgICAgICBjb3ZlcmFnZTogcGFyYW1zLmNvdmVyYWdlLAogICAgICAgIH07CiAgICAgICAgaWYgKHBhcmFtcy5iYWNrZ3JvdW5kQmx1cikgewogICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IGJhc2VFbmdpbmVQYXJhbXMgfSwgZ2V0Qmx1ckVuZ2luZVBhcmFtcyhwYXJhbXMuYmFja2dyb3VuZEJsdXIpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2VFbmdpbmVQYXJhbXM7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVXZWJHTEVuZ2luZSh2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgc2V0dXAsIGVmZmVjdENhbnZhcywgcGFyYW1zLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgY29uc3QgeyB0ZmxpdGUsIGlucHV0SGVpZ2h0LCBpbnB1dFdpZHRoLCBpbnB1dE1lbW9yeU9mZnNldCwgb3V0cHV0TWVtb3J5T2Zmc2V0LCBzZWdtZW50YXRpb25QaXhlbENvdW50IH0gPSB5aWVsZCBsb2FkU2VnbWVudGF0aW9uTW9kZWwoc2V0dXAuc2VnbWVudGF0aW9uTW9kZWxJZCk7CiAgICAgICAgICAgIGxldCBlbmdpbmVQYXJhbXMgPSBnZXRFbmdpbmVQYXJhbXMocGFyYW1zKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgaW4gdmVjMiBhX3Bvc2l0aW9uOwogICAgICAgIGluIHZlYzIgYV90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjMiB2X3RleENvb3JkOwogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFfcG9zaXRpb24sIDAuMCwgMS4wKTsKICAgICAgICAgICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7CiAgICAgICAgfWA7CiAgICAgICAgICAgIGNvbnN0IGdsID0gZWZmZWN0Q2FudmFzLmdldENvbnRleHQoIndlYmdsMiIsIHNldHVwLndlYmdsQ29udGV4dFNldHRpbmdzKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4QXJyYXkgPSBnbC5jcmVhdGVWZXJ0ZXhBcnJheSgpOwogICAgICAgICAgICBnbC5iaW5kVmVydGV4QXJyYXkodmVydGV4QXJyYXkpOwogICAgICAgICAgICBjb25zdCBwb3NpdGlvbkJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpOwogICAgICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgcG9zaXRpb25CdWZmZXIpOwogICAgICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShbLTEsIC0xLCAxLjAsIC0xLCAtMSwgMS4wLCAxLjAsIDEuMF0pLCBnbC5TVEFUSUNfRFJBVyk7CiAgICAgICAgICAgIGNvbnN0IHRleENvb3JkQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CiAgICAgICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCwgMS4wLCAxLjAsIDEuMF0pLCBnbC5TVEFUSUNfRFJBVyk7CiAgICAgICAgICAgIGNvbnN0IGlucHV0RnJhbWVUZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBpbnB1dEZyYW1lVGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpOwogICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICAgICAgICAgIGNvbnN0IG1hc2tUZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgZ2wuUkdCQTgsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0KTsKICAgICAgICAgICAgY29uc3QgaW1wcm92ZWRNYXNrV2lkdGggPSBpbnB1dFdpZHRoOwogICAgICAgICAgICBjb25zdCBpbXByb3ZlZE1hc2tIZWlnaHQgPSBpbnB1dEhlaWdodDsKICAgICAgICAgICAgY29uc3QgaW1wcm92ZWRNYXNrVGV4dHVyZSA9IGNyZWF0ZVRleHR1cmUoZ2wsIGdsLlJHQkE4LCBpbXByb3ZlZE1hc2tXaWR0aCwgaW1wcm92ZWRNYXNrSGVpZ2h0LCBnbC5MSU5FQVIsIGdsLkxJTkVBUik7CiAgICAgICAgICAgIGNvbnN0IHRmbGl0ZUlucHV0U3RhZ2UgPSBidWlsZFRGTGl0ZUlucHV0U3RhZ2UoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCB0ZmxpdGUsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBzZWdtZW50YXRpb25QaXhlbENvdW50LCBpbnB1dE1lbW9yeU9mZnNldCk7CiAgICAgICAgICAgIGNvbnN0IHRmbGl0ZU91dHB1dFRvTWFza1N0YWdlID0gYnVpbGRURkxpdGVPdXRwdXRUb01hc2tTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIG1hc2tUZXh0dXJlLCB0ZmxpdGUsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBvdXRwdXRNZW1vcnlPZmZzZXQpOwogICAgICAgICAgICBjb25zdCBpbXByb3ZlTWFza1N0YWdlID0gYnVpbGRJbXByb3ZlTWFza1N0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgbWFza1RleHR1cmUsIGltcHJvdmVkTWFza1RleHR1cmUsIGltcHJvdmVkTWFza1dpZHRoLCBpbXByb3ZlZE1hc2tIZWlnaHQpOwogICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQmx1clN0YWdlID0gYnVpbGRCYWNrZ3JvdW5kQmx1clN0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgaW1wcm92ZWRNYXNrVGV4dHVyZSwgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIGVuZ2luZVBhcmFtcyk7CiAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRJbWFnZVN0YWdlID0gYnVpbGRCYWNrZ3JvdW5kSW1hZ2VTdGFnZShnbCwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBpbXByb3ZlZE1hc2tUZXh0dXJlLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGVmZmVjdEN0eDogZ2wsCiAgICAgICAgICAgICAgICB1cGRhdGVCYWNrZ3JvdW5kRnJhbWUoZnJhbWUsIF8sIHJlSW5pdCkgewogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZVN0YWdlLnVwZGF0ZUJhY2tncm91bmRJbWFnZShmcmFtZSwgcmVJbml0KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1cGRhdGVQYXJhbXModXBkYXRlZFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHVwZGF0ZWRQYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgZW5naW5lUGFyYW1zID0gZ2V0RW5naW5lUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEJsdXJTdGFnZS51cGRhdGVQYXJhbXMoZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2VTdGFnZS51cGRhdGVQYXJhbXMoZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzRnJhbWUoZnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpOwogICAgICAgICAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTApOwogICAgICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGlucHV0RnJhbWVUZXh0dXJlKTsKICAgICAgICAgICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGZyYW1lKTsKICAgICAgICAgICAgICAgICAgICBnbC5iaW5kVmVydGV4QXJyYXkodmVydGV4QXJyYXkpOwogICAgICAgICAgICAgICAgICAgIHRmbGl0ZUlucHV0U3RhZ2UucmVuZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgdGZsaXRlLl9ydW5JbmZlcmVuY2UoKTsKICAgICAgICAgICAgICAgICAgICB0ZmxpdGVPdXRwdXRUb01hc2tTdGFnZS5yZW5kZXIoKTsKICAgICAgICAgICAgICAgICAgICBpbXByb3ZlTWFza1N0YWdlLnJlbmRlcigpOwogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5iYWNrZ3JvdW5kVXJsID8gYmFja2dyb3VuZEltYWdlU3RhZ2UucmVuZGVyKCkgOiBiYWNrZ3JvdW5kQmx1clN0YWdlLnJlbmRlcigpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRCbHVyU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIGltcHJvdmVNYXNrU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIHRmbGl0ZU91dHB1dFRvTWFza1N0YWdlLmNsZWFuVXAoKTsKICAgICAgICAgICAgICAgICAgICB0ZmxpdGVJbnB1dFN0YWdlLmNsZWFuVXAoKTsKICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKGltcHJvdmVkTWFza1RleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUobWFza1RleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoaW5wdXRGcmFtZVRleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZUJ1ZmZlcih0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlQnVmZmVyKHBvc2l0aW9uQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVWZXJ0ZXhBcnJheSh2ZXJ0ZXhBcnJheSk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlY29kZUJhc2U2NChiYXNlNjQsIGVuYWJsZVVuaWNvZGUpIHsKICAgICAgICB2YXIgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjQpOwogICAgICAgIHJldHVybiBiaW5hcnlTdHJpbmc7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlVVJMKGJhc2U2NCwgc291cmNlbWFwQXJnLCBlbmFibGVVbmljb2RlQXJnKSB7CiAgICAgICAgdmFyIHNvdXJjZSA9IGRlY29kZUJhc2U2NChiYXNlNjQpOwogICAgICAgIHZhciBzdGFydCA9IHNvdXJjZS5pbmRleE9mKCdcbicsIDEwKSArIDE7CiAgICAgICAgdmFyIGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0KSArICgnJyk7CiAgICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbYm9keV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnIH0pOwogICAgICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2U2NFdvcmtlckZhY3RvcnkoYmFzZTY0LCBzb3VyY2VtYXBBcmcsIGVuYWJsZVVuaWNvZGVBcmcpIHsKICAgICAgICB2YXIgdXJsOwogICAgICAgIHJldHVybiBmdW5jdGlvbiBXb3JrZXJGYWN0b3J5KG9wdGlvbnMpIHsKICAgICAgICAgICAgdXJsID0gdXJsIHx8IGNyZWF0ZVVSTChiYXNlNjQpOwogICAgICAgICAgICByZXR1cm4gbmV3IFdvcmtlcih1cmwsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICB9CgogICAgdmFyIFdvcmtlckZhY3RvcnkgPSAvKiNfX1BVUkVfXyovY3JlYXRlQmFzZTY0V29ya2VyRmFjdG9yeSgnTHlvZ2NtOXNiSFZ3TFhCc2RXZHBiaTEzWldJdGQyOXlhMlZ5TFd4dllXUmxjaUFxTHdvb1puVnVZM1JwYjI0Z0tDa2dld29nSUNBZ0ozVnpaU0J6ZEhKcFkzUW5Pd29LSUNBZ0lHeGxkQ0IwYVcxbGNpQTlJRzUxYkd3N0NpQWdJQ0J2Ym0xbGMzTmhaMlVnUFNCbWRXNWpkR2x2YmlBb2NtVnhkV1Z6ZENrZ2V3b2dJQ0FnSUNBZ0lHTnZibk4wSUhScGJXVWdQU0J5WlhGMVpYTjBMbVJoZEdFN0NpQWdJQ0FnSUNBZ2FXWWdLSFJwYldVZ1BqMGdNQ2tLSUNBZ0lDQWdJQ0FnSUNBZ2RHbHRaWElnUFNCelpYUlVhVzFsYjNWMEtDZ3BJRDArSUhCdmMzUk5aWE56WVdkbEtDSWlLU3dnZEdsdFpTazdDaUFnSUNBZ0lDQWdaV3h6WlNCcFppQW9kR2x0WlhJcENpQWdJQ0FnSUNBZ0lDQWdJR05zWldGeVZHbHRaVzkxZENoMGFXMWxjaWs3Q2lBZ0lDQjlPd29LZlNrb0tUc0tMeThqSUhOdmRYSmpaVTFoY0hCcGJtZFZVa3c5ZEdsdFpYSXVkMjl5YTJWeUxtcHpMbTFoY0FvSycpOwogICAgLyogZXNsaW50LWVuYWJsZSAqLwoKICAgIGNsYXNzIFByb2Nlc3NvciBleHRlbmRzIGV2ZW50c0V4cG9ydHMuRXZlbnRFbWl0dGVyIHsKICAgICAgICBjb25zdHJ1Y3Rvcih7IHNldHVwLCBwYXJhbXMsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBlbWl0IH0pIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5zZXR1cCA9IHNldHVwOwogICAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgICAgICAgICAgdGhpcy52aWRlb1dpZHRoID0gdmlkZW9XaWR0aDsKICAgICAgICAgICAgdGhpcy52aWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwogICAgICAgICAgICBpZiAoZW1pdCkKICAgICAgICAgICAgICAgIHRoaXMuZW1pdCA9IGVtaXQ7CiAgICAgICAgfQogICAgICAgIHNldHVwRW5naW5lKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBlZmZlY3RDYW52YXMsIGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICAgIHRoaXMudmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7CiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7CiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvQXNwZWN0UmF0aW8gPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgICAgdGhpcy5lZmZlY3RDYW52YXMgPSBlZmZlY3RDYW52YXMgfHwgY3JlYXRlQ2FudmFzKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVFbmdpbmUgPSB0aGlzLnNldHVwLnVzZVdlYkdMID8gY3JlYXRlV2ViR0xFbmdpbmUgOiBjcmVhdGVDYW52YXNFbmdpbmU7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZSA9IHlpZWxkIGNyZWF0ZUVuZ2luZSh0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQsIHRoaXMuc2V0dXAsIHRoaXMuZWZmZWN0Q2FudmFzLCB0aGlzLnBhcmFtcywgaW5pdGlhbEJhY2tncm91bmRGcmFtZSk7CiAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdEN0eCA9IHRoaXMuZW5naW5lLmVmZmVjdEN0eDsKICAgICAgICAgICAgICAgIGlmIChpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCYWNrZ3JvdW5kRnJhbWUoeyBmcmFtZTogaW5pdGlhbEJhY2tncm91bmRGcmFtZSB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVZpZGVvU2l6ZShfYSkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiogKHsgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQgfSkgewogICAgICAgICAgICAgICAgY29uc3Qgb2xkQmFja2dyb3VuZEZyYW1lID0gdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lOwogICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgICAgIGNvbnN0IG9sZEVuZ2luZSA9IHRoaXMuZW5naW5lOwogICAgICAgICAgICAgICAgeWllbGQgdGhpcy5zZXR1cEVuZ2luZSh2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgdGhpcy5lZmZlY3RDYW52YXMsIG9sZEJhY2tncm91bmRGcmFtZSk7CiAgICAgICAgICAgICAgICBvbGRFbmdpbmUuZGlzcG9zZSgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaW5pdChfYSkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiogKHsgaW5pdGlhbEJhY2tncm91bmRGcmFtZSwgdXNlSW5zZXJ0YWJsZVN0cmVhbXMsIGVmZmVjdENhbnZhcyB9KSB7CiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLnNldHVwRW5naW5lKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCwgZWZmZWN0Q2FudmFzLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lKTsKICAgICAgICAgICAgICAgIGlmICh1c2VJbnNlcnRhYmxlU3RyZWFtcykgewogICAgICAgICAgICAgICAgICAgIGxldCBkcm9wRmlyc3QgPSA1OwogICAgICAgICAgICAgICAgICAgIGxldCBsb2NhbFN0YXJ0VGltZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgbGV0IGZyYW1lU3RhcnRUaW1lID0gMDsKICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RGcmFtZVJlbmRlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lciA9IG5ldyBUcmFuc2Zvcm1TdHJlYW0oewogICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IChmcmFtZSwgY29udHJvbGxlcikgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250cm9sbGVyID0gY29udHJvbGxlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lVGltZXN0YW1wID0gZnJhbWUudGltZXN0YW1wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxvY2FsU3RhcnRUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdGFydFRpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFydFRpbWUgPSBmcmFtZVRpbWVzdGFtcCAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkRnJhbWVUaW1lID0gZnJhbWVUaW1lc3RhbXAgLyAxMDAwIC0gZnJhbWVTdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkTG9jYWxUaW1lID0gbm93IC0gbG9jYWxTdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcEZpcnN0ID4gMCB8fCBlbGFwc2VkTG9jYWxUaW1lIDwgZWxhcHNlZEZyYW1lVGltZSArIDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FuZFJlbmRlckZyYW1lKGZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc1ZpZGVvQmFja2dyb3VuZCAmJiB0aGlzLnNldHVwLnRyYW5zZmVyVHlwZSAhPT0gImNhbnZhcyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJnZXRiYWNrZ3JvdW5kZnJhbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wRmlyc3QgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcEZpcnN0LS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdGFydFRpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFydFRpbWUgPSBmcmFtZVRpbWVzdGFtcCAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFZpZGVvRnJhbWUodGhpcy5lZmZlY3RDYW52YXMsIHsgdGltZXN0YW1wOiBmcmFtZVRpbWVzdGFtcCB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0RnJhbWVSZW5kZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RnJhbWVSZW5kZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJmaXJzdGZyYW1lcmVuZGVyZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5zZXR1cC51c2VCYWNrZ3JvdW5kV29ya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlciA9IG5ldyBXb3JrZXJGYWN0b3J5KCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlci5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoIm91dHB1dCIsIHsgZnJhbWU6IHRoaXMuY3VycmVudE91dHB1dEZyYW1lIH0sIFt0aGlzLmN1cnJlbnRPdXRwdXRGcmFtZV0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJyZWFkeSIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlUGFyYW1zKHsgcGFyYW1zLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lIH0pIHsKICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CiAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZUN0eCA9IG51bGw7CiAgICAgICAgICAgIGlmIChpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJhY2tncm91bmRGcmFtZSh7IGZyYW1lOiBpbml0aWFsQmFja2dyb3VuZEZyYW1lLCByZUluaXQ6IHRydWUgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS51cGRhdGVCYWNrZ3JvdW5kRnJhbWUobnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5lbmdpbmUudXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZUJhY2tncm91bmRGcmFtZSh7IGZyYW1lLCByZUluaXQgfSkgewogICAgICAgICAgICBsZXQgdXBkYXRlZERpbWVuc2lvbnM7CiAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICB0aGlzLmhhc1ZpZGVvQmFja2dyb3VuZCA9IHRoaXMucGFyYW1zLmJhY2tncm91bmRVcmwgJiYgdGhpcy5wYXJhbXMuYmFja2dyb3VuZFR5cGUgPT09ICJ2aWRlbyI7CiAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucyA9IHsgeDogMCwgeTogMCwgd2lkdGg6IHRoaXMudmlkZW9XaWR0aCwgaGVpZ2h0OiB0aGlzLnZpZGVvSGVpZ2h0IH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNldHVwLnRyYW5zZmVyVHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAiaW1hZ2ViaXRtYXAiOiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gZnJhbWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWRhdGEiOiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gY3JlYXRlQ2FudmFzKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZUN0eCA9IHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZS5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGZyYW1lKSwgdGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWVDdHgucHV0SW1hZ2VEYXRhKGZyYW1lLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgImNhbnZhcyI6IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy53aWR0aCA9IGZyYW1lLnZpZGVvV2lkdGggfHwgZnJhbWUubmF0dXJhbFdpZHRoIHx8IGZyYW1lLndpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQgPSBmcmFtZS52aWRlb0hlaWdodCB8fCBmcmFtZS5uYXR1cmFsSGVpZ2h0IHx8IGZyYW1lLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZEFzcGVjdFJhdGlvID0gdXBkYXRlZERpbWVuc2lvbnMud2lkdGggLyB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kQXNwZWN0UmF0aW8gPiB0aGlzLnZpZGVvQXNwZWN0UmF0aW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHNpZGVYID0gdXBkYXRlZERpbWVuc2lvbnMud2lkdGggLSB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQgKiB0aGlzLnZpZGVvQXNwZWN0UmF0aW87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy53aWR0aCAtPSBvdXRzaWRlWDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zLnggPSBNYXRoLmZsb29yKG91dHNpZGVYIC8gMik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYmFja2dyb3VuZEFzcGVjdFJhdGlvIDwgdGhpcy52aWRlb0FzcGVjdFJhdGlvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRzaWRlWSA9IHVwZGF0ZWREaW1lbnNpb25zLmhlaWdodCAtIHVwZGF0ZWREaW1lbnNpb25zLndpZHRoIC8gdGhpcy52aWRlb0FzcGVjdFJhdGlvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERpbWVuc2lvbnMuaGVpZ2h0IC09IG91dHNpZGVZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERpbWVuc2lvbnMueSA9IE1hdGguZmxvb3Iob3V0c2lkZVkgLyAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmVuZ2luZS51cGRhdGVCYWNrZ3JvdW5kRnJhbWUodGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lLCB1cGRhdGVkRGltZW5zaW9ucywgcmVJbml0KTsKICAgICAgICB9CiAgICAgICAgdGVybWluYXRlKCkgewogICAgICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm1Db250cm9sbGVyKQogICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250cm9sbGVyLnRlcm1pbmF0ZSgpOwogICAgICAgICAgICBpZiAodGhpcy50aW1lcldvcmtlcikKICAgICAgICAgICAgICAgIHRoaXMudGltZXJXb3JrZXIudGVybWluYXRlKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmVuZ2luZSkgewogICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUuZGlzcG9zZSgpOwogICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmF0ZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLmVtaXQoInRlcm1pbmF0ZWQiKTsKICAgICAgICB9CiAgICAgICAgc3RhcnQoeyBpbnB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtIH0pIHsKICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtKQogICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0ucGlwZVRocm91Z2godGhpcy50cmFuc2Zvcm1lcikucGlwZVRvKG91dHB1dFN0cmVhbSk7CiAgICAgICAgICAgIHRoaXMuZnJhbWVDb3VudGVyID0gMDsKICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXJUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgfQogICAgICAgIGlucHV0KF9hKSB7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgYXJndW1lbnRzLCB2b2lkIDAsIGZ1bmN0aW9uKiAoeyB2aWRlb0ZyYW1lLCBiYWNrZ3JvdW5kRnJhbWUsIHJlcXVlc3RUaW1lLCBsYXN0UmVuZGVyVGltZSwgZGVsYXkgfSkgewogICAgICAgICAgICAgICAgdmFyIF9iOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmF0ZWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgY29uc3QgcnR0ID0gKERhdGUubm93KCkgLSByZXF1ZXN0VGltZSkgKiAyOwogICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVGltZSA9IGxhc3RSZW5kZXJUaW1lICsgZGVsYXkgLSBydHQ7CiAgICAgICAgICAgICAgICBpZiAoYmFja2dyb3VuZEZyYW1lKQogICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQmFja2dyb3VuZEZyYW1lKHsgZnJhbWU6IGJhY2tncm91bmRGcmFtZSB9KTsKICAgICAgICAgICAgICAgIGxldCBmcmFtZTsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zZXR1cC50cmFuc2ZlclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWJpdG1hcCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgKF9iID0gdGhpcy5wcmV2VmlkZW9GcmFtZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJldlZpZGVvRnJhbWUgPSB2aWRlb0ZyYW1lOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBbmRSZW5kZXJGcmFtZSh2aWRlb0ZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB5aWVsZCBjcmVhdGVJbWFnZUJpdG1hcCh0aGlzLmVmZmVjdENhbnZhcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWRhdGEiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUgPSBuZXcgSW1hZ2VEYXRhKG5ldyBVaW50OENsYW1wZWRBcnJheSh2aWRlb0ZyYW1lKSwgdGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlucHV0Q2FudmFzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q2FudmFzID0gY3JlYXRlQ2FudmFzKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q2FudmFzQ3R4ID0gdGhpcy5pbnB1dENhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDYW52YXNDdHgucHV0SW1hZ2VEYXRhKHZpZGVvRnJhbWUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBbmRSZW5kZXJGcmFtZSh0aGlzLmlucHV0Q2FudmFzKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB0aGlzLmVmZmVjdEN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KS5kYXRhLmJ1ZmZlcjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhc2UgImNhbnZhcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQW5kUmVuZGVyRnJhbWUodmlkZW9GcmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lID0gdGhpcy5lZmZlY3RDYW52YXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuRGVsYXkgPSBNYXRoLm1heCgwLCByZXR1cm5UaW1lIC0gRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy50aW1lcldvcmtlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE91dHB1dEZyYW1lID0gZnJhbWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlci5wb3N0TWVzc2FnZShyZXR1cm5EZWxheSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJvdXRwdXQiLCB7IGZyYW1lIH0sIFtmcmFtZV0pOwogICAgICAgICAgICAgICAgICAgIH0sIHJldHVybkRlbGF5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHByb2Nlc3NBbmRSZW5kZXJGcmFtZShmcmFtZSkgewogICAgICAgICAgICB0aGlzLmVuZ2luZS5wcm9jZXNzRnJhbWUoZnJhbWUpOwogICAgICAgICAgICBpZiAodGhpcy5zZXR1cC5sb2dUb0NvbnNvbGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVDb3VudGVyKys7CiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICAgICAgICAgIGlmIChub3cgLSB0aGlzLmZyYW1lQ291bnRlclRpbWUgPiAxMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJ1bm5pbmcgY2FtZXJhIGVmZmVjdHMsICR7TWF0aC5yb3VuZCgodGhpcy5mcmFtZUNvdW50ZXIgKiAxMDAwKSAvIChub3cgLSB0aGlzLmZyYW1lQ291bnRlclRpbWUpKX0gZnBzYCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXIgPSAwOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVDb3VudGVyVGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBjb25zdCBwcm9jZXNzb3JzID0ge307CiAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiAocmVxdWVzdCkgewogICAgICAgIHZhciBfYTsKICAgICAgICBjb25zdCBwcm9jZXNzb3JJZCA9IHJlcXVlc3QuZGF0YS5wcm9jZXNzb3JJZDsKICAgICAgICBpZiAocmVxdWVzdC5kYXRhLnR5cGUgPT09ICJjcmVhdGUiKSB7CiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NvciA9IG5ldyBQcm9jZXNzb3IoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXF1ZXN0LmRhdGEpLCB7IGVtaXQ6ICh0eXBlLCBkYXRhLCB0cmFuc2ZlcikgPT4gcG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbih7IHByb2Nlc3NvcklkLCB0eXBlIH0sIGRhdGEpLCB0cmFuc2ZlcikgfSkpOwogICAgICAgICAgICBwcm9jZXNzb3JzW3Byb2Nlc3NvcklkXSA9IHByb2Nlc3NvcjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIChfYSA9IHByb2Nlc3NvcnNbcHJvY2Vzc29ySWRdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbcmVxdWVzdC5kYXRhLnR5cGVdKHJlcXVlc3QuZGF0YSk7CiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmRhdGEudHlwZSA9PT0gInRlcm1pbmF0ZSIpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBwcm9jZXNzb3JzW3Byb2Nlc3NvcklkXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgY29uc3QgY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSA9IChmdW5jdGlvbiAoKSB7CiAgICAgICAgbGV0IF9zY3JpcHREaXIgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgPyBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyA6IHVuZGVmaW5lZDsKICAgICAgICBpZiAodHlwZW9mIF9fZmlsZW5hbWUgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICBfc2NyaXB0RGlyID0gX3NjcmlwdERpciB8fCBfX2ZpbGVuYW1lOwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSkgewogICAgICAgICAgICBjcmVhdGVURkxpdGVTSU1ETW9kdWxlID0gY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSB8fCB7fTsKICAgICAgICAgICAgdmFyIE1vZHVsZSA9IHR5cGVvZiBjcmVhdGVURkxpdGVTSU1ETW9kdWxlICE9PSAidW5kZWZpbmVkIiA/IGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUgOiB7fTsKICAgICAgICAgICAgdmFyIHJlYWR5UHJvbWlzZVJlc29sdmUsIHJlYWR5UHJvbWlzZVJlamVjdDsKICAgICAgICAgICAgTW9kdWxlWyJyZWFkeSJdID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QgPSByZWplY3Q7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgbW9kdWxlT3ZlcnJpZGVzID0ge307CiAgICAgICAgICAgIHZhciBrZXk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIE1vZHVsZSkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlT3ZlcnJpZGVzW2tleV0gPSBNb2R1bGVba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGhpc1Byb2dyYW0gPSAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB2YXIgcXVpdF8gPSBmdW5jdGlvbiAoc3RhdHVzLCB0b1Rocm93KSB7CiAgICAgICAgICAgICAgICB0aHJvdyB0b1Rocm93OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV0VCID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX05PREUgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1NIRUxMID0gZmFsc2U7CiAgICAgICAgICAgIEVOVklST05NRU5UX0lTX1dFQiA9IHR5cGVvZiB3aW5kb3cgPT09ICJvYmplY3QiOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSB0eXBlb2YgaW1wb3J0U2NyaXB0cyA9PT0gImZ1bmN0aW9uIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfTk9ERSA9CiAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2VzcyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlID09PSAic3RyaW5nIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSAhRU5WSVJPTk1FTlRfSVNfV0VCICYmICFFTlZJUk9OTUVOVF9JU19OT0RFICYmICFFTlZJUk9OTUVOVF9JU19XT1JLRVI7CiAgICAgICAgICAgIHZhciBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgZnVuY3Rpb24gbG9jYXRlRmlsZShwYXRoKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJsb2NhdGVGaWxlIl0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHREaXJlY3RvcnkgKyBwYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZWFkXywgcmVhZEFzeW5jLCByZWFkQmluYXJ5OwogICAgICAgICAgICB2YXIgbm9kZUZTOwogICAgICAgICAgICB2YXIgbm9kZVBhdGg7CiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gcmVxdWlyZSgicGF0aCIpLmRpcm5hbWUoc2NyaXB0RGlyZWN0b3J5KSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9fZGlybmFtZSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmaWxlbmFtZSwgYmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlRlMpCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVGUyA9IHJlcXVpcmUoImZzIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlUGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVBhdGggPSByZXF1aXJlKCJwYXRoIik7CiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlUGF0aFsibm9ybWFsaXplIl0oZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlRlNbInJlYWRGaWxlU3luYyJdKGZpbGVuYW1lLCBiaW5hcnkgPyBudWxsIDogInV0ZjgiKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmaWxlbmFtZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSByZWFkXyhmaWxlbmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQuYnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBVaW50OEFycmF5KHJldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzWyJhcmd2Il0ubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gcHJvY2Vzc1siYXJndiJdWzFdLnJlcGxhY2UoL1xcL2csICIvIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmNhdWdodEV4Y2VwdGlvbiIsIGZ1bmN0aW9uIChleCkgewogICAgICAgICAgICAgICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmhhbmRsZWRSZWplY3Rpb24iLCBhYm9ydCk7CiAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzWyJleGl0Il0oc3RhdHVzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBNb2R1bGVbImluc3BlY3QiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoRU5WSVJPTk1FTlRfSVNfU0hFTEwpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhZCAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkKGYpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkYnVmZmVyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZWFkYnVmZmVyKGYpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlYWQoZiwgImJpbmFyeSIpOwogICAgICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NyaXB0QXJncyAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdEFyZ3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHF1aXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcXVpdChzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByaW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyA9IHByaW50OwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiA9IGNvbnNvbGUuZXJyb3IgPSB0eXBlb2YgcHJpbnRFcnIgIT09ICJ1bmRlZmluZWQiID8gcHJpbnRFcnIgOiBwcmludDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2VsZi5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0KSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoX3NjcmlwdERpcikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9zY3JpcHREaXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0RGlyZWN0b3J5LmluZGV4T2YoImJsb2I6IikgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsIHNjcmlwdERpcmVjdG9yeS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZWFkXyA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEJpbmFyeSA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVhZEFzeW5jID0gZnVuY3Rpb24gKHVybCwgb25sb2FkLCBvbmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwIHx8ICh4aHIuc3RhdHVzID09IDAgJiYgeGhyLnJlc3BvbnNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZCh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSBvbmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgOwogICAgICAgICAgICB2YXIgb3V0ID0gTW9kdWxlWyJwcmludCJdIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIHZhciBlcnIgPSBNb2R1bGVbInByaW50RXJyIl0gfHwgY29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIG1vZHVsZU92ZXJyaWRlcykgewogICAgICAgICAgICAgICAgaWYgKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlW2tleV0gPSBtb2R1bGVPdmVycmlkZXNba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBtb2R1bGVPdmVycmlkZXMgPSBudWxsOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJhcmd1bWVudHMiXSkKICAgICAgICAgICAgICAgIE1vZHVsZVsiYXJndW1lbnRzIl07CiAgICAgICAgICAgIGlmIChNb2R1bGVbInRoaXNQcm9ncmFtIl0pCiAgICAgICAgICAgICAgICB0aGlzUHJvZ3JhbSA9IE1vZHVsZVsidGhpc1Byb2dyYW0iXTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsicXVpdCJdKQogICAgICAgICAgICAgICAgcXVpdF8gPSBNb2R1bGVbInF1aXQiXTsKICAgICAgICAgICAgdmFyIHdhc21CaW5hcnk7CiAgICAgICAgICAgIGlmIChNb2R1bGVbIndhc21CaW5hcnkiXSkKICAgICAgICAgICAgICAgIHdhc21CaW5hcnkgPSBNb2R1bGVbIndhc21CaW5hcnkiXTsKICAgICAgICAgICAgTW9kdWxlWyJub0V4aXRSdW50aW1lIl0gfHwgdHJ1ZTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBXZWJBc3NlbWJseSAhPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHdhc21NZW1vcnk7CiAgICAgICAgICAgIHZhciBBQk9SVCA9IGZhbHNlOwogICAgICAgICAgICBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCB0ZXh0KSB7CiAgICAgICAgICAgICAgICBpZiAoIWNvbmRpdGlvbikgewogICAgICAgICAgICAgICAgICAgIGFib3J0KCJBc3NlcnRpb24gZmFpbGVkOiAiICsgdGV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFVURjhEZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyICE9PSAidW5kZWZpbmVkIiA/IG5ldyBUZXh0RGVjb2RlcigidXRmOCIpIDogdW5kZWZpbmVkOwogICAgICAgICAgICBmdW5jdGlvbiBVVEY4QXJyYXlUb1N0cmluZyhoZWFwLCBpZHgsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICB2YXIgZW5kSWR4ID0gaWR4ICsgbWF4Qnl0ZXNUb1JlYWQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICAgICAgICAgICAgd2hpbGUgKGhlYXBbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKQogICAgICAgICAgICAgICAgICAgICsrZW5kUHRyOwogICAgICAgICAgICAgICAgaWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXAuc3ViYXJyYXkgJiYgVVRGOERlY29kZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVVRGOERlY29kZXIuZGVjb2RlKGhlYXAuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSAiIjsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4IDwgZW5kUHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MCA9IGhlYXBbaWR4KytdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh1MCAmIDEyOCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MSA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyMjQpID09IDE5MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKCh1MCAmIDMxKSA8PCA2KSB8IHUxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MiA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyNDApID09IDIyNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgMTUpIDw8IDEyKSB8ICh1MSA8PCA2KSB8IHUyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgNykgPDwgMTgpIHwgKHUxIDw8IDEyKSB8ICh1MiA8PCA2KSB8IChoZWFwW2lkeCsrXSAmIDYzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodTAgPCA2NTUzNikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gdTAgLSA2NTUzNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2IHwgKGNoID4+IDEwKSwgNTYzMjAgfCAoY2ggJiAxMDIzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIFVURjhUb1N0cmluZyhwdHIsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHRyID8gVVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LCBwdHIsIG1heEJ5dGVzVG9SZWFkKSA6ICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHdyaXRlQXNjaWlUb01lbW9yeShzdHIsIGJ1ZmZlciwgZG9udEFkZE51bGwpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgSEVBUDhbYnVmZmVyKysgPj4gMF0gPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVA4W2J1ZmZlciA+PiAwXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWxpZ25VcCh4LCBtdWx0aXBsZSkgewogICAgICAgICAgICAgICAgaWYgKHggJSBtdWx0aXBsZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICB4ICs9IG11bHRpcGxlIC0gKHggJSBtdWx0aXBsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYnVmZmVyLCBIRUFQOCwgSEVBUFU4LCBIRUFQMzI7CiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1ZikgewogICAgICAgICAgICAgICAgYnVmZmVyID0gYnVmOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQOCJdID0gSEVBUDggPSBuZXcgSW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVAxNiJdID0gbmV3IEludDE2QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUDMyIl0gPSBIRUFQMzIgPSBuZXcgSW50MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTgiXSA9IEhFQVBVOCA9IG5ldyBVaW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVMTYiXSA9IG5ldyBVaW50MTZBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTMyIl0gPSBuZXcgVWludDMyQXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUEYzMiJdID0gbmV3IEZsb2F0MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjY0Il0gPSBuZXcgRmxvYXQ2NEFycmF5KGJ1Zik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJJTklUSUFMX01FTU9SWSJdIHx8IDE2Nzc3MjE2OwogICAgICAgICAgICB2YXIgd2FzbVRhYmxlOwogICAgICAgICAgICB2YXIgX19BVFBSRVJVTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUSU5JVF9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUTUFJTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUUE9TVFJVTl9fID0gW107CiAgICAgICAgICAgIF9fQVRJTklUX18ucHVzaCh7CiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgX19fd2FzbV9jYWxsX2N0b3JzKCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZnVuY3Rpb24gcHJlUnVuKCkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsicHJlUnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlUnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVSdW4iXSA9IFtNb2R1bGVbInByZVJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25QcmVSdW4oTW9kdWxlWyJwcmVSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRSdW50aW1lKCkgewogICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcHJlTWFpbigpIHsKICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHBvc3RSdW4oKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJwb3N0UnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicG9zdFJ1biJdID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicG9zdFJ1biJdID0gW01vZHVsZVsicG9zdFJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwb3N0UnVuIl0ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUE9TVFJVTl9fKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhZGRPblByZVJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBSRVJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUG9zdFJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBPU1RSVU5fXy51bnNoaWZ0KGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcnVuRGVwZW5kZW5jaWVzID0gMDsKICAgICAgICAgICAgdmFyIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZFJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcysrOwogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgICAgICAgICAgICBydW5EZXBlbmRlbmNpZXMtLTsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKHJ1bkRlcGVuZGVuY2llcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGRlcGVuZGVuY2llc0Z1bGZpbGxlZDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXSA9IHt9OwogICAgICAgICAgICBNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIGFib3J0KHdoYXQpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm9uQWJvcnQiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsib25BYm9ydCJdKHdoYXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hhdCArPSAiIjsKICAgICAgICAgICAgICAgIGVycih3aGF0KTsKICAgICAgICAgICAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHdoYXQgPSAiYWJvcnQoIiArIHdoYXQgKyAiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iOwogICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHdoYXQpOwogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBoYXNQcmVmaXgoc3RyLCBwcmVmaXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggPyBzdHIuc3RhcnRzV2l0aChwcmVmaXgpIDogc3RyLmluZGV4T2YocHJlZml4KSA9PT0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YVVSSVByZWZpeCA9ICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNEYXRhVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBkYXRhVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZmlsZVVSSVByZWZpeCA9ICJmaWxlOi8vIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNGaWxlVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBmaWxlVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd2FzbUJpbmFyeUZpbGUgPSAidGZsaXRlLXNpbWQud2FzbSI7CiAgICAgICAgICAgIGlmICghaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICAgICAgICAgICAgd2FzbUJpbmFyeUZpbGUgPSBsb2NhdGVGaWxlKHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRCaW5hcnkoZmlsZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PSB3YXNtQmluYXJ5RmlsZSAmJiB3YXNtQmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh3YXNtQmluYXJ5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRCaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBhYm9ydChlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEJpbmFyeVByb21pc2UoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXdhc21CaW5hcnkgJiYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmZXRjaCA9PT0gImZ1bmN0aW9uIiAmJiAhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZVsib2siXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciICsgd2FzbUJpbmFyeUZpbGUgKyAiJyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VbImFycmF5QnVmZmVyIl0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZEFzeW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBc3luYyh3YXNtQmluYXJ5RmlsZSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByZWplY3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVXYXNtKCkgewogICAgICAgICAgICAgICAgdmFyIGluZm8gPSB7IGE6IGFzbUxpYnJhcnlBcmcgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSwgbW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBpbnN0YW5jZS5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsiYXNtIl0gPSBleHBvcnRzOwogICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnkgPSBNb2R1bGVbImFzbSJdWyJxIl07CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZSA9IE1vZHVsZVsiYXNtIl1bIkQiXTsKICAgICAgICAgICAgICAgICAgICByZW1vdmVSdW5EZXBlbmRlbmN5KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhZGRSdW5EZXBlbmRlbmN5KCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKG91dHB1dCkgewogICAgICAgICAgICAgICAgICAgIHJlY2VpdmVJbnN0YW5jZShvdXRwdXRbImluc3RhbmNlIl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnlQcm9taXNlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGJpbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYmluYXJ5LCBpbmZvKTsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZWNlaXZlciwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICBlcnIoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydChyZWFzb24pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdhc21CaW5hcnkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09PSAiZnVuY3Rpb24iICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBmZXRjaCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXNwb25zZSwgaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4ocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKGluZm8sIHJlY2VpdmVJbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlcnIoIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICIgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlQXN5bmMoKS5jYXRjaChyZWFkeVByb21pc2VSZWplY3QpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcykgewogICAgICAgICAgICAgICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGNhbGxiYWNrLmZ1bmM7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5jID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2suYXJnID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZS5nZXQoZnVuYykoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZS5nZXQoZnVuYykoY2FsbGJhY2suYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyhjYWxsYmFjay5hcmcgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjay5hcmcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfYWJvcnQoKSB7CiAgICAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfZW1zY3JpcHRlbl9nZXRfbm93OwogICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkgewogICAgICAgICAgICAgICAgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHByb2Nlc3NbImhydGltZSJdKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbMF0gKiAxZTMgKyB0WzFdIC8gMWU2OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGF0ZU5vdyAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBkYXRlTm93OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljID0gdHJ1ZTsKICAgICAgICAgICAgZnVuY3Rpb24gc2V0RXJyTm8odmFsdWUpIHsKICAgICAgICAgICAgICAgIEhFQVAzMltfX19lcnJub19sb2NhdGlvbigpID4+IDJdID0gdmFsdWU7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Nsb2NrX2dldHRpbWUoY2xrX2lkLCB0cCkgewogICAgICAgICAgICAgICAgdmFyIG5vdzsKICAgICAgICAgICAgICAgIGlmIChjbGtfaWQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBub3cgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoKGNsa19pZCA9PT0gMSB8fCBjbGtfaWQgPT09IDQpICYmIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljKSB7CiAgICAgICAgICAgICAgICAgICAgbm93ID0gX2Vtc2NyaXB0ZW5fZ2V0X25vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2V0RXJyTm8oMjgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVAzMlt0cCA+PiAyXSA9IChub3cgLyAxZTMpIHwgMDsKICAgICAgICAgICAgICAgIEhFQVAzMlsodHAgKyA0KSA+PiAyXSA9ICgobm93ICUgMWUzKSAqIDFlMyAqIDFlMykgfCAwOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Rsb3BlbihmaWxlbmFtZSwgZmxhZykgewogICAgICAgICAgICAgICAgYWJvcnQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9kbHN5bShoYW5kbGUsIHN5bWJvbCkgewogICAgICAgICAgICAgICAgYWJvcnQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX21lbWNweV9iaWcoZGVzdCwgc3JjLCBudW0pIHsKICAgICAgICAgICAgICAgIEhFQVBVOC5jb3B5V2l0aGluKGRlc3QsIHNyYywgc3JjICsgbnVtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9nZXRfaGVhcF9zaXplKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihzaXplKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnkuZ3Jvdygoc2l6ZSAtIGJ1ZmZlci5ieXRlTGVuZ3RoICsgNjU1MzUpID4+PiAxNik7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwKHJlcXVlc3RlZFNpemUpIHsKICAgICAgICAgICAgICAgIHZhciBvbGRTaXplID0gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpOwogICAgICAgICAgICAgICAgdmFyIG1heEhlYXBTaXplID0gMjE0NzQ4MzY0ODsKICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRTaXplID4gbWF4SGVhcFNpemUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBjdXREb3duID0gMTsgY3V0RG93biA8PSA0OyBjdXREb3duICo9IDIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb3Zlckdyb3duSGVhcFNpemUgPSBvbGRTaXplICogKDEgKyAwLjIgLyBjdXREb3duKTsKICAgICAgICAgICAgICAgICAgICBvdmVyR3Jvd25IZWFwU2l6ZSA9IE1hdGgubWluKG92ZXJHcm93bkhlYXBTaXplLCByZXF1ZXN0ZWRTaXplICsgMTAwNjYzMjk2KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U2l6ZSA9IE1hdGgubWluKG1heEhlYXBTaXplLCBhbGlnblVwKE1hdGgubWF4KHJlcXVlc3RlZFNpemUsIG92ZXJHcm93bkhlYXBTaXplKSwgNjU1MzYpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKG5ld1NpemUpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fdGhyZWFkX3NsZWVwKG1zZWNzKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBfZW1zY3JpcHRlbl9nZXRfbm93KCk7CiAgICAgICAgICAgICAgICB3aGlsZSAoX2Vtc2NyaXB0ZW5fZ2V0X25vdygpIC0gc3RhcnQgPCBtc2VjcykgeyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIEVOViA9IHt9OwogICAgICAgICAgICBmdW5jdGlvbiBnZXRFeGVjdXRhYmxlTmFtZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzUHJvZ3JhbSB8fCAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEVudlN0cmluZ3MoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWdldEVudlN0cmluZ3Muc3RyaW5ncykgewogICAgICAgICAgICAgICAgICAgIHZhciBsYW5nID0gKCh0eXBlb2YgbmF2aWdhdG9yID09PSAib2JqZWN0IiAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXNbMF0pIHx8ICJDIikucmVwbGFjZSgiLSIsICJfIikgKyAiLlVURi04IjsKICAgICAgICAgICAgICAgICAgICB2YXIgZW52ID0gewogICAgICAgICAgICAgICAgICAgICAgICBVU0VSOiAid2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBMT0dOQU1FOiAid2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBQQVRIOiAiLyIsCiAgICAgICAgICAgICAgICAgICAgICAgIFBXRDogIi8iLAogICAgICAgICAgICAgICAgICAgICAgICBIT01FOiAiL2hvbWUvd2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBMQU5HOiBsYW5nLAogICAgICAgICAgICAgICAgICAgICAgICBfOiBnZXRFeGVjdXRhYmxlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeCBpbiBFTlYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW52W3hdID0gRU5WW3hdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgc3RyaW5ncyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gZW52KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MucHVzaCh4ICsgIj0iICsgZW52W3hdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0RW52U3RyaW5ncy5zdHJpbmdzID0gc3RyaW5nczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBnZXRFbnZTdHJpbmdzLnN0cmluZ3M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFNZU0NBTExTID0gewogICAgICAgICAgICAgICAgbWFwcGluZ3M6IHt9LAogICAgICAgICAgICAgICAgYnVmZmVyczogW251bGwsIFtdLCBbXV0sCiAgICAgICAgICAgICAgICBwcmludENoYXI6IGZ1bmN0aW9uIChzdHJlYW0sIGN1cnIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gU1lTQ0FMTFMuYnVmZmVyc1tzdHJlYW1dOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyID09PSAwIHx8IGN1cnIgPT09IDEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIChzdHJlYW0gPT09IDEgPyBvdXQgOiBlcnIpKFVURjhBcnJheVRvU3RyaW5nKGJ1ZmZlciwgMCkpOwogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGN1cnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB2YXJhcmdzOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBTWVNDQUxMUy52YXJhcmdzICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IEhFQVAzMlsoU1lTQ0FMTFMudmFyYXJncyAtIDQpID4+IDJdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0U3RyOiBmdW5jdGlvbiAocHRyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IFVURjhUb1N0cmluZyhwdHIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0NjQ6IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG93OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZnVuY3Rpb24gX2Vudmlyb25fZ2V0KF9fZW52aXJvbiwgZW52aXJvbl9idWYpIHsKICAgICAgICAgICAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgICAgICAgICAgIGdldEVudlN0cmluZ3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChzdHJpbmcsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHRyID0gZW52aXJvbl9idWYgKyBidWZTaXplOwogICAgICAgICAgICAgICAgICAgIEhFQVAzMlsoX19lbnZpcm9uICsgaSAqIDQpID4+IDJdID0gcHRyOwogICAgICAgICAgICAgICAgICAgIHdyaXRlQXNjaWlUb01lbW9yeShzdHJpbmcsIHB0cik7CiAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vudmlyb25fc2l6ZXNfZ2V0KHBlbnZpcm9uX2NvdW50LCBwZW52aXJvbl9idWZfc2l6ZSkgewogICAgICAgICAgICAgICAgdmFyIHN0cmluZ3MgPSBnZXRFbnZTdHJpbmdzKCk7CiAgICAgICAgICAgICAgICBIRUFQMzJbcGVudmlyb25fY291bnQgPj4gMl0gPSBzdHJpbmdzLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgICAgICAgICAgIHN0cmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgSEVBUDMyW3BlbnZpcm9uX2J1Zl9zaXplID4+IDJdID0gYnVmU2l6ZTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9leGl0KHN0YXR1cykgewogICAgICAgICAgICAgICAgZXhpdChzdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF9jbG9zZShmZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2ZkX3NlZWsoZmQsIG9mZnNldF9sb3csIG9mZnNldF9oaWdoLCB3aGVuY2UsIG5ld09mZnNldCkgeyB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF93cml0ZShmZCwgaW92LCBpb3ZjbnQsIHBudW0pIHsKICAgICAgICAgICAgICAgIHZhciBudW0gPSAwOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpb3ZjbnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwdHIgPSBIRUFQMzJbKGlvdiArIGkgKiA4KSA+PiAyXTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGVuID0gSEVBUDMyWyhpb3YgKyAoaSAqIDggKyA0KSkgPj4gMl07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBTWVNDQUxMUy5wcmludENoYXIoZmQsIEhFQVBVOFtwdHIgKyBqXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG51bSArPSBsZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIRUFQMzJbcG51bSA+PiAyXSA9IG51bTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9wdGhyZWFkX2NyZWF0ZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9wdGhyZWFkX2pvaW4oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMjg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX3N5c2NvbmYobmFtZSkgewogICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgODU6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXhIZWFwU2l6ZSA9IDIxNDc0ODM2NDg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhIZWFwU2l6ZSAvIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIzNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTUzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjAwODA5OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTYwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTYxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTg0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDc5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDc0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDcwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMjQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIxNDc0ODM2NDc7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0NzgzOTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA5OTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDQ4OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwOTcxNTI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU1MzY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyNzY4OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjc2NzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDc1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTYzODQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDFlMzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzAwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyNTY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1NTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDczOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAib2JqZWN0IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3JbImhhcmR3YXJlQ29uY3VycmVuY3kiXSB8fCAxOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRFcnJObygyOCk7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFzbUxpYnJhcnlBcmcgPSB7CiAgICAgICAgICAgICAgICBhOiBfYWJvcnQsCiAgICAgICAgICAgICAgICBuOiBfY2xvY2tfZ2V0dGltZSwKICAgICAgICAgICAgICAgIGk6IF9kbG9wZW4sCiAgICAgICAgICAgICAgICBlOiBfZGxzeW0sCiAgICAgICAgICAgICAgICBsOiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnLAogICAgICAgICAgICAgICAgbTogX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsCiAgICAgICAgICAgICAgICBvOiBfZW1zY3JpcHRlbl90aHJlYWRfc2xlZXAsCiAgICAgICAgICAgICAgICBwOiBfZW52aXJvbl9nZXQsCiAgICAgICAgICAgICAgICBnOiBfZW52aXJvbl9zaXplc19nZXQsCiAgICAgICAgICAgICAgICBqOiBfZXhpdCwKICAgICAgICAgICAgICAgIGg6IF9mZF9jbG9zZSwKICAgICAgICAgICAgICAgIGs6IF9mZF9zZWVrLAogICAgICAgICAgICAgICAgYzogX2ZkX3dyaXRlLAogICAgICAgICAgICAgICAgZDogX3B0aHJlYWRfY3JlYXRlLAogICAgICAgICAgICAgICAgZjogX3B0aHJlYWRfam9pbiwKICAgICAgICAgICAgICAgIGI6IF9zeXNjb25mLAogICAgICAgICAgICB9OwogICAgICAgICAgICBjcmVhdGVXYXNtKCk7CiAgICAgICAgICAgIHZhciBfX193YXNtX2NhbGxfY3RvcnMgPSAoTW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoX19fd2FzbV9jYWxsX2N0b3JzID0gTW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXSA9IE1vZHVsZVsiYXNtIl1bInIiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCJdID0gTW9kdWxlWyJhc20iXVsicyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0TWVtb3J5T2Zmc2V0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0TWVtb3J5T2Zmc2V0Il0gPSBNb2R1bGVbImFzbSJdWyJ0Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRIZWlnaHQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRIZWlnaHQiXSA9IE1vZHVsZVsiYXNtIl1bInUiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dFdpZHRoIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0V2lkdGgiXSA9IE1vZHVsZVsiYXNtIl1bInYiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dENoYW5uZWxDb3VudCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dENoYW5uZWxDb3VudCJdID0gTW9kdWxlWyJhc20iXVsidyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dE1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQiXSA9IE1vZHVsZVsiYXNtIl1bIngiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRIZWlnaHQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0SGVpZ2h0Il0gPSBNb2R1bGVbImFzbSJdWyJ5Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0V2lkdGgiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0V2lkdGgiXSA9IE1vZHVsZVsiYXNtIl1bInoiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRDaGFubmVsQ291bnQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0Q2hhbm5lbENvdW50Il0gPSBNb2R1bGVbImFzbSJdWyJBIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfbG9hZE1vZGVsIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2xvYWRNb2RlbCJdID0gTW9kdWxlWyJhc20iXVsiQiJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX3J1bkluZmVyZW5jZSJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9ydW5JbmZlcmVuY2UiXSA9IE1vZHVsZVsiYXNtIl1bIkMiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBfX19lcnJub19sb2NhdGlvbiA9IChNb2R1bGVbIl9fX2Vycm5vX2xvY2F0aW9uIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKF9fX2Vycm5vX2xvY2F0aW9uID0gTW9kdWxlWyJfX19lcnJub19sb2NhdGlvbiJdID0gTW9kdWxlWyJhc20iXVsiRSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIGNhbGxlZFJ1bjsKICAgICAgICAgICAgZnVuY3Rpb24gRXhpdFN0YXR1cyhzdGF0dXMpIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9ICJFeGl0U3RhdHVzIjsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9ICJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIgKyBzdGF0dXMgKyAiKSI7CiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBmdW5jdGlvbiBydW5DYWxsZXIoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWNhbGxlZFJ1bikKICAgICAgICAgICAgICAgICAgICBydW4oKTsKICAgICAgICAgICAgICAgIGlmICghY2FsbGVkUnVuKQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IHJ1bkNhbGxlcjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZnVuY3Rpb24gcnVuKGFyZ3MpIHsKICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHJlUnVuKCk7CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRvUnVuKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsZWRSdW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjYWxsZWRSdW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsiY2FsbGVkUnVuIl0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGlmIChBQk9SVCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGluaXRSdW50aW1lKCk7CiAgICAgICAgICAgICAgICAgICAgcHJlTWFpbigpOwogICAgICAgICAgICAgICAgICAgIHJlYWR5UHJvbWlzZVJlc29sdmUoTW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKQogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0oKTsKICAgICAgICAgICAgICAgICAgICBwb3N0UnVuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJzZXRTdGF0dXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsic2V0U3RhdHVzIl0oIlJ1bm5pbmcuLi4iKTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvUnVuKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBkb1J1bigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIE1vZHVsZVsicnVuIl0gPSBydW47CiAgICAgICAgICAgIGZ1bmN0aW9uIGV4aXQoc3RhdHVzLCBpbXBsaWNpdCkgewogICAgICAgICAgICAgICAgcXVpdF8oc3RhdHVzLCBuZXcgRXhpdFN0YXR1cyhzdGF0dXMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoTW9kdWxlWyJwcmVJbml0Il0pIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVJbml0Il0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZUluaXQiXSA9IFtNb2R1bGVbInByZUluaXQiXV07CiAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVJbml0Il0ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicHJlSW5pdCJdLnBvcCgpKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcnVuKCk7CiAgICAgICAgICAgIHJldHVybiBjcmVhdGVURkxpdGVTSU1ETW9kdWxlLnJlYWR5OwogICAgICAgIH07CiAgICB9KSgpOwoKICAgIHZhciB0ZmxpdGVTaW1kID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoewogICAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgICBkZWZhdWx0OiBjcmVhdGVURkxpdGVTSU1ETW9kdWxlCiAgICB9KTsKCiAgICB2YXIgY3JlYXRlVEZMaXRlTW9kdWxlID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3NjcmlwdERpciA9IHR5cGVvZiBkb2N1bWVudCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCA/IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjIDogdW5kZWZpbmVkOwogICAgICAgIGlmICh0eXBlb2YgX19maWxlbmFtZSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIF9zY3JpcHREaXIgPSBfc2NyaXB0RGlyIHx8IF9fZmlsZW5hbWU7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjcmVhdGVURkxpdGVNb2R1bGUpIHsKICAgICAgICAgICAgY3JlYXRlVEZMaXRlTW9kdWxlID0gY3JlYXRlVEZMaXRlTW9kdWxlIHx8IHt9OwogICAgICAgICAgICB2YXIgTW9kdWxlID0gdHlwZW9mIGNyZWF0ZVRGTGl0ZU1vZHVsZSAhPT0gInVuZGVmaW5lZCIgPyBjcmVhdGVURkxpdGVNb2R1bGUgOiB7fTsKICAgICAgICAgICAgdmFyIHJlYWR5UHJvbWlzZVJlc29sdmUsIHJlYWR5UHJvbWlzZVJlamVjdDsKICAgICAgICAgICAgTW9kdWxlWyJyZWFkeSJdID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QgPSByZWplY3Q7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgbW9kdWxlT3ZlcnJpZGVzID0ge307CiAgICAgICAgICAgIHZhciBrZXk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIE1vZHVsZSkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlT3ZlcnJpZGVzW2tleV0gPSBNb2R1bGVba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGhpc1Byb2dyYW0gPSAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB2YXIgcXVpdF8gPSBmdW5jdGlvbiAoc3RhdHVzLCB0b1Rocm93KSB7CiAgICAgICAgICAgICAgICB0aHJvdyB0b1Rocm93OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV0VCID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX05PREUgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1NIRUxMID0gZmFsc2U7CiAgICAgICAgICAgIEVOVklST05NRU5UX0lTX1dFQiA9IHR5cGVvZiB3aW5kb3cgPT09ICJvYmplY3QiOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSB0eXBlb2YgaW1wb3J0U2NyaXB0cyA9PT0gImZ1bmN0aW9uIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfTk9ERSA9CiAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2VzcyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlID09PSAic3RyaW5nIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSAhRU5WSVJPTk1FTlRfSVNfV0VCICYmICFFTlZJUk9OTUVOVF9JU19OT0RFICYmICFFTlZJUk9OTUVOVF9JU19XT1JLRVI7CiAgICAgICAgICAgIHZhciBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgZnVuY3Rpb24gbG9jYXRlRmlsZShwYXRoKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJsb2NhdGVGaWxlIl0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHREaXJlY3RvcnkgKyBwYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZWFkXywgcmVhZEFzeW5jLCByZWFkQmluYXJ5OwogICAgICAgICAgICB2YXIgbm9kZUZTOwogICAgICAgICAgICB2YXIgbm9kZVBhdGg7CiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gcmVxdWlyZSgicGF0aCIpLmRpcm5hbWUoc2NyaXB0RGlyZWN0b3J5KSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9fZGlybmFtZSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmaWxlbmFtZSwgYmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlRlMpCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVGUyA9IHJlcXVpcmUoImZzIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlUGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVBhdGggPSByZXF1aXJlKCJwYXRoIik7CiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlUGF0aFsibm9ybWFsaXplIl0oZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlRlNbInJlYWRGaWxlU3luYyJdKGZpbGVuYW1lLCBiaW5hcnkgPyBudWxsIDogInV0ZjgiKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmaWxlbmFtZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSByZWFkXyhmaWxlbmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQuYnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBVaW50OEFycmF5KHJldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzWyJhcmd2Il0ubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gcHJvY2Vzc1siYXJndiJdWzFdLnJlcGxhY2UoL1xcL2csICIvIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmNhdWdodEV4Y2VwdGlvbiIsIGZ1bmN0aW9uIChleCkgewogICAgICAgICAgICAgICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmhhbmRsZWRSZWplY3Rpb24iLCBhYm9ydCk7CiAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzWyJleGl0Il0oc3RhdHVzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBNb2R1bGVbImluc3BlY3QiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoRU5WSVJPTk1FTlRfSVNfU0hFTEwpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhZCAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkKGYpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkYnVmZmVyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZWFkYnVmZmVyKGYpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlYWQoZiwgImJpbmFyeSIpOwogICAgICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NyaXB0QXJncyAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdEFyZ3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHF1aXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcXVpdChzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByaW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyA9IHByaW50OwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiA9IGNvbnNvbGUuZXJyb3IgPSB0eXBlb2YgcHJpbnRFcnIgIT09ICJ1bmRlZmluZWQiID8gcHJpbnRFcnIgOiBwcmludDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2VsZi5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0KSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoX3NjcmlwdERpcikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9zY3JpcHREaXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0RGlyZWN0b3J5LmluZGV4T2YoImJsb2I6IikgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsIHNjcmlwdERpcmVjdG9yeS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZWFkXyA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEJpbmFyeSA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVhZEFzeW5jID0gZnVuY3Rpb24gKHVybCwgb25sb2FkLCBvbmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwIHx8ICh4aHIuc3RhdHVzID09IDAgJiYgeGhyLnJlc3BvbnNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZCh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSBvbmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgOwogICAgICAgICAgICB2YXIgb3V0ID0gTW9kdWxlWyJwcmludCJdIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIHZhciBlcnIgPSBNb2R1bGVbInByaW50RXJyIl0gfHwgY29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIG1vZHVsZU92ZXJyaWRlcykgewogICAgICAgICAgICAgICAgaWYgKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlW2tleV0gPSBtb2R1bGVPdmVycmlkZXNba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBtb2R1bGVPdmVycmlkZXMgPSBudWxsOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJhcmd1bWVudHMiXSkKICAgICAgICAgICAgICAgIE1vZHVsZVsiYXJndW1lbnRzIl07CiAgICAgICAgICAgIGlmIChNb2R1bGVbInRoaXNQcm9ncmFtIl0pCiAgICAgICAgICAgICAgICB0aGlzUHJvZ3JhbSA9IE1vZHVsZVsidGhpc1Byb2dyYW0iXTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsicXVpdCJdKQogICAgICAgICAgICAgICAgcXVpdF8gPSBNb2R1bGVbInF1aXQiXTsKICAgICAgICAgICAgdmFyIHdhc21CaW5hcnk7CiAgICAgICAgICAgIGlmIChNb2R1bGVbIndhc21CaW5hcnkiXSkKICAgICAgICAgICAgICAgIHdhc21CaW5hcnkgPSBNb2R1bGVbIndhc21CaW5hcnkiXTsKICAgICAgICAgICAgTW9kdWxlWyJub0V4aXRSdW50aW1lIl0gfHwgdHJ1ZTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBXZWJBc3NlbWJseSAhPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHdhc21NZW1vcnk7CiAgICAgICAgICAgIHZhciBBQk9SVCA9IGZhbHNlOwogICAgICAgICAgICBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCB0ZXh0KSB7CiAgICAgICAgICAgICAgICBpZiAoIWNvbmRpdGlvbikgewogICAgICAgICAgICAgICAgICAgIGFib3J0KCJBc3NlcnRpb24gZmFpbGVkOiAiICsgdGV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFVURjhEZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyICE9PSAidW5kZWZpbmVkIiA/IG5ldyBUZXh0RGVjb2RlcigidXRmOCIpIDogdW5kZWZpbmVkOwogICAgICAgICAgICBmdW5jdGlvbiBVVEY4QXJyYXlUb1N0cmluZyhoZWFwLCBpZHgsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICB2YXIgZW5kSWR4ID0gaWR4ICsgbWF4Qnl0ZXNUb1JlYWQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICAgICAgICAgICAgd2hpbGUgKGhlYXBbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKQogICAgICAgICAgICAgICAgICAgICsrZW5kUHRyOwogICAgICAgICAgICAgICAgaWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXAuc3ViYXJyYXkgJiYgVVRGOERlY29kZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVVRGOERlY29kZXIuZGVjb2RlKGhlYXAuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSAiIjsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4IDwgZW5kUHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MCA9IGhlYXBbaWR4KytdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh1MCAmIDEyOCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MSA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyMjQpID09IDE5MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKCh1MCAmIDMxKSA8PCA2KSB8IHUxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MiA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyNDApID09IDIyNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgMTUpIDw8IDEyKSB8ICh1MSA8PCA2KSB8IHUyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgNykgPDwgMTgpIHwgKHUxIDw8IDEyKSB8ICh1MiA8PCA2KSB8IChoZWFwW2lkeCsrXSAmIDYzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodTAgPCA2NTUzNikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gdTAgLSA2NTUzNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2IHwgKGNoID4+IDEwKSwgNTYzMjAgfCAoY2ggJiAxMDIzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIFVURjhUb1N0cmluZyhwdHIsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHRyID8gVVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LCBwdHIsIG1heEJ5dGVzVG9SZWFkKSA6ICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHdyaXRlQXNjaWlUb01lbW9yeShzdHIsIGJ1ZmZlciwgZG9udEFkZE51bGwpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgSEVBUDhbYnVmZmVyKysgPj4gMF0gPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVA4W2J1ZmZlciA+PiAwXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWxpZ25VcCh4LCBtdWx0aXBsZSkgewogICAgICAgICAgICAgICAgaWYgKHggJSBtdWx0aXBsZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICB4ICs9IG11bHRpcGxlIC0gKHggJSBtdWx0aXBsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYnVmZmVyLCBIRUFQOCwgSEVBUFU4LCBIRUFQMzI7CiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1ZikgewogICAgICAgICAgICAgICAgYnVmZmVyID0gYnVmOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQOCJdID0gSEVBUDggPSBuZXcgSW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVAxNiJdID0gbmV3IEludDE2QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUDMyIl0gPSBIRUFQMzIgPSBuZXcgSW50MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTgiXSA9IEhFQVBVOCA9IG5ldyBVaW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVMTYiXSA9IG5ldyBVaW50MTZBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTMyIl0gPSBuZXcgVWludDMyQXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUEYzMiJdID0gbmV3IEZsb2F0MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjY0Il0gPSBuZXcgRmxvYXQ2NEFycmF5KGJ1Zik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJJTklUSUFMX01FTU9SWSJdIHx8IDE2Nzc3MjE2OwogICAgICAgICAgICB2YXIgd2FzbVRhYmxlOwogICAgICAgICAgICB2YXIgX19BVFBSRVJVTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUSU5JVF9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUTUFJTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUUE9TVFJVTl9fID0gW107CiAgICAgICAgICAgIF9fQVRJTklUX18ucHVzaCh7CiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgX19fd2FzbV9jYWxsX2N0b3JzKCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZnVuY3Rpb24gcHJlUnVuKCkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsicHJlUnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlUnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVSdW4iXSA9IFtNb2R1bGVbInByZVJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25QcmVSdW4oTW9kdWxlWyJwcmVSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRSdW50aW1lKCkgewogICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcHJlTWFpbigpIHsKICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHBvc3RSdW4oKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJwb3N0UnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicG9zdFJ1biJdID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicG9zdFJ1biJdID0gW01vZHVsZVsicG9zdFJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwb3N0UnVuIl0ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUE9TVFJVTl9fKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhZGRPblByZVJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBSRVJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUG9zdFJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBPU1RSVU5fXy51bnNoaWZ0KGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcnVuRGVwZW5kZW5jaWVzID0gMDsKICAgICAgICAgICAgdmFyIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZFJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcysrOwogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgICAgICAgICAgICBydW5EZXBlbmRlbmNpZXMtLTsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKHJ1bkRlcGVuZGVuY2llcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGRlcGVuZGVuY2llc0Z1bGZpbGxlZDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXSA9IHt9OwogICAgICAgICAgICBNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIGFib3J0KHdoYXQpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm9uQWJvcnQiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsib25BYm9ydCJdKHdoYXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hhdCArPSAiIjsKICAgICAgICAgICAgICAgIGVycih3aGF0KTsKICAgICAgICAgICAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHdoYXQgPSAiYWJvcnQoIiArIHdoYXQgKyAiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iOwogICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHdoYXQpOwogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBoYXNQcmVmaXgoc3RyLCBwcmVmaXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggPyBzdHIuc3RhcnRzV2l0aChwcmVmaXgpIDogc3RyLmluZGV4T2YocHJlZml4KSA9PT0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YVVSSVByZWZpeCA9ICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNEYXRhVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBkYXRhVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZmlsZVVSSVByZWZpeCA9ICJmaWxlOi8vIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNGaWxlVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBmaWxlVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd2FzbUJpbmFyeUZpbGUgPSAidGZsaXRlLndhc20iOwogICAgICAgICAgICBpZiAoIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkpIHsKICAgICAgICAgICAgICAgIHdhc21CaW5hcnlGaWxlID0gbG9jYXRlRmlsZSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0QmluYXJ5KGZpbGUpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgPT0gd2FzbUJpbmFyeUZpbGUgJiYgd2FzbUJpbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkod2FzbUJpbmFyeSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChyZWFkQmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkQmluYXJ5KGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgYWJvcnQoZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRCaW5hcnlQcm9taXNlKCkgewogICAgICAgICAgICAgICAgaWYgKCF3YXNtQmluYXJ5ICYmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmV0Y2ggPT09ICJmdW5jdGlvbiIgJiYgIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKHdhc21CaW5hcnlGaWxlLCB7IGNyZWRlbnRpYWxzOiAic2FtZS1vcmlnaW4iIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2VbIm9rIl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAiZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnIiArIHdhc21CaW5hcnlGaWxlICsgIiciOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlWyJhcnJheUJ1ZmZlciJdKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRBc3luYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQXN5bmMod2FzbUJpbmFyeUZpbGUsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnkod2FzbUJpbmFyeUZpbGUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gY3JlYXRlV2FzbSgpIHsKICAgICAgICAgICAgICAgIHZhciBpbmZvID0geyBhOiBhc21MaWJyYXJ5QXJnIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZWNlaXZlSW5zdGFuY2UoaW5zdGFuY2UsIG1vZHVsZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBleHBvcnRzID0gaW5zdGFuY2UuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbImFzbSJdID0gZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICB3YXNtTWVtb3J5ID0gTW9kdWxlWyJhc20iXVsicSJdOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICB3YXNtVGFibGUgPSBNb2R1bGVbImFzbSJdWyJEIl07CiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUnVuRGVwZW5kZW5jeSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYWRkUnVuRGVwZW5kZW5jeSgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZShvdXRwdXQpIHsKICAgICAgICAgICAgICAgICAgICByZWNlaXZlSW5zdGFuY2Uob3V0cHV0WyJpbnN0YW5jZSJdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5UHJvbWlzZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChiaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJpbmFyeSwgaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVjZWl2ZXIsIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAiICsgcmVhc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQocmVhc29uKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlQXN5bmMoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNtQmluYXJ5ICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyA9PT0gImZ1bmN0aW9uIiAmJgogICAgICAgICAgICAgICAgICAgICAgICAhaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZmV0Y2ggPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKHdhc21CaW5hcnlGaWxlLCB7IGNyZWRlbnRpYWxzOiAic2FtZS1vcmlnaW4iIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcocmVzcG9uc2UsIGluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UsIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiICsgcmVhc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleHBvcnRzID0gTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXShpbmZvLCByZWNlaXZlSW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZUFzeW5jKCkuY2F0Y2gocmVhZHlQcm9taXNlUmVqZWN0KTsKICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjYWxsUnVudGltZUNhbGxiYWNrcyhjYWxsYmFja3MpIHsKICAgICAgICAgICAgICAgIHdoaWxlIChjYWxsYmFja3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGNhbGxiYWNrcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhNb2R1bGUpOwogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmMgPSBjYWxsYmFjay5mdW5jOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuYyA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmFyZyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNtVGFibGUuZ2V0KGZ1bmMpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNtVGFibGUuZ2V0KGZ1bmMpKGNhbGxiYWNrLmFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMoY2FsbGJhY2suYXJnID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2suYXJnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Fib3J0KCkgewogICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgX2Vtc2NyaXB0ZW5fZ2V0X25vdzsKICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHsKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBwcm9jZXNzWyJocnRpbWUiXSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0WzBdICogMWUzICsgdFsxXSAvIDFlNjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRhdGVOb3cgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBfZW1zY3JpcHRlbl9nZXRfbm93ID0gZGF0ZU5vdzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBfZW1zY3JpcHRlbl9nZXRfbm93ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBfZW1zY3JpcHRlbl9nZXRfbm93X2lzX21vbm90b25pYyA9IHRydWU7CiAgICAgICAgICAgIGZ1bmN0aW9uIHNldEVyck5vKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBIRUFQMzJbX19fZXJybm9fbG9jYXRpb24oKSA+PiAyXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9jbG9ja19nZXR0aW1lKGNsa19pZCwgdHApIHsKICAgICAgICAgICAgICAgIHZhciBub3c7CiAgICAgICAgICAgICAgICBpZiAoY2xrX2lkID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKChjbGtfaWQgPT09IDEgfHwgY2xrX2lkID09PSA0KSAmJiBfZW1zY3JpcHRlbl9nZXRfbm93X2lzX21vbm90b25pYykgewogICAgICAgICAgICAgICAgICAgIG5vdyA9IF9lbXNjcmlwdGVuX2dldF9ub3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNldEVyck5vKDI4KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIRUFQMzJbdHAgPj4gMl0gPSAobm93IC8gMWUzKSB8IDA7CiAgICAgICAgICAgICAgICBIRUFQMzJbKHRwICsgNCkgPj4gMl0gPSAoKG5vdyAlIDFlMykgKiAxZTMgKiAxZTMpIHwgMDsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9kbG9wZW4oZmlsZW5hbWUsIGZsYWcpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZGxzeW0oaGFuZGxlLCBzeW1ib2wpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnKGRlc3QsIHNyYywgbnVtKSB7CiAgICAgICAgICAgICAgICBIRUFQVTguY29weVdpdGhpbihkZXN0LCBzcmMsIHNyYyArIG51bSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBIRUFQVTgubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGVtc2NyaXB0ZW5fcmVhbGxvY19idWZmZXIoc2l6ZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB3YXNtTWVtb3J5Lmdyb3coKHNpemUgLSBidWZmZXIuYnl0ZUxlbmd0aCArIDY1NTM1KSA+Pj4gMTYpOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcChyZXF1ZXN0ZWRTaXplKSB7CiAgICAgICAgICAgICAgICB2YXIgb2xkU2l6ZSA9IF9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKTsKICAgICAgICAgICAgICAgIHZhciBtYXhIZWFwU2l6ZSA9IDIxNDc0ODM2NDg7CiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdGVkU2l6ZSA+IG1heEhlYXBTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgY3V0RG93biA9IDE7IGN1dERvd24gPD0gNDsgY3V0RG93biAqPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG92ZXJHcm93bkhlYXBTaXplID0gb2xkU2l6ZSAqICgxICsgMC4yIC8gY3V0RG93bik7CiAgICAgICAgICAgICAgICAgICAgb3Zlckdyb3duSGVhcFNpemUgPSBNYXRoLm1pbihvdmVyR3Jvd25IZWFwU2l6ZSwgcmVxdWVzdGVkU2l6ZSArIDEwMDY2MzI5Nik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1NpemUgPSBNYXRoLm1pbihtYXhIZWFwU2l6ZSwgYWxpZ25VcChNYXRoLm1heChyZXF1ZXN0ZWRTaXplLCBvdmVyR3Jvd25IZWFwU2l6ZSksIDY1NTM2KSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihuZXdTaXplKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX3RocmVhZF9zbGVlcChtc2VjcykgewogICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gX2Vtc2NyaXB0ZW5fZ2V0X25vdygpOwogICAgICAgICAgICAgICAgd2hpbGUgKF9lbXNjcmlwdGVuX2dldF9ub3coKSAtIHN0YXJ0IDwgbXNlY3MpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBFTlYgPSB7fTsKICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RXhlY3V0YWJsZU5hbWUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1Byb2dyYW0gfHwgIi4vdGhpcy5wcm9ncmFtIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRFbnZTdHJpbmdzKCkgewogICAgICAgICAgICAgICAgaWYgKCFnZXRFbnZTdHJpbmdzLnN0cmluZ3MpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZyA9ICgodHlwZW9mIG5hdmlnYXRvciA9PT0gIm9iamVjdCIgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcyAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdKSB8fCAiQyIpLnJlcGxhY2UoIi0iLCAiXyIpICsgIi5VVEYtOCI7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVudiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgVVNFUjogIndlYl91c2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgTE9HTkFNRTogIndlYl91c2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgUEFUSDogIi8iLAogICAgICAgICAgICAgICAgICAgICAgICBQV0Q6ICIvIiwKICAgICAgICAgICAgICAgICAgICAgICAgSE9NRTogIi9ob21lL3dlYl91c2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgTEFORzogbGFuZywKICAgICAgICAgICAgICAgICAgICAgICAgXzogZ2V0RXhlY3V0YWJsZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gRU5WKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudlt4XSA9IEVOVlt4XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmluZ3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4IGluIGVudikgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzLnB1c2goeCArICI9IiArIGVudlt4XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEVudlN0cmluZ3Muc3RyaW5ncyA9IHN0cmluZ3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RW52U3RyaW5ncy5zdHJpbmdzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBTWVNDQUxMUyA9IHsKICAgICAgICAgICAgICAgIG1hcHBpbmdzOiB7fSwKICAgICAgICAgICAgICAgIGJ1ZmZlcnM6IFtudWxsLCBbXSwgW11dLAogICAgICAgICAgICAgICAgcHJpbnRDaGFyOiBmdW5jdGlvbiAoc3RyZWFtLCBjdXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IFNZU0NBTExTLmJ1ZmZlcnNbc3RyZWFtXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VyciA9PT0gMCB8fCBjdXJyID09PSAxMCkgewogICAgICAgICAgICAgICAgICAgICAgICAoc3RyZWFtID09PSAxID8gb3V0IDogZXJyKShVVEY4QXJyYXlUb1N0cmluZyhidWZmZXIsIDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIucHVzaChjdXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdmFyYXJnczogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgU1lTQ0FMTFMudmFyYXJncyArPSA0OwogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBIRUFQMzJbKFNZU0NBTExTLnZhcmFyZ3MgLSA0KSA+PiAyXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdldFN0cjogZnVuY3Rpb24gKHB0cikgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBVVEY4VG9TdHJpbmcocHRyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdldDY0OiBmdW5jdGlvbiAobG93LCBoaWdoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvdzsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbnZpcm9uX2dldChfX2Vudmlyb24sIGVudmlyb25fYnVmKSB7CiAgICAgICAgICAgICAgICB2YXIgYnVmU2l6ZSA9IDA7CiAgICAgICAgICAgICAgICBnZXRFbnZTdHJpbmdzKCkuZm9yRWFjaChmdW5jdGlvbiAoc3RyaW5nLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB0ciA9IGVudmlyb25fYnVmICsgYnVmU2l6ZTsKICAgICAgICAgICAgICAgICAgICBIRUFQMzJbKF9fZW52aXJvbiArIGkgKiA0KSA+PiAyXSA9IHB0cjsKICAgICAgICAgICAgICAgICAgICB3cml0ZUFzY2lpVG9NZW1vcnkoc3RyaW5nLCBwdHIpOwogICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUgKz0gc3RyaW5nLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbnZpcm9uX3NpemVzX2dldChwZW52aXJvbl9jb3VudCwgcGVudmlyb25fYnVmX3NpemUpIHsKICAgICAgICAgICAgICAgIHZhciBzdHJpbmdzID0gZ2V0RW52U3RyaW5ncygpOwogICAgICAgICAgICAgICAgSEVBUDMyW3BlbnZpcm9uX2NvdW50ID4+IDJdID0gc3RyaW5ncy5sZW5ndGg7CiAgICAgICAgICAgICAgICB2YXIgYnVmU2l6ZSA9IDA7CiAgICAgICAgICAgICAgICBzdHJpbmdzLmZvckVhY2goZnVuY3Rpb24gKHN0cmluZykgewogICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUgKz0gc3RyaW5nLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIEhFQVAzMltwZW52aXJvbl9idWZfc2l6ZSA+PiAyXSA9IGJ1ZlNpemU7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZXhpdChzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGV4aXQoc3RhdHVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZmRfY2xvc2UoZmQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF9zZWVrKGZkLCBvZmZzZXRfbG93LCBvZmZzZXRfaGlnaCwgd2hlbmNlLCBuZXdPZmZzZXQpIHsgfQogICAgICAgICAgICBmdW5jdGlvbiBfZmRfd3JpdGUoZmQsIGlvdiwgaW92Y250LCBwbnVtKSB7CiAgICAgICAgICAgICAgICB2YXIgbnVtID0gMDsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW92Y250OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHRyID0gSEVBUDMyWyhpb3YgKyBpICogOCkgPj4gMl07CiAgICAgICAgICAgICAgICAgICAgdmFyIGxlbiA9IEhFQVAzMlsoaW92ICsgKGkgKiA4ICsgNCkpID4+IDJdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgU1lTQ0FMTFMucHJpbnRDaGFyKGZkLCBIRUFQVThbcHRyICsgal0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBudW0gKz0gbGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgSEVBUDMyW3BudW0gPj4gMl0gPSBudW07CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfcHRocmVhZF9jcmVhdGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gNjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfcHRocmVhZF9qb2luKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDI4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9zeXNjb25mKG5hbWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNjM4NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg1OgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF4SGVhcFNpemUgPSAyMTQ3NDgzNjQ4OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF4SGVhcFNpemUgLyAxNjM4NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDIzNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDUyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwMDgwOTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDgwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgODE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5MToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDYwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDI0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDcyOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMTQ3NDgzNjQ3OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDc4Mzk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA0ODsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDk3MTUyOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY1NTM2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjg6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjc2ODsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzI3Njc7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxZTM7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcwMDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDcxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjU2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyNTU7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTAwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3MzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4NDogewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF2aWdhdG9yWyJoYXJkd2FyZUNvbmN1cnJlbmN5Il0gfHwgMTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2V0RXJyTm8oMjgpOwogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhc21MaWJyYXJ5QXJnID0gewogICAgICAgICAgICAgICAgYTogX2Fib3J0LAogICAgICAgICAgICAgICAgbjogX2Nsb2NrX2dldHRpbWUsCiAgICAgICAgICAgICAgICBpOiBfZGxvcGVuLAogICAgICAgICAgICAgICAgZTogX2Rsc3ltLAogICAgICAgICAgICAgICAgbDogX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZywKICAgICAgICAgICAgICAgIG06IF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwLAogICAgICAgICAgICAgICAgbzogX2Vtc2NyaXB0ZW5fdGhyZWFkX3NsZWVwLAogICAgICAgICAgICAgICAgcDogX2Vudmlyb25fZ2V0LAogICAgICAgICAgICAgICAgZzogX2Vudmlyb25fc2l6ZXNfZ2V0LAogICAgICAgICAgICAgICAgajogX2V4aXQsCiAgICAgICAgICAgICAgICBoOiBfZmRfY2xvc2UsCiAgICAgICAgICAgICAgICBrOiBfZmRfc2VlaywKICAgICAgICAgICAgICAgIGM6IF9mZF93cml0ZSwKICAgICAgICAgICAgICAgIGQ6IF9wdGhyZWFkX2NyZWF0ZSwKICAgICAgICAgICAgICAgIGY6IF9wdGhyZWFkX2pvaW4sCiAgICAgICAgICAgICAgICBiOiBfc3lzY29uZiwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY3JlYXRlV2FzbSgpOwogICAgICAgICAgICB2YXIgX19fd2FzbV9jYWxsX2N0b3JzID0gKE1vZHVsZVsiX19fd2FzbV9jYWxsX2N0b3JzIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKF9fX3dhc21fY2FsbF9jdG9ycyA9IE1vZHVsZVsiX19fd2FzbV9jYWxsX2N0b3JzIl0gPSBNb2R1bGVbImFzbSJdWyJyIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQiXSA9IE1vZHVsZVsiYXNtIl1bInMiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dE1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dE1lbW9yeU9mZnNldCJdID0gTW9kdWxlWyJhc20iXVsidCJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0SGVpZ2h0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0SGVpZ2h0Il0gPSBNb2R1bGVbImFzbSJdWyJ1Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRXaWR0aCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dFdpZHRoIl0gPSBNb2R1bGVbImFzbSJdWyJ2Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRDaGFubmVsQ291bnQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRDaGFubmVsQ291bnQiXSA9IE1vZHVsZVsiYXNtIl1bInciXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0TWVtb3J5T2Zmc2V0Il0gPSBNb2R1bGVbImFzbSJdWyJ4Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0SGVpZ2h0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dEhlaWdodCJdID0gTW9kdWxlWyJhc20iXVsieSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dFdpZHRoIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dFdpZHRoIl0gPSBNb2R1bGVbImFzbSJdWyJ6Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0Q2hhbm5lbENvdW50Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dENoYW5uZWxDb3VudCJdID0gTW9kdWxlWyJhc20iXVsiQSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2xvYWRNb2RlbCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9sb2FkTW9kZWwiXSA9IE1vZHVsZVsiYXNtIl1bIkIiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9ydW5JbmZlcmVuY2UiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfcnVuSW5mZXJlbmNlIl0gPSBNb2R1bGVbImFzbSJdWyJDIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgX19fZXJybm9fbG9jYXRpb24gPSAoTW9kdWxlWyJfX19lcnJub19sb2NhdGlvbiJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChfX19lcnJub19sb2NhdGlvbiA9IE1vZHVsZVsiX19fZXJybm9fbG9jYXRpb24iXSA9IE1vZHVsZVsiYXNtIl1bIkUiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBjYWxsZWRSdW47CiAgICAgICAgICAgIGZ1bmN0aW9uIEV4aXRTdGF0dXMoc3RhdHVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSAiRXhpdFN0YXR1cyI7CiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSAiUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgiICsgc3RhdHVzICsgIikiOwogICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gZnVuY3Rpb24gcnVuQ2FsbGVyKCkgewogICAgICAgICAgICAgICAgaWYgKCFjYWxsZWRSdW4pCiAgICAgICAgICAgICAgICAgICAgcnVuKCk7CiAgICAgICAgICAgICAgICBpZiAoIWNhbGxlZFJ1bikKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBydW5DYWxsZXI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZ1bmN0aW9uIHJ1bihhcmdzKSB7CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByZVJ1bigpOwogICAgICAgICAgICAgICAgaWYgKHJ1bkRlcGVuZGVuY2llcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkb1J1bigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGVkUnVuKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY2FsbGVkUnVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbImNhbGxlZFJ1biJdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoQUJPUlQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBpbml0UnVudGltZSgpOwogICAgICAgICAgICAgICAgICAgIHByZU1haW4oKTsKICAgICAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZXNvbHZlKE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsib25SdW50aW1lSW5pdGlhbGl6ZWQiXSkKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKCk7CiAgICAgICAgICAgICAgICAgICAgcG9zdFJ1bigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsic2V0U3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCJSdW5uaW5nLi4uIik7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJzZXRTdGF0dXMiXSgiIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBkb1J1bigpOwogICAgICAgICAgICAgICAgICAgIH0sIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZG9SdW4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbInJ1biJdID0gcnVuOwogICAgICAgICAgICBmdW5jdGlvbiBleGl0KHN0YXR1cywgaW1wbGljaXQpIHsKICAgICAgICAgICAgICAgIHF1aXRfKHN0YXR1cywgbmV3IEV4aXRTdGF0dXMoc3RhdHVzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKE1vZHVsZVsicHJlSW5pdCJdKSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlSW5pdCJdID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVJbml0Il0gPSBbTW9kdWxlWyJwcmVJbml0Il1dOwogICAgICAgICAgICAgICAgd2hpbGUgKE1vZHVsZVsicHJlSW5pdCJdLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZUluaXQiXS5wb3AoKSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJ1bigpOwogICAgICAgICAgICByZXR1cm4gY3JlYXRlVEZMaXRlTW9kdWxlLnJlYWR5OwogICAgICAgIH07CiAgICB9KSgpOwoKICAgIHZhciB0ZmxpdGUgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgX19wcm90b19fOiBudWxsLAogICAgICAgIGRlZmF1bHQ6IGNyZWF0ZVRGTGl0ZU1vZHVsZQogICAgfSk7Cgp9KSh3YXNtRmVhdHVyZURldGVjdCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPVByb2Nlc3NvclByb3h5Lndvcmtlci5qcy5tYXAKCg==");let L_;const J_=new Image(1,1);function K_(e,t){return $T(this,void 0,void 0,function*(){try{return yield createImageBitmap(e,t)}catch(e){return yield createImageBitmap(J_,t)}})}J_.src="data:image/gif;base64,R0lGODlhAQABAIAAAMLCwgAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==";var Y_=Object.freeze({__proto__:null,createEffectStream:(e,t,n)=>$T(void 0,void 0,void 0,function*(){yield p_(n);const i=[],r=e.getVideoTracks()[0],s=e.getAudioTracks()[0];let{width:o,height:a}=r.getSettings();const c=(g=t.useBackgroundWorker,d={setup:t,params:n,videoWidth:o,videoHeight:a},g?(L_||(L_=new j_),new H_(L_,d)):new D_(d));var g,d;let C;const I=e=>$T(void 0,void 0,void 0,function*(){const n=yield h_(e.backgroundUrl,e.backgroundType);return C=n&&n.play&&(()=>{n.paused&&n.play()}),function(e,t,n,i){return $T(this,void 0,void 0,function*(){if(!e)return()=>$T(this,void 0,void 0,function*(){});const r=e.videoWidth||e.naturalWidth||e.width,s=e.videoHeight||e.naturalHeight||e.height,o=r/s,a=t/n;if("imagedata"===i){const i=document.createElement("canvas");i.width=t,i.height=n;const c=i.getContext("2d");let[g,d,C,I]=[0,0,t,n];if(o>a){const e=n*o-t;g-=Math.round(e/2),C+=Math.round(e)}else if(o<a){const e=t/o-n;d-=Math.round(e/2),I+=Math.round(e)}return()=>$T(this,void 0,void 0,function*(){return c.drawImage(e,0,0,r,s,g,d,C,I),c.getImageData(0,0,t,n).data.buffer})}if("imagebitmap"===i){let[i,c,g,d]=[0,0,r,s];if(o>a){const e=r-s*a;i+=Math.round(e/2),g-=Math.round(e)}else if(o<a){const e=s-r/a;c+=Math.round(e/2),d-=Math.round(e)}return()=>$T(this,void 0,void 0,function*(){return yield createImageBitmap(e,i,c,g,d,{resizeWidth:t,resizeHeight:n})})}return"canvas"===i?()=>$T(this,void 0,void 0,function*(){return e}):void 0})}(n,o,a,t.transferType)});let l=yield I(n),u=null;const A=new Promise(e=>u=e);let p,h;if(t.useInsertableStreams){const e=new window.MediaStreamTrackProcessor({track:r,maxBufferSize:2}),t=new window.MediaStreamTrackGenerator({kind:"video",signalTarget:r});h=t,c.on("ready",()=>{c.start({inputStream:null==e?void 0:e.readable,outputStream:null==t?void 0:t.writable})}),c.on("firstframerendered",()=>u()),c.on("getbackgroundframe",()=>$T(void 0,void 0,void 0,function*(){C&&(C(),c.updateBackgroundFrame({frame:yield l()}))}))}else{const e=document.createElement("video"),s=()=>$T(void 0,void 0,void 0,function*(){const{width:e,height:t}=r.getSettings();o===e&&a===t||(o=e,a=t,"object"==typeof p&&(p.width=o,p.height=a),yield c.updateVideoSize({videoWidth:o,videoHeight:a}),yield I(n))});e.addEventListener("resize",s),i.push(()=>{e.removeEventListener("resize",s)}),t.keepVideoElementInDom&&(e.playsInline=!0,e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.style.width="1px",e.style.opacity=0,document.body.appendChild(e),i.push(()=>{try{document.body.removeChild(e)}catch(e){console.warn("video element already removed from DOM")}e.srcObject=null})),yield new Promise(t=>{e.addEventListener("loadedmetadata",t),e.srcObject=new MediaStream([r]),e.play()});const g=()=>{"visible"!==document.visibilityState&&e.play()};let d,A,m;if(document.addEventListener("visibilitychange",g),i.push(()=>{document.removeEventListener("visibilitychange",g)}),p=m_(o,a),"imagebitmap"===t.transferType)d=p.getContext("bitmaprenderer"),A=()=>K_(e),m=e=>{d.transferFromImageBitmap(e),e.close()};else if("imagedata"===t.transferType){d=p.getContext("2d");const t=m_(o,a).getContext("2d");A=()=>(t.drawImage(e,0,0),t.getImageData(0,0,o,a).data.buffer),m=e=>{e=new ImageData(new Uint8ClampedArray(e),o,a),d.putImageData(e,0,0)}}else"canvas"===t.transferType&&(d=p.getContext(t.useWebGL?"webgl2":"2d",t.useWebGL?t.webglContextSettings:void 0),A=()=>e,t.useWebGL&&t.canvasMemoryLeakWorkaround&&(A=()=>K_(e)),m=()=>{});h=p.captureStream().getVideoTracks()[0];let f=Date.now();const b=()=>$T(void 0,void 0,void 0,function*(){null==C||C();const[e,n]=yield Promise.all([A(),C&&l()]);c.input({videoFrame:e,backgroundFrame:n,lastRenderTime:f,requestTime:Date.now(),delay:t.framerate?1e3/t.framerate:0})}),y=()=>{b()};c.on("ready",()=>{y(),c.start({})}),c.on("output",({frame:e})=>{f=Date.now(),m(e),y(),u&&(u(),u=null)})}c.on("terminated",()=>{i.forEach(e=>e())}),c.init({useInsertableStreams:t.useInsertableStreams,initialBackgroundFrame:yield l(),effectCanvas:"canvas"===t.transferType?p:void 0});yield A,Object.defineProperty(h,"label",{get:()=>r.label}),Object.defineProperty(h,"readyState",{get:()=>r.readyState}),Object.defineProperty(h,"enabled",{get:()=>r.enabled,set:e=>{r.enabled=e}}),Object.defineProperty(h,"getSettings",{get:()=>()=>r.getSettings()});return{stream:new MediaStream([h,s].filter(e=>e)),stop:()=>{c.terminate()},updateParams:e=>$T(void 0,void 0,void 0,function*(){return yield p_(e),l=yield I(e),c.updateParams({params:e,initialBackgroundFrame:yield l()}),!0})}})});const U_=e=>$T(void 0,void 0,void 0,function*(){return{default:b_.backgrounds[e]}}),z_=!!document.createElement("canvas").getContext("webgl2"),Q_={tfliteSegmentCanvasEffects:{module:Y_,getDefaultSetup:()=>{const e={useWebGL:z_,segmentationModelId:"meetlite",logToConsole:!1,framerate:30,useInsertableStreams:!1,canvasMemoryLeakWorkaround:!0,transferType:"canvas",useBackgroundWorker:!1};return"chrome"===QT.browserDetails.browser?Object.assign(Object.assign({},e),{useWebGL:!1}):"firefox"===QT.browserDetails.browser?Object.assign(Object.assign({},e),{transferType:z_?"imagebitmap":"canvas"}):"safari"===QT.browserDetails.browser?Object.assign(Object.assign({},e),{canvasMemoryLeakWorkaround:!1,keepVideoElementInDom:!0}):Object.assign({},e)},canUse:(e={})=>{var t,n,i;return"safari"===QT.browserDetails.browser&&z_&&e.allowSafari||"chrome"===QT.browserDetails.browser&&(null!==(t=QT.browserDetails.version)&&void 0!==t?t:0)>=90||"firefox"===QT.browserDetails.browser&&(null!==(i=null===(n=QT.browserDetails)||void 0===n?void 0:n.version)&&void 0!==i?i:0)>=89}}},$_=[{id:"slight-blur",pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundBlur:{amount:"slight"}}}}},{id:"blur",pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundBlur:{amount:"normal"}}}}},{id:"heavy-blur",pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundBlur:{amount:"heavy"}}}}}];$_.push(...[{id:"clay",backgroundName:"clay"},{id:"haven",backgroundName:"haven"},{id:"focus",backgroundName:"focus"},{id:"studio",backgroundName:"studio"},{id:"glow",backgroundName:"glow"},{id:"pulse",backgroundName:"pulse"},{id:"cabin",backgroundName:"cabin"},{id:"concrete",backgroundName:"concrete"},{id:"brick",backgroundName:"brick"},{id:"sunrise",backgroundName:"sunrise"},{id:"day",backgroundName:"day"},{id:"night",backgroundName:"night"},{id:"custom"}].map(({id:e,backgroundName:t})=>({id:`image-${e}`,pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundUrl:t?U_(t):void 0}}}}))),$_.push(...[{name:"neon",index:1},{name:"bubbles",index:2}].map(({name:e,index:t})=>({id:`video-${t}`,pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundType:"video",backgroundUrl:U_(e)}}}})));const q_=(e,t,n)=>{var i,r,s;const o=$_.find(t=>t.id===e);if(!o)return;let a=Object.keys(null!==(i=o.pipelineConfigs)&&void 0!==i?i:[]).find(e=>Q_[e].canUse());if(a||(a=Object.keys(null!==(r=o.pipelineConfigs)&&void 0!==r?r:[])[0]),!a)return;const c=null===(s=o.pipelineConfigs)||void 0===s?void 0:s[a],g=Q_[a],d=Object.assign(Object.assign(Object.assign({},g.getDefaultSetup()),null==c?void 0:c.setup),t);d.useWebGL=d.useWebGL&&z_;return{pipeline:g,mergedSetup:d,mergedParams:Object.assign(Object.assign({},null==c?void 0:c.params),n)}},eG=({filter:e,options:t}={filter:(e,t)=>e.canUse(t),options:{}})=>$_.filter(e=>"image-custom"!==e.id).filter(n=>{var i;return Object.keys(null!==(i=n.pipelineConfigs)&&void 0!==i?i:[]).find(n=>null==e?void 0:e(Q_[n],null!=t?t:{}))}).map(e=>e.id),tG=function(){let e="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0;return"undefined"!=typeof __filename&&(e=e||__filename),function(t){var n,i,r=void 0!==(t=t||{})?t:{};r.ready=new Promise(function(e,t){n=e,i=t});var s,o={};for(s in r)r.hasOwnProperty(s)&&(o[s]=r[s]);var a,c,g,d,C="./this.program",I=function(e,t){throw t};a="object"==typeof window,c="function"==typeof importScripts,g="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,d=!a&&!g&&!c;var l,u,A,p,h,m="";g?(m=c?require("path").dirname(m)+"/":__dirname+"/",l=function(e,t){return p||(p=require("fs")),h||(h=require("path")),e=h.normalize(e),p.readFileSync(e,t?null:"utf8")},A=function(e){var t=l(e,!0);return t.buffer||(t=new Uint8Array(t)),S(t.buffer),t},process.argv.length>1&&(C=process.argv[1].replace(/\\/g,"/")),process.argv.slice(2),process.on("uncaughtException",function(e){if(!(e instanceof oe))throw e}),process.on("unhandledRejection",M),I=function(e){process.exit(e)},r.inspect=function(){return"[Emscripten Module object]"}):d?("undefined"!=typeof read&&(l=function(e){return read(e)}),A=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(S("object"==typeof(t=read(e,"binary"))),t)},"undefined"!=typeof scriptArgs&&scriptArgs,"function"==typeof quit&&(I=function(e){quit(e)}),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(a||c)&&(c?m=self.location.href:"undefined"!=typeof document&&document.currentScript&&(m=document.currentScript.src),e&&(m=e),m=0!==m.indexOf("blob:")?m.substr(0,m.lastIndexOf("/")+1):"",l=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},c&&(A=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),u=function(e,t,n){var i=new XMLHttpRequest;i.open("GET",e,!0),i.responseType="arraybuffer",i.onload=function(){200==i.status||0==i.status&&i.response?t(i.response):n()},i.onerror=n,i.send(null)});var f,b,y=r.print||console.log.bind(console),v=r.printErr||console.warn.bind(console);for(s in o)o.hasOwnProperty(s)&&(r[s]=o[s]);o=null,r.arguments&&r.arguments,r.thisProgram&&(C=r.thisProgram),r.quit&&(I=r.quit),r.wasmBinary&&(f=r.wasmBinary),r.noExitRuntime,"object"!=typeof WebAssembly&&M("no native wasm support detected");var w=!1;function S(e,t){e||M("Assertion failed: "+t)}var R,Z,V,k,T,_="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function G(e,t,n){for(var i=t+n,r=t;e[r]&&!(r>=i);)++r;if(r-t>16&&e.subarray&&_)return _.decode(e.subarray(t,r));for(var s="";t<r;){var o=e[t++];if(128&o){var a=63&e[t++];if(192!=(224&o)){var c=63&e[t++];if((o=224==(240&o)?(15&o)<<12|a<<6|c:(7&o)<<18|a<<12|c<<6|63&e[t++])<65536)s+=String.fromCharCode(o);else{var g=o-65536;s+=String.fromCharCode(55296|g>>10,56320|1023&g)}}else s+=String.fromCharCode((31&o)<<6|a)}else s+=String.fromCharCode(o)}return s}function B(e,t){return e%t>0&&(e+=t-e%t),e}function W(e){R=e,r.HEAP8=Z=new Int8Array(e),r.HEAP16=new Int16Array(e),r.HEAP32=k=new Int32Array(e),r.HEAPU8=V=new Uint8Array(e),r.HEAPU16=new Uint16Array(e),r.HEAPU32=new Uint32Array(e),r.HEAPF32=new Float32Array(e),r.HEAPF64=new Float64Array(e)}r.INITIAL_MEMORY;var E=[],P=[],X=[],N=[];function F(e){E.unshift(e)}function O(e){N.unshift(e)}P.push({func:function(){ie()}});var x=0,D=null;function M(e){r.onAbort&&r.onAbort(e),v(e+=""),w=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw i(t),t}function H(e,t){return String.prototype.startsWith?e.startsWith(t):0===e.indexOf(t)}r.preloadedImages={},r.preloadedAudios={};function j(e){return H(e,"data:application/octet-stream;base64,")}function L(e){return H(e,"file://")}var J,K,Y="tflite-simd.wasm";function U(e){try{if(e==Y&&f)return new Uint8Array(f);if(A)return A(e);throw"both async and sync fetching of the wasm failed"}catch(e){M(e)}}function z(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var n=t.func;"number"==typeof n?void 0===t.arg?T.get(n)():T.get(n)(t.arg):n(void 0===t.arg?null:t.arg)}else t(r)}}j(Y)||(J=Y,Y=r.locateFile?r.locateFile(J,m):m+J),K=g?function(){var e=process.hrtime();return 1e3*e[0]+e[1]/1e6}:"undefined"!=typeof dateNow?dateNow:function(){return performance.now()};function Q(e){return k[se()>>2]=e,e}function $(e){try{return b.grow(e-R.byteLength+65535>>>16),W(b.buffer),1}catch(e){}}var q={};function ee(){if(!ee.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:C||"./this.program"};for(var t in q)e[t]=q[t];var n=[];for(var t in e)n.push(t+"="+e[t]);ee.strings=n}return ee.strings}var te={mappings:{},buffers:[null,[],[]],printChar:function(e,t){var n=te.buffers[e];0===t||10===t?((1===e?y:v)(G(n,0)),n.length=0):n.push(t)},varargs:void 0,get:function(){return te.varargs+=4,k[te.varargs-4>>2]},getStr:function(e){var t=function(e,t){return e?G(V,e,t):""}(e);return t},get64:function(e,t){return e}};var ne={a:function(){M()},n:function(e,t){var n;if(0===e)n=Date.now();else{if(1!==e&&4!==e)return Q(28),-1;n=K()}return k[t>>2]=n/1e3|0,k[t+4>>2]=n%1e3*1e3*1e3|0,0},i:function(e,t){M("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},e:function(e,t){M("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},l:function(e,t,n){V.copyWithin(e,t,t+n)},m:function(e){var t=V.length,n=2147483648;if(e>n)return!1;for(var i=1;i<=4;i*=2){var r=t*(1+.2/i);if(r=Math.min(r,e+100663296),$(Math.min(n,B(Math.max(e,r),65536))))return!0}return!1},o:function(e){for(var t=K();K()-t<e;);},p:function(e,t){var n=0;return ee().forEach(function(i,r){var s=t+n;k[e+4*r>>2]=s,function(e,t){for(var n=0;n<e.length;++n)Z[0|t++]=e.charCodeAt(n);Z[0|t]=0}(i,s),n+=i.length+1}),0},g:function(e,t){var n=ee();k[e>>2]=n.length;var i=0;return n.forEach(function(e){i+=e.length+1}),k[t>>2]=i,0},j:function(e){!function(e){I(e,new oe(e))}(e)},h:function(e){return 0},k:function(e,t,n,i,r){},c:function(e,t,n,i){for(var r=0,s=0;s<n;s++){for(var o=k[t+8*s>>2],a=k[t+(8*s+4)>>2],c=0;c<a;c++)te.printChar(e,V[o+c]);r+=a}return k[i>>2]=r,0},d:function(){return 6},f:function(){return 28},b:function(e){switch(e){case 30:case 75:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return Q(28),-1}};!function(){var e={a:ne};function t(e,t){var n=e.exports;r.asm=n,W((b=r.asm.q).buffer),T=r.asm.D,function(){if(x--,r.monitorRunDependencies&&r.monitorRunDependencies(x),0==x&&D){var e=D;D=null,e()}}()}function n(e){t(e.instance)}function s(t){return function(){if(!f&&(a||c)){if("function"==typeof fetch&&!L(Y))return fetch(Y,{credentials:"same-origin"}).then(function(e){if(!e.ok)throw"failed to load wasm binary file at '"+Y+"'";return e.arrayBuffer()}).catch(function(){return U(Y)});if(u)return new Promise(function(e,t){u(Y,function(t){e(new Uint8Array(t))},t)})}return Promise.resolve().then(function(){return U(Y)})}().then(function(t){return WebAssembly.instantiate(t,e)}).then(t,function(e){v("failed to asynchronously prepare wasm: "+e),M(e)})}if(x++,r.monitorRunDependencies&&r.monitorRunDependencies(x),r.instantiateWasm)try{return r.instantiateWasm(e,t)}catch(e){return v("Module.instantiateWasm callback failed with error: "+e),!1}(f||"function"!=typeof WebAssembly.instantiateStreaming||j(Y)||L(Y)||"function"!=typeof fetch?s(n):fetch(Y,{credentials:"same-origin"}).then(function(t){return WebAssembly.instantiateStreaming(t,e).then(n,function(e){return v("wasm streaming compile failed: "+e),v("falling back to ArrayBuffer instantiation"),s(n)})})).catch(i)}();var ie=r.___wasm_call_ctors=function(){return(ie=r.___wasm_call_ctors=r.asm.r).apply(null,arguments)};r._getModelBufferMemoryOffset=function(){return(r._getModelBufferMemoryOffset=r.asm.s).apply(null,arguments)},r._getInputMemoryOffset=function(){return(r._getInputMemoryOffset=r.asm.t).apply(null,arguments)},r._getInputHeight=function(){return(r._getInputHeight=r.asm.u).apply(null,arguments)},r._getInputWidth=function(){return(r._getInputWidth=r.asm.v).apply(null,arguments)},r._getInputChannelCount=function(){return(r._getInputChannelCount=r.asm.w).apply(null,arguments)},r._getOutputMemoryOffset=function(){return(r._getOutputMemoryOffset=r.asm.x).apply(null,arguments)},r._getOutputHeight=function(){return(r._getOutputHeight=r.asm.y).apply(null,arguments)},r._getOutputWidth=function(){return(r._getOutputWidth=r.asm.z).apply(null,arguments)},r._getOutputChannelCount=function(){return(r._getOutputChannelCount=r.asm.A).apply(null,arguments)},r._loadModel=function(){return(r._loadModel=r.asm.B).apply(null,arguments)},r._runInference=function(){return(r._runInference=r.asm.C).apply(null,arguments)};var re,se=r.___errno_location=function(){return(se=r.___errno_location=r.asm.E).apply(null,arguments)};function oe(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function ae(e){function t(){re||(re=!0,r.calledRun=!0,w||(z(P),z(X),n(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),function(){if(r.postRun)for("function"==typeof r.postRun&&(r.postRun=[r.postRun]);r.postRun.length;)O(r.postRun.shift());z(N)}()))}x>0||(!function(){if(r.preRun)for("function"==typeof r.preRun&&(r.preRun=[r.preRun]);r.preRun.length;)F(r.preRun.shift());z(E)}(),x>0||(r.setStatus?(r.setStatus("Running..."),setTimeout(function(){setTimeout(function(){r.setStatus("")},1),t()},1)):t()))}if(D=function e(){re||ae(),re||(D=e)},r.run=ae,r.preInit)for("function"==typeof r.preInit&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();return ae(),t.ready}}();var nG,iG=Object.freeze({__proto__:null,default:tG}),rG=(nG="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0,"undefined"!=typeof __filename&&(nG=nG||__filename),function(e){var t,n,i=void 0!==(e=e||{})?e:{};i.ready=new Promise(function(e,i){t=e,n=i});var r,s={};for(r in i)i.hasOwnProperty(r)&&(s[r]=i[r]);var o,a,c,g,d="./this.program",C=function(e,t){throw t};o="object"==typeof window,a="function"==typeof importScripts,c="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,g=!o&&!c&&!a;var I,l,u,A,p,h="";c?(h=a?require("path").dirname(h)+"/":__dirname+"/",I=function(e,t){return A||(A=require("fs")),p||(p=require("path")),e=p.normalize(e),A.readFileSync(e,t?null:"utf8")},u=function(e){var t=I(e,!0);return t.buffer||(t=new Uint8Array(t)),w(t.buffer),t},process.argv.length>1&&(d=process.argv[1].replace(/\\/g,"/")),process.argv.slice(2),process.on("uncaughtException",function(e){if(!(e instanceof se))throw e}),process.on("unhandledRejection",D),C=function(e){process.exit(e)},i.inspect=function(){return"[Emscripten Module object]"}):g?("undefined"!=typeof read&&(I=function(e){return read(e)}),u=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(w("object"==typeof(t=read(e,"binary"))),t)},"undefined"!=typeof scriptArgs&&scriptArgs,"function"==typeof quit&&(C=function(e){quit(e)}),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(o||a)&&(a?h=self.location.href:"undefined"!=typeof document&&document.currentScript&&(h=document.currentScript.src),nG&&(h=nG),h=0!==h.indexOf("blob:")?h.substr(0,h.lastIndexOf("/")+1):"",I=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},a&&(u=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),l=function(e,t,n){var i=new XMLHttpRequest;i.open("GET",e,!0),i.responseType="arraybuffer",i.onload=function(){200==i.status||0==i.status&&i.response?t(i.response):n()},i.onerror=n,i.send(null)});var m,f,b=i.print||console.log.bind(console),y=i.printErr||console.warn.bind(console);for(r in s)s.hasOwnProperty(r)&&(i[r]=s[r]);s=null,i.arguments&&i.arguments,i.thisProgram&&(d=i.thisProgram),i.quit&&(C=i.quit),i.wasmBinary&&(m=i.wasmBinary),i.noExitRuntime,"object"!=typeof WebAssembly&&D("no native wasm support detected");var v=!1;function w(e,t){e||D("Assertion failed: "+t)}var S,R,Z,V,k,T="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function _(e,t,n){for(var i=t+n,r=t;e[r]&&!(r>=i);)++r;if(r-t>16&&e.subarray&&T)return T.decode(e.subarray(t,r));for(var s="";t<r;){var o=e[t++];if(128&o){var a=63&e[t++];if(192!=(224&o)){var c=63&e[t++];if((o=224==(240&o)?(15&o)<<12|a<<6|c:(7&o)<<18|a<<12|c<<6|63&e[t++])<65536)s+=String.fromCharCode(o);else{var g=o-65536;s+=String.fromCharCode(55296|g>>10,56320|1023&g)}}else s+=String.fromCharCode((31&o)<<6|a)}else s+=String.fromCharCode(o)}return s}function G(e,t){return e%t>0&&(e+=t-e%t),e}function B(e){S=e,i.HEAP8=R=new Int8Array(e),i.HEAP16=new Int16Array(e),i.HEAP32=V=new Int32Array(e),i.HEAPU8=Z=new Uint8Array(e),i.HEAPU16=new Uint16Array(e),i.HEAPU32=new Uint32Array(e),i.HEAPF32=new Float32Array(e),i.HEAPF64=new Float64Array(e)}i.INITIAL_MEMORY;var W=[],E=[],P=[],X=[];function N(e){W.unshift(e)}function F(e){X.unshift(e)}E.push({func:function(){ne()}});var O=0,x=null;function D(e){i.onAbort&&i.onAbort(e),y(e+=""),v=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw n(t),t}function M(e,t){return String.prototype.startsWith?e.startsWith(t):0===e.indexOf(t)}function H(e){return M(e,"data:application/octet-stream;base64,")}function j(e){return M(e,"file://")}i.preloadedImages={},i.preloadedAudios={};var L,J,K="tflite.wasm";function Y(e){try{if(e==K&&m)return new Uint8Array(m);if(u)return u(e);throw"both async and sync fetching of the wasm failed"}catch(e){D(e)}}function U(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var n=t.func;"number"==typeof n?void 0===t.arg?k.get(n)():k.get(n)(t.arg):n(void 0===t.arg?null:t.arg)}else t(i)}}function z(e){return V[re()>>2]=e,e}function Q(e){try{return f.grow(e-S.byteLength+65535>>>16),B(f.buffer),1}catch(e){}}H(K)||(L=K,K=i.locateFile?i.locateFile(L,h):h+L),J=c?function(){var e=process.hrtime();return 1e3*e[0]+e[1]/1e6}:"undefined"!=typeof dateNow?dateNow:function(){return performance.now()};var $={};function q(){if(!q.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:d||"./this.program"};for(var t in $)e[t]=$[t];var n=[];for(var t in e)n.push(t+"="+e[t]);q.strings=n}return q.strings}var ee={mappings:{},buffers:[null,[],[]],printChar:function(e,t){var n=ee.buffers[e];0===t||10===t?((1===e?b:y)(_(n,0)),n.length=0):n.push(t)},varargs:void 0,get:function(){return ee.varargs+=4,V[ee.varargs-4>>2]},getStr:function(e){var t=function(e,t){return e?_(Z,e,t):""}(e);return t},get64:function(e,t){return e}},te={a:function(){D()},n:function(e,t){var n;if(0===e)n=Date.now();else{if(1!==e&&4!==e)return z(28),-1;n=J()}return V[t>>2]=n/1e3|0,V[t+4>>2]=n%1e3*1e3*1e3|0,0},i:function(e,t){D("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},e:function(e,t){D("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},l:function(e,t,n){Z.copyWithin(e,t,t+n)},m:function(e){var t=Z.length,n=2147483648;if(e>n)return!1;for(var i=1;i<=4;i*=2){var r=t*(1+.2/i);if(r=Math.min(r,e+100663296),Q(Math.min(n,G(Math.max(e,r),65536))))return!0}return!1},o:function(e){for(var t=J();J()-t<e;);},p:function(e,t){var n=0;return q().forEach(function(i,r){var s=t+n;V[e+4*r>>2]=s,function(e,t){for(var n=0;n<e.length;++n)R[0|t++]=e.charCodeAt(n);R[0|t]=0}(i,s),n+=i.length+1}),0},g:function(e,t){var n=q();V[e>>2]=n.length;var i=0;return n.forEach(function(e){i+=e.length+1}),V[t>>2]=i,0},j:function(e){!function(e){C(e,new se(e))}(e)},h:function(e){return 0},k:function(e,t,n,i,r){},c:function(e,t,n,i){for(var r=0,s=0;s<n;s++){for(var o=V[t+8*s>>2],a=V[t+(8*s+4)>>2],c=0;c<a;c++)ee.printChar(e,Z[o+c]);r+=a}return V[i>>2]=r,0},d:function(){return 6},f:function(){return 28},b:function(e){switch(e){case 30:case 75:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return z(28),-1}};!function(){var e={a:te};function t(e,t){var n=e.exports;i.asm=n,B((f=i.asm.q).buffer),k=i.asm.D,function(){if(O--,i.monitorRunDependencies&&i.monitorRunDependencies(O),0==O&&x){var e=x;x=null,e()}}()}function r(e){t(e.instance)}function s(t){return function(){if(!m&&(o||a)){if("function"==typeof fetch&&!j(K))return fetch(K,{credentials:"same-origin"}).then(function(e){if(!e.ok)throw"failed to load wasm binary file at '"+K+"'";return e.arrayBuffer()}).catch(function(){return Y(K)});if(l)return new Promise(function(e,t){l(K,function(t){e(new Uint8Array(t))},t)})}return Promise.resolve().then(function(){return Y(K)})}().then(function(t){return WebAssembly.instantiate(t,e)}).then(t,function(e){y("failed to asynchronously prepare wasm: "+e),D(e)})}if(O++,i.monitorRunDependencies&&i.monitorRunDependencies(O),i.instantiateWasm)try{return i.instantiateWasm(e,t)}catch(e){return y("Module.instantiateWasm callback failed with error: "+e),!1}(m||"function"!=typeof WebAssembly.instantiateStreaming||H(K)||j(K)||"function"!=typeof fetch?s(r):fetch(K,{credentials:"same-origin"}).then(function(t){return WebAssembly.instantiateStreaming(t,e).then(r,function(e){return y("wasm streaming compile failed: "+e),y("falling back to ArrayBuffer instantiation"),s(r)})})).catch(n)}();var ne=i.___wasm_call_ctors=function(){return(ne=i.___wasm_call_ctors=i.asm.r).apply(null,arguments)};i._getModelBufferMemoryOffset=function(){return(i._getModelBufferMemoryOffset=i.asm.s).apply(null,arguments)},i._getInputMemoryOffset=function(){return(i._getInputMemoryOffset=i.asm.t).apply(null,arguments)},i._getInputHeight=function(){return(i._getInputHeight=i.asm.u).apply(null,arguments)},i._getInputWidth=function(){return(i._getInputWidth=i.asm.v).apply(null,arguments)},i._getInputChannelCount=function(){return(i._getInputChannelCount=i.asm.w).apply(null,arguments)},i._getOutputMemoryOffset=function(){return(i._getOutputMemoryOffset=i.asm.x).apply(null,arguments)},i._getOutputHeight=function(){return(i._getOutputHeight=i.asm.y).apply(null,arguments)},i._getOutputWidth=function(){return(i._getOutputWidth=i.asm.z).apply(null,arguments)},i._getOutputChannelCount=function(){return(i._getOutputChannelCount=i.asm.A).apply(null,arguments)},i._loadModel=function(){return(i._loadModel=i.asm.B).apply(null,arguments)},i._runInference=function(){return(i._runInference=i.asm.C).apply(null,arguments)};var ie,re=i.___errno_location=function(){return(re=i.___errno_location=i.asm.E).apply(null,arguments)};function se(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function oe(e){function n(){ie||(ie=!0,i.calledRun=!0,v||(U(E),U(P),t(i),i.onRuntimeInitialized&&i.onRuntimeInitialized(),function(){if(i.postRun)for("function"==typeof i.postRun&&(i.postRun=[i.postRun]);i.postRun.length;)F(i.postRun.shift());U(X)}()))}O>0||(function(){if(i.preRun)for("function"==typeof i.preRun&&(i.preRun=[i.preRun]);i.preRun.length;)N(i.preRun.shift());U(W)}(),O>0||(i.setStatus?(i.setStatus("Running..."),setTimeout(function(){setTimeout(function(){i.setStatus("")},1),n()},1)):n()))}if(x=function e(){ie||oe(),ie||(x=e)},i.run=oe,i.preInit)for("function"==typeof i.preInit&&(i.preInit=[i.preInit]);i.preInit.length>0;)i.preInit.pop()();return oe(),e.ready}),sG=Object.freeze({__proto__:null,default:rG}),oG=Object.freeze({__proto__:null,createEffectStream:(e,t,n,i)=>$T(void 0,void 0,void 0,function*(){const{pipeline:r,mergedSetup:s,mergedParams:o}=q_(t,n,i);s.logToConsole&&console.log(`Setting effect preset ${t}`,{setup:s,params:o});const{stream:a,stop:c,updateParams:g}=yield r.module.createEffectStream(e,s,o),d="safari"===QT.browserDetails.browser?(()=>{let e=!1;const t=()=>requestAnimationFrame(()=>{e||t()});return t(),()=>e=!0})():()=>{};return{stream:a,stop:()=>{s.logToConsole&&console.log("Stopping effects"),d(),c()},tryUpdate:(e,t,n)=>$T(void 0,void 0,void 0,function*(){const{pipeline:i,mergedSetup:o,mergedParams:a}=q_(e,t,n);return g&&i===r&&JSON.stringify(o)===JSON.stringify(s)?(s.logToConsole&&console.log(`Updating to effect preset ${e}`,{params:a}),yield g(a)):(s.logToConsole&&console.log("Cannot update effect, needs to create new pipeline"),!1)})}}),getPresets:e=>$_.map(t=>{var n;const i=!!Object.keys(null!==(n=t.pipelineConfigs)&&void 0!==n?n:[]).find(t=>Q_[t].canUse(null!=e?e:{}));return{id:t.id,kind:(r=t.id,r.startsWith("image-")?"image":r.startsWith("video-")?"video":"blur"),supported:i};var r}),getUsablePresets:eG,setDefaultSetup:(e,t)=>{const n=Q_[e].getDefaultSetup(),i=Object.assign(Object.assign({},n),t);Q_[e].getDefaultSetup=()=>i},warmup:(e,...t)=>$T(void 0,[e,...t],void 0,function*(e,t=()=>({}),n={}){var i;const r=e||eG({filter:e=>e.canUse({}),options:{}}).at(0)||(null===(i=$_.at(0))||void 0===i?void 0:i.id);if(!r)return;const s=q_(r,t,n);if(!s)return;const{mergedSetup:o,mergedParams:a}=s;if(yield Z_(o.segmentationModelId),null==a?void 0:a.backgroundUrl){yield p_(a);try{yield h_(a.backgroundUrl,a.backgroundType)}catch(e){}}})});return e.GridCell=Kk,e.GridVideoView=Yk,e.ParticipantMenu=Nk,e.ParticipantMenuContent=Fk,e.ParticipantMenuItem=xk,e.ParticipantMenuTrigger=Ok,e.VideoGrid=function({renderParticipant:e,renderFloatingParticipant:t,stageParticipantLimit:n,gridGap:i,videoGridGap:r,enableSubgrid:s,enableParticipantMenu:a,enableConstrainedGrid:c}){const g=o.useRef(null),{containerFrame:d,cellViewsFloating:C,cellViewsVideoGrid:I,cellViewsInPresentationGrid:l,cellViewsInSubgrid:u,clientAspectRatios:A,videoStage:p,setContainerBounds:h,setClientAspectRatios:m,maximizedParticipant:f,setMaximizedParticipant:b,isConstrained:y,floatingParticipant:v,setFloatingParticipant:w}=function({activeVideosSubgridTrigger:e,forceSubgrid:t,stageParticipantLimit:n=12,gridGap:i=8,videoGridGap:r=8,enableSubgrid:s=!0,enableConstrainedGrid:a=!0}={}){const[c,g]=o.useState({width:0,height:0}),[d,C]=o.useState(!1),[I,l]=o.useState({}),[u,A]=o.useState(null),[p,h]=o.useState(null),{clientViewsInGrid:m,clientViewsInPresentationGrid:f,clientViewsInSubgrid:b,floatingClientView:y}=Lw({activeVideosSubgridTrigger:e,forceSubgrid:t,stageParticipantLimit:n,enableSubgrid:s,maximizedParticipant:u,floatingParticipant:p,isConstrained:!!a&&!!d}),v=o.useMemo(()=>y?[jw({client:y,aspectRatio:I[y.id],avatarSize:0,cellPaddings:{top:0,right:0}})]:[],[y,I]),w=o.useMemo(()=>m.map(e=>jw({client:e,aspectRatio:I[e.id],avatarSize:0,cellPaddings:{top:0,right:0}})),[m,I]),S=o.useMemo(()=>f.map(e=>jw({client:e,aspectRatio:I[e.id],avatarSize:0,cellPaddings:{top:0,right:0}})),[f,I]),R=o.useMemo(()=>b.map(e=>jw({client:e,aspectRatio:I[e.id],avatarSize:0,cellPaddings:{top:0,right:0},isSubgrid:!0})),[b,I]),Z=o.useMemo(()=>gw(c),[c]);o.useEffect(()=>{a&&C(c.width<500||c.height<500)},[c,a]);const V=o.useMemo(()=>Hw({floatingVideo:v[0],frame:Z,gridGap:i,isConstrained:d,roomBounds:Z.bounds,videos:w,videoGridGap:r,presentationVideos:S,subgridVideos:R}),[Z,v,w,S,R,i,r]);return{containerFrame:Z,cellViewsFloating:v,cellViewsVideoGrid:w,cellViewsInPresentationGrid:S,cellViewsInSubgrid:R,clientAspectRatios:I,videoStage:V,setContainerBounds:g,setClientAspectRatios:l,maximizedParticipant:u,setMaximizedParticipant:A,floatingParticipant:p,setFloatingParticipant:h,isConstrained:d}}({activeVideosSubgridTrigger:12,stageParticipantLimit:n,gridGap:i,videoGridGap:r,enableSubgrid:s,enableConstrainedGrid:c}),S=o.useCallback(({aspectRatio:e,clientId:t})=>{m(n=>Object.assign(Object.assign({},n),{[t]:e}))},[m]),R=o.useMemo(()=>Uk(Object.assign({cellView:C[0],enableParticipantMenu:a},t?{render:({participant:e})=>t({participant:e})}:{})),[C]),Z=o.useMemo(()=>l.map(t=>Uk(Object.assign({cellView:t,enableParticipantMenu:a},e?{render:({participant:t})=>e({participant:t})}:{}))),[l]),V=o.useMemo(()=>I.map(t=>Uk(Object.assign({cellView:t,enableParticipantMenu:a},e?{render:({participant:t})=>e({participant:t})}:{}))),[I]),k=o.useMemo(()=>u.map(e=>Uk({cellView:e,enableParticipantMenu:a})),[u]);return o.useEffect(()=>{if(!g.current)return;const e=new ResizeObserver(Vm(()=>{var e,t,n,i;h({width:null!==(t=null===(e=g.current)||void 0===e?void 0:e.clientWidth)&&void 0!==t?t:640,height:null!==(i=null===(n=g.current)||void 0===n?void 0:n.clientHeight)&&void 0!==i?i:480})},{delay:60,edges:!1}));return e.observe(g.current),()=>{e.disconnect()}},[]),o.createElement(Wk.Provider,{value:{onSetClientAspectRatio:S,cellViewsVideoGrid:I,cellViewsInPresentationGrid:l,cellViewsInSubgrid:u,clientAspectRatios:A,maximizedParticipant:f,setMaximizedParticipant:b,floatingParticipant:v,setFloatingParticipant:w,isConstrained:y}},o.createElement("div",{ref:g,style:{width:"100%",height:"100%",position:"relative"}},o.createElement(mw,{containerFrame:d,floatingContent:R,layoutVideoStage:p,presentationGridContent:Z,gridContent:V,subgridContent:k})))},e.VideoView=nw,e.WherebyProvider=function({children:e}){const t=o.useMemo(()=>new zv,[]);return o.useEffect(()=>()=>{t.destroy()},[t]),o.createElement(Qv.Provider,{value:t},e)},e.useLocalMedia=function(e={audio:!0,video:!0}){var t;const n=null===(t=o.useContext(Qv))||void 0===t?void 0:t.getLocalMedia(),[i,r]=o.useState(()=>sw);if(!n)throw new Error("WherebyClient is not initialized. Please wrap your component with WherebyProvider.");return o.useEffect(()=>{n.startMedia(e);const t=n.subscribe(e=>{r(t=>Object.assign(Object.assign({},t),e))});return()=>{t(),n.stopMedia()}},[]),{state:i,actions:{setCameraDevice:o.useCallback(e=>n.setCameraDevice(e),[n]),setMicrophoneDevice:o.useCallback(e=>n.setMicrophoneDevice(e),[n]),setSpeakerDevice:o.useCallback(e=>n.setSpeakerDevice(e),[n]),toggleCameraEnabled:o.useCallback(e=>n.toggleCamera(e),[n]),toggleMicrophoneEnabled:o.useCallback(e=>n.toggleMicrophone(e),[n]),toggleLowDataModeEnabled:o.useCallback(e=>n.toggleLowDataMode(e),[n])}}},e.useRoomConnection=function(e,t=rw){var n;const i=null===(n=o.useContext(Qv))||void 0===n?void 0:n.getRoomConnection(),[r,s]=o.useState(()=>iw);if(!i)throw new Error("WherebyClient is not initialized. Please wrap your component with WherebyProvider.");const a=o.useMemo(()=>{const n=new URL(e),i=new URLSearchParams(n.search),r=t.roomKey||i.get("roomKey");return{displayName:t.displayName||"Guest",localMediaOptions:t.localMedia?void 0:t.localMediaOptions,roomKey:r,roomUrl:e,userAgent:"browser-sdk:3.16.1",externalId:t.externalId||null}},[e,t]);o.useEffect(()=>{const e=i.subscribe(e=>{s(t=>Object.assign(Object.assign({},t),e))}),t=i.getNotificationsEventEmitter();return s(e=>Object.assign(Object.assign({},e),{events:t})),()=>{e(),i.leaveRoom()}},[]);const c=o.useCallback(()=>(i.initialize(a),i.joinRoom()),[i]),g=o.useCallback(e=>i.sendChatMessage(e),[i]),d=o.useCallback(()=>i.knock(),[i]),C=o.useCallback(e=>i.setDisplayName(e),[i]),I=o.useCallback(e=>i.toggleCamera(e),[i]),l=o.useCallback(e=>i.toggleMicrophone(e),[i]),u=o.useCallback(e=>i.toggleLowDataMode(e),[i]),A=o.useCallback(e=>i.toggleRaiseHand(e),[i]),p=o.useCallback(e=>i.askToSpeak(e),[i]),h=o.useCallback(e=>i.askToTurnOnCamera(e),[i]),m=o.useCallback(e=>i.acceptWaitingParticipant(e),[i]),f=o.useCallback(e=>i.rejectWaitingParticipant(e),[i]),b=o.useCallback(()=>i.startCloudRecording(),[i]),y=o.useCallback(()=>i.startScreenshare(),[i]),v=o.useCallback(()=>i.stopCloudRecording(),[i]),w=o.useCallback(()=>i.stopScreenshare(),[i]),S=o.useCallback(()=>i.leaveRoom(),[i]),R=o.useCallback(e=>i.lockRoom(e),[i]),Z=o.useCallback(e=>i.muteParticipants(e),[i]),V=o.useCallback(e=>i.turnOffParticipantCameras(e),[i]),k=o.useCallback(e=>i.spotlightParticipant(e),[i]),T=o.useCallback(e=>i.removeSpotlight(e),[i]),_=o.useCallback(e=>i.kickParticipant(e),[i]),G=o.useCallback(e=>i.endMeeting(e),[i]),B=o.useCallback(e=>i.joinBreakoutGroup(e),[i]),W=o.useCallback(()=>i.joinBreakoutMainRoom(),[i]),E=o.useCallback(e=>ew(this,void 0,void 0,function*(){yield i.switchCameraEffect(e)}),[i]),P=o.useCallback(e=>ew(this,void 0,void 0,function*(){yield i.switchCameraEffectCustom(e)}),[i]),X=o.useCallback(()=>ew(this,void 0,void 0,function*(){yield i.clearCameraEffect()}),[i]),{events:N}=r;return{state:qv(r,["events"]),events:N,actions:{toggleLowDataMode:u,toggleRaiseHand:A,askToSpeak:p,askToTurnOnCamera:h,acceptWaitingParticipant:m,knock:d,joinRoom:c,leaveRoom:S,lockRoom:R,muteParticipants:Z,turnOffParticipantCameras:V,kickParticipant:_,endMeeting:G,rejectWaitingParticipant:f,sendChatMessage:g,setDisplayName:C,startCloudRecording:b,startScreenshare:y,stopCloudRecording:v,stopScreenshare:w,toggleCamera:I,toggleMicrophone:l,spotlightParticipant:k,removeSpotlight:T,joinBreakoutGroup:B,joinBreakoutMainRoom:W,switchCameraEffect:E,switchCameraEffectCustom:P,clearCameraEffect:X}}},e}({},React,ReactDOM);
|
|
134
|
+
}`,d=s/o,C=B_(e,e.VERTEX_SHADER,c),I=B_(e,e.FRAGMENT_SHADER,g),l=G_(e,C,I,t,n),u=e.getUniformLocation(l,"u_backgroundScale"),A=e.getUniformLocation(l,"u_backgroundOffset"),p=e.getUniformLocation(l,"u_inputFrame"),h=e.getUniformLocation(l,"u_personMask"),m=e.getUniformLocation(l,"u_background"),f=e.getUniformLocation(l,"u_coverage");e.useProgram(l),e.uniform2f(u,1,1),e.uniform2f(A,0,0),e.uniform1i(p,0),e.uniform1i(h,1);let b=null;function y(t){const n=t.naturalWidth||t.videoWidth||t.width,i=t.naturalHeight||t.videoHeight||t.height;b=W_(e,e.RGBA8,n,i,e.LINEAR,e.LINEAR),e.texSubImage2D(e.TEXTURE_2D,0,0,0,n,i,e.RGBA,e.UNSIGNED_BYTE,t);let r=0,s=0,o=n,a=i;o/a<d?(a=o/d,s=(i-a)/2):(o=a*d,r=(n-o)/2);const c=o/n,g=a/i;r/=n,s/=i,e.uniform2f(u,c,g),e.uniform2f(A,r,s)}function v(t){e.useProgram(l);const n=t.coverage||[0,1];e.uniform2f(f,n[0],n[1])}return v(a),r&&y(r),{render:function(){e.viewport(0,0,s,o),e.useProgram(l),e.activeTexture(e.TEXTURE1),e.bindTexture(e.TEXTURE_2D,i),null!==b&&(e.activeTexture(e.TEXTURE2),e.bindTexture(e.TEXTURE_2D,b),e.uniform1i(m,2)),e.bindFramebuffer(e.FRAMEBUFFER,null),e.drawArrays(e.TRIANGLE_STRIP,0,4)},updateParams:v,cleanUp:function(){e.deleteTexture(b),e.deleteProgram(l),e.deleteShader(I),e.deleteShader(C)},updateBackgroundImage:function(t,n){n&&(b=null),t?b?(e.bindTexture(e.TEXTURE_2D,b),e.texSubImage2D(e.TEXTURE_2D,0,0,0,t.naturalWidth||t.videoWidth||t.width,t.naturalHeight||t.videoHeight||t.height,e.RGBA,e.UNSIGNED_BYTE,t)):y(t):b&&(b=null)}}}(u,h,m,w,s,e,t,I);return{effectCtx:u,updateBackgroundFrame(e,t,n){k.updateBackgroundImage(e,n)},updateParams(e){I=X_(r=e),V.updateParams(I),k.updateParams(I)},processFrame(e){u.clearColor(0,0,0,0),u.clear(u.COLOR_BUFFER_BIT),u.activeTexture(u.TEXTURE0),u.bindTexture(u.TEXTURE_2D,f),u.texImage2D(u.TEXTURE_2D,0,u.RGBA,u.RGBA,u.UNSIGNED_BYTE,e),u.bindVertexArray(p),S.render(),o._runInference(),R.render(),Z.render(),r.backgroundUrl?k.render():V.render()},dispose(){k.cleanUp(),V.cleanUp(),Z.cleanUp(),R.cleanUp(),S.cleanUp(),u.deleteTexture(w),u.deleteTexture(b),u.deleteTexture(f),u.deleteBuffer(m),u.deleteBuffer(h),u.deleteVertexArray(p),u.deleteShader(A)}}})}function F_(e,t,n){var i=function(e){return atob(e)}(e),r=i.indexOf("\n",10)+1,s=i.substring(r)+"",o=new Blob([s],{type:"application/javascript"});return URL.createObjectURL(o)}function O_(e,t,n){var i;return function(t){return i=i||F_(e),new Worker(i,t)}}var x_=O_("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGxldCB0aW1lciA9IG51bGw7CiAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiAocmVxdWVzdCkgewogICAgICAgIGNvbnN0IHRpbWUgPSByZXF1ZXN0LmRhdGE7CiAgICAgICAgaWYgKHRpbWUgPj0gMCkKICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHBvc3RNZXNzYWdlKCIiKSwgdGltZSk7CiAgICAgICAgZWxzZSBpZiAodGltZXIpCiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICB9OwoKfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGltZXIud29ya2VyLmpzLm1hcAoK");class D_ extends A_.EventEmitter{constructor({setup:e,params:t,videoWidth:n,videoHeight:i,emit:r}){super(),this.setup=e,this.params=t,this.videoWidth=n,this.videoHeight=i,r&&(this.emit=r)}setupEngine(e,t,n,i){return $T(this,void 0,void 0,function*(){this.videoWidth=e,this.videoHeight=t,this.videoAspectRatio=this.videoWidth/this.videoHeight,this.effectCanvas=n||m_(this.videoWidth,this.videoHeight);const r=this.setup.useWebGL?N_:T_;this.engine=yield r(this.videoWidth,this.videoHeight,this.setup,this.effectCanvas,this.params,i),this.effectCtx=this.engine.effectCtx,i&&this.updateBackgroundFrame({frame:i})})}updateVideoSize(e){return $T(this,arguments,void 0,function*({videoWidth:e,videoHeight:t}){const n=this.currentBackgroundFrame;this.currentBackgroundFrame=null;const i=this.engine;yield this.setupEngine(e,t,this.effectCanvas,n),i.dispose()})}init(e){return $T(this,arguments,void 0,function*({initialBackgroundFrame:e,useInsertableStreams:t,effectCanvas:n}){if(yield this.setupEngine(this.videoWidth,this.videoHeight,n,e),t){let e=5,t=0,n=0,i=!1;this.transformer=new TransformStream({transform:(r,s)=>$T(this,void 0,void 0,function*(){this.transformController=s;const o=r.timestamp,a=performance.now();t||(t=a,n=o/1e3);e>0||a-t<o/1e3-n+200?(this.processAndRenderFrame(r),r.close(),this.hasVideoBackground&&"canvas"!==this.setup.transferType&&this.emit("getbackgroundframe"),e>0&&(e--,t=a,n=o/1e3),s.enqueue(new VideoFrame(this.effectCanvas,{timestamp:o})),i||(i=!0,this.emit("firstframerendered"))):r.close()})})}else this.setup.useBackgroundWorker||(this.timerWorker=new x_,this.timerWorker.addEventListener("message",()=>{this.emit("output",{frame:this.currentOutputFrame},[this.currentOutputFrame])}));this.emit("ready")})}updateParams({params:e,initialBackgroundFrame:t}){this.params=e,this.currentBackgroundFrame=null,this.currentBackgroundFrameCtx=null,t?this.updateBackgroundFrame({frame:t,reInit:!0}):this.engine.updateBackgroundFrame(null),this.engine.updateParams(e)}updateBackgroundFrame({frame:e,reInit:t}){let n;switch(this.currentBackgroundFrame||(this.hasVideoBackground=this.params.backgroundUrl&&"video"===this.params.backgroundType,n={x:0,y:0,width:this.videoWidth,height:this.videoHeight}),this.setup.transferType){case"imagebitmap":this.currentBackgroundFrame=e;break;case"imagedata":this.currentBackgroundFrame||(this.currentBackgroundFrame=m_(this.videoWidth,this.videoHeight),this.currentBackgroundFrameCtx=this.currentBackgroundFrame.getContext("2d")),e=new ImageData(new Uint8ClampedArray(e),this.videoWidth,this.videoHeight),this.currentBackgroundFrameCtx.putImageData(e,0,0);break;case"canvas":if(!this.currentBackgroundFrame){n.width=e.videoWidth||e.naturalWidth||e.width,n.height=e.videoHeight||e.naturalHeight||e.height;const t=n.width/n.height;if(t>this.videoAspectRatio){const e=n.width-n.height*this.videoAspectRatio;n.width-=e,n.x=Math.floor(e/2)}else if(t<this.videoAspectRatio){const e=n.height-n.width/this.videoAspectRatio;n.height-=e,n.y=Math.floor(e/2)}}this.currentBackgroundFrame=e}this.engine.updateBackgroundFrame(this.currentBackgroundFrame,n,t)}terminate(){this.transformController&&this.transformController.terminate(),this.timerWorker&&this.timerWorker.terminate(),this.engine&&(this.engine.dispose(),this.engine=null),this._terminated=!0,this.emit("terminated")}start({inputStream:e,outputStream:t}){e&&e.pipeThrough(this.transformer).pipeTo(t),this.frameCounter=0,this.frameCounterTime=performance.now()}input(e){return $T(this,arguments,void 0,function*({videoFrame:e,backgroundFrame:t,requestTime:n,lastRenderTime:i,delay:r}){var s;if(this._terminated)return;const o=i+r-2*(Date.now()-n);let a;switch(t&&this.updateBackgroundFrame({frame:t}),this.setup.transferType){case"imagebitmap":null===(s=this.prevVideoFrame)||void 0===s||s.close(),this.prevVideoFrame=e,this.processAndRenderFrame(e),a=yield createImageBitmap(this.effectCanvas);break;case"imagedata":e=new ImageData(new Uint8ClampedArray(e),this.videoWidth,this.videoHeight),this.inputCanvas||(this.inputCanvas=m_(this.videoWidth,this.videoHeight),this.inputCanvasCtx=this.inputCanvas.getContext("2d")),this.inputCanvasCtx.putImageData(e,0,0),this.processAndRenderFrame(this.inputCanvas),a=this.effectCtx.getImageData(0,0,this.videoWidth,this.videoHeight).data.buffer;break;case"canvas":this.processAndRenderFrame(e),a=this.effectCanvas}const c=Math.max(0,o-Date.now());this.timerWorker?(this.currentOutputFrame=a,this.timerWorker.postMessage(c)):setTimeout(()=>{this.emit("output",{frame:a},[a])},c)})}processAndRenderFrame(e){if(this.engine.processFrame(e),this.setup.logToConsole){this.frameCounter++;const e=performance.now();e-this.frameCounterTime>1e3&&(console.log(`Running camera effects, ${Math.round(1e3*this.frameCounter/(e-this.frameCounterTime))} fps`),this.frameCounter=0,this.frameCounterTime=e)}}}let M_=0;class H_ extends A_.EventEmitter{constructor(e,t){super();const n=M_++,i=(t,i)=>{this[t]=r=>{e.postMessage(Object.assign({type:t,processorId:n},r),i&&i(r).filter(e=>e))}};i("init",e=>[e.initialBackgroundFrame]),i("start",e=>[e.inputStream,e.outputStream]),i("input",e=>[e.videoFrame,e.backgroundFrame]),i("updateBackgroundFrame",e=>[e.frame]),i("updateParams",e=>[e.initialBackgroundFrame]),i("updateVideoSize"),i("terminate");const r=t=>$T(this,void 0,void 0,function*(){if(t.data.processorId!==n)return;const i=t.data,{type:s}=i,o=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(i=Object.getOwnPropertySymbols(e);r<i.length;r++)t.indexOf(i[r])<0&&Object.prototype.propertyIsEnumerable.call(e,i[r])&&(n[i[r]]=e[i[r]])}return n}(i,["type"]);this.emit(s,o),"terminated"===s&&e.removeEventListener("message",r)});e.postMessage(Object.assign({type:"create",processorId:n},t)),e.addEventListener("message",r)}}var j_=O_("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKHdhc21GZWF0dXJlRGV0ZWN0KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIF9kb2N1bWVudEN1cnJlbnRTY3JpcHQgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdCA6IG51bGw7CiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uDQoNCiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkNCiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuDQoNCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSA0KICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQ0KICAgIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwNCiAgICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUg0KICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1INCiAgICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQogICAgLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqLw0KDQoNCiAgICBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7DQogICAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQ0KICAgICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsNCiAgICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9DQogICAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09ICJmdW5jdGlvbiIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHsNCiAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7DQogICAgICAgIHJldHVybiBlLm5hbWUgPSAiU3VwcHJlc3NlZEVycm9yIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlOw0KICAgIH07CgogICAgdmFyIGV2ZW50cyA9IHtleHBvcnRzOiB7fX07CgogICAgdmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbDsKICAgIHZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nCiAgICAgID8gUi5hcHBseQogICAgICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7CiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpOwogICAgICB9OwoKICAgIHZhciBSZWZsZWN0T3duS2V5czsKICAgIGlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXM7CiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KQogICAgICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpOwogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykgewogICAgICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTsKICAgIH0KCiAgICB2YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTsKICAgIH07CgogICAgZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkgewogICAgICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpOwogICAgfQogICAgZXZlbnRzLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7CiAgICBldmVudHMuZXhwb3J0cy5vbmNlID0gb25jZTsKCiAgICAvLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLngKICAgIEV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkOwogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwOwogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkOwoKICAgIC8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZQogICAgLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy4KICAgIHZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7CgogICAgZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikgewogICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpOwogICAgICB9CiAgICB9CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7CiAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24oYXJnKSB7CiAgICAgICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkgewogICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7CiAgICAgIH0KICAgIH0pOwoKICAgIEV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7CgogICAgICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHwKICAgICAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHsKICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfQoKICAgICAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDsKICAgIH07CgogICAgLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzCiAgICAvLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC4KICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHsKICAgICAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgIm4iIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTsKICAgICAgfQogICAgICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7CiAgICAgIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICAgIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7CiAgICB9CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7CiAgICAgIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpOwogICAgfTsKCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHsKICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTsKCiAgICAgIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7CiAgICAgIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkKICAgICAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpOwogICAgICBlbHNlIGlmICghZG9FcnJvcikKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuCiAgICAgIGlmIChkb0Vycm9yKSB7CiAgICAgICAgdmFyIGVyOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApCiAgICAgICAgICBlciA9IGFyZ3NbMF07CiAgICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvdwogICAgICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi4KICAgICAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudAogICAgICAgIH0KICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyCiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7CiAgICAgICAgZXJyLmNvbnRleHQgPSBlcjsKICAgICAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50CiAgICAgIH0KCiAgICAgIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdOwoKICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoOwogICAgICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkKICAgICAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpOwogICAgICB9CgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHsKICAgICAgdmFyIG07CiAgICAgIHZhciBldmVudHM7CiAgICAgIHZhciBleGlzdGluZzsKCiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7CiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSAibmV3TGlzdGVuZXIiISBCZWZvcmUKICAgICAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCAibmV3TGlzdGVuZXIiLgogICAgICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7CgogICAgICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZQogICAgICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdAogICAgICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7CiAgICAgICAgfQogICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdOwogICAgICB9CgogICAgICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkgewogICAgICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LgogICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7CiAgICAgICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50OwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LgogICAgICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPQogICAgICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTsKICAgICAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC4KICAgICAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHsKICAgICAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrCiAgICAgICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTsKICAgICAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7CiAgICAgICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlOwogICAgICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmcKICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheAogICAgICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTsKICAgICAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnOwogICAgICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0OwogICAgICAgICAgdy50eXBlID0gdHlwZTsKICAgICAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7CiAgICAgICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikgewogICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7CiAgICB9OwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyOwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID0KICAgICAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpOwogICAgICAgIH07CgogICAgZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7CiAgICAgIGlmICghdGhpcy5maXJlZCkgewogICAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pOwogICAgICAgIHRoaXMuZmlyZWQgPSB0cnVlOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7CiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikgewogICAgICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTsKICAgICAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTsKICAgICAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyOwogICAgICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkOwogICAgICByZXR1cm4gd3JhcHBlZDsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID0KICAgICAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpOwogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKCiAgICAvLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9CiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyOwoKICAgICAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgogICAgICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTsKICAgICAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikgewogICAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdOwogICAgICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpCiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgcG9zaXRpb24gPSAtMTsKCiAgICAgICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyOwogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocG9zaXRpb24gPCAwKQogICAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKQogICAgICAgICAgICAgIGxpc3Quc2hpZnQoKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKQogICAgICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07CgogICAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyOwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0KICAgICAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkgewogICAgICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpOwoKICAgICAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgogICAgICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdAogICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHMKICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICBrZXkgPSBrZXlzW2ldOwogICAgICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlOwogICAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CgogICAgICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdOwoKICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTsKICAgICAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgLy8gTElGTyBvcmRlcgogICAgICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwoKICAgIGZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHsKICAgICAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzOwoKICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBbXTsKCiAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdOwogICAgICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBbXTsKCiAgICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykKICAgICAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07CgogICAgICByZXR1cm4gdW53cmFwID8KICAgICAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7CiAgICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpOwogICAgfTsKCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7CiAgICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTsKICAgIH07CgogICAgRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpOwogICAgICB9CiAgICB9OwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7CiAgICBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHsKICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKCiAgICAgIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdOwoKICAgICAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkgewogICAgICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdOwogICAgfTsKCiAgICBmdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikgewogICAgICB2YXIgY29weSA9IG5ldyBBcnJheShuKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpCiAgICAgICAgY29weVtpXSA9IGFycltpXTsKICAgICAgcmV0dXJuIGNvcHk7CiAgICB9CgogICAgZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7CiAgICAgIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKykKICAgICAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTsKICAgICAgbGlzdC5wb3AoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7CiAgICAgIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTsKICAgICAgfQogICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIGZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkgewogICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7CiAgICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTsKICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTsKICAgICAgICB9CiAgICAgICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7CiAgICAgICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHsKICAgICAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAnZXJyb3InLCBoYW5kbGVyLCBmbGFncyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlCiAgICAgICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS4KICAgICAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykgewogICAgICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZQogICAgICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS4KICAgICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpOwogICAgICAgICAgfQogICAgICAgICAgbGlzdGVuZXIoYXJnKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTsKICAgICAgfQogICAgfQoKICAgIHZhciBldmVudHNFeHBvcnRzID0gZXZlbnRzLmV4cG9ydHM7CgogICAgZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICBpZiAoc2VsZi5kb2N1bWVudCkgewogICAgICAgICAgICBjb25zdCBjYW52YXMgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDsKICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgICAgcmV0dXJuIGNhbnZhczsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc2VsZi5PZmZzY3JlZW5DYW52YXMpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IENETl9CQVNFX1VSTCA9ICJodHRwczovL2Nkbi5zcnYud2hlcmVieS5jb20vY2FtZXJhLWVmZmVjdHMvdjEtMC0wIjsKICAgIGNvbnN0IGdldEFzc2V0VXJsID0gKHBhdGgpID0+IHsKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBgJHtDRE5fQkFTRV9VUkx9LyR7cGF0aH1gOwogICAgICAgIH0KICAgIH07CiAgICBjb25zdCBhc3NldFVybHMgPSB7CiAgICAgICAgdGZsaXRlOiB7CiAgICAgICAgICAgIHdhc206IGdldEFzc2V0VXJsKCJhc3NldHMvdGZsaXRlL3RmbGl0ZS53YXNtIikgLAogICAgICAgICAgICB3YXNtU2ltZDogZ2V0QXNzZXRVcmwoImFzc2V0cy90ZmxpdGUvdGZsaXRlLXNpbWQud2FzbSIpICwKICAgICAgICB9LAogICAgICAgIG1vZGVsczogewogICAgICAgICAgICBzZWdtTGl0ZTogZ2V0QXNzZXRVcmwoImFzc2V0cy90ZmxpdGUvbW9kZWxzL3NlZ21fbGl0ZV92NjgxLnRmbGl0ZSIpICwKICAgICAgICAgICAgc2VnbUZ1bGw6IGdldEFzc2V0VXJsKCJhc3NldHMvdGZsaXRlL21vZGVscy9zZWdtX2Z1bGxfdjY3OS50ZmxpdGUiKSAsCiAgICAgICAgICAgIG1sa2l0OiBnZXRBc3NldFVybCgiYXNzZXRzL3RmbGl0ZS9tb2RlbHMvc2VsZmllc2VnbWVudGF0aW9uX21sa2l0LTI1NngyNTYtMjAyMV8wMV8xOS12MTIxNS5mMTYudGZsaXRlIikKICAgICAgICAgICAgICAgICwKICAgICAgICB9fTsKCiAgICBjb25zdCBsb2FkVGZsaXRlTW9kdWxlID0gKGlzU2ltZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgY29uc3QgY3JlYXRlVGZsaXRlTW9kdWxlID0gaXNTaW1kCiAgICAgICAgICAgID8geWllbGQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB0ZmxpdGVTaW1kOyB9KS50aGVuKChtKSA9PiBtLmRlZmF1bHQpCiAgICAgICAgICAgIDogeWllbGQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB0ZmxpdGU7IH0pLnRoZW4oKG0pID0+IG0uZGVmYXVsdCk7CiAgICAgICAgcmV0dXJuIGNyZWF0ZVRmbGl0ZU1vZHVsZTsKICAgIH0pOwogICAgY29uc3QgZ2V0TW9kZWxVcmwgPSAobW9kZWxJZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2ggKG1vZGVsSWQpIHsKICAgICAgICAgICAgICAgIGNhc2UgIm1lZXRsaXRlIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5zZWdtTGl0ZTsKICAgICAgICAgICAgICAgIGNhc2UgIm1lZXRmdWxsIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5zZWdtRnVsbDsKICAgICAgICAgICAgICAgIGNhc2UgIm1sa2l0IjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5tbGtpdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwogICAgY29uc3QgZ2V0V2FzbVVybCA9IChpc1NpbWQpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGlzU2ltZCA/IGFzc2V0VXJscy50ZmxpdGUud2FzbVNpbWQgOiBhc3NldFVybHMudGZsaXRlLndhc207CiAgICAgICAgfQogICAgfSk7CiAgICBjb25zdCBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX0JBQ0tHUk9VTkRfUEVSU09OID0gMTsKICAgIGNvbnN0IFNFR01FTlRBVElPTk1PREVMX1RZUEVfUEVSU09OID0gMjsKICAgIGNvbnN0IHJlc29sdmVBc3NldFVybCA9ICh1cmwpID0+IHsKICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSB8fCB1cmwuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSB8fCB1cmwuc3RhcnRzV2l0aCgiYmxvYjoiKSB8fCB1cmwuc3RhcnRzV2l0aCgiZGF0YToiKSkgewogICAgICAgICAgICByZXR1cm4gdXJsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmwsIChfZG9jdW1lbnRDdXJyZW50U2NyaXB0ICYmIF9kb2N1bWVudEN1cnJlbnRTY3JpcHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnU0NSSVBUJyAmJiBfZG9jdW1lbnRDdXJyZW50U2NyaXB0LnNyYyB8fCBuZXcgVVJMKCdQcm9jZXNzb3JQcm94eS53b3JrZXIuanMnLCBkb2N1bWVudC5iYXNlVVJJKS5ocmVmKSkuaHJlZjsKICAgIH07CiAgICBjb25zdCBtb2RlbHMgPSB7CiAgICAgICAgbWVldGxpdGU6IHsKICAgICAgICAgICAgaWQ6ICJtZWV0bGl0ZSIsCiAgICAgICAgICAgIHR5cGU6IFNFR01FTlRBVElPTk1PREVMX1RZUEVfQkFDS0dST1VORF9QRVJTT04sCiAgICAgICAgfSwKICAgICAgICBtZWV0ZnVsbDogewogICAgICAgICAgICBpZDogIm1lZXRmdWxsIiwKICAgICAgICAgICAgdHlwZTogU0VHTUVOVEFUSU9OTU9ERUxfVFlQRV9CQUNLR1JPVU5EX1BFUlNPTiwKICAgICAgICB9LAogICAgICAgIG1sa2l0OiB7CiAgICAgICAgICAgIGlkOiAibWxraXQiLAogICAgICAgICAgICB0eXBlOiBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX1BFUlNPTiwKICAgICAgICB9LAogICAgfTsKICAgIGxldCBfdGZsaXRlID0gbnVsbDsKICAgIGNvbnN0IGxvYWRURkxpdGUgPSAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICBpZiAoX3RmbGl0ZSkKICAgICAgICAgICAgcmV0dXJuIF90ZmxpdGU7CiAgICAgICAgY29uc3Qgc2ltZElzU3VwcG9ydGVkID0geWllbGQgd2FzbUZlYXR1cmVEZXRlY3Quc2ltZCgpOwogICAgICAgIGNvbnN0IGNyZWF0ZVRmbGl0ZU1vZHVsZSA9IHlpZWxkIGxvYWRUZmxpdGVNb2R1bGUoc2ltZElzU3VwcG9ydGVkKTsKICAgICAgICBjb25zdCB3YXNtVXJsID0geWllbGQgZ2V0V2FzbVVybChzaW1kSXNTdXBwb3J0ZWQpOwogICAgICAgIF90ZmxpdGUgPSB5aWVsZCBjcmVhdGVUZmxpdGVNb2R1bGUoewogICAgICAgICAgICBsb2NhdGVGaWxlKHBhdGgpIHsKICAgICAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIud2FzbSIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVBc3NldFVybCh3YXNtVXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBwYXRoOwogICAgICAgICAgICB9LAogICAgICAgIH0pOwogICAgICAgIHJldHVybiBfdGZsaXRlOwogICAgfSk7CiAgICBsZXQgX2N1cnJlbnRNb2RlbEFuZEluZm87CiAgICBjb25zdCBsb2FkU2VnbWVudGF0aW9uTW9kZWwgPSAoc2VnbWVudGF0aW9uTW9kZWxJZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgY29uc3QgbW9kZWwgPSBtb2RlbHNbc2VnbWVudGF0aW9uTW9kZWxJZF07CiAgICAgICAgY29uc3QgbW9kZWxVcmwgPSByZXNvbHZlQXNzZXRVcmwoeWllbGQgZ2V0TW9kZWxVcmwobW9kZWwuaWQpKTsKICAgICAgICBjb25zdCB0ZmxpdGUgPSB5aWVsZCBsb2FkVEZMaXRlKCk7CiAgICAgICAgaWYgKChfY3VycmVudE1vZGVsQW5kSW5mbyA9PT0gbnVsbCB8fCBfY3VycmVudE1vZGVsQW5kSW5mbyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2N1cnJlbnRNb2RlbEFuZEluZm8udXJsKSA9PT0gbW9kZWxVcmwpCiAgICAgICAgICAgIHJldHVybiBfY3VycmVudE1vZGVsQW5kSW5mbzsKICAgICAgICBjb25zdCBtb2RlbFJlc3BvbnNlID0geWllbGQgZmV0Y2gobW9kZWxVcmwpOwogICAgICAgIGNvbnN0IG1vZGVsQnVmZmVyID0geWllbGQgbW9kZWxSZXNwb25zZS5hcnJheUJ1ZmZlcigpOwogICAgICAgIGNvbnN0IG1vZGVsQnVmZmVyT2Zmc2V0ID0gdGZsaXRlLl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCgpOwogICAgICAgIHRmbGl0ZS5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KG1vZGVsQnVmZmVyKSwgbW9kZWxCdWZmZXJPZmZzZXQpOwogICAgICAgIHRmbGl0ZS5fbG9hZE1vZGVsKG1vZGVsQnVmZmVyLmJ5dGVMZW5ndGgpOwogICAgICAgIGNvbnN0IGlucHV0SGVpZ2h0ID0gdGZsaXRlLl9nZXRJbnB1dEhlaWdodCgpOwogICAgICAgIGNvbnN0IGlucHV0V2lkdGggPSB0ZmxpdGUuX2dldElucHV0V2lkdGgoKTsKICAgICAgICBjb25zdCBpbnB1dE1lbW9yeU9mZnNldCA9IHRmbGl0ZS5fZ2V0SW5wdXRNZW1vcnlPZmZzZXQoKSAvIDQ7CiAgICAgICAgY29uc3Qgb3V0cHV0TWVtb3J5T2Zmc2V0ID0gdGZsaXRlLl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQoKSAvIDQ7CiAgICAgICAgY29uc3Qgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCA9IGlucHV0V2lkdGggKiBpbnB1dEhlaWdodDsKICAgICAgICB0ZmxpdGUuX3J1bkluZmVyZW5jZSgpOwogICAgICAgIF9jdXJyZW50TW9kZWxBbmRJbmZvID0gewogICAgICAgICAgICB0ZmxpdGUsCiAgICAgICAgICAgIG1vZGVsLAogICAgICAgICAgICB1cmw6IG1vZGVsVXJsLAogICAgICAgICAgICBpbnB1dEhlaWdodCwKICAgICAgICAgICAgaW5wdXRXaWR0aCwKICAgICAgICAgICAgaW5wdXRNZW1vcnlPZmZzZXQsCiAgICAgICAgICAgIG91dHB1dE1lbW9yeU9mZnNldCwKICAgICAgICAgICAgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwKICAgICAgICB9OwogICAgICAgIHJldHVybiBfY3VycmVudE1vZGVsQW5kSW5mbzsKICAgIH0pOwoKICAgIGNvbnN0IGJhc2VDYW52YXNQYXJhbXMgPSB7CiAgICAgICAgbWFza09wZXJhdGlvbjogImNvcHkiLAogICAgICAgIG1hc2tGaWx0ZXI6ICJibHVyKDRweCkiLAogICAgICAgIHBlcnNvbk9wZXJhdGlvbjogInNvdXJjZS1pbiIsCiAgICAgICAgcGVyc29uRmlsdGVyOiAibm9uZSIsCiAgICAgICAgYmFja2dyb3VuZE9wZXJhdGlvbjogImRlc3RpbmF0aW9uLW92ZXIiLAogICAgICAgIGJhY2tncm91bmRGaWx0ZXI6ICJub25lIiwKICAgIH07CiAgICBmdW5jdGlvbiBnZXRCbHVyQ2FudmFzUGFyYW1zKGFtb3VudCkgewogICAgICAgIHN3aXRjaCAoYW1vdW50KSB7CiAgICAgICAgICAgIGNhc2UgInNsaWdodCI6IHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDYW52YXNQYXJhbXMpLCB7IGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDRweCkiLCBjcm9wOiA0IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImhlYXZ5IjogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNhbnZhc1BhcmFtcyksIHsgbWFza0ZpbHRlcjogImJsdXIoOHB4KSIsIGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDE2cHgpIiwgY3JvcDogMTYgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNhbnZhc1BhcmFtcyksIHsgbWFza0ZpbHRlcjogImJsdXIoOHB4KSIsIGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDhweCkiLCBjcm9wOiA4IH0pOwogICAgfQogICAgZnVuY3Rpb24gZ2V0Q2FudmFzUGFyYW1zKHBhcmFtcykgewogICAgICAgIGlmIChwYXJhbXMuYmFja2dyb3VuZEJsdXIpCiAgICAgICAgICAgIHJldHVybiBnZXRCbHVyQ2FudmFzUGFyYW1zKHBhcmFtcy5iYWNrZ3JvdW5kQmx1ci5hbW91bnQpOwogICAgICAgIHJldHVybiBiYXNlQ2FudmFzUGFyYW1zOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlQ2FudmFzRW5naW5lKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBzZXR1cCwgZWZmZWN0Q2FudmFzLCBwYXJhbXMpIHsKICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICBjb25zdCB7IHRmbGl0ZSwgbW9kZWw6IHNlZ21lbnRhdGlvbk1vZGVsLCBpbnB1dEhlaWdodCwgaW5wdXRXaWR0aCwgaW5wdXRNZW1vcnlPZmZzZXQsIG91dHB1dE1lbW9yeU9mZnNldCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwgfSA9IHlpZWxkIGxvYWRTZWdtZW50YXRpb25Nb2RlbChzZXR1cC5zZWdtZW50YXRpb25Nb2RlbElkKTsKICAgICAgICAgICAgbGV0IGNhbnZhc1BhcmFtcyA9IGdldENhbnZhc1BhcmFtcyhwYXJhbXMpOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25DYW52YXMgPSBjcmVhdGVDYW52YXMoaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25DdHggPSBzZWdtZW50YXRpb25DYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CiAgICAgICAgICAgICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25NYXNrID0gbmV3IEltYWdlRGF0YShpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCk7CiAgICAgICAgICAgIGxldCBjdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgbGV0IGJhY2tncm91bmREaW1lbnNpb25zID0geyB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH07CiAgICAgICAgICAgIGNvbnN0IHZpZGVvQXNwZWN0UmF0aW8gPSB2aWRlb1dpZHRoIC8gdmlkZW9IZWlnaHQ7CiAgICAgICAgICAgIGxldCBjcm9wWCA9IDA7CiAgICAgICAgICAgIGxldCBjcm9wWSA9IDA7CiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUNyb3AgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBjcm9wID0gY2FudmFzUGFyYW1zLmNyb3AgfHwgMDsKICAgICAgICAgICAgICAgIGlmIChjcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgY3JvcFggPSB2aWRlb0FzcGVjdFJhdGlvID4gMSA/IE1hdGgucm91bmQoY3JvcCAqIHZpZGVvQXNwZWN0UmF0aW8pIDogY3JvcDsKICAgICAgICAgICAgICAgICAgICBjcm9wWSA9IHZpZGVvQXNwZWN0UmF0aW8gPCAxID8gTWF0aC5yb3VuZChjcm9wIC8gdmlkZW9Bc3BlY3RSYXRpbykgOiBjcm9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY3JvcFggPSAwOwogICAgICAgICAgICAgICAgICAgIGNyb3BZID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdXBkYXRlQ3JvcCgpOwogICAgICAgICAgICBjb25zdCBlZmZlY3RDdHggPSBlZmZlY3RDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGVmZmVjdEN0eCwKICAgICAgICAgICAgICAgIHVwZGF0ZUJhY2tncm91bmRGcmFtZShmcmFtZSwgZGltZW5zaW9ucykgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICBpZiAoZGltZW5zaW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZERpbWVuc2lvbnMgPSBkaW1lbnNpb25zOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtcyh1cGRhdGVkUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgY2FudmFzUGFyYW1zID0gZ2V0Q2FudmFzUGFyYW1zKHVwZGF0ZWRQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNyb3AoKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzRnJhbWUoZnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25DdHguZHJhd0ltYWdlKGZyYW1lLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgMCwgMCwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IHNlZ21lbnRhdGlvbkN0eC5nZXRJbWFnZURhdGEoMCwgMCwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZS5IRUFQRjMyW2lucHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDNdID0gaW1hZ2VEYXRhLmRhdGFbaSAqIDRdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuSEVBUEYzMltpbnB1dE1lbW9yeU9mZnNldCArIGkgKiAzICsgMV0gPSBpbWFnZURhdGEuZGF0YVtpICogNCArIDFdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuSEVBUEYzMltpbnB1dE1lbW9yeU9mZnNldCArIGkgKiAzICsgMl0gPSBpbWFnZURhdGEuZGF0YVtpICogNCArIDJdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuX3J1bkluZmVyZW5jZSgpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50YXRpb25Nb2RlbC50eXBlID09PSBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX0JBQ0tHUk9VTkRfUEVSU09OKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDIgKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gTWF0aC5tYXgoYmFja2dyb3VuZCwgcGVyc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRFeHAgPSBNYXRoLmV4cChiYWNrZ3JvdW5kIC0gc2hpZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uRXhwID0gTWF0aC5leHAocGVyc29uIC0gc2hpZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudGF0aW9uTWFzay5kYXRhW2kgKiA0ICsgM10gPSAoMjU1ICogcGVyc29uRXhwKSAvIChiYWNrZ3JvdW5kRXhwICsgcGVyc29uRXhwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWdtZW50YXRpb25Nb2RlbC50eXBlID09PSBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX1BFUlNPTikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25NYXNrLmRhdGFbaSAqIDQgKyAzXSA9IDI1NSAqIHBlcnNvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25DdHgucHV0SW1hZ2VEYXRhKHNlZ21lbnRhdGlvbk1hc2ssIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBjYW52YXNQYXJhbXMubWFza09wZXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZmlsdGVyID0gY2FudmFzUGFyYW1zLm1hc2tGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmRyYXdJbWFnZShzZWdtZW50YXRpb25DYW52YXMsIDAsIDAsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNhbnZhc1BhcmFtcy5wZXJzb25PcGVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmZpbHRlciA9IGNhbnZhc1BhcmFtcy5wZXJzb25GaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmRyYXdJbWFnZShmcmFtZSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNhbnZhc1BhcmFtcy5iYWNrZ3JvdW5kT3BlcmF0aW9uOwogICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5maWx0ZXIgPSBjYW52YXNQYXJhbXMuYmFja2dyb3VuZEZpbHRlcjsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZHJhd0ltYWdlKGN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUsIGJhY2tncm91bmREaW1lbnNpb25zLngsIGJhY2tncm91bmREaW1lbnNpb25zLnksIGJhY2tncm91bmREaW1lbnNpb25zLndpZHRoLCBiYWNrZ3JvdW5kRGltZW5zaW9ucy5oZWlnaHQsIDAsIDAsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5kcmF3SW1hZ2UoZnJhbWUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY3JvcFggfHwgY3JvcFkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICJzb3VyY2Utb3ZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5maWx0ZXIgPSAibm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5kcmF3SW1hZ2UoZWZmZWN0Q2FudmFzLCBjcm9wWCwgY3JvcFksIHZpZGVvV2lkdGggLSBjcm9wWCAqIDIsIHZpZGVvSGVpZ2h0IC0gY3JvcFkgKiAyLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICB9CgogICAgY29uc3QgZ2xzbCA9IFN0cmluZy5yYXc7CiAgICBmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyKSB7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTsKICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGlmICghZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbGluayBXZWJHTCBwcm9ncmFtOiAke2dsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvZ3JhbTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVBpcGxlbGluZVN0YWdlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyKSB7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV9wb3NpdGlvbiIpOwogICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uQXR0cmlidXRlTG9jYXRpb24pOwogICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBwb3NpdGlvbkJ1ZmZlcik7CiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwb3NpdGlvbkF0dHJpYnV0ZUxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwogICAgICAgIGNvbnN0IHRleENvb3JkQXR0cmlidXRlTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV90ZXhDb29yZCIpOwogICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3JkQXR0cmlidXRlTG9jYXRpb24pOwogICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZEF0dHJpYnV0ZUxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwogICAgICAgIHJldHVybiBwcm9ncmFtOwogICAgfQogICAgZnVuY3Rpb24gY29tcGlsZVNoYWRlcihnbCwgc2hhZGVyVHlwZSwgc2hhZGVyU291cmNlKSB7CiAgICAgICAgY29uc3Qgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwogICAgICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNoYWRlclNvdXJjZSk7CiAgICAgICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpOwogICAgICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyOiAke2dsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKX1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNoYWRlcjsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoZ2wsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBtaW5GaWx0ZXIgPSBnbC5ORUFSRVNULCBtYWdGaWx0ZXIgPSBnbC5ORUFSRVNUKSB7CiAgICAgICAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTsKICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgbWluRmlsdGVyKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgbWFnRmlsdGVyKTsKICAgICAgICBnbC50ZXhTdG9yYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMSwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgIHJldHVybiB0ZXh0dXJlOwogICAgfQoKICAgIGZ1bmN0aW9uIGdlbmVyYXRlT3B0aW1pemVkR2F1c3NpYW5LZXJuZWwoc2lnbWEpIHsKICAgICAgICBjb25zdCBnID0gKHgpID0+IE1hdGguZXhwKC0oeCAqIHgpIC8gKDIgKiBzaWdtYSAqIHNpZ21hKSk7CiAgICAgICAgY29uc3QgbnVtYmVycyA9IFtdOwogICAgICAgIGxldCB4ID0gMDsKICAgICAgICBsZXQgY3VycmVudFN1bSA9IDA7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgY29uc3QgbiA9IGcoeCk7CiAgICAgICAgICAgIGNvbnN0IG5leHRTdW0gPSBjdXJyZW50U3VtICsgKGN1cnJlbnRTdW0gPyBuICogMiA6IG4pOwogICAgICAgICAgICBpZiAoY3VycmVudFN1bSAmJiBuIC8gbmV4dFN1bSA8IDAuMDEgJiYgbnVtYmVycy5sZW5ndGggJSAyKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGN1cnJlbnRTdW0gPSBuZXh0U3VtOwogICAgICAgICAgICBudW1iZXJzLnB1c2gobik7CiAgICAgICAgICAgIHgrKzsKICAgICAgICB9CiAgICAgICAgY29uc3Qgd2VpZ2h0cyA9IG51bWJlcnMubWFwKChuKSA9PiBuIC8gY3VycmVudFN1bSk7CiAgICAgICAgY29uc3Qgb3B0aW1pemVkV2VpZ2h0cyA9IFt3ZWlnaHRzWzBdXTsKICAgICAgICBjb25zdCBvcHRpbWl6ZWRQb3NpdGlvbnMgPSBbMF07CiAgICAgICAgaWYgKHdlaWdodHMubGVuZ3RoID49IDMgJiYgd2VpZ2h0cy5sZW5ndGggJSAyID09PSAxKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgd2VpZ2h0cy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgY29uc3QgdzEgPSB3ZWlnaHRzW2ldOwogICAgICAgICAgICAgICAgY29uc3QgdzIgPSB3ZWlnaHRzW2kgKyAxXTsKICAgICAgICAgICAgICAgIGNvbnN0IHcgPSB3MSArIHcyOwogICAgICAgICAgICAgICAgY29uc3QgcCA9IHcyIC8gKHcxICsgdzIpOwogICAgICAgICAgICAgICAgb3B0aW1pemVkV2VpZ2h0cy5wdXNoKHcpOwogICAgICAgICAgICAgICAgb3B0aW1pemVkUG9zaXRpb25zLnB1c2goaSArIHApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHdlaWdodHM6IG9wdGltaXplZFdlaWdodHMsCiAgICAgICAgICAgIHBvc2l0aW9uczogb3B0aW1pemVkUG9zaXRpb25zLAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBidWlsZEJsdXJQYXNzKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X3BlcnNvbk1hc2s7CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X3dlaWdodFsyMF07CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X29mZnNldFsyMF07CiAgICAgICAgdW5pZm9ybSBpbnQgdV9rc2l6ZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV90ZXhlbFNpemU7CiAgICAgICAgaW4gdmVjMiB2X3RleENvb3JkOwogICAgICAgIG91dCB2ZWM0IG91dENvbG9yOwogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgdmVjNCBjZW50ZXJDb2xvciA9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB2X3RleENvb3JkKTsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICB2ZWM0IGZyYW1lQ29sb3IgPSBjZW50ZXJDb2xvciAqIHVfd2VpZ2h0WzBdICogKDEuMCAtIHBlcnNvbk1hc2spOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHVfa3NpemU7IGkrKykgewogICAgICAgICAgICAgICAgdmVjMiBvZmZzZXQgPSB2ZWMyKHVfb2Zmc2V0W2ldKSAqIHVfdGV4ZWxTaXplOwogICAgICAgICAgICAgICAgdmVjMiB0ZXhDb29yZCA9IHZfdGV4Q29vcmQgKyBvZmZzZXQ7CiAgICAgICAgICAgICAgICBmcmFtZUNvbG9yICs9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB0ZXhDb29yZCkgKiB1X3dlaWdodFtpXSAqCiAgICAgICAgICAgICAgICAgICAgKDEuMCAtIHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSk7CiAgICAgICAgICAgICAgICB0ZXhDb29yZCA9IHZfdGV4Q29vcmQgLSBvZmZzZXQ7CiAgICAgICAgICAgICAgICBmcmFtZUNvbG9yICs9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB0ZXhDb29yZCkgKiB1X3dlaWdodFtpXSAqCiAgICAgICAgICAgICAgICAgICAgKDEuMCAtIHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KGZyYW1lQ29sb3IucmdiICsgKDEuMCAtIGZyYW1lQ29sb3IuYSkgKiBjZW50ZXJDb2xvci5yZ2IsIDEuMCk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3Qgc2NhbGUgPSBwYXJhbXMuYmFja2dyb3VuZFJlc2FtcGxlU2NhbGUgfHwgMC4yOwogICAgICAgIGNvbnN0IGJsdXJyZWRCYWNrZ3JvdW5kV2lkdGggPSBNYXRoLnJvdW5kKG91dHB1dFdpZHRoICogc2NhbGUpOwogICAgICAgIGNvbnN0IGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0ID0gTWF0aC5yb3VuZChvdXRwdXRIZWlnaHQgKiBzY2FsZSk7CiAgICAgICAgY29uc3QgdGV4ZWxXaWR0aCA9IDEgLyBibHVycmVkQmFja2dyb3VuZFdpZHRoOwogICAgICAgIGNvbnN0IHRleGVsSGVpZ2h0ID0gMSAvIGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0OwogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudFNoYWRlclNvdXJjZSk7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVBpcGxlbGluZVN0YWdlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyKTsKICAgICAgICBjb25zdCBpbnB1dEZyYW1lTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW5wdXRGcmFtZSIpOwogICAgICAgIGNvbnN0IHBlcnNvbk1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9wZXJzb25NYXNrIik7CiAgICAgICAgY29uc3QgdGV4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfdGV4ZWxTaXplIik7CiAgICAgICAgY29uc3Qgd2VpZ2h0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfd2VpZ2h0Iik7CiAgICAgICAgY29uc3Qgb2Zmc2V0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfb2Zmc2V0Iik7CiAgICAgICAgY29uc3Qga2VybmVsc2l6ZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2tzaXplIik7CiAgICAgICAgY29uc3QgdGV4dHVyZTEgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgYmx1cnJlZEJhY2tncm91bmRXaWR0aCwgYmx1cnJlZEJhY2tncm91bmRIZWlnaHQsIGdsLk5FQVJFU1QsIGdsLkxJTkVBUik7CiAgICAgICAgY29uc3QgdGV4dHVyZTIgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgYmx1cnJlZEJhY2tncm91bmRXaWR0aCwgYmx1cnJlZEJhY2tncm91bmRIZWlnaHQsIGdsLk5FQVJFU1QsIGdsLkxJTkVBUik7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIxID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSwgMCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMiwgMCk7CiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICBnbC51bmlmb3JtMWkocGVyc29uTWFza0xvY2F0aW9uLCAxKTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVLZXJuZWwoa2VybmVsID0gIjV4NSIpIHsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgaWYgKGtlcm5lbCA9PT0gIjl4OSIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDUpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWzAuMjI3MDI3MDI3LCAwLjE5NDU5NDU5NDYsIDAuMTIxNjIxNjIxNiwgMC4wNTQwNTQwNTQxLCAwLjAxNjIxNjIxNjJdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMCwgMi4wLCAzLjAsIDQuMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbCA9PT0gIjl4OW8iKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjI3MzQzNzUsIDAuMzI4MTI1LCAwLjAzNTE1NjI1XSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KG9mZnNldExvY2F0aW9uLCBbMC4wLCAxLjMzMzMzMzMzMzMzMzMzMzMsIDMuMTExMTExMTExMTExMTExXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2VybmVsID09PSAiN3g3IikgewogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGtlcm5lbHNpemVMb2NhdGlvbiwgNCk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KHdlaWdodExvY2F0aW9uLCBbMC4zMTI1LCAwLjIzNDM3NSwgMC4wOTM3NSwgMC4wMTU2MjVdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMCwgMi4wLCAzLjBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwgPT09ICI1eDUiKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjM3MTUsIDAuMjUsIDAuMDYyNV0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAuMCwgMS4wLCAyLjBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwgPT09ICIzeDMiKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAyKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjUsIDAuMjVdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbCA9PT0gIjEwMW8iKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCA2KTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFsKICAgICAgICAgICAgICAgICAgICAwLjA4MjQ5MzAwNzc3NzUwNzcsIDAuMTU3MDg1MTAxNTM3MTA5MywgMC4xMjkwOTI5OTc0ODk2MTYwNiwgMC4wOTA2MTY1NzgxMDc5NzA3NSwKICAgICAgICAgICAgICAgICAgICAwLjA1NDI3MTI3MTgyNTEwMDQ0LCAwLjAyNzY4NzU0NzE1MTQ0OTU0NCwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAsIDEuNDg1MTQ4NTE0ODUxNDg1MSwgMy40NjUzNDY1MzQ2NTM0NjUzLCA1LjQ0NTU0NDU1NDQ1NTQ0NiwgNy40MjU3NDI1NzQyNTc0MjYsIDkuNDA1OTQwNTk0MDU5NDA1XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2VybmVsID09PSAiMTcxbyIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDcpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWwogICAgICAgICAgICAgICAgICAgIDAuMDY0NjUyMTgwMDU4MTExODUsIDAuMTI1NTk3MzU4NjEzMjkyNywgMC4xMTE4MDYwMjQ1NDY5NzA5OSwgMC4wOTA2NzM0NTcyNjk5NjEwNywKICAgICAgICAgICAgICAgICAgICAwLjA2Njk3NzEyMTMxMjA3OTcxLCAwLjA0NTA0NjQyNjcxODk2NDI1LCAwLjAyNzU3MzUyMTUwOTY3NTI3OCwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWwogICAgICAgICAgICAgICAgICAgIDAsIDEuNDkxMjI4MDcwMTc1NDM4OCwgMy40Nzk1MzIxNjM3NDI2OTA0LCA1LjQ2NzgzNjI1NzMwOTk0MTUsIDcuNDU2MTQwMzUwODc3MTkzLCA5LjQ0NDQ0NDQ0NDQ0NDQ0NSwKICAgICAgICAgICAgICAgICAgICAxMS40MzI3NDg1MzgwMTE2OTYsCiAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwuc3RhcnRzV2l0aCgib2ciKSkgewogICAgICAgICAgICAgICAgY29uc3QgcyA9IHBhcnNlRmxvYXQoa2VybmVsLnN1YnN0cmluZygyKSk7CiAgICAgICAgICAgICAgICBjb25zdCB7IHdlaWdodHMsIHBvc2l0aW9ucyB9ID0gZ2VuZXJhdGVPcHRpbWl6ZWRHYXVzc2lhbktlcm5lbChzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIHdlaWdodHMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIHdlaWdodHMpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgcG9zaXRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgbnVtUGFzc2VzID0gMTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIHVwZGF0ZUtlcm5lbChwYXJhbXMua2VybmVsKTsKICAgICAgICAgICAgbnVtUGFzc2VzID0gcGFyYW1zLm51bVBhc3NlcyB8fCAxOwogICAgICAgIH0KICAgICAgICB1cGRhdGVQYXJhbXMocGFyYW1zKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIGJsdXJyZWRCYWNrZ3JvdW5kV2lkdGgsIGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGlucHV0RnJhbWVMb2NhdGlvbiwgMCk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUGFzc2VzOyBpKyspIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgMCwgdGV4ZWxIZWlnaHQpOwogICAgICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcjEpOwogICAgICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUyKTsKICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUxKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShpbnB1dEZyYW1lTG9jYXRpb24sIDIpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTJmKHRleGVsU2l6ZUxvY2F0aW9uLCB0ZXhlbFdpZHRoLCAwKTsKICAgICAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIyKTsKICAgICAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZTIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMik7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZTIpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKHRleHR1cmUxKTsKICAgICAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkQmxlbmRQYXNzKGdsLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIGluIHZlYzIgYV9wb3NpdGlvbjsKICAgICAgICBpbiB2ZWMyIGFfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzIgdl90ZXhDb29yZDsKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIC8vIEZsaXBwaW5nIFkgaXMgcmVxdWlyZWQgd2hlbiByZW5kZXJpbmcgdG8gY2FudmFzCiAgICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChhX3Bvc2l0aW9uICogdmVjMigxLjAsIC0xLjApLCAwLjAsIDEuMCk7CiAgICAgICAgICAgIHZfdGV4Q29vcmQgPSBhX3RleENvb3JkOwogICAgICAgIH1gOwogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X3BlcnNvbk1hc2s7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9ibHVycmVkSW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV9jb3ZlcmFnZTsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICB2ZWMzIGNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgdmVjMyBibHVycmVkQ29sb3IgPSB0ZXh0dXJlKHVfYmx1cnJlZElucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICBwZXJzb25NYXNrID0gc21vb3Roc3RlcCh1X2NvdmVyYWdlLngsIHVfY292ZXJhZ2UueSwgcGVyc29uTWFzayk7CiAgICAgICAgICAgIG91dENvbG9yID0gdmVjNChtaXgoYmx1cnJlZENvbG9yLCBjb2xvciwgcGVyc29uTWFzayksIDEuMCk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpOwogICAgICAgIGNvbnN0IHByb2dyYW0gPSBjcmVhdGVQaXBsZWxpbmVTdGFnZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgY29uc3QgaW5wdXRGcmFtZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2lucHV0RnJhbWUiKTsKICAgICAgICBjb25zdCBwZXJzb25NYXNrTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGVyc29uTWFzayIpOwogICAgICAgIGNvbnN0IGJsdXJyZWRJbnB1dEZyYW1lID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JsdXJyZWRJbnB1dEZyYW1lIik7CiAgICAgICAgY29uc3QgY292ZXJhZ2VMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9jb3ZlcmFnZSIpOwogICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgZ2wudW5pZm9ybTFpKGlucHV0RnJhbWVMb2NhdGlvbiwgMCk7CiAgICAgICAgZ2wudW5pZm9ybTFpKHBlcnNvbk1hc2tMb2NhdGlvbiwgMSk7CiAgICAgICAgZ2wudW5pZm9ybTFpKGJsdXJyZWRJbnB1dEZyYW1lLCAyKTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGNvbnN0IGNvdmVyYWdlID0gcGFyYW1zLmNvdmVyYWdlIHx8IFswLCAxXTsKICAgICAgICAgICAgZ2wudW5pZm9ybTJmKGNvdmVyYWdlTG9jYXRpb24sIGNvdmVyYWdlWzBdLCBjb3ZlcmFnZVsxXSk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVBhcmFtcyhwYXJhbXMpOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkQmFja2dyb3VuZEJsdXJTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBwYXJhbXMpIHsKICAgICAgICBsZXQgYmx1clBhc3MgPSBidWlsZEJsdXJQYXNzKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcyk7CiAgICAgICAgY29uc3QgYmxlbmRQYXNzID0gYnVpbGRCbGVuZFBhc3MoZ2wsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgICAgIGJsdXJQYXNzLnJlbmRlcigpOwogICAgICAgICAgICBibGVuZFBhc3MucmVuZGVyKCk7CiAgICAgICAgfQogICAgICAgIGxldCBjdXJyZW50UmVzYW1wbGVTY2FsZSA9IHBhcmFtcy5iYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIGlmIChjdXJyZW50UmVzYW1wbGVTY2FsZSAhPT0gcGFyYW1zLmJhY2tncm91bmRSZXNhbXBsZVNjYWxlKSB7CiAgICAgICAgICAgICAgICBibHVyUGFzcy5jbGVhblVwKCk7CiAgICAgICAgICAgICAgICBibHVyUGFzcyA9IGJ1aWxkQmx1clBhc3MoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBwZXJzb25NYXNrVGV4dHVyZSwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRSZXNhbXBsZVNjYWxlID0gcGFyYW1zLmJhY2tncm91bmRSZXNhbXBsZVNjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJsdXJQYXNzLnVwZGF0ZVBhcmFtcyhwYXJhbXMpOwogICAgICAgICAgICBibGVuZFBhc3MudXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGJsZW5kUGFzcy5jbGVhblVwKCk7CiAgICAgICAgICAgIGJsdXJQYXNzLmNsZWFuVXAoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZEJhY2tncm91bmRJbWFnZVN0YWdlKGdsLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBiYWNrZ3JvdW5kSW1hZ2UsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHVuaWZvcm0gdmVjMiB1X2JhY2tncm91bmRTY2FsZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV9iYWNrZ3JvdW5kT2Zmc2V0OwogICAgICAgIGluIHZlYzIgYV9wb3NpdGlvbjsKICAgICAgICBpbiB2ZWMyIGFfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzIgdl90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjMiB2X2JhY2tncm91bmRDb29yZDsKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIC8vIEZsaXBwaW5nIFkgZm9yIGNhbnZhcwogICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoYV9wb3NpdGlvbiAqIHZlYzIoMS4wLCAtMS4wKSwgMC4wLCAxLjApOwogICAgICAgICAgICB2X3RleENvb3JkID0gYV90ZXhDb29yZDsKICAgICAgICAgICAgdl9iYWNrZ3JvdW5kQ29vcmQgPSBhX3RleENvb3JkICogdV9iYWNrZ3JvdW5kU2NhbGUgKyB1X2JhY2tncm91bmRPZmZzZXQ7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9pbnB1dEZyYW1lOwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfcGVyc29uTWFzazsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2JhY2tncm91bmQ7CiAgICAgICAgdW5pZm9ybSB2ZWMyIHVfY292ZXJhZ2U7CiAgICAgICAgaW4gdmVjMiB2X3RleENvb3JkOwogICAgICAgIGluIHZlYzIgdl9iYWNrZ3JvdW5kQ29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CgogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgdmVjMyBmcmFtZUNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgdmVjMyBiYWNrZ3JvdW5kQ29sb3IgPSB0ZXh0dXJlKHVfYmFja2dyb3VuZCwgdl9iYWNrZ3JvdW5kQ29vcmQpLnJnYjsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICBwZXJzb25NYXNrID0gc21vb3Roc3RlcCh1X2NvdmVyYWdlLngsIHVfY292ZXJhZ2UueSwgcGVyc29uTWFzayk7CiAgICAgICAgICAgIG91dENvbG9yID0gdmVjNChmcmFtZUNvbG9yICogcGVyc29uTWFzayArIGJhY2tncm91bmRDb2xvciAqICgxLjAgLSBwZXJzb25NYXNrKSwgMS4wKTsKICAgICAgICB9YDsKICAgICAgICBjb25zdCBvdXRwdXRSYXRpbyA9IG91dHB1dFdpZHRoIC8gb3V0cHV0SGVpZ2h0OwogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLlZFUlRFWF9TSEFERVIsIHZlcnRleFNoYWRlclNvdXJjZSk7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRTY2FsZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JhY2tncm91bmRTY2FsZSIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRPZmZzZXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9iYWNrZ3JvdW5kT2Zmc2V0Iik7CiAgICAgICAgY29uc3QgaW5wdXRGcmFtZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2lucHV0RnJhbWUiKTsKICAgICAgICBjb25zdCBwZXJzb25NYXNrTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGVyc29uTWFzayIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9iYWNrZ3JvdW5kIik7CiAgICAgICAgY29uc3QgY292ZXJhZ2VMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9jb3ZlcmFnZSIpOwogICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgZ2wudW5pZm9ybTJmKGJhY2tncm91bmRTY2FsZUxvY2F0aW9uLCAxLCAxKTsKICAgICAgICBnbC51bmlmb3JtMmYoYmFja2dyb3VuZE9mZnNldExvY2F0aW9uLCAwLCAwKTsKICAgICAgICBnbC51bmlmb3JtMWkoaW5wdXRGcmFtZUxvY2F0aW9uLCAwKTsKICAgICAgICBnbC51bmlmb3JtMWkocGVyc29uTWFza0xvY2F0aW9uLCAxKTsKICAgICAgICBsZXQgYmFja2dyb3VuZFRleHR1cmUgPSBudWxsOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kVGV4dHVyZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMik7CiAgICAgICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBiYWNrZ3JvdW5kVGV4dHVyZSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoYmFja2dyb3VuZExvY2F0aW9uLCAyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpOwogICAgICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCA0KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpIHsKICAgICAgICAgICAgY29uc3Qgc291cmNlV2lkdGggPSBiYWNrZ3JvdW5kSW1hZ2UubmF0dXJhbFdpZHRoIHx8IGJhY2tncm91bmRJbWFnZS52aWRlb1dpZHRoIHx8IGJhY2tncm91bmRJbWFnZS53aWR0aDsKICAgICAgICAgICAgY29uc3Qgc291cmNlSGVpZ2h0ID0gYmFja2dyb3VuZEltYWdlLm5hdHVyYWxIZWlnaHQgfHwgYmFja2dyb3VuZEltYWdlLnZpZGVvSGVpZ2h0IHx8IGJhY2tncm91bmRJbWFnZS5oZWlnaHQ7CiAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgZ2wuUkdCQTgsIHNvdXJjZVdpZHRoLCBzb3VyY2VIZWlnaHQsIGdsLkxJTkVBUiwgZ2wuTElORUFSKTsKICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBzb3VyY2VXaWR0aCwgc291cmNlSGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICBsZXQgeE9mZnNldCA9IDA7CiAgICAgICAgICAgIGxldCB5T2Zmc2V0ID0gMDsKICAgICAgICAgICAgbGV0IGJhY2tncm91bmRXaWR0aCA9IHNvdXJjZVdpZHRoOwogICAgICAgICAgICBsZXQgYmFja2dyb3VuZEhlaWdodCA9IHNvdXJjZUhlaWdodDsKICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZFJhdGlvID0gYmFja2dyb3VuZFdpZHRoIC8gYmFja2dyb3VuZEhlaWdodDsKICAgICAgICAgICAgaWYgKGJhY2tncm91bmRSYXRpbyA8IG91dHB1dFJhdGlvKSB7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSGVpZ2h0ID0gYmFja2dyb3VuZFdpZHRoIC8gb3V0cHV0UmF0aW87CiAgICAgICAgICAgICAgICB5T2Zmc2V0ID0gKHNvdXJjZUhlaWdodCAtIGJhY2tncm91bmRIZWlnaHQpIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmRXaWR0aCA9IGJhY2tncm91bmRIZWlnaHQgKiBvdXRwdXRSYXRpbzsKICAgICAgICAgICAgICAgIHhPZmZzZXQgPSAoc291cmNlV2lkdGggLSBiYWNrZ3JvdW5kV2lkdGgpIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB4U2NhbGUgPSBiYWNrZ3JvdW5kV2lkdGggLyBzb3VyY2VXaWR0aDsKICAgICAgICAgICAgY29uc3QgeVNjYWxlID0gYmFja2dyb3VuZEhlaWdodCAvIHNvdXJjZUhlaWdodDsKICAgICAgICAgICAgeE9mZnNldCAvPSBzb3VyY2VXaWR0aDsKICAgICAgICAgICAgeU9mZnNldCAvPSBzb3VyY2VIZWlnaHQ7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZihiYWNrZ3JvdW5kU2NhbGVMb2NhdGlvbiwgeFNjYWxlLCB5U2NhbGUpOwogICAgICAgICAgICBnbC51bmlmb3JtMmYoYmFja2dyb3VuZE9mZnNldExvY2F0aW9uLCB4T2Zmc2V0LCB5T2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQmFja2dyb3VuZEltYWdlKGJhY2tncm91bmRJbWFnZSwgcmVJbml0KSB7CiAgICAgICAgICAgIGlmIChyZUluaXQpIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJhY2tncm91bmRJbWFnZSkgewogICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmRUZXh0dXJlKQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYmFja2dyb3VuZFRleHR1cmUpIHsKICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGJhY2tncm91bmRUZXh0dXJlKTsKICAgICAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgYmFja2dyb3VuZEltYWdlLm5hdHVyYWxXaWR0aCB8fCBiYWNrZ3JvdW5kSW1hZ2UudmlkZW9XaWR0aCB8fCBiYWNrZ3JvdW5kSW1hZ2Uud2lkdGgsIGJhY2tncm91bmRJbWFnZS5uYXR1cmFsSGVpZ2h0IHx8IGJhY2tncm91bmRJbWFnZS52aWRlb0hlaWdodCB8fCBiYWNrZ3JvdW5kSW1hZ2UuaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgY29uc3QgY292ZXJhZ2UgPSBwYXJhbXMuY292ZXJhZ2UgfHwgWzAsIDFdOwogICAgICAgICAgICBnbC51bmlmb3JtMmYoY292ZXJhZ2VMb2NhdGlvbiwgY292ZXJhZ2VbMF0sIGNvdmVyYWdlWzFdKTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgaWYgKGJhY2tncm91bmRJbWFnZSkKICAgICAgICAgICAgaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoYmFja2dyb3VuZFRleHR1cmUpOwogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgICAgIHVwZGF0ZUJhY2tncm91bmRJbWFnZSwKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1aWxkSW1wcm92ZU1hc2tTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBpbXByb3ZlZE1hc2tUZXh0dXJlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KSB7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9wZXJzb25NYXNrOwogICAgICAgIHVuaWZvcm0gdmVjMiB1X3RleGVsU2l6ZTsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CiAgICAgICAgY29uc3QgZmxvYXQgb2Zmc2V0WzNdID0gZmxvYXRbXSgwLjAsIDEuMCwgMi4wKTsKICAgICAgICBjb25zdCBmbG9hdCB3ZWlnaHRbM10gPSBmbG9hdFtdKDAuMzg3NzQsIDAuMjQ0NzcsIDAuMDYxMzYpOwogICAgICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIGZsb2F0IGJsdXJyZWRBbHBoYSA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hICogd2VpZ2h0WzBdOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDM7IGkrKykgewogICAgICAgICAgICAgICAgdmVjMiBvZmZzZXQgPSB2ZWMyKG9mZnNldFtpXSkgKiB1X3RleGVsU2l6ZTsKICAgICAgICAgICAgICAgIHZlYzIgdGV4Q29vcmQgPSB2X3RleENvb3JkICsgb2Zmc2V0OwogICAgICAgICAgICAgICAgYmx1cnJlZEFscGhhICs9IHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSAqIHdlaWdodFtpXTsKICAgICAgICAgICAgICAgIHRleENvb3JkID0gdl90ZXhDb29yZCAtIG9mZnNldDsKICAgICAgICAgICAgICAgIGJsdXJyZWRBbHBoYSArPSB0ZXh0dXJlKHVfcGVyc29uTWFzaywgdGV4Q29vcmQpLmEgKiB3ZWlnaHRbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KDAsMCwwLGJsdXJyZWRBbHBoYSk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgdGV4ZWxXaWR0aCA9IDEgLyBvdXRwdXRXaWR0aDsKICAgICAgICBjb25zdCB0ZXhlbEhlaWdodCA9IDEgLyBvdXRwdXRIZWlnaHQ7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IHBlcnNvbk1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9wZXJzb25NYXNrIik7CiAgICAgICAgY29uc3QgdGV4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfdGV4ZWxTaXplIik7CiAgICAgICAgY29uc3QgdGV4dHVyZTEgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuTkVBUkVTVCwgZ2wuTkVBUkVTVCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIxID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSwgMCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBpbXByb3ZlZE1hc2tUZXh0dXJlLCAwKTsKICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGdsLnVuaWZvcm0xaShwZXJzb25NYXNrTG9jYXRpb24sIDEpOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgMCwgdGV4ZWxIZWlnaHQpOwogICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSk7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgdGV4ZWxXaWR0aCwgMCk7CiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIyKTsKICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMik7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZTEpOwogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyByZW5kZXIsIGNsZWFuVXAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZFRGTGl0ZU91dHB1dFRvTWFza1N0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgb3V0cHV0VGV4dHVyZSwgdGZsaXRlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBvdXRwdXRNZW1vcnlPZmZzZXQpIHsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2lucHV0U2VnbWVudGF0aW9uOwoKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CgogICAgICAgIGZsb2F0IGdldE1hc2sodmVjMiBzZWdtZW50YXRpb24pIHsKICAgICAgICAgICAgZmxvYXQgc2hpZnQgPSBtYXgoc2VnbWVudGF0aW9uLnIsIHNlZ21lbnRhdGlvbi5nKTsKICAgICAgICAgICAgZmxvYXQgYmFja2dyb3VuZEV4cCA9IGV4cChzZWdtZW50YXRpb24uciAtIHNoaWZ0KTsKICAgICAgICAgICAgZmxvYXQgcGVyc29uRXhwID0gZXhwKHNlZ21lbnRhdGlvbi5nIC0gc2hpZnQpOwogICAgICAgICAgICByZXR1cm4gcGVyc29uRXhwIC8gKGJhY2tncm91bmRFeHAgKyBwZXJzb25FeHApOwogICAgICAgIH0KCiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICBmbG9hdCBtYXNrID0gZ2V0TWFzayh0ZXh0dXJlKHVfaW5wdXRTZWdtZW50YXRpb24sIHZfdGV4Q29vcmQpLnJnKTsKICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KHZlYzMoMC4wKSwgbWFzayk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGlucHV0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW5wdXRTZWdtZW50YXRpb24iKTsKICAgICAgICBjb25zdCBpbnB1dFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SRzMyRiwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuTkVBUkVTVCwgZ2wuTkVBUkVTVCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIpOwogICAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgb3V0cHV0VGV4dHVyZSwgMCk7CiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICBnbC51bmlmb3JtMWkoaW5wdXRMb2NhdGlvbiwgMSk7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMSk7CiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGlucHV0VGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuUkcsIGdsLkZMT0FULCB0ZmxpdGUuSEVBUEYzMiwgb3V0cHV0TWVtb3J5T2Zmc2V0KTsKICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgICAgICAgICBnbC5kZWxldGVGcmFtZWJ1ZmZlcihmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoaW5wdXRUZXh0dXJlKTsKICAgICAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgcmVuZGVyLCBjbGVhblVwIH07CiAgICB9CgogICAgZnVuY3Rpb24gYnVpbGRURkxpdGVJbnB1dFN0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgdGZsaXRlLCBpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwgaW5wdXRNZW1vcnlPZmZzZXQpIHsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2lucHV0RnJhbWU7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9mbG9hdGx1dDsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X3BpeGVsU2l6ZTsKICAgICAgICBvdXQgdmVjNCBvdXRDb2xvcjsKCiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICBmbG9hdCB4ID0gdl90ZXhDb29yZC54OwogICAgICAgICAgICB2ZWM0IGNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpOwogICAgICAgICAgICBmbG9hdCByID0gbW9kKHggKiB1X3BpeGVsU2l6ZSwgMy4wKTsKICAgICAgICAgICAgZmxvYXQgYyA9IDAuMDsKICAgICAgICAgICAgaWYgKHIgPj0gMi4wICkgYyA9IGNvbG9yLmI7CiAgICAgICAgICAgIGVsc2UgaWYgKHIgPj0gMS4wKSBjID0gY29sb3IuZzsKICAgICAgICAgICAgZWxzZSBjID0gY29sb3IucjsKICAgICAgICAgICAgb3V0Q29sb3IgPSB0ZXh0dXJlKHVfZmxvYXRsdXQsIHZlYzIoYywgMC41KSk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGlucHV0RnJhbWVMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9pbnB1dEZyYW1lIik7CiAgICAgICAgY29uc3QgcGl4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGl4ZWxTaXplIik7CiAgICAgICAgY29uc3QgZmxvYXRsdXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9mbG9hdGx1dCIpOwogICAgICAgIGNvbnN0IG91dHB1dFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgaW5wdXRXaWR0aCAqIDMsIGlucHV0SGVpZ2h0KTsKICAgICAgICBjb25zdCBmcmFtZUJ1ZmZlciA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7CiAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBvdXRwdXRUZXh0dXJlLCAwKTsKICAgICAgICBjb25zdCBvdXRwdXRQaXhlbHMgPSBuZXcgVWludDhBcnJheSh0ZmxpdGUuSEVBUEYzMi5idWZmZXIsIGlucHV0TWVtb3J5T2Zmc2V0ICogNCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCAqIDQgKiAzKTsKICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGdsLnVuaWZvcm0xaShpbnB1dEZyYW1lTG9jYXRpb24sIDApOwogICAgICAgIGdsLnVuaWZvcm0xZihwaXhlbFNpemVMb2NhdGlvbiwgaW5wdXRXaWR0aCAqIDMpOwogICAgICAgIGdsLnVuaWZvcm0xaShmbG9hdGx1dExvY2F0aW9uLCAzKTsKICAgICAgICBjb25zdCBmbG9hdEx1dFRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7CiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmxvYXRMdXRUZXh0dXJlKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgICAgIGNvbnN0IGx1dCA9IG5ldyBGbG9hdDMyQXJyYXkoMjU2KTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKQogICAgICAgICAgICBsdXRbaV0gPSBpIC8gMjU2OwogICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgMjU2LCAxLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBuZXcgVWludDhBcnJheShsdXQuYnVmZmVyLCAwLCAyNTYgKiA0KSk7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBpbnB1dFdpZHRoICogMywgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUzKTsKICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmxvYXRMdXRUZXh0dXJlKTsKICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICBnbC5yZWFkUGl4ZWxzKDAsIDAsIGlucHV0V2lkdGggKiAzLCBpbnB1dEhlaWdodCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgb3V0cHV0UGl4ZWxzKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgICAgICAgICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKG91dHB1dFRleHR1cmUpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKGZsb2F0THV0VGV4dHVyZSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHJlbmRlciwgY2xlYW5VcCB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEJsdXJFbmdpbmVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgc3dpdGNoIChwYXJhbXMuYW1vdW50KSB7CiAgICAgICAgICAgIGNhc2UgInNsaWdodCI6IHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsga2VybmVsOiAib2c1IiwgbnVtUGFzc2VzOiAxLCBiYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTogMSB9LCBwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImhlYXZ5IjogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBrZXJuZWw6ICJvZzEwIiwgbnVtUGFzc2VzOiAxLCBiYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTogMC41IH0sIHBhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBrZXJuZWw6ICJvZzUiLCBudW1QYXNzZXM6IDEsIGJhY2tncm91bmRSZXNhbXBsZVNjYWxlOiAwLjUgfSwgcGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGdldEVuZ2luZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICBjb25zdCBiYXNlRW5naW5lUGFyYW1zID0gewogICAgICAgICAgICBjb3ZlcmFnZTogcGFyYW1zLmNvdmVyYWdlLAogICAgICAgIH07CiAgICAgICAgaWYgKHBhcmFtcy5iYWNrZ3JvdW5kQmx1cikgewogICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IGJhc2VFbmdpbmVQYXJhbXMgfSwgZ2V0Qmx1ckVuZ2luZVBhcmFtcyhwYXJhbXMuYmFja2dyb3VuZEJsdXIpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2VFbmdpbmVQYXJhbXM7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVXZWJHTEVuZ2luZSh2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgc2V0dXAsIGVmZmVjdENhbnZhcywgcGFyYW1zLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgY29uc3QgeyB0ZmxpdGUsIGlucHV0SGVpZ2h0LCBpbnB1dFdpZHRoLCBpbnB1dE1lbW9yeU9mZnNldCwgb3V0cHV0TWVtb3J5T2Zmc2V0LCBzZWdtZW50YXRpb25QaXhlbENvdW50IH0gPSB5aWVsZCBsb2FkU2VnbWVudGF0aW9uTW9kZWwoc2V0dXAuc2VnbWVudGF0aW9uTW9kZWxJZCk7CiAgICAgICAgICAgIGxldCBlbmdpbmVQYXJhbXMgPSBnZXRFbmdpbmVQYXJhbXMocGFyYW1zKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgaW4gdmVjMiBhX3Bvc2l0aW9uOwogICAgICAgIGluIHZlYzIgYV90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjMiB2X3RleENvb3JkOwogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFfcG9zaXRpb24sIDAuMCwgMS4wKTsKICAgICAgICAgICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7CiAgICAgICAgfWA7CiAgICAgICAgICAgIGNvbnN0IGdsID0gZWZmZWN0Q2FudmFzLmdldENvbnRleHQoIndlYmdsMiIsIHNldHVwLndlYmdsQ29udGV4dFNldHRpbmdzKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4QXJyYXkgPSBnbC5jcmVhdGVWZXJ0ZXhBcnJheSgpOwogICAgICAgICAgICBnbC5iaW5kVmVydGV4QXJyYXkodmVydGV4QXJyYXkpOwogICAgICAgICAgICBjb25zdCBwb3NpdGlvbkJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpOwogICAgICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgcG9zaXRpb25CdWZmZXIpOwogICAgICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShbLTEsIC0xLCAxLjAsIC0xLCAtMSwgMS4wLCAxLjAsIDEuMF0pLCBnbC5TVEFUSUNfRFJBVyk7CiAgICAgICAgICAgIGNvbnN0IHRleENvb3JkQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CiAgICAgICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCwgMS4wLCAxLjAsIDEuMF0pLCBnbC5TVEFUSUNfRFJBVyk7CiAgICAgICAgICAgIGNvbnN0IGlucHV0RnJhbWVUZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBpbnB1dEZyYW1lVGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpOwogICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICAgICAgICAgIGNvbnN0IG1hc2tUZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgZ2wuUkdCQTgsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0KTsKICAgICAgICAgICAgY29uc3QgaW1wcm92ZWRNYXNrV2lkdGggPSBpbnB1dFdpZHRoOwogICAgICAgICAgICBjb25zdCBpbXByb3ZlZE1hc2tIZWlnaHQgPSBpbnB1dEhlaWdodDsKICAgICAgICAgICAgY29uc3QgaW1wcm92ZWRNYXNrVGV4dHVyZSA9IGNyZWF0ZVRleHR1cmUoZ2wsIGdsLlJHQkE4LCBpbXByb3ZlZE1hc2tXaWR0aCwgaW1wcm92ZWRNYXNrSGVpZ2h0LCBnbC5MSU5FQVIsIGdsLkxJTkVBUik7CiAgICAgICAgICAgIGNvbnN0IHRmbGl0ZUlucHV0U3RhZ2UgPSBidWlsZFRGTGl0ZUlucHV0U3RhZ2UoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCB0ZmxpdGUsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBzZWdtZW50YXRpb25QaXhlbENvdW50LCBpbnB1dE1lbW9yeU9mZnNldCk7CiAgICAgICAgICAgIGNvbnN0IHRmbGl0ZU91dHB1dFRvTWFza1N0YWdlID0gYnVpbGRURkxpdGVPdXRwdXRUb01hc2tTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIG1hc2tUZXh0dXJlLCB0ZmxpdGUsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBvdXRwdXRNZW1vcnlPZmZzZXQpOwogICAgICAgICAgICBjb25zdCBpbXByb3ZlTWFza1N0YWdlID0gYnVpbGRJbXByb3ZlTWFza1N0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgbWFza1RleHR1cmUsIGltcHJvdmVkTWFza1RleHR1cmUsIGltcHJvdmVkTWFza1dpZHRoLCBpbXByb3ZlZE1hc2tIZWlnaHQpOwogICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQmx1clN0YWdlID0gYnVpbGRCYWNrZ3JvdW5kQmx1clN0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgaW1wcm92ZWRNYXNrVGV4dHVyZSwgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIGVuZ2luZVBhcmFtcyk7CiAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRJbWFnZVN0YWdlID0gYnVpbGRCYWNrZ3JvdW5kSW1hZ2VTdGFnZShnbCwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBpbXByb3ZlZE1hc2tUZXh0dXJlLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGVmZmVjdEN0eDogZ2wsCiAgICAgICAgICAgICAgICB1cGRhdGVCYWNrZ3JvdW5kRnJhbWUoZnJhbWUsIF8sIHJlSW5pdCkgewogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZVN0YWdlLnVwZGF0ZUJhY2tncm91bmRJbWFnZShmcmFtZSwgcmVJbml0KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1cGRhdGVQYXJhbXModXBkYXRlZFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHVwZGF0ZWRQYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgZW5naW5lUGFyYW1zID0gZ2V0RW5naW5lUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEJsdXJTdGFnZS51cGRhdGVQYXJhbXMoZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2VTdGFnZS51cGRhdGVQYXJhbXMoZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzRnJhbWUoZnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpOwogICAgICAgICAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTApOwogICAgICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGlucHV0RnJhbWVUZXh0dXJlKTsKICAgICAgICAgICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGZyYW1lKTsKICAgICAgICAgICAgICAgICAgICBnbC5iaW5kVmVydGV4QXJyYXkodmVydGV4QXJyYXkpOwogICAgICAgICAgICAgICAgICAgIHRmbGl0ZUlucHV0U3RhZ2UucmVuZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgdGZsaXRlLl9ydW5JbmZlcmVuY2UoKTsKICAgICAgICAgICAgICAgICAgICB0ZmxpdGVPdXRwdXRUb01hc2tTdGFnZS5yZW5kZXIoKTsKICAgICAgICAgICAgICAgICAgICBpbXByb3ZlTWFza1N0YWdlLnJlbmRlcigpOwogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5iYWNrZ3JvdW5kVXJsID8gYmFja2dyb3VuZEltYWdlU3RhZ2UucmVuZGVyKCkgOiBiYWNrZ3JvdW5kQmx1clN0YWdlLnJlbmRlcigpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRCbHVyU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIGltcHJvdmVNYXNrU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIHRmbGl0ZU91dHB1dFRvTWFza1N0YWdlLmNsZWFuVXAoKTsKICAgICAgICAgICAgICAgICAgICB0ZmxpdGVJbnB1dFN0YWdlLmNsZWFuVXAoKTsKICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKGltcHJvdmVkTWFza1RleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUobWFza1RleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoaW5wdXRGcmFtZVRleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZUJ1ZmZlcih0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlQnVmZmVyKHBvc2l0aW9uQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVWZXJ0ZXhBcnJheSh2ZXJ0ZXhBcnJheSk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlY29kZUJhc2U2NChiYXNlNjQsIGVuYWJsZVVuaWNvZGUpIHsKICAgICAgICB2YXIgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjQpOwogICAgICAgIHJldHVybiBiaW5hcnlTdHJpbmc7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlVVJMKGJhc2U2NCwgc291cmNlbWFwQXJnLCBlbmFibGVVbmljb2RlQXJnKSB7CiAgICAgICAgdmFyIHNvdXJjZSA9IGRlY29kZUJhc2U2NChiYXNlNjQpOwogICAgICAgIHZhciBzdGFydCA9IHNvdXJjZS5pbmRleE9mKCdcbicsIDEwKSArIDE7CiAgICAgICAgdmFyIGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0KSArICgnJyk7CiAgICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbYm9keV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnIH0pOwogICAgICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2U2NFdvcmtlckZhY3RvcnkoYmFzZTY0LCBzb3VyY2VtYXBBcmcsIGVuYWJsZVVuaWNvZGVBcmcpIHsKICAgICAgICB2YXIgdXJsOwogICAgICAgIHJldHVybiBmdW5jdGlvbiBXb3JrZXJGYWN0b3J5KG9wdGlvbnMpIHsKICAgICAgICAgICAgdXJsID0gdXJsIHx8IGNyZWF0ZVVSTChiYXNlNjQpOwogICAgICAgICAgICByZXR1cm4gbmV3IFdvcmtlcih1cmwsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICB9CgogICAgdmFyIFdvcmtlckZhY3RvcnkgPSAvKiNfX1BVUkVfXyovY3JlYXRlQmFzZTY0V29ya2VyRmFjdG9yeSgnTHlvZ2NtOXNiSFZ3TFhCc2RXZHBiaTEzWldJdGQyOXlhMlZ5TFd4dllXUmxjaUFxTHdvb1puVnVZM1JwYjI0Z0tDa2dld29nSUNBZ0ozVnpaU0J6ZEhKcFkzUW5Pd29LSUNBZ0lHeGxkQ0IwYVcxbGNpQTlJRzUxYkd3N0NpQWdJQ0J2Ym0xbGMzTmhaMlVnUFNCbWRXNWpkR2x2YmlBb2NtVnhkV1Z6ZENrZ2V3b2dJQ0FnSUNBZ0lHTnZibk4wSUhScGJXVWdQU0J5WlhGMVpYTjBMbVJoZEdFN0NpQWdJQ0FnSUNBZ2FXWWdLSFJwYldVZ1BqMGdNQ2tLSUNBZ0lDQWdJQ0FnSUNBZ2RHbHRaWElnUFNCelpYUlVhVzFsYjNWMEtDZ3BJRDArSUhCdmMzUk5aWE56WVdkbEtDSWlLU3dnZEdsdFpTazdDaUFnSUNBZ0lDQWdaV3h6WlNCcFppQW9kR2x0WlhJcENpQWdJQ0FnSUNBZ0lDQWdJR05zWldGeVZHbHRaVzkxZENoMGFXMWxjaWs3Q2lBZ0lDQjlPd29LZlNrb0tUc0tMeThqSUhOdmRYSmpaVTFoY0hCcGJtZFZVa3c5ZEdsdFpYSXVkMjl5YTJWeUxtcHpMbTFoY0FvSycpOwogICAgLyogZXNsaW50LWVuYWJsZSAqLwoKICAgIGNsYXNzIFByb2Nlc3NvciBleHRlbmRzIGV2ZW50c0V4cG9ydHMuRXZlbnRFbWl0dGVyIHsKICAgICAgICBjb25zdHJ1Y3Rvcih7IHNldHVwLCBwYXJhbXMsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBlbWl0IH0pIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5zZXR1cCA9IHNldHVwOwogICAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgICAgICAgICAgdGhpcy52aWRlb1dpZHRoID0gdmlkZW9XaWR0aDsKICAgICAgICAgICAgdGhpcy52aWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwogICAgICAgICAgICBpZiAoZW1pdCkKICAgICAgICAgICAgICAgIHRoaXMuZW1pdCA9IGVtaXQ7CiAgICAgICAgfQogICAgICAgIHNldHVwRW5naW5lKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBlZmZlY3RDYW52YXMsIGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICAgIHRoaXMudmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7CiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7CiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvQXNwZWN0UmF0aW8gPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgICAgdGhpcy5lZmZlY3RDYW52YXMgPSBlZmZlY3RDYW52YXMgfHwgY3JlYXRlQ2FudmFzKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVFbmdpbmUgPSB0aGlzLnNldHVwLnVzZVdlYkdMID8gY3JlYXRlV2ViR0xFbmdpbmUgOiBjcmVhdGVDYW52YXNFbmdpbmU7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZSA9IHlpZWxkIGNyZWF0ZUVuZ2luZSh0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQsIHRoaXMuc2V0dXAsIHRoaXMuZWZmZWN0Q2FudmFzLCB0aGlzLnBhcmFtcywgaW5pdGlhbEJhY2tncm91bmRGcmFtZSk7CiAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdEN0eCA9IHRoaXMuZW5naW5lLmVmZmVjdEN0eDsKICAgICAgICAgICAgICAgIGlmIChpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCYWNrZ3JvdW5kRnJhbWUoeyBmcmFtZTogaW5pdGlhbEJhY2tncm91bmRGcmFtZSB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVZpZGVvU2l6ZShfYSkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiogKHsgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQgfSkgewogICAgICAgICAgICAgICAgY29uc3Qgb2xkQmFja2dyb3VuZEZyYW1lID0gdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lOwogICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgICAgIGNvbnN0IG9sZEVuZ2luZSA9IHRoaXMuZW5naW5lOwogICAgICAgICAgICAgICAgeWllbGQgdGhpcy5zZXR1cEVuZ2luZSh2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgdGhpcy5lZmZlY3RDYW52YXMsIG9sZEJhY2tncm91bmRGcmFtZSk7CiAgICAgICAgICAgICAgICBvbGRFbmdpbmUuZGlzcG9zZSgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaW5pdChfYSkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiogKHsgaW5pdGlhbEJhY2tncm91bmRGcmFtZSwgdXNlSW5zZXJ0YWJsZVN0cmVhbXMsIGVmZmVjdENhbnZhcyB9KSB7CiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLnNldHVwRW5naW5lKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCwgZWZmZWN0Q2FudmFzLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lKTsKICAgICAgICAgICAgICAgIGlmICh1c2VJbnNlcnRhYmxlU3RyZWFtcykgewogICAgICAgICAgICAgICAgICAgIGxldCBkcm9wRmlyc3QgPSA1OwogICAgICAgICAgICAgICAgICAgIGxldCBsb2NhbFN0YXJ0VGltZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgbGV0IGZyYW1lU3RhcnRUaW1lID0gMDsKICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RGcmFtZVJlbmRlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lciA9IG5ldyBUcmFuc2Zvcm1TdHJlYW0oewogICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IChmcmFtZSwgY29udHJvbGxlcikgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250cm9sbGVyID0gY29udHJvbGxlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lVGltZXN0YW1wID0gZnJhbWUudGltZXN0YW1wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxvY2FsU3RhcnRUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdGFydFRpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFydFRpbWUgPSBmcmFtZVRpbWVzdGFtcCAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkRnJhbWVUaW1lID0gZnJhbWVUaW1lc3RhbXAgLyAxMDAwIC0gZnJhbWVTdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkTG9jYWxUaW1lID0gbm93IC0gbG9jYWxTdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcEZpcnN0ID4gMCB8fCBlbGFwc2VkTG9jYWxUaW1lIDwgZWxhcHNlZEZyYW1lVGltZSArIDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FuZFJlbmRlckZyYW1lKGZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc1ZpZGVvQmFja2dyb3VuZCAmJiB0aGlzLnNldHVwLnRyYW5zZmVyVHlwZSAhPT0gImNhbnZhcyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJnZXRiYWNrZ3JvdW5kZnJhbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wRmlyc3QgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcEZpcnN0LS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdGFydFRpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFydFRpbWUgPSBmcmFtZVRpbWVzdGFtcCAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFZpZGVvRnJhbWUodGhpcy5lZmZlY3RDYW52YXMsIHsgdGltZXN0YW1wOiBmcmFtZVRpbWVzdGFtcCB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0RnJhbWVSZW5kZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RnJhbWVSZW5kZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJmaXJzdGZyYW1lcmVuZGVyZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5zZXR1cC51c2VCYWNrZ3JvdW5kV29ya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlciA9IG5ldyBXb3JrZXJGYWN0b3J5KCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlci5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoIm91dHB1dCIsIHsgZnJhbWU6IHRoaXMuY3VycmVudE91dHB1dEZyYW1lIH0sIFt0aGlzLmN1cnJlbnRPdXRwdXRGcmFtZV0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJyZWFkeSIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlUGFyYW1zKHsgcGFyYW1zLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lIH0pIHsKICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CiAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZUN0eCA9IG51bGw7CiAgICAgICAgICAgIGlmIChpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJhY2tncm91bmRGcmFtZSh7IGZyYW1lOiBpbml0aWFsQmFja2dyb3VuZEZyYW1lLCByZUluaXQ6IHRydWUgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS51cGRhdGVCYWNrZ3JvdW5kRnJhbWUobnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5lbmdpbmUudXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZUJhY2tncm91bmRGcmFtZSh7IGZyYW1lLCByZUluaXQgfSkgewogICAgICAgICAgICBsZXQgdXBkYXRlZERpbWVuc2lvbnM7CiAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICB0aGlzLmhhc1ZpZGVvQmFja2dyb3VuZCA9IHRoaXMucGFyYW1zLmJhY2tncm91bmRVcmwgJiYgdGhpcy5wYXJhbXMuYmFja2dyb3VuZFR5cGUgPT09ICJ2aWRlbyI7CiAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucyA9IHsgeDogMCwgeTogMCwgd2lkdGg6IHRoaXMudmlkZW9XaWR0aCwgaGVpZ2h0OiB0aGlzLnZpZGVvSGVpZ2h0IH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNldHVwLnRyYW5zZmVyVHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAiaW1hZ2ViaXRtYXAiOiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gZnJhbWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWRhdGEiOiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gY3JlYXRlQ2FudmFzKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZUN0eCA9IHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZS5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGZyYW1lKSwgdGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWVDdHgucHV0SW1hZ2VEYXRhKGZyYW1lLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgImNhbnZhcyI6IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy53aWR0aCA9IGZyYW1lLnZpZGVvV2lkdGggfHwgZnJhbWUubmF0dXJhbFdpZHRoIHx8IGZyYW1lLndpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQgPSBmcmFtZS52aWRlb0hlaWdodCB8fCBmcmFtZS5uYXR1cmFsSGVpZ2h0IHx8IGZyYW1lLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZEFzcGVjdFJhdGlvID0gdXBkYXRlZERpbWVuc2lvbnMud2lkdGggLyB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kQXNwZWN0UmF0aW8gPiB0aGlzLnZpZGVvQXNwZWN0UmF0aW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHNpZGVYID0gdXBkYXRlZERpbWVuc2lvbnMud2lkdGggLSB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQgKiB0aGlzLnZpZGVvQXNwZWN0UmF0aW87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy53aWR0aCAtPSBvdXRzaWRlWDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zLnggPSBNYXRoLmZsb29yKG91dHNpZGVYIC8gMik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYmFja2dyb3VuZEFzcGVjdFJhdGlvIDwgdGhpcy52aWRlb0FzcGVjdFJhdGlvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRzaWRlWSA9IHVwZGF0ZWREaW1lbnNpb25zLmhlaWdodCAtIHVwZGF0ZWREaW1lbnNpb25zLndpZHRoIC8gdGhpcy52aWRlb0FzcGVjdFJhdGlvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERpbWVuc2lvbnMuaGVpZ2h0IC09IG91dHNpZGVZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERpbWVuc2lvbnMueSA9IE1hdGguZmxvb3Iob3V0c2lkZVkgLyAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmVuZ2luZS51cGRhdGVCYWNrZ3JvdW5kRnJhbWUodGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lLCB1cGRhdGVkRGltZW5zaW9ucywgcmVJbml0KTsKICAgICAgICB9CiAgICAgICAgdGVybWluYXRlKCkgewogICAgICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm1Db250cm9sbGVyKQogICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250cm9sbGVyLnRlcm1pbmF0ZSgpOwogICAgICAgICAgICBpZiAodGhpcy50aW1lcldvcmtlcikKICAgICAgICAgICAgICAgIHRoaXMudGltZXJXb3JrZXIudGVybWluYXRlKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmVuZ2luZSkgewogICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUuZGlzcG9zZSgpOwogICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmF0ZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLmVtaXQoInRlcm1pbmF0ZWQiKTsKICAgICAgICB9CiAgICAgICAgc3RhcnQoeyBpbnB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtIH0pIHsKICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtKQogICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0ucGlwZVRocm91Z2godGhpcy50cmFuc2Zvcm1lcikucGlwZVRvKG91dHB1dFN0cmVhbSk7CiAgICAgICAgICAgIHRoaXMuZnJhbWVDb3VudGVyID0gMDsKICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXJUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgfQogICAgICAgIGlucHV0KF9hKSB7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgYXJndW1lbnRzLCB2b2lkIDAsIGZ1bmN0aW9uKiAoeyB2aWRlb0ZyYW1lLCBiYWNrZ3JvdW5kRnJhbWUsIHJlcXVlc3RUaW1lLCBsYXN0UmVuZGVyVGltZSwgZGVsYXkgfSkgewogICAgICAgICAgICAgICAgdmFyIF9iOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmF0ZWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgY29uc3QgcnR0ID0gKERhdGUubm93KCkgLSByZXF1ZXN0VGltZSkgKiAyOwogICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVGltZSA9IGxhc3RSZW5kZXJUaW1lICsgZGVsYXkgLSBydHQ7CiAgICAgICAgICAgICAgICBpZiAoYmFja2dyb3VuZEZyYW1lKQogICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQmFja2dyb3VuZEZyYW1lKHsgZnJhbWU6IGJhY2tncm91bmRGcmFtZSB9KTsKICAgICAgICAgICAgICAgIGxldCBmcmFtZTsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zZXR1cC50cmFuc2ZlclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWJpdG1hcCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgKF9iID0gdGhpcy5wcmV2VmlkZW9GcmFtZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJldlZpZGVvRnJhbWUgPSB2aWRlb0ZyYW1lOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBbmRSZW5kZXJGcmFtZSh2aWRlb0ZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB5aWVsZCBjcmVhdGVJbWFnZUJpdG1hcCh0aGlzLmVmZmVjdENhbnZhcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWRhdGEiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUgPSBuZXcgSW1hZ2VEYXRhKG5ldyBVaW50OENsYW1wZWRBcnJheSh2aWRlb0ZyYW1lKSwgdGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlucHV0Q2FudmFzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q2FudmFzID0gY3JlYXRlQ2FudmFzKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q2FudmFzQ3R4ID0gdGhpcy5pbnB1dENhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDYW52YXNDdHgucHV0SW1hZ2VEYXRhKHZpZGVvRnJhbWUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBbmRSZW5kZXJGcmFtZSh0aGlzLmlucHV0Q2FudmFzKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB0aGlzLmVmZmVjdEN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KS5kYXRhLmJ1ZmZlcjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhc2UgImNhbnZhcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQW5kUmVuZGVyRnJhbWUodmlkZW9GcmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lID0gdGhpcy5lZmZlY3RDYW52YXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuRGVsYXkgPSBNYXRoLm1heCgwLCByZXR1cm5UaW1lIC0gRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy50aW1lcldvcmtlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE91dHB1dEZyYW1lID0gZnJhbWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlci5wb3N0TWVzc2FnZShyZXR1cm5EZWxheSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJvdXRwdXQiLCB7IGZyYW1lIH0sIFtmcmFtZV0pOwogICAgICAgICAgICAgICAgICAgIH0sIHJldHVybkRlbGF5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHByb2Nlc3NBbmRSZW5kZXJGcmFtZShmcmFtZSkgewogICAgICAgICAgICB0aGlzLmVuZ2luZS5wcm9jZXNzRnJhbWUoZnJhbWUpOwogICAgICAgICAgICBpZiAodGhpcy5zZXR1cC5sb2dUb0NvbnNvbGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVDb3VudGVyKys7CiAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICAgICAgICAgIGlmIChub3cgLSB0aGlzLmZyYW1lQ291bnRlclRpbWUgPiAxMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJ1bm5pbmcgY2FtZXJhIGVmZmVjdHMsICR7TWF0aC5yb3VuZCgodGhpcy5mcmFtZUNvdW50ZXIgKiAxMDAwKSAvIChub3cgLSB0aGlzLmZyYW1lQ291bnRlclRpbWUpKX0gZnBzYCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXIgPSAwOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVDb3VudGVyVGltZSA9IG5vdzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBjb25zdCBwcm9jZXNzb3JzID0ge307CiAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiAocmVxdWVzdCkgewogICAgICAgIHZhciBfYTsKICAgICAgICBjb25zdCBwcm9jZXNzb3JJZCA9IHJlcXVlc3QuZGF0YS5wcm9jZXNzb3JJZDsKICAgICAgICBpZiAocmVxdWVzdC5kYXRhLnR5cGUgPT09ICJjcmVhdGUiKSB7CiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NvciA9IG5ldyBQcm9jZXNzb3IoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXF1ZXN0LmRhdGEpLCB7IGVtaXQ6ICh0eXBlLCBkYXRhLCB0cmFuc2ZlcikgPT4gcG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbih7IHByb2Nlc3NvcklkLCB0eXBlIH0sIGRhdGEpLCB0cmFuc2ZlcikgfSkpOwogICAgICAgICAgICBwcm9jZXNzb3JzW3Byb2Nlc3NvcklkXSA9IHByb2Nlc3NvcjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIChfYSA9IHByb2Nlc3NvcnNbcHJvY2Vzc29ySWRdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbcmVxdWVzdC5kYXRhLnR5cGVdKHJlcXVlc3QuZGF0YSk7CiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmRhdGEudHlwZSA9PT0gInRlcm1pbmF0ZSIpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBwcm9jZXNzb3JzW3Byb2Nlc3NvcklkXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgY29uc3QgY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSA9IChmdW5jdGlvbiAoKSB7CiAgICAgICAgbGV0IF9zY3JpcHREaXIgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgPyBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyA6IHVuZGVmaW5lZDsKICAgICAgICBpZiAodHlwZW9mIF9fZmlsZW5hbWUgIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICBfc2NyaXB0RGlyID0gX3NjcmlwdERpciB8fCBfX2ZpbGVuYW1lOwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSkgewogICAgICAgICAgICBjcmVhdGVURkxpdGVTSU1ETW9kdWxlID0gY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSB8fCB7fTsKICAgICAgICAgICAgdmFyIE1vZHVsZSA9IHR5cGVvZiBjcmVhdGVURkxpdGVTSU1ETW9kdWxlICE9PSAidW5kZWZpbmVkIiA/IGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUgOiB7fTsKICAgICAgICAgICAgdmFyIHJlYWR5UHJvbWlzZVJlc29sdmUsIHJlYWR5UHJvbWlzZVJlamVjdDsKICAgICAgICAgICAgTW9kdWxlWyJyZWFkeSJdID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QgPSByZWplY3Q7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgbW9kdWxlT3ZlcnJpZGVzID0ge307CiAgICAgICAgICAgIHZhciBrZXk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIE1vZHVsZSkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlT3ZlcnJpZGVzW2tleV0gPSBNb2R1bGVba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGhpc1Byb2dyYW0gPSAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB2YXIgcXVpdF8gPSBmdW5jdGlvbiAoc3RhdHVzLCB0b1Rocm93KSB7CiAgICAgICAgICAgICAgICB0aHJvdyB0b1Rocm93OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV0VCID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX05PREUgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1NIRUxMID0gZmFsc2U7CiAgICAgICAgICAgIEVOVklST05NRU5UX0lTX1dFQiA9IHR5cGVvZiB3aW5kb3cgPT09ICJvYmplY3QiOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSB0eXBlb2YgaW1wb3J0U2NyaXB0cyA9PT0gImZ1bmN0aW9uIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfTk9ERSA9CiAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2VzcyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlID09PSAic3RyaW5nIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSAhRU5WSVJPTk1FTlRfSVNfV0VCICYmICFFTlZJUk9OTUVOVF9JU19OT0RFICYmICFFTlZJUk9OTUVOVF9JU19XT1JLRVI7CiAgICAgICAgICAgIHZhciBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgZnVuY3Rpb24gbG9jYXRlRmlsZShwYXRoKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJsb2NhdGVGaWxlIl0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHREaXJlY3RvcnkgKyBwYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZWFkXywgcmVhZEFzeW5jLCByZWFkQmluYXJ5OwogICAgICAgICAgICB2YXIgbm9kZUZTOwogICAgICAgICAgICB2YXIgbm9kZVBhdGg7CiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gcmVxdWlyZSgicGF0aCIpLmRpcm5hbWUoc2NyaXB0RGlyZWN0b3J5KSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9fZGlybmFtZSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmaWxlbmFtZSwgYmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlRlMpCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVGUyA9IHJlcXVpcmUoImZzIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlUGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVBhdGggPSByZXF1aXJlKCJwYXRoIik7CiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlUGF0aFsibm9ybWFsaXplIl0oZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlRlNbInJlYWRGaWxlU3luYyJdKGZpbGVuYW1lLCBiaW5hcnkgPyBudWxsIDogInV0ZjgiKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmaWxlbmFtZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSByZWFkXyhmaWxlbmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQuYnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBVaW50OEFycmF5KHJldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzWyJhcmd2Il0ubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gcHJvY2Vzc1siYXJndiJdWzFdLnJlcGxhY2UoL1xcL2csICIvIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmNhdWdodEV4Y2VwdGlvbiIsIGZ1bmN0aW9uIChleCkgewogICAgICAgICAgICAgICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmhhbmRsZWRSZWplY3Rpb24iLCBhYm9ydCk7CiAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzWyJleGl0Il0oc3RhdHVzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBNb2R1bGVbImluc3BlY3QiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoRU5WSVJPTk1FTlRfSVNfU0hFTEwpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhZCAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkKGYpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkYnVmZmVyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZWFkYnVmZmVyKGYpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlYWQoZiwgImJpbmFyeSIpOwogICAgICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NyaXB0QXJncyAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdEFyZ3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHF1aXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcXVpdChzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByaW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyA9IHByaW50OwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiA9IGNvbnNvbGUuZXJyb3IgPSB0eXBlb2YgcHJpbnRFcnIgIT09ICJ1bmRlZmluZWQiID8gcHJpbnRFcnIgOiBwcmludDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2VsZi5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0KSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoX3NjcmlwdERpcikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9zY3JpcHREaXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0RGlyZWN0b3J5LmluZGV4T2YoImJsb2I6IikgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsIHNjcmlwdERpcmVjdG9yeS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZWFkXyA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEJpbmFyeSA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVhZEFzeW5jID0gZnVuY3Rpb24gKHVybCwgb25sb2FkLCBvbmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwIHx8ICh4aHIuc3RhdHVzID09IDAgJiYgeGhyLnJlc3BvbnNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZCh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSBvbmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgOwogICAgICAgICAgICB2YXIgb3V0ID0gTW9kdWxlWyJwcmludCJdIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIHZhciBlcnIgPSBNb2R1bGVbInByaW50RXJyIl0gfHwgY29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIG1vZHVsZU92ZXJyaWRlcykgewogICAgICAgICAgICAgICAgaWYgKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlW2tleV0gPSBtb2R1bGVPdmVycmlkZXNba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBtb2R1bGVPdmVycmlkZXMgPSBudWxsOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJhcmd1bWVudHMiXSkKICAgICAgICAgICAgICAgIE1vZHVsZVsiYXJndW1lbnRzIl07CiAgICAgICAgICAgIGlmIChNb2R1bGVbInRoaXNQcm9ncmFtIl0pCiAgICAgICAgICAgICAgICB0aGlzUHJvZ3JhbSA9IE1vZHVsZVsidGhpc1Byb2dyYW0iXTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsicXVpdCJdKQogICAgICAgICAgICAgICAgcXVpdF8gPSBNb2R1bGVbInF1aXQiXTsKICAgICAgICAgICAgdmFyIHdhc21CaW5hcnk7CiAgICAgICAgICAgIGlmIChNb2R1bGVbIndhc21CaW5hcnkiXSkKICAgICAgICAgICAgICAgIHdhc21CaW5hcnkgPSBNb2R1bGVbIndhc21CaW5hcnkiXTsKICAgICAgICAgICAgTW9kdWxlWyJub0V4aXRSdW50aW1lIl0gfHwgdHJ1ZTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBXZWJBc3NlbWJseSAhPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHdhc21NZW1vcnk7CiAgICAgICAgICAgIHZhciBBQk9SVCA9IGZhbHNlOwogICAgICAgICAgICBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCB0ZXh0KSB7CiAgICAgICAgICAgICAgICBpZiAoIWNvbmRpdGlvbikgewogICAgICAgICAgICAgICAgICAgIGFib3J0KCJBc3NlcnRpb24gZmFpbGVkOiAiICsgdGV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFVURjhEZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyICE9PSAidW5kZWZpbmVkIiA/IG5ldyBUZXh0RGVjb2RlcigidXRmOCIpIDogdW5kZWZpbmVkOwogICAgICAgICAgICBmdW5jdGlvbiBVVEY4QXJyYXlUb1N0cmluZyhoZWFwLCBpZHgsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICB2YXIgZW5kSWR4ID0gaWR4ICsgbWF4Qnl0ZXNUb1JlYWQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICAgICAgICAgICAgd2hpbGUgKGhlYXBbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKQogICAgICAgICAgICAgICAgICAgICsrZW5kUHRyOwogICAgICAgICAgICAgICAgaWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXAuc3ViYXJyYXkgJiYgVVRGOERlY29kZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVVRGOERlY29kZXIuZGVjb2RlKGhlYXAuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSAiIjsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4IDwgZW5kUHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MCA9IGhlYXBbaWR4KytdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh1MCAmIDEyOCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MSA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyMjQpID09IDE5MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKCh1MCAmIDMxKSA8PCA2KSB8IHUxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MiA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyNDApID09IDIyNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgMTUpIDw8IDEyKSB8ICh1MSA8PCA2KSB8IHUyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgNykgPDwgMTgpIHwgKHUxIDw8IDEyKSB8ICh1MiA8PCA2KSB8IChoZWFwW2lkeCsrXSAmIDYzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodTAgPCA2NTUzNikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gdTAgLSA2NTUzNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2IHwgKGNoID4+IDEwKSwgNTYzMjAgfCAoY2ggJiAxMDIzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIFVURjhUb1N0cmluZyhwdHIsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHRyID8gVVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LCBwdHIsIG1heEJ5dGVzVG9SZWFkKSA6ICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHdyaXRlQXNjaWlUb01lbW9yeShzdHIsIGJ1ZmZlciwgZG9udEFkZE51bGwpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgSEVBUDhbYnVmZmVyKysgPj4gMF0gPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVA4W2J1ZmZlciA+PiAwXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWxpZ25VcCh4LCBtdWx0aXBsZSkgewogICAgICAgICAgICAgICAgaWYgKHggJSBtdWx0aXBsZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICB4ICs9IG11bHRpcGxlIC0gKHggJSBtdWx0aXBsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYnVmZmVyLCBIRUFQOCwgSEVBUFU4LCBIRUFQMzI7CiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1ZikgewogICAgICAgICAgICAgICAgYnVmZmVyID0gYnVmOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQOCJdID0gSEVBUDggPSBuZXcgSW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVAxNiJdID0gbmV3IEludDE2QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUDMyIl0gPSBIRUFQMzIgPSBuZXcgSW50MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTgiXSA9IEhFQVBVOCA9IG5ldyBVaW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVMTYiXSA9IG5ldyBVaW50MTZBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTMyIl0gPSBuZXcgVWludDMyQXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUEYzMiJdID0gbmV3IEZsb2F0MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjY0Il0gPSBuZXcgRmxvYXQ2NEFycmF5KGJ1Zik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJJTklUSUFMX01FTU9SWSJdIHx8IDE2Nzc3MjE2OwogICAgICAgICAgICB2YXIgd2FzbVRhYmxlOwogICAgICAgICAgICB2YXIgX19BVFBSRVJVTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUSU5JVF9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUTUFJTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUUE9TVFJVTl9fID0gW107CiAgICAgICAgICAgIF9fQVRJTklUX18ucHVzaCh7CiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgX19fd2FzbV9jYWxsX2N0b3JzKCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZnVuY3Rpb24gcHJlUnVuKCkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsicHJlUnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlUnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVSdW4iXSA9IFtNb2R1bGVbInByZVJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25QcmVSdW4oTW9kdWxlWyJwcmVSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRSdW50aW1lKCkgewogICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcHJlTWFpbigpIHsKICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHBvc3RSdW4oKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJwb3N0UnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicG9zdFJ1biJdID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicG9zdFJ1biJdID0gW01vZHVsZVsicG9zdFJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwb3N0UnVuIl0ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUE9TVFJVTl9fKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhZGRPblByZVJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBSRVJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUG9zdFJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBPU1RSVU5fXy51bnNoaWZ0KGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcnVuRGVwZW5kZW5jaWVzID0gMDsKICAgICAgICAgICAgdmFyIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZFJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcysrOwogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgICAgICAgICAgICBydW5EZXBlbmRlbmNpZXMtLTsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKHJ1bkRlcGVuZGVuY2llcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGRlcGVuZGVuY2llc0Z1bGZpbGxlZDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXSA9IHt9OwogICAgICAgICAgICBNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIGFib3J0KHdoYXQpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm9uQWJvcnQiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsib25BYm9ydCJdKHdoYXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hhdCArPSAiIjsKICAgICAgICAgICAgICAgIGVycih3aGF0KTsKICAgICAgICAgICAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHdoYXQgPSAiYWJvcnQoIiArIHdoYXQgKyAiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iOwogICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHdoYXQpOwogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBoYXNQcmVmaXgoc3RyLCBwcmVmaXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggPyBzdHIuc3RhcnRzV2l0aChwcmVmaXgpIDogc3RyLmluZGV4T2YocHJlZml4KSA9PT0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YVVSSVByZWZpeCA9ICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNEYXRhVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBkYXRhVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZmlsZVVSSVByZWZpeCA9ICJmaWxlOi8vIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNGaWxlVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBmaWxlVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd2FzbUJpbmFyeUZpbGUgPSAidGZsaXRlLXNpbWQud2FzbSI7CiAgICAgICAgICAgIGlmICghaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICAgICAgICAgICAgd2FzbUJpbmFyeUZpbGUgPSBsb2NhdGVGaWxlKHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRCaW5hcnkoZmlsZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PSB3YXNtQmluYXJ5RmlsZSAmJiB3YXNtQmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh3YXNtQmluYXJ5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRCaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBhYm9ydChlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEJpbmFyeVByb21pc2UoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXdhc21CaW5hcnkgJiYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmZXRjaCA9PT0gImZ1bmN0aW9uIiAmJiAhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZVsib2siXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciICsgd2FzbUJpbmFyeUZpbGUgKyAiJyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VbImFycmF5QnVmZmVyIl0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZEFzeW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBc3luYyh3YXNtQmluYXJ5RmlsZSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByZWplY3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVXYXNtKCkgewogICAgICAgICAgICAgICAgdmFyIGluZm8gPSB7IGE6IGFzbUxpYnJhcnlBcmcgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSwgbW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBpbnN0YW5jZS5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsiYXNtIl0gPSBleHBvcnRzOwogICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnkgPSBNb2R1bGVbImFzbSJdWyJxIl07CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZSA9IE1vZHVsZVsiYXNtIl1bIkQiXTsKICAgICAgICAgICAgICAgICAgICByZW1vdmVSdW5EZXBlbmRlbmN5KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhZGRSdW5EZXBlbmRlbmN5KCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKG91dHB1dCkgewogICAgICAgICAgICAgICAgICAgIHJlY2VpdmVJbnN0YW5jZShvdXRwdXRbImluc3RhbmNlIl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnlQcm9taXNlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGJpbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYmluYXJ5LCBpbmZvKTsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZWNlaXZlciwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICBlcnIoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydChyZWFzb24pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdhc21CaW5hcnkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09PSAiZnVuY3Rpb24iICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBmZXRjaCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXNwb25zZSwgaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4ocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKGluZm8sIHJlY2VpdmVJbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlcnIoIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICIgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlQXN5bmMoKS5jYXRjaChyZWFkeVByb21pc2VSZWplY3QpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcykgewogICAgICAgICAgICAgICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGNhbGxiYWNrLmZ1bmM7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5jID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2suYXJnID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZS5nZXQoZnVuYykoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZS5nZXQoZnVuYykoY2FsbGJhY2suYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyhjYWxsYmFjay5hcmcgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjay5hcmcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfYWJvcnQoKSB7CiAgICAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfZW1zY3JpcHRlbl9nZXRfbm93OwogICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkgewogICAgICAgICAgICAgICAgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHByb2Nlc3NbImhydGltZSJdKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbMF0gKiAxZTMgKyB0WzFdIC8gMWU2OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGF0ZU5vdyAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBkYXRlTm93OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljID0gdHJ1ZTsKICAgICAgICAgICAgZnVuY3Rpb24gc2V0RXJyTm8odmFsdWUpIHsKICAgICAgICAgICAgICAgIEhFQVAzMltfX19lcnJub19sb2NhdGlvbigpID4+IDJdID0gdmFsdWU7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Nsb2NrX2dldHRpbWUoY2xrX2lkLCB0cCkgewogICAgICAgICAgICAgICAgdmFyIG5vdzsKICAgICAgICAgICAgICAgIGlmIChjbGtfaWQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBub3cgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoKGNsa19pZCA9PT0gMSB8fCBjbGtfaWQgPT09IDQpICYmIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljKSB7CiAgICAgICAgICAgICAgICAgICAgbm93ID0gX2Vtc2NyaXB0ZW5fZ2V0X25vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2V0RXJyTm8oMjgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVAzMlt0cCA+PiAyXSA9IChub3cgLyAxZTMpIHwgMDsKICAgICAgICAgICAgICAgIEhFQVAzMlsodHAgKyA0KSA+PiAyXSA9ICgobm93ICUgMWUzKSAqIDFlMyAqIDFlMykgfCAwOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Rsb3BlbihmaWxlbmFtZSwgZmxhZykgewogICAgICAgICAgICAgICAgYWJvcnQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9kbHN5bShoYW5kbGUsIHN5bWJvbCkgewogICAgICAgICAgICAgICAgYWJvcnQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX21lbWNweV9iaWcoZGVzdCwgc3JjLCBudW0pIHsKICAgICAgICAgICAgICAgIEhFQVBVOC5jb3B5V2l0aGluKGRlc3QsIHNyYywgc3JjICsgbnVtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9nZXRfaGVhcF9zaXplKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihzaXplKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnkuZ3Jvdygoc2l6ZSAtIGJ1ZmZlci5ieXRlTGVuZ3RoICsgNjU1MzUpID4+PiAxNik7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwKHJlcXVlc3RlZFNpemUpIHsKICAgICAgICAgICAgICAgIHZhciBvbGRTaXplID0gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpOwogICAgICAgICAgICAgICAgdmFyIG1heEhlYXBTaXplID0gMjE0NzQ4MzY0ODsKICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRTaXplID4gbWF4SGVhcFNpemUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBjdXREb3duID0gMTsgY3V0RG93biA8PSA0OyBjdXREb3duICo9IDIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb3Zlckdyb3duSGVhcFNpemUgPSBvbGRTaXplICogKDEgKyAwLjIgLyBjdXREb3duKTsKICAgICAgICAgICAgICAgICAgICBvdmVyR3Jvd25IZWFwU2l6ZSA9IE1hdGgubWluKG92ZXJHcm93bkhlYXBTaXplLCByZXF1ZXN0ZWRTaXplICsgMTAwNjYzMjk2KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U2l6ZSA9IE1hdGgubWluKG1heEhlYXBTaXplLCBhbGlnblVwKE1hdGgubWF4KHJlcXVlc3RlZFNpemUsIG92ZXJHcm93bkhlYXBTaXplKSwgNjU1MzYpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKG5ld1NpemUpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fdGhyZWFkX3NsZWVwKG1zZWNzKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBfZW1zY3JpcHRlbl9nZXRfbm93KCk7CiAgICAgICAgICAgICAgICB3aGlsZSAoX2Vtc2NyaXB0ZW5fZ2V0X25vdygpIC0gc3RhcnQgPCBtc2VjcykgeyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIEVOViA9IHt9OwogICAgICAgICAgICBmdW5jdGlvbiBnZXRFeGVjdXRhYmxlTmFtZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzUHJvZ3JhbSB8fCAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEVudlN0cmluZ3MoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWdldEVudlN0cmluZ3Muc3RyaW5ncykgewogICAgICAgICAgICAgICAgICAgIHZhciBsYW5nID0gKCh0eXBlb2YgbmF2aWdhdG9yID09PSAib2JqZWN0IiAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXNbMF0pIHx8ICJDIikucmVwbGFjZSgiLSIsICJfIikgKyAiLlVURi04IjsKICAgICAgICAgICAgICAgICAgICB2YXIgZW52ID0gewogICAgICAgICAgICAgICAgICAgICAgICBVU0VSOiAid2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBMT0dOQU1FOiAid2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBQQVRIOiAiLyIsCiAgICAgICAgICAgICAgICAgICAgICAgIFBXRDogIi8iLAogICAgICAgICAgICAgICAgICAgICAgICBIT01FOiAiL2hvbWUvd2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBMQU5HOiBsYW5nLAogICAgICAgICAgICAgICAgICAgICAgICBfOiBnZXRFeGVjdXRhYmxlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeCBpbiBFTlYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW52W3hdID0gRU5WW3hdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgc3RyaW5ncyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gZW52KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MucHVzaCh4ICsgIj0iICsgZW52W3hdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0RW52U3RyaW5ncy5zdHJpbmdzID0gc3RyaW5nczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBnZXRFbnZTdHJpbmdzLnN0cmluZ3M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFNZU0NBTExTID0gewogICAgICAgICAgICAgICAgbWFwcGluZ3M6IHt9LAogICAgICAgICAgICAgICAgYnVmZmVyczogW251bGwsIFtdLCBbXV0sCiAgICAgICAgICAgICAgICBwcmludENoYXI6IGZ1bmN0aW9uIChzdHJlYW0sIGN1cnIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gU1lTQ0FMTFMuYnVmZmVyc1tzdHJlYW1dOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyID09PSAwIHx8IGN1cnIgPT09IDEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIChzdHJlYW0gPT09IDEgPyBvdXQgOiBlcnIpKFVURjhBcnJheVRvU3RyaW5nKGJ1ZmZlciwgMCkpOwogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGN1cnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB2YXJhcmdzOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBTWVNDQUxMUy52YXJhcmdzICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IEhFQVAzMlsoU1lTQ0FMTFMudmFyYXJncyAtIDQpID4+IDJdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0U3RyOiBmdW5jdGlvbiAocHRyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IFVURjhUb1N0cmluZyhwdHIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0NjQ6IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG93OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZnVuY3Rpb24gX2Vudmlyb25fZ2V0KF9fZW52aXJvbiwgZW52aXJvbl9idWYpIHsKICAgICAgICAgICAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgICAgICAgICAgIGdldEVudlN0cmluZ3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChzdHJpbmcsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHRyID0gZW52aXJvbl9idWYgKyBidWZTaXplOwogICAgICAgICAgICAgICAgICAgIEhFQVAzMlsoX19lbnZpcm9uICsgaSAqIDQpID4+IDJdID0gcHRyOwogICAgICAgICAgICAgICAgICAgIHdyaXRlQXNjaWlUb01lbW9yeShzdHJpbmcsIHB0cik7CiAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vudmlyb25fc2l6ZXNfZ2V0KHBlbnZpcm9uX2NvdW50LCBwZW52aXJvbl9idWZfc2l6ZSkgewogICAgICAgICAgICAgICAgdmFyIHN0cmluZ3MgPSBnZXRFbnZTdHJpbmdzKCk7CiAgICAgICAgICAgICAgICBIRUFQMzJbcGVudmlyb25fY291bnQgPj4gMl0gPSBzdHJpbmdzLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgICAgICAgICAgIHN0cmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgSEVBUDMyW3BlbnZpcm9uX2J1Zl9zaXplID4+IDJdID0gYnVmU2l6ZTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9leGl0KHN0YXR1cykgewogICAgICAgICAgICAgICAgZXhpdChzdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF9jbG9zZShmZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2ZkX3NlZWsoZmQsIG9mZnNldF9sb3csIG9mZnNldF9oaWdoLCB3aGVuY2UsIG5ld09mZnNldCkgeyB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF93cml0ZShmZCwgaW92LCBpb3ZjbnQsIHBudW0pIHsKICAgICAgICAgICAgICAgIHZhciBudW0gPSAwOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpb3ZjbnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwdHIgPSBIRUFQMzJbKGlvdiArIGkgKiA4KSA+PiAyXTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGVuID0gSEVBUDMyWyhpb3YgKyAoaSAqIDggKyA0KSkgPj4gMl07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBTWVNDQUxMUy5wcmludENoYXIoZmQsIEhFQVBVOFtwdHIgKyBqXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG51bSArPSBsZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIRUFQMzJbcG51bSA+PiAyXSA9IG51bTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9wdGhyZWFkX2NyZWF0ZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9wdGhyZWFkX2pvaW4oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMjg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX3N5c2NvbmYobmFtZSkgewogICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgODU6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXhIZWFwU2l6ZSA9IDIxNDc0ODM2NDg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhIZWFwU2l6ZSAvIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIzNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTUzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjAwODA5OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTYwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTYxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTg0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDc5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDc0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDcwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMjQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIxNDc0ODM2NDc7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0NzgzOTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA5OTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDQ4OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwOTcxNTI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU1MzY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyNzY4OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjc2NzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDc1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTYzODQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDFlMzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzAwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyNTY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1NTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDczOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAib2JqZWN0IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3JbImhhcmR3YXJlQ29uY3VycmVuY3kiXSB8fCAxOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRFcnJObygyOCk7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFzbUxpYnJhcnlBcmcgPSB7CiAgICAgICAgICAgICAgICBhOiBfYWJvcnQsCiAgICAgICAgICAgICAgICBuOiBfY2xvY2tfZ2V0dGltZSwKICAgICAgICAgICAgICAgIGk6IF9kbG9wZW4sCiAgICAgICAgICAgICAgICBlOiBfZGxzeW0sCiAgICAgICAgICAgICAgICBsOiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnLAogICAgICAgICAgICAgICAgbTogX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsCiAgICAgICAgICAgICAgICBvOiBfZW1zY3JpcHRlbl90aHJlYWRfc2xlZXAsCiAgICAgICAgICAgICAgICBwOiBfZW52aXJvbl9nZXQsCiAgICAgICAgICAgICAgICBnOiBfZW52aXJvbl9zaXplc19nZXQsCiAgICAgICAgICAgICAgICBqOiBfZXhpdCwKICAgICAgICAgICAgICAgIGg6IF9mZF9jbG9zZSwKICAgICAgICAgICAgICAgIGs6IF9mZF9zZWVrLAogICAgICAgICAgICAgICAgYzogX2ZkX3dyaXRlLAogICAgICAgICAgICAgICAgZDogX3B0aHJlYWRfY3JlYXRlLAogICAgICAgICAgICAgICAgZjogX3B0aHJlYWRfam9pbiwKICAgICAgICAgICAgICAgIGI6IF9zeXNjb25mLAogICAgICAgICAgICB9OwogICAgICAgICAgICBjcmVhdGVXYXNtKCk7CiAgICAgICAgICAgIHZhciBfX193YXNtX2NhbGxfY3RvcnMgPSAoTW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoX19fd2FzbV9jYWxsX2N0b3JzID0gTW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXSA9IE1vZHVsZVsiYXNtIl1bInIiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCJdID0gTW9kdWxlWyJhc20iXVsicyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0TWVtb3J5T2Zmc2V0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0TWVtb3J5T2Zmc2V0Il0gPSBNb2R1bGVbImFzbSJdWyJ0Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRIZWlnaHQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRIZWlnaHQiXSA9IE1vZHVsZVsiYXNtIl1bInUiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dFdpZHRoIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0V2lkdGgiXSA9IE1vZHVsZVsiYXNtIl1bInYiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dENoYW5uZWxDb3VudCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dENoYW5uZWxDb3VudCJdID0gTW9kdWxlWyJhc20iXVsidyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dE1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQiXSA9IE1vZHVsZVsiYXNtIl1bIngiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRIZWlnaHQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0SGVpZ2h0Il0gPSBNb2R1bGVbImFzbSJdWyJ5Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0V2lkdGgiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0V2lkdGgiXSA9IE1vZHVsZVsiYXNtIl1bInoiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRDaGFubmVsQ291bnQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0Q2hhbm5lbENvdW50Il0gPSBNb2R1bGVbImFzbSJdWyJBIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfbG9hZE1vZGVsIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2xvYWRNb2RlbCJdID0gTW9kdWxlWyJhc20iXVsiQiJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX3J1bkluZmVyZW5jZSJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9ydW5JbmZlcmVuY2UiXSA9IE1vZHVsZVsiYXNtIl1bIkMiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBfX19lcnJub19sb2NhdGlvbiA9IChNb2R1bGVbIl9fX2Vycm5vX2xvY2F0aW9uIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKF9fX2Vycm5vX2xvY2F0aW9uID0gTW9kdWxlWyJfX19lcnJub19sb2NhdGlvbiJdID0gTW9kdWxlWyJhc20iXVsiRSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIGNhbGxlZFJ1bjsKICAgICAgICAgICAgZnVuY3Rpb24gRXhpdFN0YXR1cyhzdGF0dXMpIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9ICJFeGl0U3RhdHVzIjsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9ICJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIgKyBzdGF0dXMgKyAiKSI7CiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBmdW5jdGlvbiBydW5DYWxsZXIoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWNhbGxlZFJ1bikKICAgICAgICAgICAgICAgICAgICBydW4oKTsKICAgICAgICAgICAgICAgIGlmICghY2FsbGVkUnVuKQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IHJ1bkNhbGxlcjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZnVuY3Rpb24gcnVuKGFyZ3MpIHsKICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHJlUnVuKCk7CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRvUnVuKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsZWRSdW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjYWxsZWRSdW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsiY2FsbGVkUnVuIl0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGlmIChBQk9SVCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGluaXRSdW50aW1lKCk7CiAgICAgICAgICAgICAgICAgICAgcHJlTWFpbigpOwogICAgICAgICAgICAgICAgICAgIHJlYWR5UHJvbWlzZVJlc29sdmUoTW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKQogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0oKTsKICAgICAgICAgICAgICAgICAgICBwb3N0UnVuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJzZXRTdGF0dXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsic2V0U3RhdHVzIl0oIlJ1bm5pbmcuLi4iKTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvUnVuKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBkb1J1bigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIE1vZHVsZVsicnVuIl0gPSBydW47CiAgICAgICAgICAgIGZ1bmN0aW9uIGV4aXQoc3RhdHVzLCBpbXBsaWNpdCkgewogICAgICAgICAgICAgICAgcXVpdF8oc3RhdHVzLCBuZXcgRXhpdFN0YXR1cyhzdGF0dXMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoTW9kdWxlWyJwcmVJbml0Il0pIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVJbml0Il0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZUluaXQiXSA9IFtNb2R1bGVbInByZUluaXQiXV07CiAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVJbml0Il0ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicHJlSW5pdCJdLnBvcCgpKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcnVuKCk7CiAgICAgICAgICAgIHJldHVybiBjcmVhdGVURkxpdGVTSU1ETW9kdWxlLnJlYWR5OwogICAgICAgIH07CiAgICB9KSgpOwoKICAgIHZhciB0ZmxpdGVTaW1kID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoewogICAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgICBkZWZhdWx0OiBjcmVhdGVURkxpdGVTSU1ETW9kdWxlCiAgICB9KTsKCiAgICB2YXIgY3JlYXRlVEZMaXRlTW9kdWxlID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3NjcmlwdERpciA9IHR5cGVvZiBkb2N1bWVudCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCA/IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjIDogdW5kZWZpbmVkOwogICAgICAgIGlmICh0eXBlb2YgX19maWxlbmFtZSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIF9zY3JpcHREaXIgPSBfc2NyaXB0RGlyIHx8IF9fZmlsZW5hbWU7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjcmVhdGVURkxpdGVNb2R1bGUpIHsKICAgICAgICAgICAgY3JlYXRlVEZMaXRlTW9kdWxlID0gY3JlYXRlVEZMaXRlTW9kdWxlIHx8IHt9OwogICAgICAgICAgICB2YXIgTW9kdWxlID0gdHlwZW9mIGNyZWF0ZVRGTGl0ZU1vZHVsZSAhPT0gInVuZGVmaW5lZCIgPyBjcmVhdGVURkxpdGVNb2R1bGUgOiB7fTsKICAgICAgICAgICAgdmFyIHJlYWR5UHJvbWlzZVJlc29sdmUsIHJlYWR5UHJvbWlzZVJlamVjdDsKICAgICAgICAgICAgTW9kdWxlWyJyZWFkeSJdID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QgPSByZWplY3Q7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgbW9kdWxlT3ZlcnJpZGVzID0ge307CiAgICAgICAgICAgIHZhciBrZXk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIE1vZHVsZSkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlT3ZlcnJpZGVzW2tleV0gPSBNb2R1bGVba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGhpc1Byb2dyYW0gPSAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB2YXIgcXVpdF8gPSBmdW5jdGlvbiAoc3RhdHVzLCB0b1Rocm93KSB7CiAgICAgICAgICAgICAgICB0aHJvdyB0b1Rocm93OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV0VCID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX05PREUgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1NIRUxMID0gZmFsc2U7CiAgICAgICAgICAgIEVOVklST05NRU5UX0lTX1dFQiA9IHR5cGVvZiB3aW5kb3cgPT09ICJvYmplY3QiOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19XT1JLRVIgPSB0eXBlb2YgaW1wb3J0U2NyaXB0cyA9PT0gImZ1bmN0aW9uIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfTk9ERSA9CiAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2VzcyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyA9PT0gIm9iamVjdCIgJiYKICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlID09PSAic3RyaW5nIjsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSAhRU5WSVJPTk1FTlRfSVNfV0VCICYmICFFTlZJUk9OTUVOVF9JU19OT0RFICYmICFFTlZJUk9OTUVOVF9JU19XT1JLRVI7CiAgICAgICAgICAgIHZhciBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgZnVuY3Rpb24gbG9jYXRlRmlsZShwYXRoKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJsb2NhdGVGaWxlIl0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHREaXJlY3RvcnkgKyBwYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZWFkXywgcmVhZEFzeW5jLCByZWFkQmluYXJ5OwogICAgICAgICAgICB2YXIgbm9kZUZTOwogICAgICAgICAgICB2YXIgbm9kZVBhdGg7CiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gcmVxdWlyZSgicGF0aCIpLmRpcm5hbWUoc2NyaXB0RGlyZWN0b3J5KSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9fZGlybmFtZSArICIvIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmaWxlbmFtZSwgYmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlRlMpCiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVGUyA9IHJlcXVpcmUoImZzIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlUGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVBhdGggPSByZXF1aXJlKCJwYXRoIik7CiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlUGF0aFsibm9ybWFsaXplIl0oZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlRlNbInJlYWRGaWxlU3luYyJdKGZpbGVuYW1lLCBiaW5hcnkgPyBudWxsIDogInV0ZjgiKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmaWxlbmFtZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSByZWFkXyhmaWxlbmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQuYnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBVaW50OEFycmF5KHJldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzWyJhcmd2Il0ubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gcHJvY2Vzc1siYXJndiJdWzFdLnJlcGxhY2UoL1xcL2csICIvIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJhcmd2Il0uc2xpY2UoMik7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmNhdWdodEV4Y2VwdGlvbiIsIGZ1bmN0aW9uIChleCkgewogICAgICAgICAgICAgICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzWyJvbiJdKCJ1bmhhbmRsZWRSZWplY3Rpb24iLCBhYm9ydCk7CiAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzWyJleGl0Il0oc3RhdHVzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBNb2R1bGVbImluc3BlY3QiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoRU5WSVJPTk1FTlRfSVNfU0hFTEwpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhZCAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gc2hlbGxfcmVhZChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkKGYpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gcmVhZEJpbmFyeShmKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkYnVmZmVyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZWFkYnVmZmVyKGYpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlYWQoZiwgImJpbmFyeSIpOwogICAgICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NyaXB0QXJncyAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdEFyZ3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHF1aXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcXVpdChzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByaW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyA9IHByaW50OwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiA9IGNvbnNvbGUuZXJyb3IgPSB0eXBlb2YgcHJpbnRFcnIgIT09ICJ1bmRlZmluZWQiID8gcHJpbnRFcnIgOiBwcmludDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2VsZi5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0KSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoX3NjcmlwdERpcikgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9zY3JpcHREaXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0RGlyZWN0b3J5LmluZGV4T2YoImJsb2I6IikgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzY3JpcHREaXJlY3Rvcnkuc3Vic3RyKDAsIHNjcmlwdERpcmVjdG9yeS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZWFkXyA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEJpbmFyeSA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVhZEFzeW5jID0gZnVuY3Rpb24gKHVybCwgb25sb2FkLCBvbmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwIHx8ICh4aHIuc3RhdHVzID09IDAgJiYgeGhyLnJlc3BvbnNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZCh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSBvbmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgOwogICAgICAgICAgICB2YXIgb3V0ID0gTW9kdWxlWyJwcmludCJdIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIHZhciBlcnIgPSBNb2R1bGVbInByaW50RXJyIl0gfHwgY29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7CiAgICAgICAgICAgIGZvciAoa2V5IGluIG1vZHVsZU92ZXJyaWRlcykgewogICAgICAgICAgICAgICAgaWYgKG1vZHVsZU92ZXJyaWRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlW2tleV0gPSBtb2R1bGVPdmVycmlkZXNba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBtb2R1bGVPdmVycmlkZXMgPSBudWxsOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJhcmd1bWVudHMiXSkKICAgICAgICAgICAgICAgIE1vZHVsZVsiYXJndW1lbnRzIl07CiAgICAgICAgICAgIGlmIChNb2R1bGVbInRoaXNQcm9ncmFtIl0pCiAgICAgICAgICAgICAgICB0aGlzUHJvZ3JhbSA9IE1vZHVsZVsidGhpc1Byb2dyYW0iXTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsicXVpdCJdKQogICAgICAgICAgICAgICAgcXVpdF8gPSBNb2R1bGVbInF1aXQiXTsKICAgICAgICAgICAgdmFyIHdhc21CaW5hcnk7CiAgICAgICAgICAgIGlmIChNb2R1bGVbIndhc21CaW5hcnkiXSkKICAgICAgICAgICAgICAgIHdhc21CaW5hcnkgPSBNb2R1bGVbIndhc21CaW5hcnkiXTsKICAgICAgICAgICAgTW9kdWxlWyJub0V4aXRSdW50aW1lIl0gfHwgdHJ1ZTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBXZWJBc3NlbWJseSAhPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHdhc21NZW1vcnk7CiAgICAgICAgICAgIHZhciBBQk9SVCA9IGZhbHNlOwogICAgICAgICAgICBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCB0ZXh0KSB7CiAgICAgICAgICAgICAgICBpZiAoIWNvbmRpdGlvbikgewogICAgICAgICAgICAgICAgICAgIGFib3J0KCJBc3NlcnRpb24gZmFpbGVkOiAiICsgdGV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFVURjhEZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyICE9PSAidW5kZWZpbmVkIiA/IG5ldyBUZXh0RGVjb2RlcigidXRmOCIpIDogdW5kZWZpbmVkOwogICAgICAgICAgICBmdW5jdGlvbiBVVEY4QXJyYXlUb1N0cmluZyhoZWFwLCBpZHgsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICB2YXIgZW5kSWR4ID0gaWR4ICsgbWF4Qnl0ZXNUb1JlYWQ7CiAgICAgICAgICAgICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICAgICAgICAgICAgd2hpbGUgKGhlYXBbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKQogICAgICAgICAgICAgICAgICAgICsrZW5kUHRyOwogICAgICAgICAgICAgICAgaWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXAuc3ViYXJyYXkgJiYgVVRGOERlY29kZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVVRGOERlY29kZXIuZGVjb2RlKGhlYXAuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSAiIjsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4IDwgZW5kUHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MCA9IGhlYXBbaWR4KytdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh1MCAmIDEyOCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MSA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyMjQpID09IDE5MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKCh1MCAmIDMxKSA8PCA2KSB8IHUxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MiA9IGhlYXBbaWR4KytdICYgNjM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAyNDApID09IDIyNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgMTUpIDw8IDEyKSB8ICh1MSA8PCA2KSB8IHUyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTAgPSAoKHUwICYgNykgPDwgMTgpIHwgKHUxIDw8IDEyKSB8ICh1MiA8PCA2KSB8IChoZWFwW2lkeCsrXSAmIDYzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodTAgPCA2NTUzNikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gdTAgLSA2NTUzNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2IHwgKGNoID4+IDEwKSwgNTYzMjAgfCAoY2ggJiAxMDIzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIFVURjhUb1N0cmluZyhwdHIsIG1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHRyID8gVVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LCBwdHIsIG1heEJ5dGVzVG9SZWFkKSA6ICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHdyaXRlQXNjaWlUb01lbW9yeShzdHIsIGJ1ZmZlciwgZG9udEFkZE51bGwpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgSEVBUDhbYnVmZmVyKysgPj4gMF0gPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVA4W2J1ZmZlciA+PiAwXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWxpZ25VcCh4LCBtdWx0aXBsZSkgewogICAgICAgICAgICAgICAgaWYgKHggJSBtdWx0aXBsZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICB4ICs9IG11bHRpcGxlIC0gKHggJSBtdWx0aXBsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4geDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYnVmZmVyLCBIRUFQOCwgSEVBUFU4LCBIRUFQMzI7CiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKGJ1ZikgewogICAgICAgICAgICAgICAgYnVmZmVyID0gYnVmOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQOCJdID0gSEVBUDggPSBuZXcgSW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVAxNiJdID0gbmV3IEludDE2QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUDMyIl0gPSBIRUFQMzIgPSBuZXcgSW50MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTgiXSA9IEhFQVBVOCA9IG5ldyBVaW50OEFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVMTYiXSA9IG5ldyBVaW50MTZBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQVTMyIl0gPSBuZXcgVWludDMyQXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUEYzMiJdID0gbmV3IEZsb2F0MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjY0Il0gPSBuZXcgRmxvYXQ2NEFycmF5KGJ1Zik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJJTklUSUFMX01FTU9SWSJdIHx8IDE2Nzc3MjE2OwogICAgICAgICAgICB2YXIgd2FzbVRhYmxlOwogICAgICAgICAgICB2YXIgX19BVFBSRVJVTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUSU5JVF9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUTUFJTl9fID0gW107CiAgICAgICAgICAgIHZhciBfX0FUUE9TVFJVTl9fID0gW107CiAgICAgICAgICAgIF9fQVRJTklUX18ucHVzaCh7CiAgICAgICAgICAgICAgICBmdW5jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgX19fd2FzbV9jYWxsX2N0b3JzKCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZnVuY3Rpb24gcHJlUnVuKCkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsicHJlUnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlUnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVSdW4iXSA9IFtNb2R1bGVbInByZVJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25QcmVSdW4oTW9kdWxlWyJwcmVSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRSdW50aW1lKCkgewogICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVElOSVRfXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcHJlTWFpbigpIHsKICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRNQUlOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHBvc3RSdW4oKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJwb3N0UnVuIl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicG9zdFJ1biJdID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicG9zdFJ1biJdID0gW01vZHVsZVsicG9zdFJ1biJdXTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwb3N0UnVuIl0ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUE9TVFJVTl9fKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhZGRPblByZVJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBSRVJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUG9zdFJ1bihjYikgewogICAgICAgICAgICAgICAgX19BVFBPU1RSVU5fXy51bnNoaWZ0KGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcnVuRGVwZW5kZW5jaWVzID0gMDsKICAgICAgICAgICAgdmFyIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZFJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcysrOwogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgICAgICAgICAgICBydW5EZXBlbmRlbmNpZXMtLTsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKHJ1bkRlcGVuZGVuY2llcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGRlcGVuZGVuY2llc0Z1bGZpbGxlZDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJwcmVsb2FkZWRJbWFnZXMiXSA9IHt9OwogICAgICAgICAgICBNb2R1bGVbInByZWxvYWRlZEF1ZGlvcyJdID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIGFib3J0KHdoYXQpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm9uQWJvcnQiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsib25BYm9ydCJdKHdoYXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hhdCArPSAiIjsKICAgICAgICAgICAgICAgIGVycih3aGF0KTsKICAgICAgICAgICAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHdoYXQgPSAiYWJvcnQoIiArIHdoYXQgKyAiKS4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iOwogICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHdoYXQpOwogICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBoYXNQcmVmaXgoc3RyLCBwcmVmaXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggPyBzdHIuc3RhcnRzV2l0aChwcmVmaXgpIDogc3RyLmluZGV4T2YocHJlZml4KSA9PT0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YVVSSVByZWZpeCA9ICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNEYXRhVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBkYXRhVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZmlsZVVSSVByZWZpeCA9ICJmaWxlOi8vIjsKICAgICAgICAgICAgZnVuY3Rpb24gaXNGaWxlVVJJKGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJlZml4KGZpbGVuYW1lLCBmaWxlVVJJUHJlZml4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd2FzbUJpbmFyeUZpbGUgPSAidGZsaXRlLndhc20iOwogICAgICAgICAgICBpZiAoIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkpIHsKICAgICAgICAgICAgICAgIHdhc21CaW5hcnlGaWxlID0gbG9jYXRlRmlsZSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0QmluYXJ5KGZpbGUpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgPT0gd2FzbUJpbmFyeUZpbGUgJiYgd2FzbUJpbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkod2FzbUJpbmFyeSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChyZWFkQmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkQmluYXJ5KGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgYWJvcnQoZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRCaW5hcnlQcm9taXNlKCkgewogICAgICAgICAgICAgICAgaWYgKCF3YXNtQmluYXJ5ICYmIChFTlZJUk9OTUVOVF9JU19XRUIgfHwgRU5WSVJPTk1FTlRfSVNfV09SS0VSKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmV0Y2ggPT09ICJmdW5jdGlvbiIgJiYgIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKHdhc21CaW5hcnlGaWxlLCB7IGNyZWRlbnRpYWxzOiAic2FtZS1vcmlnaW4iIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2VbIm9rIl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAiZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnIiArIHdhc21CaW5hcnlGaWxlICsgIiciOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlWyJhcnJheUJ1ZmZlciJdKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRBc3luYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQXN5bmMod2FzbUJpbmFyeUZpbGUsIGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnkod2FzbUJpbmFyeUZpbGUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gY3JlYXRlV2FzbSgpIHsKICAgICAgICAgICAgICAgIHZhciBpbmZvID0geyBhOiBhc21MaWJyYXJ5QXJnIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZWNlaXZlSW5zdGFuY2UoaW5zdGFuY2UsIG1vZHVsZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBleHBvcnRzID0gaW5zdGFuY2UuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbImFzbSJdID0gZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICB3YXNtTWVtb3J5ID0gTW9kdWxlWyJhc20iXVsicSJdOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICB3YXNtVGFibGUgPSBNb2R1bGVbImFzbSJdWyJEIl07CiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUnVuRGVwZW5kZW5jeSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYWRkUnVuRGVwZW5kZW5jeSgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZShvdXRwdXQpIHsKICAgICAgICAgICAgICAgICAgICByZWNlaXZlSW5zdGFuY2Uob3V0cHV0WyJpbnN0YW5jZSJdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5UHJvbWlzZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChiaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJpbmFyeSwgaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVjZWl2ZXIsIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiAiICsgcmVhc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQocmVhc29uKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlQXN5bmMoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXNtQmluYXJ5ICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyA9PT0gImZ1bmN0aW9uIiAmJgogICAgICAgICAgICAgICAgICAgICAgICAhaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZmV0Y2ggPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKHdhc21CaW5hcnlGaWxlLCB7IGNyZWRlbnRpYWxzOiAic2FtZS1vcmlnaW4iIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcocmVzcG9uc2UsIGluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UsIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiICsgcmVhc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleHBvcnRzID0gTW9kdWxlWyJpbnN0YW50aWF0ZVdhc20iXShpbmZvLCByZWNlaXZlSW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZUFzeW5jKCkuY2F0Y2gocmVhZHlQcm9taXNlUmVqZWN0KTsKICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjYWxsUnVudGltZUNhbGxiYWNrcyhjYWxsYmFja3MpIHsKICAgICAgICAgICAgICAgIHdoaWxlIChjYWxsYmFja3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGNhbGxiYWNrcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhNb2R1bGUpOwogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGZ1bmMgPSBjYWxsYmFjay5mdW5jOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZnVuYyA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmFyZyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNtVGFibGUuZ2V0KGZ1bmMpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNtVGFibGUuZ2V0KGZ1bmMpKGNhbGxiYWNrLmFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMoY2FsbGJhY2suYXJnID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2suYXJnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Fib3J0KCkgewogICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgX2Vtc2NyaXB0ZW5fZ2V0X25vdzsKICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHsKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBwcm9jZXNzWyJocnRpbWUiXSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0WzBdICogMWUzICsgdFsxXSAvIDFlNjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRhdGVOb3cgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBfZW1zY3JpcHRlbl9nZXRfbm93ID0gZGF0ZU5vdzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBfZW1zY3JpcHRlbl9nZXRfbm93ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBfZW1zY3JpcHRlbl9nZXRfbm93X2lzX21vbm90b25pYyA9IHRydWU7CiAgICAgICAgICAgIGZ1bmN0aW9uIHNldEVyck5vKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBIRUFQMzJbX19fZXJybm9fbG9jYXRpb24oKSA+PiAyXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9jbG9ja19nZXR0aW1lKGNsa19pZCwgdHApIHsKICAgICAgICAgICAgICAgIHZhciBub3c7CiAgICAgICAgICAgICAgICBpZiAoY2xrX2lkID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKChjbGtfaWQgPT09IDEgfHwgY2xrX2lkID09PSA0KSAmJiBfZW1zY3JpcHRlbl9nZXRfbm93X2lzX21vbm90b25pYykgewogICAgICAgICAgICAgICAgICAgIG5vdyA9IF9lbXNjcmlwdGVuX2dldF9ub3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNldEVyck5vKDI4KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIRUFQMzJbdHAgPj4gMl0gPSAobm93IC8gMWUzKSB8IDA7CiAgICAgICAgICAgICAgICBIRUFQMzJbKHRwICsgNCkgPj4gMl0gPSAoKG5vdyAlIDFlMykgKiAxZTMgKiAxZTMpIHwgMDsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9kbG9wZW4oZmlsZW5hbWUsIGZsYWcpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZGxzeW0oaGFuZGxlLCBzeW1ib2wpIHsKICAgICAgICAgICAgICAgIGFib3J0KCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnKGRlc3QsIHNyYywgbnVtKSB7CiAgICAgICAgICAgICAgICBIRUFQVTguY29weVdpdGhpbihkZXN0LCBzcmMsIHNyYyArIG51bSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBIRUFQVTgubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGVtc2NyaXB0ZW5fcmVhbGxvY19idWZmZXIoc2l6ZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB3YXNtTWVtb3J5Lmdyb3coKHNpemUgLSBidWZmZXIuYnl0ZUxlbmd0aCArIDY1NTM1KSA+Pj4gMTYpOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdsb2JhbEJ1ZmZlckFuZFZpZXdzKHdhc21NZW1vcnkuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcChyZXF1ZXN0ZWRTaXplKSB7CiAgICAgICAgICAgICAgICB2YXIgb2xkU2l6ZSA9IF9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKTsKICAgICAgICAgICAgICAgIHZhciBtYXhIZWFwU2l6ZSA9IDIxNDc0ODM2NDg7CiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdGVkU2l6ZSA+IG1heEhlYXBTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgY3V0RG93biA9IDE7IGN1dERvd24gPD0gNDsgY3V0RG93biAqPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG92ZXJHcm93bkhlYXBTaXplID0gb2xkU2l6ZSAqICgxICsgMC4yIC8gY3V0RG93bik7CiAgICAgICAgICAgICAgICAgICAgb3Zlckdyb3duSGVhcFNpemUgPSBNYXRoLm1pbihvdmVyR3Jvd25IZWFwU2l6ZSwgcmVxdWVzdGVkU2l6ZSArIDEwMDY2MzI5Nik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1NpemUgPSBNYXRoLm1pbihtYXhIZWFwU2l6ZSwgYWxpZ25VcChNYXRoLm1heChyZXF1ZXN0ZWRTaXplLCBvdmVyR3Jvd25IZWFwU2l6ZSksIDY1NTM2KSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihuZXdTaXplKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX3RocmVhZF9zbGVlcChtc2VjcykgewogICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gX2Vtc2NyaXB0ZW5fZ2V0X25vdygpOwogICAgICAgICAgICAgICAgd2hpbGUgKF9lbXNjcmlwdGVuX2dldF9ub3coKSAtIHN0YXJ0IDwgbXNlY3MpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBFTlYgPSB7fTsKICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RXhlY3V0YWJsZU5hbWUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1Byb2dyYW0gfHwgIi4vdGhpcy5wcm9ncmFtIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRFbnZTdHJpbmdzKCkgewogICAgICAgICAgICAgICAgaWYgKCFnZXRFbnZTdHJpbmdzLnN0cmluZ3MpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZyA9ICgodHlwZW9mIG5hdmlnYXRvciA9PT0gIm9iamVjdCIgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcyAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdKSB8fCAiQyIpLnJlcGxhY2UoIi0iLCAiXyIpICsgIi5VVEYtOCI7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVudiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgVVNFUjogIndlYl91c2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgTE9HTkFNRTogIndlYl91c2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgUEFUSDogIi8iLAogICAgICAgICAgICAgICAgICAgICAgICBQV0Q6ICIvIiwKICAgICAgICAgICAgICAgICAgICAgICAgSE9NRTogIi9ob21lL3dlYl91c2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgTEFORzogbGFuZywKICAgICAgICAgICAgICAgICAgICAgICAgXzogZ2V0RXhlY3V0YWJsZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gRU5WKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudlt4XSA9IEVOVlt4XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmluZ3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4IGluIGVudikgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzLnB1c2goeCArICI9IiArIGVudlt4XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEVudlN0cmluZ3Muc3RyaW5ncyA9IHN0cmluZ3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RW52U3RyaW5ncy5zdHJpbmdzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBTWVNDQUxMUyA9IHsKICAgICAgICAgICAgICAgIG1hcHBpbmdzOiB7fSwKICAgICAgICAgICAgICAgIGJ1ZmZlcnM6IFtudWxsLCBbXSwgW11dLAogICAgICAgICAgICAgICAgcHJpbnRDaGFyOiBmdW5jdGlvbiAoc3RyZWFtLCBjdXJyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IFNZU0NBTExTLmJ1ZmZlcnNbc3RyZWFtXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VyciA9PT0gMCB8fCBjdXJyID09PSAxMCkgewogICAgICAgICAgICAgICAgICAgICAgICAoc3RyZWFtID09PSAxID8gb3V0IDogZXJyKShVVEY4QXJyYXlUb1N0cmluZyhidWZmZXIsIDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIucHVzaChjdXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdmFyYXJnczogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgU1lTQ0FMTFMudmFyYXJncyArPSA0OwogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBIRUFQMzJbKFNZU0NBTExTLnZhcmFyZ3MgLSA0KSA+PiAyXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdldFN0cjogZnVuY3Rpb24gKHB0cikgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBVVEY4VG9TdHJpbmcocHRyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdldDY0OiBmdW5jdGlvbiAobG93LCBoaWdoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvdzsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbnZpcm9uX2dldChfX2Vudmlyb24sIGVudmlyb25fYnVmKSB7CiAgICAgICAgICAgICAgICB2YXIgYnVmU2l6ZSA9IDA7CiAgICAgICAgICAgICAgICBnZXRFbnZTdHJpbmdzKCkuZm9yRWFjaChmdW5jdGlvbiAoc3RyaW5nLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB0ciA9IGVudmlyb25fYnVmICsgYnVmU2l6ZTsKICAgICAgICAgICAgICAgICAgICBIRUFQMzJbKF9fZW52aXJvbiArIGkgKiA0KSA+PiAyXSA9IHB0cjsKICAgICAgICAgICAgICAgICAgICB3cml0ZUFzY2lpVG9NZW1vcnkoc3RyaW5nLCBwdHIpOwogICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUgKz0gc3RyaW5nLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbnZpcm9uX3NpemVzX2dldChwZW52aXJvbl9jb3VudCwgcGVudmlyb25fYnVmX3NpemUpIHsKICAgICAgICAgICAgICAgIHZhciBzdHJpbmdzID0gZ2V0RW52U3RyaW5ncygpOwogICAgICAgICAgICAgICAgSEVBUDMyW3BlbnZpcm9uX2NvdW50ID4+IDJdID0gc3RyaW5ncy5sZW5ndGg7CiAgICAgICAgICAgICAgICB2YXIgYnVmU2l6ZSA9IDA7CiAgICAgICAgICAgICAgICBzdHJpbmdzLmZvckVhY2goZnVuY3Rpb24gKHN0cmluZykgewogICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUgKz0gc3RyaW5nLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIEhFQVAzMltwZW52aXJvbl9idWZfc2l6ZSA+PiAyXSA9IGJ1ZlNpemU7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZXhpdChzdGF0dXMpIHsKICAgICAgICAgICAgICAgIGV4aXQoc3RhdHVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZmRfY2xvc2UoZmQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF9zZWVrKGZkLCBvZmZzZXRfbG93LCBvZmZzZXRfaGlnaCwgd2hlbmNlLCBuZXdPZmZzZXQpIHsgfQogICAgICAgICAgICBmdW5jdGlvbiBfZmRfd3JpdGUoZmQsIGlvdiwgaW92Y250LCBwbnVtKSB7CiAgICAgICAgICAgICAgICB2YXIgbnVtID0gMDsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW92Y250OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHRyID0gSEVBUDMyWyhpb3YgKyBpICogOCkgPj4gMl07CiAgICAgICAgICAgICAgICAgICAgdmFyIGxlbiA9IEhFQVAzMlsoaW92ICsgKGkgKiA4ICsgNCkpID4+IDJdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgU1lTQ0FMTFMucHJpbnRDaGFyKGZkLCBIRUFQVThbcHRyICsgal0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBudW0gKz0gbGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgSEVBUDMyW3BudW0gPj4gMl0gPSBudW07CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfcHRocmVhZF9jcmVhdGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gNjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfcHRocmVhZF9qb2luKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDI4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9zeXNjb25mKG5hbWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNjM4NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg1OgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF4SGVhcFNpemUgPSAyMTQ3NDgzNjQ4OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF4SGVhcFNpemUgLyAxNjM4NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDIzNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDUyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwMDgwOTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDgwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgODE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5MToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDYwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDI0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDcyOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMTQ3NDgzNjQ3OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDc4Mzk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOTk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA0ODsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDk3MTUyOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY1NTM2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjg6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjc2ODsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzI3Njc7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxZTM7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcwMDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDcxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjU2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyNTU7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTAwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3MzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4NDogewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gIm9iamVjdCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF2aWdhdG9yWyJoYXJkd2FyZUNvbmN1cnJlbmN5Il0gfHwgMTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2V0RXJyTm8oMjgpOwogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhc21MaWJyYXJ5QXJnID0gewogICAgICAgICAgICAgICAgYTogX2Fib3J0LAogICAgICAgICAgICAgICAgbjogX2Nsb2NrX2dldHRpbWUsCiAgICAgICAgICAgICAgICBpOiBfZGxvcGVuLAogICAgICAgICAgICAgICAgZTogX2Rsc3ltLAogICAgICAgICAgICAgICAgbDogX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZywKICAgICAgICAgICAgICAgIG06IF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwLAogICAgICAgICAgICAgICAgbzogX2Vtc2NyaXB0ZW5fdGhyZWFkX3NsZWVwLAogICAgICAgICAgICAgICAgcDogX2Vudmlyb25fZ2V0LAogICAgICAgICAgICAgICAgZzogX2Vudmlyb25fc2l6ZXNfZ2V0LAogICAgICAgICAgICAgICAgajogX2V4aXQsCiAgICAgICAgICAgICAgICBoOiBfZmRfY2xvc2UsCiAgICAgICAgICAgICAgICBrOiBfZmRfc2VlaywKICAgICAgICAgICAgICAgIGM6IF9mZF93cml0ZSwKICAgICAgICAgICAgICAgIGQ6IF9wdGhyZWFkX2NyZWF0ZSwKICAgICAgICAgICAgICAgIGY6IF9wdGhyZWFkX2pvaW4sCiAgICAgICAgICAgICAgICBiOiBfc3lzY29uZiwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY3JlYXRlV2FzbSgpOwogICAgICAgICAgICB2YXIgX19fd2FzbV9jYWxsX2N0b3JzID0gKE1vZHVsZVsiX19fd2FzbV9jYWxsX2N0b3JzIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKF9fX3dhc21fY2FsbF9jdG9ycyA9IE1vZHVsZVsiX19fd2FzbV9jYWxsX2N0b3JzIl0gPSBNb2R1bGVbImFzbSJdWyJyIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQiXSA9IE1vZHVsZVsiYXNtIl1bInMiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dE1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dE1lbW9yeU9mZnNldCJdID0gTW9kdWxlWyJhc20iXVsidCJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0SGVpZ2h0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0SGVpZ2h0Il0gPSBNb2R1bGVbImFzbSJdWyJ1Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRXaWR0aCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dFdpZHRoIl0gPSBNb2R1bGVbImFzbSJdWyJ2Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRDaGFubmVsQ291bnQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRDaGFubmVsQ291bnQiXSA9IE1vZHVsZVsiYXNtIl1bInciXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0TWVtb3J5T2Zmc2V0Il0gPSBNb2R1bGVbImFzbSJdWyJ4Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0SGVpZ2h0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dEhlaWdodCJdID0gTW9kdWxlWyJhc20iXVsieSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dFdpZHRoIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dFdpZHRoIl0gPSBNb2R1bGVbImFzbSJdWyJ6Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0Q2hhbm5lbENvdW50Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dENoYW5uZWxDb3VudCJdID0gTW9kdWxlWyJhc20iXVsiQSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2xvYWRNb2RlbCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9sb2FkTW9kZWwiXSA9IE1vZHVsZVsiYXNtIl1bIkIiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9ydW5JbmZlcmVuY2UiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfcnVuSW5mZXJlbmNlIl0gPSBNb2R1bGVbImFzbSJdWyJDIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgX19fZXJybm9fbG9jYXRpb24gPSAoTW9kdWxlWyJfX19lcnJub19sb2NhdGlvbiJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChfX19lcnJub19sb2NhdGlvbiA9IE1vZHVsZVsiX19fZXJybm9fbG9jYXRpb24iXSA9IE1vZHVsZVsiYXNtIl1bIkUiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBjYWxsZWRSdW47CiAgICAgICAgICAgIGZ1bmN0aW9uIEV4aXRTdGF0dXMoc3RhdHVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSAiRXhpdFN0YXR1cyI7CiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSAiUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgiICsgc3RhdHVzICsgIikiOwogICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gZnVuY3Rpb24gcnVuQ2FsbGVyKCkgewogICAgICAgICAgICAgICAgaWYgKCFjYWxsZWRSdW4pCiAgICAgICAgICAgICAgICAgICAgcnVuKCk7CiAgICAgICAgICAgICAgICBpZiAoIWNhbGxlZFJ1bikKICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBydW5DYWxsZXI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZ1bmN0aW9uIHJ1bihhcmdzKSB7CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByZVJ1bigpOwogICAgICAgICAgICAgICAgaWYgKHJ1bkRlcGVuZGVuY2llcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkb1J1bigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGVkUnVuKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY2FsbGVkUnVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbImNhbGxlZFJ1biJdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoQUJPUlQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBpbml0UnVudGltZSgpOwogICAgICAgICAgICAgICAgICAgIHByZU1haW4oKTsKICAgICAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZXNvbHZlKE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsib25SdW50aW1lSW5pdGlhbGl6ZWQiXSkKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKCk7CiAgICAgICAgICAgICAgICAgICAgcG9zdFJ1bigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsic2V0U3RhdHVzIl0pIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCJSdW5uaW5nLi4uIik7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJzZXRTdGF0dXMiXSgiIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBkb1J1bigpOwogICAgICAgICAgICAgICAgICAgIH0sIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZG9SdW4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbInJ1biJdID0gcnVuOwogICAgICAgICAgICBmdW5jdGlvbiBleGl0KHN0YXR1cywgaW1wbGljaXQpIHsKICAgICAgICAgICAgICAgIHF1aXRfKHN0YXR1cywgbmV3IEV4aXRTdGF0dXMoc3RhdHVzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKE1vZHVsZVsicHJlSW5pdCJdKSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1vZHVsZVsicHJlSW5pdCJdID09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVJbml0Il0gPSBbTW9kdWxlWyJwcmVJbml0Il1dOwogICAgICAgICAgICAgICAgd2hpbGUgKE1vZHVsZVsicHJlSW5pdCJdLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZUluaXQiXS5wb3AoKSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJ1bigpOwogICAgICAgICAgICByZXR1cm4gY3JlYXRlVEZMaXRlTW9kdWxlLnJlYWR5OwogICAgICAgIH07CiAgICB9KSgpOwoKICAgIHZhciB0ZmxpdGUgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgX19wcm90b19fOiBudWxsLAogICAgICAgIGRlZmF1bHQ6IGNyZWF0ZVRGTGl0ZU1vZHVsZQogICAgfSk7Cgp9KSh3YXNtRmVhdHVyZURldGVjdCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPVByb2Nlc3NvclByb3h5Lndvcmtlci5qcy5tYXAKCg==");let L_;const J_=new Image(1,1);function K_(e,t){return $T(this,void 0,void 0,function*(){try{return yield createImageBitmap(e,t)}catch(e){return yield createImageBitmap(J_,t)}})}J_.src="data:image/gif;base64,R0lGODlhAQABAIAAAMLCwgAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==";var Y_=Object.freeze({__proto__:null,createEffectStream:(e,t,n)=>$T(void 0,void 0,void 0,function*(){yield p_(n);const i=[],r=e.getVideoTracks()[0],s=e.getAudioTracks()[0];let{width:o,height:a}=r.getSettings();const c=(g=t.useBackgroundWorker,d={setup:t,params:n,videoWidth:o,videoHeight:a},g?(L_||(L_=new j_),new H_(L_,d)):new D_(d));var g,d;let C;const I=e=>$T(void 0,void 0,void 0,function*(){const n=yield h_(e.backgroundUrl,e.backgroundType);return C=n&&n.play&&(()=>{n.paused&&n.play()}),function(e,t,n,i){return $T(this,void 0,void 0,function*(){if(!e)return()=>$T(this,void 0,void 0,function*(){});const r=e.videoWidth||e.naturalWidth||e.width,s=e.videoHeight||e.naturalHeight||e.height,o=r/s,a=t/n;if("imagedata"===i){const i=document.createElement("canvas");i.width=t,i.height=n;const c=i.getContext("2d");let[g,d,C,I]=[0,0,t,n];if(o>a){const e=n*o-t;g-=Math.round(e/2),C+=Math.round(e)}else if(o<a){const e=t/o-n;d-=Math.round(e/2),I+=Math.round(e)}return()=>$T(this,void 0,void 0,function*(){return c.drawImage(e,0,0,r,s,g,d,C,I),c.getImageData(0,0,t,n).data.buffer})}if("imagebitmap"===i){let[i,c,g,d]=[0,0,r,s];if(o>a){const e=r-s*a;i+=Math.round(e/2),g-=Math.round(e)}else if(o<a){const e=s-r/a;c+=Math.round(e/2),d-=Math.round(e)}return()=>$T(this,void 0,void 0,function*(){return yield createImageBitmap(e,i,c,g,d,{resizeWidth:t,resizeHeight:n})})}return"canvas"===i?()=>$T(this,void 0,void 0,function*(){return e}):void 0})}(n,o,a,t.transferType)});let l=yield I(n),u=null;const A=new Promise(e=>u=e);let p,h;if(t.useInsertableStreams){const e=new window.MediaStreamTrackProcessor({track:r,maxBufferSize:2}),t=new window.MediaStreamTrackGenerator({kind:"video",signalTarget:r});h=t,c.on("ready",()=>{c.start({inputStream:null==e?void 0:e.readable,outputStream:null==t?void 0:t.writable})}),c.on("firstframerendered",()=>u()),c.on("getbackgroundframe",()=>$T(void 0,void 0,void 0,function*(){C&&(C(),c.updateBackgroundFrame({frame:yield l()}))}))}else{const e=document.createElement("video"),s=()=>$T(void 0,void 0,void 0,function*(){const{width:e,height:t}=r.getSettings();o===e&&a===t||(o=e,a=t,"object"==typeof p&&(p.width=o,p.height=a),yield c.updateVideoSize({videoWidth:o,videoHeight:a}),yield I(n))});e.addEventListener("resize",s),i.push(()=>{e.removeEventListener("resize",s)}),t.keepVideoElementInDom&&(e.playsInline=!0,e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.style.width="1px",e.style.opacity=0,document.body.appendChild(e),i.push(()=>{try{document.body.removeChild(e)}catch(e){console.warn("video element already removed from DOM")}e.srcObject=null})),yield new Promise(t=>{e.addEventListener("loadedmetadata",t),e.srcObject=new MediaStream([r]),e.play()});const g=()=>{"visible"!==document.visibilityState&&e.play()};let d,A,m;if(document.addEventListener("visibilitychange",g),i.push(()=>{document.removeEventListener("visibilitychange",g)}),p=m_(o,a),"imagebitmap"===t.transferType)d=p.getContext("bitmaprenderer"),A=()=>K_(e),m=e=>{d.transferFromImageBitmap(e),e.close()};else if("imagedata"===t.transferType){d=p.getContext("2d");const t=m_(o,a).getContext("2d");A=()=>(t.drawImage(e,0,0),t.getImageData(0,0,o,a).data.buffer),m=e=>{e=new ImageData(new Uint8ClampedArray(e),o,a),d.putImageData(e,0,0)}}else"canvas"===t.transferType&&(d=p.getContext(t.useWebGL?"webgl2":"2d",t.useWebGL?t.webglContextSettings:void 0),A=()=>e,t.useWebGL&&t.canvasMemoryLeakWorkaround&&(A=()=>K_(e)),m=()=>{});h=p.captureStream().getVideoTracks()[0];let f=Date.now();const b=()=>$T(void 0,void 0,void 0,function*(){null==C||C();const[e,n]=yield Promise.all([A(),C&&l()]);c.input({videoFrame:e,backgroundFrame:n,lastRenderTime:f,requestTime:Date.now(),delay:t.framerate?1e3/t.framerate:0})}),y=()=>{b()};c.on("ready",()=>{y(),c.start({})}),c.on("output",({frame:e})=>{f=Date.now(),m(e),y(),u&&(u(),u=null)})}c.on("terminated",()=>{i.forEach(e=>e())}),c.init({useInsertableStreams:t.useInsertableStreams,initialBackgroundFrame:yield l(),effectCanvas:"canvas"===t.transferType?p:void 0});yield A,Object.defineProperty(h,"label",{get:()=>r.label}),Object.defineProperty(h,"readyState",{get:()=>r.readyState}),Object.defineProperty(h,"enabled",{get:()=>r.enabled,set:e=>{r.enabled=e}}),Object.defineProperty(h,"getSettings",{get:()=>()=>r.getSettings()});return{stream:new MediaStream([h,s].filter(e=>e)),stop:()=>{c.terminate()},updateParams:e=>$T(void 0,void 0,void 0,function*(){return yield p_(e),l=yield I(e),c.updateParams({params:e,initialBackgroundFrame:yield l()}),!0})}})});const U_=e=>$T(void 0,void 0,void 0,function*(){return{default:b_.backgrounds[e]}}),z_=!!document.createElement("canvas").getContext("webgl2"),Q_={tfliteSegmentCanvasEffects:{module:Y_,getDefaultSetup:()=>{const e={useWebGL:z_,segmentationModelId:"meetlite",logToConsole:!1,framerate:30,useInsertableStreams:!1,canvasMemoryLeakWorkaround:!0,transferType:"canvas",useBackgroundWorker:!1};return"chrome"===QT.browserDetails.browser?Object.assign(Object.assign({},e),{useWebGL:!1}):"firefox"===QT.browserDetails.browser?Object.assign(Object.assign({},e),{transferType:z_?"imagebitmap":"canvas"}):"safari"===QT.browserDetails.browser?Object.assign(Object.assign({},e),{canvasMemoryLeakWorkaround:!1,keepVideoElementInDom:!0}):Object.assign({},e)},canUse:(e={})=>{var t,n,i;return"safari"===QT.browserDetails.browser&&z_&&e.allowSafari||"chrome"===QT.browserDetails.browser&&(null!==(t=QT.browserDetails.version)&&void 0!==t?t:0)>=90||"firefox"===QT.browserDetails.browser&&(null!==(i=null===(n=QT.browserDetails)||void 0===n?void 0:n.version)&&void 0!==i?i:0)>=89}}},$_=[{id:"slight-blur",pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundBlur:{amount:"slight"}}}}},{id:"blur",pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundBlur:{amount:"normal"}}}}},{id:"heavy-blur",pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundBlur:{amount:"heavy"}}}}}];$_.push(...[{id:"clay",backgroundName:"clay"},{id:"haven",backgroundName:"haven"},{id:"focus",backgroundName:"focus"},{id:"studio",backgroundName:"studio"},{id:"glow",backgroundName:"glow"},{id:"pulse",backgroundName:"pulse"},{id:"cabin",backgroundName:"cabin"},{id:"concrete",backgroundName:"concrete"},{id:"brick",backgroundName:"brick"},{id:"sunrise",backgroundName:"sunrise"},{id:"day",backgroundName:"day"},{id:"night",backgroundName:"night"},{id:"custom"}].map(({id:e,backgroundName:t})=>({id:`image-${e}`,pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundUrl:t?U_(t):void 0}}}}))),$_.push(...[{name:"neon",index:1},{name:"bubbles",index:2}].map(({name:e,index:t})=>({id:`video-${t}`,pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundType:"video",backgroundUrl:U_(e)}}}})));const q_=(e,t,n)=>{var i,r,s;const o=$_.find(t=>t.id===e);if(!o)return;let a=Object.keys(null!==(i=o.pipelineConfigs)&&void 0!==i?i:[]).find(e=>Q_[e].canUse());if(a||(a=Object.keys(null!==(r=o.pipelineConfigs)&&void 0!==r?r:[])[0]),!a)return;const c=null===(s=o.pipelineConfigs)||void 0===s?void 0:s[a],g=Q_[a],d=Object.assign(Object.assign(Object.assign({},g.getDefaultSetup()),null==c?void 0:c.setup),t);d.useWebGL=d.useWebGL&&z_;return{pipeline:g,mergedSetup:d,mergedParams:Object.assign(Object.assign({},null==c?void 0:c.params),n)}},eG=({filter:e,options:t}={filter:(e,t)=>e.canUse(t),options:{}})=>$_.filter(e=>"image-custom"!==e.id).filter(n=>{var i;return Object.keys(null!==(i=n.pipelineConfigs)&&void 0!==i?i:[]).find(n=>null==e?void 0:e(Q_[n],null!=t?t:{}))}).map(e=>e.id),tG=function(){let e="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0;return"undefined"!=typeof __filename&&(e=e||__filename),function(t){var n,i,r=void 0!==(t=t||{})?t:{};r.ready=new Promise(function(e,t){n=e,i=t});var s,o={};for(s in r)r.hasOwnProperty(s)&&(o[s]=r[s]);var a,c,g,d,C="./this.program",I=function(e,t){throw t};a="object"==typeof window,c="function"==typeof importScripts,g="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,d=!a&&!g&&!c;var l,u,A,p,h,m="";g?(m=c?require("path").dirname(m)+"/":__dirname+"/",l=function(e,t){return p||(p=require("fs")),h||(h=require("path")),e=h.normalize(e),p.readFileSync(e,t?null:"utf8")},A=function(e){var t=l(e,!0);return t.buffer||(t=new Uint8Array(t)),S(t.buffer),t},process.argv.length>1&&(C=process.argv[1].replace(/\\/g,"/")),process.argv.slice(2),process.on("uncaughtException",function(e){if(!(e instanceof oe))throw e}),process.on("unhandledRejection",M),I=function(e){process.exit(e)},r.inspect=function(){return"[Emscripten Module object]"}):d?("undefined"!=typeof read&&(l=function(e){return read(e)}),A=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(S("object"==typeof(t=read(e,"binary"))),t)},"undefined"!=typeof scriptArgs&&scriptArgs,"function"==typeof quit&&(I=function(e){quit(e)}),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(a||c)&&(c?m=self.location.href:"undefined"!=typeof document&&document.currentScript&&(m=document.currentScript.src),e&&(m=e),m=0!==m.indexOf("blob:")?m.substr(0,m.lastIndexOf("/")+1):"",l=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},c&&(A=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),u=function(e,t,n){var i=new XMLHttpRequest;i.open("GET",e,!0),i.responseType="arraybuffer",i.onload=function(){200==i.status||0==i.status&&i.response?t(i.response):n()},i.onerror=n,i.send(null)});var f,b,y=r.print||console.log.bind(console),v=r.printErr||console.warn.bind(console);for(s in o)o.hasOwnProperty(s)&&(r[s]=o[s]);o=null,r.arguments&&r.arguments,r.thisProgram&&(C=r.thisProgram),r.quit&&(I=r.quit),r.wasmBinary&&(f=r.wasmBinary),r.noExitRuntime,"object"!=typeof WebAssembly&&M("no native wasm support detected");var w=!1;function S(e,t){e||M("Assertion failed: "+t)}var R,Z,V,k,T,_="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function G(e,t,n){for(var i=t+n,r=t;e[r]&&!(r>=i);)++r;if(r-t>16&&e.subarray&&_)return _.decode(e.subarray(t,r));for(var s="";t<r;){var o=e[t++];if(128&o){var a=63&e[t++];if(192!=(224&o)){var c=63&e[t++];if((o=224==(240&o)?(15&o)<<12|a<<6|c:(7&o)<<18|a<<12|c<<6|63&e[t++])<65536)s+=String.fromCharCode(o);else{var g=o-65536;s+=String.fromCharCode(55296|g>>10,56320|1023&g)}}else s+=String.fromCharCode((31&o)<<6|a)}else s+=String.fromCharCode(o)}return s}function B(e,t){return e%t>0&&(e+=t-e%t),e}function W(e){R=e,r.HEAP8=Z=new Int8Array(e),r.HEAP16=new Int16Array(e),r.HEAP32=k=new Int32Array(e),r.HEAPU8=V=new Uint8Array(e),r.HEAPU16=new Uint16Array(e),r.HEAPU32=new Uint32Array(e),r.HEAPF32=new Float32Array(e),r.HEAPF64=new Float64Array(e)}r.INITIAL_MEMORY;var E=[],P=[],X=[],N=[];function F(e){E.unshift(e)}function O(e){N.unshift(e)}P.push({func:function(){ie()}});var x=0,D=null;function M(e){r.onAbort&&r.onAbort(e),v(e+=""),w=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw i(t),t}function H(e,t){return String.prototype.startsWith?e.startsWith(t):0===e.indexOf(t)}r.preloadedImages={},r.preloadedAudios={};function j(e){return H(e,"data:application/octet-stream;base64,")}function L(e){return H(e,"file://")}var J,K,Y="tflite-simd.wasm";function U(e){try{if(e==Y&&f)return new Uint8Array(f);if(A)return A(e);throw"both async and sync fetching of the wasm failed"}catch(e){M(e)}}function z(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var n=t.func;"number"==typeof n?void 0===t.arg?T.get(n)():T.get(n)(t.arg):n(void 0===t.arg?null:t.arg)}else t(r)}}j(Y)||(J=Y,Y=r.locateFile?r.locateFile(J,m):m+J),K=g?function(){var e=process.hrtime();return 1e3*e[0]+e[1]/1e6}:"undefined"!=typeof dateNow?dateNow:function(){return performance.now()};function Q(e){return k[se()>>2]=e,e}function $(e){try{return b.grow(e-R.byteLength+65535>>>16),W(b.buffer),1}catch(e){}}var q={};function ee(){if(!ee.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:C||"./this.program"};for(var t in q)e[t]=q[t];var n=[];for(var t in e)n.push(t+"="+e[t]);ee.strings=n}return ee.strings}var te={mappings:{},buffers:[null,[],[]],printChar:function(e,t){var n=te.buffers[e];0===t||10===t?((1===e?y:v)(G(n,0)),n.length=0):n.push(t)},varargs:void 0,get:function(){return te.varargs+=4,k[te.varargs-4>>2]},getStr:function(e){var t=function(e,t){return e?G(V,e,t):""}(e);return t},get64:function(e,t){return e}};var ne={a:function(){M()},n:function(e,t){var n;if(0===e)n=Date.now();else{if(1!==e&&4!==e)return Q(28),-1;n=K()}return k[t>>2]=n/1e3|0,k[t+4>>2]=n%1e3*1e3*1e3|0,0},i:function(e,t){M("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},e:function(e,t){M("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},l:function(e,t,n){V.copyWithin(e,t,t+n)},m:function(e){var t=V.length,n=2147483648;if(e>n)return!1;for(var i=1;i<=4;i*=2){var r=t*(1+.2/i);if(r=Math.min(r,e+100663296),$(Math.min(n,B(Math.max(e,r),65536))))return!0}return!1},o:function(e){for(var t=K();K()-t<e;);},p:function(e,t){var n=0;return ee().forEach(function(i,r){var s=t+n;k[e+4*r>>2]=s,function(e,t){for(var n=0;n<e.length;++n)Z[0|t++]=e.charCodeAt(n);Z[0|t]=0}(i,s),n+=i.length+1}),0},g:function(e,t){var n=ee();k[e>>2]=n.length;var i=0;return n.forEach(function(e){i+=e.length+1}),k[t>>2]=i,0},j:function(e){!function(e){I(e,new oe(e))}(e)},h:function(e){return 0},k:function(e,t,n,i,r){},c:function(e,t,n,i){for(var r=0,s=0;s<n;s++){for(var o=k[t+8*s>>2],a=k[t+(8*s+4)>>2],c=0;c<a;c++)te.printChar(e,V[o+c]);r+=a}return k[i>>2]=r,0},d:function(){return 6},f:function(){return 28},b:function(e){switch(e){case 30:case 75:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return Q(28),-1}};!function(){var e={a:ne};function t(e,t){var n=e.exports;r.asm=n,W((b=r.asm.q).buffer),T=r.asm.D,function(){if(x--,r.monitorRunDependencies&&r.monitorRunDependencies(x),0==x&&D){var e=D;D=null,e()}}()}function n(e){t(e.instance)}function s(t){return function(){if(!f&&(a||c)){if("function"==typeof fetch&&!L(Y))return fetch(Y,{credentials:"same-origin"}).then(function(e){if(!e.ok)throw"failed to load wasm binary file at '"+Y+"'";return e.arrayBuffer()}).catch(function(){return U(Y)});if(u)return new Promise(function(e,t){u(Y,function(t){e(new Uint8Array(t))},t)})}return Promise.resolve().then(function(){return U(Y)})}().then(function(t){return WebAssembly.instantiate(t,e)}).then(t,function(e){v("failed to asynchronously prepare wasm: "+e),M(e)})}if(x++,r.monitorRunDependencies&&r.monitorRunDependencies(x),r.instantiateWasm)try{return r.instantiateWasm(e,t)}catch(e){return v("Module.instantiateWasm callback failed with error: "+e),!1}(f||"function"!=typeof WebAssembly.instantiateStreaming||j(Y)||L(Y)||"function"!=typeof fetch?s(n):fetch(Y,{credentials:"same-origin"}).then(function(t){return WebAssembly.instantiateStreaming(t,e).then(n,function(e){return v("wasm streaming compile failed: "+e),v("falling back to ArrayBuffer instantiation"),s(n)})})).catch(i)}();var ie=r.___wasm_call_ctors=function(){return(ie=r.___wasm_call_ctors=r.asm.r).apply(null,arguments)};r._getModelBufferMemoryOffset=function(){return(r._getModelBufferMemoryOffset=r.asm.s).apply(null,arguments)},r._getInputMemoryOffset=function(){return(r._getInputMemoryOffset=r.asm.t).apply(null,arguments)},r._getInputHeight=function(){return(r._getInputHeight=r.asm.u).apply(null,arguments)},r._getInputWidth=function(){return(r._getInputWidth=r.asm.v).apply(null,arguments)},r._getInputChannelCount=function(){return(r._getInputChannelCount=r.asm.w).apply(null,arguments)},r._getOutputMemoryOffset=function(){return(r._getOutputMemoryOffset=r.asm.x).apply(null,arguments)},r._getOutputHeight=function(){return(r._getOutputHeight=r.asm.y).apply(null,arguments)},r._getOutputWidth=function(){return(r._getOutputWidth=r.asm.z).apply(null,arguments)},r._getOutputChannelCount=function(){return(r._getOutputChannelCount=r.asm.A).apply(null,arguments)},r._loadModel=function(){return(r._loadModel=r.asm.B).apply(null,arguments)},r._runInference=function(){return(r._runInference=r.asm.C).apply(null,arguments)};var re,se=r.___errno_location=function(){return(se=r.___errno_location=r.asm.E).apply(null,arguments)};function oe(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function ae(e){function t(){re||(re=!0,r.calledRun=!0,w||(z(P),z(X),n(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),function(){if(r.postRun)for("function"==typeof r.postRun&&(r.postRun=[r.postRun]);r.postRun.length;)O(r.postRun.shift());z(N)}()))}x>0||(!function(){if(r.preRun)for("function"==typeof r.preRun&&(r.preRun=[r.preRun]);r.preRun.length;)F(r.preRun.shift());z(E)}(),x>0||(r.setStatus?(r.setStatus("Running..."),setTimeout(function(){setTimeout(function(){r.setStatus("")},1),t()},1)):t()))}if(D=function e(){re||ae(),re||(D=e)},r.run=ae,r.preInit)for("function"==typeof r.preInit&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();return ae(),t.ready}}();var nG,iG=Object.freeze({__proto__:null,default:tG}),rG=(nG="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0,"undefined"!=typeof __filename&&(nG=nG||__filename),function(e){var t,n,i=void 0!==(e=e||{})?e:{};i.ready=new Promise(function(e,i){t=e,n=i});var r,s={};for(r in i)i.hasOwnProperty(r)&&(s[r]=i[r]);var o,a,c,g,d="./this.program",C=function(e,t){throw t};o="object"==typeof window,a="function"==typeof importScripts,c="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,g=!o&&!c&&!a;var I,l,u,A,p,h="";c?(h=a?require("path").dirname(h)+"/":__dirname+"/",I=function(e,t){return A||(A=require("fs")),p||(p=require("path")),e=p.normalize(e),A.readFileSync(e,t?null:"utf8")},u=function(e){var t=I(e,!0);return t.buffer||(t=new Uint8Array(t)),w(t.buffer),t},process.argv.length>1&&(d=process.argv[1].replace(/\\/g,"/")),process.argv.slice(2),process.on("uncaughtException",function(e){if(!(e instanceof se))throw e}),process.on("unhandledRejection",D),C=function(e){process.exit(e)},i.inspect=function(){return"[Emscripten Module object]"}):g?("undefined"!=typeof read&&(I=function(e){return read(e)}),u=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(w("object"==typeof(t=read(e,"binary"))),t)},"undefined"!=typeof scriptArgs&&scriptArgs,"function"==typeof quit&&(C=function(e){quit(e)}),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(o||a)&&(a?h=self.location.href:"undefined"!=typeof document&&document.currentScript&&(h=document.currentScript.src),nG&&(h=nG),h=0!==h.indexOf("blob:")?h.substr(0,h.lastIndexOf("/")+1):"",I=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},a&&(u=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),l=function(e,t,n){var i=new XMLHttpRequest;i.open("GET",e,!0),i.responseType="arraybuffer",i.onload=function(){200==i.status||0==i.status&&i.response?t(i.response):n()},i.onerror=n,i.send(null)});var m,f,b=i.print||console.log.bind(console),y=i.printErr||console.warn.bind(console);for(r in s)s.hasOwnProperty(r)&&(i[r]=s[r]);s=null,i.arguments&&i.arguments,i.thisProgram&&(d=i.thisProgram),i.quit&&(C=i.quit),i.wasmBinary&&(m=i.wasmBinary),i.noExitRuntime,"object"!=typeof WebAssembly&&D("no native wasm support detected");var v=!1;function w(e,t){e||D("Assertion failed: "+t)}var S,R,Z,V,k,T="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function _(e,t,n){for(var i=t+n,r=t;e[r]&&!(r>=i);)++r;if(r-t>16&&e.subarray&&T)return T.decode(e.subarray(t,r));for(var s="";t<r;){var o=e[t++];if(128&o){var a=63&e[t++];if(192!=(224&o)){var c=63&e[t++];if((o=224==(240&o)?(15&o)<<12|a<<6|c:(7&o)<<18|a<<12|c<<6|63&e[t++])<65536)s+=String.fromCharCode(o);else{var g=o-65536;s+=String.fromCharCode(55296|g>>10,56320|1023&g)}}else s+=String.fromCharCode((31&o)<<6|a)}else s+=String.fromCharCode(o)}return s}function G(e,t){return e%t>0&&(e+=t-e%t),e}function B(e){S=e,i.HEAP8=R=new Int8Array(e),i.HEAP16=new Int16Array(e),i.HEAP32=V=new Int32Array(e),i.HEAPU8=Z=new Uint8Array(e),i.HEAPU16=new Uint16Array(e),i.HEAPU32=new Uint32Array(e),i.HEAPF32=new Float32Array(e),i.HEAPF64=new Float64Array(e)}i.INITIAL_MEMORY;var W=[],E=[],P=[],X=[];function N(e){W.unshift(e)}function F(e){X.unshift(e)}E.push({func:function(){ne()}});var O=0,x=null;function D(e){i.onAbort&&i.onAbort(e),y(e+=""),v=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw n(t),t}function M(e,t){return String.prototype.startsWith?e.startsWith(t):0===e.indexOf(t)}function H(e){return M(e,"data:application/octet-stream;base64,")}function j(e){return M(e,"file://")}i.preloadedImages={},i.preloadedAudios={};var L,J,K="tflite.wasm";function Y(e){try{if(e==K&&m)return new Uint8Array(m);if(u)return u(e);throw"both async and sync fetching of the wasm failed"}catch(e){D(e)}}function U(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var n=t.func;"number"==typeof n?void 0===t.arg?k.get(n)():k.get(n)(t.arg):n(void 0===t.arg?null:t.arg)}else t(i)}}function z(e){return V[re()>>2]=e,e}function Q(e){try{return f.grow(e-S.byteLength+65535>>>16),B(f.buffer),1}catch(e){}}H(K)||(L=K,K=i.locateFile?i.locateFile(L,h):h+L),J=c?function(){var e=process.hrtime();return 1e3*e[0]+e[1]/1e6}:"undefined"!=typeof dateNow?dateNow:function(){return performance.now()};var $={};function q(){if(!q.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:d||"./this.program"};for(var t in $)e[t]=$[t];var n=[];for(var t in e)n.push(t+"="+e[t]);q.strings=n}return q.strings}var ee={mappings:{},buffers:[null,[],[]],printChar:function(e,t){var n=ee.buffers[e];0===t||10===t?((1===e?b:y)(_(n,0)),n.length=0):n.push(t)},varargs:void 0,get:function(){return ee.varargs+=4,V[ee.varargs-4>>2]},getStr:function(e){var t=function(e,t){return e?_(Z,e,t):""}(e);return t},get64:function(e,t){return e}},te={a:function(){D()},n:function(e,t){var n;if(0===e)n=Date.now();else{if(1!==e&&4!==e)return z(28),-1;n=J()}return V[t>>2]=n/1e3|0,V[t+4>>2]=n%1e3*1e3*1e3|0,0},i:function(e,t){D("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},e:function(e,t){D("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},l:function(e,t,n){Z.copyWithin(e,t,t+n)},m:function(e){var t=Z.length,n=2147483648;if(e>n)return!1;for(var i=1;i<=4;i*=2){var r=t*(1+.2/i);if(r=Math.min(r,e+100663296),Q(Math.min(n,G(Math.max(e,r),65536))))return!0}return!1},o:function(e){for(var t=J();J()-t<e;);},p:function(e,t){var n=0;return q().forEach(function(i,r){var s=t+n;V[e+4*r>>2]=s,function(e,t){for(var n=0;n<e.length;++n)R[0|t++]=e.charCodeAt(n);R[0|t]=0}(i,s),n+=i.length+1}),0},g:function(e,t){var n=q();V[e>>2]=n.length;var i=0;return n.forEach(function(e){i+=e.length+1}),V[t>>2]=i,0},j:function(e){!function(e){C(e,new se(e))}(e)},h:function(e){return 0},k:function(e,t,n,i,r){},c:function(e,t,n,i){for(var r=0,s=0;s<n;s++){for(var o=V[t+8*s>>2],a=V[t+(8*s+4)>>2],c=0;c<a;c++)ee.printChar(e,Z[o+c]);r+=a}return V[i>>2]=r,0},d:function(){return 6},f:function(){return 28},b:function(e){switch(e){case 30:case 75:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return z(28),-1}};!function(){var e={a:te};function t(e,t){var n=e.exports;i.asm=n,B((f=i.asm.q).buffer),k=i.asm.D,function(){if(O--,i.monitorRunDependencies&&i.monitorRunDependencies(O),0==O&&x){var e=x;x=null,e()}}()}function r(e){t(e.instance)}function s(t){return function(){if(!m&&(o||a)){if("function"==typeof fetch&&!j(K))return fetch(K,{credentials:"same-origin"}).then(function(e){if(!e.ok)throw"failed to load wasm binary file at '"+K+"'";return e.arrayBuffer()}).catch(function(){return Y(K)});if(l)return new Promise(function(e,t){l(K,function(t){e(new Uint8Array(t))},t)})}return Promise.resolve().then(function(){return Y(K)})}().then(function(t){return WebAssembly.instantiate(t,e)}).then(t,function(e){y("failed to asynchronously prepare wasm: "+e),D(e)})}if(O++,i.monitorRunDependencies&&i.monitorRunDependencies(O),i.instantiateWasm)try{return i.instantiateWasm(e,t)}catch(e){return y("Module.instantiateWasm callback failed with error: "+e),!1}(m||"function"!=typeof WebAssembly.instantiateStreaming||H(K)||j(K)||"function"!=typeof fetch?s(r):fetch(K,{credentials:"same-origin"}).then(function(t){return WebAssembly.instantiateStreaming(t,e).then(r,function(e){return y("wasm streaming compile failed: "+e),y("falling back to ArrayBuffer instantiation"),s(r)})})).catch(n)}();var ne=i.___wasm_call_ctors=function(){return(ne=i.___wasm_call_ctors=i.asm.r).apply(null,arguments)};i._getModelBufferMemoryOffset=function(){return(i._getModelBufferMemoryOffset=i.asm.s).apply(null,arguments)},i._getInputMemoryOffset=function(){return(i._getInputMemoryOffset=i.asm.t).apply(null,arguments)},i._getInputHeight=function(){return(i._getInputHeight=i.asm.u).apply(null,arguments)},i._getInputWidth=function(){return(i._getInputWidth=i.asm.v).apply(null,arguments)},i._getInputChannelCount=function(){return(i._getInputChannelCount=i.asm.w).apply(null,arguments)},i._getOutputMemoryOffset=function(){return(i._getOutputMemoryOffset=i.asm.x).apply(null,arguments)},i._getOutputHeight=function(){return(i._getOutputHeight=i.asm.y).apply(null,arguments)},i._getOutputWidth=function(){return(i._getOutputWidth=i.asm.z).apply(null,arguments)},i._getOutputChannelCount=function(){return(i._getOutputChannelCount=i.asm.A).apply(null,arguments)},i._loadModel=function(){return(i._loadModel=i.asm.B).apply(null,arguments)},i._runInference=function(){return(i._runInference=i.asm.C).apply(null,arguments)};var ie,re=i.___errno_location=function(){return(re=i.___errno_location=i.asm.E).apply(null,arguments)};function se(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function oe(e){function n(){ie||(ie=!0,i.calledRun=!0,v||(U(E),U(P),t(i),i.onRuntimeInitialized&&i.onRuntimeInitialized(),function(){if(i.postRun)for("function"==typeof i.postRun&&(i.postRun=[i.postRun]);i.postRun.length;)F(i.postRun.shift());U(X)}()))}O>0||(function(){if(i.preRun)for("function"==typeof i.preRun&&(i.preRun=[i.preRun]);i.preRun.length;)N(i.preRun.shift());U(W)}(),O>0||(i.setStatus?(i.setStatus("Running..."),setTimeout(function(){setTimeout(function(){i.setStatus("")},1),n()},1)):n()))}if(x=function e(){ie||oe(),ie||(x=e)},i.run=oe,i.preInit)for("function"==typeof i.preInit&&(i.preInit=[i.preInit]);i.preInit.length>0;)i.preInit.pop()();return oe(),e.ready}),sG=Object.freeze({__proto__:null,default:rG}),oG=Object.freeze({__proto__:null,createEffectStream:(e,t,n,i)=>$T(void 0,void 0,void 0,function*(){const{pipeline:r,mergedSetup:s,mergedParams:o}=q_(t,n,i);s.logToConsole&&console.log(`Setting effect preset ${t}`,{setup:s,params:o});const{stream:a,stop:c,updateParams:g}=yield r.module.createEffectStream(e,s,o),d="safari"===QT.browserDetails.browser?(()=>{let e=!1;const t=()=>requestAnimationFrame(()=>{e||t()});return t(),()=>e=!0})():()=>{};return{stream:a,stop:()=>{s.logToConsole&&console.log("Stopping effects"),d(),c()},tryUpdate:(e,t,n)=>$T(void 0,void 0,void 0,function*(){const{pipeline:i,mergedSetup:o,mergedParams:a}=q_(e,t,n);return g&&i===r&&JSON.stringify(o)===JSON.stringify(s)?(s.logToConsole&&console.log(`Updating to effect preset ${e}`,{params:a}),yield g(a)):(s.logToConsole&&console.log("Cannot update effect, needs to create new pipeline"),!1)})}}),getPresets:e=>$_.map(t=>{var n;const i=!!Object.keys(null!==(n=t.pipelineConfigs)&&void 0!==n?n:[]).find(t=>Q_[t].canUse(null!=e?e:{}));return{id:t.id,kind:(r=t.id,r.startsWith("image-")?"image":r.startsWith("video-")?"video":"blur"),supported:i};var r}),getUsablePresets:eG,setDefaultSetup:(e,t)=>{const n=Q_[e].getDefaultSetup(),i=Object.assign(Object.assign({},n),t);Q_[e].getDefaultSetup=()=>i},warmup:(e,...t)=>$T(void 0,[e,...t],void 0,function*(e,t=()=>({}),n={}){var i;const r=e||eG({filter:e=>e.canUse({}),options:{}}).at(0)||(null===(i=$_.at(0))||void 0===i?void 0:i.id);if(!r)return;const s=q_(r,t,n);if(!s)return;const{mergedSetup:o,mergedParams:a}=s;if(yield Z_(o.segmentationModelId),null==a?void 0:a.backgroundUrl){yield p_(a);try{yield h_(a.backgroundUrl,a.backgroundType)}catch(e){}}})});return e.GridCell=Kk,e.GridVideoView=Yk,e.ParticipantMenu=Nk,e.ParticipantMenuContent=Fk,e.ParticipantMenuItem=xk,e.ParticipantMenuTrigger=Ok,e.VideoGrid=function({renderParticipant:e,renderFloatingParticipant:t,stageParticipantLimit:n,gridGap:i,videoGridGap:r,enableSubgrid:s,enableParticipantMenu:a,enableConstrainedGrid:c}){const g=o.useRef(null),{containerFrame:d,cellViewsFloating:C,cellViewsVideoGrid:I,cellViewsInPresentationGrid:l,cellViewsInSubgrid:u,clientAspectRatios:A,videoStage:p,setContainerBounds:h,setClientAspectRatios:m,maximizedParticipant:f,setMaximizedParticipant:b,isConstrained:y,floatingParticipant:v,setFloatingParticipant:w}=function({activeVideosSubgridTrigger:e,forceSubgrid:t,stageParticipantLimit:n=12,gridGap:i=8,videoGridGap:r=8,enableSubgrid:s=!0,enableConstrainedGrid:a=!0}={}){const[c,g]=o.useState({width:0,height:0}),[d,C]=o.useState(!1),[I,l]=o.useState({}),[u,A]=o.useState(null),[p,h]=o.useState(null),{clientViewsInGrid:m,clientViewsInPresentationGrid:f,clientViewsInSubgrid:b,floatingClientView:y}=Lw({activeVideosSubgridTrigger:e,forceSubgrid:t,stageParticipantLimit:n,enableSubgrid:s,maximizedParticipant:u,floatingParticipant:p,isConstrained:!!a&&!!d}),v=o.useMemo(()=>y?[jw({client:y,aspectRatio:I[y.id],avatarSize:0,cellPaddings:{top:0,right:0}})]:[],[y,I]),w=o.useMemo(()=>m.map(e=>jw({client:e,aspectRatio:I[e.id],avatarSize:0,cellPaddings:{top:0,right:0}})),[m,I]),S=o.useMemo(()=>f.map(e=>jw({client:e,aspectRatio:I[e.id],avatarSize:0,cellPaddings:{top:0,right:0}})),[f,I]),R=o.useMemo(()=>b.map(e=>jw({client:e,aspectRatio:I[e.id],avatarSize:0,cellPaddings:{top:0,right:0},isSubgrid:!0})),[b,I]),Z=o.useMemo(()=>gw(c),[c]);o.useEffect(()=>{a&&C(c.width<500||c.height<500)},[c,a]);const V=o.useMemo(()=>Hw({floatingVideo:v[0],frame:Z,gridGap:i,isConstrained:d,roomBounds:Z.bounds,videos:w,videoGridGap:r,presentationVideos:S,subgridVideos:R}),[Z,v,w,S,R,i,r]);return{containerFrame:Z,cellViewsFloating:v,cellViewsVideoGrid:w,cellViewsInPresentationGrid:S,cellViewsInSubgrid:R,clientAspectRatios:I,videoStage:V,setContainerBounds:g,setClientAspectRatios:l,maximizedParticipant:u,setMaximizedParticipant:A,floatingParticipant:p,setFloatingParticipant:h,isConstrained:d}}({activeVideosSubgridTrigger:12,stageParticipantLimit:n,gridGap:i,videoGridGap:r,enableSubgrid:s,enableConstrainedGrid:c}),S=o.useCallback(({aspectRatio:e,clientId:t})=>{m(n=>Object.assign(Object.assign({},n),{[t]:e}))},[m]),R=o.useMemo(()=>Uk(Object.assign({cellView:C[0],enableParticipantMenu:a},t?{render:({participant:e})=>t({participant:e})}:{})),[C]),Z=o.useMemo(()=>l.map(t=>Uk(Object.assign({cellView:t,enableParticipantMenu:a},e?{render:({participant:t})=>e({participant:t})}:{}))),[l]),V=o.useMemo(()=>I.map(t=>Uk(Object.assign({cellView:t,enableParticipantMenu:a},e?{render:({participant:t})=>e({participant:t})}:{}))),[I]),k=o.useMemo(()=>u.map(e=>Uk({cellView:e,enableParticipantMenu:a})),[u]);return o.useEffect(()=>{if(!g.current)return;const e=new ResizeObserver(Vm(()=>{var e,t,n,i;h({width:null!==(t=null===(e=g.current)||void 0===e?void 0:e.clientWidth)&&void 0!==t?t:640,height:null!==(i=null===(n=g.current)||void 0===n?void 0:n.clientHeight)&&void 0!==i?i:480})},{delay:60,edges:!1}));return e.observe(g.current),()=>{e.disconnect()}},[]),o.createElement(Wk.Provider,{value:{onSetClientAspectRatio:S,cellViewsVideoGrid:I,cellViewsInPresentationGrid:l,cellViewsInSubgrid:u,clientAspectRatios:A,maximizedParticipant:f,setMaximizedParticipant:b,floatingParticipant:v,setFloatingParticipant:w,isConstrained:y}},o.createElement("div",{ref:g,style:{width:"100%",height:"100%",position:"relative"}},o.createElement(mw,{containerFrame:d,floatingContent:R,layoutVideoStage:p,presentationGridContent:Z,gridContent:V,subgridContent:k})))},e.VideoView=nw,e.WherebyProvider=function({children:e}){const t=o.useMemo(()=>new zv,[]);return o.useEffect(()=>()=>{t.destroy()},[t]),o.createElement(Qv.Provider,{value:t},e)},e.useLocalMedia=function(e={audio:!0,video:!0}){var t;const n=null===(t=o.useContext(Qv))||void 0===t?void 0:t.getLocalMedia(),[i,r]=o.useState(()=>sw);if(!n)throw new Error("WherebyClient is not initialized. Please wrap your component with WherebyProvider.");return o.useEffect(()=>{n.startMedia(e);const t=n.subscribe(e=>{r(t=>Object.assign(Object.assign({},t),e))});return()=>{t(),n.stopMedia()}},[]),{state:i,actions:{setCameraDevice:o.useCallback(e=>n.setCameraDevice(e),[n]),setMicrophoneDevice:o.useCallback(e=>n.setMicrophoneDevice(e),[n]),setSpeakerDevice:o.useCallback(e=>n.setSpeakerDevice(e),[n]),toggleCameraEnabled:o.useCallback(e=>n.toggleCamera(e),[n]),toggleMicrophoneEnabled:o.useCallback(e=>n.toggleMicrophone(e),[n]),toggleLowDataModeEnabled:o.useCallback(e=>n.toggleLowDataMode(e),[n])}}},e.useRoomConnection=function(e,t=rw){var n;const i=null===(n=o.useContext(Qv))||void 0===n?void 0:n.getRoomConnection(),[r,s]=o.useState(()=>iw);if(!i)throw new Error("WherebyClient is not initialized. Please wrap your component with WherebyProvider.");const a=o.useMemo(()=>{const n=new URL(e),i=new URLSearchParams(n.search),r=t.roomKey||i.get("roomKey");return{displayName:t.displayName||"Guest",localMediaOptions:t.localMedia?void 0:t.localMediaOptions,roomKey:r,roomUrl:e,userAgent:"browser-sdk:3.17.0",externalId:t.externalId||null}},[e,t]);o.useEffect(()=>{const e=i.subscribe(e=>{s(t=>Object.assign(Object.assign({},t),e))}),t=i.getNotificationsEventEmitter();return s(e=>Object.assign(Object.assign({},e),{events:t})),()=>{e(),i.leaveRoom()}},[]);const c=o.useCallback(()=>(i.initialize(a),i.joinRoom()),[i]),g=o.useCallback(e=>i.sendChatMessage(e),[i]),d=o.useCallback(()=>i.knock(),[i]),C=o.useCallback(e=>i.setDisplayName(e),[i]),I=o.useCallback(e=>i.toggleCamera(e),[i]),l=o.useCallback(e=>i.toggleMicrophone(e),[i]),u=o.useCallback(e=>i.toggleLowDataMode(e),[i]),A=o.useCallback(e=>i.toggleRaiseHand(e),[i]),p=o.useCallback(e=>i.askToSpeak(e),[i]),h=o.useCallback(e=>i.askToTurnOnCamera(e),[i]),m=o.useCallback(e=>i.acceptWaitingParticipant(e),[i]),f=o.useCallback(e=>i.rejectWaitingParticipant(e),[i]),b=o.useCallback(()=>i.startCloudRecording(),[i]),y=o.useCallback(()=>i.startScreenshare(),[i]),v=o.useCallback(()=>i.stopCloudRecording(),[i]),w=o.useCallback(()=>i.stopScreenshare(),[i]),S=o.useCallback(()=>i.leaveRoom(),[i]),R=o.useCallback(e=>i.lockRoom(e),[i]),Z=o.useCallback(e=>i.muteParticipants(e),[i]),V=o.useCallback(e=>i.turnOffParticipantCameras(e),[i]),k=o.useCallback(e=>i.spotlightParticipant(e),[i]),T=o.useCallback(e=>i.removeSpotlight(e),[i]),_=o.useCallback(e=>i.kickParticipant(e),[i]),G=o.useCallback(e=>i.endMeeting(e),[i]),B=o.useCallback(e=>i.joinBreakoutGroup(e),[i]),W=o.useCallback(()=>i.joinBreakoutMainRoom(),[i]),E=o.useCallback(e=>ew(this,void 0,void 0,function*(){yield i.switchCameraEffect(e)}),[i]),P=o.useCallback(e=>ew(this,void 0,void 0,function*(){yield i.switchCameraEffectCustom(e)}),[i]),X=o.useCallback(()=>ew(this,void 0,void 0,function*(){yield i.clearCameraEffect()}),[i]),{events:N}=r;return{state:qv(r,["events"]),events:N,actions:{toggleLowDataMode:u,toggleRaiseHand:A,askToSpeak:p,askToTurnOnCamera:h,acceptWaitingParticipant:m,knock:d,joinRoom:c,leaveRoom:S,lockRoom:R,muteParticipants:Z,turnOffParticipantCameras:V,kickParticipant:_,endMeeting:G,rejectWaitingParticipant:f,sendChatMessage:g,setDisplayName:C,startCloudRecording:b,startScreenshare:y,stopCloudRecording:v,stopScreenshare:w,toggleCamera:I,toggleMicrophone:l,spotlightParticipant:k,removeSpotlight:T,joinBreakoutGroup:B,joinBreakoutMainRoom:W,switchCameraEffect:E,switchCameraEffectCustom:P,clearCameraEffect:X}}},e}({},React,ReactDOM);
|