@onirix/ar-engine-sdk 1.6.11 → 1.6.13

Sign up to get free protection for your applications and to get access to all the features.
@@ -38,22 +38,22 @@ class Quaternion{constructor(t=0,s=0,i=0,h=1){this.x=t,this.y=s,this.z=i,this.w=
38
38
 
39
39
  const mat4RotationZ90CCW=(new Matrix4).set(0,1,0,0,-1,0,0,0,0,0,1,0,0,0,0,1),mat4RotationZ90CW=(new Matrix4).set(0,-1,0,0,1,0,0,0,0,0,1,0,0,0,0,1),mat4RotationX90CW=(new Matrix4).set(1,0,0,0,0,0,1,0,0,-1,0,0,0,0,0,1),mat3RotationX90CCW=(new Matrix3).set(1,0,0,0,0,1,0,-1,0),mat3RotationZ90CW=(new Matrix3).set(0,-1,0,1,0,0,0,0,1);
40
40
 
41
- class NativeManager{constructor(t,i,e,a){this.uiManager=t,this.deviceManager=i,this.workerManager=e,this.indexedDBManager=a;}async init(t,i){try{let e;try{e=await getFileFromIndexedDB("SDK_1.6.11");}catch(t){let i=await fetch(new URL("./onirix_native_sdk.js",import.meta.url).href);e=await i.text(),await this.indexedDBManager.saveFileToIndexedDB("SDK_1.6.11",e);}let a=URL.createObjectURL(new Blob([e],{type:"text/javascript"}));const{default:r}=await import(/* webpackIgnore: true, webpackMode: "lazy" */a);let s,n,o;if(this.useVocabulary=i.useVocabulary,this.host=i.host??"https://studio.onirix.com",this.useVocabulary&&(s=await this.indexedDBManager.getFromCacheOrFetch("orb.fbow","https://sdk.onirix.com/common/orb.fbow")),i.mode===TrackingMode.Spatial){if(n=await fetch(`${this.host}/api/projects/self/targets/${i.sceneOid}/osf?token=${t}`),!n.ok)throw new ReconstructionPendingError(`Could not get Onirix Spatial File. Server responded with ${n.status}`);const e=await n.arrayBuffer();o=new Uint8Array(e),await this.workerManager.createWorkers();}this.nativeSDK=await r({preRun:e=>{i.mode==TrackingMode.Spatial?e.FS_createDataFile("/","scene.osf",o,!0,!0,!0):i.mode===TrackingMode.Image?(this.useVocabulary&&e.FS_createDataFile("/","orb.fbow",s,!0,!0,!0),e.FS_createPreloadedFile("/","classifier.otf",`${this.host}/api/projects/self/targets/otf?token=${t}`,!0,!1)):i.mode===TrackingMode.Surface&&this.useVocabulary&&e.FS_createDataFile("/","orb.fbow",s,!0,!0,!0);}}),this.buffer=this.nativeSDK._malloc(1228800),this.imageBuffer=this.nativeSDK._malloc(1228800),this.imuAccData=this.nativeSDK._malloc(32),this.imuRotData=this.nativeSDK._malloc(72),this.cameraParamsStruct=this.nativeSDK._malloc(40),this.frameLayoutStruct=this.nativeSDK._malloc(28),this.nativeSDK.HEAPU32[this.cameraParamsStruct/4+0]=640,this.nativeSDK.HEAPU32[this.cameraParamsStruct/4+1]=480,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+1]=468,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+2]=468,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+3]=320,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+4]=240,i.debug&&this.nativeSDK._OX_SetLogCallback(this.nativeSDK.addFunction((t=>{console.log(this.nativeSDK.UTF8ToString(t));}),"vi"));}catch(t){throw t instanceof ReconstructionPendingError?t:new InternalError(t)}await this.checkLicense(t);}getIntrinsics(){return [this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+2],this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+3],this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+4]]}setIntrinsics(t,i,e){this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+1]=t,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+2]=t,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+3]=i,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+4]=e,this.nativeSDK._OX_UpdateIntrinsics(t,i,e);}async checkLicense(t){try{const i=this.getStringBuffer(this.host),e=this.getStringBuffer(t),a=this.getStringBuffer(window.location.hostname),r=this.getStringBuffer(this.deviceManager.platform),s=this.getStringBuffer(this.deviceManager.device),n=await new Promise(((t,n)=>{this.nativeSDK._OX_SetLicense([i],[e],[a],[r],[s],this.nativeSDK.addFunction((i=>t(i)),"vi"));}));if(this.releaseStringBuffer(i),this.releaseStringBuffer(e),this.releaseStringBuffer(a),this.releaseStringBuffer(r),this.releaseStringBuffer(s),!n)throw new LicenseError("Invalid license")}catch(t){throw new LicenseError(t)}}startImageTracking(t,i,e){if(this.onDetected=t,this.onPose=i,this.onLost=e,this.useVocabulary){const t=this.getStringBuffer("orb.fbow");this.nativeSDK._OX_Initialize(this.cameraParamsStruct,[t]),this.releaseStringBuffer(t);}else this.nativeSDK._OX_Initialize(this.cameraParamsStruct,"");let a=this.getStringBuffer("classifier.otf");this.nativeSDK._OX_LoadImageClassifier([a]),this.releaseStringBuffer(a),this.nativeSDK._OX_StartImageDetection(2,this.nativeSDK.addFunction((t=>this.onDetected(this.nativeSDK.UTF8ToString(t))),"vi"),this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let e=(new Matrix4).fromArray(i);e.multiply(mat4RotationX90CW),e.invert(),this.uiManager.isPortrait()?(e.multiply(mat4RotationZ90CCW),this.onPose(e.toArray())):this.onPose(e.toArray());}),"vi"),this.nativeSDK.addFunction((t=>this.onLost(this.nativeSDK.UTF8ToString(t))),"vi"));}startQRCodeTracking(t,i,e){this.onDetected=t,this.onPose=i,this.onLost=e,this.nativeSDK._OX_Initialize(this.cameraParamsStruct,""),this.nativeSDK._OX_StartQRCodeDetection(2,this.nativeSDK.addFunction((t=>this.onDetected(this.nativeSDK.UTF8ToString(t))),"vi"),this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let e=(new Matrix4).fromArray(i);e.multiply(mat4RotationX90CW),e.invert(),this.uiManager.isPortrait()?(e.multiply(mat4RotationZ90CCW),this.onPose(e.toArray())):this.onPose(e.toArray());}),"vi"),this.nativeSDK.addFunction((t=>this.onLost(this.nativeSDK.UTF8ToString(t))),"vi"));}startSLAM(t,i,e){if(this.onPose=t,this.onKeyFrame=i,this.onStatusChange=e,this.useVocabulary){const t=this.getStringBuffer("orb.fbow");this.nativeSDK._OX_Initialize(this.cameraParamsStruct,[t]),this.releaseStringBuffer(t);}else this.nativeSDK._OX_Initialize(this.cameraParamsStruct,"");this.nativeSDK._OX_StartSLAM(this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let e=(new Matrix4).fromArray(i);e.invert(),this.uiManager.isPortrait()?(e.multiply(mat4RotationZ90CCW),this.onPose(e.toArray())):this.onPose(e.toArray());}),"vi"),null!=this.onKeyFrame?this.nativeSDK.addFunction((()=>this.onKeyFrame()),"v"):null,this.nativeSDK.addFunction(((t,i)=>{this.onStatusChange([this.nativeSDK.UTF8ToString(t),this.nativeSDK.UTF8ToString(i)]);}),"vii"));}xrRelocation(t){if(this.lastXrPose){let i=(new Matrix4).fromArray(this.lastXrPose),e=(new Matrix4).fromArray(t.elements);this.xrTransform=e.multiply(i.invert());}}slamRelocation(t){if(this.lastSlamPose){let i=(new Matrix4).fromArray(this.lastSlamPose),e=(new Matrix4).fromArray(t.elements);this.slamTransform=e.multiply(i.invert());}}startSpatialTracking(t,i,e){this.onDetected=t,e||(this.onPose=i),this.nativeSDK._OX_Initialize(this.cameraParamsStruct,""),this.nativeSDK._OX_StartSpatialTracking(this.nativeSDK.addFunction((t=>{e||(this.spatialLocated=!0),this.onDetected("");}),"vi"),this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let a=(new Matrix4).fromArray(i);a.invert(),this.uiManager.isPortrait()&&a.multiply(e?mat4RotationZ90CW:mat4RotationZ90CCW),e?(this.xrRelocation(a),this.onDetected("")):this.onPose(a.toArray());}),"vi"),!e);let a=this.getStringBuffer("scene.osf");this.nativeSDK._OX_LoadOSF(a),this.releaseStringBuffer(a);}processFrame(t,i=null,e=480,a=640,r=0,s=0){let n=i||this.buffer;this.nativeSDK.HEAPU8.set(t,n),this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+0]=a,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+1]=e,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+2]=4*a,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+3]=!1,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+4]=5,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+5]=s,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+6]=r,this.nativeSDK._OX_ProcessFrame(n,this.frameLayoutStruct);}loadExtractionData(t,i=-1){return this.siftBuffer&&this.netvladBuffer?(this.nativeSDK.HEAPF32.set(t.extraction,this.siftBuffer/4),this.nativeSDK.HEAPF32.set(t.descriptor,this.netvladBuffer/4),this.nativeSDK._OX_LoadExtractionData(this.siftBuffer,this.netvladBuffer,i)):0}getCandidateData(t){let i=this.nativeSDK._OX_GetCandidateData(t),e=[];for(let t=0;t<55e4;t++)e.push(this.nativeSDK.HEAPF32[i/4+t]);return new Float32Array(e)}loadMatch(t){this.matchBuffer&&(this.nativeSDK.HEAPF32.set(t,this.matchBuffer/4),this.nativeSDK._OX_LoadMatch(this.matchBuffer));}spatialLocate(){this.nativeSDK._OX_SpatialLocate();}loadKeyframePose(t){this.nativeSDK._OX_LoadKfPose(t);}numSLAMKeyframes(){return this.nativeSDK._OX_GetSLAMNumKfs()}getSLAMKeyframe(t){let i=this.nativeSDK._OX_GetSLAMKf(t),e=[];for(let t=0;t<1228800;t++)e.push(this.nativeSDK.HEAPU8[i+t]);return new Uint8Array(e)}stopImageTracking(){this.nativeSDK._OX_StopImageDetection();}stopQRCodeTracking(){this.nativeSDK._OX_StopQRCodeDetection();}stopSLAM(){this.nativeSDK._OX_StopSLAM();}stopSLAM(){this.nativeSDK._OX_StopSLAM();}addImage(t,i){this.nativeSDK.HEAPU8.set(i,this.imageBuffer),this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+0]=640,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+1]=480,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+2]=2560,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+3]=!1,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+4]=5,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+5]=0,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+6]=0;const e=this.getStringBuffer(t);this.nativeSDK._OX_AddImage([e],this.imageBuffer,this.frameLayoutStruct),this.releaseStringBuffer(e);}destroy(){this.nativeSDK._OX_Destroy();}extractionType(){return this.nativeSDK._OX_ExtractionType()}getStringBuffer(t){const i=this.nativeSDK.lengthBytesUTF8(t)+1;let e=this.nativeSDK._malloc(i);return this.nativeSDK.stringToUTF8(t,e,i),e}releaseStringBuffer(t){this.nativeSDK._free(t);}getSLAMMap(){const t=this.nativeSDK.UTF8ToString(this.nativeSDK._OX_GetSLAMMap());let i;try{i=JSON.parse(t);}catch(i){console.error(`Could not parse ${t}`);}return i}getSLAMTrackingPoints(){const t=this.nativeSDK.UTF8ToString(this.nativeSDK._OX_GetSLAMTrackingPoints());let i;try{i=JSON.parse(t);}catch(i){console.error(`Could not parse ${t}`);}return i}raycast(t,i,e,a,r,s){const n=this.nativeSDK.UTF8ToString(this.nativeSDK._OX_Raycast(t,i,e,a,r,s));let o;try{o=JSON.parse(n);}catch(t){console.error(`Could not parse ${n}`);}return o}}
41
+ class NativeManager{constructor(t,i,e,a){this.uiManager=t,this.deviceManager=i,this.workerManager=e,this.indexedDBManager=a;}async init(t,i){try{let e;try{e=await getFileFromIndexedDB("SDK_1.6.13");}catch(t){let i=await fetch(new URL("./onirix_native_sdk.js",import.meta.url).href);e=await i.text(),await this.indexedDBManager.saveFileToIndexedDB("SDK_1.6.13",e);}let a=URL.createObjectURL(new Blob([e],{type:"text/javascript"}));const{default:r}=await import(/* webpackIgnore: true, webpackMode: "lazy" */a);let s,n,o;if(this.useVocabulary=i.useVocabulary,this.host=i.host??"https://studio.onirix.com",this.useVocabulary&&(s=await this.indexedDBManager.getFromCacheOrFetch("orb.fbow","https://sdk.onirix.com/common/orb.fbow")),i.mode===TrackingMode.Spatial){if(n=await fetch(`${this.host}/api/projects/self/targets/${i.sceneOid}/osf?token=${t}`),!n.ok)throw new ReconstructionPendingError(`Could not get Onirix Spatial File. Server responded with ${n.status}`);const e=await n.arrayBuffer();o=new Uint8Array(e),await this.workerManager.createWorkers();}this.nativeSDK=await r({preRun:e=>{i.mode==TrackingMode.Spatial?e.FS_createDataFile("/","scene.osf",o,!0,!0,!0):i.mode===TrackingMode.Image?(this.useVocabulary&&e.FS_createDataFile("/","orb.fbow",s,!0,!0,!0),e.FS_createPreloadedFile("/","classifier.otf",`${this.host}/api/projects/self/targets/otf?token=${t}`,!0,!1)):i.mode===TrackingMode.Surface&&this.useVocabulary&&e.FS_createDataFile("/","orb.fbow",s,!0,!0,!0);}}),this.buffer=this.nativeSDK._malloc(1228800),this.imageBuffer=this.nativeSDK._malloc(1228800),this.imuAccData=this.nativeSDK._malloc(32),this.imuRotData=this.nativeSDK._malloc(72),this.cameraParamsStruct=this.nativeSDK._malloc(40),this.frameLayoutStruct=this.nativeSDK._malloc(28),this.nativeSDK.HEAPU32[this.cameraParamsStruct/4+0]=640,this.nativeSDK.HEAPU32[this.cameraParamsStruct/4+1]=480,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+1]=468,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+2]=468,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+3]=320,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+4]=240,i.debug&&this.nativeSDK._OX_SetLogCallback(this.nativeSDK.addFunction((t=>{console.log(this.nativeSDK.UTF8ToString(t));}),"vi"));}catch(t){throw t instanceof ReconstructionPendingError?t:new InternalError(t)}await this.checkLicense(t);}getIntrinsics(){return [this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+2],this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+3],this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+4]]}setIntrinsics(t,i,e){this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+1]=t,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+2]=t,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+3]=i,this.nativeSDK.HEAPF64[this.cameraParamsStruct/8+4]=e,this.nativeSDK._OX_UpdateIntrinsics(t,i,e);}async checkLicense(t){try{const i=this.getStringBuffer(this.host),e=this.getStringBuffer(t),a=this.getStringBuffer(window.location.hostname),r=this.getStringBuffer(this.deviceManager.platform),s=this.getStringBuffer(this.deviceManager.device),n=await new Promise(((t,n)=>{this.nativeSDK._OX_SetLicense([i],[e],[a],[r],[s],this.nativeSDK.addFunction((i=>t(i)),"vi"));}));if(this.releaseStringBuffer(i),this.releaseStringBuffer(e),this.releaseStringBuffer(a),this.releaseStringBuffer(r),this.releaseStringBuffer(s),!n)throw new LicenseError("Invalid license")}catch(t){throw new LicenseError(t)}}startImageTracking(t,i,e){if(this.onDetected=t,this.onPose=i,this.onLost=e,this.useVocabulary){const t=this.getStringBuffer("orb.fbow");this.nativeSDK._OX_Initialize(this.cameraParamsStruct,[t]),this.releaseStringBuffer(t);}else this.nativeSDK._OX_Initialize(this.cameraParamsStruct,"");let a=this.getStringBuffer("classifier.otf");this.nativeSDK._OX_LoadImageClassifier([a]),this.releaseStringBuffer(a),this.nativeSDK._OX_StartImageDetection(2,this.nativeSDK.addFunction((t=>this.onDetected(this.nativeSDK.UTF8ToString(t))),"vi"),this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let e=(new Matrix4).fromArray(i);e.multiply(mat4RotationX90CW),e.invert(),this.uiManager.isPortrait()?(e.multiply(mat4RotationZ90CCW),this.onPose(e.toArray())):this.onPose(e.toArray());}),"vi"),this.nativeSDK.addFunction((t=>this.onLost(this.nativeSDK.UTF8ToString(t))),"vi"));}startQRCodeTracking(t,i,e){this.onDetected=t,this.onPose=i,this.onLost=e,this.nativeSDK._OX_Initialize(this.cameraParamsStruct,""),this.nativeSDK._OX_StartQRCodeDetection(2,this.nativeSDK.addFunction((t=>this.onDetected(this.nativeSDK.UTF8ToString(t))),"vi"),this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let e=(new Matrix4).fromArray(i);e.multiply(mat4RotationX90CW),e.invert(),this.uiManager.isPortrait()?(e.multiply(mat4RotationZ90CCW),this.onPose(e.toArray())):this.onPose(e.toArray());}),"vi"),this.nativeSDK.addFunction((t=>this.onLost(this.nativeSDK.UTF8ToString(t))),"vi"));}startSLAM(t,i,e){if(this.onPose=t,this.onKeyFrame=i,this.onStatusChange=e,this.useVocabulary){const t=this.getStringBuffer("orb.fbow");this.nativeSDK._OX_Initialize(this.cameraParamsStruct,[t]),this.releaseStringBuffer(t);}else this.nativeSDK._OX_Initialize(this.cameraParamsStruct,"");this.nativeSDK._OX_StartSLAM(this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let e=(new Matrix4).fromArray(i);e.invert(),this.uiManager.isPortrait()?(e.multiply(mat4RotationZ90CCW),this.onPose(e.toArray())):this.onPose(e.toArray());}),"vi"),null!=this.onKeyFrame?this.nativeSDK.addFunction((()=>this.onKeyFrame()),"v"):null,this.nativeSDK.addFunction(((t,i)=>{this.onStatusChange([this.nativeSDK.UTF8ToString(t),this.nativeSDK.UTF8ToString(i)]);}),"vii"));}xrRelocation(t){if(this.lastXrPose){let i=(new Matrix4).fromArray(this.lastXrPose),e=(new Matrix4).fromArray(t.elements);this.xrTransform=e.multiply(i.invert());}}slamRelocation(t){if(this.lastSlamPose){let i=(new Matrix4).fromArray(this.lastSlamPose),e=(new Matrix4).fromArray(t.elements);this.slamTransform=e.multiply(i.invert());}}startSpatialTracking(t,i,e){this.onDetected=t,e||(this.onPose=i),this.nativeSDK._OX_Initialize(this.cameraParamsStruct,""),this.nativeSDK._OX_StartSpatialTracking(this.nativeSDK.addFunction((t=>{e||(this.spatialLocated=!0),this.onDetected("");}),"vi"),this.nativeSDK.addFunction((t=>{const i=this.nativeSDK.HEAPF64.subarray(t/8,t/8+16);let a=(new Matrix4).fromArray(i);a.invert(),this.uiManager.isPortrait()&&a.multiply(e?mat4RotationZ90CW:mat4RotationZ90CCW),e?(this.xrRelocation(a),this.onDetected("")):this.onPose(a.toArray());}),"vi"),!e);let a=this.getStringBuffer("scene.osf");this.nativeSDK._OX_LoadOSF(a),this.releaseStringBuffer(a);}processFrame(t,i=null,e=480,a=640,r=0,s=0){let n=i||this.buffer;this.nativeSDK.HEAPU8.set(t,n),this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+0]=a,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+1]=e,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+2]=4*a,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+3]=!1,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+4]=5,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+5]=s,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+6]=r,this.nativeSDK._OX_ProcessFrame(n,this.frameLayoutStruct);}loadExtractionData(t,i=-1){return this.siftBuffer&&this.netvladBuffer?(this.nativeSDK.HEAPF32.set(t.extraction,this.siftBuffer/4),this.nativeSDK.HEAPF32.set(t.descriptor,this.netvladBuffer/4),this.nativeSDK._OX_LoadExtractionData(this.siftBuffer,this.netvladBuffer,i)):0}getCandidateData(t){let i=this.nativeSDK._OX_GetCandidateData(t),e=[];for(let t=0;t<55e4;t++)e.push(this.nativeSDK.HEAPF32[i/4+t]);return new Float32Array(e)}loadMatch(t){this.matchBuffer&&(this.nativeSDK.HEAPF32.set(t,this.matchBuffer/4),this.nativeSDK._OX_LoadMatch(this.matchBuffer));}spatialLocate(){this.nativeSDK._OX_SpatialLocate();}loadKeyframePose(t){this.nativeSDK._OX_LoadKfPose(t);}numSLAMKeyframes(){return this.nativeSDK._OX_GetSLAMNumKfs()}getSLAMKeyframe(t){let i=this.nativeSDK._OX_GetSLAMKf(t),e=[];for(let t=0;t<1228800;t++)e.push(this.nativeSDK.HEAPU8[i+t]);return new Uint8Array(e)}stopImageTracking(){this.nativeSDK._OX_StopImageDetection();}stopQRCodeTracking(){this.nativeSDK._OX_StopQRCodeDetection();}stopSLAM(){this.nativeSDK._OX_StopSLAM();}stopSLAM(){this.nativeSDK._OX_StopSLAM();}addImage(t,i){this.nativeSDK.HEAPU8.set(i,this.imageBuffer),this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+0]=640,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+1]=480,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+2]=2560,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+3]=!1,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+4]=5,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+5]=0,this.nativeSDK.HEAPU32[this.frameLayoutStruct/4+6]=0;const e=this.getStringBuffer(t);this.nativeSDK._OX_AddImage([e],this.imageBuffer,this.frameLayoutStruct),this.releaseStringBuffer(e);}destroy(){this.nativeSDK._OX_Destroy();}extractionType(){return this.nativeSDK._OX_ExtractionType()}getStringBuffer(t){const i=this.nativeSDK.lengthBytesUTF8(t)+1;let e=this.nativeSDK._malloc(i);return this.nativeSDK.stringToUTF8(t,e,i),e}releaseStringBuffer(t){this.nativeSDK._free(t);}getSLAMMap(){const t=this.nativeSDK.UTF8ToString(this.nativeSDK._OX_GetSLAMMap());let i;try{i=JSON.parse(t);}catch(i){console.error(`Could not parse ${t}`);}return i}getSLAMTrackingPoints(){const t=this.nativeSDK.UTF8ToString(this.nativeSDK._OX_GetSLAMTrackingPoints());let i;try{i=JSON.parse(t);}catch(i){console.error(`Could not parse ${t}`);}return i}raycast(t,i,e,a,r,s){const n=this.nativeSDK.UTF8ToString(this.nativeSDK._OX_Raycast(t,i,e,a,r,s));let o;try{o=JSON.parse(n);}catch(t){console.error(`Could not parse ${n}`);}return o}}
42
42
 
43
43
  class UIManager{constructor(){this.onFocus=this.onFocus.bind(this);}createRenderCanvas(){this.renderCanvas=document.createElement("canvas"),this.renderCanvas.id="renderer",this.renderCanvas.style.position="absolute",document.body.prepend(this.renderCanvas),this.addTouchListeners();}setRenderCanvas(e){this.renderCanvas=e,this.addTouchListeners();}addTouchListeners(){this.renderCanvas.addEventListener("click",(e=>{this.onCanvasTouch(e);})),this.renderCanvas.addEventListener("touchstart",(e=>{this.onCanvasTouchStart(e);})),this.renderCanvas.addEventListener("touchmove",(e=>{this.onCanvasTouchMove(e);})),this.renderCanvas.addEventListener("touchend",(e=>{this.onCanvasTouchEnd(e);}));}removeRenderCanvas(){this.renderCanvas&&(this.renderCanvas.remove(),this.renderCanvas=null);}createVideoElement(e,t,i){let o=document.createElement("video");o.setAttribute("playsinline","true"),o.setAttribute("autoplay","true"),o.setAttribute("muted",""),this.videoCanvas=document.createElement("canvas"),this.videoCanvas.width=t,this.videoCanvas.height=i,this.videoContext=this.videoCanvas.getContext("2d"),o.srcObject=e,document.body.appendChild(o),this.videoElement=o;const s=this.videoElement.srcObject.getVideoTracks()[0].getSettings();this.videoSizeHorizontal=[Math.max(s.width,s.height),Math.min(s.width,s.height)],this.videoSizeVertical=[Math.min(s.width,s.height),Math.max(s.width,s.height)],window.addEventListener("focus",this.onFocus);}onFocus(){this.videoElement.play();}removeVideoElement(){this.videoElement&&(window.removeEventListener("focus",this.onFocus),this.videoElement.remove(),this.videoElement=null);}fitVideoToScreen(){this.videoSize=window.innerWidth>window.innerHeight?this.videoSizeHorizontal:this.videoSizeVertical;let e=[],t=[];this.videoSize[0]/this.videoSize[1]>window.innerWidth/window.innerHeight?(t=[Math.floor(this.videoSize[0]*(window.innerHeight/this.videoSize[1])),window.innerHeight],e=[-(t[0]-window.innerWidth)/2,0]):(t=[window.innerWidth,Math.floor(this.videoSize[1]*(window.innerWidth/this.videoSize[0]))],e=[0,-(t[1]-window.innerHeight)/2]),document.body.style.setProperty("overflow","hidden"),this.videoElement.width=t[0],this.videoElement.height=t[1],this.videoElement.style.setProperty("position","fixed"),this.videoElement.style.setProperty("z-index","-1"),this.videoElement.style.setProperty("width",`${t[0]}px`),this.videoElement.style.setProperty("height",`${t[1]}px`),this.videoElement.style.setProperty("left",`${e[0]}px`),this.videoElement.style.setProperty("top",`${e[1]}px`),this.videoElement.style.setProperty("touch-action","none"),this.renderCanvas.width=t[0],this.renderCanvas.height=t[1],this.renderCanvas.style.setProperty("position","fixed","important"),this.renderCanvas.style.setProperty("width",`${t[0]}px`,"important"),this.renderCanvas.style.setProperty("height",`${t[1]}px`,"important"),this.renderCanvas.style.setProperty("left",`${e[0]}px`,"important"),this.renderCanvas.style.setProperty("top",`${e[1]}px`,"important"),this.renderCanvas.style.setProperty("touch-action","none","important");}async displayPermissionsDialog(e){return new Promise(((t,i)=>{let o,s,n,r;o=document.createElement("div"),o.id="ox-permissions-dialog",o.style.setProperty("position","fixed"),o.style.setProperty("z-index","999999"),o.style.setProperty("max-width","360px"),o.style.setProperty("width","calc(100% - 140px"),o.style.setProperty("left","50vw"),o.style.setProperty("top","50vh"),o.style.setProperty("transform","translate(-50%, -50%)"),o.style.setProperty("background-color","#FFFFFF"),o.style.setProperty("border-radius","10px"),o.style.setProperty("font-family","'Open Sans', Arial, sans-serif"),o.style.setProperty("text-align","center"),o.style.setProperty("padding","30px"),document.body.appendChild(o),s=document.createElement("h1"),s.id="ox-permissions-dialog-title",s.innerText="Access to motion sensors required",s.style.setProperty("font-size","20px"),o.appendChild(s),n=document.createElement("span"),n.id="ox-permissions-dialog-message",n.innerText="This augmented reality experience requires access to your phone motion sensors. The browser may ask you for permissions.",n.style.setProperty("display","block"),n.style.setProperty("padding","10px 0"),o.appendChild(n),r=document.createElement("button"),r.id="ox-permissions-dialog-ok-button",r.innerText="Okay!",r.style.setProperty("display","block"),r.style.setProperty("margin","auto"),r.style.setProperty("background","#000000"),r.style.setProperty("color","#FFFFFF"),r.style.setProperty("border","none"),r.style.setProperty("border-radius","12px"),r.style.setProperty("padding","20px 0"),r.style.setProperty("width","100%"),r.style.setProperty("font-size","18px"),r.style.setProperty("font-weight","bold"),r.style.setProperty("margin-top","20px"),r.style.setProperty("background-image","linear-gradient(to left, #f6414b, #ee0979)"),o.appendChild(r),r.addEventListener("click",(async s=>{s.stopPropagation(),o.remove();try{await e(),t();}catch(e){i(e);}}));}))}getVideoData(){let e;if(this.videoElement){if(this.isPortrait()){let[e,i]=this.videoSizeVertical;var t=Math.PI/2;this.videoContext.translate(480,0),this.videoContext.rotate(t),this.videoContext.drawImage(this.videoElement,0,0,i,i,0,-160,640,640),this.videoContext.rotate(-t),this.videoContext.translate(-480,0);}else this.videoContext.drawImage(this.videoElement,0,0,640,480);e=this.videoContext.getImageData(0,0,640,480).data;}return e}getVideoElement(){return this.videoElement}getCameraParameters(){let e=640,t=480;return this.isPortrait()||([e,t]=[t,e]),{fov:radToDeg(2*Math.atan(e/936)),aspect:t/e}}isPortrait(){return window.innerWidth<window.innerHeight}setTouchListener(e){this.onTouch=e;}setTouchStartListener(e){this.onTouchStart=e;}setTouchMoveListener(e){this.onTouchMove=e;}setTouchEndListener(e){this.onTouchEnd=e;}getNormalizedTouchCoords(e){const t=new Vector2,i=this.renderCanvas.getBoundingClientRect();return null!=e.clientX?(t.x=(e.clientX-i.left)/i.width*2-1,t.y=-(e.clientY-i.top)/i.height*2+1):e.touches[0]?(t.x=e.touches[0].clientX/window.innerWidth*2-1,t.y=-e.touches[0].clientY/window.innerHeight*2+1):(t.x=e.changedTouches[0].clientX/window.innerWidth*2-1,t.y=-e.changedTouches[0].clientY/window.innerHeight*2+1),t}onCanvasTouch(e){const t=this.getNormalizedTouchCoords(e);this.onTouch&&this.onTouch(t);}onCanvasTouchStart(e){const t=this.getNormalizedTouchCoords(e);this.onTouchStart&&this.onTouchStart(t);}onCanvasTouchMove(e){const t=this.getNormalizedTouchCoords(e);this.onTouchMove&&this.onTouchMove(t);}onCanvasTouchEnd(e){const t=this.getNormalizedTouchCoords(e);this.onTouchEnd&&this.onTouchEnd(t);}}
44
44
 
45
- class CameraManager{constructor(e){this.uiManager=e;}async startCamera(e){try{let a=await navigator.mediaDevices.enumerateDevices();a=a.filter((e=>!e.label.includes("Telephoto"))),a=a.filter((e=>!e.label.includes("Wide")));let t,i=a[a.length-1];a.forEach((e=>{"videoinput"===e.kind&&(i=e);})),t=e?{facingMode:{exact:"environment"},width:{min:640,ideal:1280,max:1280},height:{min:480,ideal:960,max:960},aspectRatio:{exact:640/480}}:{facingMode:"environment",width:640,height:480},i&&i.deviceId&&""!==i.deviceId&&(t.deviceId={exact:i.deviceId});const r=await navigator.mediaDevices.getUserMedia({video:t,audio:!1});let{width:n,height:s}=r.getTracks()[0].getSettings();this.stream=r,this.uiManager.createVideoElement(this.stream,n,s);}catch(e){throw new CameraError(e)}}stopCamera(){this.stream&&(this.stream.getTracks().forEach((e=>{e.stop();})),this.uiManager.removeVideoElement());}}
45
+ class CameraManager{constructor(e,a){this.uiManager=e,this.deviceManager=a;}async startCamera(e){try{let a,i,t=await navigator.mediaDevices.enumerateDevices();if(t=t.filter((e=>"videoinput"===e.kind)),this.deviceManager.os===DeviceManager.OS.iOS){a=t[1==t.length?0:t.length-2];}else t=t.filter((e=>!e.label.includes("Telephoto"))),t=t.filter((e=>!e.label.includes("Wide"))),a=t[t.length-1];i=e?{facingMode:{exact:"environment"},width:{min:640,ideal:1280,max:1280},height:{min:480,ideal:960,max:960},aspectRatio:{exact:640/480}}:{facingMode:"environment",width:640,height:480},a&&a.deviceId&&""!==a.deviceId&&(i.deviceId={exact:a.deviceId});const r=await navigator.mediaDevices.getUserMedia({video:i,audio:!1});let{width:n,height:s}=r.getTracks()[0].getSettings();this.stream=r,this.uiManager.createVideoElement(this.stream,n,s);}catch(e){throw new CameraError(e)}}stopCamera(){this.stream&&(this.stream.getTracks().forEach((e=>{e.stop();})),this.stream=null,this.uiManager.removeVideoElement());}}
46
46
 
47
47
  class IMUManager{constructor(e,t){this.uiManager=e,this.deviceManager=t,this.started=!1;}async init(e,t,i){this.onRotation=e,this.onAcceleration=t,this.onEmulatedHitTest=i;const n=async()=>{if(this.onDeviceOrientationChange=this.onDeviceOrientationChange.bind(this),this.onDeviceMotionChange=this.onDeviceMotionChange.bind(this),void 0!==window.DeviceOrientationEvent&&"function"==typeof window.DeviceOrientationEvent.requestPermission){let e;try{e=await window.DeviceOrientationEvent.requestPermission();}catch(e){throw new SensorsError("DeviceOrientation API is not supported")}if("granted"!=e)throw new SensorsError("DeviceOrientation permissions were rejected");try{e=await window.DeviceMotionEvent.requestPermission();}catch(e){throw new SensorsError("DeviceMotion API is not supported")}if("granted"!=e)throw new SensorsError("DeviceMotion permissions were rejected");window.addEventListener("deviceorientation",this.onDeviceOrientationChange),window.addEventListener("devicemotion",this.onDeviceMotionChange);}else window.addEventListener("deviceorientation",this.onDeviceOrientationChange),window.addEventListener("devicemotion",this.onDeviceMotionChange);};this.deviceManager.os===DeviceManager.OS.iOS?await this.uiManager.displayPermissionsDialog(n):await n();}start(){this.started=!0;}stop(){this.started=!1;}destroy(){this.stop(),window.removeEventListener("deviceorientation",this.onDeviceOrientationChange),window.removeEventListener("devicemotion",this.onDeviceMotionChange);}onDeviceMotionChange(e){this.started&&e.acceleration&&e.acceleration.x&&e.acceleration.y&&e.acceleration.z&&(this.acceleration=new Vector3(e.acceleration.x,e.acceleration.y,e.acceleration.z),this.onAcceleration(this.acceleration));}onDeviceOrientationChange(e){if(this.started&&e.alpha&&e.beta&&e.gamma){const t=degToRad(e.alpha),i=degToRad(e.beta),n=degToRad(e.gamma);let o=new Euler(i,t,-n,"YXZ"),a=(new Matrix3).makeRotationFromEuler(o);a.multiply(mat3RotationX90CCW);const r=degToRad(window.orientation||0);if(0!==r&&a.multiply((new Matrix3).makeRotationFromQuaternion((new Quaternion).setFromAxisAngle(new Vector3(0,0,1),-r))),this.rotation=a,this.onRotation(this.rotation),this.onEmulatedHitTest){const e=this.emulatedHitTest();this.onEmulatedHitTest(e);}}}emulatedHitTest(){const e=new Vector3(0,0,0),t=new Vector3(-this.rotation.elements[6],-this.rotation.elements[7],-this.rotation.elements[8]),i=new Vector3(0,1,0),n=new Vector3(0,-1,0),o=t.dot(i);if(Math.abs(o)>1e-6){const a=n.sub(e).dot(i)/o,r=e.add(t.multiplyScalar(a)),s=(new Matrix4).lookAt(new Vector3(0,-1,0),r,new Vector3(0,1,0));return {position:r,rotation:(new Quaternion).setFromRotationMatrix(s)}}return null}}
48
48
 
49
- class WorkerExtractionData{constructor(l,Z,b,d,G,m,c=5){this.data=l,this.width=Z,this.height=b,this.rotate=d,this.flip=G,this.colorSpace=c,this.dtype=m;}}class WorkerMatchingData{constructor(l,Z,b,d){this.idx=l,this.from=Z,this.to=b,this.dtype=d;}}class WorkerManager{constructor(){this.workers={},this.callbacks={};}workerExists(l){return void 0!==this.workers[l]&&void 0!==this.callbacks[l]}createExtractionWorker(l,Z){if(!this.workerExists(l)){let b=atob("Y2xhc3MgSW5kZXhlZERCTWFuYWdlcntjb25zdHJ1Y3RvcihlLHIpe3RoaXMuZGJOYW1lPWUsdGhpcy5zdG9yZU5hbWU9cjt9YXN5bmMgZ2V0RnJvbUNhY2hlT3JGZXRjaChlLHIpe2xldCB0PW51bGw7dHJ5e3Q9YXdhaXQgdGhpcy5nZXRGaWxlRnJvbUluZGV4ZWREQihlKTt9Y2F0Y2goZSl7Y29uc29sZS5sb2coIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBnZXQgZWxlbWVudCBmcm9tIGluZGV4ZWREQi4iKTt9cmV0dXJuIHR8fCh0PWF3YWl0IHRoaXMuZmV0Y2hBbmRDYWNoZUZpbGUocixlKSksbmV3IFVpbnQ4QXJyYXkodCl9YXN5bmMgZ2V0RmlsZUZyb21JbmRleGVkREIoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCgocix0KT0+e2NvbnN0IG89aW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUpO28ub25lcnJvcj0oKT0+dChvLmVycm9yKSxvLm9uc3VjY2Vzcz0oKT0+e2NvbnN0IHM9by5yZXN1bHQudHJhbnNhY3Rpb24odGhpcy5zdG9yZU5hbWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLmdldChlKTtzLm9uc3VjY2Vzcz0oKT0+cihzLnJlc3VsdCkscy5vbmVycm9yPSgpPT50KHMuZXJyb3IpO30sby5vbnVwZ3JhZGVuZWVkZWQ9ZT0+e2UudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7fTt9KSl9YXN5bmMgc2F2ZUZpbGVUb0luZGV4ZWREQihlLHIpe3JldHVybiBuZXcgUHJvbWlzZSgoKHQsbyk9Pntjb25zdCBzPWluZGV4ZWREQi5vcGVuKHRoaXMuZGJOYW1lKTtzLm9uZXJyb3I9KCk9Pm8ocy5lcnJvcikscy5vbnVwZ3JhZGVuZWVkZWQ9ZT0+e2UudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7fSxzLm9uc3VjY2Vzcz0oKT0+e3RyeXtjb25zdCBuPXMucmVzdWx0LnRyYW5zYWN0aW9uKHRoaXMuc3RvcmVOYW1lLCJyZWFkd3JpdGUiKSxhPW4ub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLnB1dChyLGUpO2Eub25zdWNjZXNzPSgpPT50KGEucmVzdWx0KSxhLm9uZXJyb3I9KCk9Pm8oYS5lcnJvcik7fWNhdGNoKGUpe28oZSk7fX07fSkpfWFzeW5jIGZldGNoQW5kQ2FjaGVGaWxlKGUscil7Y29uc3QgdD1hd2FpdCBmZXRjaChlKSxvPWF3YWl0IHQuYXJyYXlCdWZmZXIoKTtyZXR1cm4gYXdhaXQgdGhpcy5zYXZlRmlsZVRvSW5kZXhlZERCKHIsbyksb319Cgp2YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTsKCmZ1bmN0aW9uIGdldERlZmF1bHRFeHBvcnRGcm9tQ2pzICh4KSB7CglyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4Owp9Cgp2YXIgb3J0X21pbiA9IHtleHBvcnRzOiB7fX07CgpvcnRfbWluLmV4cG9ydHM7KGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXt2YXIgdDt0PSgpPT4oKCk9Pnt2YXIgX193ZWJwYWNrX21vZHVsZXNfXz17NTcxNjooZSx0LG4pPT57dC5SPXZvaWQgMDtjb25zdCByPW4oNjAyNyksbz1uKDE3MjMpO3QuUj1uZXcgY2xhc3N7YXN5bmMgaW5pdCgpe31hc3luYyBjcmVhdGVTZXNzaW9uSGFuZGxlcihlLHQpe2NvbnN0IG49bmV3IHIuU2Vzc2lvbih0KTtyZXR1cm4gYXdhaXQgbi5sb2FkTW9kZWwoZSksbmV3IG8uT25ueGpzU2Vzc2lvbkhhbmRsZXIobil9fTt9LDI4MTg6KGUsdCxuKT0+e3QuYzg9dC5yWD12b2lkIDA7Y29uc3Qgcj1uKDIyMzUpLG89big1MzgxKSxpPW4oOTU0NCkscz1uKDY2NDApO3Quclg9KCk9PntpZigoIm51bWJlciIhPXR5cGVvZiByLmVudi53YXNtLmluaXRUaW1lb3V0fHxyLmVudi53YXNtLmluaXRUaW1lb3V0PDApJiYoci5lbnYud2FzbS5pbml0VGltZW91dD0wKSwiYm9vbGVhbiIhPXR5cGVvZiByLmVudi53YXNtLnNpbWQmJihyLmVudi53YXNtLnNpbWQ9ITApLCJib29sZWFuIiE9dHlwZW9mIHIuZW52Lndhc20ucHJveHkmJihyLmVudi53YXNtLnByb3h5PSExKSwibnVtYmVyIiE9dHlwZW9mIHIuZW52Lndhc20ubnVtVGhyZWFkc3x8IU51bWJlci5pc0ludGVnZXIoci5lbnYud2FzbS5udW1UaHJlYWRzKXx8ci5lbnYud2FzbS5udW1UaHJlYWRzPD0wKXtjb25zdCBlPSJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yPygwLCBvLmNwdXMpKCkubGVuZ3RoOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5O3IuZW52Lndhc20ubnVtVGhyZWFkcz1NYXRoLm1pbig0LE1hdGguY2VpbCgoZXx8MSkvMikpO319LHQuYzg9bmV3IGNsYXNze2FzeW5jIGluaXQoKXsoMCwgdC5yWCkoKSxhd2FpdCgwLCBpLmluaXRpYWxpemVXZWJBc3NlbWJseUluc3RhbmNlKSgpO31hc3luYyBjcmVhdGVTZXNzaW9uSGFuZGxlcihlLHQpe2NvbnN0IG49bmV3IHMuT25ueHJ1bnRpbWVXZWJBc3NlbWJseVNlc3Npb25IYW5kbGVyO3JldHVybiBhd2FpdCBuLmxvYWRNb2RlbChlLHQpLFByb21pc2UucmVzb2x2ZShuKX19O30sMTA1NzpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyYmdGhpcy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pO3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtvJiYhKCJnZXQiaW4gbz8hdC5fX2VzTW9kdWxlOm8ud3JpdGFibGV8fG8uY29uZmlndXJhYmxlKXx8KG89e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixvKTt9OmZ1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pLGVbcl09dFtuXTt9KSxvPXRoaXMmJnRoaXMuX19leHBvcnRTdGFyfHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKSJkZWZhdWx0Ij09PW58fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pfHxyKHQsZSxuKTt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxvKG4oMjIzNSksdCk7Y29uc3QgaT1uKDIyMzUpLHM9big4NDA4KTt7Y29uc3QgZT1uKDU3MTYpLlI7KDAsIGkucmVnaXN0ZXJCYWNrZW5kKSgid2ViZ2wiLGUsLTEwKTt9e2NvbnN0IGU9bigyODE4KS5jODsoMCwgaS5yZWdpc3RlckJhY2tlbmQpKCJjcHUiLGUsMTApLCgwLCBpLnJlZ2lzdGVyQmFja2VuZCkoIndhc20iLGUsMTApLCgwLCBpLnJlZ2lzdGVyQmFja2VuZCkoInhubnBhY2siLGUsOSksKDAsIGkucmVnaXN0ZXJCYWNrZW5kKSgid2Vibm4iLGUsOSk7fWkuZW52LnZlcnNpb25zLndlYj1zLnZlcnNpb247fSw0OTEwOihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5PXZvaWQgMDtjbGFzcyBue2NvbnN0cnVjdG9yKGUpe09iamVjdC5hc3NpZ24odGhpcyxlKTt9Z2V0IGNhY2hlS2V5KCl7cmV0dXJuIHRoaXMuX2NhY2hlS2V5fHwodGhpcy5fY2FjaGVLZXk9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykuc29ydCgpLm1hcCgoZT0+YCR7dGhpc1tlXX1gKSkuam9pbigiOyIpKSx0aGlzLl9jYWNoZUtleX19dC5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXk9ZT0+bmV3IG4oZSk7fSw2ODc0OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5BdHRyaWJ1dGU9dm9pZCAwO2NvbnN0IHI9big1MTI3KSxvPW4oMjQ0NiksaT1uKDkyNDApLHM9big3MjczKTt2YXIgYT1yLm9ubnhydW50aW1lLmV4cGVyaW1lbnRhbC5mYnM7Y2xhc3MgdXtjb25zdHJ1Y3RvcihlKXtpZih0aGlzLl9hdHRyaWJ1dGVzPW5ldyBNYXAsbnVsbCE9ZSl7Zm9yKGNvbnN0IHQgb2YgZSl0IGluc3RhbmNlb2Ygby5vbm54LkF0dHJpYnV0ZVByb3RvP3RoaXMuX2F0dHJpYnV0ZXMuc2V0KHQubmFtZSxbdS5nZXRWYWx1ZSh0KSx1LmdldFR5cGUodCldKTp0IGluc3RhbmNlb2YgYS5BdHRyaWJ1dGUmJnRoaXMuX2F0dHJpYnV0ZXMuc2V0KHQubmFtZSgpLFt1LmdldFZhbHVlKHQpLHUuZ2V0VHlwZSh0KV0pO2lmKHRoaXMuX2F0dHJpYnV0ZXMuc2l6ZTxlLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImR1cGxpY2F0ZWQgYXR0cmlidXRlIG5hbWVzIil9fXNldChlLHQsbil7dGhpcy5fYXR0cmlidXRlcy5zZXQoZSxbbix0XSk7fWRlbGV0ZShlKXt0aGlzLl9hdHRyaWJ1dGVzLmRlbGV0ZShlKTt9Z2V0RmxvYXQoZSx0KXtyZXR1cm4gdGhpcy5nZXQoZSwiZmxvYXQiLHQpfWdldEludChlLHQpe3JldHVybiB0aGlzLmdldChlLCJpbnQiLHQpfWdldFN0cmluZyhlLHQpe3JldHVybiB0aGlzLmdldChlLCJzdHJpbmciLHQpfWdldFRlbnNvcihlLHQpe3JldHVybiB0aGlzLmdldChlLCJ0ZW5zb3IiLHQpfWdldEZsb2F0cyhlLHQpe3JldHVybiB0aGlzLmdldChlLCJmbG9hdHMiLHQpfWdldEludHMoZSx0KXtyZXR1cm4gdGhpcy5nZXQoZSwiaW50cyIsdCl9Z2V0U3RyaW5ncyhlLHQpe3JldHVybiB0aGlzLmdldChlLCJzdHJpbmdzIix0KX1nZXRUZW5zb3JzKGUsdCl7cmV0dXJuIHRoaXMuZ2V0KGUsInRlbnNvcnMiLHQpfWdldChlLHQsbil7Y29uc3Qgcj10aGlzLl9hdHRyaWJ1dGVzLmdldChlKTtpZih2b2lkIDA9PT1yKXtpZih2b2lkIDAhPT1uKXJldHVybiBuO3Rocm93IG5ldyBFcnJvcihgcmVxdWlyZWQgYXR0cmlidXRlIG5vdCBmb3VuZDogJHtlfWApfWlmKHJbMV0hPT10KXRocm93IG5ldyBFcnJvcihgdHlwZSBtaXNtYXRjaDogZXhwZWN0ZWQgJHt0fSBidXQgZ290ICR7clsxXX1gKTtyZXR1cm4gclswXX1zdGF0aWMgZ2V0VHlwZShlKXtjb25zdCB0PWUgaW5zdGFuY2VvZiBvLm9ubnguQXR0cmlidXRlUHJvdG8/ZS50eXBlOmUudHlwZSgpO3N3aXRjaCh0KXtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkZMT0FUOnJldHVybiAiZmxvYXQiO2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuSU5UOnJldHVybiAiaW50IjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlNUUklORzpyZXR1cm4gInN0cmluZyI7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5URU5TT1I6cmV0dXJuICJ0ZW5zb3IiO2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuRkxPQVRTOnJldHVybiAiZmxvYXRzIjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLklOVFM6cmV0dXJuICJpbnRzIjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlNUUklOR1M6cmV0dXJuICJzdHJpbmdzIjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlRFTlNPUlM6cmV0dXJuICJ0ZW5zb3JzIjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgYXR0cmlidXRlIHR5cGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQ6ICR7by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGVbdF19YCl9fXN0YXRpYyBnZXRWYWx1ZShlKXtjb25zdCB0PWUgaW5zdGFuY2VvZiBvLm9ubnguQXR0cmlidXRlUHJvdG8/ZS50eXBlOmUudHlwZSgpO2lmKHQ9PT1vLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5HUkFQSHx8dD09PW8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkdSQVBIUyl0aHJvdyBuZXcgRXJyb3IoImdyYXBoIGF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIHlldCIpO2NvbnN0IG49dGhpcy5nZXRWYWx1ZU5vQ2hlY2soZSk7aWYodD09PW8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLklOVCYmcy5Mb25nVXRpbC5pc0xvbmcobikpcmV0dXJuIHMuTG9uZ1V0aWwubG9uZ1RvTnVtYmVyKG4pO2lmKHQ9PT1vLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5JTlRTKXtjb25zdCBlPW4sdD1uZXcgQXJyYXkoZS5sZW5ndGgpO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdCByPWVbbl07dFtuXT1zLkxvbmdVdGlsLmxvbmdUb051bWJlcihyKTt9cmV0dXJuIHR9aWYodD09PW8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlRFTlNPUilyZXR1cm4gZSBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bz9pLlRlbnNvci5mcm9tUHJvdG8obik6aS5UZW5zb3IuZnJvbU9ydFRlbnNvcihuKTtpZih0PT09by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuVEVOU09SUyl7aWYoZSBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bylyZXR1cm4gbi5tYXAoKGU9PmkuVGVuc29yLmZyb21Qcm90byhlKSkpO2lmKGUgaW5zdGFuY2VvZiBhLkF0dHJpYnV0ZSlyZXR1cm4gbi5tYXAoKGU9PmkuVGVuc29yLmZyb21PcnRUZW5zb3IoZSkpKX1pZih0PT09by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuU1RSSU5HJiZlIGluc3RhbmNlb2Ygby5vbm54LkF0dHJpYnV0ZVByb3RvKXtjb25zdCBlPW47cmV0dXJuICgwLCBzLmRlY29kZVV0ZjhTdHJpbmcpKGUpfXJldHVybiB0PT09by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuU1RSSU5HUyYmZSBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bz9uLm1hcChzLmRlY29kZVV0ZjhTdHJpbmcpOm59c3RhdGljIGdldFZhbHVlTm9DaGVjayhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bz90aGlzLmdldFZhbHVlTm9DaGVja0Zyb21Pbm54Rm9ybWF0KGUpOnRoaXMuZ2V0VmFsdWVOb0NoZWNrRnJvbU9ydEZvcm1hdChlKX1zdGF0aWMgZ2V0VmFsdWVOb0NoZWNrRnJvbU9ubnhGb3JtYXQoZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5GTE9BVDpyZXR1cm4gZS5mO2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuSU5UOnJldHVybiBlLmk7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5TVFJJTkc6cmV0dXJuIGUucztjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlRFTlNPUjpyZXR1cm4gZS50O2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuR1JBUEg6cmV0dXJuIGUuZztjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkZMT0FUUzpyZXR1cm4gZS5mbG9hdHM7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5JTlRTOnJldHVybiBlLmludHM7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5TVFJJTkdTOnJldHVybiBlLnN0cmluZ3M7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5URU5TT1JTOnJldHVybiBlLnRlbnNvcnM7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5HUkFQSFM6cmV0dXJuIGUuZ3JhcGhzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBhdHRyaWJ1dGUgdHlwZTogJHtvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZVtlLnR5cGVdfWApfX1zdGF0aWMgZ2V0VmFsdWVOb0NoZWNrRnJvbU9ydEZvcm1hdChlKXtzd2l0Y2goZS50eXBlKCkpe2Nhc2UgYS5BdHRyaWJ1dGVUeXBlLkZMT0FUOnJldHVybiBlLmYoKTtjYXNlIGEuQXR0cmlidXRlVHlwZS5JTlQ6cmV0dXJuIGUuaSgpO2Nhc2UgYS5BdHRyaWJ1dGVUeXBlLlNUUklORzpyZXR1cm4gZS5zKCk7Y2FzZSBhLkF0dHJpYnV0ZVR5cGUuVEVOU09SOnJldHVybiBlLnQoKTtjYXNlIGEuQXR0cmlidXRlVHlwZS5HUkFQSDpyZXR1cm4gZS5nKCk7Y2FzZSBhLkF0dHJpYnV0ZVR5cGUuRkxPQVRTOnJldHVybiBlLmZsb2F0c0FycmF5KCk7Y2FzZSBhLkF0dHJpYnV0ZVR5cGUuSU5UUzp7Y29uc3QgdD1bXTtmb3IobGV0IG49MDtuPGUuaW50c0xlbmd0aCgpO24rKyl0LnB1c2goZS5pbnRzKG4pKTtyZXR1cm4gdH1jYXNlIGEuQXR0cmlidXRlVHlwZS5TVFJJTkdTOntjb25zdCB0PVtdO2ZvcihsZXQgbj0wO248ZS5zdHJpbmdzTGVuZ3RoKCk7bisrKXQucHVzaChlLnN0cmluZ3MobikpO3JldHVybiB0fWNhc2UgYS5BdHRyaWJ1dGVUeXBlLlRFTlNPUlM6e2NvbnN0IHQ9W107Zm9yKGxldCBuPTA7bjxlLnRlbnNvcnNMZW5ndGgoKTtuKyspdC5wdXNoKGUudGVuc29ycyhuKSk7cmV0dXJuIHR9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGF0dHJpYnV0ZSB0eXBlOiAke2EuQXR0cmlidXRlVHlwZVtlLnR5cGUoKV19YCl9fX10LkF0dHJpYnV0ZT11O30sMTk3NTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucmVzb2x2ZUJhY2tlbmQ9dC5iYWNrZW5kPXZvaWQgMDtjb25zdCByPW4oNDQxOCksbz1uZXcgTWFwO2FzeW5jIGZ1bmN0aW9uIGkoZSl7Y29uc3Qgbj10LmJhY2tlbmQ7aWYodm9pZCAwIT09bltlXSYmZnVuY3Rpb24oZSl7Y29uc3QgdD1lO3JldHVybiAiaW5pdGlhbGl6ZSJpbiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5pbml0aWFsaXplJiYiY3JlYXRlU2Vzc2lvbkhhbmRsZXIiaW4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY3JlYXRlU2Vzc2lvbkhhbmRsZXImJiJkaXNwb3NlImluIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmRpc3Bvc2V9KG5bZV0pKXtjb25zdCB0PW5bZV07bGV0IHI9dC5pbml0aWFsaXplKCk7aWYoIm9iamVjdCI9PXR5cGVvZiByJiYidGhlbiJpbiByJiYocj1hd2FpdCByKSxyKXJldHVybiBvLnNldChlLHQpLHR9fXQuYmFja2VuZD17d2ViZ2w6bmV3IHIuV2ViR0xCYWNrZW5kfSx0LnJlc29sdmVCYWNrZW5kPWFzeW5jIGZ1bmN0aW9uIGUodCl7aWYoIXQpcmV0dXJuIGUoWyJ3ZWJnbCJdKTt7Y29uc3QgZT0ic3RyaW5nIj09dHlwZW9mIHQ/W3RdOnQ7Zm9yKGNvbnN0IHQgb2YgZSl7Y29uc3QgZT1vLmdldCh0KTtpZihlKXJldHVybiBlO2NvbnN0IG49YXdhaXQgaSh0KTtpZihuKXJldHVybiBufX10aHJvdyBuZXcgRXJyb3IoIm5vIGF2YWlsYWJsZSBiYWNrZW5kIHRvIHVzZSIpfTt9LDQ0MTg6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LldlYkdMQmFja2VuZD12b2lkIDA7Y29uc3Qgcj1uKDIyMzUpLG89bigxMzE1KSxpPW4oMjE3MSkscz1uKDMzODkpO3QuV2ViR0xCYWNrZW5kPWNsYXNze2dldCBjb250ZXh0SWQoKXtyZXR1cm4gci5lbnYud2ViZ2wuY29udGV4dElkfXNldCBjb250ZXh0SWQoZSl7ci5lbnYud2ViZ2wuY29udGV4dElkPWU7fWdldCBtYXRtdWxNYXhCYXRjaFNpemUoKXtyZXR1cm4gci5lbnYud2ViZ2wubWF0bXVsTWF4QmF0Y2hTaXplfXNldCBtYXRtdWxNYXhCYXRjaFNpemUoZSl7ci5lbnYud2ViZ2wubWF0bXVsTWF4QmF0Y2hTaXplPWU7fWdldCB0ZXh0dXJlQ2FjaGVNb2RlKCl7cmV0dXJuIHIuZW52LndlYmdsLnRleHR1cmVDYWNoZU1vZGV9c2V0IHRleHR1cmVDYWNoZU1vZGUoZSl7ci5lbnYud2ViZ2wudGV4dHVyZUNhY2hlTW9kZT1lO31nZXQgcGFjaygpe3JldHVybiByLmVudi53ZWJnbC5wYWNrfXNldCBwYWNrKGUpe3IuZW52LndlYmdsLnBhY2s9ZTt9Z2V0IGFzeW5jKCl7cmV0dXJuIHIuZW52LndlYmdsLmFzeW5jfXNldCBhc3luYyhlKXtyLmVudi53ZWJnbC5hc3luYz1lO31pbml0aWFsaXplKCl7dHJ5e3JldHVybiB0aGlzLmdsQ29udGV4dD0oMCxzLmNyZWF0ZVdlYkdMQ29udGV4dCkodGhpcy5jb250ZXh0SWQpLCJudW1iZXIiIT10eXBlb2YgdGhpcy5tYXRtdWxNYXhCYXRjaFNpemUmJih0aGlzLm1hdG11bE1heEJhdGNoU2l6ZT0xNiksInN0cmluZyIhPXR5cGVvZiB0aGlzLnRleHR1cmVDYWNoZU1vZGUmJih0aGlzLnRleHR1cmVDYWNoZU1vZGU9ImZ1bGwiKSwiYm9vbGVhbiIhPXR5cGVvZiB0aGlzLnBhY2smJih0aGlzLnBhY2s9ITEpLCJib29sZWFuIiE9dHlwZW9mIHRoaXMuYXN5bmMmJih0aGlzLmFzeW5jPSExKSxvLkxvZ2dlci5zZXRXaXRoRW52KHIuZW52KSxvLkxvZ2dlci52ZXJib3NlKCJXZWJHTEJhY2tlbmQiLGBDcmVhdGVkIFdlYkdMQ29udGV4dDogJHt0eXBlb2YgdGhpcy5nbENvbnRleHR9IHdpdGggbWF0bXVsTWF4QmF0Y2hTaXplOiAke3RoaXMubWF0bXVsTWF4QmF0Y2hTaXplfTsgdGV4dHVyZUNhY2hlTW9kZTogJHt0aGlzLnRleHR1cmVDYWNoZU1vZGV9OyBwYWNrOiAke3RoaXMucGFja307IGFzeW5jOiAke3RoaXMuYXN5bmN9LmApLCEwfWNhdGNoKGUpe3JldHVybiBvLkxvZ2dlci53YXJuaW5nKCJXZWJHTEJhY2tlbmQiLGBVbmFibGUgdG8gaW5pdGlhbGl6ZSBXZWJHTEJhY2tlbmQuICR7ZX1gKSwhMX19Y3JlYXRlU2Vzc2lvbkhhbmRsZXIoZSl7cmV0dXJuIG5ldyBpLldlYkdMU2Vzc2lvbkhhbmRsZXIodGhpcyxlKX1kaXNwb3NlKCl7dGhpcy5nbENvbnRleHQuZGlzcG9zZSgpO319O30sNjg1OTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuQ29vcmRzR2xzbExpYj12b2lkIDA7Y29uc3Qgcj1uKDcyNzMpLG89bigxOTk3KSxpPW4oNjc1Nykscz1uKDc2MTgpLGE9big0MzIpO2NsYXNzIHUgZXh0ZW5kcyBvLkdsc2xMaWJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7fWdldEZ1bmN0aW9ucygpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMub2Zmc2V0VG9Db29yZHMoKSksdGhpcy5jb29yZHNUb09mZnNldCgpKSx0aGlzLnRvVmVjKCkpLHRoaXMudmFsdWVGcm9tKCkpLHRoaXMuZ2V0Q29tbW9uVXRpbEZ1bmNzKCkpLHRoaXMuZ2V0SW5wdXRzU2FtcGxpbmdTbmlwcGV0cygpKSx0aGlzLmdldE91dHB1dFNhbXBsaW5nU25pcHBldCgpKX1nZXRDdXN0b21UeXBlcygpe3JldHVybiB7fX1vZmZzZXRUb0Nvb3Jkcygpe3JldHVybiB7b2Zmc2V0VG9Db29yZHM6bmV3IG8uR2xzbExpYlJvdXRpbmUoIlxuICAgICAgdmVjMiBvZmZzZXRUb0Nvb3JkcyhpbnQgb2Zmc2V0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHtcbiAgICAgICAgaW50IHQgPSBvZmZzZXQgLyB3aWR0aDtcbiAgICAgICAgaW50IHMgPSBvZmZzZXQgLSB0KndpZHRoO1xuICAgICAgICB2ZWMyIGNvb3JkcyA9ICh2ZWMyKHMsdCkgKyB2ZWMyKDAuNSwwLjUpKSAvIHZlYzIod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHJldHVybiBjb29yZHM7XG4gICAgICB9XG4gICAgICAiKX19Y29vcmRzVG9PZmZzZXQoKXtyZXR1cm4ge2Nvb3Jkc1RvT2Zmc2V0Om5ldyBvLkdsc2xMaWJSb3V0aW5lKCJcbiAgICAgIGludCBjb29yZHNUb09mZnNldCh2ZWMyIGNvb3JkcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7XG4gICAgICAgIGZsb2F0IHMgPSBjb29yZHMucyAqIGZsb2F0KHdpZHRoKTtcbiAgICAgICAgZmxvYXQgdCA9IGNvb3Jkcy50ICogZmxvYXQoaGVpZ2h0KTtcbiAgICAgICAgaW50IG9mZnNldCA9IGludCh0KSAqIHdpZHRoICsgaW50KHMpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgICAgfVxuICAgICAgIil9fWdldE91dHB1dFNhbXBsaW5nU25pcHBldCgpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQ7cmV0dXJuIGUuaXNQYWNrZWQ/dGhpcy5nZXRQYWNrZWRPdXRwdXRTYW1wbGluZ1NuaXBwZXQoZSk6dGhpcy5nZXRVbnBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChlKX1nZXRQYWNrZWRPdXRwdXRTYW1wbGluZ1NuaXBwZXQoZSl7Y29uc3QgdD1lLnVucGFja2VkU2hhcGUsbj1bZS53aWR0aCxlLmhlaWdodF0scj17fSxzPSJnZXRPdXRwdXRDb29yZHMiO3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAwOnJbc109dGhpcy5nZXRPdXRwdXRTY2FsYXJDb29yZHMoKTticmVhaztjYXNlIDE6cltzXT10aGlzLmdldE91dHB1dFBhY2tlZDFEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSAyOnJbc109dGhpcy5nZXRPdXRwdXRQYWNrZWQyRENvb3Jkcyh0LG4pO2JyZWFrO2Nhc2UgMzpyW3NdPXRoaXMuZ2V0T3V0cHV0UGFja2VkM0RDb29yZHModCxuKTticmVhaztkZWZhdWx0OnJbc109dGhpcy5nZXRPdXRwdXRQYWNrZWRORENvb3Jkcyh0LG4pO31jb25zdCBhPWBcbiAgICAgIHZvaWQgc2V0T3V0cHV0KHZlYzQgdmFsKSB7XG4gICAgICAgICR7KDAsIGkuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKS5vdXRwdXR9ID0gdmFsO1xuICAgICAgfVxuICAgIGA7cmV0dXJuIHIuZmxvYXRUZXh0dXJlU2V0UkdCQT1uZXcgby5HbHNsTGliUm91dGluZShhKSxyfWdldFVucGFja2VkT3V0cHV0U2FtcGxpbmdTbmlwcGV0KGUpe2NvbnN0IHQ9ZS51bnBhY2tlZFNoYXBlLG49W2Uud2lkdGgsZS5oZWlnaHRdLHI9e30scz0iZ2V0T3V0cHV0Q29vcmRzIjtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMDpyW3NdPXRoaXMuZ2V0T3V0cHV0U2NhbGFyQ29vcmRzKCk7YnJlYWs7Y2FzZSAxOnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDFEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSAyOnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDJEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSAzOnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDNEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSA0OnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDREQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSA1OnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDVEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSA2OnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDZEQ29vcmRzKHQsbik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG91dHB1dCBkaW1lbnNpb25hbGl0eTogJHt0Lmxlbmd0aH1gKX1jb25zdCBhPWBcbiAgICAgICAgdm9pZCBzZXRPdXRwdXQoZmxvYXQgdmFsKSB7XG4gICAgICAgICAgJHsoMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLm91dHB1dH0gPSB2ZWM0KHZhbCwgMCwgMCwgMCk7XG4gICAgICAgIH1cbiAgICBgO3JldHVybiByLmZsb2F0VGV4dHVyZVNldFI9bmV3IG8uR2xzbExpYlJvdXRpbmUoYSkscn1nZXRPdXRwdXRTY2FsYXJDb29yZHMoKXtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUoIlxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgIil9Z2V0T3V0cHV0UGFja2VkMURDb29yZHMoZSx0KXtjb25zdCBuPXQ7bGV0IHI9IiI7cmV0dXJuIDE9PT1uWzBdPyhyPWBcbiAgICAgICAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICAgICAgcmV0dXJuIDIgKiBpbnQoVGV4Q29vcmRzLnkgKiAke25bMV19LjApO1xuICAgICAgICAgIH1cbiAgICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShyKSk6MT09PW5bMV0/KHI9YFxuICAgICAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgICByZXR1cm4gMiAqIGludChUZXhDb29yZHMueCAqICR7blswXX0uMCk7XG4gICAgICAgICAgfVxuICAgICAgICBgLG5ldyBvLkdsc2xMaWJSb3V0aW5lKHIpKToocj1gXG4gICAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke25bMF19LCAke25bMV19KSk7XG4gICAgICAgICAgcmV0dXJuIDIgKiAocmVzVGV4UkMueSAqICR7blswXX0gKyByZXNUZXhSQy54KTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShyKSl9Z2V0T3V0cHV0UGFja2VkMkRDb29yZHMoZSx0KXtsZXQgbj0iIjtpZihyLkFycmF5VXRpbC5hcnJheXNFcXVhbChlLHQpKXJldHVybiBuPWBcbiAgICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICAgIHJldHVybiAyICogaXZlYzIoVGV4Q29vcmRzLnh5ICogdmVjMigke3RbMF19LCAke3RbMV19KSk7XG4gICAgICAgIH1cbiAgICAgIGAsbmV3IG8uR2xzbExpYlJvdXRpbmUobik7Y29uc3QgaT10LHM9TWF0aC5jZWlsKGVbMV0vMik7cmV0dXJuIG49YFxuICAgICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7aVswXX0sICR7aVsxXX0pKTtcblxuICAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke2lbMF19ICsgcmVzVGV4UkMueDtcblxuICAgICAgICAgIC8vIHJldmVyc2UgciBhbmQgYyBvcmRlciBmb3IgcGFja2VkIHRleHR1cmVcbiAgICAgICAgICBpbnQgciA9IGltb2QoaW5kZXgsICR7c30pICogMjtcbiAgICAgICAgICBpbnQgYyA9IDIgKiAoaW5kZXggLyAke3N9KTtcblxuICAgICAgICAgIHJldHVybiBpdmVjMihyLCBjKTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShuKX1nZXRPdXRwdXRQYWNrZWQzRENvb3JkcyhlLHQpe2NvbnN0IG49W3RbMF0sdFsxXV0scj1NYXRoLmNlaWwoZVsyXS8yKSxpPXIqTWF0aC5jZWlsKGVbMV0vMikscz1gXG4gICAgICAgIGl2ZWMzIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtuWzBdfSwgJHtuWzFdfSkpO1xuICAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke25bMF19ICsgcmVzVGV4UkMueDtcblxuICAgICAgICAgIGludCBiID0gaW5kZXggLyAke2l9O1xuICAgICAgICAgIGluZGV4IC09IGIgKiAke2l9O1xuXG4gICAgICAgICAgLy8gcmV2ZXJzZSByIGFuZCBjIG9yZGVyIGZvciBwYWNrZWQgdGV4dHVyZVxuICAgICAgICAgIGludCByID0gaW1vZChpbmRleCwgJHtyfSkgKiAyO1xuICAgICAgICAgIGludCBjID0gMiAqIChpbmRleCAvICR7cn0pO1xuXG4gICAgICAgICAgcmV0dXJuIGl2ZWMzKGIsIHIsIGMpO1xuICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShzKX1nZXRPdXRwdXRQYWNrZWRORENvb3JkcyhlLHQpe2NvbnN0IG49W3RbMF0sdFsxXV0scj1NYXRoLmNlaWwoZVtlLmxlbmd0aC0xXS8yKSxpPXIqTWF0aC5jZWlsKGVbZS5sZW5ndGgtMl0vMik7bGV0IHM9aSxhPSIiLHU9ImIsIHIsIGMiO2ZvcihsZXQgdD0yO3Q8ZS5sZW5ndGgtMTt0Kyspcyo9ZVtlLmxlbmd0aC10LTFdLGE9YFxuICAgICAgaW50IGIke3R9ID0gaW5kZXggLyAke3N9O1xuICAgICAgaW5kZXggLT0gYiR7dH0gKiAke3N9O1xuICAgIGArYSx1PWBiJHt0fSwgYCt1O2NvbnN0IGw9YFxuICAgICAgaXZlYyR7ZS5sZW5ndGh9IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke25bMF19LCAke25bMV19KSk7XG4gICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke25bMF19ICsgcmVzVGV4UkMueDtcblxuICAgICAgICAke2F9XG5cbiAgICAgICAgaW50IGIgPSBpbmRleCAvICR7aX07XG4gICAgICAgIGluZGV4IC09IGIgKiAke2l9O1xuXG4gICAgICAgIC8vIHJldmVyc2UgciBhbmQgYyBvcmRlciBmb3IgcGFja2VkIHRleHR1cmVcbiAgICAgICAgaW50IHIgPSBpbW9kKGluZGV4LCAke3J9KSAqIDI7XG4gICAgICAgIGludCBjID0gMiAqIChpbmRleCAvICR7cn0pO1xuXG4gICAgICAgIHJldHVybiBpdmVjJHtlLmxlbmd0aH0oJHt1fSk7XG4gICAgICB9XG4gICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobCl9Z2V0T3V0cHV0VW5wYWNrZWQxRENvb3JkcyhlLHQpe2NvbnN0IG49YFxuICAgICAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RbMF19LCAke3RbMV19KSk7XG4gICAgICAgICAgcmV0dXJuIHJlc1RleFJDLnkgKiAke3RbMF19ICsgcmVzVGV4UkMueDtcbiAgICAgICAgfVxuICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobil9Z2V0T3V0cHV0VW5wYWNrZWQyRENvb3JkcyhlLHQpe2NvbnN0IG49YFxuICAgICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dFswXX0sICR7dFsxXX0pKTtcbiAgICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy55ICogJHt0WzBdfSArIHJlc1RleFJDLng7XG4gICAgICAgICAgaW50IHIgPSBpbmRleCAvICR7ZVsxXX07XG4gICAgICAgICAgaW50IGMgPSBpbmRleCAtIHIgKiAke2VbMV19O1xuICAgICAgICAgIHJldHVybiBpdmVjMihyLCBjKTtcbiAgICAgICAgfVxuICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobil9Z2V0T3V0cHV0VW5wYWNrZWQzRENvb3JkcyhlLHQpe2xldCBuPSIiO2NvbnN0IHI9ZS5sZW5ndGg7bGV0IGk9bnVsbDtyPDImJihpPVtdKSxpPW5ldyBBcnJheShyLTEpLGlbci0yXT1lW3ItMV07Zm9yKGxldCB0PXItMzt0Pj0wOy0tdClpW3RdPWlbdCsxXSplW3QrMV07Y29uc3Qgcz1bInIiLCJjIiwiZCJdLGE9aS5tYXAoKChlLHQpPT5gaW50ICR7c1t0XX0gPSBpbmRleCAvICR7ZX07ICR7dD09PWkubGVuZ3RoLTE/YGludCAke3NbdCsxXX0gPSBpbmRleCAtICR7c1t0XX0gKiAke2V9YDpgaW5kZXggLT0gJHtzW3RdfSAqICR7ZX1gfTtgKSkuam9pbigiIik7cmV0dXJuIG49YFxuICAgICAgICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dFswXX0sICR7dFsxXX0pKTtcbiAgICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy55ICogJHt0WzBdfSArIHJlc1RleFJDLng7XG4gICAgICAgICAgJHthfVxuICAgICAgICAgIHJldHVybiBpdmVjMyhyLCBjLCBkKTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShuKX1nZXRPdXRwdXRVbnBhY2tlZDREQ29vcmRzKGUsdCl7bGV0IG49IiI7Y29uc3Qgcj1lLmxlbmd0aDtsZXQgaT1udWxsO3I8MiYmKGk9W10pLGk9bmV3IEFycmF5KHItMSksaVtyLTJdPWVbci0xXTtmb3IobGV0IHQ9ci0zO3Q+PTA7LS10KWlbdF09aVt0KzFdKmVbdCsxXTtjb25zdCBzPVsiciIsImMiLCJkIiwiZDIiXSxhPWkubWFwKCgoZSx0KT0+YGludCAke3NbdF19ID0gaW5kZXggLyAke2V9OyAke3Q9PT1pLmxlbmd0aC0xP2BpbnQgJHtzW3QrMV19ID0gaW5kZXggLSAke3NbdF19ICogJHtlfWA6YGluZGV4IC09ICR7c1t0XX0gKiAke2V9YH07YCkpLmpvaW4oIiIpO3JldHVybiBuPWBcbiAgICAgIGl2ZWM0IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0WzBdfSwgJHt0WzFdfSkpO1xuICAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke3RbMF19ICsgcmVzVGV4UkMueDtcbiAgICAgICAgICAke2F9XG4gICAgICAgICAgcmV0dXJuIGl2ZWM0KHIsIGMsIGQsIGQyKTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShuKX1nZXRPdXRwdXRVbnBhY2tlZDVEQ29vcmRzKGUsdCl7bGV0IG49IiI7Y29uc3Qgcj1lLmxlbmd0aDtsZXQgaT1udWxsO3I8MiYmKGk9W10pLGk9bmV3IEFycmF5KHItMSksaVtyLTJdPWVbci0xXTtmb3IobGV0IHQ9ci0zO3Q+PTA7LS10KWlbdF09aVt0KzFdKmVbdCsxXTtjb25zdCBzPVsiciIsImMiLCJkIiwiZDIiLCJkMyJdLGE9aS5tYXAoKChlLHQpPT5gaW50ICR7c1t0XX0gPSBpbmRleCAvICR7ZX07ICR7dD09PWkubGVuZ3RoLTE/YGludCAke3NbdCsxXX0gPSBpbmRleCAtICR7c1t0XX0gKiAke2V9YDpgaW5kZXggLT0gJHtzW3RdfSAqICR7ZX1gfTtgKSkuam9pbigiIik7cmV0dXJuIG49YFxuICAgICAgaXZlYzUgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RbMF19LCAke3RbMV19KSk7XG4gICAgICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueSAqICR7dFswXX0gKyByZXNUZXhSQy54O1xuICAgICAgICAgICR7YX1cbiAgICAgICAgICByZXR1cm4gaXZlYzUociwgYywgZCwgZDIsIGQzKTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShuKX1nZXRPdXRwdXRVbnBhY2tlZDZEQ29vcmRzKGUsdCl7bGV0IG49IiI7Y29uc3Qgcj1lLmxlbmd0aDtsZXQgaT1udWxsO3I8MiYmKGk9W10pLGk9bmV3IEFycmF5KHItMSksaVtyLTJdPWVbci0xXTtmb3IobGV0IHQ9ci0zO3Q+PTA7LS10KWlbdF09aVt0KzFdKmVbdCsxXTtjb25zdCBzPVsiciIsImMiLCJkIiwiZDIiLCJkMyIsImQ0Il0sYT1pLm1hcCgoKGUsdCk9PmBpbnQgJHtzW3RdfSA9IGluZGV4IC8gJHtlfTsgJHt0PT09aS5sZW5ndGgtMT9gaW50ICR7c1t0KzFdfSA9IGluZGV4IC0gJHtzW3RdfSAqICR7ZX1gOmBpbmRleCAtPSAke3NbdF19ICogJHtlfWB9O2ApKS5qb2luKCIiKTtyZXR1cm4gbj1gXG4gICAgIGl2ZWM2IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dFswXX0sICR7dFsxXX0pKTtcbiAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke3RbMF19ICsgcmVzVGV4UkMueDtcbiAgICAgICAgICR7YX1cbiAgICAgICAgIHJldHVybiBpdmVjNihyLCBjLCBkLCBkMiwgZDMsIGQ0KTtcbiAgICAgICB9XG4gICAgIGAsbmV3IG8uR2xzbExpYlJvdXRpbmUobil9Z2V0Q29tbW9uVXRpbEZ1bmNzKCl7Y29uc3QgZT17fTtsZXQgdD0idXZGcm9tRmxhdCI7ZVt0XT1uZXcgby5HbHNsTGliUm91dGluZSgiXG4gICAgdmVjMiB1dkZyb21GbGF0KGludCB0ZXhOdW1SLCBpbnQgdGV4TnVtQywgaW50IGluZGV4KSB7XG4gICAgICBpbnQgdGV4QyA9IGluZGV4IC8gdGV4TnVtUjtcbiAgICAgIGludCB0ZXhSID0gaW5kZXggLSB0ZXhDICogdGV4TnVtUjtcbiAgICAgIC8vIFRPRE86IHN3YXAgdGV4UiwgdGV4QyBvcmRlciBpbiBmb2xsb3dpbmcgZnVuY3Rpb24gc28gcm93IGlzIGNvcnJlc3BvbmRpbmcgdG8gdSBhbmQgY29sdW1uIGlzIGNvcnJlc3BvbmRpbmcgdG9cbiAgICAgIC8vICAgICAgIHYuXG4gICAgICByZXR1cm4gKHZlYzIodGV4UiwgdGV4QykgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1SLCB0ZXhOdW1DKTtcbiAgICB9XG4gICAgIiksdD0icGFja2VkVVZmcm9tMUQiLGVbdF09bmV3IG8uR2xzbExpYlJvdXRpbmUoIlxuICAgICAgdmVjMiBwYWNrZWRVVmZyb20xRChpbnQgdGV4TnVtUiwgaW50IHRleE51bUMsIGludCBpbmRleCkge1xuICAgICAgICBpbnQgdGV4ZWxJbmRleCA9IGluZGV4IC8gMjtcbiAgICAgICAgaW50IHRleFIgPSB0ZXhlbEluZGV4IC8gdGV4TnVtQztcbiAgICAgICAgaW50IHRleEMgPSB0ZXhlbEluZGV4IC0gdGV4UiAqIHRleE51bUM7XG4gICAgICAgIHJldHVybiAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKHRleE51bUMsIHRleE51bVIpO1xuICAgICAgfVxuICAgICAgIiksdD0icGFja2VkVVZmcm9tMkQiLGVbdF09bmV3IG8uR2xzbExpYlJvdXRpbmUoIlxuICAgICAgdmVjMiBwYWNrZWRVVmZyb20yRChpbnQgdGV4TnVtUiwgaW50IHRleE51bUMsIGludCB0ZXhlbHNJbkxvZ2ljYWxSb3csIGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgaW50IHRleGVsSW5kZXggPSAocm93IC8gMikgKiB0ZXhlbHNJbkxvZ2ljYWxSb3cgKyAoY29sIC8gMik7XG4gICAgICAgIGludCB0ZXhSID0gdGV4ZWxJbmRleCAvIHRleE51bUM7XG4gICAgICAgIGludCB0ZXhDID0gdGV4ZWxJbmRleCAtIHRleFIgKiB0ZXhOdW1DO1xuICAgICAgICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTtcbiAgICAgIH1cbiAgICAgICIpLHQ9InBhY2tlZFVWZnJvbTNEIixlW3RdPW5ldyBvLkdsc2xMaWJSb3V0aW5lKCJcbiAgICAgIHZlYzIgcGFja2VkVVZmcm9tM0QoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLFxuICAgICAgICAgIGludCB0ZXhlbHNJbkJhdGNoLCBpbnQgdGV4ZWxzSW5Mb2dpY2FsUm93LCBpbnQgYixcbiAgICAgICAgICBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIGludCBpbmRleCA9IGIgKiB0ZXhlbHNJbkJhdGNoICsgKHJvdyAvIDIpICogdGV4ZWxzSW5Mb2dpY2FsUm93ICsgKGNvbCAvIDIpO1xuICAgICAgICBpbnQgdGV4UiA9IGluZGV4IC8gdGV4TnVtQztcbiAgICAgICAgaW50IHRleEMgPSBpbmRleCAtIHRleFIgKiB0ZXhOdW1DO1xuICAgICAgICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTtcbiAgICAgIH1cbiAgICAgICIpLHQ9InNhbXBsZVRleHR1cmUiO2NvbnN0IG49KDAsIGkuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKTtyZXR1cm4gZVt0XT1uZXcgby5HbHNsTGliUm91dGluZShgXG4gICAgICAgIGZsb2F0IHNhbXBsZVRleHR1cmUoc2FtcGxlcjJEIHRleHR1cmVTYW1wbGVyLCB2ZWMyIHV2KSB7XG4gICAgICAgICAgICByZXR1cm4gJHtuLnRleHR1cmUyRH0odGV4dHVyZVNhbXBsZXIsIHV2KS5yO1xuICAgICAgICB9YCksZX1nZXRJbnB1dHNTYW1wbGluZ1NuaXBwZXRzKCl7Y29uc3QgZT17fSx0PXRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0O3JldHVybiB0aGlzLmNvbnRleHQucHJvZ3JhbUluZm8uaW5wdXROYW1lcy5mb3JFYWNoKCgobixyKT0+e2NvbnN0IG89dGhpcy5jb250ZXh0LmlucHV0VGV4dHVyZUxheW91dHNbcl0saT0oMCwgYS5nZW5lcmF0ZVNoYWRlckZ1bmNOYW1lRnJvbUlucHV0U2FtcGxlck5hbWUpKG4pO28uaXNQYWNrZWQ/ZVtpXT10aGlzLmdldFBhY2tlZFNhbXBsZXJGcm9tSW5wdXQoaSxuLG8pOmVbaV09dGhpcy5nZXRVbnBhY2tlZFNhbXBsZXJGcm9tSW5wdXQoaSxuLG8pO2NvbnN0IHM9KDAsIGEuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lQXRPdXRDb29yZHMpKG4pO28udW5wYWNrZWRTaGFwZS5sZW5ndGg8PXQudW5wYWNrZWRTaGFwZS5sZW5ndGgmJihvLmlzUGFja2VkP2Vbc109dGhpcy5nZXRQYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMocyxvLHQsbik6ZVtzXT10aGlzLmdldFVucGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKHMsbyx0LG4pKTt9KSksZX1nZXRQYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMoZSx0LG4saSl7Y29uc3Qgcz10LnVucGFja2VkU2hhcGUsdT1uLnVucGFja2VkU2hhcGUsbD1pLGM9KDAsIGEuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lKShsKSxwPXMubGVuZ3RoLGQ9dS5sZW5ndGgsZj1yLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyhzLHUpLGg9KDAsIGEuZ2V0Q29vcmRzRGF0YVR5cGUpKGQpLGc9ZC1wO2xldCBiO2NvbnN0IG09KDAsIGEuZ2V0R2xDaGFubmVscykoKTtiPTA9PT1wPyIiOmQ8MiYmZi5sZW5ndGg+PTE/ImNvb3JkcyA9IDA7IjpmLm1hcCgoZT0+YGNvb3Jkcy4ke21bZStnXX0gPSAwO2ApKS5qb2luKCJcbiIpO2xldCB5PSIiO3k9ZDwyJiZwPjA/ImNvb3JkcyI6cy5tYXAoKChlLHQpPT5gY29vcmRzLiR7bVt0K2ddfWApKS5qb2luKCIsICIpO2xldCB2PSJyZXR1cm4gb3V0cHV0VmFsdWU7Ijtjb25zdCBfPTE9PT1yLlNoYXBlVXRpbC5zaXplKHMpLHc9MT09PXIuU2hhcGVVdGlsLnNpemUodSk7aWYoMSE9PXB8fF98fHcpe2lmKF8mJiF3KXY9MT09PWQ/IlxuICAgICAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLngsIDAuLCAwLik7XG4gICAgICAgICI6IlxuICAgICAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngpO1xuICAgICAgICAiO2Vsc2UgaWYoZi5sZW5ndGgpe2NvbnN0IGU9cC0yLHQ9cC0xO2YuaW5kZXhPZihlKT4tMSYmZi5pbmRleE9mKHQpPi0xP3Y9InJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngpOyI6Zi5pbmRleE9mKGUpPi0xP3Y9InJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLnksIG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLnkpOyI6Zi5pbmRleE9mKHQpPi0xJiYodj0icmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueHgsIG91dHB1dFZhbHVlLnp6KTsiKTt9fWVsc2Ugdj0iXG4gICAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLnh5LCBvdXRwdXRWYWx1ZS54eSk7XG4gICAgICAiO2NvbnN0IFQ9YFxuICAgICAgdmVjNCAke2V9KCkge1xuICAgICAgICAke2h9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBcbiAgICAgICAgaW50IGxhc3REaW0gPSBjb29yZHMuJHttW2QtMV19O1xuICAgICAgICBjb29yZHMuJHttW2QtMV19ID0gY29vcmRzLiR7bVtkLTJdfTtcbiAgICAgICAgY29vcmRzLiR7bVtkLTJdfSA9IGxhc3REaW07XG4gICAgICBcbiAgICAgICAgJHtifVxuICAgICAgICB2ZWM0IG91dHB1dFZhbHVlID0gJHtjfSgke3l9KTtcbiAgICAgICAgJHt2fVxuICAgICAgfVxuICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKFQsWyJjb29yZGluYXRlcy5nZXRPdXRwdXRDb29yZHMiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMoZSx0LG4saSl7Y29uc3Qgcz1bbi53aWR0aCxuLmhlaWdodF0sdT1bdC53aWR0aCx0LmhlaWdodF0sbD10LnVucGFja2VkU2hhcGUubGVuZ3RoLGM9bi51bnBhY2tlZFNoYXBlLmxlbmd0aCxwPXQudW5wYWNrZWRTaGFwZSxkPW4udW5wYWNrZWRTaGFwZSxmPSgwLCBhLmdlbmVyYXRlU2hhZGVyRnVuY05hbWVGcm9tSW5wdXRTYW1wbGVyTmFtZSkoaSk7aWYobD09PWMmJnIuQXJyYXlVdGlsLmFycmF5c0VxdWFsKHUscykpe2NvbnN0IHQ9YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oKSB7XG4gICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke2l9LCBUZXhDb29yZHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUodCxbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9Y29uc3QgaD0oMCwgYS5nZXRDb29yZHNEYXRhVHlwZSkoYyksZz1yLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyhwLGQpLGI9Yy1sO2xldCBtO2NvbnN0IHk9KDAsIGEuZ2V0R2xDaGFubmVscykoKTttPTA9PT1sPyIiOmM8MiYmZy5sZW5ndGg+PTE/ImNvb3JkcyA9IDA7IjpnLm1hcCgoZT0+YGNvb3Jkcy4ke3lbZStiXX0gPSAwO2ApKS5qb2luKCJcbiIpO2xldCB2PSIiO3Y9YzwyJiZsPjA/ImNvb3JkcyI6dC51bnBhY2tlZFNoYXBlLm1hcCgoKGUsdCk9PmBjb29yZHMuJHt5W3QrYl19YCkpLmpvaW4oIiwgIik7Y29uc3QgXz1gXG4gICAgICAgIGZsb2F0ICR7ZX0oKSB7XG4gICAgICAgICAgJHtofSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICAke219XG4gICAgICAgICAgcmV0dXJuICR7Zn0oJHt2fSk7XG4gICAgICAgIH1cbiAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKF8sWyJjb29yZGluYXRlcy5nZXRPdXRwdXRDb29yZHMiXSl9Z2V0UGFja2VkU2FtcGxlckZyb21JbnB1dChlLHQsbil7c3dpdGNoKG4udW5wYWNrZWRTaGFwZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gdGhpcy5nZXRQYWNrZWRTYW1wbGVyU2NhbGFyKGUsdCk7Y2FzZSAxOnJldHVybiB0aGlzLmdldFBhY2tlZFNhbXBsZXIxRChlLHQsbik7Y2FzZSAyOnJldHVybiB0aGlzLmdldFBhY2tlZFNhbXBsZXIyRChlLHQsbik7Y2FzZSAzOnJldHVybiB0aGlzLmdldFBhY2tlZFNhbXBsZXIzRChlLHQsbik7ZGVmYXVsdDpyZXR1cm4gdGhpcy5nZXRQYWNrZWRTYW1wbGVyTkQoZSx0LG4pfX1nZXRVbnBhY2tlZFNhbXBsZXJGcm9tSW5wdXQoZSx0LG4pe2NvbnN0IHI9bi51bnBhY2tlZFNoYXBlO3N3aXRjaChyLmxlbmd0aCl7Y2FzZSAwOnJldHVybiB0aGlzLmdldFVucGFja2VkU2FtcGxlclNjYWxhcihlLHQsbik7Y2FzZSAxOnJldHVybiB0aGlzLmdldFVucGFja2VkU2FtcGxlcjFEKGUsdCxuKTtjYXNlIDI6cmV0dXJuIHRoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyMkQoZSx0LG4pO2Nhc2UgMzpyZXR1cm4gdGhpcy5nZXRVbnBhY2tlZFNhbXBsZXIzRChlLHQsbik7Y2FzZSA0OnJldHVybiB0aGlzLmdldFVucGFja2VkU2FtcGxlcjREKGUsdCxuKTtjYXNlIDU6cmV0dXJuIHRoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyNUQoZSx0LG4pO2Nhc2UgNjpyZXR1cm4gdGhpcy5nZXRVbnBhY2tlZFNhbXBsZXI2RChlLHQsbik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRpbWVuc2lvbiAke3IubGVuZ3RofS1EYCl9fWdldFBhY2tlZFNhbXBsZXJTY2FsYXIoZSx0KXtjb25zdCBuPWBcbiAgICAgICAgICB2ZWM0ICR7ZX0oKSB7XG4gICAgICAgICAgICByZXR1cm4gJHsoMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLnRleHR1cmUyRH0oJHt0fSwgaGFsZkNSKTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4pfWdldFBhY2tlZFNhbXBsZXIxRChlLHQsbil7Y29uc3Qgcj1bbi53aWR0aCxuLmhlaWdodF0scz1bclsxXSxyWzBdXSxhPSgwLCBpLmdldEdsc2wpKHRoaXMuY29udGV4dC5nbENvbnRleHQudmVyc2lvbiksdT1gdmVjNCAke2V9KGludCBpbmRleCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTFEKFxuICAgICAgJHtzWzBdfSwgJHtzWzFdfSwgaW5kZXgpO1xuICAgICAgcmV0dXJuICR7YS50ZXh0dXJlMkR9KCR7dH0sIHV2KTtcbiAgICB9YDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUodSxbImNvb3JkaW5hdGVzLnBhY2tlZFVWZnJvbTFEIl0pfWdldFBhY2tlZFNhbXBsZXIyRChlLHQsbil7Y29uc3Qgcz1uLnVucGFja2VkU2hhcGUsYT1bbi53aWR0aCxuLmhlaWdodF0sdT0oMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLGw9YVswXSxjPWFbMV07aWYobnVsbCE9YSYmci5BcnJheVV0aWwuYXJyYXlzRXF1YWwocyxhKSl7Y29uc3Qgbj1gdmVjNCAke2V9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKGNvbCwgcm93KSArIGhhbGZDUikgLyB2ZWMyKCR7Y30uMCwgJHtsfS4wKTtcbiAgICAgICAgcmV0dXJuICR7dS50ZXh0dXJlMkR9KCR7dH0sIHV2KTtcbiAgICAgIH1gO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShuKX1jb25zdCBwPWEsZD1NYXRoLmNlaWwoc1sxXS8yKSxmPWB2ZWM0ICR7ZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTJEKCR7cFsxXX0sICR7cFswXX0sICR7ZH0sIHJvdywgY29sKTtcbiAgICAgIHJldHVybiAke3UudGV4dHVyZTJEfSgke3R9LCB1dik7XG4gICAgfWA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKGYsWyJjb29yZGluYXRlcy5wYWNrZWRVVmZyb20yRCJdKX1nZXRQYWNrZWRTYW1wbGVyM0QoZSx0LG4pe2NvbnN0IHI9bi51bnBhY2tlZFNoYXBlLHM9W24ud2lkdGgsbi5oZWlnaHRdLHU9W3NbMF0sc1sxXV0sbD0oMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pO2lmKDE9PT1yWzBdKXtjb25zdCBpPXIuc2xpY2UoMSkscz1bMSwyXSx1PSgwLCBhLnNxdWVlemVJbnB1dFNoYXBlKShyLGkpLGw9WyJiIiwicm93IiwiY29sIl0sYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG4pKTtjLnVucGFja2VkU2hhcGU9dTtjb25zdCBwPXRoaXMuZ2V0UGFja2VkU2FtcGxlckZyb21JbnB1dChlLHQsYyksZD1gJHtwLnJvdXRpbmVCb2R5fVxuICAgICAgdmVjNCAke2V9KGludCBiLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIHJldHVybiAke2V9KCR7KDAsIGEuZ2V0U3F1ZWV6ZWRQYXJhbXMpKGwscyl9KTtcbiAgICAgIH0gYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUoZCxwLmRlcGVuZGVuY2llcyl9Y29uc3QgYz11WzBdLHA9dVsxXSxkPU1hdGguY2VpbChyWzJdLzIpLGY9YHZlYzQgJHtlfShpbnQgYiwgaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTNEKFxuICAgICAgICAke3B9LCAke2N9LCAke2QqTWF0aC5jZWlsKHJbMV0vMil9LCAke2R9LCBiLCByb3csIGNvbCk7XG4gICAgICByZXR1cm4gJHtsLnRleHR1cmUyRH0oJHt0fSwgdXYpO31gO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShmLFsiY29vcmRpbmF0ZXMucGFja2VkVVZmcm9tM0QiXSl9Z2V0UGFja2VkU2FtcGxlck5EKGUsdCxuKXtjb25zdCByPW4udW5wYWNrZWRTaGFwZSxzPXIubGVuZ3RoLGE9W24ud2lkdGgsbi5oZWlnaHRdLHU9KDAsIGkuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKSxsPVthWzBdLGFbMV1dLGM9bFsxXSxwPWxbMF0sZD1NYXRoLmNlaWwocltzLTFdLzIpO2xldCBmPWQqTWF0aC5jZWlsKHJbcy0yXS8yKSxoPSJpbnQgYiwgaW50IHJvdywgaW50IGNvbCIsZz1gYiAqICR7Zn0gKyAocm93IC8gMikgKiAke2R9ICsgKGNvbCAvIDIpYDtmb3IobGV0IGU9MjtlPHMtMTtlKyspaD1gaW50IGIke2V9LCBgK2gsZio9cltzLWUtMV0sZz1gYiR7ZX0gKiAke2Z9ICsgYCtnO2NvbnN0IGI9YHZlYzQgJHtlfSgke2h9KSB7XG4gICAgICBpbnQgaW5kZXggPSAke2d9O1xuICAgICAgaW50IHRleFIgPSBpbmRleCAvICR7cH07XG4gICAgICBpbnQgdGV4QyA9IGluZGV4IC0gdGV4UiAqICR7cH07XG4gICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMigke3B9LCAke2N9KTtcbiAgICAgIHJldHVybiAke3UudGV4dHVyZTJEfSgke3R9LCB1dik7XG4gICAgfWA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKGIpfWdldFVucGFja2VkU2FtcGxlclNjYWxhcihlLHQsbil7Y29uc3RbcixpXT1bbi53aWR0aCxuLmhlaWdodF07aWYoMT09PXImJjE9PT1pKXtjb25zdCBuPWBcbiAgICAgICAgICBmbG9hdCAke2V9KCkge1xuICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgaGFsZkNSKTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4sWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIl0pfWNvbnN0IHM9YFxuICAgICAgICBmbG9hdCAke2V9KCkge1xuICAgICAgICAgIGludCBvZmZzZXRfJHt0fSA9IGNvb3Jkc1RvT2Zmc2V0KFRleENvb3JkcywgJHtyfSwgJHtpfSk7XG4gICAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHtyfSwgJHtpfSwgb2Zmc2V0XyR7dH0pO1xuICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgfVxuICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUocyxbImNvb3JkaW5hdGVzLnV2RnJvbUZsYXQiLCJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIiwiY29vcmRpbmF0ZXMuY29vcmRzVG9PZmZzZXQiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyMUQoZSx0LG4pe2NvbnN0IHI9bi53aWR0aCxpPW4uaGVpZ2h0O2lmKDE9PT1pJiYxPT09cil7Y29uc3Qgbj1gXG4gICAgICAgIGZsb2F0ICR7ZX0oaW50IGluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgaGFsZkNSKTtcbiAgICAgICAgfVxuICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobixbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9aWYoMT09PWkpe2NvbnN0IG49YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IGluZGV4KSB7XG4gICAgICAgICAgICB2ZWMyIHV2ID0gdmVjMigoZmxvYXQoaW5kZXgpICsgMC41KSAvICR7cn0uMCwgMC41KTtcbiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4sWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIl0pfWlmKDE9PT1yKXtjb25zdCBuPWBcbiAgICAgICAgICBmbG9hdCAke2V9KGludCBpbmRleCkge1xuICAgICAgICAgICAgdmVjMiB1diA9IHZlYzIoMC41LCAoZmxvYXQoaW5kZXgpICsgMC41KSAvICR7aX0uMCk7XG4gICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3R9LCB1dik7XG4gICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShuLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1jb25zdCBzPWBcbiAgICAgICAgZmxvYXQgJHtlfShpbnQgaW5kZXgpIHtcbiAgICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3J9LCAke2l9LCBpbmRleCk7XG4gICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgdXYpO1xuICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShzLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyMkQoZSx0LG4pe2NvbnN0IGk9bi51bnBhY2tlZFNoYXBlLHU9W24uaGVpZ2h0LG4ud2lkdGhdO2lmKG51bGwhPXUmJnIuQXJyYXlVdGlsLmFycmF5c0VxdWFsKGksdSkpe2NvbnN0IG49YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHJvdywgY29sKSArIGhhbGZDUikgLyB2ZWMyKCR7dVsxXX0uMCwgJHt1WzBdfS4wKTtcbiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4sWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIl0pfWNvbnN0e25ld1NoYXBlOmwsa2VwdERpbXM6Y309KDAsIHMuc3F1ZWV6ZVNoYXBlKShpKSxwPWw7aWYocC5sZW5ndGg8aS5sZW5ndGgpe2NvbnN0IHI9KDAsIGEuc3F1ZWV6ZUlucHV0U2hhcGUpKGkscCkscz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG4pKTtzLnVucGFja2VkU2hhcGU9cjtjb25zdCB1PVsiY29sIiwicm93Il0sbD1gXG4gICAgICAgICAgJHt0aGlzLmdldFVucGFja2VkU2FtcGxlckZyb21JbnB1dChlLHQscykucm91dGluZUJvZHl9XG4gICAgICAgICAgZmxvYXQgJHtlfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgICAgICByZXR1cm4gJHtlfSgkeygwLCBhLmdldFNxdWVlemVkUGFyYW1zKSh1LGMpfSk7XG4gICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShsLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1jb25zdCBkPXVbMV0sZj11WzBdO2lmKDE9PT1mKXtjb25zdCBuPWBcbiAgICAgICAgICBmbG9hdCAke2V9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgICAgIGludCBvZmZzZXRfJHt0fSA9IGNvb3Jkc1RvT2Zmc2V0KFRleENvb3JkcywgJHtkfSwgJHtmfSk7XG4gICAgICAgICAgICBmbG9hdCBpbmRleCA9IGRvdCh2ZWMzKHJvdywgY29sLCBvZmZzZXRfJHt0fSksIHZlYzMoJHtpWzFdfSwgMSwgMSkpO1xuICAgICAgICAgICAgdmVjMiB1diA9IHZlYzIoMC41LCAoaW5kZXggKyAwLjUpIC8gJHtkfS4wKTtcbiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4sWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIiwiY29vcmRpbmF0ZXMuY29vcmRzVG9PZmZzZXQiXSl9aWYoMT09PWQpe2NvbnN0IG49YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICAgICAgaW50IG9mZnNldF8ke3R9ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke2R9LCAke2Z9KTtcbiAgICAgICAgICAgIGZsb2F0IGluZGV4ID0gZG90KHZlYzMocm93LCBjb2wsIG9mZnNldF8ke3R9KSwgdmVjMygke2lbMV19LCAxLCAxKSk7XG4gICAgICAgICAgICB2ZWMyIHV2ID0gdmVjMigoaW5kZXggKyAwLjUpIC8gJHtmfS4wLCAwLjUpO1xuICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgdXYpO1xuICAgICAgICAgIH1cbiAgICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobixbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX1jb25zdCBoPWBcbiAgICAgICAgZmxvYXQgJHtlfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgICAgaW50IGluZGV4ID0gY29sICogJHtpWzFdfSArIHJvdztcbiAgICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke2R9LCAke2Z9LCBpbmRleCk7XG4gICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgdXYpO1xuICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShoLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX1nZXRVbnBhY2tlZFNhbXBsZXIzRChlLHQsbil7Y29uc3Qgcj1uLnVucGFja2VkU2hhcGUsaT1yWzFdKnJbMl0sdT1yWzJdLHtuZXdTaGFwZTpsLGtlcHREaW1zOmN9PSgwLCBzLnNxdWVlemVTaGFwZSkocikscD1sO2lmKHAubGVuZ3RoPHIubGVuZ3RoKXtjb25zdCBpPSgwLCBhLnNxdWVlemVJbnB1dFNoYXBlKShyLHApLHM9WyJiYXRjaCIsImNvbCIsInJvdyJdLHU9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShuKSk7dS51bnBhY2tlZFNoYXBlPWk7Y29uc3QgbD10aGlzLmdldFVucGFja2VkU2FtcGxlckZyb21JbnB1dChlLHQsdSksZD1jLnJldmVyc2UoKSxmPWBcbiAgICAgICAgICAke2wucm91dGluZUJvZHl9XG4gICAgICAgICAgZmxvYXQgJHtlfShpbnQgYmF0Y2gsIGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgICAgIHJldHVybiAke2V9KCR7KDAsIGEuZ2V0U3F1ZWV6ZWRQYXJhbXMpKHMsZCl9KTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKGYsbC5kZXBlbmRlbmNpZXMpfWNvbnN0IGQ9YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IGRlcHRoLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgICAgICAvLyBFeHBsaWNpdGx5IHVzZSBpbnRlZ2VyIG9wZXJhdGlvbnMgYXMgZG90KCkgb25seSB3b3JrcyBvbiBmbG9hdHMuXG4gICAgICAgICAgICBpbnQgaW5kZXggPSBkZXB0aCAqICR7aX0gKyBjb2wgKiAke3V9ICsgcm93O1xuICAgICAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHtuLndpZHRofSwgJHtuLmhlaWdodH0sIGluZGV4KTtcbiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShkLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX1nZXRVbnBhY2tlZFNhbXBsZXI0RChlLHQsbil7Y29uc3Qgcj1uLnVucGFja2VkU2hhcGUsaT1yWzNdLHM9clsyXSppLGE9YFxuICAgICAgICBmbG9hdCAke2V9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikge1xuICAgICAgICAgIGludCBpbmRleCA9IHJvdyAqICR7clsxXSpzfSArIGNvbCAqICR7c30gK1xuICAgICAgICAgICAgICBkZXB0aDIgKiAke2l9ICsgZGVwdGg7XG4gICAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHtuLndpZHRofSwgJHtuLmhlaWdodH0sIGluZGV4KTtcbiAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3R9LCB1dik7XG4gICAgICAgIH1cbiAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKGEsWyJjb29yZGluYXRlcy51dkZyb21GbGF0IiwiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1nZXRVbnBhY2tlZFNhbXBsZXI1RChlLHQsbil7Y29uc3Qgcj1uLnVucGFja2VkU2hhcGUsaT1yWzRdLHU9clszXSppLGw9clsyXSp1LGM9clsxXSpsLHtuZXdTaGFwZTpwLGtlcHREaW1zOmR9PSgwLCBzLnNxdWVlemVTaGFwZSkocik7aWYocC5sZW5ndGg8ci5sZW5ndGgpe2NvbnN0IGk9KDAsIGEuc3F1ZWV6ZUlucHV0U2hhcGUpKHIscCkscz1bInJvdyIsImNvbCIsImRlcHRoIiwiZGVwdGgyIiwiZGVwdGgzIl0sdT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG4pKTt1LnVucGFja2VkU2hhcGU9aTtjb25zdCBsPWBcbiAgICAgICAgICAke3RoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyRnJvbUlucHV0KGUsdCx1KS5yb3V0aW5lQm9keX1cbiAgICAgICAgICBmbG9hdCAke2V9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xuICAgICAgICAgICAgcmV0dXJuICR7ZX0oJHsoMCwgYS5nZXRTcXVlZXplZFBhcmFtcykocyxkKX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobCxbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy51dkZyb21GbGF0Il0pfWNvbnN0IGY9YFxuICAgICAgICBmbG9hdCAke2V9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xuICAgICAgICAgIGludCBpbmRleCA9IHJvdyAqICR7Y30gKyBjb2wgKiAke2x9ICsgZGVwdGggKiAke3V9ICtcbiAgICAgICAgICBkZXB0aDMgKiAke2l9ICsgZGVwdGgyO1xuICAgICAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7bi53aWR0aH0sICR7bi5oZWlnaHR9LCBpbmRleCk7XG4gICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgdXYpO1xuICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShmLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSIsImNvb3JkaW5hdGVzLnV2RnJvbUZsYXQiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyNkQoZSx0LG4pe2NvbnN0IHI9bi51bnBhY2tlZFNoYXBlLGk9cls1XSx1PXJbNF0qaSxsPXJbM10qdSxjPXJbMl0qbCxwPXJbMV0qYyx7bmV3U2hhcGU6ZCxrZXB0RGltczpmfT0oMCwgcy5zcXVlZXplU2hhcGUpKHIpO2lmKGQubGVuZ3RoPHIubGVuZ3RoKXtjb25zdCBpPSgwLCBhLnNxdWVlemVJbnB1dFNoYXBlKShyLGQpLHM9WyJyb3ciLCJjb2wiLCJkZXB0aCIsImRlcHRoMiIsImRlcHRoMyIsImRlcHRoNCJdLHU9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShuKSk7dS51bnBhY2tlZFNoYXBlPWk7Y29uc3QgbD1gXG4gICAgICAgICAgICAke3RoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyRnJvbUlucHV0KGUsdCx1KS5yb3V0aW5lQm9keX1cbiAgICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XG4gICAgICAgICAgICAgIHJldHVybiAke2V9KCR7KDAsIGEuZ2V0U3F1ZWV6ZWRQYXJhbXMpKHMsZil9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShsLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSIsImNvb3JkaW5hdGVzLnV2RnJvbUZsYXQiXSl9Y29uc3QgaD1gXG4gICAgICAgICAgZmxvYXQgJHtlfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsXG4gICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XG4gICAgICAgICAgICBpbnQgaW5kZXggPSByb3cgKiAke3B9ICsgY29sICogJHtjfSArIGRlcHRoICogJHtsfSArXG4gICAgICAgICAgICBkZXB0aDIgKiAke3V9ICsgZGVwdGgzICogJHtpfSArIGRlcHRoNDtcbiAgICAgICAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7bi53aWR0aH0sICR7bi5oZWlnaHR9LCBpbmRleCk7XG4gICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3R9LCB1dik7XG4gICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShoLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX10b1ZlYygpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQsdD1lLnNoYXBlLmxlbmd0aCxuPWUuc3RyaWRlcyxyPWUud2lkdGgsaT1lLmhlaWdodCxzPVtdO2ZvcihsZXQgZT0wO2U8dC0xOysrZSlzLnB1c2goYFxuICAgICAgICBjWyR7ZX1dID0gb2Zmc2V0IC8gJHtuW2VdfTtgKSxzLnB1c2goYFxuICAgICAgICBvZmZzZXQgLT0gY1ske2V9XSAqICR7bltlXX07YCk7cy5wdXNoKGBcbiAgICAgICAgY1ske3QtMX1dID0gb2Zmc2V0O2ApO2NvbnN0IGE9YFxuICAgICAgdm9pZCB0b1ZlYyh2ZWMyIHRleENvb3Jkcywgb3V0IGludCBjWyR7dH1dKSB7XG4gICAgICAgIGludCBvZmZzZXQgPSBjb29yZHNUb09mZnNldCh0ZXhDb29yZHMsICR7cn0sICR7aX0pO1xuICAgICAgICAke3Muam9pbigiIil9XG4gICAgICB9XG4gICAgICB2b2lkIHRvVmVjKGludCBvZmZzZXQsIG91dCBpbnQgY1ske3R9XSkge1xuICAgICAgICAke3Muam9pbigiIil9XG4gICAgICB9XG4gICAgYDtyZXR1cm4ge3RvVmVjOm5ldyBvLkdsc2xMaWJSb3V0aW5lKGEsWyJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX19dmFsdWVGcm9tKCl7Y29uc3QgZT17fTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmlucHV0TmFtZXMuZm9yRWFjaCgoKHQsbik9Pntjb25zdCByPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW25dLGk9KHIudW5wYWNrZWRTaGFwZS5sZW5ndGg+MD9yLnVucGFja2VkU2hhcGU6ci5zaGFwZSkubGVuZ3RoO2xldCBzPWBfJHt0fWA7ZVtzXT1uZXcgby5HbHNsTGliUm91dGluZSh0aGlzLmdldFZhbHVlRnJvbVNpbmdsZSh0LGksci53aWR0aCxyLmhlaWdodCwhMSksW2BzaGFwZVV0aWxzLmluZGljZXNUb09mZnNldCR7c31gLCJjb29yZGluYXRlcy5vZmZzZXRUb0Nvb3JkcyIsImZyYWdjb2xvci5nZXRDb2xvckFzRmxvYXQiXSkscys9Il9UIixlW3NdPW5ldyBvLkdsc2xMaWJSb3V0aW5lKHRoaXMuZ2V0VmFsdWVGcm9tU2luZ2xlKHQsaSxyLndpZHRoLHIuaGVpZ2h0LCEwKSxbYHNoYXBlVXRpbHMuaW5kaWNlc1RvT2Zmc2V0JHtzfWAsImNvb3JkaW5hdGVzLm9mZnNldFRvQ29vcmRzIiwiZnJhZ2NvbG9yLmdldENvbG9yQXNGbG9hdCJdKTt9KSksZX1nZXRWYWx1ZUZyb21TaW5nbGUoZSx0LG4scixvKXtsZXQgcz1gXyR7ZX1gO3JldHVybiBvJiYocys9Il9UIiksYFxuICAgICAgICBmbG9hdCAke3N9KGludCBtWyR7dH1dKSB7XG4gICAgICAgICAgaW50IG9mZnNldCA9IGluZGljZXNUb09mZnNldCR7c30obSk7XG4gICAgICAgICAgdmVjMiBjb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhvZmZzZXQsICR7bn0sICR7cn0pO1xuICAgICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7KDAsIGkuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKS50ZXh0dXJlMkR9KCR7ZX0sIGNvb3JkcykpO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBgfWdldFBhY2tlZFZhbHVlRnJvbShlLHQsbixyLG8pe2xldCBzPWBfJHtlfV9QYWNrYDtyZXR1cm4gbyYmKHMrPSJfVCIpLGBcbiAgICAgICAgdmVjNCAke3N9KGludCBtWyR7dH1dKSB7XG4gICAgICAgICAgaW50IG9mZnNldCA9IGluZGljZXNUb09mZnNldF8ke2V9KG0pO1xuICAgICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke259LCAke3J9KTtcbiAgICAgICAgICByZXR1cm4gJHsoMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLnRleHR1cmUyRH0oJHtlfSwgY29vcmRzKTtcbiAgICAgICAgfVxuICAgICAgICBgfX10LkNvb3Jkc0dsc2xMaWI9dTt9LDE5OTc6KGUsdCk9Pnt2YXIgbjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Ub3BvbG9naWNhbFNvcnRHbHNsUm91dGluZXM9dC5HbHNsTGliUm91dGluZU5vZGU9dC5HbHNsTGliUm91dGluZT10Lkdsc2xMaWI9dC5HbHNsQ29udGV4dD10LkZ1bmN0aW9uVHlwZT12b2lkIDAsKG49dC5GdW5jdGlvblR5cGV8fCh0LkZ1bmN0aW9uVHlwZT17fSkpW24uVmFsdWVCYXNlZD0wXT0iVmFsdWVCYXNlZCIsbltuLlBvc2l0aW9uYWw9MV09IlBvc2l0aW9uYWwiLHQuR2xzbENvbnRleHQ9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scil7dGhpcy5nbENvbnRleHQ9ZSx0aGlzLnByb2dyYW1JbmZvPXQsdGhpcy5pbnB1dFRleHR1cmVMYXlvdXRzPW4sdGhpcy5vdXRwdXRUZXh0dXJlTGF5b3V0PXI7fX0sdC5HbHNsTGliPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuY29udGV4dD1lO319LHQuR2xzbExpYlJvdXRpbmU9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLnJvdXRpbmVCb2R5PWUsdGhpcy5kZXBlbmRlbmNpZXM9dDt9fSx0Lkdsc2xMaWJSb3V0aW5lTm9kZT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5uYW1lPWUsdGhpcy5kZXBlbmRlbmNpZXM9bnx8W10sdCYmKHRoaXMucm91dGluZUJvZHk9dCk7fWFkZERlcGVuZGVuY3koZSl7ZSYmdGhpcy5kZXBlbmRlbmNpZXMucHVzaChlKTt9fSx0LlRvcG9sb2dpY2FsU29ydEdsc2xSb3V0aW5lcz1jbGFzc3tzdGF0aWMgcmV0dXJuT3JkZXJlZE5vZGVzKGUpe2lmKCFlfHwwPT09ZS5sZW5ndGgpcmV0dXJuIFtdO2lmKDE9PT1lLmxlbmd0aClyZXR1cm4gZTtjb25zdCB0PW5ldyBTZXQsbj1uZXcgU2V0LHI9bmV3IEFycmF5O3JldHVybiB0aGlzLmNyZWF0ZU9yZGVyZWROb2RlcyhlLHQsbixyKSxyfXN0YXRpYyBjcmVhdGVPcmRlcmVkTm9kZXMoZSx0LG4scil7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDsrK28pdGhpcy5kZnNUcmF2ZXJzZShlW29dLHQsbixyKTt9c3RhdGljIGRmc1RyYXZlcnNlKGUsdCxuLHIpe2lmKCFlfHxuLmhhcyhlLm5hbWUpKXJldHVybjtpZih0LmhhcyhlLm5hbWUpKXRocm93IG5ldyBFcnJvcigiQ3ljbGljIGRlcGVuZGVuY3kgZGV0ZWN0ZWQuIENhbid0IHRvcG9sb2dpY2FsbHkgc29ydCByb3V0aW5lcyBuZWVkZWQgZm9yIHNoYWRlci4iKTt0LmFkZChlLm5hbWUpO2NvbnN0IG89ZS5kZXBlbmRlbmNpZXM7aWYobyYmby5sZW5ndGg+MClmb3IobGV0IGU9MDtlPG8ubGVuZ3RoOysrZSl0aGlzLmRmc1RyYXZlcnNlKG9bZV0sdCxuLHIpO3IucHVzaChlKSxuLmFkZChlLm5hbWUpLHQuZGVsZXRlKGUubmFtZSk7fX07fSwxMzcxOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5FbmNvZGluZ0dsc2xMaWI9dm9pZCAwO2NvbnN0IHI9bigxOTk3KTtjbGFzcyBvIGV4dGVuZHMgci5HbHNsTGlie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO31nZXRGdW5jdGlvbnMoKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMuZW5jb2RlRmxvYXQzMigpKSx0aGlzLmRlY29kZUZsb2F0MzIoKSl9Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm4ge319ZW5jb2RlRmxvYXQzMigpe3JldHVybiB7ZW5jb2RlOm5ldyByLkdsc2xMaWJSb3V0aW5lKCJoaWdocCB2ZWM0IGVuY29kZShoaWdocCBmbG9hdCBmKSB7XG4gICAgICAgIHJldHVybiB2ZWM0KGYsIDAuMCwgMC4wLCAwLjApO1xuICAgICAgfVxuICAgICAgICAiKX19ZGVjb2RlRmxvYXQzMigpe3JldHVybiB7ZGVjb2RlOm5ldyByLkdsc2xMaWJSb3V0aW5lKCJoaWdocCBmbG9hdCBkZWNvZGUoaGlnaHAgdmVjNCByZ2JhKSB7XG4gICAgICAgIHJldHVybiByZ2JhLnI7XG4gICAgICB9XG4gICAgICAgICIpfX1lbmNvZGVVaW50OCgpe2NvbnN0IGU9by5pc0xpdHRsZUVuZGlhbigpPyJyZ2JhLnJnYmE9cmdiYS5hYmdyOyI6IiI7cmV0dXJuIHtlbmNvZGU6bmV3IHIuR2xzbExpYlJvdXRpbmUoYFxuICAgICAgaGlnaHAgdmVjNCBlbmNvZGUoaGlnaHAgZmxvYXQgZikge1xuICAgICAgICBoaWdocCBmbG9hdCBGID0gYWJzKGYpO1xuICAgICAgICBoaWdocCBmbG9hdCBTaWduID0gc3RlcCgwLjAsLWYpO1xuICAgICAgICBoaWdocCBmbG9hdCBFeHBvbmVudCA9IGZsb29yKGxvZzIoRikpO1xuICAgICAgICBoaWdocCBmbG9hdCBNYW50aXNzYSA9IChleHAyKC0gRXhwb25lbnQpICogRik7XG4gICAgICAgIEV4cG9uZW50ID0gZmxvb3IobG9nMihGKSArIDEyNy4wKSArIGZsb29yKGxvZzIoTWFudGlzc2EpKTtcbiAgICAgICAgaGlnaHAgdmVjNCByZ2JhO1xuICAgICAgICByZ2JhWzBdID0gMTI4LjAgKiBTaWduICArIGZsb29yKEV4cG9uZW50KmV4cDIoLTEuMCkpO1xuICAgICAgICByZ2JhWzFdID0gMTI4LjAgKiBtb2QoRXhwb25lbnQsMi4wKSArIG1vZChmbG9vcihNYW50aXNzYSoxMjguMCksMTI4LjApO1xuICAgICAgICByZ2JhWzJdID0gZmxvb3IobW9kKGZsb29yKE1hbnRpc3NhKmV4cDIoMjMuMCAtOC4wKSksZXhwMig4LjApKSk7XG4gICAgICAgIHJnYmFbM10gPSBmbG9vcihleHAyKDIzLjApKm1vZChNYW50aXNzYSxleHAyKC0xNS4wKSkpO1xuICAgICAgICAke2V9XG4gICAgICAgIHJnYmEgPSByZ2JhIC8gMjU1LjA7IC8vIHZhbHVlcyBuZWVkIHRvIGJlIG5vcm1hbGl6ZWQgdG8gWzAsMV1cbiAgICAgICAgcmV0dXJuIHJnYmE7XG4gICAgfVxuICAgICAgICBgKX19ZGVjb2RlVWludDgoKXtjb25zdCBlPW8uaXNMaXR0bGVFbmRpYW4oKT8icmdiYS5yZ2JhPXJnYmEuYWJncjsiOiIiO3JldHVybiB7ZGVjb2RlOm5ldyByLkdsc2xMaWJSb3V0aW5lKGBcbiAgICAgICAgaGlnaHAgZmxvYXQgZGVjb2RlKGhpZ2hwIHZlYzQgcmdiYSkge1xuICAgICAgICAgIHJnYmEgPSByZ2JhICogMjU1LjA7IC8vIHZhbHVlcyBuZWVkIHRvIGJlIGRlLW5vcm1hbGl6ZWQgZnJvbSBbMCwxXSB0byBbMCwyNTVdXG4gICAgICAgICAgJHtlfVxuICAgICAgICAgIGhpZ2hwIGZsb2F0IFNpZ24gPSAxLjAgLSBzdGVwKDEyOC4wLHJnYmFbMF0pKjIuMDtcbiAgICAgICAgICBoaWdocCBmbG9hdCBFeHBvbmVudCA9IDIuMCAqIG1vZChyZ2JhWzBdLDEyOC4wKSArIHN0ZXAoMTI4LjAscmdiYVsxXSkgLSAxMjcuMDtcbiAgICAgICAgICBoaWdocCBmbG9hdCBNYW50aXNzYSA9IG1vZChyZ2JhWzFdLDEyOC4wKSo2NTUzNi4wICsgcmdiYVsyXSoyNTYuMCArcmdiYVszXSArIGZsb2F0KDB4ODAwMDAwKTtcbiAgICAgICAgICBoaWdocCBmbG9hdCBSZXN1bHQgPSAgU2lnbiAqIGV4cDIoRXhwb25lbnQpICogKE1hbnRpc3NhICogZXhwMigtMjMuMCApKTtcbiAgICAgICAgICByZXR1cm4gUmVzdWx0O1xuICAgICAgfVxuICAgICAgICBgKX19c3RhdGljIGlzTGl0dGxlRW5kaWFuKCl7Y29uc3QgZT1uZXcgQXJyYXlCdWZmZXIoNCksdD1uZXcgVWludDMyQXJyYXkoZSksbj1uZXcgVWludDhBcnJheShlKTtpZih0WzBdPTM3MzU5Mjg1NTksMjM5PT09blswXSlyZXR1cm4gITA7aWYoMjIyPT09blswXSlyZXR1cm4gITE7dGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGVuZGlhbm5lc3MiKX19dC5FbmNvZGluZ0dsc2xMaWI9bzt9LDI2OTE6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkZyYWdDb2xvckdsc2xMaWI9dm9pZCAwO2NvbnN0IHI9bigxOTk3KSxvPW4oNjc1Nyk7Y2xhc3MgaSBleHRlbmRzIHIuR2xzbExpYntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt9Z2V0RnVuY3Rpb25zKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0aGlzLnNldEZyYWdDb2xvcigpKSx0aGlzLmdldENvbG9yQXNGbG9hdCgpKX1nZXRDdXN0b21UeXBlcygpe3JldHVybiB7fX1zZXRGcmFnQ29sb3IoKXtjb25zdCBlPSgwLCBvLmdldEdsc2wpKHRoaXMuY29udGV4dC5nbENvbnRleHQudmVyc2lvbik7cmV0dXJuIHtzZXRGcmFnQ29sb3I6bmV3IHIuR2xzbExpYlJvdXRpbmUoYFxuICAgICAgICB2b2lkIHNldEZyYWdDb2xvcihmbG9hdCB2YWx1ZSkge1xuICAgICAgICAgICAgJHtlLm91dHB1dH0gPSBlbmNvZGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGAsWyJlbmNvZGluZy5lbmNvZGUiXSl9fWdldENvbG9yQXNGbG9hdCgpe3JldHVybiB7Z2V0Q29sb3JBc0Zsb2F0Om5ldyByLkdsc2xMaWJSb3V0aW5lKCJcbiAgICAgICAgZmxvYXQgZ2V0Q29sb3JBc0Zsb2F0KHZlYzQgY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGUoY29sb3IpO1xuICAgICAgICB9XG4gICAgICAgICIsWyJlbmNvZGluZy5kZWNvZGUiXSl9fX10LkZyYWdDb2xvckdsc2xMaWI9aTt9LDM4Nzg6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZXBsYWNlSW5saW5lcz12b2lkIDA7Y29uc3Qgbj0vQGlubGluZVtcc1xuXHJdKyhcdyspW1xzXG5ccl0rKFswLTlhLXpBLVpfXSspXHMqXCgoW14pXSopXClccyp7KChbXn1dfFtcblxyXSkqKX0vZ207dC5yZXBsYWNlSW5saW5lcz1mdW5jdGlvbihlKXtjb25zdCB0PXt9O2xldCByO2Zvcig7bnVsbCE9PShyPW4uZXhlYyhlKSk7KXtjb25zdCBlPXJbM10uc3BsaXQoIiwiKS5tYXAoKGU9Pntjb25zdCB0PWUudHJpbSgpLnNwbGl0KCIgIik7cmV0dXJuIHQmJjI9PT10Lmxlbmd0aD97dHlwZTp0WzBdLG5hbWU6dFsxXX06bnVsbH0pKS5maWx0ZXIoKGU9Pm51bGwhPT1lKSk7dFtyWzJdXT17cGFyYW1zOmUsYm9keTpyWzRdfTt9Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3Qgbz0iKFxcdyspP1xccysoW18wLTlhLXpBLVpdKylcXHMrPVxccytfX0ZVTkNfX1xcKCguKilcXClcXHMqOyIucmVwbGFjZSgiX19GVU5DX18iLG4pLGk9bmV3IFJlZ0V4cChvLCJnbSIpO2Zvcig7bnVsbCE9PShyPWkuZXhlYyhlKSk7KXtjb25zdCBvPXJbMV0saT1yWzJdLHM9clszXS5zcGxpdCgiLCIpLGE9bz9gJHtvfSAke2l9O2A6IiI7bGV0IHU9dFtuXS5ib2R5LGw9IiI7dFtuXS5wYXJhbXMuZm9yRWFjaCgoKGUsdCk9PntlJiYobCs9YCR7ZS50eXBlfSAke2UubmFtZX0gPSAke3NbdF19O1xuYCk7fSkpLHU9YCR7bH1cbiAke3V9YCx1PXUucmVwbGFjZSgicmV0dXJuIixgJHtpfSA9IGApO2NvbnN0IGM9YFxuICAgICAgJHthfVxuICAgICAge1xuICAgICAgICAke3V9XG4gICAgICB9XG4gICAgICBgO2U9ZS5yZXBsYWNlKHJbMF0sYyk7fX1yZXR1cm4gZS5yZXBsYWNlKG4sIiIpfTt9LDg4OTc6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lkdsc2xQcmVwcm9jZXNzb3I9dm9pZCAwO2NvbnN0IHI9bigxOTk3KSxvPW4oMzg3OCksaT1uKDEyNDgpLHM9big2NzU3KTt0Lkdsc2xQcmVwcm9jZXNzb3I9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4sbyl7dGhpcy5saWJzPXt9LHRoaXMuZ2xzbExpYlJvdXRpbmVEZXBlbmRlbmN5R3JhcGg9e30sdGhpcy5jb250ZXh0PW5ldyByLkdsc2xDb250ZXh0KGUsdCxuLG8pLE9iamVjdC5rZXlzKGkuZ2xzbFJlZ2lzdHJ5KS5mb3JFYWNoKChlPT57Y29uc3QgdD1uZXcgaS5nbHNsUmVnaXN0cnlbZV0odGhpcy5jb250ZXh0KTt0aGlzLmxpYnNbZV09dDt9KSk7Y29uc3Qgcz10aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoO2Zvcihjb25zdCBlIGluIHRoaXMubGlicyl7Y29uc3QgdD10aGlzLmxpYnNbZV0uZ2V0RnVuY3Rpb25zKCk7Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3Qgbz1lKyIuIituO2xldCBpO3Nbb10/KGk9c1tvXSxpLnJvdXRpbmVCb2R5PXRbbl0ucm91dGluZUJvZHkpOihpPW5ldyByLkdsc2xMaWJSb3V0aW5lTm9kZShvLHRbbl0ucm91dGluZUJvZHkpLHNbb109aSk7Y29uc3QgYT10W25dLmRlcGVuZGVuY2llcztpZihhKWZvcihsZXQgZT0wO2U8YS5sZW5ndGg7KytlKWlmKHNbYVtlXV0paS5hZGREZXBlbmRlbmN5KHNbYVtlXV0pO2Vsc2Uge2NvbnN0IHQ9bmV3IHIuR2xzbExpYlJvdXRpbmVOb2RlKGFbZV0pO3NbYVtlXV09dCxpLmFkZERlcGVuZGVuY3kodCk7fX19fXByZXByb2Nlc3MoKXtjb25zdCBlPXRoaXMuY29udGV4dC5wcm9ncmFtSW5mbztsZXQgdD1lLnNoYWRlclNvdXJjZTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmhhc01haW58fCh0PWAke3R9XG4gICAgICAkeygwLCBzLmdldERlZmF1bHRGcmFnU2hhZGVyTWFpbikodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uLHRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0LnNoYXBlLmxlbmd0aCl9YCksdD0oMCwgby5yZXBsYWNlSW5saW5lcykodCksYCR7KDAsIHMuZ2V0RnJhZ1NoYWRlclByZWFtYmxlKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pfVxuICAgICR7dGhpcy5nZXRVbmlmb3JtcyhlLmlucHV0TmFtZXMsZS52YXJpYWJsZXMpfVxuICAgICR7dGhpcy5nZXRJbXBvcnRzKHQpfVxuICAgICR7dH1gfWdldEltcG9ydHMoZSl7Y29uc3QgdD10aGlzLnNlbGVjdEdsc2xMaWJSb3V0aW5lc1RvQmVJbmNsdWRlZChlKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuICIiO2xldCBuPSIiO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7KytlKXtpZighdFtlXS5yb3V0aW5lQm9keSl0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgYm9keSBmb3IgdGhlIEdsc2wgTGlicmFyeSByb3V0aW5lOiAke3RbZV0ubmFtZX1gKTtuKz10W2VdLnJvdXRpbmVCb2R5KyJcbiI7fXJldHVybiBufXNlbGVjdEdsc2xMaWJSb3V0aW5lc1RvQmVJbmNsdWRlZChlKXtjb25zdCB0PVtdO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoKS5mb3JFYWNoKChuPT57Y29uc3Qgcj1uLnNwbGl0KCIuIilbMV07LTEhPT1lLmluZGV4T2YocikmJnQucHVzaCh0aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoW25dKTt9KSksci5Ub3BvbG9naWNhbFNvcnRHbHNsUm91dGluZXMucmV0dXJuT3JkZXJlZE5vZGVzKHQpfWdldFVuaWZvcm1zKGUsdCl7Y29uc3Qgbj1bXTtpZihlKWZvcihjb25zdCB0IG9mIGUpbi5wdXNoKGB1bmlmb3JtIHNhbXBsZXIyRCAke3R9O2ApO2lmKHQpZm9yKGNvbnN0IGUgb2YgdCluLnB1c2goYHVuaWZvcm0gJHtlLnR5cGV9ICR7ZS5uYW1lfSR7ZS5hcnJheUxlbmd0aD9gWyR7ZS5hcnJheUxlbmd0aH1dYDoiIn07YCk7cmV0dXJuIG4uam9pbigiXG4iKX19O30sMTI0ODooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2xzbFJlZ2lzdHJ5PXZvaWQgMDtjb25zdCByPW4oNjg1OSksbz1uKDEzNzEpLGk9bigyNjkxKSxzPW4oOTE4MyksYT1uKDkzMTQpO3QuZ2xzbFJlZ2lzdHJ5PXtlbmNvZGluZzpvLkVuY29kaW5nR2xzbExpYixmcmFnY29sb3I6aS5GcmFnQ29sb3JHbHNsTGliLHZlYzphLlZlY0dsc2xMaWIsc2hhcGVVdGlsczpzLlNoYXBlVXRpbHNHbHNsTGliLGNvb3JkaW5hdGVzOnIuQ29vcmRzR2xzbExpYn07fSw5MTgzOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5TaGFwZVV0aWxzR2xzbExpYj12b2lkIDA7Y29uc3Qgcj1uKDE5OTcpO2NsYXNzIG8gZXh0ZW5kcyByLkdsc2xMaWJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7fWdldEZ1bmN0aW9ucygpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5iY2FzdEluZGV4KCkpLHRoaXMuYmNhc3RNYXRtdWxJbmRleCgpKSx0aGlzLm9mZnNldFRvSW5kaWNlcygpKSx0aGlzLmluZGljZXNUb09mZnNldCgpKSx0aGlzLmluY3JlbWVudEluZGljZXMoKSl9Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm4ge319YmNhc3RJbmRleCgpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQuc2hhcGUubGVuZ3RoLHQ9e307cmV0dXJuIHRoaXMuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLmZvckVhY2goKChuLG8pPT57Y29uc3QgaT10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tvXS51bnBhY2tlZFNoYXBlO2lmKGkubGVuZ3RoPD1lKXtjb25zdCBvPWkubGVuZ3RoLHM9ZS1vLGE9YGJjYXN0SW5kaWNlc18ke259YDtsZXQgdT0iIjtmb3IobGV0IGU9MDtlPG87KytlKXUrPWBcbiAgICAgICAgICByZWFsSW5kaWNlc1ske2V9XSA9IGludCggbW9kKGZsb2F0KGJjYXN0ZWRJbmRpY2VzWyR7cytlfV0pLCAke2lbZV19LjApICk7XG4gICAgICAgICAgYDtjb25zdCBsPWBcbiAgICAgICAgdm9pZCAke2F9IChpbnQgYmNhc3RlZEluZGljZXNbJHtlfV0sIG91dCBpbnQgcmVhbEluZGljZXNbJHtvfV0pIHtcbiAgICAgICAgICAke3V9XG4gICAgICAgIH1cbiAgICAgICAgYDt0W2FdPW5ldyByLkdsc2xMaWJSb3V0aW5lKGwpO319KSksdH1iY2FzdE1hdG11bEluZGV4KCl7Y29uc3QgZT10aGlzLmNvbnRleHQub3V0cHV0VGV4dHVyZUxheW91dC5zaGFwZS5sZW5ndGgsdD17fTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmlucHV0TmFtZXMuZm9yRWFjaCgoKG4sbyk9Pntjb25zdCBpPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW29dLnNoYXBlO2lmKCEoaS5sZW5ndGg8Mnx8aS5sZW5ndGg+ZSkpe2NvbnN0IG89aS5sZW5ndGgscz1lLW8sYT1gYmNhc3RNYXRtdWxJbmRpY2VzXyR7bn1gO2xldCB1PSIiO2ZvcihsZXQgZT0wO2U8by0yOysrZSl1Kz1gXG4gICAgICAgICAgcmVhbEluZGljZXNbJHtlfV0gPSBpbnQoIG1vZChmbG9hdChiY2FzdGVkSW5kaWNlc1ske3MrZX1dKSwgJHtpW2VdfS4wKSApO1xuICAgICAgICAgIGA7Y29uc3QgbD1gXG4gICAgICAgIHZvaWQgJHthfShpbnQgYmNhc3RlZEluZGljZXNbJHtlfV0sIG91dCBpbnQgcmVhbEluZGljZXNbJHtvfV0pIHtcbiAgICAgICAgICAke3V9XG4gICAgICAgICAgcmVhbEluZGljZXNbJHtvLTF9XSA9IGJjYXN0ZWRJbmRpY2VzWyR7ZS0xfV07XG4gICAgICAgICAgcmVhbEluZGljZXNbJHtvLTJ9XSA9IGJjYXN0ZWRJbmRpY2VzWyR7ZS0yfV07XG4gICAgICAgIH1cbiAgICAgICAgYDt0W2FdPW5ldyByLkdsc2xMaWJSb3V0aW5lKGwpO319KSksdH1pbmRpY2VzVG9PZmZzZXQoKXtjb25zdCBlPXt9O3JldHVybiB0aGlzLmNvbnRleHQucHJvZ3JhbUluZm8uaW5wdXROYW1lcy5mb3JFYWNoKCgodCxuKT0+e2NvbnN0IGk9dGhpcy5jb250ZXh0LmlucHV0VGV4dHVyZUxheW91dHNbbl0uc2hhcGUscz10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tuXS5zdHJpZGVzLGE9aS5sZW5ndGg7bGV0IHU9YGluZGljZXNUb09mZnNldF8ke3R9YDtlW3VdPW5ldyByLkdsc2xMaWJSb3V0aW5lKG8uaW5kZXhUb09mZnNldFNpbmdsZSh1LGEscykpLHU9YGluZGljZXNUb09mZnNldF8ke3R9X1RgLGVbdV09bmV3IHIuR2xzbExpYlJvdXRpbmUoby5pbmRleFRvT2Zmc2V0U2luZ2xlKHUsYSxzLnNsaWNlKCkucmV2ZXJzZSgpKSk7fSkpLGV9c3RhdGljIGluZGV4VG9PZmZzZXRTaW5nbGUoZSx0LG4pe2xldCByPSIiO2ZvcihsZXQgZT10LTE7ZT49MDstLWUpcis9YFxuICAgICAgICBvZmZzZXQgKz0gaW5kaWNlc1ske2V9XSAqICR7bltlXX07XG4gICAgICAgIGA7cmV0dXJuIGBcbiAgICAgIGludCAke2V9KGludCBpbmRpY2VzWyR7dH1dKSB7XG4gICAgICAgIGludCBvZmZzZXQgPSAwO1xuICAgICAgICAke3J9XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgICB9XG4gICAgICBgfW9mZnNldFRvSW5kaWNlcygpe2NvbnN0IGU9e307cmV0dXJuIHRoaXMuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLmZvckVhY2goKCh0LG4pPT57Y29uc3QgaT10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tuXS5zaGFwZSxzPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW25dLnN0cmlkZXMsYT1pLmxlbmd0aDtsZXQgdT1gb2Zmc2V0VG9JbmRpY2VzXyR7dH1gO2VbdV09bmV3IHIuR2xzbExpYlJvdXRpbmUoby5vZmZzZXRUb0luZGljZXNTaW5nbGUodSxhLHMpKSx1PWBvZmZzZXRUb0luZGljZXNfJHt0fV9UYCxlW3VdPW5ldyByLkdsc2xMaWJSb3V0aW5lKG8ub2Zmc2V0VG9JbmRpY2VzU2luZ2xlKHUsYSxzLnNsaWNlKCkucmV2ZXJzZSgpKSk7fSkpLGV9c3RhdGljIG9mZnNldFRvSW5kaWNlc1NpbmdsZShlLHQsbil7Y29uc3Qgcj1bXTtmb3IobGV0IGU9MDtlPHQtMTsrK2Upci5wdXNoKGBcbiAgICAgIGluZGljZXNbJHtlfV0gPSBvZmZzZXQgLyAke25bZV19O2ApLHIucHVzaChgXG4gICAgICAgIG9mZnNldCAtPSBpbmRpY2VzWyR7ZX1dICogJHtuW2VdfTtgKTtyZXR1cm4gci5wdXNoKGBcbiAgICAgIGluZGljZXNbJHt0LTF9XSA9IG9mZnNldDtgKSxgXG4gICAgICB2b2lkICR7ZX0oaW50IG9mZnNldCwgb3V0IGludCBpbmRpY2VzWyR7dH1dKSB7XG4gICAgICAgICR7ci5qb2luKCIiKX1cbiAgICAgIH1cbiAgICAgIGB9aW5jcmVtZW50SW5kaWNlcygpe2NvbnN0IGU9e307cmV0dXJuIHRoaXMuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLmZvckVhY2goKCh0LG4pPT57Y29uc3Qgbz10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tuXS5zaGFwZSxpPW8ubGVuZ3RoLHM9YGluY3JlbWVudEluZGljZXNfJHt0fWA7bGV0IGE9IiI7Zm9yKGxldCBlPTA7ZTxpOysrZSlhKz1gXG4gICAgICAgIHNoYXBlWyR7ZX1dID0gJHtvW2VdfTtgO2NvbnN0IHU9YFxuICAgICAgICB2b2lkICR7c30oaW50IGF4aXMsIG91dCBpbnQgaW5kaWNlc1ske2l9XSkge1xuICAgICAgICAgIGludCBzaGFwZVske2l9XTtcbiAgICAgICAgICAke2F9O1xuICAgICAgICAgIGZvcihpbnQgaSA9ICR7aX0gLTEgOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgaWYoaSA+IGF4aXMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaW5kaWNlc1tpXSArPSAxO1xuICAgICAgICAgICAgaWYoaW5kaWNlc1tpXSA8IHNoYXBlW2ldKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kaWNlc1tpXSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGA7ZVtzXT1uZXcgci5HbHNsTGliUm91dGluZSh1KTt9KSksZX19dC5TaGFwZVV0aWxzR2xzbExpYj1vO30sNjc1NzooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmdldERlZmF1bHRGcmFnU2hhZGVyTWFpbj10LmdldEZyYWdTaGFkZXJQcmVhbWJsZT10LmdldFZlcnRleFNoYWRlclNvdXJjZT10LmdldEdsc2w9dm9pZCAwO2NvbnN0IG49e3ZlcnNpb246IiIsYXR0cmlidXRlOiJhdHRyaWJ1dGUiLHZhcnlpbmdWZXJ0ZXg6InZhcnlpbmciLHZhcnlpbmdGcmFnOiJ2YXJ5aW5nIix0ZXh0dXJlMkQ6InRleHR1cmUyRCIsb3V0cHV0OiJnbF9GcmFnQ29sb3IiLG91dHB1dERlY2xhcmF0aW9uOiIifSxyPXt2ZXJzaW9uOiIjdmVyc2lvbiAzMDAgZXMiLGF0dHJpYnV0ZToiaW4iLHZhcnlpbmdWZXJ0ZXg6Im91dCIsdmFyeWluZ0ZyYWc6ImluIix0ZXh0dXJlMkQ6InRleHR1cmUiLG91dHB1dDoib3V0cHV0Q29sb3IiLG91dHB1dERlY2xhcmF0aW9uOiJvdXQgdmVjNCBvdXRwdXRDb2xvcjsifTtmdW5jdGlvbiBvKGUpe3JldHVybiAxPT09ZT9uOnJ9dC5nZXRHbHNsPW8sdC5nZXRWZXJ0ZXhTaGFkZXJTb3VyY2U9ZnVuY3Rpb24oZSl7Y29uc3QgdD1vKGUpO3JldHVybiBgJHt0LnZlcnNpb259XG4gICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4gICAgICAke3QuYXR0cmlidXRlfSB2ZWMzIHBvc2l0aW9uO1xuICAgICAgJHt0LmF0dHJpYnV0ZX0gdmVjMiB0ZXh0dXJlQ29vcmQ7XG5cbiAgICAgICR7dC52YXJ5aW5nVmVydGV4fSB2ZWMyIFRleENvb3JkcztcblxuICAgICAgdm9pZCBtYWluKClcbiAgICAgIHtcbiAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDEuMCk7XG4gICAgICAgICAgVGV4Q29vcmRzID0gdGV4dHVyZUNvb3JkO1xuICAgICAgfWB9LHQuZ2V0RnJhZ1NoYWRlclByZWFtYmxlPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9byhlKTtyZXR1cm4gYCR7dC52ZXJzaW9ufVxuICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiAgICBwcmVjaXNpb24gaGlnaHAgaW50O1xuICAgIHByZWNpc2lvbiBoaWdocCBzYW1wbGVyMkQ7XG4gICAgJHt0LnZhcnlpbmdGcmFnfSB2ZWMyIFRleENvb3JkcztcbiAgICAke3Qub3V0cHV0RGVjbGFyYXRpb259XG4gICAgY29uc3QgdmVjMiBoYWxmQ1IgPSB2ZWMyKDAuNSwgMC41KTtcblxuICAgIC8vIEN1c3RvbSB2ZWN0b3IgdHlwZXMgdG8gaGFuZGxlIGhpZ2hlciBkaW1lbmFsaXRpZXMuXG4gICAgc3RydWN0IGl2ZWM1XG4gICAge1xuICAgICAgaW50IHg7XG4gICAgICBpbnQgeTtcbiAgICAgIGludCB6O1xuICAgICAgaW50IHc7XG4gICAgICBpbnQgdTtcbiAgICB9O1xuXG4gICAgc3RydWN0IGl2ZWM2XG4gICAge1xuICAgICAgaW50IHg7XG4gICAgICBpbnQgeTtcbiAgICAgIGludCB6O1xuICAgICAgaW50IHc7XG4gICAgICBpbnQgdTtcbiAgICAgIGludCB2O1xuICAgIH07XG5cbiAgICBpbnQgaW1vZChpbnQgeCwgaW50IHkpIHtcbiAgICAgIHJldHVybiB4IC0geSAqICh4IC8geSk7XG4gICAgfVxuXG4gICAgYH0sdC5nZXREZWZhdWx0RnJhZ1NoYWRlck1haW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYFxuICB2b2lkIG1haW4oKSB7XG4gICAgaW50IGluZGljZXNbJHt0fV07XG4gICAgdG9WZWMoVGV4Q29vcmRzLCBpbmRpY2VzKTtcbiAgICB2ZWM0IHJlc3VsdCA9IHZlYzQocHJvY2VzcyhpbmRpY2VzKSk7XG4gICAgJHtvKGUpLm91dHB1dH0gPSByZXN1bHQ7XG4gIH1cbiAgYH07fSw5MzE0OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5WZWNHbHNsTGliPXZvaWQgMDtjb25zdCByPW4oMTk5Nyk7Y2xhc3MgbyBleHRlbmRzIHIuR2xzbExpYntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt9Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm4ge319Z2V0RnVuY3Rpb25zKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5iaW5hcnlWZWNGdW5jdGlvbnMoKSksdGhpcy5jb3B5VmVjKCkpLHRoaXMuc2V0VmVjSXRlbSgpKSx0aGlzLmdldFZlY0l0ZW0oKSl9YmluYXJ5VmVjRnVuY3Rpb25zKCl7Y29uc3QgZT10aGlzLmNvbnRleHQub3V0cHV0VGV4dHVyZUxheW91dC5zaGFwZS5sZW5ndGgsdD17YWRkOiIrPSIsc3ViOiItPSIsbXVsOiIqPSIsZGl2OiIvPSJ9LG49e307Zm9yKGNvbnN0IG8gaW4gdCl7Y29uc3QgaT1gJHtvfVZlY2A7bGV0IHM9IiI7Zm9yKGxldCBuPTA7bjxlOysrbilzKz1gXG4gICAgICAgICAgZGVzdFske259XSAke3Rbb119IHNyY1ske259XTtcbiAgICAgICAgICBgO2NvbnN0IGE9YFxuICAgICAgICB2b2lkICR7aX0oaW50IHNyY1ske2V9XSwgb3V0IGludCBkZXN0WyR7ZX1dKSB7XG4gICAgICAgICAgJHtzfVxuICAgICAgICB9XG4gICAgICAgIGA7bltpXT1uZXcgci5HbHNsTGliUm91dGluZShhKTt9cmV0dXJuIG59Y29weVZlYygpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQuc2hhcGUubGVuZ3RoO2xldCB0PSIiO2ZvcihsZXQgbj0wO248ZTsrK24pdCs9YFxuICAgICAgICBkZXN0WyR7bn1dID0gc3JjWyR7bn1dO1xuICAgICAgICBgO2NvbnN0IG49YFxuICAgICAgdm9pZCBjb3B5VmVjKGludCBzcmNbJHtlfV0sIG91dCBpbnQgZGVzdFske2V9XSkge1xuICAgICAgICAke3R9XG4gICAgICB9XG4gICAgICBgO3JldHVybiB7Y29weVZlYzpuZXcgci5HbHNsTGliUm91dGluZShuKX19c2V0VmVjSXRlbSgpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQuc2hhcGUubGVuZ3RoO2xldCB0PWBcbiAgICAgICAgaWYoaW5kZXggPCAwKVxuICAgICAgICAgICAgaW5kZXggPSR7ZX0gKyBpbmRleDtcbiAgICAgICAgaWYgKGluZGV4ID09IDApXG4gICAgICAgICAgICBtWzBdID0gdmFsdWU7XG4gICAgICAgIGA7Zm9yKGxldCBuPTE7bjxlLTE7KytuKXQrPWBcbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPT0gJHtufSlcbiAgICAgICAgICAgIG1bJHtufV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGA7dCs9YFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBtWyR7ZS0xfV0gPSB2YWx1ZTtcbiAgICAgICAgYDtjb25zdCBuPWBcbiAgICAgIHZvaWQgc2V0VmVjSXRlbShvdXQgaW50IG1bJHtlfV0sIGludCBpbmRleCwgaW50IHZhbHVlKSB7XG4gICAgICAgICR7dH1cbiAgICAgIH1cbiAgICAgICAgYDtyZXR1cm4ge3NldFZlY0l0ZW06bmV3IHIuR2xzbExpYlJvdXRpbmUobil9fWdldFZlY0l0ZW0oKXtjb25zdCBlPXRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0LnNoYXBlLmxlbmd0aDtsZXQgdD1gXG4gICAgICAgIGlmKGluZGV4IDwgMClcbiAgICAgICAgICAgIGluZGV4ID0gJHtlfSArIGluZGV4O1xuICAgICAgICBpZiAoaW5kZXggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBtWzBdO1xuICAgICAgYDtmb3IobGV0IG49MTtuPGUtMTsrK24pdCs9YFxuICAgICAgICBlbHNlIGlmIChpbmRleCA9PSAke259KVxuICAgICAgICAgICAgcmV0dXJuIG1bJHtufV07XG4gICAgICBgO3QrPWBcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG1bJHtlLTF9XTtcbiAgICAgICAgYDtjb25zdCBuPWBcbiAgICAgIGludCBnZXRWZWNJdGVtKGludCBtWyR7ZX1dLCBpbnQgaW5kZXgpIHtcbiAgICAgICAgJHt0fVxuICAgICAgfVxuICAgIGA7cmV0dXJuIHtnZXRWZWNJdGVtOm5ldyByLkdsc2xMaWJSb3V0aW5lKG4pfX19dC5WZWNHbHNsTGliPW87fSw3ODYwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5XZWJHTEluZmVyZW5jZUhhbmRsZXI9dm9pZCAwO2NvbnN0IHI9bigxMzE1KSxvPW4oOTI0MCksaT1uKDcyNzMpLHM9big5KSxhPW4oNzM3OSksdT1uKDI0ODgpLGw9big1NDApLGM9bigzMzE0KSxwPW4oNTYzOSk7dC5XZWJHTEluZmVyZW5jZUhhbmRsZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5zZXNzaW9uPWUsdGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlPW5ldyBNYXAsdGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcDt9Y2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KGUsdCl7cmV0dXJuICgwLCBjLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodCkodGhpcy5zZXNzaW9uLmxheW91dFN0cmF0ZWd5LGUsdCl9ZXhlY3V0ZVByb2dyYW0oZSx0KXtpZih0Lmxlbmd0aDxlLmlucHV0TmFtZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgSW5wdXQgc2l6ZSBtdXN0bid0IGJlIGxlc3MgdGhhbiAke2UuaW5wdXROYW1lcy5sZW5ndGh9LmApO2lmKGUuaW5wdXROYW1lcy5sZW5ndGghPT1lLmlucHV0VHlwZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiaW5wdXQgbmFtZXMgc2l6ZSBkb2VzIG5vdCBtYXRjaCBpbnB1dCB0eXBlcyIpO2NvbnN0IG49W107Zm9yKGxldCByPTA7cjxlLmlucHV0TmFtZXMubGVuZ3RoOysrciluW3JdPXRoaXMuZ2V0T3JDcmVhdGVUZXh0dXJlRGF0YSh0W3JdLGUuaW5wdXRUeXBlc1tyXSk7Y29uc3Qgcj0oKGUsdCk9Pntjb25zdCBuPXQubWFwKChlPT5gJHtlLnVucGFja2VkU2hhcGUuam9pbigiLCIpfTske2Uud2lkdGh9eCR7ZS5oZWlnaHR9YCkpLmpvaW4oIl8iKTtsZXQgcj1lLm5hbWU7cmV0dXJuIGUuY2FjaGVIaW50JiYocis9IlsiK2UuY2FjaGVIaW50KyJdIikscis9IjoiK24scn0pKGUsbik7bGV0IG89dGhpcy5zZXNzaW9uLnByb2dyYW1NYW5hZ2VyLmdldEFydGlmYWN0KHIpO2NvbnN0IGk9bz9vLnByb2dyYW1JbmZvOiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldD9lLmdldCgpOmUscz0oMCwgYy5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVRleHR1cmVUeXBlKSh0aGlzLnNlc3Npb24ubGF5b3V0U3RyYXRlZ3ksaS5vdXRwdXQuZGltcyxpLm91dHB1dC50ZXh0dXJlVHlwZSksYT10aGlzLmNyZWF0ZVRleHR1cmVEYXRhKHMsaS5vdXRwdXQudHlwZSk7cmV0dXJuIG98fChvPXRoaXMuc2Vzc2lvbi5wcm9ncmFtTWFuYWdlci5idWlsZChpLG4sYSksdGhpcy5zZXNzaW9uLnByb2dyYW1NYW5hZ2VyLnNldEFydGlmYWN0KHIsbykpLHRoaXMucnVuUHJvZ3JhbShvLG4sYSksYX1ydW4oZSx0KXtyZXR1cm4gdGhpcy5leGVjdXRlUHJvZ3JhbShlLHQpLnRlbnNvcn1ydW5Qcm9ncmFtKGUsdCxuKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoOysrbilpZighIXRbbl0uaXNQYWNrZWQhPShlLnByb2dyYW1JbmZvLmlucHV0VHlwZXNbbl09PT1wLlRleHR1cmVUeXBlLnBhY2tlZCkpdGhyb3cgbmV3IEVycm9yKGBpbnB1dFske259XSBwcm9wZXJ0eSBwYWNrZWQgaW5jb25zaXN0ZW50YCk7aWYoISFuLmlzUGFja2VkIT0oZS5wcm9ncmFtSW5mby5vdXRwdXQudGV4dHVyZVR5cGU9PT1wLlRleHR1cmVUeXBlLnBhY2tlZCkpdGhyb3cgbmV3IEVycm9yKCJvdXRwdXQgcHJvcGVydHkgcGFja2VkIGluY29uc2lzdGVudCIpO3RoaXMuc2Vzc2lvbi5wcm9ncmFtTWFuYWdlci5ydW4oZSx0LG4pO31nZXRPckNyZWF0ZVRleHR1cmVEYXRhKGUsdCl7bGV0IG49dGhpcy5nZXRUZXh0dXJlRGF0YShlLmRhdGFJZCx0PT09cC5UZXh0dXJlVHlwZS5wYWNrZWQpO2lmKCFuJiYobj10aGlzLmdldFRleHR1cmVEYXRhKGUuZGF0YUlkLHQhPT1wLlRleHR1cmVUeXBlLnBhY2tlZCksbikpcmV0dXJuIHQ9PT1wLlRleHR1cmVUeXBlLnBhY2tlZD90aGlzLnBhY2sobik6dGhpcy51bnBhY2sobik7aWYoIW4pe2NvbnN0IHI9KDAsIGMuY3JlYXRlVGV4dHVyZUxheW91dEZyb21UZXh0dXJlVHlwZSkodGhpcy5zZXNzaW9uLmxheW91dFN0cmF0ZWd5LGUuZGltcyx0KTtpZih0PT09cC5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKXtjb25zdCBuPTEscj00LG89ZS5kaW1zO2lmKDQ9PT1vLmxlbmd0aCl7Y29uc3QgaT1bb1swXSxNYXRoLmNlaWwob1sxXSpvWzJdKm9bM10vcildLHM9KDAsIGMuY3JlYXRlVGV4dHVyZUxheW91dEZyb21UZXh0dXJlVHlwZSkodGhpcy5zZXNzaW9uLmxheW91dFN0cmF0ZWd5LGksdCk7bGV0IGE9ZS5udW1iZXJEYXRhO2lmKG9bMV0qb1syXSpvWzNdJXIhPTApe2NvbnN0IHQ9b1swXSxpPW9bMV0qb1syXSpvWzNdLHM9TWF0aC5jZWlsKGkqbi9yKSpyO2E9bmV3IEZsb2F0MzJBcnJheSh0KnMpO2ZvcihsZXQgcj0wO3I8dDsrK3Ipe2NvbnN0IHQ9cippLG89cipzK3IlbippO2Euc2V0KGUubnVtYmVyRGF0YS5zdWJhcnJheSh0LHQraSksbyk7fX1yZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlRGF0YShzLGUudHlwZSxhLGUsMSl9fWlmKHQ9PT1wLlRleHR1cmVUeXBlLnBhY2tlZCl7Y29uc3QgdD0oMCwgYy5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVNoYXBlKSh0aGlzLnNlc3Npb24ubGF5b3V0U3RyYXRlZ3ksZS5kaW1zLDEsW10se3JldmVyc2VXSDohMH0pLHI9dGhpcy5jcmVhdGVUZXh0dXJlRGF0YSh0LGUudHlwZSxlLm51bWJlckRhdGEsZSwxKTtuPXRoaXMucGFjayhyKTt9ZWxzZSBuPXRoaXMuY3JlYXRlVGV4dHVyZURhdGEocixlLnR5cGUsZS5udW1iZXJEYXRhLGUsMSk7fXJldHVybiBufWNyZWF0ZVRleHR1cmVEYXRhRnJvbUxheW91dEJpbmRUZW5zb3IoZSx0LG4scil7cmV0dXJuIHRoaXMuY3JlYXRlVGV4dHVyZURhdGEoZSx0LG4sciwxKX1jcmVhdGVUZXh0dXJlRGF0YShlLHQsbixvLGkpe3IuTG9nZ2VyLnZlcmJvc2UoIkluZmVyZW5jZUhhbmRsZXIiLGBDcmVhdGluZyBUZXh0dXJlRGF0YTogbGF5b3V0Olske0pTT04uc3RyaW5naWZ5KGUpfV1gKTtjb25zdCBzPXRoaXMuc2Vzc2lvbi50ZXh0dXJlTWFuYWdlci5jcmVhdGVUZXh0dXJlRnJvbUxheW91dCh0LGUsbixpKTtyZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlRGF0YUZyb21UZXh0dXJlKGUsdCxzLG8pfXJlc2hhcGVVbnBhY2tlZChlLHQpe2NvbnN0IG49dGhpcy5nZXRPckNyZWF0ZVRleHR1cmVEYXRhKGUscC5UZXh0dXJlVHlwZS51bnBhY2tlZCkscj17Y2hhbm5lbHM6bi5jaGFubmVscyxoZWlnaHQ6bi5oZWlnaHQsd2lkdGg6bi53aWR0aCxzaGFwZTowIT09dC5sZW5ndGg/dDpbMV0sc3RyaWRlczppLlNoYXBlVXRpbC5jb21wdXRlU3RyaWRlcyh0KSx1bnBhY2tlZFNoYXBlOnR9O3JldHVybiB0aGlzLmNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUocixlLnR5cGUsbi50ZXh0dXJlKS50ZW5zb3J9cmVzaGFwZVBhY2tlZChlLHQpe2NvbnN0IG49dGhpcy5nZXRPckNyZWF0ZVRleHR1cmVEYXRhKGUscC5UZXh0dXJlVHlwZS5wYWNrZWQpO2lmKCgwLCBhLmlzUmVzaGFwZUNoZWFwKShlLmRpbXMsdCkpe2NvbnN0IHI9e2NoYW5uZWxzOm4uY2hhbm5lbHMsaGVpZ2h0Om4uaGVpZ2h0LHdpZHRoOm4ud2lkdGgsc2hhcGU6MCE9PXQubGVuZ3RoP3Q6WzFdLHN0cmlkZXM6aS5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXModCksdW5wYWNrZWRTaGFwZTp0LGlzUGFja2VkOiEwfTtyZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlRGF0YUZyb21UZXh0dXJlKHIsZS50eXBlLG4udGV4dHVyZSkudGVuc29yfWNvbnN0IHI9KDAsIGEucHJvY2Vzc0RpbXMzRCkoZS5kaW1zKSxvPSgwLCBhLnByb2Nlc3NEaW1zM0QpKHQpLHM9dGhpcy5yZXNoYXBlUGFja2VkKGUsciksdT10aGlzLnJ1bigoMCwgYS5jcmVhdGVQYWNrZWRSZXNoYXBlM0RQcm9ncmFtSW5mb0xvYWRlcikodGhpcyxzLG8pLFtzXSk7cmV0dXJuIHRoaXMucmVzaGFwZVBhY2tlZCh1LHQpfWNhc3QoZSx0KXtjb25zdCBuPXRoaXMuZ2V0T3JDcmVhdGVUZXh0dXJlRGF0YShlLHAuVGV4dHVyZVR5cGUudW5wYWNrZWQpO3JldHVybiB0aGlzLmNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUobix0LG4udGV4dHVyZSkudGVuc29yfWNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUoZSx0LG4scixpKXtjb25zdCBzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7dGVuc29yOnJ8fG5ldyBvLlRlbnNvcihlLnVucGFja2VkU2hhcGUsdCwoZT0+dGhpcy5yZWFkVGV4dHVyZShzKSksKGFzeW5jIGU9PnRoaXMucmVhZFRleHR1cmVBc3luYyhzKSksdm9pZCAwLGkpLHRleHR1cmU6bn0pO3JldHVybiB0aGlzLnNldFRleHR1cmVEYXRhKHMudGVuc29yLmRhdGFJZCxzLGUuaXNQYWNrZWQpLHN9Z2V0VGV4dHVyZURhdGEoZSx0PSExKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIoZSk/dGhpcy5zZXNzaW9uLmdldFRleHR1cmVEYXRhKGUsdCk6dD90aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUuZ2V0KGUpOnRoaXMudW5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmdldChlKX1zZXRUZXh0dXJlRGF0YShlLHQsbj0hMSl7dGhpcy5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIoZSk/dGhpcy5zZXNzaW9uLnNldFRleHR1cmVEYXRhKGUsdCxuKToobj90aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU6dGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUpLnNldChlLHQpO31pc1RleHR1cmVMYXlvdXRDYWNoZWQoZSx0PSExKXtyZXR1cm4gISF0aGlzLmdldFRleHR1cmVEYXRhKGUuZGF0YUlkLHQpfWRpc3Bvc2UoKXt0aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIuY2xlYXJBY3RpdmVUZXh0dXJlcygpLHRoaXMucGFja2VkVGV4dHVyZURhdGFDYWNoZS5mb3JFYWNoKChlPT50aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVsZWFzZVRleHR1cmUoZSkpKSx0aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcCx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZS5mb3JFYWNoKChlPT50aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVsZWFzZVRleHR1cmUoZSkpKSx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZT1uZXcgTWFwO31yZWFkVGV4dHVyZShlKXtyZXR1cm4gZS5pc1BhY2tlZD90aGlzLnJlYWRUZXh0dXJlKHRoaXMudW5wYWNrKGUpKTp0aGlzLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQuaXNGbG9hdDMyRG93bmxvYWRTdXBwb3J0ZWQ/dGhpcy5zZXNzaW9uLnRleHR1cmVNYW5hZ2VyLnJlYWRUZXh0dXJlKGUsZS50ZW5zb3IudHlwZSxlLmNoYW5uZWxzKTp0aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVhZFVpbnQ4VGV4dHVyZUFzRmxvYXQoKDAsIHUuZW5jb2RlQXNVaW50OCkodGhpcyxlKSl9YXN5bmMgcmVhZFRleHR1cmVBc3luYyhlKXtyZXR1cm4gZS5pc1BhY2tlZD90aGlzLnJlYWRUZXh0dXJlQXN5bmModGhpcy51bnBhY2soZSkpOnRoaXMuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC5pc0Zsb2F0MzJEb3dubG9hZFN1cHBvcnRlZD90aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVhZFRleHR1cmVBc3luYyhlLGUudGVuc29yLnR5cGUsZS5jaGFubmVscyk6dGhpcy5zZXNzaW9uLnRleHR1cmVNYW5hZ2VyLnJlYWRVaW50OFRleHR1cmVBc0Zsb2F0KCgwLCB1LmVuY29kZUFzVWludDgpKHRoaXMsZSkpfXBhY2soZSl7cmV0dXJuIHRoaXMuZXhlY3V0ZVByb2dyYW0oKDAsIHMuY3JlYXRlUGFja1Byb2dyYW1JbmZvTG9hZGVyKSh0aGlzLGUudGVuc29yKSxbZS50ZW5zb3JdKX11bnBhY2soZSl7cmV0dXJuIHRoaXMuZXhlY3V0ZVByb2dyYW0oKDAsIGwuY3JlYXRlVW5wYWNrUHJvZ3JhbUluZm9Mb2FkZXIpKHRoaXMsZS50ZW5zb3IpLFtlLnRlbnNvcl0pfX07fSw0MTEwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzJiZ0aGlzLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9bik7dmFyIG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pO28mJiEoImdldCJpbiBvPyF0Ll9fZXNNb2R1bGU6by53cml0YWJsZXx8by5jb25maWd1cmFibGUpfHwobz17ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtuXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLG8pO306ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9biksZVtyXT10W25dO30pLG89dGhpcyYmdGhpcy5fX3NldE1vZHVsZURlZmF1bHR8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KTt9OmZ1bmN0aW9uKGUsdCl7ZS5kZWZhdWx0PXQ7fSksaT10aGlzJiZ0aGlzLl9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24oZSl7aWYoZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciB0PXt9O2lmKG51bGwhPWUpZm9yKHZhciBuIGluIGUpImRlZmF1bHQiIT09biYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJnIodCxlLG4pO3JldHVybiBvKHQsZSksdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuV0VCR0xfT1BfUkVTT0xWRV9SVUxFUz12b2lkIDA7Y29uc3Qgcz1uKDg4MTcpLGE9aShuKDUxOTQpKSx1PW4oNDc1MiksbD1uKDY2NjgpLGM9big5NzU0KSxwPW4oNTA0MiksZD1uKDY3NDIpLGY9big0MTI1KSxoPW4oNjE0OSksZz1uKDUzNzgpLGI9big2OTgxKSxtPW4oNzQxMykseT1uKDcwMDYpLHY9big4Mjc2KSxfPW4oNTU2NSksdz1uKDI4MzQpLFQ9bigxMDEwKSx4PW4oODEyNiksTz1uKDI4MDEpLFM9big1NjUpLEE9bigyNDQ0KSxQPW4oODE1KSxJPW4oNTY0KSxFPW4oNTQxNiksRD1uKDEyNDApLCQ9big1OTQ0KSxrPW4oNTcwNyksRj1pKG4oOTA4NykpLE49big3ODYyKSxqPW4oMzk4MCk7dC5XRUJHTF9PUF9SRVNPTFZFX1JVTEVTPVtbIkFicyIsIiIsIjYrIixGLmFic10sWyJBY29zIiwiIiwiNysiLEYuYWNvc10sWyJBZGQiLCIiLCI3KyIsYS5hZGRdLFsiQW5kIiwiIiwiNysiLGEuYW5kXSxbIkFzaW4iLCIiLCI3KyIsRi5hc2luXSxbIkF0YW4iLCIiLCI3KyIsRi5hdGFuXSxbIkF2ZXJhZ2VQb29sIiwiIiwiNysiLHcuYXZlcmFnZVBvb2wsdy5wYXJzZUF2ZXJhZ2VQb29sQXR0cmlidXRlc10sWyJCYXRjaE5vcm1hbGl6YXRpb24iLCIiLCI3KyIscy5iYXRjaE5vcm1hbGl6YXRpb24scy5wYXJzZUJhdGNoTm9ybWFsaXphdGlvbkF0dHJpYnV0ZXNdLFsiQ2FzdCIsIiIsIjYrIix1LmNhc3QsdS5wYXJzZUNhc3RBdHRyaWJ1dGVzXSxbIkNlaWwiLCIiLCI2KyIsRi5jZWlsXSxbIkNsaXAiLCIiLCI2LTEwIixGLmNsaXAsRi5wYXJzZUNsaXBBdHRyaWJ1dGVzXSxbIkNsaXAiLCIiLCIxMSsiLEYuY2xpcFYxMV0sWyJDb25jYXQiLCIiLCI0KyIsbC5jb25jYXQsbC5wYXJzZUNvbmNhdEF0dHJpYnV0ZXNdLFsiQ29udiIsIiIsIjErIixjLmNvbnYsYy5wYXJzZUNvbnZBdHRyaWJ1dGVzXSxbIkNvbnZUcmFuc3Bvc2UiLCIiLCIxKyIscC5jb252VHJhbnNwb3NlLHAucGFyc2VDb252VHJhbnNwb3NlQXR0cmlidXRlc10sWyJDb3MiLCIiLCI3KyIsRi5jb3NdLFsiRGl2IiwiIiwiNysiLGEuZGl2XSxbIkRyb3BvdXQiLCIiLCI3KyIsRi5pZGVudGl0eV0sWyJEZXB0aFRvU3BhY2UiLCIiLCIxKyIsZC5kZXB0aFRvU3BhY2UsZC5wYXJzZURlcHRoVG9TcGFjZUF0dHJpYnV0ZXNdLFsiRXF1YWwiLCIiLCI3KyIsYS5lcXVhbF0sWyJFbHUiLCIiLCI2KyIsRi5lbHUsRi5wYXJzZUVsdUF0dHJpYnV0ZXNdLFsiRXhwIiwiIiwiNisiLEYuZXhwXSxbIkZsYXR0ZW4iLCIiLCIxKyIsZi5mbGF0dGVuLGYucGFyc2VGbGF0dGVuQXR0cmlidXRlc10sWyJGbG9vciIsIiIsIjYrIixGLmZsb29yXSxbIkZ1c2VkQ29udiIsImNvbS5taWNyb3NvZnQiLCIxKyIsYy5jb252LGMucGFyc2VDb252QXR0cmlidXRlc10sWyJHYXRoZXIiLCIiLCIxKyIsaC5nYXRoZXIsaC5wYXJzZUdhdGhlckF0dHJpYnV0ZXNdLFsiR2VtbSIsIiIsIjctMTAiLGcuZ2VtbSxnLnBhcnNlR2VtbUF0dHJpYnV0ZXNWN10sWyJHZW1tIiwiIiwiMTErIixnLmdlbW0sZy5wYXJzZUdlbW1BdHRyaWJ1dGVzVjExXSxbIkdsb2JhbEF2ZXJhZ2VQb29sIiwiIiwiMSsiLHcuZ2xvYmFsQXZlcmFnZVBvb2wsdy5wYXJzZUdsb2JhbEF2ZXJhZ2VQb29sQXR0cmlidXRlc10sWyJHbG9iYWxNYXhQb29sIiwiIiwiMSsiLHcuZ2xvYmFsTWF4UG9vbF0sWyJHcmVhdGVyIiwiIiwiNysiLGEuZ3JlYXRlcl0sWyJJZGVudGl0eSIsIiIsIjErIixGLmlkZW50aXR5XSxbIkltYWdlU2NhbGVyIiwiIiwiMSsiLGIuaW1hZ2VTY2FsZXIsYi5wYXJzZUltYWdlU2NhbGVyQXR0cmlidXRlc10sWyJJbnN0YW5jZU5vcm1hbGl6YXRpb24iLCIiLCI2KyIsbS5pbnN0YW5jZU5vcm1hbGl6YXRpb24sbS5wYXJzZUluc3RhbmNlTm9ybWFsaXphdGlvbkF0dHJpYnV0ZXNdLFsiTGVha3lSZWx1IiwiIiwiNisiLEYubGVha3lSZWx1LEYucGFyc2VMZWFreVJlbHVBdHRyaWJ1dGVzXSxbIkxlc3MiLCIiLCI3KyIsYS5sZXNzXSxbIkxSTiIsIiIsIjErIix5Lmxybix5LnBhcnNlTHJuQXR0cmlidXRlc10sWyJMb2ciLCIiLCI2KyIsRi5sb2ddLFsiTWF0TXVsIiwiIiwiMSsiLHYubWF0TXVsLHYucGFyc2VNYXRNdWxBdHRyaWJ1dGVzXSxbIk1heFBvb2wiLCIiLCIxKyIsdy5tYXhQb29sLHcucGFyc2VNYXhQb29sQXR0cmlidXRlc10sWyJNdWwiLCIiLCI3KyIsYS5tdWxdLFsiTmVnIiwiIiwiNisiLEYubmVnXSxbIk5vdCIsIiIsIjErIixGLm5vdF0sWyJPciIsIiIsIjcrIixhLm9yXSxbIlBhZCIsIiIsIjItMTAiLF8ucGFkVjIsXy5wYXJzZVBhZEF0dHJpYnV0ZXNWMl0sWyJQYWQiLCIiLCIxMSsiLF8ucGFkVjExLF8ucGFyc2VQYWRBdHRyaWJ1dGVzVjExXSxbIlBvdyIsIiIsIjcrIixhLnBvd10sWyJQUmVsdSIsIiIsIjcrIixhLnBSZWx1XSxbIlJlZHVjZUxvZ1N1bSIsIiIsIjErIixULnJlZHVjZUxvZ1N1bSxULnBhcnNlUmVkdWNlQXR0cmlidXRlc10sWyJSZWR1Y2VNYXgiLCIiLCIxKyIsVC5yZWR1Y2VNYXgsVC5wYXJzZVJlZHVjZUF0dHJpYnV0ZXNdLFsiUmVkdWNlTWVhbiIsIiIsIjErIixULnJlZHVjZU1lYW4sVC5wYXJzZVJlZHVjZUF0dHJpYnV0ZXNdLFsiUmVkdWNlTWluIiwiIiwiMSsiLFQucmVkdWNlTWluLFQucGFyc2VSZWR1Y2VBdHRyaWJ1dGVzXSxbIlJlZHVjZVByb2QiLCIiLCIxKyIsVC5yZWR1Y2VQcm9kLFQucGFyc2VSZWR1Y2VBdHRyaWJ1dGVzXSxbIlJlZHVjZVN1bSIsIiIsIjEtMTIiLFQucmVkdWNlU3VtLFQucGFyc2VSZWR1Y2VBdHRyaWJ1dGVzXSxbIlJlZHVjZVN1bVNxdWFyZSIsIiIsIjErIixULnJlZHVjZUxvZ1N1bVNxdWFyZSxULnBhcnNlUmVkdWNlQXR0cmlidXRlc10sWyJSZWx1IiwiIiwiNisiLEYucmVsdV0sWyJSZXNoYXBlIiwiIiwiNSsiLHgucmVzaGFwZV0sWyJSZXNpemUiLCIiLCIxMCIsTy5yZXNpemUsTy5wYXJzZVJlc2l6ZUF0dHJpYnV0ZXNWMTBdLFsiUmVzaXplIiwiIiwiMTErIixPLnJlc2l6ZSxPLnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMV0sWyJTaGFwZSIsIiIsIjErIixTLnNoYXBlXSxbIlNpZ21vaWQiLCIiLCI2KyIsRi5zaWdtb2lkXSxbIlNpbiIsIiIsIjcrIixGLnNpbl0sWyJTbGljZSIsIiIsIjEwKyIsQS5zbGljZVYxMF0sWyJTbGljZSIsIiIsIjEtOSIsQS5zbGljZSxBLnBhcnNlU2xpY2VBdHRyaWJ1dGVzXSxbIlNvZnRtYXgiLCIiLCIxLTEyIixQLnNvZnRtYXgsUC5wYXJzZVNvZnRtYXhBdHRyaWJ1dGVzXSxbIlNvZnRtYXgiLCIiLCIxMysiLFAuc29mdG1heFYxMyxQLnBhcnNlU29mdG1heEF0dHJpYnV0ZXNWMTNdLFsiU3BsaXQiLCIiLCIyLTEyIixJLnNwbGl0LEkucGFyc2VTcGxpdEF0dHJpYnV0ZXNdLFsiU3FydCIsIiIsIjYrIixGLnNxcnRdLFsiU3F1ZWV6ZSIsIiIsIjEtMTIiLEUuc3F1ZWV6ZSxFLnBhcnNlU3F1ZWV6ZUF0dHJpYnV0ZXNdLFsiU3F1ZWV6ZSIsIiIsIjEzKyIsRS5zcXVlZXplVjEzXSxbIlN1YiIsIiIsIjcrIixhLnN1Yl0sWyJTdW0iLCIiLCI2KyIsRC5zdW1dLFsiVGFuIiwiIiwiNysiLEYudGFuXSxbIlRhbmgiLCIiLCI2KyIsRi50YW5oXSxbIlRpbGUiLCIiLCI2KyIsJC50aWxlXSxbIlRyYW5zcG9zZSIsIiIsIjErIixrLnRyYW5zcG9zZSxrLnBhcnNlVHJhbnNwb3NlQXR0cmlidXRlc10sWyJVcHNhbXBsZSIsIiIsIjctOCIsai51cHNhbXBsZSxqLnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzVjddLFsiVXBzYW1wbGUiLCIiLCI5IixqLnVwc2FtcGxlLGoucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXNWOV0sWyJVbnNxdWVlemUiLCIiLCIxLTEyIixOLnVuc3F1ZWV6ZSxOLnBhcnNlVW5zcXVlZXplQXR0cmlidXRlc10sWyJVbnNxdWVlemUiLCIiLCIxMysiLE4udW5zcXVlZXplVjEzXSxbIlhvciIsIiIsIjcrIixhLnhvcl1dO30sODgxNzooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VCYXRjaE5vcm1hbGl6YXRpb25BdHRyaWJ1dGVzPXQuYmF0Y2hOb3JtYWxpemF0aW9uPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDY3NTcpLGk9big1NjM5KSxzPXtuYW1lOiJCYXRjaE5vcm1hbGl6YXRpb24iLGlucHV0TmFtZXM6WyJBIiwiU2NhbGUiLCJCIiwiTWVhbiIsIlZhcmlhbmNlIl0saW5wdXRUeXBlczpbaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkLGkuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXX07dC5iYXRjaE5vcm1hbGl6YXRpb249KGUsdCxuKT0+KHUodCksW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXksZ2V0OigpPT5hKGUsdCxuKX0pLHQpXSksdC5wYXJzZUJhdGNoTm9ybWFsaXphdGlvbkF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJlcHNpbG9uIiwxZS01KSxuPWUuYXR0cmlidXRlcy5nZXRGbG9hdCgibW9tZW50dW0iLC45KSxvPWUuYXR0cmlidXRlcy5nZXRJbnQoInNwYXRpYWwiLDEpO3JldHVybiAoMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtlcHNpbG9uOnQsbW9tZW50dW06bixzcGF0aWFsOm99KX07Y29uc3QgYT0oZSx0LG4pPT57Y29uc3Qgcj0oMCwgby5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksYT10WzBdLmRpbXMubGVuZ3RoLFt1LGxdPWUuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KHRbMV0uZGltcyxpLlRleHR1cmVUeXBlLnVucGFja2VkKSxjPWBcbiAgZmxvYXQgcHJvY2VzcyhpbnRbJHthfV0gaW5kaWNlcykge1xuICAgIHZlYzIgcG9zaXRpb24gPSBvZmZzZXRUb0Nvb3JkcyhpbmRpY2VzWzFdLCAke3V9LCAke2x9KTtcbiAgICBmbG9hdCBzY2FsZSA9IGdldENvbG9yQXNGbG9hdCgke3IudGV4dHVyZTJEfShTY2FsZSwgcG9zaXRpb24pKTtcbiAgICBmbG9hdCBtZWFuID0gZ2V0Q29sb3JBc0Zsb2F0KCR7ci50ZXh0dXJlMkR9KE1lYW4sIHBvc2l0aW9uKSk7XG4gICAgZmxvYXQgdmFyaWFuY2UgPSBnZXRDb2xvckFzRmxvYXQoJHtyLnRleHR1cmUyRH0oVmFyaWFuY2UsIHBvc2l0aW9uKSk7XG4gICAgZmxvYXQgYiA9IGdldENvbG9yQXNGbG9hdCgke3IudGV4dHVyZTJEfShCLCBwb3NpdGlvbikpO1xuXG4gICAgcmV0dXJuIHNjYWxlICogKCAoX0EoaW5kaWNlcykgLSBtZWFuKSAvIHNxcnQodmFyaWFuY2UgKyBmbG9hdCgke24uZXBzaWxvbn0pKSApICsgYjtcbiAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7b3V0cHV0OntkaW1zOnRbMF0uZGltcyx0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6Y30pfSx1PWU9PntpZighZXx8NSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQmF0Y2hOb3JtYWxpemF0aW9uIHJlcXVpcmVzIDUgaW5wdXRzLiIpO2NvbnN0IHQ9ZVswXSxuPWVbMV0scj1lWzJdLG89ZVszXSxpPWVbNF07aWYodC5kaW1zLmxlbmd0aDwzfHwxIT09bi5kaW1zLmxlbmd0aHx8MSE9PXIuZGltcy5sZW5ndGh8fDEhPT1vLmRpbXMubGVuZ3RofHwxIT09aS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgaW5wdXQgc2hhcGUuIik7aWYobi5kaW1zWzBdIT09dC5kaW1zWzFdfHxyLmRpbXNbMF0hPT10LmRpbXNbMV18fG8uZGltc1swXSE9PXQuZGltc1sxXXx8aS5kaW1zWzBdIT09dC5kaW1zWzFdKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZigiZmxvYXQzMiIhPT10LnR5cGUmJiJmbG9hdDY0IiE9PXQudHlwZXx8ImZsb2F0MzIiIT09bi50eXBlJiYiZmxvYXQ2NCIhPT1uLnR5cGV8fCJmbG9hdDMyIiE9PXIudHlwZSYmImZsb2F0NjQiIT09ci50eXBlfHwiZmxvYXQzMiIhPT1vLnR5cGUmJiJmbG9hdDY0IiE9PW8udHlwZXx8ImZsb2F0MzIiIT09aS50eXBlJiYiZmxvYXQ2NCIhPT1pLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGlucHV0IHRlbnNvciB0eXBlcy4iKX07fSw1MTk0OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC54b3I9dC5zdWI9dC5wUmVsdT10LnBvdz10Lm9yPXQubXVsPXQubGVzcz10LmdyZWF0ZXI9dC5lcXVhbD10LmRpdj10LmFuZD10LmFkZD10Lmdsc2xQUmVsdT10Lmdsc2xQb3c9dC5nbHNsWG9yPXQuZ2xzbE9yPXQuZ2xzbEFuZD10Lmdsc2xMZXNzPXQuZ2xzbEdyZWF0ZXI9dC5nbHNsRXF1YWw9dC5nbHNsU3ViPXQuZ2xzbE11bD10Lmdsc2xEaXY9dC5nbHNsQWRkPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDE5OTcpLGk9big2NzU3KSxzPW4oNTYzOSk7ZnVuY3Rpb24gYSgpe2NvbnN0IGU9ImFkZF8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBhICsgYjtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2MSArIHYyO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gdSgpe2NvbnN0IGU9ImRpdl8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBhIC8gYjtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2MSAvIHYyO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gbCgpe2NvbnN0IGU9Im11bF8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBhICogYjtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2MSAqIHYyO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gYygpe2NvbnN0IGU9InN1Yl8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBhIC0gYjtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2MSAtIHYyO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gcCgpe2NvbnN0IGU9ImVxdWFsXyI7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfShmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgcmV0dXJuIGZsb2F0KGEgPT0gYik7XG4gIH1cbiAgdmVjNCAke2V9KHZlYzQgdjEsIHZlYzQgdjIpIHtcbiAgICByZXR1cm4gdmVjNChlcXVhbCh2MSwgdjIpKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOm8uRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGQoKXtjb25zdCBlPSJncmVhdGVyXyI7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfShmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgcmV0dXJuIGZsb2F0KGEgPiBiKTtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2ZWM0KCB2MS5yID4gdjIuciAsXG4gICAgICB2MS5nID4gdjIuZyxcbiAgICAgIHYxLmIgPiB2Mi5iLFxuICAgICAgdjEuYSA+IHYyLmEgKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOm8uRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGYoKXtjb25zdCBlPSJsZXNzXyI7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfShmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgcmV0dXJuIGZsb2F0KGEgPCBiKTtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2ZWM0KCB2MS5yIDwgdjIuciAsXG4gICAgICAgICAgICAgICAgdjEuZyA8IHYyLmcsXG4gICAgICAgICAgICAgICAgdjEuYiA8IHYyLmIsXG4gICAgICAgICAgICAgICAgdjEuYSA8IHYyLmEgKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOm8uRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGgoKXtjb25zdCBlPSJhbmRfIjtyZXR1cm4ge2JvZHk6YFxuICBmbG9hdCAke2V9KGZsb2F0IGEsIGZsb2F0IGIpIHtcbiAgICByZXR1cm4gZmxvYXQoIGJvb2woYSkgJiYgYm9vbChiKSApO1xuICB9XG4gIHZlYzQgJHtlfSh2ZWM0IHYxLCB2ZWM0IHYyKSB7XG4gICAgYnZlYzQgYjEgPSBidmVjNCh2MSk7XG4gICAgYnZlYzQgYjIgPSBidmVjNCh2Mik7XG4gICAgcmV0dXJuIHZlYzQoIGIxLnIgJiYgYjIuciAsXG4gICAgICAgICAgICAgICAgYjEuZyAmJiBiMi5nLFxuICAgICAgICAgICAgICAgIGIxLmIgJiYgYjIuYixcbiAgICAgICAgICAgICAgICBiMS5hICYmIGIyLmEgKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOm8uRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGcoKXtjb25zdCBlPSJvcl8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBmbG9hdCggYm9vbChhKSB8fCBib29sKGIpICk7XG4gIH1cbiAgdmVjNCAke2V9KHZlYzQgdjEsIHZlYzQgdjIpIHtcbiAgICBidmVjNCBiMSA9IGJ2ZWM0KHYxKTtcbiAgICBidmVjNCBiMiA9IGJ2ZWM0KHYyKTtcbiAgICByZXR1cm4gdmVjNCggYjEuciB8fCBiMi5yICxcbiAgICAgICAgICAgICAgICBiMS5nIHx8IGIyLmcsXG4gICAgICAgICAgICAgICAgYjEuYiB8fCBiMi5iLFxuICAgICAgICAgICAgICAgIGIxLmEgfHwgYjIuYSApO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gYigpe2NvbnN0IGU9Inhvcl8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBmbG9hdCggYm9vbChhKSBeXiBib29sKGIpICk7XG4gIH1cbiAgdmVjNCAke2V9KHZlYzQgdjEsIHZlYzQgdjIpIHtcbiAgICBidmVjNCBiMSA9IGJ2ZWM0KHYxKTtcbiAgICBidmVjNCBiMiA9IGJ2ZWM0KHYyKTtcbiAgICByZXR1cm4gdmVjNCggYjEuciBeXiBiMi5yICxcbiAgICAgICAgICAgICAgICBiMS5nIF5eIGIyLmcsXG4gICAgICAgICAgICAgICAgYjEuYiBeXiBiMi5iLFxuICAgICAgICAgICAgICAgIGIxLmEgXl4gYjIuYSApO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gbSgpe3JldHVybiBmdW5jdGlvbihlKXtjb25zdCB0PWAke2V9X2A7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHt0fShmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgcmV0dXJuICR7ZX0oYSwgYik7XG4gIH1cbiAgdmVjNCAke3R9KHZlYzQgdjEsIHZlYzQgdjIpIHtcbiAgICByZXR1cm4gJHtlfSh2MSwgdjIpO1xuICB9XG4gIGAsbmFtZTp0LHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19KCJwb3ciKX1mdW5jdGlvbiB5KCl7Y29uc3QgZT0icHJlbHVfIjtyZXR1cm4ge2JvZHk6YFxuICBmbG9hdCAke2V9KGZsb2F0IGEsIGZsb2F0IGIpIHtcbiAgICByZXR1cm4gYSA8IDAuMCA/IGEgKiBiOiBhO1xuICB9XG4gIHZlYzQgJHtlfSh2ZWM0IHYxLCB2ZWM0IHYyKSB7XG4gICAgcmV0dXJuIHZlYzQoXG4gICAgICB2MS5yIDwgMC4wID8gdjEuciAqIHYyLnI6IHYxLnIsXG4gICAgICB2MS5nIDwgMC4wID8gdjEuZyAqIHYyLmc6IHYxLmcsXG4gICAgICB2MS5iIDwgMC4wID8gdjEuYiAqIHYyLmI6IHYxLmIsXG4gICAgICB2MS5hIDwgMC4wID8gdjEuYSAqIHYyLmE6IHYxLmFcbiAgICAgICk7XG4gIH1cbiAgYCxuYW1lOmUsdHlwZTpvLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX10Lmdsc2xBZGQ9YSx0Lmdsc2xEaXY9dSx0Lmdsc2xNdWw9bCx0Lmdsc2xTdWI9Yyx0Lmdsc2xFcXVhbD1wLHQuZ2xzbEdyZWF0ZXI9ZCx0Lmdsc2xMZXNzPWYsdC5nbHNsQW5kPWgsdC5nbHNsT3I9Zyx0Lmdsc2xYb3I9Yix0Lmdsc2xQb3c9bSx0Lmdsc2xQUmVsdT15O2NvbnN0IHY9KGUsdCxuLHI9dFswXS50eXBlLG8pPT57Y29uc3QgaT1lLnNlc3Npb24ucGFjaz9zLlRleHR1cmVUeXBlLnBhY2tlZDpzLlRleHR1cmVUeXBlLnVucGFja2VkO3JldHVybiB7bmFtZTpuLm5hbWUsaW5wdXROYW1lczpbIkEiLCJCIl0saW5wdXRUeXBlczpbaSxpXSxjYWNoZUhpbnQ6byxnZXQ6KCk9Pl8oZSx0LG4scil9fSxfPShlLHQsbixvPXRbMF0udHlwZSk9Pntjb25zdCBhPWUuc2Vzc2lvbi5wYWNrP3MuVGV4dHVyZVR5cGUucGFja2VkOnMuVGV4dHVyZVR5cGUudW5wYWNrZWQsdT0hci5TaGFwZVV0aWwuYXJlRXF1YWwodFswXS5kaW1zLHRbMV0uZGltcyk7bGV0IGw9dFswXS5kaW1zO2NvbnN0IGM9ZS5zZXNzaW9uLnBhY2s7aWYodSl7Y29uc3Qgcz1yLkJyb2FkY2FzdFV0aWwuY2FsY1NoYXBlKHRbMF0uZGltcyx0WzFdLmRpbXMsITEpO2lmKCFzKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgcGVyZm9ybSBiaW5hcnkgb3Agb24gdGhlIGdpdmVuIHRlbnNvcnMiKTtsPXM7Y29uc3QgdT1sLmxlbmd0aCxwPTAhPT10WzBdLmRpbXMubGVuZ3RoP3RbMF0uZGltcy5sZW5ndGg6MSxkPTAhPT10WzFdLmRpbXMubGVuZ3RoP3RbMV0uZGltcy5sZW5ndGg6MSxmPTAhPT10WzBdLmRpbXMubGVuZ3RoPyJiY2FzdEluZGljZXNfQShpbmRpY2VzLCBhaW5kaWNlcyk7IjoiYWluZGljZXNbMF0gPSAwOyIsaD0wIT09dFsxXS5kaW1zLmxlbmd0aD8iYmNhc3RJbmRpY2VzX0IoaW5kaWNlcywgYmluZGljZXMpOyI6ImJpbmRpY2VzWzBdID0gMDsiLGc9KDAsIGkuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLGI9Yz9gXG4gICAgICAke24uYm9keX1cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgdmVjNCBhID0gZ2V0QUF0T3V0Q29vcmRzKCk7XG4gICAgICAgIHZlYzQgYiA9IGdldEJBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHJlc3VsdCA9ICR7bi5uYW1lfShhLCBiKTtcbiAgICAgICAgJHtnLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9YDpgXG4gICAgICAke24uYm9keX1cbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHt1fV0pIHtcbiAgICAgICAgaW50IGFpbmRpY2VzWyR7cH1dO1xuICAgICAgICBpbnQgYmluZGljZXNbJHtkfV07XG4gICAgICAgICR7Zn1cbiAgICAgICAgJHtofVxuICAgICAgICByZXR1cm4gJHtuLm5hbWV9KF9BKGFpbmRpY2VzKSwgX0IoYmluZGljZXMpKTtcbiAgICAgIH1gO3JldHVybiB7bmFtZTpuLm5hbWUsaW5wdXROYW1lczpbIkEiLCJCIl0saW5wdXRUeXBlczpbYSxhXSxvdXRwdXQ6e2RpbXM6bCx0eXBlOm8sdGV4dHVyZVR5cGU6YX0sc2hhZGVyU291cmNlOmIsaGFzTWFpbjpjfX1jb25zdCBwPSgwLCBpLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSxkPWBcbiAgICAke24uYm9keX1cbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICB2ZWM0IHYxID0gJHtwLnRleHR1cmUyRH0oQSwgVGV4Q29vcmRzKTtcbiAgICAgIHZlYzQgdjIgPSAke3AudGV4dHVyZTJEfShCLCBUZXhDb29yZHMpO1xuICAgICAgdmVjNCByZXN1bHQgPSAke24ubmFtZX0odjEsIHYyKTtcbiAgICAgICR7cC5vdXRwdXR9ID0gcmVzdWx0O1xuICAgIH1cbiAgICBgO3JldHVybiB7bmFtZTpuLm5hbWUsaW5wdXROYW1lczpbIkEiLCJCIl0saW5wdXRUeXBlczpbYSxhXSxvdXRwdXQ6e2RpbXM6dFswXS5kaW1zLHR5cGU6byx0ZXh0dXJlVHlwZTphfSxzaGFkZXJTb3VyY2U6ZCxoYXNNYWluOiEwfX07dC5hZGQ9KGUsdCk9PltlLnJ1bih2KGUsdCxhKCkpLHQpXSx0LmFuZD0oZSx0KT0+W2UucnVuKHYoZSx0LGgoKSwiYm9vbCIpLHQpXSx0LmRpdj0oZSx0KT0+W2UucnVuKHYoZSx0LHUoKSksdCldLHQuZXF1YWw9KGUsdCk9PltlLnJ1bih2KGUsdCxwKCksImJvb2wiKSx0KV0sdC5ncmVhdGVyPShlLHQpPT5bZS5ydW4odihlLHQsZCgpLCJib29sIiksdCldLHQubGVzcz0oZSx0KT0+W2UucnVuKHYoZSx0LGYoKSwiYm9vbCIpLHQpXSx0Lm11bD0oZSx0KT0+W2UucnVuKHYoZSx0LGwoKSksdCldLHQub3I9KGUsdCk9PltlLnJ1bih2KGUsdCxnKCksImJvb2wiKSx0KV0sdC5wb3c9KGUsdCk9PltlLnJ1bih2KGUsdCxtKCkpLHQpXSx0LnBSZWx1PShlLHQpPT5bZS5ydW4odihlLHQseSgpKSx0KV0sdC5zdWI9KGUsdCk9PltlLnJ1bih2KGUsdCxjKCkpLHQpXSx0Lnhvcj0oZSx0KT0+W2UucnVuKHYoZSx0LGIoKSwiYm9vbCIpLHQpXTt9LDQ3NTI6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlQ2FzdEF0dHJpYnV0ZXM9dC5jYXN0PXZvaWQgMDtjb25zdCByPW4oNzI3Myk7dC5jYXN0PShlLHQsbik9PihvKHQpLFtlLmNhc3QodFswXSxuKV0pLHQucGFyc2VDYXN0QXR0cmlidXRlcz1lPT5yLlByb3RvVXRpbC50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byhlLmF0dHJpYnV0ZXMuZ2V0SW50KCJ0byIpKTtjb25zdCBvPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ2FzdCByZXF1aXJlcyAxIGlucHV0LiIpO2lmKCJzdHJpbmciPT09ZVswXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDQ1OTU6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZVBhY2tlZENvbmNhdFByb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCByPW4oNjc1Nyksbz1uKDU2MzkpLGk9big0MzIpLHM9big1NjE0KTt0LmNyZWF0ZVBhY2tlZENvbmNhdFByb2dyYW1JbmZvTG9hZGVyPShlLHQsbik9Pntjb25zdCB1PShsPXQubGVuZ3RoLGM9bi5jYWNoZUtleSx7bmFtZToiQ29uY2F0IChwYWNrZWQpIixpbnB1dE5hbWVzOkFycmF5LmZyb20oe2xlbmd0aDpsfSwoKGUsdCk9PmBYJHt0fWApKSxpbnB1dFR5cGVzOkFycmF5KGwpLmZpbGwoby5UZXh0dXJlVHlwZS5wYWNrZWQpLGNhY2hlSGludDpjfSk7dmFyIGwsYztyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHUpLHtnZXQ6KCk9PigoZSx0LG4sdSk9Pntjb25zdCBsPW5bMF0uZGltcy5zbGljZSgpO2lmKHU+PWwubGVuZ3RofHx1PC0xKmwubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiYXhpcyBzcGVjaWZpZWQgZm9yIGNvbmNhdCBkb2Vzbid0IG1hdGNoIGlucHV0IGRpbWVuc2lvbmFsaXR5Iik7dTwwJiYodT1sLmxlbmd0aCt1KTtjb25zdCBjPWwuc2xpY2UoMCk7Zm9yKGxldCBlPTE7ZTxuLmxlbmd0aDtlKyspe2NvbnN0IHQ9bltlXS5kaW1zLnNsaWNlKCk7Zm9yKGxldCBlPTA7ZTxsLmxlbmd0aDtlKyspaWYoZT09PXUpY1t1XSs9dFtlXTtlbHNlIGlmKGxbZV0hPT10W2VdKXRocm93IG5ldyBFcnJvcigibm9uIGNvbmNhdCBkaW1lbnNpb25zIG11c3QgbWF0Y2giKX1jb25zdCBwPWMubGVuZ3RoLGQ9KDAsIHMuZ2V0Q2hhbm5lbHMpKCJjb29yZHMiLHApLGY9KDAsIGkuZ2V0Q29vcmRzRGF0YVR5cGUpKHApLGg9KDAsIHMudW5wYWNrRnJvbUNoYW5uZWwpKCksZz1uLm1hcCgoZT0+ZS5kaW1zKSksYj0oMCwgaS5nZXRHbENoYW5uZWxzKShwKSxtPW5ldyBBcnJheShnLmxlbmd0aC0xKTttWzBdPWdbMF1bdV07Zm9yKGxldCBlPTE7ZTxtLmxlbmd0aDtlKyspbVtlXT1tW2UtMV0rZ1tlXVt1XTtjb25zdCB5PWJbdV0sdj1iLnNsaWNlKC0yKSxfPWIuam9pbigpO2xldCB3PWBpZiAoJHt5fSA8ICR7bVswXX0pIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoXG4gICAgICAgICAgICBnZXRYMCgke199KSwgdmVjMigke3Yuam9pbigpfSkpO1xuICAgICAgICB9YDtmb3IobGV0IGU9MTtlPG0ubGVuZ3RoO2UrKyl7Y29uc3QgdD1tW2UtMV07dys9YFxuICAgICAgICAgICAgaWYgKCR7eX0gPCAke21bZV19ICAmJiAke3l9ID49ICR7bVtlLTFdfSkge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChcbiAgICAgICAgICAgICAgICBnZXRYJHtlfSgke2EoYix5LHQpfSksXG4gICAgICAgICAgICAgICAgdmVjMigke2Eodix5LHQpfSkpO1xuICAgICAgICAgICAgfWA7fWNvbnN0IFQ9bS5sZW5ndGgseD1tW20ubGVuZ3RoLTFdO3crPWBcbiAgICAgICAgICAgIHJldHVybiBnZXRDaGFubmVsKFxuICAgICAgICAgICAgICBnZXRYJHtUfSgke2EoYix5LHgpfSksXG4gICAgICAgICAgICAgIHZlYzIoJHthKHYseSx4KX0pKTtgO2NvbnN0IE89KDAsIHIuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFM9YFxuICAgICAgICAgICR7aH1cbiAgICAgICAgICBmbG9hdCBnZXRWYWx1ZSgke2IubWFwKChlPT4iaW50ICIrZSkpfSkge1xuICAgICAgICAgICAgJHt3fVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAgICR7Zn0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgICBpbnQgbGFzdERpbSA9IGNvb3Jkcy4ke2JbcC0xXX07XG4gICAgICAgICAgICBjb29yZHMuJHtiW3AtMV19ID0gY29vcmRzLiR7YltwLTJdfTtcbiAgICAgICAgICAgIGNvb3Jkcy4ke2JbcC0yXX0gPSBsYXN0RGltO1xuXG4gICAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoZ2V0VmFsdWUoJHtkfSksIDAuLCAwLiwgMC4pO1xuXG4gICAgICAgICAgICAke2RbcC0xXX0gPSAke2RbcC0xXX0gKyAxO1xuICAgICAgICAgICAgaWYgKCR7ZFtwLTFdfSA8ICR7Y1twLTFdfSkge1xuICAgICAgICAgICAgICByZXN1bHQuZyA9IGdldFZhbHVlKCR7ZH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAke2RbcC0yXX0gPSAke2RbcC0yXX0gKyAxO1xuICAgICAgICAgICAgaWYgKCR7ZFtwLTJdfSA8ICR7Y1twLTJdfSkge1xuICAgICAgICAgICAgICByZXN1bHQuYSA9IGdldFZhbHVlKCR7ZH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAke2RbcC0xXX0gPSAke2RbcC0xXX0gLSAxO1xuICAgICAgICAgICAgaWYgKCR7ZFtwLTJdfSA8ICR7Y1twLTJdfSAmJlxuICAgICAgICAgICAgICAgICR7ZFtwLTFdfSA8ICR7Y1twLTFdfSkge1xuICAgICAgICAgICAgICByZXN1bHQuYiA9IGdldFZhbHVlKCR7ZH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJHtPLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse291dHB1dDp7ZGltczpjLHR5cGU6blswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUucGFja2VkfSxzaGFkZXJTb3VyY2U6UyxoYXNNYWluOiEwfSl9KShlLHUsdCxuLmF4aXMpfSl9O2NvbnN0IGE9KGUsdCxuKT0+e2NvbnN0IHI9ZS5pbmRleE9mKHQpO3JldHVybiBlLm1hcCgoKGUsdCk9PnQ9PT1yP2Ake2V9IC0gJHtufWA6ZSkpLmpvaW4oKX07fSw2NjY4OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZUNvbmNhdEF0dHJpYnV0ZXM9dC5jb25jYXQ9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNTYzOSksaT1uKDQ1OTUpO3QuY29uY2F0PShlLHQsbik9PihwKHQpLGUuc2Vzc2lvbi5wYWNrJiZ0WzBdLmRpbXMubGVuZ3RoPjE/W2UucnVuKCgwLCBpLmNyZWF0ZVBhY2tlZENvbmNhdFByb2dyYW1JbmZvTG9hZGVyKShlLHQsbiksdCldOltlLnJ1bihzKGUsdCxuKSx0KV0pO2NvbnN0IHM9KGUsdCxuKT0+e2NvbnN0IHI9KGk9dC5sZW5ndGgscz1uLmNhY2hlS2V5LHtuYW1lOiJDb25jYXQiLGlucHV0TmFtZXM6QXJyYXkuZnJvbSh7bGVuZ3RoOml9LCgoZSx0KT0+YFgke3R9YCkpLGlucHV0VHlwZXM6QXJyYXkoaSkuZmlsbChvLlRleHR1cmVUeXBlLnVucGFja2VkKSxjYWNoZUhpbnQ6c30pO3ZhciBpLHM7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSx7Z2V0OigpPT4oKGUsdCxuLHIpPT57Y29uc3QgaT1uWzBdLmRpbXMuc2xpY2UoKTtpZihyPj1pLmxlbmd0aHx8cjwtMSppLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImF4aXMgc3BlY2lmaWVkIGZvciBjb25jYXQgZG9lc24ndCBtYXRjaCBpbnB1dCBkaW1lbnNpb25hbGl0eSIpO3I8MCYmKHI9aS5sZW5ndGgrcik7Y29uc3Qgcz1pLnNsaWNlKDApO2ZvcihsZXQgZT0xO2U8bi5sZW5ndGg7ZSsrKXtjb25zdCB0PW5bZV0uZGltcy5zbGljZSgpO2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKWlmKGU9PT1yKXNbcl0rPXRbZV07ZWxzZSBpZihpW2VdIT09dFtlXSl0aHJvdyBuZXcgRXJyb3IoIm5vbiBjb25jYXQgZGltZW5zaW9ucyBtdXN0IG1hdGNoIil9Y29uc3QgcD1zLmxlbmd0aCxkPW5ldyBBcnJheShuLmxlbmd0aCk7bGV0IGY9MDtmb3IobGV0IGU9MDtlPGQubGVuZ3RoOysrZSlmKz1uW2VdLmRpbXNbcl0sZFtlXT1mO2xldCBoPSIiO2g9bi5sZW5ndGg8NT9hKGQpOnUoZCk7Y29uc3QgZz1gXG4gICAgICAgICR7bChuLmxlbmd0aCxwKX1cbiAgICAgICAgJHtjKGQpfVxuICAgICAgICAke2h9XG4gICAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtwfV0pIHtcbiAgICAgICAgICBpbnQgdGV4dHVyZUluZGV4ID0gZ2V0VGV4dHVyZVdoZXJlRGF0YVJlc2lkZXMgKGluZGljZXNbJHtyfV0pO1xuXG4gICAgICAgICAgaWYodGV4dHVyZUluZGV4ICE9IDApIHtcbiAgICAgICAgICAgIGluZGljZXNbJHtyfV0gPSBpbmRpY2VzWyR7cn1dIC0gaW50KGdldFNpemVJbkNvbmNhdEF4aXNWYWx1ZUZyb21JbmRleCh0ZXh0dXJlSW5kZXgtaW50KDEpKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZldGNoRGF0YUZyb21Db3JyZWN0VGV4dHVyZSh0ZXh0dXJlSW5kZXgsIGluZGljZXMpO1xuICAgICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvdXRwdXQ6e2RpbXM6cyx0eXBlOm5bMF0udHlwZSx0ZXh0dXJlVHlwZTpvLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6Z30pfSkoMCxyLHQsbi5heGlzKX0pfSxhPWU9PmBpbnQgZ2V0VGV4dHVyZVdoZXJlRGF0YVJlc2lkZXMoaW50IGluZGV4KSB7XG4gICAgICAke2UubWFwKCgoZSx0KT0+YGlmKGluZGV4PCR7ZX0pIHtyZXR1cm4gJHt0fTt9XG5gKSkuam9pbigiIil9XG4gICAgfWAsdT1lPT5hKGUpLGw9KGUsdCk9Pntjb25zdCBuPVtgZmxvYXQgZmV0Y2hEYXRhRnJvbUNvcnJlY3RUZXh0dXJlKGludCB0ZXh0dXJlSW5kZXgsIGludCBpbmRpY2VzWyR7dH1dKSB7YF07Zm9yKGxldCB0PTA7dDxlOysrdCkwPT09dD9uLnB1c2goYFx0aWYgKHRleHR1cmVJbmRleCA9PSAke3R9KSB7IHJldHVybiBfWCR7dH0oaW5kaWNlcyk7IH1gKTp0PT09ZS0xP24ucHVzaChgXHRlbHNlIHsgcmV0dXJuIF9YJHt0fShpbmRpY2VzKTsgfWApOm4ucHVzaChgXHRlbHNlIGlmICh0ZXh0dXJlSW5kZXggPT0gJHt0fSkgeyByZXR1cm4gX1gke3R9KGluZGljZXMpOyB9YCk7cmV0dXJuIG4ucHVzaCgiXHR9Iiksbi5qb2luKCJcbiIpfSxjPWU9Pntjb25zdCB0PVsiaW50IGdldFNpemVJbkNvbmNhdEF4aXNWYWx1ZUZyb21JbmRleChpbnQgaW5kZXgpIHsiXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoOysrbikwPT09bj90LnB1c2goYFx0aWYgKGluZGV4ID09ICR7bn0pIHsgcmV0dXJuICR7ZVtuXX07IH1gKTpuPT09ZS5sZW5ndGgtMT90LnB1c2goYFx0ZWxzZSB7IHJldHVybiAke2Vbbl19OyB9YCk6dC5wdXNoKGBcdGVsc2UgaWYgKGluZGV4ID09ICR7bn0pIHsgcmV0dXJuICR7ZVtuXX07IH1gKTtyZXR1cm4gdC5wdXNoKCJcdH0iKSx0LmpvaW4oIlxuIil9O3QucGFyc2VDb25jYXRBdHRyaWJ1dGVzPWU9PigwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4aXM6ZS5hdHRyaWJ1dGVzLmdldEludCgiYXhpcyIpfSk7Y29uc3QgcD1lPT57aWYoIWV8fGUubGVuZ3RoPDEpdGhyb3cgbmV3IEVycm9yKCJ0b28gZmV3IGlucHV0cyIpO2NvbnN0IHQ9ZVswXS50eXBlLG49ZVswXS5kaW1zLmxlbmd0aDtpZigic3RyaW5nIj09PXQpdGhyb3cgbmV3IEVycm9yKCJzdHJpbmcgdGVuc29yIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Iik7Zm9yKGNvbnN0IHIgb2YgZSl7aWYoci50eXBlIT09dCl0aHJvdyBuZXcgRXJyb3IoImlucHV0IHRlbnNvcnMgc2hvdWxkIGJlIG9uZSB0eXBlIik7aWYoci5kaW1zLmxlbmd0aCE9PW4pdGhyb3cgbmV3IEVycm9yKCJpbnB1dCB0ZW5zb3JzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHNoYXBlIil9fTt9LDc4MjU6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZVVucGFja2VkR3JvdXBlZENvbnZQcm9ncmFtSW5mb0xvYWRlcj12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpLG89big2NzU3KSxpPW4oNTYzOSkscz1uKDk3NTQpLGE9bigyMTUwKTt0LmNyZWF0ZVVucGFja2VkR3JvdXBlZENvbnZQcm9ncmFtSW5mb0xvYWRlcj0oZSx0LG4pPT57Y29uc3QgdT0obD10Lmxlbmd0aD4yLGM9bi5jYWNoZUtleSx7bmFtZToiR3JvdXBlZENvbnYiLGlucHV0TmFtZXM6bD9bIlgiLCJXIiwiQmlhcyJdOlsiWCIsIlciXSxpbnB1dFR5cGVzOmw/W2kuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXTpbaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6Y30pO3ZhciBsLGM7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx1KSx7Z2V0OigpPT4oKGUsdCxuLHUpPT57Y29uc3QgbD10Lmxlbmd0aD4yPyJ2YWx1ZSArPSBnZXRCaWFzKG91dHB1dF9jaGFubmVsKTsiOiIiLGM9dFswXS5kaW1zLnNsaWNlKCkscD10WzFdLmRpbXMuc2xpY2UoKSxkPXBbMF0vdS5ncm91cDtyLkxvZ2dlci52ZXJib3NlKCJHcm91cGVkQ29udiIsYGF1dHBQYWQ6JHt1LmF1dG9QYWR9LCBkaWxhdGlvbnM6JHt1LmRpbGF0aW9uc30sIGdyb3VwOiR7dS5ncm91cH0sIGtlcm5lbFNoYXBlOiR7dS5rZXJuZWxTaGFwZX0sIHBhZHM6JHt1LnBhZHN9LCBzdHJpZGVzOiR7dS5zdHJpZGVzfWApO2NvbnN0IGY9KDAsIHMuY2FsY3VsYXRlT3V0cHV0U2hhcGUpKGMscCx1LmRpbGF0aW9ucyx1LnBhZHMsdS5zdHJpZGVzKSxoPSgwLCBvLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSx7YWN0aXZhdGlvbkZ1bmN0aW9uOmcsYXBwbHlBY3RpdmF0aW9uOmJ9PSgwLCBhLmdldEFjdGl2YXRpb25TbmlwcGV0KSh1KSxtPWBcbiAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7dS5zdHJpZGVzWzBdfSwgJHt1LnN0cmlkZXNbMV19KTtcbiAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7dS5wYWRzWzBdfSwgJHt1LnBhZHNbMV19KTtcbiAgJHtnfVxuICB2b2lkIG1haW4oKSB7XG4gICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgaW50IG91dHB1dF9jaGFubmVsID0gY29vcmRzLnk7XG4gICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnp3ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgaW50IGdyb3VwX2lkID0gb3V0cHV0X2NoYW5uZWwgLyAke2R9O1xuXG4gICAgZmxvYXQgdmFsdWUgPSAwLjA7XG4gICAgZm9yIChpbnQgd0luQ2hhbm5lbCA9IDA7IHdJbkNoYW5uZWwgPCAke3BbMV19OyB3SW5DaGFubmVsKyspIHtcbiAgICAgIGludCBpbnB1dF9jaGFubmVsID0gZ3JvdXBfaWQgKiAke3BbMV19ICsgd0luQ2hhbm5lbDtcbiAgICAgIGZvciAoaW50IHdIZWlnaHQgPSAwOyB3SGVpZ2h0IDwgJHtwWzJdfTsgd0hlaWdodCsrKSB7XG4gICAgICAgIGludCB4SGVpZ2h0ID0geFJDQ29ybmVyLnggKyB3SGVpZ2h0ICogJHt1LmRpbGF0aW9uc1swXX07XG5cbiAgICAgICAgaWYgKHhIZWlnaHQgPCAwIHx8IHhIZWlnaHQgPj0gJHtjWzJdfSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpbnQgd1dpZHRoID0gMDsgd1dpZHRoIDwgJHtwWzNdfTsgd1dpZHRoKyspIHtcbiAgICAgICAgICBpbnQgeFdpZHRoID0geFJDQ29ybmVyLnkgKyB3V2lkdGggKiAke3UuZGlsYXRpb25zWzFdfTtcbiAgICAgICAgICBpZiAoeFdpZHRoIDwgMCB8fCB4V2lkdGggPj0gJHtjWzNdfSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmxvYXQgeFZhbCA9IGdldFgoYmF0Y2gsIGlucHV0X2NoYW5uZWwsIHhXaWR0aCwgeEhlaWdodCk7XG4gICAgICAgICAgZmxvYXQgd1ZhbCA9IGdldFcob3V0cHV0X2NoYW5uZWwsIHdJbkNoYW5uZWwsIHdXaWR0aCwgd0hlaWdodCk7XG4gICAgICAgICAgdmFsdWUgKz0geFZhbCp3VmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgICR7bH1cbiAgICAke2J9XG4gICAgJHtoLm91dHB1dH0gPSB2ZWM0KHZhbHVlLCAuMCwgLjAsIC4wKTtcbiAgfVxuYDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4pLHtvdXRwdXQ6e2RpbXM6Zix0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6bSxoYXNNYWluOiEwfSl9KShlLHQsdSxuKX0pfTt9LDc3MDg6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNvbnYyRFBhY2tlZD10LmNvbnYyRFBhY2tlZFBvaW50d2lzZT12b2lkIDA7Y29uc3Qgcj1uKDk3NTQpLG89big1OTUwKSxpPW4oNTYzMik7dC5jb252MkRQYWNrZWRQb2ludHdpc2U9KGUsdCxuKT0+e2NvbnN0IG89dFswXS5kaW1zLHM9dFsxXS5kaW1zLGE9KDAsIHIuY2FsY3VsYXRlT3V0cHV0U2hhcGUpKG8scyxuLmRpbGF0aW9ucyxuLnBhZHMsbi5zdHJpZGVzKSx1PWUucmVzaGFwZVBhY2tlZCh0WzBdLFtvWzFdLG9bMl0qb1szXV0pLGw9ZS5yZXNoYXBlUGFja2VkKHRbMV0sW3NbMF0sc1sxXV0pLGM9dC5sZW5ndGg+Mj9bbCx1LHRbMl1dOltsLHVdLHA9ZS5ydW4oKDAsIGkuY3JlYXRlUGFja2VkTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXIpKGUsYyxuKSxjKTtyZXR1cm4gZS5yZXNoYXBlUGFja2VkKHAsYSl9LHQuY29udjJEUGFja2VkPShlLHQsbik9Pntjb25zdCBzPXRbMF0uZGltcyxhPXRbMV0uZGltcyx1PSgwLCByLmNhbGN1bGF0ZU91dHB1dFNoYXBlKShzLGEsbi5kaWxhdGlvbnMsbi5wYWRzLG4uc3RyaWRlcyksbD1lLnJ1bigoMCwgby5jcmVhdGVQYWNrZWRJbTJDb2xQcm9ncmFtSW5mb0xvYWRlcikoZSx0WzBdLHRbMV0sdSxuKSxbdFswXV0pLGM9ZS5yZXNoYXBlUGFja2VkKHRbMV0sW2FbMF0sYVsxXSphWzJdKmFbM11dKSxwPTM9PT10Lmxlbmd0aD9bYyxsLHRbMl1dOltjLGxdLGQ9ZS5ydW4oKDAsIGkuY3JlYXRlUGFja2VkTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXIpKGUscCxuKSxwKTtyZXR1cm4gZS5yZXNoYXBlUGFja2VkKGQsdSl9O30sNTA0MjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VDb252VHJhbnNwb3NlQXR0cmlidXRlcz10LmNvbnZUcmFuc3Bvc2U9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNjc1NyksaT1uKDU2MzkpLHM9bigyMTUwKSxhPShlLHQsbixyLG8saSk9PihlLTEpKnQrbisoci0xKSpvKzEtaSx1PShlLHQsbixyLG8pPT57Y29uc3QgaT1NYXRoLmZsb29yKGUvMik7IlNBTUVfVVBQRVIiPT09dD8obltyXT1pLG5bb109ZS1pKToiU0FNRV9MT1dFUiI9PT10JiYobltyXT1lLWksbltvXT1pKTt9O3QuY29udlRyYW5zcG9zZT0oZSx0LG4pPT4oZCh0LG4pLGwoZSx0LG4pKTtjb25zdCBsPShlLHQsbik9Pntjb25zdCByPXAobix0KTtyZXR1cm4gW2MoZSx0LHIpXX0sYz0oZSx0LG4pPT5lLnJ1bigoKGUsdCxuKT0+e2NvbnN0IHI9KGE9dC5sZW5ndGg+Mix1PW4uY2FjaGVLZXkse25hbWU6IkNvbnZUcmFuc3Bvc2UiLGlucHV0TmFtZXM6YT9bIlgiLCJXIiwiQiJdOlsiWCIsIlciXSxpbnB1dFR5cGVzOmE/W2kuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXTpbaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6dX0pO3ZhciBhLHU7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSx7Z2V0OigpPT4oKGUsdCxuLHIpPT57Y29uc3QgYT10Lmxlbmd0aD4yPyJnZXRCKG91dHB1dF9jaGFubmVsKSI6IjAuMCIsdT10WzBdLmRpbXMsbD10WzFdLmRpbXMsYz1sWzFdLHA9bFswXS9yLmdyb3VwLGQ9W3RbMF0uZGltc1swXSx0WzFdLmRpbXNbMV0qci5ncm91cCwuLi5yLm91dHB1dFNoYXBlXSxmPSgwLCBvLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSx7YWN0aXZhdGlvbkZ1bmN0aW9uOmgsYXBwbHlBY3RpdmF0aW9uOmd9PSgwLCBzLmdldEFjdGl2YXRpb25TbmlwcGV0KShyKSxiPWBcbiAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7ci5zdHJpZGVzWzBdfSwgJHtyLnN0cmlkZXNbMV19KTtcbiAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7ci5wYWRzWzBdfSwgJHtyLnBhZHNbMV19KTtcbiAgJHtofVxuICB2b2lkIG1haW4oKSB7XG4gICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgaW50IG91dHB1dF9jaGFubmVsID0gY29vcmRzLnk7XG5cbiAgICBpdmVjMiBsb2MgPSBjb29yZHMuencgKyBwYWRzO1xuXG4gICAgaW50IGdyb3VwX2lkID0gb3V0cHV0X2NoYW5uZWwgLyAke2N9O1xuICAgIGludCB3T3V0Q2hhbm5lbCA9IG91dHB1dF9jaGFubmVsIC0gZ3JvdXBfaWQgKiAke2N9O1xuXG4gICAgZmxvYXQgdmFsdWUgPSAke2F9O1xuICAgIGZvciAoaW50IGluQ2hhbm5lbE9mZnNldCA9IDA7IGluQ2hhbm5lbE9mZnNldCA8ICR7cH07IGluQ2hhbm5lbE9mZnNldCsrKSB7XG4gICAgICBpbnQgaW5wdXRfY2hhbm5lbCA9IGdyb3VwX2lkICogJHtwfSArIGluQ2hhbm5lbE9mZnNldDtcbiAgICAgIGZvciAoaW50IHdXT2ZmID0gMDsgd1dPZmYgPCAke2xbMl19OyB3V09mZisrKSB7XG4gICAgICAgIGZvciAoaW50IHdIT2ZmID0gMDsgd0hPZmYgPCAke2xbM119OyB3SE9mZisrKSB7XG4gICAgICAgICAgaXZlYzIgd09mZiA9IGl2ZWMyKHdXT2ZmICogJHtyLmRpbGF0aW9uc1swXX0sIHdIT2ZmICogJHtyLmRpbGF0aW9uc1sxXX0pO1xuICAgICAgICAgIGl2ZWMyIHdMb2MgPSBsb2MgLSB3T2ZmO1xuICAgICAgICAgIGl2ZWMyIHdMb2NJbiA9IHdMb2MgLyBzdHJpZGVzO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHdMb2NJbiAqIHN0cmlkZXMgPT0gd0xvYyAmJlxuICAgICAgICAgICAgd0xvY0luLnggPj0gMCAmJiB3TG9jSW4ueCA8ICR7dVsyXX0gJiZcbiAgICAgICAgICAgIHdMb2NJbi55ID49IDAgJiYgd0xvY0luLnkgPCAke3VbM119XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmbG9hdCB4VmFsID0gZ2V0WChiYXRjaCwgaW5wdXRfY2hhbm5lbCwgd0xvY0luLnksIHdMb2NJbi54KTtcbiAgICAgICAgICAgIGZsb2F0IHdWYWwgPSBnZXRXKGlucHV0X2NoYW5uZWwsIHdPdXRDaGFubmVsLCB3SE9mZiwgd1dPZmYpO1xuICAgICAgICAgICAgdmFsdWUgKz0geFZhbCAqIHdWYWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgICR7Z31cbiAgICAke2Yub3V0cHV0fSA9IHZlYzQodmFsdWUsIC4wLCAuMCwgLjApO1xuICB9XG5gO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbikse291dHB1dDp7ZGltczpkLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOmkuVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpiLGhhc01haW46ITB9KX0pKGUsdCxyLG4pfSl9KShlLHQsbiksdCkscD0oZSx0KT0+e2NvbnN0IG49ZS5rZXJuZWxTaGFwZS5zbGljZSgpO2lmKDA9PT1lLmtlcm5lbFNoYXBlLmxlbmd0aClmb3IobGV0IGU9MjtlPHRbMV0uZGltcy5sZW5ndGg7KytlKW4ucHVzaCh0WzFdLmRpbXNbZV0pO2NvbnN0IHI9ZS5wYWRzLnNsaWNlKCksbz1lLm91dHB1dFNoYXBlLnNsaWNlKCk7KChlLHQsbixyLG8saSxzLGwpPT57Y29uc3QgYz1lLmxlbmd0aC0yLHA9MD09PWwubGVuZ3RoO2ZvcihsZXQgZD0wO2Q8YzsrK2Qpe2NvbnN0IGY9cD9lW2QrMl0qaVtkXTpsW2RdLGg9YShlW2QrMl0saVtkXSxvW2RdLHRbZF0sbltkXSxmKTt1KGgscixvLGQsZCtjKSxwJiZsLnB1c2goaVtkXSooZVtkKzJdLTEpK3NbZF0rKHRbZF0tMSkqbltkXSsxLW9bZF0tb1tkK2NdKTt9fSkodFswXS5kaW1zLG4sZS5kaWxhdGlvbnMsZS5hdXRvUGFkLHIsZS5zdHJpZGVzLGUub3V0cHV0UGFkZGluZyxvKTtjb25zdCBpPU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oaSx7a2VybmVsU2hhcGU6bixwYWRzOnIsb3V0cHV0U2hhcGU6byxjYWNoZUtleTplLmNhY2hlS2V5fSksaX07dC5wYXJzZUNvbnZUcmFuc3Bvc2VBdHRyaWJ1dGVzPWU9Pntjb25zdCB0PWUuYXR0cmlidXRlcyxuPSgwLCBzLnBhcnNlSW50ZXJuYWxBY3RpdmF0aW9uQXR0cmlidXRlcykodCksbz10LmdldFN0cmluZygiYXV0b19wYWQiLCJOT1RTRVQiKSxpPXQuZ2V0SW50cygiZGlsYXRpb25zIixbMSwxXSksYT10LmdldEludCgiZ3JvdXAiLDEpLHU9dC5nZXRJbnRzKCJrZXJuZWxfc2hhcGUiLFtdKSxsPXQuZ2V0SW50cygib3V0cHV0X3BhZGRpbmciLFswLDBdKSxjPXQuZ2V0SW50cygib3V0cHV0X3NoYXBlIixbXSkscD10LmdldEludHMoInBhZHMiLFswLDAsMCwwXSksZD10LmdldEludHMoInN0cmlkZXMiLFsxLDFdKTtyZXR1cm4gKDAsIHIuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KShPYmplY3QuYXNzaWduKHthdXRvUGFkOm8sZGlsYXRpb25zOmksZ3JvdXA6YSxrZXJuZWxTaGFwZTp1LG91dHB1dFBhZGRpbmc6bCxvdXRwdXRTaGFwZTpjLHBhZHM6cCxzdHJpZGVzOmR9LG4pKX07Y29uc3QgZD0oZSx0KT0+e2lmKCFlfHwyIT09ZS5sZW5ndGgmJjMhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkNvbnYgcmVxdWlyZXMgMiBvciAzIGlucHV0cyIpO2lmKDQhPT1lWzBdLmRpbXMubGVuZ3RofHw0IT09ZVsxXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImN1cnJlbnRseSBvbmx5IHN1cHBvcnQgMi1kaW1lbnNpb25hbCBjb252Iik7aWYoZVswXS5kaW1zWzFdIT09ZVsxXS5kaW1zWzBdKXRocm93IG5ldyBFcnJvcigiRklMVEVSX0lOX0NIQU5ORUwgc2hvdWxkIGJlIGVxdWFsIHRvIERBVEFfQ0hBTk5FTCIpO2NvbnN0IG49ZVsxXS5kaW1zWzFdKnQuZ3JvdXA7aWYoMz09PWUubGVuZ3RoJiYoMSE9PWVbMl0uZGltcy5sZW5ndGh8fGVbMl0uZGltc1swXSE9PW4pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBiaWFzIik7Y29uc3Qgcj1lWzBdLmRpbXMubGVuZ3RoLTI7aWYodC5kaWxhdGlvbnMubGVuZ3RoIT09cil0aHJvdyBuZXcgRXJyb3IoYGRpbGF0aW9ucyBzaG91bGQgYmUgJHtyfURgKTtpZih0LnN0cmlkZXMubGVuZ3RoIT09cil0aHJvdyBuZXcgRXJyb3IoYHN0cmlkZXMgc2hvdWxkIGJlICR7cn1EYCk7aWYodC5wYWRzLmxlbmd0aCE9PTIqcil0aHJvdyBuZXcgRXJyb3IoYHBhZHMgc2hvdWxkIGJlICR7MipyfURgKTtpZih0Lm91dHB1dFBhZGRpbmcubGVuZ3RoIT09cil0aHJvdyBuZXcgRXJyb3IoYG91dHB1dF9wYWRkaW5nIHNob3VsZCBiZSAke3J9RGApO2lmKDAhPT10Lmtlcm5lbFNoYXBlLmxlbmd0aCYmdC5rZXJuZWxTaGFwZS5sZW5ndGghPT1lWzFdLmRpbXMubGVuZ3RoLTIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGtlcm5lbCBzaGFwZSIpO2lmKDAhPT10Lm91dHB1dFNoYXBlLmxlbmd0aCYmdC5vdXRwdXRTaGFwZS5sZW5ndGghPT1lWzBdLmRpbXMubGVuZ3RoLTIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG91dHB1dCBzaGFwZSIpO2lmKCJmbG9hdDMyIiE9PWVbMF0udHlwZXx8ImZsb2F0MzIiIT09ZVsxXS50eXBlKXRocm93IG5ldyBFcnJvcigiQ29udlRyYW5zcG9zZSBpbnB1dChYLFcpIHNob3VsZCBiZSBmbG9hdCB0ZW5zb3IiKTtpZigzPT09ZS5sZW5ndGgmJiJmbG9hdDMyIiE9PWVbMl0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkNvbnZUcmFuc3Bvc2UgaW5wdXQoYmlhcykgc2hvdWxkIGJlIGZsb2F0IHRlbnNvciIpfTt9LDk3NTQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlQ29udkF0dHJpYnV0ZXM9dC5jb252PXQuY2FsY3VsYXRlT3V0cHV0U2hhcGU9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNzI3MyksaT1uKDc4MjUpLHM9big3NzA4KSxhPW4oMzI4MSksdT1uKDIxNTApLGw9bigxNjI1KSxjPW4oODI3Nik7dC5jYWxjdWxhdGVPdXRwdXRTaGFwZT0oZSx0LG4scixvKT0+e2NvbnN0IGk9ZVswXSxzPWUuc2xpY2UoMiksYT1zLmxlbmd0aCx1PXRbMF0sbD10LnNsaWNlKDIpLm1hcCgoKGUsdCk9PmUrKGUtMSkqKG5bdF0tMSkpKSxjPXMubWFwKCgoZSx0KT0+ZStyW3RdK3JbdCthXSkpLm1hcCgoKGUsdCk9Pk1hdGguZmxvb3IoKGUtbFt0XStvW3RdKS9vW3RdKSkpO3JldHVybiBbaSx1XS5jb25jYXQoLi4uYyl9LHQuY29udj0oZSx0LG4pPT4oZyh0LG4pLHAoZSx0LG4pKTtjb25zdCBwPShlLHQsbik9Pntjb25zdCByPWgobix0KSxvPWUuc2Vzc2lvbi5wYWNrLGE9MT09PXIua2VybmVsU2hhcGVbMF0mJjE9PT1yLmtlcm5lbFNoYXBlWzFdO3JldHVybiByLmdyb3VwPjE/W2UucnVuKCgwLCBpLmNyZWF0ZVVucGFja2VkR3JvdXBlZENvbnZQcm9ncmFtSW5mb0xvYWRlcikoZSx0LHIpLHQpXTphJiZvP1tkKGUsdCxyKV06byYmND09PXRbMF0uZGltcy5sZW5ndGgmJjE9PT10WzBdLmRpbXNbMF0mJiFhP1soMCwgcy5jb252MkRQYWNrZWQpKGUsdCxyKV06W2YoZSx0LHIpXX0sZD0oZSxuLHIpPT57Y29uc3Qgbz1uWzBdLmRpbXMsaT1uWzFdLmRpbXMscz0oMCwgdC5jYWxjdWxhdGVPdXRwdXRTaGFwZSkobyxpLHIuZGlsYXRpb25zLHIucGFkcyxyLnN0cmlkZXMpLGE9ZS5yZXNoYXBlVW5wYWNrZWQoblswXSxbb1sxXSxvWzJdKm9bM11dKSx1PWUucmVzaGFwZVVucGFja2VkKG5bMV0sW2lbMF0saVsxXV0pLGw9bi5sZW5ndGg+Mj9bdSxhLG5bMl1dOlt1LGFdLHA9ZS5ydW4oKDAsIGMuY3JlYXRlTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXIpKGwsciksbCk7cmV0dXJuIGUucmVzaGFwZVVucGFja2VkKHAscyl9LGY9KGUsbixyKT0+e2NvbnN0IG89blswXS5kaW1zLGk9blsxXS5kaW1zLHM9KDAsIHQuY2FsY3VsYXRlT3V0cHV0U2hhcGUpKG8saSxyLmRpbGF0aW9ucyxyLnBhZHMsci5zdHJpZGVzKSx1PWUucnVuKCgwLCBsLmNyZWF0ZUltMkNvbFByb2dyYW1JbmZvTG9hZGVyKShlLG5bMF0sblsxXSxzLHIpLFtuWzBdXSksYz0zPT09bi5sZW5ndGg/W3UsblsxXSxuWzJdXTpbdSxuWzFdXTtyZXR1cm4gZS5ydW4oKDAsIGEuY3JlYXRlRG90UHJvZHVjdFByb2dyYW1JbmZvTG9hZGVyKShlLG4scyxyKSxjKX0saD0oZSx0KT0+e2NvbnN0IG49ZS5rZXJuZWxTaGFwZS5zbGljZSgpO2lmKDA9PT1lLmtlcm5lbFNoYXBlLmxlbmd0aClmb3IobGV0IGU9MjtlPHRbMV0uZGltcy5sZW5ndGg7KytlKW4ucHVzaCh0WzFdLmRpbXNbZV0pO2NvbnN0IHI9ZS5wYWRzLnNsaWNlKCk7by5Qb29sQ29udlV0aWwuYWRqdXN0UGFkc0Jhc2VkT25BdXRvUGFkKHRbMF0uZGltcyxlLnN0cmlkZXMsZS5kaWxhdGlvbnMsbixyLGUuYXV0b1BhZCk7Y29uc3QgaT1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiBPYmplY3QuYXNzaWduKGkse2tlcm5lbFNoYXBlOm4scGFkczpyLGNhY2hlS2V5OmUuY2FjaGVLZXl9KSxpfTt0LnBhcnNlQ29udkF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLG49KDAsIHUucGFyc2VJbnRlcm5hbEFjdGl2YXRpb25BdHRyaWJ1dGVzKSh0KSxvPXQuZ2V0U3RyaW5nKCJhdXRvX3BhZCIsIk5PVFNFVCIpLGk9dC5nZXRJbnRzKCJkaWxhdGlvbnMiLFsxLDFdKSxzPXQuZ2V0SW50KCJncm91cCIsMSksYT10LmdldEludHMoImtlcm5lbF9zaGFwZSIsW10pLGw9dC5nZXRJbnRzKCJwYWRzIixbMCwwLDAsMF0pLGM9dC5nZXRJbnRzKCJzdHJpZGVzIixbMSwxXSk7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoT2JqZWN0LmFzc2lnbih7YXV0b1BhZDpvLGRpbGF0aW9uczppLGdyb3VwOnMsa2VybmVsU2hhcGU6YSxwYWRzOmwsc3RyaWRlczpjfSxuKSl9O2NvbnN0IGc9KGUsdCk9PntpZighZXx8MiE9PWUubGVuZ3RoJiYzIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJDb252IHJlcXVpcmVzIDIgb3IgMyBpbnB1dHMiKTtpZig0IT09ZVswXS5kaW1zLmxlbmd0aHx8NCE9PWVbMV0uZGltcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJjdXJyZW50bHkgb25seSBzdXBwb3J0IDItZGltZW5zaW9uYWwgY29udiIpO2lmKGVbMF0uZGltc1sxXSE9PWVbMV0uZGltc1sxXSp0Lmdyb3VwKXRocm93IG5ldyBFcnJvcigiRklMVEVSX0lOX0NIQU5ORUwgc2hvdWxkIGJlIGVxdWFsIHRvIERBVEFfQ0hBTk5FTCIpO2lmKDM9PT1lLmxlbmd0aCYmKDEhPT1lWzJdLmRpbXMubGVuZ3RofHxlWzFdLmRpbXNbMF0hPT1lWzJdLmRpbXNbMF0pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBiaWFzIik7Y29uc3Qgbj1lWzBdLmRpbXMubGVuZ3RoLTI7aWYodC5kaWxhdGlvbnMubGVuZ3RoIT09bil0aHJvdyBuZXcgRXJyb3IoYGRpbGF0aW9ucyBzaG91bGQgYmUgJHtufURgKTtpZih0LnN0cmlkZXMubGVuZ3RoIT09bil0aHJvdyBuZXcgRXJyb3IoYHN0cmlkZXMgc2hvdWxkIGJlICR7bn1EYCk7aWYodC5wYWRzLmxlbmd0aCE9PTIqbil0aHJvdyBuZXcgRXJyb3IoYHBhZHMgc2hvdWxkIGJlICR7MipufURgKTtpZigwIT09dC5rZXJuZWxTaGFwZS5sZW5ndGgmJnQua2VybmVsU2hhcGUubGVuZ3RoIT09ZVsxXS5kaW1zLmxlbmd0aC0yKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBrZXJuZWwgc2hhcGUiKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGV8fCJmbG9hdDMyIiE9PWVbMV0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkNvbnYgaW5wdXQoWCxXKSBzaG91bGQgYmUgZmxvYXQgdGVuc29yIik7aWYoMz09PWUubGVuZ3RoJiYiZmxvYXQzMiIhPT1lWzJdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJDb252IGlucHV0KGJpYXMpIHNob3VsZCBiZSBmbG9hdCB0ZW5zb3IiKX07fSw2NzQyOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZURlcHRoVG9TcGFjZUF0dHJpYnV0ZXM9dC5kZXB0aFRvU3BhY2U9dm9pZCAwO2NvbnN0IHI9big1NzA3KTt0LmRlcHRoVG9TcGFjZT0oZSx0LG4pPT57byh0KTtjb25zdCBpPW4uYmxvY2tzaXplLHM9aSppLGE9IkRDUiI9PT1uLm1vZGU/WzAsMyw0LDEsNSwyXTpbMCwxLDQsMiw1LDNdLHU9IkRDUiI9PT1uLm1vZGU/W3RbMF0uZGltc1swXSxpLGksdFswXS5kaW1zWzFdL3MsdFswXS5kaW1zWzJdLHRbMF0uZGltc1szXV06W3RbMF0uZGltc1swXSx0WzBdLmRpbXNbMV0vcyxpLGksdFswXS5kaW1zWzJdLHRbMF0uZGltc1szXV0sbD1lLnJlc2hhcGVVbnBhY2tlZCh0WzBdLHUpLGM9e3Blcm06YSxjYWNoZUtleTpgJHthfWB9LFtwXT0oMCwgci50cmFuc3Bvc2UpKGUsW2xdLGMpLGQ9W3RbMF0uZGltc1swXSx0WzBdLmRpbXNbMV0vcyx0WzBdLmRpbXNbMl0qaSx0WzBdLmRpbXNbM10qaV07cmV0dXJuIFtlLnJlc2hhcGVVbnBhY2tlZChwLGQpXX0sdC5wYXJzZURlcHRoVG9TcGFjZUF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEludCgiYmxvY2tzaXplIik7aWYodDwxKXRocm93IG5ldyBFcnJvcihgYmxvY2tzaXplIG11c3QgYmUgPj0gMSwgYnV0IGdvdCA6ICR7dH0gZm9yIERlcHRoVG9TcGFjZWApO2NvbnN0IG49ZS5hdHRyaWJ1dGVzLmdldFN0cmluZygibW9kZSIsIkRDUiIpO2lmKCJEQ1IiIT09biYmIkNSRCIhPT1uKXRocm93IG5ldyBFcnJvcihgdW5yZWNvZ25pemVkIG1vZGU6ICR7bn0gZm9yIERlcHRoVG9TcGFjZWApO3JldHVybiB7bW9kZTpuLGJsb2Nrc2l6ZTp0fX07Y29uc3Qgbz1lPT57aWYoMSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgRGVwdGhUb1NwYWNlIGV4cGVjdCAxIGlucHV0cywgYnV0IGdvdCAke2UubGVuZ3RofWApO2lmKCJzdHJpbmciPT09ZVswXS50eXBlfHw0IT09ZVswXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXB0aFRvU3BhY2UgaW5wdXQgc2hvdWxkIGJlIGEgNC1EIG51bWVyaWMgdGVuc29yIil9O30sMzI4MTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlRG90UHJvZHVjdFByb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDY3NTcpLGk9big1NjM5KSxzPW4oMjE1MCksYT1uKDE2MjUpO3QuY3JlYXRlRG90UHJvZHVjdFByb2dyYW1JbmZvTG9hZGVyPShlLHQsbix1KT0+e2NvbnN0IGw9KChlLHQpPT4oe25hbWU6IkNvbnZEb3RQcm9kdWN0IixpbnB1dE5hbWVzOmU/WyJJbTJDb2wiLCJLIiwiQiJdOlsiSW0yQ29sIiwiSyJdLGlucHV0VHlwZXM6ZT9baS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnBhY2tlZExhc3REaW1lbnNpb24saS5UZXh0dXJlVHlwZS51bnBhY2tlZF06W2kuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uXSxjYWNoZUtleTp0LmFjdGl2YXRpb25DYWNoZUtleX0pKSh0Lmxlbmd0aD4yLHUpO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbCkse2dldDooKT0+KChlLHQsbix1LGwpPT57Y29uc3QgYz1uWzBdLmRpbXMscD1uWzFdLmRpbXMsZD1bcFswXSxNYXRoLmNlaWwoY1sxXSpwWzJdKnBbM10vNCldLGY9KDAsIGEuY2FsY3VsYXRlSW0yQ29sRGltcykoYyxwLHUpLFtoLGddPWUuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KGQsaS5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKSxiPXIuU2hhcGVVdGlsLmNvbXB1dGVTdHJpZGVzKGYpLFttLHldPWUuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KGYsaS5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKSx2PXUubGVuZ3RoLF89bi5sZW5ndGg8Mz8iMC4wIjoiX0IoYikiLHc9TWF0aC5jZWlsKGNbMV0qcFsyXSpwWzNdLzQpLHthY3RpdmF0aW9uRnVuY3Rpb246VCxhcHBseUFjdGl2YXRpb246eH09KDAsIHMuZ2V0QWN0aXZhdGlvblNuaXBwZXQpKGwpLE89KDAsIG8uZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFM9YFxuJHtUfVxuZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske3Z9XSkge1xuICBpbnQgYlsxXTtcbiAgYlswXSA9IGluZGljZXNbMV07XG4gIGludCBpbTJjb2xbNF07XG4gIGltMmNvbFswXSA9IGluZGljZXNbMF07XG4gIGltMmNvbFsxXSA9IGluZGljZXNbMl07XG4gIGltMmNvbFsyXSA9IGluZGljZXNbM107XG4gIGludCBpbTJjb2xPZmZzZXQgPSBpbTJjb2xbMF0gKiAke2JbMF19ICsgaW0yY29sWzFdICogJHtiWzFdfSArIGltMmNvbFsyXSAqICR7YlsyXX07XG4gIGludCBrZXJuZWxPZmZzZXQgPSBpbmRpY2VzWzFdICogJHtkWzFdfTtcbiAgZmxvYXQgdmFsdWUgPSAke199O1xuICBmb3IgKGludCBpID0gMDsgaSA8ICR7d307ICsraSkge1xuICAgIHZlYzIgaW0yY29sQ29vcmRzID0gb2Zmc2V0VG9Db29yZHMoaW0yY29sT2Zmc2V0LCAke219LCAke3l9KTtcbiAgICB2ZWMyIGtlcm5lbENvb3JkcyA9IG9mZnNldFRvQ29vcmRzKGtlcm5lbE9mZnNldCwgJHtofSwgJHtnfSk7XG4gICAgdmFsdWUgKz0gZG90KCR7Ty50ZXh0dXJlMkR9KEltMkNvbCwgaW0yY29sQ29vcmRzKSwgJHtPLnRleHR1cmUyRH0oSywga2VybmVsQ29vcmRzKSk7XG4gICAgKytpbTJjb2xPZmZzZXQ7XG4gICAgKytrZXJuZWxPZmZzZXQ7XG4gIH1cbiAgJHt4fVxuICByZXR1cm4gdmFsdWU7XG59YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvdXRwdXQ6e2RpbXM6dSx0eXBlOm5bMF0udHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6U30pfSkoZSxsLHQsbix1KX0pfTt9LDQxMjU6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlRmxhdHRlbkF0dHJpYnV0ZXM9dC5mbGF0dGVuPXZvaWQgMDtjb25zdCByPW4oNzI3Myk7dC5mbGF0dGVuPShlLHQsbik9PntvKHQsbik7Y29uc3QgaT1yLlNoYXBlVXRpbC5mbGF0dGVuU2hhcGUodFswXS5kaW1zLG4pO3JldHVybiBbZS5yZXNoYXBlVW5wYWNrZWQodFswXSxpKV19LHQucGFyc2VGbGF0dGVuQXR0cmlidXRlcz1lPT5lLmF0dHJpYnV0ZXMuZ2V0SW50KCJheGlzIiwxKTtjb25zdCBvPShlLHQpPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkZsYXR0ZW4gcmVxdWlyZXMgMSBpbnB1dC4iKTtjb25zdCBuPWVbMF0uZGltcy5sZW5ndGg7aWYoMD09PW4pdGhyb3cgbmV3IEVycm9yKCJzY2FsYXIgdGVuc29yIGlzIG5vdCBzdXBwb3J0ZWQuIik7aWYodDwtbnx8dD5uKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBheGlzIik7aWYoInN0cmluZyI9PT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJzdHJpbmcgdGVuc29yIGlzIG5vdCBzdXBwb3J0ZWQuIil9O30sMjE1MDooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VJbnRlcm5hbEFjdGl2YXRpb25BdHRyaWJ1dGVzPXQuZ2V0QWN0aXZhdGlvblNuaXBwZXQ9dm9pZCAwO2NvbnN0IHI9big3MjczKSxvPW4oOTA4Nyk7dC5nZXRBY3RpdmF0aW9uU25pcHBldD1mdW5jdGlvbihlKXtsZXQgdDtzd2l0Y2goZS5hY3RpdmF0aW9uKXtjYXNlIlJlbHUiOnQ9KDAsIG8uZ2xzbFJlbHUpKCk7YnJlYWs7Y2FzZSJTaWdtb2lkIjp0PSgwLCBvLmdsc2xTaWdtb2lkKSgpO2JyZWFrO2Nhc2UiQ2xpcCI6dD0oMCwgby5nbHNsQ2xpcCkoZS5jbGlwTWluLGUuY2xpcE1heCk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4ge2FjdGl2YXRpb25GdW5jdGlvbjoiIixhcHBseUFjdGl2YXRpb246IiJ9fWNvbnN0IG49dC5uYW1lO3JldHVybiB7YWN0aXZhdGlvbkZ1bmN0aW9uOnQuYm9keSxhcHBseUFjdGl2YXRpb246YHZhbHVlID0gJHtufV8odmFsdWUpO2B9fSx0LnBhcnNlSW50ZXJuYWxBY3RpdmF0aW9uQXR0cmlidXRlcz1lPT57Y29uc3QgdD1lLmdldFN0cmluZygiYWN0aXZhdGlvbiIsIiIpO2lmKCJDbGlwIj09PXQpe2NvbnN0W24sb109ZS5nZXRGbG9hdHMoImFjdGl2YXRpb25fcGFyYW1zIixbci5NSU5fQ0xJUCxyLk1BWF9DTElQXSk7cmV0dXJuIHthY3RpdmF0aW9uOnQsY2xpcE1heDpvLGNsaXBNaW46bixhY3RpdmF0aW9uQ2FjaGVLZXk6YCR7dH06JHtufSwke299YH19cmV0dXJuIHthY3RpdmF0aW9uOnQsYWN0aXZhdGlvbkNhY2hlS2V5OnR9fTt9LDYxNDk6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlR2F0aGVyQXR0cmlidXRlcz10LmdhdGhlcj12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big2MTQ1KSxpPW4oNzI3Mykscz1uKDU2MzkpO3QuZ2F0aGVyPShlLHQsbik9PihsKHQsbi5heGlzKSxbZS5ydW4odShlLHQsbiksdCldKSx0LnBhcnNlR2F0aGVyQXR0cmlidXRlcz1lPT4oMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtheGlzOmUuYXR0cmlidXRlcy5nZXRJbnQoImF4aXMiLDApfSk7Y29uc3QgYT17bmFtZToiR2F0aGVyIixpbnB1dE5hbWVzOlsiQSIsIkIiXSxpbnB1dFR5cGVzOltzLlRleHR1cmVUeXBlLnVucGFja2VkLHMuVGV4dHVyZVR5cGUudW5wYWNrZWRdfSx1PShlLHQsbik9Pntjb25zdCByPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXl9KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHIpLHtnZXQ6KCk9PigoZSx0LG4scik9Pntjb25zdCBvPW5bMF0uZGltcy5zbGljZSgpLGE9blsxXS5kaW1zLnNsaWNlKCksdT1uZXcgQXJyYXkoby5sZW5ndGgrYS5sZW5ndGgtMSk7cj1pLlNoYXBlVXRpbC5ub3JtYWxpemVBeGlzKHIsby5sZW5ndGgpO2NvbnN0IGw9W107Zm9yKGxldCBlPTA7ZTx1Lmxlbmd0aDtlKyspZTxyPyh1W2VdPW9bZV0sbC5wdXNoKGBpbnB1dElkeFske2V9XSA9IG91dHB1dElkeFske2V9XTtgKSk6ZTxyK2EubGVuZ3RoPyh1W2VdPWFbZS1yXSxsLnB1c2goYGluZGV4RGF0YUlkeFske2Utcn1dID0gb3V0cHV0SWR4WyR7ZX1dO2ApKToodVtlXT1vW2UtYS5sZW5ndGgrMV0sbC5wdXNoKGBpbnB1dElkeFske2UtYS5sZW5ndGgrMX1dID0gb3V0cHV0SWR4WyR7ZX1dO2ApKTtjb25zdCBjPWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IG91dHB1dElkeFske3UubGVuZ3RofHwxfV0pIHtcbiAgICAgICAgaW50IGlucHV0SWR4WyR7by5sZW5ndGh9XTtcbiAgICAgICAgaW50IGluZGV4RGF0YUlkeFske2EubGVuZ3RofHwxfV07XG4gICAgICAgIGluZGV4RGF0YUlkeFswXSA9IDA7XG4gICAgICAgICR7bC5qb2luKCJcbiAgICAgICAgIil9XG4gICAgICAgIGludCBpZHggPSBpbnQoX0IoaW5kZXhEYXRhSWR4KSk7XG4gICAgICAgIGlucHV0SWR4WyR7cn1dID0gaWR4IDwgMCA/IGlkeCArICR7b1tyXX0gOiBpZHg7XG4gICAgICAgIHJldHVybiBfQShpbnB1dElkeCk7XG4gICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvdXRwdXQ6e2RpbXM6dSx0eXBlOm5bMF0udHlwZSx0ZXh0dXJlVHlwZTpzLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6Y30pfSkoMCxyLHQsbi5heGlzKX0pfSxsPShlLHQpPT57aWYoIWV8fDIhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkdhdGhlciByZXF1aXJlcyAyIGlucHV0cy4iKTtjb25zdCBuPWVbMF0uZGltcy5sZW5ndGg7aWYobjwxKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZih0PC1ufHx0Pm4tMSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXhpcy4iKTtpZigtMT09PW8uTlVNQkVSX1RZUEVTLmluZGV4T2YoZVswXS50eXBlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFpZCBpbnB1dCB0eXBlLiIpO2lmKCJpbnQzMiIhPT1lWzFdLnR5cGUmJiJpbnQxNiIhPT1lWzFdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhaWQgaW5wdXQgdHlwZS4iKX07fSw1Mzc4OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZUdlbW1BdHRyaWJ1dGVzVjExPXQucGFyc2VHZW1tQXR0cmlidXRlc1Y3PXQuZ2VtbT12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big3MjczKSxpPW4oNTYzOSk7dC5nZW1tPShlLHQsbik9PihsKHQsbiksW2UucnVuKGEodCxuKSx0KV0pO2NvbnN0IHM9KGUsdCk9Pntjb25zdCBuPTAhPT1lLmF0dHJpYnV0ZXMuZ2V0SW50KCJ0cmFuc0EiLDApLG89MCE9PWUuYXR0cmlidXRlcy5nZXRJbnQoInRyYW5zQiIsMCksaT1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImFscGhhIiwxKSxzPWUuYXR0cmlidXRlcy5nZXRGbG9hdCgiYmV0YSIsMSk7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe3RyYW5zQTpuLHRyYW5zQjpvLGFscGhhOmksYmV0YTpzLGlzT3B0aW9uYWxDOnR9KX07dC5wYXJzZUdlbW1BdHRyaWJ1dGVzVjc9ZT0+cyhlLCExKSx0LnBhcnNlR2VtbUF0dHJpYnV0ZXNWMTE9ZT0+cyhlLCEwKTtjb25zdCBhPShlLHQpPT57Y29uc3Qgbj17bmFtZToiR2VtbSIsaW5wdXROYW1lczozPT09ZS5sZW5ndGg/WyJBIiwiQiIsIkMiXTpbIkEiLCJCIl0saW5wdXRUeXBlczozPT09ZS5sZW5ndGg/W2kuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXTpbaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXSxrZXk6dC5jYWNoZUtleX07cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7Z2V0OigpPT51KG4sZSx0KX0pfSx1PShlLHQsbik9Pntjb25zdCByPXRbMF0uZGltcy5zbGljZSgpLHM9dFsxXS5kaW1zLnNsaWNlKCksW2EsdV09by5HZW1tVXRpbC5nZXRTaGFwZU9mR2VtbVJlc3VsdChyLG4udHJhbnNBLHMsbi50cmFuc0IsMz09PXQubGVuZ3RoP3RbMl0uZGltczp2b2lkIDApLGw9W2EsdV07aWYoIWwpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCB1c2UgZ2VtbSBvbiB0aGUgZ2l2ZW4gdGVuc29ycyIpO2xldCBjPXJbci5sZW5ndGgtMV0scD0iIjtuLnRyYW5zQSYmKGM9clswXSksbi50cmFuc0EmJm4udHJhbnNCP3A9InZhbHVlICs9IF9BX1QoYSkgKiBfQl9UKGIpOyI6bi50cmFuc0EmJiFuLnRyYW5zQj9wPSJ2YWx1ZSArPSBfQV9UKGEpICogX0IoYik7Ijohbi50cmFuc0EmJm4udHJhbnNCP3A9InZhbHVlICs9IF9BKGEpICogX0JfVChiKTsiOm4udHJhbnNBfHxuLnRyYW5zQnx8KHA9InZhbHVlICs9IF9BKGEpICogX0IoYik7Iik7Y29uc3QgZD1sLmxlbmd0aCxmPWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtkfV0pIHtcbiAgICAgICAgICBpbnQgYVske2R9XTtcbiAgICAgICAgICBpbnQgYlske2R9XTtcbiAgICAgICAgICAkezM9PT10Lmxlbmd0aD9gaW50IGNbJHt0WzJdLmRpbXMubGVuZ3RofV07YDoiIn1cblxuICAgICAgICAgIGNvcHlWZWMoaW5kaWNlcywgYSk7XG4gICAgICAgICAgY29weVZlYyhpbmRpY2VzLCBiKTtcbiAgICAgICAgICAkezM9PT10Lmxlbmd0aD8iYmNhc3RJbmRpY2VzX0MoaW5kaWNlcywgYyk7IjoiIn1cblxuICAgICAgICAgIGZsb2F0IHZhbHVlID0gMC4wO1xuICAgICAgICAgIGZvciAoaW50IGs9MDsgazwke2N9OyArK2spIHtcbiAgICAgICAgICAgICAgYVske2QtMX1dID0gaztcbiAgICAgICAgICAgICAgYlske2QtMn1dID0gaztcbiAgICAgICAgICAgICAgJHtwfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiBhbHBoYTtcbiAgICAgICAgICAkezM9PT10Lmxlbmd0aD8idmFsdWUgKz0gYmV0YSAqIF9DKGMpOyI6IiJ9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7b3V0cHV0OntkaW1zOmwsdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sdmFyaWFibGVzOlt7bmFtZToiYWxwaGEiLHR5cGU6ImZsb2F0IixkYXRhOm4uYWxwaGF9LHtuYW1lOiJiZXRhIix0eXBlOiJmbG9hdCIsZGF0YTpuLmJldGF9XSxzaGFkZXJTb3VyY2U6Zn0pfSxsPShlLHQpPT57aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBpcyBtaXNzaW5nIik7aWYodC5pc09wdGlvbmFsQyYmKGUubGVuZ3RoPDJ8fGUubGVuZ3RoPjMpKXRocm93IG5ldyBFcnJvcigiSW52YWlkIGlucHV0IHNoYXBlLiIpO2lmKCF0LmlzT3B0aW9uYWxDJiYzIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJHZW1tIHJlcXVpcmVzIDMgaW5wdXRzIik7aWYoMz09PWUubGVuZ3RoJiYxIT09ZVsyXS5kaW1zLmxlbmd0aCYmMiE9PWVbMl0uZGltcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHNoYXBlIG9mIEMiKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZXx8ImZsb2F0MzIiIT09ZVsxXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzFdLnR5cGV8fDM9PT1lLmxlbmd0aCYmImZsb2F0MzIiIT09ZVsyXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzJdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIik7aWYoZVswXS50eXBlIT09ZVsxXS50eXBlfHwzPT09ZS5sZW5ndGgmJmVbMF0udHlwZSE9PWVbMl0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHR5cGVzIGFyZSBtaXNtYXRjaGVkIil9O30sNTk1MDooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlUGFja2VkSW0yQ29sUHJvZ3JhbUluZm9Mb2FkZXI9dm9pZCAwO2NvbnN0IHI9big2NzU3KSxvPW4oNTYzOSksaT1uKDU2MTQpO3QuY3JlYXRlUGFja2VkSW0yQ29sUHJvZ3JhbUluZm9Mb2FkZXI9KGUsdCxuLHMsYSk9Pntjb25zdCB1PShsPWEuY2FjaGVLZXkse25hbWU6IkltMkNvbCAocGFja2VkKSIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOltvLlRleHR1cmVUeXBlLnBhY2tlZF0sY2FjaGVIaW50Omx9KTt2YXIgbDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHUpLHtnZXQ6KCk9PigoZSx0LG4scyxhLHUpPT57Y29uc3QgbD1uLmRpbXMsYz1zLmRpbXMscD1hLmxlbmd0aCxkPVtjWzFdKmNbMl0qY1szXSxhWzJdKmFbM11dLGY9Y1syXSpjWzNdLGg9KDAsIGkudW5wYWNrRnJvbUNoYW5uZWwpKCksZz0oMCwgci5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbik7bGV0IGI9IiI7Zm9yKGxldCBlPTA7ZTw9MTtlKyspZm9yKGxldCB0PTA7dDw9MTt0KyspYis9YFxuICAgICAgICAgICAgYmxvY2tJbmRleCA9IHJjLnggKyAke3R9O1xuICAgICAgICAgICAgcG9zID0gcmMueSArICR7ZX07XG5cbiAgICAgICAgICAgIGlmKGJsb2NrSW5kZXggPCAke2RbMV19ICYmIHBvcyA8ICR7ZFswXX0pIHtcbiAgICAgICAgICAgICAgb2Zmc2V0WSA9IGludChibG9ja0luZGV4IC8gKCR7YVtwLTFdfSkpICogJHt1LnN0cmlkZXNbMF19IC1cbiAgICAgICAgICAgICAgICAke3UucGFkc1swXX07XG4gICAgICAgICAgICAgIGQwID0gb2Zmc2V0WSArICR7dS5kaWxhdGlvbnNbMF19ICogKGltb2QocG9zLCAke2Z9KSAvICR7Y1syXX0pO1xuXG4gICAgICAgICAgICAgIGlmKGQwIDwgJHtsWzJdfSAmJiBkMCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0WCA9IGltb2QoYmxvY2tJbmRleCwgJHthW3AtMV19KSAqICR7dS5zdHJpZGVzWzFdfSAtXG4gICAgICAgICAgICAgICAgICAke3UucGFkc1sxXX07XG4gICAgICAgICAgICAgICAgZDEgPSBvZmZzZXRYICsgJHt1LmRpbGF0aW9uc1sxXX0gKiBpbW9kKGltb2QocG9zLCAke2Z9KSwgJHtjWzJdfSk7XG5cbiAgICAgICAgICAgICAgICBpZihkMSA8ICR7bFszXX0gJiYgZDEgPj0gMCkge1xuXG4gICAgICAgICAgICAgICAgICBjaCA9IGludChmbG9hdChwb3MpLyAke2Z9Lik7XG4gICAgICAgICAgICAgICAgICAgIGlubmVyRGltcyA9IHZlYzIoZDAsIGQxKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0WyR7MiplK3R9XSA9IGdldENoYW5uZWwoXG4gICAgICAgICAgICAgICAgICAgICAgZ2V0QSgwLCBjaCwgaW50KGlubmVyRGltcy54KSxcbiAgICAgICAgICAgICAgICAgICAgICBpbnQoaW5uZXJEaW1zLnkpKSwgaW5uZXJEaW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGA7Y29uc3QgbT1gXG4gICAgICAke2h9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzIgcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4wKTtcbiAgICAgICAgICBpbnQgYmxvY2tJbmRleCwgcG9zLCBvZmZzZXRZLCBkMCwgb2Zmc2V0WCwgZDEsIGNoO1xuICAgICAgICAgIHZlYzIgaW5uZXJEaW1zO1xuICAgICAgICAgICR7Yn1cbiAgICAgICAgICAke2cub3V0cHV0fSA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgICAgICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7b3V0cHV0OntkaW1zOmQsdHlwZTpuLnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS5wYWNrZWR9LHNoYWRlclNvdXJjZTptLGhhc01haW46ITB9KX0pKGUsdSx0LG4scyxhKX0pfTt9LDE2MjU6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNhbGN1bGF0ZUltMkNvbERpbXM9dC5jcmVhdGVJbTJDb2xQcm9ncmFtSW5mb0xvYWRlcj12b2lkIDA7Y29uc3Qgcj1uKDU2MzkpO3QuY3JlYXRlSW0yQ29sUHJvZ3JhbUluZm9Mb2FkZXI9KGUsbixvLGkscyk9Pntjb25zdCBhPSh1PXMuY2FjaGVLZXkse25hbWU6IkltMkNvbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltyLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6dX0pO3ZhciB1O3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2dldDooKT0+KChlLG4sbyxpLHMsYSk9Pntjb25zdCB1PW8uZGltcyxsPWkuZGltcyxjPXMubGVuZ3RoLHA9KDAsIHQuY2FsY3VsYXRlSW0yQ29sRGltcykodSxsLHMsNCksZD1gXG4gICAgICAgIGNvbnN0IGludCBYQyA9ICR7dVsxXX07XG4gICAgICAgIGNvbnN0IGludCBYSCA9ICR7dVsyXX07XG4gICAgICAgIGNvbnN0IGludCBYVyA9ICR7dVszXX07XG4gICAgICAgIGNvbnN0IGludCBLSCA9ICR7YS5rZXJuZWxTaGFwZVswXX07XG4gICAgICAgIGNvbnN0IGludCBLVyA9ICR7YS5rZXJuZWxTaGFwZVsxXX07XG4gICAgICAgIGNvbnN0IGludCBkaWxhdGlvbkggPSAke2EuZGlsYXRpb25zWzBdfTtcbiAgICAgICAgY29uc3QgaW50IGRpbGF0aW9uVyA9ICR7YS5kaWxhdGlvbnNbMV19O1xuICAgICAgICBjb25zdCBpbnQgc3RyaWRlSCA9ICR7YS5zdHJpZGVzWzBdfTtcbiAgICAgICAgY29uc3QgaW50IHN0cmlkZVcgPSAke2Euc3RyaWRlc1sxXX07XG4gICAgICAgIGNvbnN0IGludCBwYWRIID0gJHthLnBhZHNbMF19O1xuICAgICAgICBjb25zdCBpbnQgcGFkVyA9ICR7YS5wYWRzWzFdfTtcbiAgICAgICAgY29uc3QgaW50IEtIS1cgPSBLSCpLVztcbiAgICAgICAgY29uc3QgaW50IFhDS0hLVyA9IFhDICogS0hLVztcbiAgICAgICAgY29uc3QgaW50IG91dHB1dENoYW5uZWxzID0gNDtcbiAgICAgICAgdmVjNCBwcm9jZXNzKGludCBpbmRpY2VzWyR7Y31dKSB7XG4gICAgICAgICAgaW50IGIgID0gaW5kaWNlc1swXTsgLy8gYmF0Y2ggc2l6ZVxuICAgICAgICAgIGludCBvaCA9IGluZGljZXNbMV0gKiBzdHJpZGVIIC0gcGFkSDsgLy9vdXRwdXQgaGVpZ2h0XG4gICAgICAgICAgaW50IG93ID0gaW5kaWNlc1syXSAqIHN0cmlkZVcgLSBwYWRXOyAvL291dHB1dCB3aWR0aFxuICAgICAgICAgIGludCBwID0gaW5kaWNlc1szXSAqIG91dHB1dENoYW5uZWxzOyAvL3BhdGNoXG4gICAgICAgICAgdmVjNCB2YWx1ZSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICBmb3IoaW50IGk9MDsgaSA8IG91dHB1dENoYW5uZWxzOyArK2kpIHtcbiAgICAgICAgICAgIGlmKHAgPCBYQ0tIS1cpIHtcbiAgICAgICAgICAgICAgaW50IHBhdGNoQyA9IHAgLyBLSEtXO1xuICAgICAgICAgICAgICBpbnQgcGF0Y2hIID0gKHAgLSBwYXRjaEMqS0hLVykgLyBLVztcbiAgICAgICAgICAgICAgaW50IHBhdGNoVyA9IChwIC0gcGF0Y2hDKktIS1cpIC0gcGF0Y2hIICogS1c7XG4gICAgICAgICAgICAgIGludCB4aDIgPSBvaCArIHBhdGNoSCAqIGRpbGF0aW9uSDtcbiAgICAgICAgICAgICAgaW50IHh3MiA9IG93ICsgcGF0Y2hXICogZGlsYXRpb25XO1xuICAgICAgICAgICAgICBpbnQgeFske3UubGVuZ3RofV07XG4gICAgICAgICAgICAgIHhbMF0gPSBiO1xuICAgICAgICAgICAgICB4WzFdID0gcGF0Y2hDO1xuICAgICAgICAgICAgICB4WzJdID0geGgyO1xuICAgICAgICAgICAgICB4WzNdID0geHcyO1xuICAgICAgICAgICAgICBpZih4aDIgPj0gMCAmJlxuICAgICAgICAgICAgICAgICAgeGgyIDwgWEggJiZcbiAgICAgICAgICAgICAgICAgIHh3MiA+PSAwICYmXG4gICAgICAgICAgICAgICAgICB4dzIgPCBYVykge1xuICAgICAgICAgICAgICAgIHZhbHVlW2ldID0gX1goeCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICsrcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7b3V0cHV0OntkaW1zOnAsdHlwZTpvLnR5cGUsdGV4dHVyZVR5cGU6ci5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9ufSxzaGFkZXJTb3VyY2U6ZH0pfSkoMCxhLG4sbyxpLHMpfSl9LHQuY2FsY3VsYXRlSW0yQ29sRGltcz0oZSx0LG4scj00KT0+W25bMF0sblsyXSxuWzNdLE1hdGguY2VpbChlWzFdKnRbMl0qdFszXS9yKV07fSw2OTgxOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZUltYWdlU2NhbGVyQXR0cmlidXRlcz10LmltYWdlU2NhbGVyPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDU2MzkpO3QuaW1hZ2VTY2FsZXI9KGUsdCxuKT0+KHUodCksW2UucnVuKHMoZSx0LG4pLHQpXSksdC5wYXJzZUltYWdlU2NhbGVyQXR0cmlidXRlcz1lPT57Y29uc3QgdD1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoInNjYWxlIiksbj1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXRzKCJiaWFzIik7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe3NjYWxlOnQsYmlhczpufSl9O2NvbnN0IGk9e25hbWU6IkltYWdlU2NhbGVyIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWRdfSxzPShlLHQsbik9Pntjb25zdCByPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXl9KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHIpLHtnZXQ6KCk9PigoZSx0LG4scik9Pntjb25zdCBpPW5bMF0uZGltcy5zbGljZSgpLHM9aS5sZW5ndGgsdT1gXG4gICAgICAke2Eoci5iaWFzLmxlbmd0aCl9XG4gICAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7c31dKSB7XG4gICAgICAgIHJldHVybiBfWChpbmRpY2VzKSAqIHNjYWxlICsgZ2V0QmlhcyhiaWFzLCBpbmRpY2VzWzFdKTtcbiAgICAgIH1gO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse291dHB1dDp7ZGltczppLHR5cGU6blswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LHZhcmlhYmxlczpbe25hbWU6ImJpYXMiLHR5cGU6ImZsb2F0IixhcnJheUxlbmd0aDpyLmJpYXMubGVuZ3RoLGRhdGE6ci5iaWFzfSx7bmFtZToic2NhbGUiLHR5cGU6ImZsb2F0IixkYXRhOnIuc2NhbGV9XSxzaGFkZXJTb3VyY2U6dX0pfSkoMCxyLHQsbil9KX0sYT1lPT57Y29uc3QgdD1bYGZsb2F0IGdldEJpYXMoZmxvYXQgYmlhc1ske2V9XSwgaW50IGNoYW5uZWwpIHtgXTtmb3IobGV0IG49MDtuPGU7KytuKTA9PT1uP3QucHVzaChgXHRpZiAoY2hhbm5lbCA9PSAke259KSB7IHJldHVybiBiaWFzWyR7bn1dOyB9YCk6bj09PWUtMT90LnB1c2goYFx0ZWxzZSB7IHJldHVybiBiaWFzWyR7bn1dOyB9YCk6dC5wdXNoKGBcdGVsc2UgaWYgKGNoYW5uZWwgPT0gJHtufSkgeyByZXR1cm4gYmlhc1ske259XTsgfWApO3JldHVybiB0LnB1c2goIlx0fSIpLHQuam9pbigiXG4iKX0sdT1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkltYWdlU2NhbGVyIHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoNCE9PWVbMF0uZGltcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHNoYXBlLiIpO2lmKCJmbG9hdDMyIiE9PWVbMF0udHlwZSYmImZsb2F0NjQiIT09ZVswXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDc0MTM6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlSW5zdGFuY2VOb3JtYWxpemF0aW9uQXR0cmlidXRlcz10Lmluc3RhbmNlTm9ybWFsaXphdGlvbj12b2lkIDA7Y29uc3Qgcj1uKDY3NTcpLG89big1NjM5KTt0Lmluc3RhbmNlTm9ybWFsaXphdGlvbj0oZSx0LG4pPT57bCh0KTtjb25zdCByPWUucnVuKHModFswXSksdCk7cmV0dXJuIFtlLnJ1bih1KGUsdFswXSxuLHIuZGltcyksW3RbMF0scix0WzFdLHRbMl1dKV19LHQucGFyc2VJbnN0YW5jZU5vcm1hbGl6YXRpb25BdHRyaWJ1dGVzPWU9PmUuYXR0cmlidXRlcy5nZXRGbG9hdCgiZXBzaWxvbiIsMWUtNSk7Y29uc3QgaT17bmFtZToiSW5zdGFuY2VOb3JtYWxpemF0aW9uX01lYW5BbmRWYXJpYW5jZSIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltvLlRleHR1cmVUeXBlLnVucGFja2VkXX0scz1lPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSkse2dldDooKT0+KChlLHQpPT57Y29uc3Qgbj10LmRpbXMuc2xpY2UoKSxyPW5bMV0saT1uWzJdKm5bM10scz1bblswXSxyXSxhPWBcbiAgICAgIHZlYzQgcHJvY2VzcyhpbnRbMl0gaW5kaWNlcykge1xuICAgICAgICB2ZWM0IHYgPSB2ZWM0KDAuMCk7XG4gICAgICAgIGludCBhWzRdO1xuICAgICAgICBhWzBdID0gaW5kaWNlc1swXTtcbiAgICAgICAgYVsxXSA9IGluZGljZXNbMV07XG4gICAgICAgIGZsb2F0IHRlbXAgPSAwLjA7XG4gICAgICAgIGZvcihpbnQgYTI9MDsgYTI8JHtuWzJdfTsgYTIrKykge1xuICAgICAgICAgIGFbMl0gPSBhMjtcbiAgICAgICAgICBmb3IoaW50IGEzPTA7IGEzPCR7blszXX07IGEzKyspIHtcbiAgICAgICAgICAgIGFbM10gPSBhMztcbiAgICAgICAgICAgIGZsb2F0IHggPSBfWChhKTtcbiAgICAgICAgICAgIHRlbXAgKz0geDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmxvYXQgbWVhbiA9IHRlbXAgLyBmbG9hdCgke2l9KTtcbiAgICAgICAgdGVtcCA9IDAuMDtcbiAgICAgICAgZm9yKGludCBhMj0wOyBhMjwke25bMl19OyBhMisrKSB7XG4gICAgICAgICAgYVsyXSA9IGEyO1xuICAgICAgICAgIGZvcihpbnQgYTM9MDsgYTM8JHtuWzNdfTsgYTMrKykge1xuICAgICAgICAgICAgYVszXSA9IGEzO1xuICAgICAgICAgICAgZmxvYXQgeCA9IF9YKGEpO1xuICAgICAgICAgICAgdGVtcCArPSAoeCAtIG1lYW4pICogKHggLSBtZWFuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdi5yID0gbWVhbjtcbiAgICAgICAgdi5nID0gdGVtcCAvIGZsb2F0KCR7aX0pO1xuXG4gICAgICAgIHJldHVybiB2O1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7b3V0cHV0OntkaW1zOnMsdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9ufSxzaGFkZXJTb3VyY2U6YX0pfSkoaSxlKX0pLGE9e25hbWU6Ikluc3RhbmNlTm9ybWFsaXphdGlvbl9Db21wdXRlT3V0cHV0IixpbnB1dE5hbWVzOlsiWCIsIk1lYW5BbmRWYXJpYW5jZSIsIlNjYWxlIiwiQiJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWQsby5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uLG8uVGV4dHVyZVR5cGUudW5wYWNrZWQsby5UZXh0dXJlVHlwZS51bnBhY2tlZF19LHU9KGUsdCxuLGkpPT57Y29uc3Qgcz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpgJHtufWB9KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtnZXQ6KCk9PigoZSx0LG4saSxzKT0+e2NvbnN0IGE9KDAsIHIuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFt1LGxdPWUuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KHMsby5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKSxbYyxwXT1bdS80LGxdLGQ9YFxuICAgICAgdmVjNCBnZXRfTWVhbkFuZFZhcmlhbmNlKGludFsyXSBtdikge1xuICAgICAgICBpbnQgb2Zmc2V0ID0gaW5kaWNlc1RvT2Zmc2V0X01lYW5BbmRWYXJpYW5jZShtdik7XG4gICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke2N9LCAke3B9KTtcbiAgICAgICAgcmV0dXJuICR7YS50ZXh0dXJlMkR9KE1lYW5BbmRWYXJpYW5jZSwgY29vcmRzKTtcbiAgICAgIH1cblxuICAgICAgZmxvYXQgcHJvY2VzcyhpbnRbNF0gaW5kaWNlcykge1xuICAgICAgICBpbnQgbXZbMl07XG4gICAgICAgIG12WzBdID0gaW5kaWNlc1swXTtcbiAgICAgICAgbXZbMV0gPSBpbmRpY2VzWzFdO1xuICAgICAgICB2ZWM0IG1lYW5fYW5kX3ZhcmlhbmNlID0gZ2V0X01lYW5BbmRWYXJpYW5jZShtdik7XG4gICAgICAgIGZsb2F0IG1lYW4gPSBtZWFuX2FuZF92YXJpYW5jZS5yO1xuICAgICAgICBmbG9hdCB2YXJpYW5jZSA9IG1lYW5fYW5kX3ZhcmlhbmNlLmc7XG5cbiAgICAgICAgaW50IHNiWzFdO1xuICAgICAgICBzYlswXSA9IGluZGljZXNbMV07XG4gICAgICAgIGZsb2F0IHNjYWxlID0gX1NjYWxlKHNiKTtcbiAgICAgICAgZmxvYXQgYiA9IF9CKHNiKTtcblxuICAgICAgICByZXR1cm4gc2NhbGUgKiAoX1goaW5kaWNlcykgLSBtZWFuKSAvIHNxcnQodmFyaWFuY2UgKyBlcHNpbG9uKSArIGI7XG4gICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvdXRwdXQ6e2RpbXM6bi5kaW1zLHR5cGU6bi50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LHZhcmlhYmxlczpbe25hbWU6ImVwc2lsb24iLHR5cGU6ImZsb2F0IixkYXRhOml9XSxzaGFkZXJTb3VyY2U6ZH0pfSkoZSxzLHQsbixpKX0pfSxsPWU9PntpZighZXx8MyE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW5zdGFuY2VOb3JtYWxpemF0aW9uIHJlcXVpcmVzIDMgaW5wdXRzLiIpO2NvbnN0IHQ9ZVswXSxuPWVbMV0scj1lWzJdO2lmKHQuZGltcy5sZW5ndGg8M3x8MSE9PW4uZGltcy5sZW5ndGh8fDEhPT1yLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZihuLmRpbXNbMF0hPT10LmRpbXNbMV18fHIuZGltc1swXSE9PXQuZGltc1sxXSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHNoYXBlcyBhcmUgbWlzbWF0Y2hlZC4iKTtpZigiZmxvYXQzMiIhPT10LnR5cGUmJiJmbG9hdDY0IiE9PXQudHlwZXx8ImZsb2F0MzIiIT09bi50eXBlJiYiZmxvYXQ2NCIhPT1uLnR5cGV8fCJmbG9hdDMyIiE9PXIudHlwZSYmImZsb2F0NjQiIT09ci50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKDQhPT1lWzBdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiT25seSBzdXBwb3J0IDQtRCBpbnB1dCBzaGFwZS4iKX07fSw3MDA2OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jcmVhdGVMcm5Qcm9ncmFtSW5mb0xvYWRlcj10LnBhcnNlTHJuQXR0cmlidXRlcz10Lmxybj12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big1NjM5KTt0Lmxybj0oZSx0LG4pPT4oYSh0KSxbZS5ydW4ocyh0LG4pLHQpXSksdC5wYXJzZUxybkF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJhbHBoYSIsMWUtNCksbj1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImJldGEiLC43NSksbz1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImJpYXMiLDEpLGk9ZS5hdHRyaWJ1dGVzLmdldEludCgic2l6ZSIpO3JldHVybiAoMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHthbHBoYTp0LGJldGE6bixiaWFzOm8sc2l6ZTppfSl9O2NvbnN0IGk9e25hbWU6IkxSTiIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltvLlRleHR1cmVUeXBlLnVucGFja2VkXX07ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSkse2NhY2hlSGludDp0LmNhY2hlS2V5LGdldDooKT0+ZnVuY3Rpb24oZSx0KXtjb25zdCBuPWVbMF0uZGltc1sxXSxyPWVbMF0uZGltcy5sZW5ndGgscz0tTWF0aC5mbG9vcigodC5zaXplLTEpLzIpLGE9TWF0aC5jZWlsKCh0LnNpemUtMSkvMiksdT1gZmxvYXQoJHt0LmFscGhhfSkgLyBmbG9hdCgke3Quc2l6ZX0pYCxsPWBcbiAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7cn1dKSB7XG4gICAgICAgIGludCBjID0gaW5kaWNlc1sxXTtcbiAgICAgICAgZmxvYXQgeCA9IF9YKGluZGljZXMpO1xuICAgICAgICBmbG9hdCBzcXVhcmVfc3VtID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAke3N9OyBpIDw9ICR7YX07IGkrKykge1xuICAgICAgICAgIGludCBpZHggPSBjICsgaTtcbiAgICAgICAgICBpZiAoYyA+PSAwICYmIGMgPCAke259KSB7XG4gICAgICAgICAgICBpbmRpY2VzWzFdID0gaWR4O1xuICAgICAgICAgICAgZmxvYXQgaiA9IF9YKGluZGljZXMpO1xuICAgICAgICAgICAgc3F1YXJlX3N1bSArPSBqICogajtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggLyBwb3coZmxvYXQoJHt0LmJpYXN9KSArICR7dX0gKiBzcXVhcmVfc3VtLCBmbG9hdCgke3QuYmV0YX0pKTtcbiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGkpLHtjYWNoZUhpbnQ6dC5jYWNoZUtleSxvdXRwdXQ6e2RpbXM6ZVswXS5kaW1zLHR5cGU6ZVswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpsfSl9KGUsdCl9KX10LmNyZWF0ZUxyblByb2dyYW1JbmZvTG9hZGVyPXM7Y29uc3QgYT1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkxSTiByZXF1aXJlcyAxIGlucHV0LiIpO2lmKDQhPT1lWzBdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcignY3VycmVudGx5IG9ubHkgc3VwcG9ydCBMUk4gZm9yIGlucHV0IHdpdGggIk5DSFciIGZvcm1hdCcpO2lmKCJmbG9hdDMyIiE9PWVbMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoImlucHV0IHNob3VsZCBiZSBmbG9hdCB0eXBlIil9O30sNTYzMjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlUGFja2VkTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXI9dm9pZCAwO2NvbnN0IHI9big3MjczKSxvPW4oNjc1NyksaT1uKDU2MzkpLHM9big0MzIpLGE9bigyMTUwKSx1PW4oODI3Nik7dC5jcmVhdGVQYWNrZWRNYXRtdWxQcm9ncmFtSW5mb0xvYWRlcj0oZSx0LG4pPT57Y29uc3QgbD0oYz10Lmxlbmd0aD4yLHA9bi5hY3RpdmF0aW9uQ2FjaGVLZXkse25hbWU6Ik1hdE11bCAocGFja2VkKSIsaW5wdXROYW1lczpjP1siQSIsIkIiLCJCaWFzIl06WyJBIiwiQiJdLGlucHV0VHlwZXM6Yz9baS5UZXh0dXJlVHlwZS5wYWNrZWQsaS5UZXh0dXJlVHlwZS5wYWNrZWQsaS5UZXh0dXJlVHlwZS5wYWNrZWRdOltpLlRleHR1cmVUeXBlLnBhY2tlZCxpLlRleHR1cmVUeXBlLnBhY2tlZF0sY2FjaGVIaW50OnB9KTt2YXIgYyxwO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbCkse2dldDooKT0+KChlLHQsbixsKT0+e2NvbnN0IGM9bi5sZW5ndGg+MixwPWM/InZhbHVlICs9IGdldEJpYXNGb3JNYXRtdWwoKTsiOiIiLGQ9blswXS5kaW1zLGY9blsxXS5kaW1zLGg9ci5Ccm9hZGNhc3RVdGlsLmNhbGNTaGFwZShkLGYsITApLGc9IXIuU2hhcGVVdGlsLmFyZUVxdWFsKG5bMF0uZGltcyxuWzFdLmRpbXMpO2lmKCFoKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgdXNlIG1hdG11bCBvbiB0aGUgZ2l2ZW4gdGVuc29ycyIpO2NvbnN0IGI9ZFtkLmxlbmd0aC0xXSxtPU1hdGguY2VpbChiLzIpLHk9ZC5sZW5ndGgsdj1mLmxlbmd0aCxfPSgwLCBvLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSx3PSgwLCBzLmdldENvb3Jkc0RhdGFUeXBlKShoLmxlbmd0aCksVD1oLmxlbmd0aCx4PSgwLCBzLmdldEdsQ2hhbm5lbHMpKCkse2FjdGl2YXRpb25GdW5jdGlvbjpPLGFwcGx5QWN0aXZhdGlvbjpTfT0oMCwgYS5nZXRBY3RpdmF0aW9uU25pcHBldCkobCksQT1jP2AkeygwLCB1LmdldEJpYXNGb3JNYXRtdWwpKHcseCxuWzJdLmRpbXMsaCwhMCl9YDoiIixQPWc/YCR7ZnVuY3Rpb24oZSx0LG4sbyl7bGV0IGk9W10scz1bXTtjb25zdCBhPW5bMF0uZGltcyx1PW5bMV0uZGltcyxsPWEubGVuZ3RoLGM9dS5sZW5ndGgscD1vLmxlbmd0aCxkPXAtbCxmPXAtYztpPWEubWFwKCgoZSxuKT0+YGNvb3Jkcy4ke3RbbitkXX1gKSksaVtsLTFdPSJpKjIiLGkuam9pbigiLCAiKSxzPXUubWFwKCgoZSxuKT0+YGNvb3Jkcy4ke3RbbitmXX1gKSksc1tjLTJdPSJpKjIiLHMuam9pbigiLCAiKTtjb25zdCBoPXIuQnJvYWRjYXN0VXRpbC5nZXRCcm9hZGNhc3REaW1zKGEsbyksZz1yLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyh1LG8pLGI9aC5tYXAoKGU9PmBjb29yZHMuJHt0W2UrZF19ID0gMDtgKSkuam9pbigiXG4iKSxtPWcubWFwKChlPT5gY29vcmRzLiR7dFtlK2ZdfSA9IDA7YCkpLmpvaW4oIlxuIikseT1gaW50IGxhc3REaW0gPSBjb29yZHMuJHt0W3AtMV19O1xuICBjb29yZHMuJHt0W3AtMV19ID0gY29vcmRzLiR7dFtwLTJdfTtcbiAgY29vcmRzLiR7dFtwLTJdfSA9IGxhc3REaW07YDtyZXR1cm4gYFxudmVjNCBnZXRBQXRPdXRDb29yZHNNYXRtdWwoaW50IGkpIHtcbiAgJHtlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgJHt5fVxuICAke2J9XG4gIHZlYzQgb3V0cHV0VmFsdWUgPSBnZXRBKCR7aX0pO1xuICByZXR1cm4gb3V0cHV0VmFsdWU7XG59XG5cbnZlYzQgZ2V0QkF0T3V0Q29vcmRzTWF0bXVsKGludCBpKSB7XG4gICR7ZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICR7eX1cbiAgJHttfVxuICB2ZWM0IG91dHB1dFZhbHVlID0gZ2V0Qigke3N9KTtcbiAgcmV0dXJuIG91dHB1dFZhbHVlO1xufWB9KHcseCxuLGgpfWA6IiIsST1nPyJnZXRBQXRPdXRDb29yZHNNYXRtdWwoaSkiOmBnZXRBKCR7ZnVuY3Rpb24oZSx0KXtsZXQgbj0iIjtmb3IobGV0IHI9MDtyPHQtMjtyKyspbis9YHJjLiR7ZVtyXX0sIGA7cmV0dXJuIG4rPWByYy4ke2VbdC0yXX0sIGkqMmAsbn0oeCx5KX0pYCxFPWc/ImdldEJBdE91dENvb3Jkc01hdG11bChpKSI6YGdldEIoJHtmdW5jdGlvbihlLHQpe2xldCBuPSIiO2ZvcihsZXQgcj0wO3I8dC0yO3IrKyluKz1gcmMuJHtlW3JdfSwgYDtyZXR1cm4gbis9YGkqMiwgcmMuJHtlW3QtMV19YCxufSh4LHYpfSlgLEQ9YFxuICAgICAgICAgICAgJHtQfVxuICAgICAgICAgICAgJHtBfVxuICAgICAgICAgICAgJHtPfVxuICAgICAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICAgICAke2c/IiI6YCR7d30gcmMgPVxuICAgICAgICAgIGdldE91dHB1dENvb3JkcygpOyBpbnQgbGFzdERpbSA9IHJjLiR7eFtULTFdfTsgcmMuJHt4W1QtMV19ID1cbiAgICAgICAgICByYy4ke3hbVC0yXX07IHJjLiR7eFtULTJdfSA9IGxhc3REaW07XG4gICAgICBgfVxuXG4gICAgICAgICAgICAgIHZlYzQgdmFsdWUgPSB2ZWM0KDApO1xuICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7bX07IGkrKykge1xuICAgICAgICAgICAgICAgIHZlYzQgYSA9ICR7SX07XG4gICAgICAgICAgICAgICAgdmVjNCBiID0gJHtFfTtcblxuICAgICAgICAgICAgICAgIHZhbHVlICs9IChhLnJyYmIgKiBiLnJncmcpO1xuICAgICAgICAgICAgICAgIHZhbHVlICs9IChhLmdnYWEgKiBiLmJhYmEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICR7cH1cbiAgICAgICAgICAgICAgJHtTfVxuICAgICAgICAgICAgICAke18ub3V0cHV0fSA9IHZhbHVlO1xuICAgICAgICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7b3V0cHV0OntkaW1zOmgsdHlwZTpuWzBdLnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS5wYWNrZWR9LHNoYWRlclNvdXJjZTpELGhhc01haW46ITB9KX0pKGUsbCx0LG4pfSl9O30sODI3NjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0Qmlhc0Zvck1hdG11bD10LmNyZWF0ZU1hdG11bFByb2dyYW1JbmZvTG9hZGVyPXQucGFyc2VNYXRNdWxBdHRyaWJ1dGVzPXQubWF0TXVsPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDU2MzkpLGk9big0MzIpLHM9bigyMTUwKSxhPW4oNTYzMik7dC5tYXRNdWw9KGUsdCxuKT0+KGModCksZS5zZXNzaW9uLnBhY2s/W2UucnVuKCgwLCBhLmNyZWF0ZVBhY2tlZE1hdG11bFByb2dyYW1JbmZvTG9hZGVyKShlLHQsbiksdCldOltlLnJ1bihsKHQsbiksdCldKSx0LnBhcnNlTWF0TXVsQXR0cmlidXRlcz1lPT4oMCwgcy5wYXJzZUludGVybmFsQWN0aXZhdGlvbkF0dHJpYnV0ZXMpKGUuYXR0cmlidXRlcyk7Y29uc3QgdT0oZSx0KT0+KHtuYW1lOiJNYXRNdWwiLGlucHV0TmFtZXM6ZT9bIkEiLCJCIiwiQmlhcyJdOlsiQSIsIkIiXSxpbnB1dFR5cGVzOmU/W28uVGV4dHVyZVR5cGUudW5wYWNrZWQsby5UZXh0dXJlVHlwZS51bnBhY2tlZCxvLlRleHR1cmVUeXBlLnVucGFja2VkXTpbby5UZXh0dXJlVHlwZS51bnBhY2tlZCxvLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6dH0pO2Z1bmN0aW9uIGwoZSx0KXtjb25zdCBuPXUoZS5sZW5ndGg+Mix0LmFjdGl2YXRpb25DYWNoZUtleSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7Z2V0OigpPT5mdW5jdGlvbihlLHQsbil7Y29uc3QgYT10WzBdLmRpbXMsdT10WzFdLmRpbXMsbD1yLkJyb2FkY2FzdFV0aWwuY2FsY1NoYXBlKGEsdSwhMCk7aWYoIWwpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCB1c2UgbWF0bXVsIG9uIHRoZSBnaXZlbiB0ZW5zb3JzIik7Y29uc3QgYz0oMCwgaS5nZXRDb29yZHNEYXRhVHlwZSkobC5sZW5ndGgpLGQ9KDAsIGkuZ2V0R2xDaGFubmVscykoKSx7YWN0aXZhdGlvbkZ1bmN0aW9uOmYsYXBwbHlBY3RpdmF0aW9uOmh9PSgwLCBzLmdldEFjdGl2YXRpb25TbmlwcGV0KShuKSxnPXQubGVuZ3RoPjIsYj1nPyJ2YWx1ZSArPSBnZXRCaWFzRm9yTWF0bXVsKCk7IjoiIixtPWc/YCR7cChjLGQsdFsyXS5kaW1zLGwsITEpfWA6IiIseT1sLmxlbmd0aCx2PWEubGVuZ3RoLF89dS5sZW5ndGgsdz1gXG4gICAgJHtmfVxuICAgICR7bX1cbiAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7eX1dKSB7XG4gICAgICAgIGludCBhWyR7dn1dO1xuICAgICAgICBpbnQgYlske199XTtcbiAgICAgICAgYmNhc3RNYXRtdWxJbmRpY2VzX0EoaW5kaWNlcywgYSk7XG4gICAgICAgIGJjYXN0TWF0bXVsSW5kaWNlc19CKGluZGljZXMsIGIpO1xuXG4gICAgICAgIGZsb2F0IHZhbHVlO1xuICAgICAgICBmb3IgKGludCBrPTA7IGs8JHthW2EubGVuZ3RoLTFdfTsgKytrKSB7XG4gICAgICAgICAgICBhWyR7di0xfV0gPSBrO1xuICAgICAgICAgICAgYlske18tMn1dID0gaztcbiAgICAgICAgICAgIHZhbHVlICs9IF9BKGEpICogX0IoYik7XG4gICAgICAgIH1cbiAgICAgICAgJHtifVxuICAgICAgICAke2h9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHtvdXRwdXQ6e2RpbXM6bCx0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTpvLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6d30pfShuLGUsdCl9KX10LmNyZWF0ZU1hdG11bFByb2dyYW1JbmZvTG9hZGVyPWw7Y29uc3QgYz1lPT57aWYoIWV8fDIhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk1hdE11bCByZXF1aXJlcyAyIGlucHV0cy4iKTtpZihlWzBdLmRpbXNbZVswXS5kaW1zLmxlbmd0aC0xXSE9PWVbMV0uZGltc1tlWzFdLmRpbXMubGVuZ3RoLTJdKXRocm93IG5ldyBFcnJvcigic2hhcmVkIGRpbWVuc2lvbiBkb2VzIG5vdCBtYXRjaC4iKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZXx8ImZsb2F0MzIiIT09ZVsxXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzFdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnB1dHMgc2hvdWxkIGJlIGZsb2F0IHR5cGUiKTtpZihlWzBdLnR5cGUhPT1lWzFdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnB1dHMgdHlwZXMgc2hvdWxkIG1hdGNoIil9O2Z1bmN0aW9uIHAoZSx0LG4sbyxpKXtsZXQgcz0iIjtjb25zdCBhPW4ubGVuZ3RoLHU9by5sZW5ndGgsbD11LWE7cz11PDImJmE+MD8iY29vcmRzIjpuLm1hcCgoKGUsbik9PmBjb29yZHMuJHt0W24rbF19YCkpLmpvaW4oIiwgIik7Y29uc3QgYz1yLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyhuLG8pLm1hcCgoZT0+YGNvb3Jkcy4ke3RbZStsXX0gPSAwO2ApKS5qb2luKCJcbiIpO2xldCBwPSJ2ZWM0KG91dHB1dFZhbHVlLnh4LCBvdXRwdXRWYWx1ZS55eSkiO3JldHVybiAxPT09ci5TaGFwZVV0aWwuc2l6ZShuKSYmKHA9InZlYzQob3V0cHV0VmFsdWUueCkiKSxpP2BcbnZlYzQgZ2V0Qmlhc0Zvck1hdG11bCgpIHtcbiAgJHtlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgJHtjfVxuICB2ZWM0IG91dHB1dFZhbHVlID0gZ2V0Qmlhcygke3N9KTtcbiAgcmV0dXJuICR7cH07XG59YDpgXG5mbG9hdCBnZXRCaWFzRm9yTWF0bXVsKCkge1xuICAke2V9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAke2N9XG4gIHJldHVybiBnZXRCaWFzKGNvb3Jkcy54KTtcbn1gfXQuZ2V0Qmlhc0Zvck1hdG11bD1wO30sOTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlUGFja1Byb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCByPW4oNjc1Nyksbz1uKDU2MzkpLGk9big0MzIpLHM9big1NjE0KSxhPXtuYW1lOiJwYWNrIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWRSZXZlcnNlZF19O3QuY3JlYXRlUGFja1Byb2dyYW1JbmZvTG9hZGVyPShlLHQpPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2dldDooKT0+KChlLHQpPT57Y29uc3Qgbj0oMCwgci5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksdT10LmRpbXMsbD11Lmxlbmd0aCxjPXQuZGltcy5sZW5ndGgscD0oMCwgaS5nZXRDb29yZHNEYXRhVHlwZSkoYyksZD0oMCwgcy5nZXRDaGFubmVscykoInJjIixjKSxmPShoPWMsZz1kLGI9dVt1Lmxlbmd0aC0yXSxtPXVbdS5sZW5ndGgtMV0sMD09PWh8fDE9PT1oPyIiOmBcbiAgICBpbnQgciA9ICR7Z1toLTJdfTtcbiAgICBpbnQgYyA9ICR7Z1toLTFdfTtcbiAgICBpbnQgcnAxID0gJHtnW2gtMl19ICsgMTtcbiAgICBpbnQgY3AxID0gJHtnW2gtMV19ICsgMTtcbiAgICBib29sIHJFZGdlID0gcnAxID49ICR7bX07XG4gICAgYm9vbCBjRWRnZSA9IGNwMSA+PSAke2J9O1xuICAgIGApO3ZhciBoLGcsYixtO2xldCB5O3k9MD09PWw/WzEsMV06MT09PWw/W3VbMF0sMV06W3VbYy0xXSx1W2MtMl1dO2NvbnN0IHY9ZnVuY3Rpb24oZSx0LG4pe2lmKDA9PT1lKXJldHVybiAiZmFsc2UiO2lmKDE9PT1lKXJldHVybiBgcmMgPiAke3RbMF19YDtsZXQgcj0iIjtmb3IobGV0IG89ZS0yO288ZTtvKyspcis9YCR7bltvXX0gPj0gJHt0W28tZSsyXX1gLG88ZS0xJiYocis9Inx8Iik7cmV0dXJuIHJ9KGMseSxkKSxfPWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1lLmxlbmd0aDtpZigwPT09bilyZXR1cm4gImdldEEoKSwgMCwgMCwgMCI7aWYoMT09PW4pcmV0dXJuIGBnZXRBKHJjKSxcbiAgICAgICAgICAgIHJjICsgMSA+PSAke2VbMF19ID8gMC4gOiBnZXRBKHJjICsgMSksXG4gICAgICAgICAgICAwLCAwYDtsZXQgcj0iIjtpZihuPjIpZm9yKGxldCBlPTA7ZTxuLTI7KytlKXIrPWAke3RbZV19LGA7cmV0dXJuIGBnZXRBKCR7cn1yLCBjKSxcbiAgICAgICAgICByRWRnZSA/IDAuIDogZ2V0QSgke3J9cnAxLCBjKSxcbiAgICAgICAgICBjRWRnZSA/IDAuIDogZ2V0QSgke3J9ciwgY3AxKSxcbiAgICAgICAgICByRWRnZSB8fCBjRWRnZSA/IDAuIDogZ2V0QSgke3J9cnAxLCBjcDEpYH0odSxkKSx3PWBcbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICR7cH0gcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgICAgIGlmKCR7dn0pIHtcbiAgICAgICAgICAgICR7bi5vdXRwdXR9ID0gdmVjNCgwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHtmfVxuXG4gICAgICAgICAgICAke24ub3V0cHV0fSA9IHZlYzQoJHtffSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2hhc01haW46ITAsb3V0cHV0OntkaW1zOnQuZGltcyx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTpvLlRleHR1cmVUeXBlLnBhY2tlZH0sc2hhZGVyU291cmNlOnd9KX0pKGUsdCl9KTt9LDU2MTQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnVucGFja0Zyb21DaGFubmVsPXQuZ2V0Q2hhbm5lbHM9dC5nZXRWZWNDaGFubmVscz12b2lkIDA7Y29uc3Qgcj1uKDQzMik7ZnVuY3Rpb24gbyhlLHQpe3JldHVybiAoMCwgci5nZXRHbENoYW5uZWxzKSh0KS5tYXAoKHQ9PmAke2V9LiR7dH1gKSl9dC5nZXRWZWNDaGFubmVscz1vLHQuZ2V0Q2hhbm5lbHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMT09PXQ/W2VdOm8oZSx0KX0sdC51bnBhY2tGcm9tQ2hhbm5lbD1mdW5jdGlvbigpe3JldHVybiAiXG4gICAgZmxvYXQgZ2V0Q2hhbm5lbCh2ZWM0IGZyYWcsIGludCBkaW0pIHtcbiAgICAgIGludCBtb2RDb29yZCA9IGltb2QoZGltLCAyKTtcbiAgICAgIHJldHVybiBtb2RDb29yZCA9PSAwID8gZnJhZy5yIDogZnJhZy5nO1xuICAgIH1cblxuICAgIGZsb2F0IGdldENoYW5uZWwodmVjNCBmcmFnLCB2ZWMyIGlubmVyRGltcykge1xuICAgICAgdmVjMiBtb2RDb29yZCA9IG1vZChpbm5lckRpbXMsIDIuKTtcbiAgICAgIHJldHVybiBtb2RDb29yZC54ID09IDAuID9cbiAgICAgICAgKG1vZENvb3JkLnkgPT0gMC4gPyBmcmFnLnIgOiBmcmFnLmcpIDpcbiAgICAgICAgKG1vZENvb3JkLnkgPT0gMC4gPyBmcmFnLmIgOiBmcmFnLmEpO1xuICAgIH1cbiAgIn07fSw1NTY1OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZVBhZEF0dHJpYnV0ZXNWMTE9dC5wYWRWMTE9dC5wYXJzZVBhZEF0dHJpYnV0ZXNWMj10LnBhZFYyPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDcyNzMpLGk9big2NzU3KSxzPW4oNTYzOSksYT17bmFtZToiUGFkIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W3MuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnBhZFYyPShlLHQsbik9PihjKHQpLFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+bChlLHRbMF0sbil9KSx0KV0pLHQucGFyc2VQYWRBdHRyaWJ1dGVzVjI9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldFN0cmluZygibW9kZSIsImNvbnN0YW50Iiksbj1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoInZhbHVlIiwwKSxvPWUuYXR0cmlidXRlcy5nZXRJbnRzKCJwYWRzIik7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe21vZGU6dCx2YWx1ZTpuLHBhZHM6b30pfSx0LnBhZFYxMT0oZSxuLHIpPT57cChuKTtjb25zdCBvPXUoZSxuLHIpO3JldHVybiAoMCwgdC5wYWRWMikoZSxbblswXV0sbyl9LHQucGFyc2VQYWRBdHRyaWJ1dGVzVjExPWU9PmUuYXR0cmlidXRlcy5nZXRTdHJpbmcoIm1vZGUiLCJjb25zdGFudCIpO2NvbnN0IHU9KGUsdCxuKT0+e2lmKCFlLnNlc3Npb24uaXNJbml0aWFsaXplcih0WzFdLmRhdGFJZCl8fHQubGVuZ3RoPj0zJiYhZS5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIodFsyXS5kYXRhSWQpKXRocm93IG5ldyBFcnJvcigiZHluYW1pYyBwYWQgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQiKTtjb25zdCBvPUFycmF5LmZyb20odFsxXS5pbnRlZ2VyRGF0YSksaT10Lmxlbmd0aD49Mz90WzJdLmZsb2F0RGF0YVswXTowO3JldHVybiAoMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHttb2RlOm4scGFkczpvLHZhbHVlOml9KX0sbD0oZSx0LG4pPT57Y29uc3Qgcj1vLlNoYXBlVXRpbC5wYWRTaGFwZSh0LmRpbXMuc2xpY2UoKSxuLnBhZHMpLGk9ci5sZW5ndGgsYT1gXG4gICAgICAke2QoZSx0LG4pfVxuICAgICAgZmxvYXQgcHJvY2VzcyhpbnRbJHtpfV0gaW5kaWNlcykge1xuICAgICAgICAgIHJldHVybiBwYWRBKGluZGljZXMpO1xuICAgICAgfWA7cmV0dXJuIHtuYW1lOiJQYWQiLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbcy5UZXh0dXJlVHlwZS51bnBhY2tlZF0sb3V0cHV0OntkaW1zOnIsdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6cy5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmF9fSxjPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiUGFkIHJlcXVpcmVzIDEgaW5wdXQiKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX0scD1lPT57aWYoIWV8fDIhPT1lLmxlbmd0aCYmMyE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiUGFkIHJlcXVpcmVzIDIgb3IgMyBpbnB1dHMiKTtpZigiaW50MzIiIT09ZVsxXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKGUubGVuZ3RoPj0zJiYic3RyaW5nIj09PWVbMl0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX0sZD0oZSx0LG4pPT57Y29uc3Qgcj0oMCwgaS5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksW2EsdV09ZS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQodC5kaW1zLHMuVGV4dHVyZVR5cGUudW5wYWNrZWQpLGw9by5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXModC5kaW1zKTtzd2l0Y2gobi5tb2RlKXtjYXNlImNvbnN0YW50IjpyZXR1cm4gZihyLHQuZGltcyxsLGEsdSxuLnBhZHMsbi52YWx1ZSk7Y2FzZSJyZWZsZWN0IjpyZXR1cm4gaChyLHQuZGltcyxsLGEsdSxuLnBhZHMpO2Nhc2UiZWRnZSI6cmV0dXJuIGcocix0LmRpbXMsbCxhLHUsbi5wYWRzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBtb2RlIil9fSxmPShlLHQsbixyLG8saSxzKT0+e2NvbnN0IGE9dC5sZW5ndGg7bGV0IHU9IiI7Zm9yKGxldCBlPWEtMTtlPj0wOy0tZSl1Kz1gXG4gICAgICAgIGsgPSBtWyR7ZX1dIC0gJHtpW2VdfTtcbiAgICAgICAgaWYgKGsgPCAwKSAgcmV0dXJuIGNvbnN0YW50O1xuICAgICAgICBpZiAoayA+PSAke3RbZV19KSByZXR1cm4gY29uc3RhbnQ7XG4gICAgICAgIG9mZnNldCArPSBrICogJHtuW2VdfTtcbiAgICAgICAgYDtyZXR1cm4gYFxuICAgICAgZmxvYXQgcGFkQShpbnQgbVske2F9XSkge1xuICAgICAgICBjb25zdCBmbG9hdCBjb25zdGFudCA9IGZsb2F0KCR7c30pO1xuICAgICAgICBpbnQgb2Zmc2V0ID0gMDtcbiAgICAgICAgaW50IGsgPSAwO1xuICAgICAgICAke3V9XG4gICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke3J9LCAke299KTtcbiAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRDb2xvckFzRmxvYXQoJHtlLnRleHR1cmUyRH0oQSwgY29vcmRzKSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGB9LGg9KGUsdCxuLHIsbyxpKT0+e2NvbnN0IHM9dC5sZW5ndGg7bGV0IGE9IiI7Zm9yKGxldCBlPXMtMTtlPj0wOy0tZSlhKz1gXG4gICAgICAgIGsgPSBtWyR7ZX1dIC0gJHtpW2VdfTtcbiAgICAgICAgaWYgKGsgPCAwKSB7IGsgPSAtazsgfVxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgaW50IF8ybl8xID0gJHsyKih0W2VdLTEpfTtcbiAgICAgICAgICBrID0gaW50KCBtb2QoIGZsb2F0KGspLCBmbG9hdChfMm5fMSkgKSApIDtcbiAgICAgICAgICBpZihrID49ICR7dFtlXX0pIHsgayA9IF8ybl8xIC0gazsgfVxuICAgICAgICB9XG4gICAgICAgIG9mZnNldCArPSBrICogJHtuW2VdfTtcbiAgICAgICAgYDtyZXR1cm4gYFxuICAgICAgZmxvYXQgcGFkQShpbnQgbVske3N9XSkge1xuICAgICAgICBpbnQgb2Zmc2V0ID0gMDtcbiAgICAgICAgaW50IGsgPSAwO1xuICAgICAgICAke2F9XG4gICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke3J9LCAke299KTtcbiAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRDb2xvckFzRmxvYXQoJHtlLnRleHR1cmUyRH0oQSwgY29vcmRzKSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGB9LGc9KGUsdCxuLHIsbyxpKT0+e2NvbnN0IHM9dC5sZW5ndGg7bGV0IGE9IiI7Zm9yKGxldCBlPXMtMTtlPj0wOy0tZSlhKz1gXG4gICAgICAgIGsgPSBtWyR7ZX1dIC0gJHtpW2VdfTtcbiAgICAgICAgaWYgKGsgPCAwKSAgayA9IDA7XG4gICAgICAgIGlmIChrID49ICR7dFtlXX0pIGsgPSAke3RbZV0tMX07XG4gICAgICAgIG9mZnNldCArPSBrICogJHtuW2VdfTtcbiAgICAgIGA7cmV0dXJuIGBcbiAgICAgIGZsb2F0IHBhZEEoaW50IG1bJHtzfV0pIHtcbiAgICAgICAgaW50IG9mZnNldCA9IDA7XG4gICAgICAgIGludCBrID0gMDtcbiAgICAgICAgJHthfVxuICAgICAgICB2ZWMyIGNvb3JkcyA9IG9mZnNldFRvQ29vcmRzKG9mZnNldCwgJHtyfSwgJHtvfSk7XG4gICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7ZS50ZXh0dXJlMkR9KEEsIGNvb3JkcykpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBgfTt9LDI4MzQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lmdsb2JhbE1heFBvb2w9dC5wYXJzZU1heFBvb2xBdHRyaWJ1dGVzPXQubWF4UG9vbD10LnBhcnNlR2xvYmFsQXZlcmFnZVBvb2xBdHRyaWJ1dGVzPXQuZ2xvYmFsQXZlcmFnZVBvb2w9dC5wYXJzZUF2ZXJhZ2VQb29sQXR0cmlidXRlcz10LmF2ZXJhZ2VQb29sPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDcyNzMpLGk9big1NjM5KTt0LmF2ZXJhZ2VQb29sPShlLHQsbik9PntwKHQpO2NvbnN0IHI9e25hbWU6IkF2ZXJhZ2VQb29sIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W2kuVGV4dHVyZVR5cGUudW5wYWNrZWRdLGNhY2hlSGludDpuLmNhY2hlS2V5fTtyZXR1cm4gW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSx7Z2V0OigpPT5zKHQsciwhMSxuKX0pLHQpXX0sdC5wYXJzZUF2ZXJhZ2VQb29sQXR0cmlidXRlcz1lPT57Y29uc3QgdD1lLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJhdXRvX3BhZCIsIk5PVFNFVCIpLG49ZS5hdHRyaWJ1dGVzLmdldEludCgiY2VpbF9tb2RlIiwwKSxvPTAhPT1lLmF0dHJpYnV0ZXMuZ2V0SW50KCJjb3VudF9pbmNsdWRlX3BhZCIsMCksaT1lLmF0dHJpYnV0ZXMuZ2V0SW50cygia2VybmVsX3NoYXBlIikscz1lLmF0dHJpYnV0ZXMuZ2V0SW50cygic3RyaWRlcyIsW10pLGE9ZS5hdHRyaWJ1dGVzLmdldEludHMoInBhZHMiLFtdKTtpZigwIT09bil0aHJvdyBuZXcgRXJyb3IoInVzaW5nIGNlaWwoKSBpbiBzaGFwZSBjb21wdXRhdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgQXZlcmFnZVBvb2wiKTtyZXR1cm4gKDAsIHIuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7YXV0b1BhZDp0LGNlaWxNb2RlOm4sY291bnRJbmNsdWRlUGFkOm8sa2VybmVsU2hhcGU6aSxzdHJpZGVzOnMscGFkczphfSl9O2NvbnN0IHM9KGUsdCxuLHIpPT57Y29uc3RbcyxhXT11KGUscixuKSxsPW8uU2hhcGVVdGlsLnNpemUocy5rZXJuZWxTaGFwZSk7bGV0IGM9IiI7cy5jb3VudEluY2x1ZGVQYWQ/Yys9YHZhbHVlIC89IGZsb2F0KCR7bH0pO2A6Yys9YHZhbHVlIC89IGZsb2F0KCR7bH0gLSBwYWQpO2A7Y29uc3QgcD1gXG4gICAgICAgICR7ZChlWzBdLmRpbXMscywidmFsdWUgKz0gX1goeCk7IixjLCIwLjAiKX1cbiAgICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7b3V0cHV0OntkaW1zOmEsdHlwZTplWzBdLnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnB9KX07dC5nbG9iYWxBdmVyYWdlUG9vbD0oZSx0LG4pPT57cCh0KTtjb25zdCByPXtuYW1lOiJHbG9iYWxBdmVyYWdlUG9vbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6YCR7bi5jb3VudEluY2x1ZGVQYWR9YH07cmV0dXJuIFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scikse2dldDooKT0+cyh0LHIsITAsbil9KSx0KV19LHQucGFyc2VHbG9iYWxBdmVyYWdlUG9vbEF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9MCE9PWUuYXR0cmlidXRlcy5nZXRJbnQoImNvdW50X2luY2x1ZGVfcGFkIiwwKTtyZXR1cm4gKDAsIHIuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7YXV0b1BhZDoiIixjZWlsTW9kZTowLGNvdW50SW5jbHVkZVBhZDp0LGtlcm5lbFNoYXBlOltdLHN0cmlkZXM6W10scGFkczpbXX0pfSx0Lm1heFBvb2w9KGUsdCxuKT0+e3AodCk7Y29uc3Qgcj17bmFtZToiTWF4UG9vbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6bi5jYWNoZUtleX07cmV0dXJuIFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scikse2dldDooKT0+YSh0LHIsITEsbil9KSx0KV19LHQucGFyc2VNYXhQb29sQXR0cmlidXRlcz1lPT57Y29uc3QgdD1lLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJhdXRvX3BhZCIsIk5PVFNFVCIpLG49ZS5hdHRyaWJ1dGVzLmdldEludCgiY2VpbF9tb2RlIiwwKSxvPWUuYXR0cmlidXRlcy5nZXRJbnRzKCJrZXJuZWxfc2hhcGUiKSxpPWUuYXR0cmlidXRlcy5nZXRJbnRzKCJzdHJpZGVzIixbXSkscz1lLmF0dHJpYnV0ZXMuZ2V0SW50cygicGFkcyIsW10pLGE9ZS5hdHRyaWJ1dGVzLmdldEludCgic3RvcmFnZV9vcmRlciIsMCksdT1lLmF0dHJpYnV0ZXMuZ2V0SW50cygiZGlsYXRpb25zIixbXSk7aWYoMCE9PWEpdGhyb3cgbmV3IEVycm9yKCJjb2x1bW4gbWFqb3Igc3RvcmFnZSBvcmRlciBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgTWF4UG9vbCIpO2lmKDAhPT1uKXRocm93IG5ldyBFcnJvcigidXNpbmcgY2VpbCgpIGluIHNoYXBlIGNvbXB1dGF0aW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBNYXhQb29sIik7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F1dG9QYWQ6dCxjZWlsTW9kZTpuLGNvdW50SW5jbHVkZVBhZDohMSxrZXJuZWxTaGFwZTpvLHN0cmlkZXM6aSxwYWRzOnMsc3RvcmFnZU9yZGVyOmEsZGlsYXRpb25zOnV9KX07Y29uc3QgYT0oZSx0LG4scik9Pntjb25zdFtvLHNdPXUoZSxyLG4pLGE9YFxuICAgICAgJHtkKGVbMF0uZGltcyxvLCJcbiAgICAgIHZhbHVlID0gbWF4KF9YKHgpLCB2YWx1ZSk7XG4gICAgIiwiIiwiLTFlNSIpfVxuICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7b3V0cHV0OntkaW1zOnMsdHlwZTplWzBdLnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmF9KX0sdT0oZSx0LG4pPT57Y29uc3Qgcj1lWzBdLmRpbXMuc2xpY2UoKSxpPU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsImRpbGF0aW9ucyIpLHM9dC5rZXJuZWxTaGFwZS5zbGljZSgpLGE9dC5zdHJpZGVzLnNsaWNlKCksdT1pP3QuZGlsYXRpb25zLnNsaWNlKCk6W10sbD10LnBhZHMuc2xpY2UoKTtvLlBvb2xDb252VXRpbC5hZGp1c3RQb29sQXR0cmlidXRlcyhuLHIscyxhLHUsbCk7Y29uc3QgYz1vLlBvb2xDb252VXRpbC5jb21wdXRlUG9vbE91dHB1dFNoYXBlKG4scixhLHUscyxsLHQuYXV0b1BhZCkscD1PYmplY3QuYXNzaWduKHt9LHQpO3JldHVybiBpP09iamVjdC5hc3NpZ24ocCx7a2VybmVsU2hhcGU6cyxzdHJpZGVzOmEscGFkczpsLGRpbGF0aW9uczp1LGNhY2hlS2V5OnQuY2FjaGVLZXl9KTpPYmplY3QuYXNzaWduKHAse2tlcm5lbFNoYXBlOnMsc3RyaWRlczphLHBhZHM6bCxjYWNoZUtleTp0LmNhY2hlS2V5fSksW3AsY119LGw9e2F1dG9QYWQ6IiIsY2VpbE1vZGU6MCxjb3VudEluY2x1ZGVQYWQ6ITEsa2VybmVsU2hhcGU6W10sc3RyaWRlczpbXSxwYWRzOltdLHN0b3JhZ2VPcmRlcjowLGRpbGF0aW9uczpbXSxjYWNoZUtleToiIn0sYz17bmFtZToiR2xvYmFsTWF4UG9vbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnVucGFja2VkXX07dC5nbG9iYWxNYXhQb29sPShlLHQpPT4ocCh0KSxbZS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGMpLHtnZXQ6KCk9PmEodCxjLCEwLGwpfSksdCldKTtjb25zdCBwPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiUG9vbCBvcHMgcmVxdWlyZXMgMSBpbnB1dC4iKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX0sZD0oZSx0LG4scixpKT0+e2NvbnN0IHM9ZS5sZW5ndGg7aWYodC5rZXJuZWxTaGFwZS5sZW5ndGg8PTIpe2NvbnN0IG89dC5rZXJuZWxTaGFwZVt0Lmtlcm5lbFNoYXBlLmxlbmd0aC0xXSxhPXQuc3RyaWRlc1t0LnN0cmlkZXMubGVuZ3RoLTFdLHU9dC5wYWRzW3QucGFkcy5sZW5ndGgvMi0xXSxsPXQucGFkc1t0LnBhZHMubGVuZ3RoLTFdLGM9ZVtzLTFdO2xldCBwPSIiLGQ9IiIsZj0iIjtpZihwPXUrbCE9PTA/YFxuICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtvfTsgaSsrKSB7XG4gICAgICAgICAgICB4WyR7c30gLSAxXSA9IGluZGljZXNbJHtzfSAtIDFdICogJHthfSAtICR7dX0gKyBpO1xuICAgICAgICAgICAgaWYgKHhbJHtzfSAtIDFdIDwgMCB8fCB4WyR7c30gLSAxXSA+PSAke2N9KSB7XG4gICAgICAgICAgICAgIHBhZCsrO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICR7bn1cbiAgICAgICAgICB9YDpgXG4gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke299OyBpKyspIHtcbiAgICAgICAgICAgIHhbJHtzfSAtIDFdID0gaW5kaWNlc1ske3N9IC0gMV0gKiAke2F9IC0gJHt1fSArIGk7XG4gICAgICAgICAgICAke259XG4gICAgICAgICAgfWAsMj09PXQua2VybmVsU2hhcGUubGVuZ3RoKXtjb25zdCBuPXQua2VybmVsU2hhcGVbdC5rZXJuZWxTaGFwZS5sZW5ndGgtMl0scj10LnN0cmlkZXNbdC5zdHJpZGVzLmxlbmd0aC0yXSxpPXQucGFkc1t0LnBhZHMubGVuZ3RoLzItMl0sYT10LnBhZHNbdC5wYWRzLmxlbmd0aC0yXSx1PWVbcy0yXTtkPWkrYSE9PTA/YFxuICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAke259OyBqKyspIHtcbiAgICAgICAgICAgICAgeFske3N9IC0gMl0gPSBpbmRpY2VzWyR7c30gLSAyXSAqICR7cn0gLSAke2l9ICsgajtcbiAgICAgICAgICAgICAgaWYgKHhbJHtzfSAtIDJdIDwgMCB8fCB4WyR7c30gLSAyXSA+PSAke3V9KSB7XG4gICAgICAgICAgICAgICAgcGFkKz0gJHtvfTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIGA6YFxuICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAke259OyBqKyspIHtcbiAgICAgICAgICAgICAgeFske3N9IC0gMl0gPSBpbmRpY2VzWyR7c30gLSAyXSAqICR7cn0gLSAke2l9ICsgajtcbiAgICAgICAgICAgIGAsZj0iXG4gICAgICAgICAgfVxuICAgICAgICAiO31yZXR1cm4gYFxuICAgICAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7c31dKSB7XG4gICAgICAgICAgaW50IHhbJHtzfV07XG4gICAgICAgICAgY29weVZlYyhpbmRpY2VzLCB4KTtcblxuICAgICAgICAgIGZsb2F0IHZhbHVlID0gJHtpfTtcbiAgICAgICAgICBpbnQgcGFkID0gMDtcbiAgICAgICAgICAke2R9XG4gICAgICAgICAgJHtwfVxuICAgICAgICAgICR7Zn1cbiAgICAgICAgICAke3J9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICBgfXtjb25zdCBhPW8uU2hhcGVVdGlsLnNpemUodC5rZXJuZWxTaGFwZSksdT1vLlNoYXBlVXRpbC5jb21wdXRlU3RyaWRlcyh0Lmtlcm5lbFNoYXBlKSxsPXUubGVuZ3RoLGM9dC5wYWRzLmxlbmd0aCxwPWgobCksZD1mKGUsImlucHV0RGltcyIpLGc9Zih0LnBhZHMsInBhZHMiKSxiPWYodSwia2VybmVsU3RyaWRlcyIpLG09Zih0LnN0cmlkZXMsInN0cmlkZXMiKTtsZXQgeT0iIjtyZXR1cm4geT10LnBhZHMucmVkdWNlKCgoZSx0KT0+ZSt0KSk/YFxuICAgICAgICAgICAgaWYgKHhbal0gPj0gaW5wdXREaW1zW2pdIHx8IHhbal0gPCAwKSB7XG4gICAgICAgICAgICAgIHBhZCsrO1xuICAgICAgICAgICAgICBpc1BhZCA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWlzUGFkKSB7XG4gICAgICAgICAgICAke259XG4gICAgICAgICAgfWA6YFxuICAgICAgICAgIH1cbiAgICAgICAgICAke259XG4gICAgICAgIGAsYFxuICAgICAgICAke3B9XG4gICAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtzfV0pIHtcbiAgICAgICAgICBpbnQgeFske3N9XTtcbiAgICAgICAgICBjb3B5VmVjKGluZGljZXMsIHgpO1xuICAgICAgICAgIGludCBvZmZzZXRbJHtsfV07XG4gICAgICAgICAgaW50IHBhZHNbJHtjfV07XG4gICAgICAgICAgaW50IGlucHV0RGltc1ske3N9XTtcbiAgICAgICAgICBpbnQga2VybmVsU3RyaWRlc1ske2x9XTtcbiAgICAgICAgICBpbnQgc3RyaWRlc1ske2x9XTtcbiAgICAgICAgICAke2d9XG4gICAgICAgICAgJHtkfVxuICAgICAgICAgICR7bX1cbiAgICAgICAgICAke2J9XG5cbiAgICAgICAgICBmbG9hdCB2YWx1ZSA9ICR7aX07XG4gICAgICAgICAgaW50IHBhZCA9IDA7XG4gICAgICAgICAgYm9vbCBpc1BhZCA9IGZhbHNlO1xuICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHthfTsgaSsrKSB7XG4gICAgICAgICAgICBvZmZzZXRUb0luZGljZXMoaSwga2VybmVsU3RyaWRlcywgb2Zmc2V0KTtcbiAgICAgICAgICAgIGlzUGFkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGludCBqID0gJHtzfSAtICR7bH07IGogPCAke3N9OyBqKyspIHtcbiAgICAgICAgICAgICAgeFtqXSA9IGluZGljZXNbal0gKiBzdHJpZGVzW2ogLSAke3N9ICsgJHtsfV1cbiAgICAgICAgICAgICAgICArIG9mZnNldFtqIC0gJHtzfSArICR7bH1dIC0gcGFkc1tqIC0gMl07XG4gICAgICAgICAgICAgICR7eX1cbiAgICAgICAgICB9XG4gICAgICAgICAgJHtyfVxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICBgfX0sZj0oZSx0KT0+e2xldCBuPSIiO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKW4rPWBcbiAgICAgICR7dH1bJHtyfV0gPSAke2Vbcl19O1xuICAgIGA7cmV0dXJuIG59LGg9ZT0+YFxuICB2b2lkIG9mZnNldFRvSW5kaWNlcyhpbnQgb2Zmc2V0LCBpbnRbJHtlfV0gc3RyaWRlcywgb3V0IGludFske2V9XSBpbmRpY2VzKSB7XG4gICAgaWYgKCR7ZX0gPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7ZX0gLSAxOyArK2kpIHtcbiAgICAgIGluZGljZXNbaV0gPSBvZmZzZXQgLyBzdHJpZGVzW2ldO1xuICAgICAgb2Zmc2V0IC09IGluZGljZXNbaV0gKiBzdHJpZGVzW2ldO1xuICAgIH1cbiAgICBpbmRpY2VzWyR7ZX0gLSAxXSA9IG9mZnNldDtcbiAgfWA7fSwxMDEwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZWR1Y2VMb2dTdW1TcXVhcmU9dC5yZWR1Y2VMb2dTdW09dC5yZWR1Y2VQcm9kPXQucmVkdWNlTWluPXQucmVkdWNlTWF4PXQucmVkdWNlTWVhbj10LnJlZHVjZVN1bT10LnBhcnNlUmVkdWNlQXR0cmlidXRlcz12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big2MTQ1KSxpPW4oNzI3Mykscz1uKDU2MzkpLGE9KGUsdCxuLHIsbyk9PntsKHQpO2NvbnN0IGk9e25hbWU6cixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W3MuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTtyZXR1cm4gW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXksZ2V0OigpPT51KGUsdCxuLHIsbyxpKX0pLHQpXX07dC5wYXJzZVJlZHVjZUF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEludHMoImF4ZXMiLFtdKSxuPTE9PT1lLmF0dHJpYnV0ZXMuZ2V0SW50KCJrZWVwZGltcyIsMSk7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4ZXM6dCxrZWVwRGltczpufSl9O2NvbnN0IHU9KGUsdCxuLHIsbyxhKT0+e2NvbnN0IHU9W10sbD10WzBdLmRpbXMubGVuZ3RofHwxLGM9W10scD1pLlNoYXBlVXRpbC5ub3JtYWxpemVBeGVzKG4uYXhlcyx0WzBdLmRpbXMubGVuZ3RoKSxkPW8odCxwKTtsZXQgZj1kWzFdO2ZvcihsZXQgZT0wO2U8dFswXS5kaW1zLmxlbmd0aDtlKyspcC5pbmRleE9mKGUpPj0wfHwwPT09cC5sZW5ndGg/KG4ua2VlcERpbXMmJnUucHVzaCgxKSxmPWBcbiAgICAgICAgICBmb3IoaW50IGoke2V9ID0gMDsgaiR7ZX0gPCAke3RbMF0uZGltc1tlXX07IGoke2V9KyspIHtcbiAgICAgICAgICAgIGlucHV0SWR4WyR7ZX1dID0gaiR7ZX07XG4gICAgICAgICAgICAke2Z9XG4gICAgICAgICAgfWApOihjLnB1c2goYGlucHV0SWR4WyR7ZX1dID0gb3V0cHV0SWR4WyR7dS5sZW5ndGh9XTtgKSx1LnB1c2godFswXS5kaW1zW2VdKSk7Y29uc3QgaD1gXG4gICAgICBmbG9hdCBwcm9jZXNzKGludCBvdXRwdXRJZHhbJHt1Lmxlbmd0aHx8MX1dKSB7XG4gICAgICAgIGZsb2F0IHZhbHVlOyAgICAgICAgICAgICAgICAgLy8gZmluYWwgcmVzdWx0XG4gICAgICAgIGludCBpbnB1dElkeFske2x9XTsgICAgICAvLyBhZGRyZXNzaW5nIGlucHV0IGRhdGFcbiAgICAgICAgJHtjLmpvaW4oIlxuIil9XG4gICAgICAgICR7ZFswXX0gICAgICAgLy8gaW5pdCBvcHMgZm9yIHJlZHVjZSBtYXgvbWluXG4gICAgICAgICR7Zn1cbiAgICAgICAgJHtkWzJdfSAgICAgICAvLyBmaW5hbCBjb21wdXRhdGlvbiBmb3IgcmVkdWNlIG1lYW5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7b3V0cHV0OntkaW1zOnUsdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6cy5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmh9KX0sbD1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlJlZHVjZSBvcCByZXF1aXJlcyAxIGlucHV0LiIpO2lmKC0xPT09by5OVU1CRVJfVFlQRVMuaW5kZXhPZihlWzBdLnR5cGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt0LnJlZHVjZVN1bT0oZSx0LG4pPT5hKGUsdCxuLCJSZWR1Y2VTdW0iLCgoKT0+WyJ2YWx1ZSA9IDAuMDsiLCJ2YWx1ZSArPSBfQShpbnB1dElkeCk7IiwiIl0pKSx0LnJlZHVjZU1lYW49KGUsdCxuKT0+YShlLHQsbiwiUmVkdWNlTWVhbiIsKChlLHQpPT57bGV0IG49MTtmb3IobGV0IHI9MDtyPGVbMF0uZGltcy5sZW5ndGg7cisrKSh0LmluZGV4T2Yocik+PTB8fDA9PT10Lmxlbmd0aCkmJihuKj1lWzBdLmRpbXNbcl0pO3JldHVybiBbInZhbHVlID0gMC4wOyIsInZhbHVlICs9IF9BKGlucHV0SWR4KTsiLGB2YWx1ZSAvPSAke259LjtgXX0pKSx0LnJlZHVjZU1heD0oZSx0LG4pPT5hKGUsdCxuLCJSZWR1Y2VNYXgiLCgoZSx0KT0+e2NvbnN0IG49W107Zm9yKGxldCByPTA7cjxlWzBdLmRpbXMubGVuZ3RoO3IrKykodC5pbmRleE9mKHIpPj0wfHwwPT09dC5sZW5ndGgpJiZuLnB1c2goYGlucHV0SWR4WyR7cn1dID0gMDtgKTtyZXR1cm4gW2Ake24uam9pbigiXG4iKX1cbnZhbHVlID0gX0EoaW5wdXRJZHgpO2AsInZhbHVlID0gbWF4KHZhbHVlLCBfQShpbnB1dElkeCkpOyIsIiJdfSkpLHQucmVkdWNlTWluPShlLHQsbik9PmEoZSx0LG4sIlJlZHVjZU1pbiIsKChlLHQpPT57Y29uc3Qgbj1bXTtmb3IobGV0IHI9MDtyPGVbMF0uZGltcy5sZW5ndGg7cisrKSh0LmluZGV4T2Yocik+PTB8fDA9PT10Lmxlbmd0aCkmJm4ucHVzaChgaW5wdXRJZHhbJHtyfV0gPSAwO2ApO3JldHVybiBbYCR7bi5qb2luKCJcbiIpfVxudmFsdWUgPSBfQShpbnB1dElkeCk7YCwidmFsdWUgPSBtaW4odmFsdWUsIF9BKGlucHV0SWR4KSk7IiwiIl19KSksdC5yZWR1Y2VQcm9kPShlLHQsbik9PmEoZSx0LG4sIlJlZHVjZVByb2QiLCgoKT0+WyJ2YWx1ZSA9IDEuMDsiLCJ2YWx1ZSAqPSBfQShpbnB1dElkeCk7IiwiIl0pKSx0LnJlZHVjZUxvZ1N1bT0oZSx0LG4pPT5hKGUsdCxuLCJSZWR1Y2VMb2dTdW0iLCgoKT0+WyJ2YWx1ZSA9IDAuMDsiLCJ2YWx1ZSArPSBfQShpbnB1dElkeCk7IiwidmFsdWUgPSBsb2codmFsdWUpOyJdKSksdC5yZWR1Y2VMb2dTdW1TcXVhcmU9KGUsdCxuKT0+YShlLHQsbiwiUmVkdWNlTG9nU3VtU3F1YXJlIiwoKCk9PlsiZmxvYXQgdDsgdmFsdWUgPSAwLjA7IiwidCA9IF9BKGlucHV0SWR4KTsgdmFsdWUgKz0gdCAqIHQ7IiwiIl0pKTt9LDczNzk6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmlzUmVzaGFwZUNoZWFwPXQucHJvY2Vzc0RpbXMzRD10LmNyZWF0ZVBhY2tlZFJlc2hhcGUzRFByb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDY3NTcpLGk9big1NjM5KSxzPW4oNTYxNCk7dC5jcmVhdGVQYWNrZWRSZXNoYXBlM0RQcm9ncmFtSW5mb0xvYWRlcj0oZSx0LG4pPT57Y29uc3QgYT0oZT0+KHtuYW1lOiJSZXNoYXBlIChwYWNrZWQpIixpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnBhY2tlZF0saW5wdXROYW1lczpbIkEiXSxjYWNoZUhpbnQ6YCR7ZX1gfSkpKG4pO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2dldDooKT0+KChlLHQsbixhKT0+e2NvbnN0IHU9dC5kaW1zLGw9YTtsZXQgYz0iIjtmb3IobGV0IGU9MDtlPDQ7ZSsrKXtsZXQgdD0iIjtzd2l0Y2goZSl7Y2FzZSAwOnQ9Im91dHB1dENvb3JkcyA9IHJjOyI7YnJlYWs7Y2FzZSAxOnQ9Im91dHB1dENvb3JkcyA9IGl2ZWMzKHJjLngsIHJjLnkrMSwgcmMueik7IjticmVhaztjYXNlIDI6dD0ib3V0cHV0Q29vcmRzID0gaXZlYzMocmMueCwgcmMueSwgcmMueisxKTsiO2JyZWFrO2Nhc2UgMzp0PSJvdXRwdXRDb29yZHMgPSBpdmVjMyhyYy54LCByYy55KzEsIHJjLnorMSk7IjticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcn1jKz1gXG4gICAgICAgICR7dH1cbiAgICAgICAgJHtlPjA/ImlmKG91dHB1dENvb3Jkcy55IDwgcm93cyAmJiBvdXRwdXRDb29yZHMueiA8IGNvbHMpeyI6IiJ9XG4gICAgICAgICAgaW50IGZsYXR0ZW5lZEluZGV4ID0gZ2V0RmxhdHRlbmVkSW5kZXgob3V0cHV0Q29vcmRzKTtcblxuICAgICAgICAgIGl2ZWMzIGlucHV0UkMgPSBpbnB1dENvb3Jkc0Zyb21SZXNoYXBlZE91dENvb3JkcyhmbGF0dGVuZWRJbmRleCk7XG4gICAgICAgICAgdmVjMiBpbm5lckRpbXMgPSB2ZWMyKGZsb2F0KGlucHV0UkMueSksZmxvYXQoaW5wdXRSQy56KSk7XG5cbiAgICAgICAgICByZXN1bHRbJHtlfV0gPSBnZXRDaGFubmVsKGdldEEoaW5wdXRSQy54LCBpbnB1dFJDLnksIGlucHV0UkMueiksIGlubmVyRGltcyk7XG5cbiAgICAgICAgJHtlPjA/In0iOiIifVxuICAgICAgYDt9Y29uc3QgcD0oMCwgby5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksZD1gXG4gICAgICAke2Z1bmN0aW9uKGUpe2NvbnN0IHQ9ci5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXMoZSksbj1bImIiLCJyIiwiYyJdLG89ImluZGV4IjtyZXR1cm4gYFxuICAgIGl2ZWMzIGlucHV0Q29vcmRzRnJvbVJlc2hhcGVkT3V0Q29vcmRzKGludCBpbmRleCkge1xuICAgICAgJHt0Lm1hcCgoKGUscik9PmBpbnQgJHtuW3JdfSA9ICR7b30gLyAke2V9OyAke3I9PT10Lmxlbmd0aC0xP2BpbnQgJHtuW3IrMV19ID0gJHtvfSAtICR7bltyXX0gKiAke2V9YDpgaW5kZXggLT0gJHtuW3JdfSAqICR7ZX1gfTtgKSkuam9pbigiIil9XG4gICAgICByZXR1cm4gaXZlYzMoYiwgciwgYyk7XG4gICAgfVxuICBgfSh1KX1cbiAgICAgICR7ZnVuY3Rpb24oZSl7Y29uc3QgdD1yLlNoYXBlVXRpbC5jb21wdXRlU3RyaWRlcyhlKTtyZXR1cm4gYFxuICBpbnQgZ2V0RmxhdHRlbmVkSW5kZXgoaXZlYzMgY29vcmRzKSB7XG4gICAgLy8gcmV2ZXJzZSB5LCB6IG9yZGVyXG4gICAgcmV0dXJuIGNvb3Jkcy54ICogJHt0WzBdfSArIGNvb3Jkcy56ICogJHt0WzFdfSArIGNvb3Jkcy55O1xuICB9XG5gfShsKX1cbiAgICAgICR7KDAsIHMudW5wYWNrRnJvbUNoYW5uZWwpKCl9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzMgcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4wKTtcblxuICAgICAgICBpdmVjMyBvdXRwdXRDb29yZHM7XG4gICAgICAgIGludCByb3dzID0gJHtsWzJdfTtcbiAgICAgICAgaW50IGNvbHMgPSAke2xbMV19O1xuXG4gICAgICAgICR7Y31cbiAgICAgICAgJHtwLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgYDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4pLHtvdXRwdXQ6e2RpbXM6bCx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnBhY2tlZH0sc2hhZGVyU291cmNlOmQsaGFzTWFpbjohMH0pfSkoZSx0LGEsbil9KX0sdC5wcm9jZXNzRGltczNEPWZ1bmN0aW9uKGUpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gWzEsMSwxXTtsZXQgdD0xO2ZvcihsZXQgbj0wO248ZS5sZW5ndGgtMjsrK24pdCo9ZVtuXTtyZXR1cm4gW3QsZS5sZW5ndGg+MT9lW2UubGVuZ3RoLTJdOjEsZVtlLmxlbmd0aC0xXV19LHQuaXNSZXNoYXBlQ2hlYXA9ZnVuY3Rpb24oZSx0KXtsZXQgbj0hMTtyZXR1cm4gbj0wPT09ZS5sZW5ndGh8fDA9PT10Lmxlbmd0aHx8KGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDI/ZVtlLmxlbmd0aC0xXT09PXRbdC5sZW5ndGgtMV06ZVtlLmxlbmd0aC0xXT09PXRbdC5sZW5ndGgtMV0mJmVbZS5sZW5ndGgtMl09PT10W3QubGVuZ3RoLTJdKSxufTt9LDgxMjY6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnJlc2hhcGU9dm9pZCAwO2NvbnN0IHI9big3MjczKTt0LnJlc2hhcGU9KGUsdCk9Pntjb25zdCBuPXIuU2hhcGVVdGlsLmNhbGN1bGF0ZVJlc2hhcGVkRGltcyh0WzBdLmRpbXMsdFsxXS5pbnRlZ2VyRGF0YSk7cmV0dXJuIGUuc2Vzc2lvbi5wYWNrP1tlLnJlc2hhcGVQYWNrZWQodFswXSxuKV06W2UucmVzaGFwZVVucGFja2VkKHRbMF0sbildfTt9LDI4MDE6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMT10LnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMD10LnJlc2l6ZT12b2lkIDA7Y29uc3Qgcj1uKDY3NTcpLG89big1NjM5KSxpPW4oNDMyKSxzPW4oNTYxNCksYT1uKDM5ODApLHU9e25hbWU6IlJlc2l6ZSIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOltvLlRleHR1cmVUeXBlLnBhY2tlZF19O3QucmVzaXplPShlLHQsbik9PigoMCwgYS52YWxpZGF0ZUlucHV0cykodCxuKSxbZS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHUpLHtjYWNoZUhpbnQ6bi5jYWNoZUtleSxnZXQ6KCk9PmwoZSx0LG4pfSksdCldKSx0LnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMD1lPT4oMCwgYS5wYXJzZVVwc2FtcGxlQXR0cmlidXRlcykoZSwxMCksdC5wYXJzZVJlc2l6ZUF0dHJpYnV0ZXNWMTE9ZT0+KDAsIGEucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXMpKGUsMTEpO2NvbnN0IGw9KGUsdCxuKT0+e2NvbnN0IGE9KDAsIHIuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFtsLHBdPWModCxuKTtpZihsLmV2ZXJ5KChlPT4xPT09ZSkpJiYidGZfY3JvcF9hbmRfcmVzaXplIiE9PW4uY29vcmRpbmF0ZVRyYW5zZm9ybU1vZGUpcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx1KSx7b3V0cHV0OntkaW1zOnAsdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS5wYWNrZWR9LGhhc01haW46ITAsc2hhZGVyU291cmNlOmB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgICAgICAgICAgIHZlYzQgdiA9ICR7YS50ZXh0dXJlMkR9KFgsIFRleENvb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgICR7YS5vdXRwdXR9ID0gdjtcbiAgICAgICAgICAgICAgICB9YH0pO2NvbnN0IGQ9cC5sZW5ndGg7aWYoZDwyKXRocm93IG5ldyBFcnJvcihgb3V0cHV0IGRpbWVuc2lvbiBzaG91bGQgYmUgYXQgbGVhc3QgMiwgYnV0IGdvdCAke2R9YCk7Y29uc3QgZj1wW2QtMl0saD1wW2QtMV0sZz10WzBdLmRpbXM7aWYoZCE9PWcubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgb3V0cHV0IGRpbWVuc2lvbiBzaG91bGQgbWF0Y2ggaW5wdXQgJHtnLmxlbmd0aH0sIGJ1dCBnb3QgJHtkfWApO2NvbnN0IGI9Z1tkLTJdLG09Z1tkLTFdLHk9bFtkLTJdLHY9bFtkLTFdO2xldCBfPSIiO2lmKCJsaW5lYXIiIT09bi5tb2RlKXRocm93IG5ldyBFcnJvcihgcmVzaXplIChwYWNrZWQpIGRvZXMgbm90IHN1cHBvcnQgbW9kZTogJyR7bi5tb2RlfSdgKTtzd2l0Y2gobi5jb29yZGluYXRlVHJhbnNmb3JtTW9kZSl7Y2FzZSJhc3ltbWV0cmljIjpfPSJcbiAgICAgICAgICAgICAgICAgICAgdmVjNCBnZXRTb3VyY2VGcmFjSW5kZXgoaXZlYzQgY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVjNChjb29yZHMpIC8gc2NhbGVXSFdIO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIjticmVhaztjYXNlImhhbGZfcGl4ZWwiOl89IlxuICAgICAgICAgICAgICAgICAgICB2ZWM0IGdldFNvdXJjZUZyYWNJbmRleChpdmVjNCBjb29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodmVjNChjb29yZHMpICsgMC41KSAvIHNjYWxlV0hXSCAtIDAuNTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICI7YnJlYWs7Y2FzZSJweXRvcmNoX2hhbGZfcGl4ZWwiOl89YFxuICAgICAgICAgICAgICAgICAgICB2ZWM0IGdldFNvdXJjZUZyYWNJbmRleChpdmVjNCBjb29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgZmNvb3JkcyA9IHZlYzQoY29vcmRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZWM0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7aH0uMCA+IDEuMCA/IChmY29vcmRzLnggKyAwLjUpIC8gc2NhbGVXSFdILnggLSAwLjUgOiAwLjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtmfS4wID4gMS4wID8gKGZjb29yZHMueSArIDAuNSkgLyBzY2FsZVdIV0gueSAtIDAuNSA6IDAuMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2h9LjAgPiAxLjAgPyAoZmNvb3Jkcy56ICsgMC41KSAvIHNjYWxlV0hXSC56IC0gMC41IDogMC4wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Zn0uMCA+IDEuMCA/IChmY29vcmRzLncgKyAwLjUpIC8gc2NhbGVXSFdILncgLSAwLjUgOiAwLjBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGA7YnJlYWs7Y2FzZSJhbGlnbl9jb3JuZXJzIjpfPWBcbiAgICAgICAgICAgICAgICAgICAgdmVjNCBnZXRTb3VyY2VGcmFjSW5kZXgoaXZlYzQgY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZWM0IHJlc2l6ZWQgPSB2ZWM0KCR7aH0uMCAtIDEuMCwgJHtmfS4wIC0gMS4wLCAke2h9LjAgLSAxLjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtmfS4wIC0gMS4wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgb3JpZ2luYWwgPSB2ZWM0KCR7bX0uMCAtIDEuMCwgJHtifS4wIC0gMS4wLCAke219LjAgLSAxLjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtifS4wIC0gMS4wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgbmV3X3NjYWxlID0gb3JpZ2luYWwgLyByZXNpemVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlYzQoY29vcmRzKSAqIG5ld19zY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHJlc2l6ZSAocGFja2VkKSBkb2VzIG5vdCBzdXBwb3J0IGNvb3JkaW5hdGVUcmFuc2Zvcm1Nb2RlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcke24uY29vcmRpbmF0ZVRyYW5zZm9ybU1vZGV9J2ApfWNvbnN0IHc9KDAsIGkuZ2V0Q29vcmRzRGF0YVR5cGUpKGQpLFQ9YFxuICAgICAgICAgICAgY29uc3QgdmVjMiBpbnB1dFdIID0gdmVjMigke2J9LjAsICR7bX0uMCk7XG4gICAgICAgICAgICBjb25zdCB2ZWM0IHNjYWxlV0hXSCA9IHZlYzQoZmxvYXQoJHt5fSksIGZsb2F0KCR7dn0pLCBmbG9hdCgke3l9KSwgZmxvYXQoJHt2fSkpO1xuICAgICAgICAgICAgJHsoMCwgcy51bnBhY2tGcm9tQ2hhbm5lbCkoKX1cbiAgICAgICAgICAgICR7X31cbiAgICAgICAgICAgIGZsb2F0IGdldEFWYWx1ZShpbnQgeDEwLCBpbnQgciwgaW50IGMsIGludCBkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QSh4MTAsIHIsIGMsIGQpLCB2ZWMyKGMsIGQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAgICAgICAke3d9IHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgICAgICAgICBpbnQgYmF0Y2ggPSByY1swXTtcbiAgICAgICAgICAgICAgICBpbnQgZGVwdGggPSByY1sxXTtcblxuICAgICAgICAgICAgICAgIC8vIHJldHJpZXZlIHRoZSA0IGNvb3JkaW5hdGVzIHRoYXQgaXMgdXNlZCBpbiB0aGUgNCBwYWNrZWQgb3V0cHV0IHZhbHVlcy5cbiAgICAgICAgICAgICAgICBpdmVjNCBjb29yZHMgPSBpdmVjNChyYy53eiwgcmMudyArIDEsIHJjLnogKyAxKTtcblxuICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgc291cmNlIGluZGV4IGluIGZyYWN0aW9uXG4gICAgICAgICAgICAgICAgdmVjNCBzb3VyY2VGcmFjID0gZ2V0U291cmNlRnJhY0luZGV4KGNvb3Jkcyk7XG5cbiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCBvZiB0aGUgNCB2YWx1ZXMgdGhhdCB3aWxsIGJlIHBhY2tlZCBpbnRvIG9uZSB0ZXhlbC5cbiAgICAgICAgICAgICAgICBpdmVjNCB4MDAgPSBpdmVjNChtYXgoc291cmNlRnJhYy54eSwgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy54eSkpKTtcbiAgICAgICAgICAgICAgICBpdmVjNCB4MDEgPSBpdmVjNChtYXgoc291cmNlRnJhYy54dywgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy54dykpKTtcbiAgICAgICAgICAgICAgICBpdmVjNCB4MTAgPSBpdmVjNChtYXgoc291cmNlRnJhYy56eSwgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy56eSkpKTtcbiAgICAgICAgICAgICAgICBpdmVjNCB4MTEgPSBpdmVjNChtYXgoc291cmNlRnJhYy56dywgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy56dykpKTtcblxuICAgICAgICAgICAgICAgIGJvb2wgaGFzTmV4dFJvdyA9IHJjLncgPCAke2YtMX07XG4gICAgICAgICAgICAgICAgYm9vbCBoYXNOZXh0Q29sID0gcmMueiA8ICR7aC0xfTtcblxuICAgICAgICAgICAgICAgIC8vIHBhY2sgeDAwLCB4MDEsIHgxMCwgeDExJ3MgdG9wLWxlZnQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgdmVjNCB0b3BMZWZ0ID0gdmVjNChcbiAgICAgICAgICAgICAgICAgICAgZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDAwLngsIHgwMC55KSxcbiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMS54LCB4MDEueSkgOiAwLjAsXG4gICAgICAgICAgICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTAueCwgeDEwLnkpIDogMC4wLFxuICAgICAgICAgICAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgxMS54LCB4MTEueSkgOiAwLjApO1xuXG4gICAgICAgICAgICAgICAgLy8gcGFjayB4MDAsIHgwMSwgeDEwLCB4MTEncyB0b3AtcmlnaHQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgdmVjNCB0b3BSaWdodCA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICAgIGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMC54LCB4MDAudyksXG4gICAgICAgICAgICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MDEueCwgeDAxLncpIDogMC4wLFxuICAgICAgICAgICAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDEwLngsIHgxMC53KSA6IDAuMCxcbiAgICAgICAgICAgICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTEueCwgeDExLncpIDogMC4wKTtcblxuICAgICAgICAgICAgICAgIC8vIHBhY2sgeDAwLCB4MDEsIHgxMCwgeDExJ3MgYm90dG9tLWxlZnQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgdmVjNCBib3R0b21MZWZ0ID0gdmVjNChcbiAgICAgICAgICAgICAgICAgICAgZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDAwLnosIHgwMC55KSxcbiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMS56LCB4MDEueSkgOiAwLjAsXG4gICAgICAgICAgICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTAueiwgeDEwLnkpIDogMC4wLFxuICAgICAgICAgICAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgxMS56LCB4MTEueSkgOiAwLjApO1xuXG4gICAgICAgICAgICAgICAgLy8gcGFjayB4MDAsIHgwMSwgeDEwLCB4MTEncyBib3R0b20tcmlnaHQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgdmVjNCBib3R0b21SaWdodCA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICAgIGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMC56LCB4MDAudyksXG4gICAgICAgICAgICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MDEueiwgeDAxLncpIDogMC4wLFxuICAgICAgICAgICAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDEwLnosIHgxMC53KSA6IDAuMCxcbiAgICAgICAgICAgICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTEueiwgeDExLncpIDogMC4wKTtcblxuICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgaW50ZXJwb2xhdGlvbiBmcmFjdGlvbiBvbiB1IGFuZCB2IGRpcmVjdGlvblxuICAgICAgICAgICAgICAgIHZlYzQgZnJhYyA9IHZlYzQoc291cmNlRnJhYykgLSBmbG9vcihzb3VyY2VGcmFjKTtcbiAgICAgICAgICAgICAgICB2ZWM0IGNsYW1wRnJhYyA9IGNsYW1wKGZyYWMsIHZlYzQoMC4wKSwgdmVjNCgxLjApKTtcblxuICAgICAgICAgICAgICAgIHZlYzQgdG9wID0gbWl4KHRvcExlZnQsIHRvcFJpZ2h0LCBjbGFtcEZyYWMueXd5dyk7XG4gICAgICAgICAgICAgICAgdmVjNCBib3R0b20gPSBtaXgoYm90dG9tTGVmdCwgYm90dG9tUmlnaHQsIGNsYW1wRnJhYy55d3l3KTtcbiAgICAgICAgICAgICAgICB2ZWM0IG5ld1ZhbHVlID0gbWl4KHRvcCwgYm90dG9tLCBjbGFtcEZyYWMueHh6eik7XG5cbiAgICAgICAgICAgICAgICAke2Eub3V0cHV0fSA9IHZlYzQobmV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdSkse291dHB1dDp7ZGltczpwLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUucGFja2VkfSxoYXNNYWluOiEwLHNoYWRlclNvdXJjZTpUfSl9LGM9KGUsdCk9Pntjb25zdCBuPWVbMF0uZGltcztsZXQgcixvPXQuc2NhbGVzO2lmKDA9PT1vLmxlbmd0aCl7Y29uc3QgaT1lW3Quc2NhbGVzSW5wdXRJZHhdO2lmKGkmJjAhPT1pLnNpemUpe2lmKGVbdC5zaXplc0lucHV0SWR4XSl0aHJvdyBuZXcgRXJyb3IoIk9ubHkgb25lIG9mIHNjYWxlcyBvciBzaXplcyBtdXN0IGJlIHByb3ZpZGVkIGFzIGlucHV0LiIpO289cChpLHQubW9kZSx0LmlzUmVzaXplKTt9ZWxzZSB7Y29uc3QgaT1lW3Quc2l6ZXNJbnB1dElkeF07aWYoIWl8fDA9PT1pLnNpemUpdGhyb3cgbmV3IEVycm9yKCJFaXRoZXIgc2NhbGVzIG9yIHNpemVzIE1VU1QgYmUgcHJvdmlkZWQgYXMgaW5wdXQuIik7cj1BcnJheS5mcm9tKGkuaW50ZWdlckRhdGEpLG89ZChyLG4sdC5tb2RlLHQuaXNSZXNpemUpO319ZWxzZSBpZihlW3Quc2l6ZXNJbnB1dElkeF0pdGhyb3cgbmV3IEVycm9yKCJPbmx5IG9uZSBvZiBzY2FsZXMgb3Igc2l6ZXMgbXVzdCBiZSBwcm92aWRlZCBhcyBpbnB1dC4iKTtjb25zdCBpPXJ8fG4ubWFwKCgoZSx0KT0+TWF0aC5mbG9vcihlKm9bdF0pKSk7cmV0dXJuIFtvLGldfSxwPShlLHQsbik9Pntjb25zdCByPUFycmF5LmZyb20oZS5mbG9hdERhdGEpO3JldHVybiAoMCwgYS5zY2FsZXNWYWxpZGF0aW9uKShyLHQsbikscn0sZD0oZSx0LG4scik9Pntjb25zdCBvPXQubGVuZ3RoLGk9bmV3IEFycmF5KG8pO2ZvcihsZXQgbj0wLHI9bztuPHI7bisrKWlmKDA9PT10W25dKXtpZigwIT09ZVtuXSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IGRpbSBpcyB6ZXJvIGJ1dCByZXF1aXJlZCBvdXRwdXQgZGltIGlzIG5vbi16ZXJvLiIpO2lbbl09MTt9ZWxzZSBpW25dPWVbbl0vdFtuXTtyZXR1cm4gKDAsIGEuc2NhbGVzVmFsaWRhdGlvbikoaSxuLHIpLGl9O30sNTY1OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5zaGFwZT12b2lkIDA7Y29uc3Qgcj1uKDkyNDApO3Quc2hhcGU9KGUsdCk9PihvKHQpLFtuZXcgci5UZW5zb3IoW3RbMF0uZGltcy5sZW5ndGhdLCJpbnQzMiIsdm9pZCAwLHZvaWQgMCxuZXcgSW50MzJBcnJheSh0WzBdLmRpbXMpKV0pO2NvbnN0IG89ZT0+e2lmKCFlfHwxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJTaGFwZSByZXF1aXJlcyAxIGlucHV0LiIpfTt9LDI0NDQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnNsaWNlVjEwPXQucGFyc2VTbGljZUF0dHJpYnV0ZXM9dC5zbGljZT12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big2MTQ1KSxpPW4oNzI3Mykscz1uKDU2MzkpLGE9e25hbWU6IlNsaWNlIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W3MuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnNsaWNlPShlLHQsbik9PihsKHQpLFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+dShlLHRbMF0sbil9KSx0KV0pLHQucGFyc2VTbGljZUF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEludHMoInN0YXJ0cyIpLG49ZS5hdHRyaWJ1dGVzLmdldEludHMoImVuZHMiKSxvPWUuYXR0cmlidXRlcy5nZXRJbnRzKCJheGVzIixbXSk7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe3N0YXJ0czp0LGVuZHM6bixheGVzOm99KX07Y29uc3QgdT0oZSx0LG4pPT57Y29uc3Qgcj0wPT09bi5heGVzLmxlbmd0aD90LmRpbXMuc2xpY2UoMCkubWFwKCgoZSx0KT0+dCkpOm4uYXhlcyxvPWkuU2hhcGVVdGlsLm5vcm1hbGl6ZUF4ZXMocix0LmRpbXMubGVuZ3RoKSx1PW4uc3RhcnRzLm1hcCgoKGUsbik9PmU+dC5kaW1zW29bbl1dLTE/dC5kaW1zW29bbl1dOmkuU2hhcGVVdGlsLm5vcm1hbGl6ZUF4aXMoZSx0LmRpbXNbb1tuXV0pKSksbD1uLmVuZHMubWFwKCgoZSxuKT0+ZT50LmRpbXNbb1tuXV0tMT90LmRpbXNbb1tuXV06aS5TaGFwZVV0aWwubm9ybWFsaXplQXhpcyhlLHQuZGltc1tvW25dXSkpKSxjPXQuZGltcy5zbGljZSgpLHA9W107Zm9yKGxldCBlPTA7ZTxvLmxlbmd0aDtlKyspY1tvW2VdXT1sW2VdLXVbZV0sdVtlXT4wJiZwLnB1c2goYG91dHB1dElkeFske29bZV19XSArPSAke3VbZV19O2ApO2NvbnN0IGQ9YFxuICAgICAgZmxvYXQgcHJvY2VzcyhpbnQgb3V0cHV0SWR4WyR7Yy5sZW5ndGh9XSkge1xuICAgICAgICAke3Auam9pbigiXG4gICAgICAiKX1cbiAgICAgICAgcmV0dXJuIF9BKG91dHB1dElkeCk7XG4gICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtvdXRwdXQ6e2RpbXM6Yyx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTpzLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6ZH0pfSxsPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU2xpY2UgcmVxdWlyZXMgMSBpbnB1dC4iKTtpZigtMT09PW8uTlVNQkVSX1RZUEVTLmluZGV4T2YoZVswXS50eXBlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX07dC5zbGljZVYxMD0oZSx0KT0+e3AodCk7Y29uc3Qgbj1jKGUsdCk7cmV0dXJuIFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+dShlLHRbMF0sbil9KSxbdFswXV0pXX07Y29uc3QgYz0oZSx0KT0+e2lmKCFlLnNlc3Npb24uaXNJbml0aWFsaXplcih0WzFdLmRhdGFJZCl8fCFlLnNlc3Npb24uaXNJbml0aWFsaXplcih0WzJdLmRhdGFJZCl8fHQubGVuZ3RoPj00JiYhZS5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIodFszXS5kYXRhSWQpfHx0Lmxlbmd0aD49NSYmIWUuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbNF0uZGF0YUlkKSl0aHJvdyBuZXcgRXJyb3IoImR5bmFtaWMgc2xpY2UgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQiKTtpZih0Lmxlbmd0aD49NSYmdFs0XS5pbnRlZ2VyRGF0YS5zb21lKChlPT4xIT09ZSkpKXRocm93IG5ldyBFcnJvcigiY3VycmVudGx5IG5vbi0xIHN0ZXBzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFNsaWNlIik7Y29uc3Qgbj1BcnJheS5mcm9tKHRbMV0uaW50ZWdlckRhdGEpLHI9QXJyYXkuZnJvbSh0WzJdLmludGVnZXJEYXRhKSxvPXQubGVuZ3RoPj00P0FycmF5LmZyb20odFszXS5pbnRlZ2VyRGF0YSk6W107cmV0dXJuIHtzdGFydHM6bixlbmRzOnIsYXhlczpvLGNhY2hlS2V5OmAke299OyR7bn07JHtyfWB9fSxwPWU9PntpZighZXx8ZS5sZW5ndGg8M3x8ZS5sZW5ndGg+NSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgbnVtYmVyLiIpO2lmKCJpbnQzMiIhPT1lWzFdLnR5cGV8fDEhPT1lWzFdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKCJpbnQzMiIhPT1lWzJdLnR5cGV8fDEhPT1lWzJdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKGUubGVuZ3RoPj00JiYoImludDMyIiE9PWVbM10udHlwZXx8MSE9PWVbM10uZGltcy5sZW5ndGgpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKGUubGVuZ3RoPj01JiYoImludDMyIiE9PWVbNF0udHlwZXx8MSE9PWVbNF0uZGltcy5sZW5ndGgpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDgxNTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuc29mdG1heFYxMz10LnBhcnNlU29mdG1heEF0dHJpYnV0ZXNWMTM9dC5wYXJzZVNvZnRtYXhBdHRyaWJ1dGVzPXQuc29mdG1heD12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big3MjczKSxpPW4oNjc1Nykscz1uKDU2MzkpLGE9big1NzA3KSx1PXtuYW1lOiJTb2Z0bWF4Q29tcHV0ZU1heCIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOltzLlRleHR1cmVUeXBlLnVucGFja2VkXX0sbD17bmFtZToiU29mdG1heENvbXB1dGVTY2FsZSIsaW5wdXROYW1lczpbIkEiLCJNYXgiXSxpbnB1dFR5cGVzOltzLlRleHR1cmVUeXBlLnVucGFja2VkLHMuVGV4dHVyZVR5cGUudW5wYWNrZWRdfSxjPXtuYW1lOiJTb2Z0TWF4IixpbnB1dE5hbWVzOlsiQSIsIk1heCIsIk5vcm0iXSxpbnB1dFR5cGVzOltzLlRleHR1cmVUeXBlLnVucGFja2VkLHMuVGV4dHVyZVR5cGUudW5wYWNrZWQscy5UZXh0dXJlVHlwZS51bnBhY2tlZF19O3Quc29mdG1heD0oZSx0LG4pPT57Zyh0KTtjb25zdCByPXRbMF0uZGltcy5zbGljZSgpLGk9by5TaGFwZVV0aWwubm9ybWFsaXplQXhpcyhuLmF4aXMsci5sZW5ndGgpLHM9by5TaGFwZVV0aWwuc2l6ZVRvRGltZW5zaW9uKHIsaSksYT1vLlNoYXBlVXRpbC5zaXplRnJvbURpbWVuc2lvbihyLGkpO3JldHVybiBwKGUsdCxuLHMsYSl9LHQucGFyc2VTb2Z0bWF4QXR0cmlidXRlcz1lPT4oMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtheGlzOmUuYXR0cmlidXRlcy5nZXRJbnQoImF4aXMiLDEpfSksdC5wYXJzZVNvZnRtYXhBdHRyaWJ1dGVzVjEzPWU9PigwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4aXM6ZS5hdHRyaWJ1dGVzLmdldEludCgiYXhpcyIsLTEpfSksdC5zb2Z0bWF4VjEzPShlLHQsbik9PntnKHQpO2NvbnN0IGk9dFswXS5kaW1zLnNsaWNlKCkscz1vLlNoYXBlVXRpbC5ub3JtYWxpemVBeGlzKG4uYXhpcyxpLmxlbmd0aCksdT1pLmxlbmd0aCxsPXMhPT11LTEsYz1bXTtsZXQgZCxmPVtdLGg9W107bCYmKGY9QXJyYXkuZnJvbSh7bGVuZ3RoOnV9KS5tYXAoKChlLHQpPT50KSksZltzXT11LTEsZlt1LTFdPXMsZi5tYXAoKGU9PmMucHVzaChpW2VdKSkpLGQ9KDAsIHIuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7cGVybTpmfSksaD0oMCwgYS50cmFuc3Bvc2UpKGUsdCxkKSk7Y29uc3QgYj1sP28uU2hhcGVVdGlsLnNpemVUb0RpbWVuc2lvbihjLHUtMSk6by5TaGFwZVV0aWwuc2l6ZVRvRGltZW5zaW9uKGksdS0xKSxtPWw/by5TaGFwZVV0aWwuc2l6ZUZyb21EaW1lbnNpb24oYyx1LTEpOm8uU2hhcGVVdGlsLnNpemVGcm9tRGltZW5zaW9uKGksdS0xKSx5PXAoZSxsP2g6dCxuLGIsbSk7cmV0dXJuIGw/KDAsIGEudHJhbnNwb3NlKShlLHksZCk6eX07Y29uc3QgcD0oZSx0LG4scixvKT0+e2NvbnN0IGk9ZChlLHRbMF0scixvLFtyXSkscz1lLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdSkse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+aX0pLHQpLGE9ZihlLHRbMF0scixvLGkub3V0cHV0LmRpbXMsW3JdKSxwPWUucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxsKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXksZ2V0OigpPT5hfSksW3RbMF0sc10pLGc9aChlLHRbMF0scixvLGkub3V0cHV0LmRpbXMsYS5vdXRwdXQuZGltcyk7cmV0dXJuIFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYykse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+Z30pLFt0WzBdLHMscF0pXX0sZD0oZSx0LG4scixvKT0+e2NvbnN0W2EsbF09ZS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQodC5kaW1zLHMuVGV4dHVyZVR5cGUudW5wYWNrZWQpLGM9by5sZW5ndGg7aWYobjwxfHxyPDEpdGhyb3cgbmV3IEVycm9yKCJMb2dpY2FsIHJvdyBjb3VudCBOIGFuZCBmZWF0dXJlIGNvdW50IEQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSIpO2lmKDEhPT1vLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkRpbWVuc2lvbmFsaXR5IG9mIHRoZSBvdXRwdXQgc2hvdWxkIGJlIDEiKTtpZihvWzBdIT09bil0aHJvdyBuZXcgRXJyb3IoIlNoYXBlIG9mIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGVxdWFsIHRvIGxvZ2ljYWwgcm93IGNvdW50Iik7Y29uc3QgcD0oMCwgaS5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksZD1gXG4gICAgICBmbG9hdCBwcm9jZXNzKGludFske2N9XSBpbmRpY2VzKSB7XG4gICAgICAgIGludCBsb2dpY2FsX3Jvd19zdGFydF9vZmZzZXQgPSBpbmRpY2VzWzBdICogJHtyfTtcblxuICAgICAgICBmbG9hdCBtYXggPSBnZXRDb2xvckFzRmxvYXQoJHtwLnRleHR1cmUyRH0oQSwgb2Zmc2V0VG9Db29yZHMobG9naWNhbF9yb3dfc3RhcnRfb2Zmc2V0LCAke2F9LFxuICAgICAgICAke2x9ICkpKTtcbiAgICAgICAgZm9yKGludCBpPTE7IGk8JHtyfTsgKytpKVxuICAgICAgICB7XG4gICAgICAgICAgZmxvYXQgY3VycmVudCA9IGdldENvbG9yQXNGbG9hdCgke3AudGV4dHVyZTJEfShBLCBvZmZzZXRUb0Nvb3Jkcyhsb2dpY2FsX3Jvd19zdGFydF9vZmZzZXQgKyBpLFxuICAgICAgICAgICAgJHthfSwgJHtsfSkpKTtcbiAgICAgICAgICBpZihjdXJyZW50ID4gbWF4KVxuICAgICAgICAgIG1heCA9IGN1cnJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWF4O1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx1KSx7b3V0cHV0OntkaW1zOm8sdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6cy5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmR9KX0sZj0oZSx0LG4scixvLGEpPT57Y29uc3RbdSxjXT1lLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodCh0LmRpbXMscy5UZXh0dXJlVHlwZS51bnBhY2tlZCkscD1hLmxlbmd0aDtpZihuPDF8fHI8MSl0aHJvdyBuZXcgRXJyb3IoIkxvZ2ljYWwgcm93IGNvdW50IE4gYW5kIGZlYXR1cmUgY291bnQgRCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIik7aWYoMSE9PWEubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiRGltZW5zaW9uYWxpdHkgb2YgdGhlIG91dHB1dCBzaG91bGQgYmUgMSIpO2lmKGFbMF0hPT1uKXRocm93IG5ldyBFcnJvcigiU2hhcGUgb2YgdGhlIG91dHB1dCBzaG91bGQgYmUgZXF1YWwgdG8gbG9naWNhbCByb3cgY291bnQiKTtpZigxIT09by5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJEaW1lbnNpb25hbGl0eSBvZiB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgc2hvdWxkIGJlIDEiKTtpZihvWzBdIT09bil0aHJvdyBuZXcgRXJyb3IoIlNoYXBlIG9mIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBzaG91bGQgYmUgZXF1YWwgdG8gbG9naWNhbCByb3cgY291bnQiKTtjb25zdCBkPWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50WyR7cH1dIGluZGljZXMpIHtcbiAgICAgICAgaW50IGxvZ2ljYWxfcm93X3N0YXJ0X29mZnNldCA9IGluZGljZXNbMF0gKiAke3J9O1xuXG4gICAgICAgIGZsb2F0IG5vcm1fZmFjdG9yID0gMC4wO1xuICAgICAgICBmbG9hdCBtYXggPSBfTWF4KGluZGljZXMpO1xuICAgICAgICBmb3IoaW50IGk9MDsgaTwke3J9OyArK2kpXG4gICAgICAgIHtcbiAgICAgICAgICBub3JtX2ZhY3RvciArPSBleHAoZ2V0Q29sb3JBc0Zsb2F0KCR7KDAsIGkuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLnRleHR1cmUyRH0oQSwgb2Zmc2V0VG9Db29yZHMobG9naWNhbF9yb3dfc3RhcnRfb2Zmc2V0ICsgaSxcbiAgICAgICAgICAgICR7dX0sICR7Y30pKSkgLSBtYXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vcm1fZmFjdG9yO1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxsKSx7b3V0cHV0OntkaW1zOmEsdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6cy5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmR9KX0saD0oZSx0LG4scixvLGkpPT57Y29uc3RbYSx1XT1lLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodCh0LmRpbXMscy5UZXh0dXJlVHlwZS51bnBhY2tlZCksbD10LmRpbXMubGVuZ3RoO2lmKG48MXx8cjwxKXRocm93IG5ldyBFcnJvcigiTG9naWNhbCByb3cgY291bnQgTiBhbmQgZmVhdHVyZSBjb3VudCBEIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEiKTtpZigxIT09by5sZW5ndGh8fDEhPT1pLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkRpbWVuc2lvbmFsaXR5IG9mIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBzaG91bGQgYmUgMSIpO2lmKG9bMF0hPT1ufHxpWzBdIT09bil0aHJvdyBuZXcgRXJyb3IoIlNoYXBlIG9mIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBzaG91bGQgYmUgZXF1YWwgdG8gbG9naWNhbCByb3cgY291bnQiKTtjb25zdCBwPWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50WyR7bH1dIGluZGljZXMpIHtcblxuICAgICAgLy8gZ2V0IG9mZnNldCBvZiBjdXJyZW50IGxvZ2ljYWwgdGVuc29yIGluZGV4IGZyb20gdGhlIDItRCB0ZXh0dXJlIGNvb3JkaW5hdGVzIChUZXhDb29yZHMpXG4gICAgICBpbnQgb2Zmc2V0ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke2F9LCAke3V9KTtcblxuICAgICAgLy9kZXRlcm1pbmUgdGhlIGxvZ2ljYWwgcm93IGZvciB0aGlzIGluZGV4XG4gICAgICBpbnQgbG9naWNhbF9yb3dfaW5kZXhbMV07XG4gICAgICBsb2dpY2FsX3Jvd19pbmRleFswXSA9IG9mZnNldCAvICR7cn07XG5cbiAgICAgIGZsb2F0IG5vcm1fZmFjdG9yID0gX05vcm0obG9naWNhbF9yb3dfaW5kZXgpO1xuXG4gICAgICAvLyBhdm9pZCBwb3NzaWJsZSBkaXZpc2lvbiBieSAwXG4gICAgICAvLyBpZiBub3JtX2ZhY29yIGlzIDAsIGFsbCBlbGVtZW50cyBhcmUgemVyb1xuICAgICAgLy8gaWYgc28sIHJldHVybiAwXG4gICAgICBpZihub3JtX2ZhY3RvciA9PSAwLjApXG4gICAgICAgIHJldHVybiAwLjA7XG5cbiAgICAgIHJldHVybiBleHAoX0EoaW5kaWNlcykgLSBfTWF4KGxvZ2ljYWxfcm93X2luZGV4KSkgLyBub3JtX2ZhY3RvcjtcbiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGMpLHtvdXRwdXQ6e2RpbXM6dC5kaW1zLHR5cGU6dC50eXBlLHRleHR1cmVUeXBlOnMuVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpwfSl9LGc9ZT0+e2lmKCFlfHwxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJTb2Z0bWF4IHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoImZsb2F0MzIiIT09ZVswXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUiKX07fSw1NjQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlU3BsaXRBdHRyaWJ1dGVzPXQuc3BsaXQ9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNzI3MyksaT1uKDU2MzkpLHM9e25hbWU6IlNwbGl0IixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W2kuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnNwbGl0PShlLHQsbik9PntsKHQpO2NvbnN0IHI9by5TaGFwZVV0aWwubm9ybWFsaXplQXhpcyhuLmF4aXMsdFswXS5kaW1zLmxlbmd0aCksaT1hKGUsdCxyLG4pLGM9W107Zm9yKGxldCBvPTA7bzxpOysrbyljLnB1c2goZS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtjYWNoZUhpbnQ6YCR7bi5jYWNoZUtleX07JHtvfWAsZ2V0OigpPT51KGUsdFswXSxuLHIsbyl9KSx0KSk7cmV0dXJuIGN9LHQucGFyc2VTcGxpdEF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEludCgiYXhpcyIsMCksbj1lLmF0dHJpYnV0ZXMuZ2V0SW50cygic3BsaXQiLFtdKSxvPWUub3V0cHV0cy5sZW5ndGg7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4aXM6dCxzcGxpdDpuLG51bU91dHB1dHM6b30pfTtjb25zdCBhPShlLHQsbixyKT0+e2NvbnN0WyxpXT1vLlNwbGl0VXRpbC5zcGxpdFNoYXBlKHRbMF0uZGltcyxuLHIuc3BsaXQsci5udW1PdXRwdXRzKTtyZXR1cm4gaS5sZW5ndGh9LHU9KGUsdCxuLHIsYSk9Pntjb25zdFt1LGxdPW8uU3BsaXRVdGlsLnNwbGl0U2hhcGUodC5kaW1zLHIsbi5zcGxpdCxuLm51bU91dHB1dHMpLGM9bFthXSxwPXVbYV0sZD1gXG4gICAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7cC5sZW5ndGh9XSkge1xuICAgICAgICBpbmRpY2VzWyR7cn1dICs9ICR7Y307XG4gICAgICAgIHJldHVybiBfQShpbmRpY2VzKTtcbiAgICAgIH1cbiAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scykse2NhY2hlSGludDpgJHtuLmNhY2hlS2V5fToke2F9YCxvdXRwdXQ6e2RpbXM6cCx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6ZH0pfSxsPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU3BsaXQgcmVxdWlyZXMgb25lIGlucHV0LiIpO2lmKCJpbnQ4IiE9PWVbMF0udHlwZSYmInVpbnQ4IiE9PWVbMF0udHlwZSYmImludDE2IiE9PWVbMF0udHlwZSYmInVpbnQxNiIhPT1lWzBdLnR5cGUmJiJpbnQzMiIhPT1lWzBdLnR5cGUmJiJ1aW50MzIiIT09ZVswXS50eXBlJiYiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZSYmImJvb2wiIT09ZVswXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDU0MTY6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlU3F1ZWV6ZUF0dHJpYnV0ZXM9dC5zcXVlZXplVjEzPXQuc3F1ZWV6ZT12b2lkIDA7Y29uc3Qgcj1uKDcyNzMpO3Quc3F1ZWV6ZT0oZSx0LG4pPT57byh0KTtjb25zdCBpPXIuU2hhcGVVdGlsLnNxdWVlemVTaGFwZSh0WzBdLmRpbXMsbik7cmV0dXJuIFtlLnJlc2hhcGVVbnBhY2tlZCh0WzBdLGkpXX0sdC5zcXVlZXplVjEzPShlLG4pPT4oaShuKSwoMCwgdC5zcXVlZXplKShlLFtuWzBdXSxBcnJheS5mcm9tKG5bMV0uaW50ZWdlckRhdGEpKSksdC5wYXJzZVNxdWVlemVBdHRyaWJ1dGVzPWU9PmUuYXR0cmlidXRlcy5nZXRJbnRzKCJheGVzIik7Y29uc3Qgbz1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlNxdWVlemUgcmVxdWlyZXMgMSBpbnB1dC4iKTtpZigic3RyaW5nIj09PWVbMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgaW5wdXQgdGVuc29yIHR5cGVzLiIpfSxpPWU9PntpZighZXx8MiE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU3F1ZWV6ZSByZXF1aXJlcyAyIGlucHV0cy4iKTtpZigiaW50MzIiIT09ZVsxXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDEyNDA6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnN1bT12b2lkIDA7Y29uc3Qgcj1uKDY3NTcpLG89big1NjM5KTt0LnN1bT0oZSx0KT0+e3ModCk7Y29uc3Qgbj17bmFtZToiU3VtIixpbnB1dE5hbWVzOnQubWFwKCgoZSx0KT0+YFgke3R9YCkpLGlucHV0VHlwZXM6bmV3IEFycmF5KHQubGVuZ3RoKS5maWxsKG8uVGV4dHVyZVR5cGUudW5wYWNrZWQpfTtyZXR1cm4gW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7Z2V0OigpPT5pKGUsdCxuKX0pLHQpXX07Y29uc3QgaT0oZSx0LG4pPT57Y29uc3QgaT0oMCwgci5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbikscz10WzBdLmRpbXMuc2xpY2UoKSxhPWBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgdmVjNCByZXN1bHQgPSAke3QubWFwKCgoZSx0KT0+YCR7aS50ZXh0dXJlMkR9KFgke3R9LFRleENvb3JkcylgKSkuam9pbigiICsgIil9O1xuICAgICAgICAke2kub3V0cHV0fSA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbikse291dHB1dDp7ZGltczpzLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LGhhc01haW46ITAsc2hhZGVyU291cmNlOmF9KX0scz1lPT57aWYoIWV8fDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlN1bSByZXF1aXJlcyBpbnB1dHMuIik7Y29uc3QgdD1lWzBdLmRpbXMubGVuZ3RoO2ZvcihsZXQgbj0xO248ZS5sZW5ndGg7bisrKXtpZih0IT09ZVtuXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHNoYXBlcyBhcmUgbWlzbWF0Y2hlZC4iKTtmb3IobGV0IHI9MDtyPHQ7cisrKWlmKGVbMF0uZGltc1tyXSE9PWVbbl0uZGltc1tyXSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHNoYXBlcyBhcmUgbm90IG1hdGNoZWQuIil9aWYoImZsb2F0MzIiIT09ZVswXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIik7Zm9yKGxldCB0PTE7dDxlLmxlbmd0aDt0KyspaWYoZVswXS50eXBlIT09ZVt0XS50eXBlKXRocm93IG5ldyBFcnJvcigiSW5wdXQgdHlwZXMgYXJlIG5vdCBtYXRjaGVkLiIpfTt9LDU5NDQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnRpbGU9dm9pZCAwO2NvbnN0IHI9big2MTQ1KSxvPW4oNTYzOSk7dC50aWxlPShlLHQpPT57cyh0KTtjb25zdCBuPXtuYW1lOiJUaWxlIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWRdfTtyZXR1cm4gW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7Z2V0OigpPT5pKGUsdCxuKX0pLHQpXX07Y29uc3QgaT0oZSx0LG4pPT57Y29uc3Qgcj10WzBdLmRpbXMuc2xpY2UoKSxpPW5ldyBBcnJheShyLmxlbmd0aCkscz1bXTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrKylpW2VdPXJbZV0qdFsxXS5udW1iZXJEYXRhW2VdLHMucHVzaChgaW5wdXRJZHhbJHtlfV0gPSBpbnQobW9kKGZsb2F0KG91dHB1dElkeFske2V9XSksICR7cltlXX0uKSk7YCk7Y29uc3QgYT1pLmxlbmd0aCx1PWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IG91dHB1dElkeFske2F9XSkge1xuICAgICAgICBpbnQgaW5wdXRJZHhbJHthfV07XG4gICAgICAgICR7cy5qb2luKCJcbiIpfVxuICAgICAgICByZXR1cm4gX0EoaW5wdXRJZHgpO1xuICAgICAgfVxuICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7b3V0cHV0OntkaW1zOmksdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnV9KX0scz1lPT57aWYoIWV8fDIhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRpbGUgcmVxdWlyZXMgMiBpbnB1dC4iKTtpZigxIT09ZVsxXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBzZWNvbmQgaW5wdXQgc2hhcGUgbXVzdCAxIGRpbWVuc2lvbi4iKTtpZihlWzFdLmRpbXNbMF0hPT1lWzBdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZigtMT09PXIuTlVNQkVSX1RZUEVTLmluZGV4T2YoZVswXS50eXBlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKTtpZigiaW50MzIiIT09ZVsxXS50eXBlJiYiaW50MTYiIT09ZVsxXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCByZXBlYXQgdHlwZS4iKX07fSw1NzA3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZVRyYW5zcG9zZUF0dHJpYnV0ZXM9dC50cmFuc3Bvc2U9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNzI3MyksaT1uKDU2MzkpLHM9e25hbWU6IlRyYW5zcG9zZSIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnVucGFja2VkXX07dC50cmFuc3Bvc2U9KGUsdCxuKT0+KHAodCksW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXksZ2V0OigpPT5hKGUsdFswXSxuLnBlcm0pfSksdCldKSx0LnBhcnNlVHJhbnNwb3NlQXR0cmlidXRlcz1lPT4oMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtwZXJtOmUuYXR0cmlidXRlcy5nZXRJbnRzKCJwZXJtIixbXSl9KTtjb25zdCBhPShlLHQsbik9Pntjb25zdCByPXQuZGltcztuPXUocixuKTtjb25zdCBvPWwocixuKSxhPXIubGVuZ3RoLHA9YFxuICAgICAgJHtjKCJwZXJtIixuLGEpfVxuICAgICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske2F9XSkge1xuICAgICAgICBpbnQgYVske2F9XTtcbiAgICAgICAgcGVybShhLCBpbmRpY2VzKTtcbiAgICAgICAgcmV0dXJuIF9BKGEpO1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7b3V0cHV0OntkaW1zOm8sdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnB9KX0sdT0oZSx0KT0+KHQmJnQubGVuZ3RoIT09ZS5sZW5ndGgmJih0PVsuLi5lLmtleXMoKV0ucmV2ZXJzZSgpKSx0KSxsPShlLHQpPT4odD11KGUsdCksby5TaGFwZVV0aWwuc29ydEJhc2VkT25QZXJtKGUsdCkpLGM9KGUsdCxuKT0+e2NvbnN0IHI9W107ci5wdXNoKGB2b2lkICR7ZX0ob3V0IGludCBhWyR7bn1dLCBpbnQgc3JjWyR7bn1dKSB7YCk7Zm9yKGxldCBlPTA7ZTxuOysrZSlyLnB1c2goYFx0YVske3RbZV19XT1zcmNbJHtlfV07YCk7cmV0dXJuIHIucHVzaCgiXHR9Iiksci5qb2luKCJcbiIpfSxwPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVHJhbnNwb3NlIHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoImZsb2F0MzIiIT09ZVswXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnB1dCBzaG91bGQgYmUgZmxvYXQgdGVuc29yIil9O30sMjQ4ODooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZW5jb2RlQXNVaW50OD12b2lkIDA7Y29uc3Qgcj1uKDY3NTcpLG89big1NjM5KTt0LmVuY29kZUFzVWludDg9KGUsdCk9Pntjb25zdCBuPXQuc2hhcGUsaT0oMCwgci5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbikscz1gXG4gICAgY29uc3QgZmxvYXQgRkxPQVRfTUFYID0gMS43MDE0MTE4NGUzODtcbiAgICBjb25zdCBmbG9hdCBGTE9BVF9NSU4gPSAxLjE3NTQ5NDM1ZS0zODtcblxuICAgIGJvb2wgaXNOYU4oZmxvYXQgdmFsKSB7XG4gICAgICByZXR1cm4gKHZhbCA8IDEuMCB8fCAwLjAgPCB2YWwgfHwgdmFsID09IDAuMCkgPyBmYWxzZSA6IHRydWU7XG4gICAgfVxuXG4gICAgaGlnaHAgdmVjNCBlbmNvZGVBc1VpbnQ4KGhpZ2hwIGZsb2F0IHYpIHtcbiAgICAgIGlmIChpc05hTih2KSkge1xuICAgICAgICByZXR1cm4gdmVjNCgyNTUsIDI1NSwgMjU1LCAyNTUpO1xuICAgICAgfVxuXG4gICAgICBoaWdocCBmbG9hdCBhdiA9IGFicyh2KTtcblxuICAgICAgaWYoYXYgPCBGTE9BVF9NSU4pIHtcbiAgICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsIDAuMCwgMC4wKTtcbiAgICAgIH0gZWxzZSBpZih2ID4gRkxPQVRfTUFYKSB7XG4gICAgICAgIHJldHVybiB2ZWM0KDAuMCwgMC4wLCAxMjguMCwgMTI3LjApIC8gMjU1LjA7XG4gICAgICB9IGVsc2UgaWYodiA8IC1GTE9BVF9NQVgpIHtcbiAgICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsICAxMjguMCwgMjU1LjApIC8gMjU1LjA7XG4gICAgICB9XG5cbiAgICAgIGhpZ2hwIHZlYzQgYyA9IHZlYzQoMCwwLDAsMCk7XG5cbiAgICAgIGhpZ2hwIGZsb2F0IGUgPSBmbG9vcihsb2cyKGF2KSk7XG4gICAgICBoaWdocCBmbG9hdCBtID0gZXhwMihmcmFjdChsb2cyKGF2KSkpIC0gMS4wO1xuXG4gICAgICBjWzJdID0gZmxvb3IoMTI4LjAgKiBtKTtcbiAgICAgIG0gLT0gY1syXSAvIDEyOC4wO1xuICAgICAgY1sxXSA9IGZsb29yKDMyNzY4LjAgKiBtKTtcbiAgICAgIG0gLT0gY1sxXSAvIDMyNzY4LjA7XG4gICAgICBjWzBdID0gZmxvb3IoODM4ODYwOC4wICogbSk7XG5cbiAgICAgIGhpZ2hwIGZsb2F0IGViaWFzID0gZSArIDEyNy4wO1xuICAgICAgY1szXSA9IGZsb29yKGViaWFzIC8gMi4wKTtcbiAgICAgIGViaWFzIC09IGNbM10gKiAyLjA7XG4gICAgICBjWzJdICs9IGZsb29yKGViaWFzKSAqIDEyOC4wO1xuXG4gICAgICBjWzNdICs9IDEyOC4wICogc3RlcCgwLjAsIC12KTtcblxuICAgICAgcmV0dXJuIGMgLyAyNTUuMDtcbiAgICB9XG5cbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICBmbG9hdCB2YWx1ZSA9ICR7aS50ZXh0dXJlMkR9KFgsVGV4Q29vcmRzKS5yO1xuICAgICAgJHtpLm91dHB1dH0gPSBlbmNvZGVBc1VpbnQ4KHZhbHVlKTtcbiAgICB9YCxhPXtuYW1lOiJVaW50OEVuY29kZSIsaW5wdXRUeXBlczpbby5UZXh0dXJlVHlwZS51bnBhY2tlZF0saW5wdXROYW1lczpbIlgiXSxvdXRwdXQ6e2RpbXM6bix0eXBlOnQudGVuc29yLnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS5kb3dubG9hZFVpbnQ4QXNGbG9hdH0sc2hhZGVyU291cmNlOnMsaGFzTWFpbjohMH07cmV0dXJuIGUuZXhlY3V0ZVByb2dyYW0oYSxbdC50ZW5zb3JdKX07fSw5MDg3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC50YW5oPXQudGFuPXQuc3FydD10LnNpbj10LnNpZ21vaWQ9dC5yZWx1PXQubm90PXQubmVnPXQubG9nPXQucGFyc2VMZWFreVJlbHVBdHRyaWJ1dGVzPXQubGVha3lSZWx1PXQuaWRlbnRpdHk9dC5mbG9vcj10LmV4cD10LnBhcnNlRWx1QXR0cmlidXRlcz10LmVsdT10LmNvcz10LmNlaWw9dC5jbGlwVjExPXQucGFyc2VDbGlwQXR0cmlidXRlcz10LmNsaXA9dC5hdGFuPXQuYXNpbj10LmFjb3M9dC5hYnM9dC5nbHNsVGFuaD10Lmdsc2xUYW49dC5nbHNsU3FydD10Lmdsc2xTaWdtb2lkPXQuZ2xzbFJlbHU9dC5nbHNsU2luPXQuZ2xzbE5vdD10Lmdsc2xOZWc9dC5nbHNsTG9nPXQuZ2xzbExlYWt5UmVsdT10Lmdsc2xJZGVudGl0eT10Lmdsc2xDbGlwPXQuZ2xzbEZsb29yPXQuZ2xzbEV4cD10Lmdsc2xFbHU9dC5nbHNsQ29zPXQuZ2xzbENlaWw9dC5nbHNsQXRhbj10Lmdsc2xBc2luPXQuZ2xzbEFjb3M9dC5nbHNsQWJzPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDcyNzMpLGk9bigxOTk3KSxzPW4oNjc1NyksYT1uKDU2MzkpO2Z1bmN0aW9uIHUoKXtyZXR1cm4gRSgiYWJzIil9ZnVuY3Rpb24gbCgpe3JldHVybiBFKCJhY29zIil9ZnVuY3Rpb24gYygpe3JldHVybiBFKCJhc2luIil9ZnVuY3Rpb24gcCgpe3JldHVybiBFKCJhdGFuIil9ZnVuY3Rpb24gZCgpe3JldHVybiBFKCJjZWlsIil9ZnVuY3Rpb24gZigpe3JldHVybiBFKCJjb3MiKX1mdW5jdGlvbiBoKGUpe2NvbnN0IHQ9ImVsdSI7cmV0dXJuIHtib2R5OmBcbiAgY29uc3QgZmxvYXQgYWxwaGEgPSBmbG9hdCgke2V9KTtcblxuICBmbG9hdCAke3R9XyhmbG9hdCBhKSB7XG4gICAgcmV0dXJuIGEgPj0gMC4wID8gYTogKGV4cChhKSAtIDEuMCkgKiBhbHBoYTtcbiAgfVxuICB2ZWM0ICR7dH1fKHZlYzQgdikge1xuICAgIHJldHVybiB2ZWM0KCR7dH1fKHYueCksICR7dH1fKHYueSksICR7dH1fKHYueiksICR7dH1fKHYudykpO1xuICB9XG4gIGAsbmFtZTp0LHR5cGU6aS5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gZygpe3JldHVybiBFKCJleHAiKX1mdW5jdGlvbiBiKCl7cmV0dXJuIEUoImZsb29yIil9ZnVuY3Rpb24gbShlLHQpe2NvbnN0IG49ImNsaXAiO3JldHVybiB7Ym9keTpgXG4gIGNvbnN0IGZsb2F0IG1pbiA9IGZsb2F0KCR7ZX0pO1xuICBjb25zdCBmbG9hdCBtYXggPSBmbG9hdCgke3R9KTtcblxuICBmbG9hdCAke259XyhmbG9hdCBhKSB7XG4gICAgcmV0dXJuIGNsYW1wKGEsIG1pbiwgbWF4KTtcbiAgfVxuICB2ZWM0ICR7bn1fKHZlYzQgdikge1xuICAgIHJldHVybiBjbGFtcCh2LCBtaW4sIG1heCk7XG4gIH1cbiAgYCxuYW1lOm4sdHlwZTppLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX1mdW5jdGlvbiB5KCl7Y29uc3QgZT0iaW5kZW50aXR5IjtyZXR1cm4ge2JvZHk6YFxuICBmbG9hdCAke2V9XyhmbG9hdCBhKSB7XG4gICAgcmV0dXJuIGE7XG4gIH1cbiAgdmVjNCAke2V9Xyh2ZWM0IHYpIHtcbiAgICByZXR1cm4gdjtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIHYoZSl7Y29uc3QgdD0ibGVha3lSZWx1IjtyZXR1cm4ge2JvZHk6YFxuICBjb25zdCBmbG9hdCBhbHBoYSA9IGZsb2F0KCR7ZX0pO1xuXG4gIGZsb2F0ICR7dH1fKGZsb2F0IGEpIHtcbiAgICByZXR1cm4gYSA8IDAuMCA/IGEgKiBhbHBoYSA6IGE7XG4gIH1cbiAgdmVjNCAke3R9Xyh2ZWM0IHYpIHtcbiAgICByZXR1cm4gdmVjNCgke3R9Xyh2LngpLCAke3R9Xyh2LnkpLCAke3R9Xyh2LnopLCAke3R9Xyh2LncpKTtcbiAgfVxuICBgLG5hbWU6dCx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIF8oKXtyZXR1cm4gRSgibG9nIil9ZnVuY3Rpb24gdygpe2NvbnN0IGU9Im5lZyI7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfV8oZmxvYXQgYSkge1xuICAgIHJldHVybiAtYTtcbiAgfVxuICB2ZWM0ICR7ZX1fKHZlYzQgdikge1xuICAgIHJldHVybiAtdjtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIFQoKXtjb25zdCBlPSJub3QiO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX1fKGZsb2F0IGEpIHtcbiAgICByZXR1cm4gZmxvYXQoICEgYm9vbChhKSApO1xuICB9XG4gIGJvb2wgJHtlfV8oYm9vbCBhKSB7XG4gICAgcmV0dXJuICFhO1xuICB9XG4gIHZlYzQgJHtlfV8odmVjNCB2KSB7XG4gICAgcmV0dXJuIHZlYzQoIWJvb2wodi54KSwgIWJvb2wodi55KSwgIWJvb2wodi56KSwgIWJvb2wodi53KSk7XG4gIH1cbiAgYnZlYzQgJHtlfV8oYnZlYzQgdikge1xuICAgIHJldHVybiBidmVjNCghdi54LCAhdi55LCAhdi56LCAhdi53KTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIHgoKXtyZXR1cm4gRSgic2luIil9ZnVuY3Rpb24gTygpe2NvbnN0IGU9InJlbHUiO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX1fKGZsb2F0IGEpIHtcbiAgICByZXR1cm4gbWF4KCBhLCAwLjAgKTtcbiAgfVxuICB2ZWM0ICR7ZX1fKHZlYzQgdikge1xuICAgIHJldHVybiBtYXgoIHYsIDAuMCApO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6aS5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gUygpe2NvbnN0IGU9InNpZ21vaWQiO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX1fKGZsb2F0IGEpIHtcbiAgICByZXR1cm4gMS4wIC8gKDEuMCArIGV4cCgtYSkpO1xuICB9XG4gIHZlYzQgJHtlfV8odmVjNCB2KSB7XG4gICAgcmV0dXJuIDEuMCAvICgxLjAgKyBleHAoLXYpKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIEEoKXtyZXR1cm4gRSgic3FydCIpfWZ1bmN0aW9uIFAoKXtyZXR1cm4gRSgidGFuIil9ZnVuY3Rpb24gSSgpe2NvbnN0IGU9InRhbmgiO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX1fKGZsb2F0IGEpIHtcbiAgICBhID0gY2xhbXAoYSwgLTEwLiwgMTAuKTtcbiAgICBhID0gZXhwKDIuKmEpO1xuICAgIHJldHVybiAoYSAtIDEuKSAvIChhICsgMS4pO1xuICB9XG4gIHZlYzQgJHtlfV8odmVjNCB2KSB7XG4gICAgdiA9IGNsYW1wKHYsIC0xMC4sIDEwLik7XG4gICAgdiA9IGV4cCgyLip2KTtcbiAgICByZXR1cm4gKHYgLSAxLikgLyAodiArIDEuKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIEUoZSl7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfV8oZmxvYXQgYSkge1xuICAgIHJldHVybiAke2V9KGEpO1xuICB9XG4gIHZlYzQgJHtlfV8odmVjNCB2KSB7XG4gICAgcmV0dXJuICR7ZX0odik7XG4gIH1cbiAgYCxuYW1lOmUsdHlwZTppLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX10Lmdsc2xBYnM9dSx0Lmdsc2xBY29zPWwsdC5nbHNsQXNpbj1jLHQuZ2xzbEF0YW49cCx0Lmdsc2xDZWlsPWQsdC5nbHNsQ29zPWYsdC5nbHNsRWx1PWgsdC5nbHNsRXhwPWcsdC5nbHNsRmxvb3I9Yix0Lmdsc2xDbGlwPW0sdC5nbHNsSWRlbnRpdHk9eSx0Lmdsc2xMZWFreVJlbHU9dix0Lmdsc2xMb2c9Xyx0Lmdsc2xOZWc9dyx0Lmdsc2xOb3Q9VCx0Lmdsc2xTaW49eCx0Lmdsc2xSZWx1PU8sdC5nbHNsU2lnbW9pZD1TLHQuZ2xzbFNxcnQ9QSx0Lmdsc2xUYW49UCx0Lmdsc2xUYW5oPUk7Y29uc3QgRD0oZSx0LG4scik9Pntjb25zdCBvPWUuc2Vzc2lvbi5wYWNrP2EuVGV4dHVyZVR5cGUucGFja2VkOmEuVGV4dHVyZVR5cGUudW5wYWNrZWQsaT17bmFtZTpuLm5hbWUsaW5wdXRUeXBlczpbb10saW5wdXROYW1lczpbIkEiXSxjYWNoZUhpbnQ6cn07cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx7Z2V0OigpPT4oKGUsdCxuLHIpPT57Y29uc3Qgbz1lLnNlc3Npb24ucGFjaz9hLlRleHR1cmVUeXBlLnBhY2tlZDphLlRleHR1cmVUeXBlLnVucGFja2VkLGk9KDAsIHMuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse291dHB1dDp7ZGltczpuLmRpbXMsdHlwZTpuLnR5cGUsdGV4dHVyZVR5cGU6b30sc2hhZGVyU291cmNlOmBcbiAgICAgJHtyLmJvZHl9XG4gICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICB2ZWM0IHYgPSAke2kudGV4dHVyZTJEfShBLCBUZXhDb29yZHMpO1xuICAgICAgIHYgPSAke3IubmFtZX1fKHYpO1xuICAgICAgICR7aS5vdXRwdXR9ID0gdjtcbiAgICAgfVxuICAgICBgLGhhc01haW46ITB9KX0pKGUsaSx0LG4pfSl9O3QuYWJzPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sdSgpKSx0KV0sdC5hY29zPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sbCgpKSx0KV0sdC5hc2luPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sYygpKSx0KV0sdC5hdGFuPShlLHQpPT5bZS5ydW4oRChlLHRbMF0scCgpKSx0KV0sdC5jbGlwPShlLHQsbik9PltlLnJ1bihEKGUsdFswXSxtKG4ubWluLG4ubWF4KSxuLmNhY2hlS2V5KSx0KV0sdC5wYXJzZUNsaXBBdHRyaWJ1dGVzPWU9PigwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe21pbjplLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoIm1pbiIsby5NSU5fQ0xJUCksbWF4OmUuYXR0cmlidXRlcy5nZXRGbG9hdCgibWF4IixvLk1BWF9DTElQKX0pLHQuY2xpcFYxMT0oZSxuKT0+e2NvbnN0IHI9JChlLG4pO3JldHVybiAoMCwgdC5jbGlwKShlLFtuWzBdXSxyKX07Y29uc3QgJD0oZSx0KT0+e2lmKHQubGVuZ3RoPj0zJiYoIWUuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbMV0uZGF0YUlkKXx8IWUuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbMl0uZGF0YUlkKSkpdGhyb3cgbmV3IEVycm9yKCJkeW5hbWljIGNsaXAgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQiKTtjb25zdCBuPXQubGVuZ3RoPj0zP3RbMV0ubnVtYmVyRGF0YVswXTpvLk1JTl9DTElQLGk9dC5sZW5ndGg+PTM/dFsyXS5udW1iZXJEYXRhWzBdOm8uTUFYX0NMSVA7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe21pbjpuLG1heDppfSl9O3QuY2VpbD0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLGQoKSksdCldLHQuY29zPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sZigpKSx0KV0sdC5lbHU9KGUsdCxuKT0+W2UucnVuKEQoZSx0WzBdLGgobi5hbHBoYSksbi5jYWNoZUtleSksdCldLHQucGFyc2VFbHVBdHRyaWJ1dGVzPWU9PigwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2FscGhhOmUuYXR0cmlidXRlcy5nZXRGbG9hdCgiYWxwaGEiLDEpfSksdC5leHA9KGUsdCk9PltlLnJ1bihEKGUsdFswXSxnKCkpLHQpXSx0LmZsb29yPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sYigpKSx0KV0sdC5pZGVudGl0eT0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLHkoKSksdCldLHQubGVha3lSZWx1PShlLHQsbik9PltlLnJ1bihEKGUsdFswXSx2KG4uYWxwaGEpLG4uY2FjaGVLZXkpLHQpXSx0LnBhcnNlTGVha3lSZWx1QXR0cmlidXRlcz1lPT4oMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHthbHBoYTplLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImFscGhhIiwuMDEpfSksdC5sb2c9KGUsdCk9PltlLnJ1bihEKGUsdFswXSxfKCkpLHQpXSx0Lm5lZz0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLHcoKSksdCldLHQubm90PShlLHQpPT5bZS5ydW4oRChlLHRbMF0sVCgpKSx0KV0sdC5yZWx1PShlLHQpPT5bZS5ydW4oRChlLHRbMF0sTygpKSx0KV0sdC5zaWdtb2lkPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sUygpKSx0KV0sdC5zaW49KGUsdCk9PltlLnJ1bihEKGUsdFswXSx4KCkpLHQpXSx0LnNxcnQ9KGUsdCk9PltlLnJ1bihEKGUsdFswXSxBKCkpLHQpXSx0LnRhbj0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLFAoKSksdCldLHQudGFuaD0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLEkoKSksdCldO30sNTQwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jcmVhdGVVbnBhY2tQcm9ncmFtSW5mb0xvYWRlcj10LmNyZWF0ZVVucGFja1Byb2dyYW1JbmZvPXZvaWQgMDtjb25zdCByPW4oNjc1Nyksbz1uKDU2MzkpLGk9big0MzIpLHM9big1NjE0KSxhPXtuYW1lOiJ1bnBhY2siLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbby5UZXh0dXJlVHlwZS5wYWNrZWRdfTt0LmNyZWF0ZVVucGFja1Byb2dyYW1JbmZvPShlLHQpPT57Y29uc3Qgbj10LmRpbXMubGVuZ3RoLHU9KDAsIHMuZ2V0Q2hhbm5lbHMpKCJyYyIsbiksbD11LnNsaWNlKC0yKSxjPSgwLCBpLmdldENvb3Jkc0RhdGFUeXBlKShuKSxwPSgwLCBzLnVucGFja0Zyb21DaGFubmVsKSgpLGQ9MD09PXQuZGltcy5sZW5ndGg/IiI6ZnVuY3Rpb24oZSx0KXtpZigxPT09ZSlyZXR1cm4gInJjIjtsZXQgbj0iIjtmb3IobGV0IHI9MDtyPGU7cisrKW4rPXRbcl0scjxlLTEmJihuKz0iLCIpO3JldHVybiBufShuLHUpLGY9bjw9MT8icmMiOmB2ZWMyKCR7bC5qb2luKCIsIil9KWAsaD1gXG4gICAgJHtwfVxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICR7Y30gcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgIC8vIFNhbXBsZSB0aGUgdGV4dHVyZSB3aXRoIHRoZSBjb29yZHMgdG8gZ2V0IHRoZSByZ2JhIGNoYW5uZWwgdmFsdWUuXG4gICAgICAgdmVjNCBwYWNrZWRJbnB1dCA9IGdldEEoJHtkfSk7XG5cbiAgICAgICAkeygwLCByLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKS5vdXRwdXR9ID0gdmVjNChnZXRDaGFubmVsKHBhY2tlZElucHV0LCAke2Z9KSwgMCwgMCwgMCk7XG4gICAgIH1cbiAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7aGFzTWFpbjohMCxvdXRwdXQ6e2RpbXM6dC5kaW1zLHR5cGU6dC50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpofSl9LHQuY3JlYXRlVW5wYWNrUHJvZ3JhbUluZm9Mb2FkZXI9KGUsbik9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7Z2V0OigpPT4oMCwgdC5jcmVhdGVVbnBhY2tQcm9ncmFtSW5mbykoZSxuKX0pO30sNzg2MjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VVbnNxdWVlemVBdHRyaWJ1dGVzPXQudW5zcXVlZXplVjEzPXQudW5zcXVlZXplPXZvaWQgMDtjb25zdCByPW4oNzI3Myk7dC51bnNxdWVlemU9KGUsdCxuKT0+e28odCk7Y29uc3QgaT1yLlNoYXBlVXRpbC51bnNxdWVlemVTaGFwZSh0WzBdLmRpbXMsbik7cmV0dXJuIFtlLnJlc2hhcGVVbnBhY2tlZCh0WzBdLGkpXX0sdC51bnNxdWVlemVWMTM9KGUsbik9PihpKG4pLCgwLCB0LnVuc3F1ZWV6ZSkoZSxbblswXV0sQXJyYXkuZnJvbShuWzFdLmludGVnZXJEYXRhKSkpLHQucGFyc2VVbnNxdWVlemVBdHRyaWJ1dGVzPWU9PmUuYXR0cmlidXRlcy5nZXRJbnRzKCJheGVzIik7Y29uc3Qgbz1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlVuc3F1ZWV6ZSByZXF1aXJlcyAxIGlucHV0LiIpO2lmKCJzdHJpbmciPT09ZVswXS50eXBlKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBpbnB1dCB0ZW5zb3IgdHlwZXMuIil9LGk9ZT0+e2lmKCFlfHwyIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJVbnNxdWVlemUgcmVxdWlyZXMgMiBpbnB1dHMuIik7aWYoImludDMyIiE9PWVbMV0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX07fSwzOTgwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5zY2FsZXNWYWxpZGF0aW9uPXQudmFsaWRhdGVJbnB1dHM9dC5wYXJzZVVwc2FtcGxlQXR0cmlidXRlcz10LnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzVjk9dC5wYXJzZVVwc2FtcGxlQXR0cmlidXRlc1Y3PXQudXBzYW1wbGU9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNjc1NyksaT1uKDU2MzkpLHM9e25hbWU6IlVwc2FtcGxlIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W2kuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnVwc2FtcGxlPShlLG4scik9PigoMCwgdC52YWxpZGF0ZUlucHV0cykobixyKSxbZS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtjYWNoZUhpbnQ6ci5jYWNoZUtleSxnZXQ6KCk9PmEoZSxuLHIpfSksbildKSx0LnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzVjc9ZT0+KDAsIHQucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXMpKGUsNyksdC5wYXJzZVVwc2FtcGxlQXR0cmlidXRlc1Y5PWU9PigwLCB0LnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzKShlLDkpLHQucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXM9KGUsbik9Pntjb25zdCBvPW4+PTEwLGk9ZS5hdHRyaWJ1dGVzLmdldFN0cmluZygibW9kZSIsIm5lYXJlc3QiKTtpZigibmVhcmVzdCIhPT1pJiYibGluZWFyIiE9PWkmJihuPDExfHwiY3ViaWMiIT09aSkpdGhyb3cgbmV3IEVycm9yKGB1bnJlY29nbml6ZWQgbW9kZTogJHtpfWApO2xldCBzPVtdO248OSYmKHM9ZS5hdHRyaWJ1dGVzLmdldEZsb2F0cygic2NhbGVzIiksKDAsIHQuc2NhbGVzVmFsaWRhdGlvbikocyxpLG8pKTtjb25zdCBhPWUuYXR0cmlidXRlcy5nZXRGbG9hdCgiZXh0cmFwb2xhdGlvbl92YWx1ZSIsMCksdT1uPjEwP2UuYXR0cmlidXRlcy5nZXRTdHJpbmcoImNvb3JkaW5hdGVfdHJhbnNmb3JtYXRpb25fbW9kZSIsImhhbGZfcGl4ZWwiKToiYXN5bW1ldHJpYyI7aWYoLTE9PT1bImFzeW1tZXRyaWMiLCJweXRvcmNoX2hhbGZfcGl4ZWwiLCJ0Zl9oYWxmX3BpeGVsX2Zvcl9ubiIsImFsaWduX2Nvcm5lcnMiLCJ0Zl9jcm9wX2FuZF9yZXNpemUiLCJoYWxmX3BpeGVsIl0uaW5kZXhPZih1KSl0aHJvdyBuZXcgRXJyb3IoYGNvb3JkaW5hdGVfdHJhbnNmb3JtX21vZGUgJyR7dX0nIGlzIG5vdCBzdXBwb3J0ZWRgKTtjb25zdCBsPSJ0Zl9jcm9wX2FuZF9yZXNpemUiPT09dSxjPWwscD0ibmVhcmVzdCI9PT1pJiZuPj0xMT9lLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJuZWFyZXN0X21vZGUiLCJyb3VuZF9wcmVmZXJfZmxvb3IiKToiIjtpZigtMT09PVsicm91bmRfcHJlZmVyX2Zsb29yIiwicm91bmRfcHJlZmVyX2NlaWwiLCJmbG9vciIsImNlaWwiLCIiXS5pbmRleE9mKHApKXRocm93IG5ldyBFcnJvcihgbmVhcmVzdF9tb2RlICcke3B9JyBpcyBub3Qgc3VwcG9ydGVkYCk7Y29uc3QgZD1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImN1YmljX2NvZWZmX2EiLC0uNzUpLGY9MCE9PWUuYXR0cmlidXRlcy5nZXRJbnQoImV4Y2x1ZGVfb3V0c2lkZSIsMCk7aWYoZiYmImN1YmljIiE9PWkpdGhyb3cgbmV3IEVycm9yKCJleGNsdWRlX291dHNpZGUgY2FuIGJlIHNldCB0byAxIG9ubHkgd2hlbiBtb2RlIGlzIENVQklDLiIpO2NvbnN0IGg9bjwxMXx8Im5lYXJlc3QiPT09aSYmImFzeW1tZXRyaWMiPT09dSYmImZsb29yIj09PXA7bGV0IGc9MCxiPTAsbT0wO3JldHVybiBuPjEwP2UuaW5wdXRzLmxlbmd0aD4yPyhnPTEsYj0yLG09Myk6KGI9MSxtPTIpOjk9PT1uJiYoYj0xKSwoMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtvcHNldDpuLGlzUmVzaXplOm8sbW9kZTppLHNjYWxlczpzLGV4dHJhcG9sYXRpb25WYWx1ZTphLGNvb3JkaW5hdGVUcmFuc2Zvcm1Nb2RlOnUsdXNlRXh0cmFwb2xhdGlvbjpjLG5lZWRSb2lJbnB1dDpsLG5lYXJlc3RNb2RlOnAsY3ViaWNDb2VmZmljaWVudEE6ZCxleGNsdWRlT3V0c2lkZTpmLHVzZU5lYXJlc3QyeE9wdGltaXphdGlvbjpoLHJvaUlucHV0SWR4Omcsc2NhbGVzSW5wdXRJZHg6YixzaXplc0lucHV0SWR4Om19KX07Y29uc3QgYT0oZSx0LG4pPT57Y29uc3Qgcj0oMCwgby5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksW2EsdV09ZS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQodFswXS5kaW1zLGkuVGV4dHVyZVR5cGUudW5wYWNrZWQpLGw9dFswXS5kaW1zLm1hcCgoKGUsdCk9Pk1hdGguZmxvb3IoZSpuLnNjYWxlc1t0XSkpKSxbYyxwXT1lLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodChsLGkuVGV4dHVyZVR5cGUudW5wYWNrZWQpLGQ9bC5sZW5ndGgsZj1uZXcgQXJyYXkoZCksaD1uZXcgQXJyYXkoZCk7bGV0IGc9YFxuICAgICAgaW50IG91dHB1dF9waXRjaGVzWyR7ZH1dO1xuICAgICAgaW50IGlucHV0X3BpdGNoZXNbJHtkfV07XG4gICAgICBgO2ZvcihsZXQgZT1kLTE7ZT49MDtlLS0pZltlXT1lPT09ZC0xPzE6ZltlKzFdKmxbZSsxXSxoW2VdPWU9PT1kLTE/MTpoW2UrMV0qdFswXS5kaW1zW2UrMV0sZys9YFxuICAgICAgICBvdXRwdXRfcGl0Y2hlc1ske2V9XSA9ICR7ZltlXX07XG4gICAgICAgIGlucHV0X3BpdGNoZXNbJHtlfV0gPSAke2hbZV19O1xuICAgICAgICBgO2NvbnN0IGI9YFxuICAgICAgZmxvYXQgZ2V0SW5wdXRGbG9hdChpbnQgaW5kZXgpIHtcbiAgICAgICAgdmVjMiBjb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhpbmRleCwgJHthfSwgJHt1fSk7XG4gICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7ci50ZXh0dXJlMkR9KFgsIGNvb3JkcykpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBgLG09Im5lYXJlc3QiPT09bi5tb2RlP2BcbiAgICAke2J9XG4gICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske2R9XSkge1xuICAgICAgaW50IGlucHV0X2luZGV4ID0gMDtcbiAgICAgIGludCBvdXRwdXRfaW5kZXggPSBjb29yZHNUb09mZnNldChUZXhDb29yZHMsICR7Y30sICR7cH0pO1xuXG4gICAgICAke2d9XG5cbiAgICAgIGludCBkLCBtO1xuICAgICAgZm9yIChpbnQgZGltID0gMDsgZGltIDwgJHtkfTsgKytkaW0pIHtcbiAgICAgICAgZCA9IG91dHB1dF9pbmRleCAvIG91dHB1dF9waXRjaGVzW2RpbV07XG4gICAgICAgIG0gPSBvdXRwdXRfaW5kZXggLSBkICogb3V0cHV0X3BpdGNoZXNbZGltXTtcbiAgICAgICAgb3V0cHV0X2luZGV4ID0gbTtcblxuICAgICAgICBpZiAoc2NhbGVzW2RpbV0gIT0gMSAmJiBkID4gMCkge1xuICAgICAgICAgIGludCBkMiA9IGQgLyBzY2FsZXNbZGltXTtcbiAgICAgICAgICBtID0gZCAtIGQyICogc2NhbGVzW2RpbV07XG4gICAgICAgICAgZCA9IGQyO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0X2luZGV4ICs9IGlucHV0X3BpdGNoZXNbZGltXSAqIGQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4KTtcbiAgICB9YDo0PT09ZD9gXG4gICAgJHtifVxuICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbNF0pIHtcbiAgICAgIGludCBpbnB1dF9pbmRleCA9IDA7XG4gICAgICBpbnQgb3V0cHV0X2luZGV4ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke2N9LCAke3B9KTtcblxuICAgICAgJHtnfVxuXG4gICAgICBpbnQgbTtcbiAgICAgIGludCBpbmRleF9vZl9kaW0wLCBpbmRleF9vZl9kaW0xLCBpbmRleF9vZl9kaW0yLCBpbmRleF9vZl9kaW0zO1xuICAgICAgaW5kZXhfb2ZfZGltMCA9IG91dHB1dF9pbmRleCAvIG91dHB1dF9waXRjaGVzWzBdO1xuICAgICAgbSA9IG91dHB1dF9pbmRleCAtIGluZGV4X29mX2RpbTAgKiBvdXRwdXRfcGl0Y2hlc1swXTtcbiAgICAgIGluZGV4X29mX2RpbTEgPSBtIC8gb3V0cHV0X3BpdGNoZXNbMV07XG4gICAgICBtID0gbSAtIGluZGV4X29mX2RpbTEgKiBvdXRwdXRfcGl0Y2hlc1sxXTtcbiAgICAgIGluZGV4X29mX2RpbTIgPSBtIC8gb3V0cHV0X3BpdGNoZXNbMl07XG4gICAgICBtID0gbSAtIGluZGV4X29mX2RpbTIgKiBvdXRwdXRfcGl0Y2hlc1syXTtcbiAgICAgIGluZGV4X29mX2RpbTMgPSBtO1xuXG4gICAgICBpbnQgaW5kZXhfb2ZfaW5wdXRfZGltMiwgaW5kZXhfb2ZfaW5wdXRfZGltMywgeF9vZmZzZXQsIHlfb2Zmc2V0O1xuICAgICAgaW5kZXhfb2ZfaW5wdXRfZGltMiA9IGluZGV4X29mX2RpbTIgLyBzY2FsZXNbMl07XG4gICAgICB5X29mZnNldCA9IGluZGV4X29mX2RpbTIgLSBpbmRleF9vZl9pbnB1dF9kaW0yICogc2NhbGVzWzJdO1xuICAgICAgaW5kZXhfb2ZfaW5wdXRfZGltMyA9IGluZGV4X29mX2RpbTMgLyBzY2FsZXNbM107XG4gICAgICB4X29mZnNldCA9IGluZGV4X29mX2RpbTMgLSBpbmRleF9vZl9pbnB1dF9kaW0zICogc2NhbGVzWzNdO1xuXG4gICAgICBpbnB1dF9pbmRleCA9IGluZGV4X29mX2RpbTAgKiBpbnB1dF9waXRjaGVzWzBdICtcbiAgICAgICAgICAgIGluZGV4X29mX2RpbTEgKiBpbnB1dF9waXRjaGVzWzFdICtcbiAgICAgICAgICAgIGluZGV4X29mX2lucHV0X2RpbTIgKiBpbnB1dF9waXRjaGVzWzJdICtcbiAgICAgICAgICAgIGluZGV4X29mX2lucHV0X2RpbTM7XG5cbiAgICAgIGZsb2F0IHgwMCA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXgpO1xuICAgICAgZmxvYXQgeDEwLCB4MDEsIHgxMTtcblxuICAgICAgYm9vbCBlbmRfb2ZfZGltMiA9IGZhbHNlO1xuICAgICAgaWYgKGluZGV4X29mX2lucHV0X2RpbTIgPT0gKCR7dFswXS5kaW1zWzJdfSAtIDEpKSB7XG4gICAgICAgIC8vIEl0J3MgdGhlIGVuZCBpbiBkaW1lbnNpb24gMlxuICAgICAgICB4MDEgPSB4MDA7XG4gICAgICAgIGVuZF9vZl9kaW0yID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHgwMSA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXggKyBpbnB1dF9waXRjaGVzWzJdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluZGV4X29mX2lucHV0X2RpbTMgPT0gKGlucHV0X3BpdGNoZXNbMl0gLSAxKSkge1xuICAgICAgICAvLyBJdCdzIHRoZSBlbmQgaW4gZGltZW5zaW9uIDNcbiAgICAgICAgeDEwID0geDAwO1xuICAgICAgICB4MTEgPSB4MDE7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgeDEwID0gZ2V0SW5wdXRGbG9hdChpbnB1dF9pbmRleCArIDEpO1xuICAgICAgICB4MTEgPSBlbmRfb2ZfZGltMiA/IHgxMCA6IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXggKyBpbnB1dF9waXRjaGVzWzJdICsgMSk7XG4gICAgICB9XG5cbiAgICAgIGZsb2F0IHkwID0geDAwICsgZmxvYXQoeV9vZmZzZXQpICogKHgwMSAtIHgwMCkgLyBmbG9hdChzY2FsZXNbMl0pO1xuICAgICAgZmxvYXQgeTEgPSB4MTAgKyBmbG9hdCh5X29mZnNldCkgKiAoeDExIC0geDEwKSAvIGZsb2F0KHNjYWxlc1syXSk7XG4gICAgICByZXR1cm4geTAgKyBmbG9hdCh4X29mZnNldCkgKiAoeTEgLSB5MCkgLyBmbG9hdChzY2FsZXNbM10pO1xuICAgIH1gOmBcbiAgICAke2J9XG4gICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1syXSkge1xuICAgICAgaW50IGlucHV0X2luZGV4ID0gMDtcbiAgICAgIGludCBvdXRwdXRfaW5kZXggPSBjb29yZHNUb09mZnNldChUZXhDb29yZHMsICR7Y30sICR7cH0pO1xuXG4gICAgICAke2d9XG5cbiAgICAgIGludCBtO1xuICAgICAgaW50IGluZGV4X29mX2RpbTAsIGluZGV4X29mX2RpbTE7XG4gICAgICBpbmRleF9vZl9kaW0wID0gb3V0cHV0X2luZGV4IC8gb3V0cHV0X3BpdGNoZXNbMF07XG4gICAgICBtID0gb3V0cHV0X2luZGV4IC0gaW5kZXhfb2ZfZGltMCAqIG91dHB1dF9waXRjaGVzWzBdO1xuICAgICAgaW5kZXhfb2ZfZGltMSA9IG07XG5cbiAgICAgIGludCBpbmRleF9vZl9pbnB1dF9kaW0wLCBpbmRleF9vZl9pbnB1dF9kaW0xLCB4X29mZnNldCwgeV9vZmZzZXQ7XG4gICAgICBpbmRleF9vZl9pbnB1dF9kaW0wID0gaW5kZXhfb2ZfZGltMCAvIHNjYWxlc1swXTtcbiAgICAgIHlfb2Zmc2V0ID0gaW5kZXhfb2ZfZGltMCAtIGluZGV4X29mX2lucHV0X2RpbTAgKiBzY2FsZXNbMF07XG4gICAgICBpbmRleF9vZl9pbnB1dF9kaW0xID0gaW5kZXhfb2ZfZGltMSAvIHNjYWxlc1sxXTtcbiAgICAgIHhfb2Zmc2V0ID0gaW5kZXhfb2ZfZGltMSAtIGluZGV4X29mX2lucHV0X2RpbTEgKiBzY2FsZXNbMV07XG5cbiAgICAgIGlucHV0X2luZGV4ID0gaW5kZXhfb2ZfaW5wdXRfZGltMCAqIGlucHV0X3BpdGNoZXNbMF0gKyBpbmRleF9vZl9pbnB1dF9kaW0xO1xuXG4gICAgICBmbG9hdCB4MDAgPSBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4KTtcbiAgICAgIGZsb2F0IHgxMCwgeDAxLCB4MTE7XG5cbiAgICAgIGJvb2wgZW5kX29mX2RpbTAgPSBmYWxzZTtcbiAgICAgIGlmIChpbmRleF9vZl9pbnB1dF9kaW0wID09ICgke3RbMF0uZGltc1swXX0gLSAxKSkge1xuICAgICAgICAvLyBJdCdzIHRoZSBlbmQgaW4gZGltZW5zaW9uIDBcbiAgICAgICAgeDAxID0geDAwO1xuICAgICAgICBlbmRfb2ZfZGltMCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4MDEgPSBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4ICsgaW5wdXRfcGl0Y2hlc1swXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbmRleF9vZl9pbnB1dF9kaW0xID09IChpbnB1dF9waXRjaGVzWzBdIC0gMSkpIHtcbiAgICAgICAgLy8gSXQncyB0aGUgZW5kIGluIGRpbWVuc2lvbiAxXG4gICAgICAgIHgxMCA9IHgwMDtcbiAgICAgICAgeDExID0geDAxO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHgxMCA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXggKyAxKTtcbiAgICAgICAgeDExID0gZW5kX29mX2RpbTAgPyB4MTAgOiBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4ICsgaW5wdXRfcGl0Y2hlc1swXSArIDEpO1xuICAgICAgfVxuXG4gICAgICBmbG9hdCB5MCA9IHgwMCArIGZsb2F0KHlfb2Zmc2V0KSAqICh4MDEgLSB4MDApIC8gZmxvYXQoc2NhbGVzWzBdKTtcbiAgICAgIGZsb2F0IHkxID0geDEwICsgZmxvYXQoeV9vZmZzZXQpICogKHgxMSAtIHgxMCkgLyBmbG9hdChzY2FsZXNbMF0pO1xuICAgICAgcmV0dXJuIHkwICsgZmxvYXQoeF9vZmZzZXQpICogKHkxIC0geTApIC8gZmxvYXQoc2NhbGVzWzFdKTtcbiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtvdXRwdXQ6e2RpbXM6bCx0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6bSx2YXJpYWJsZXM6W3tuYW1lOiJzY2FsZXMiLHR5cGU6ImludCIsYXJyYXlMZW5ndGg6bi5zY2FsZXMubGVuZ3RoLGRhdGE6bi5zY2FsZXMubWFwKChlPT5NYXRoLmNlaWwoZSkpKX1dfSl9O3QudmFsaWRhdGVJbnB1dHM9KGUsdCk9PntpZighZXx8dC5vcHNldDw5JiYxIT09ZS5sZW5ndGh8fHQub3BzZXQ+PTkmJnQub3BzZXQ8MTEmJjIhPT1lLmxlbmd0aHx8dC5vcHNldD49MTEmJmUubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGlucHV0cy4iKTtpZih0LnNjYWxlcy5sZW5ndGg+MCYmZVswXS5kaW1zLmxlbmd0aCE9PXQuc2NhbGVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgc2hhcGUuIik7aWYoInN0cmluZyI9PT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRlbnNvciB0eXBlcy4iKX0sdC5zY2FsZXNWYWxpZGF0aW9uPShlLHQsbik9PntpZihuKXtmb3IoY29uc3QgdCBvZiBlKWlmKHQ8PTApdGhyb3cgbmV3IEVycm9yKCJTY2FsZSB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAuIil9ZWxzZSBmb3IoY29uc3QgdCBvZiBlKWlmKHQ8MSl0aHJvdyBuZXcgRXJyb3IoIlNjYWxlIHZhbHVlIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4iKTtpZighKCJsaW5lYXIiIT09dCYmImN1YmljIiE9PXR8fDI9PT1lLmxlbmd0aHx8ND09PWUubGVuZ3RoJiYxPT09ZVswXSYmMT09PWVbMV0pKXRocm93IG5ldyBFcnJvcihgJ0xpbmVhcicgbW9kZSBhbmQgJ0N1YmljJyBtb2RlIG9ubHkgc3VwcG9ydCAyLUQgaW5wdXRzICgnQmlsaW5lYXInLCAnQmljdWJpYycpICAgICAgICAgb3IgNC1EIGlucHV0cyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG91dGVybW9zdCAyIHNjYWxlIHZhbHVlcyBiZWluZyAxICAgICAgICAgaW4gdGhlICR7bj8iUmVzaXplIjoiVXBzYW1wbGUifSBvcGVhcnRvci5gKX07fSwyNzU3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Qcm9ncmFtTWFuYWdlcj12b2lkIDA7Y29uc3Qgcj1uKDIyMzUpLG89bigxMzE1KSxpPW4oODg5Nykscz1uKDY3NTcpO3QuUHJvZ3JhbU1hbmFnZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMucHJvZmlsZXI9ZSx0aGlzLmdsQ29udGV4dD10LHRoaXMudGV4dHVyZUxheW91dFN0cmF0ZWd5PW4sdGhpcy5yZXBvPW5ldyBNYXAsdGhpcy5hdHRyaWJ1dGVzQm91bmQ9ITE7fWdldEFydGlmYWN0KGUpe3JldHVybiB0aGlzLnJlcG8uZ2V0KGUpfXNldEFydGlmYWN0KGUsdCl7dGhpcy5yZXBvLnNldChlLHQpO31ydW4oZSx0LG4pe3ZhciByO3RoaXMucHJvZmlsZXIuZXZlbnQoIm9wIixgUHJvZ3JhbU1hbmFnZXIucnVuICR7bnVsbCE9PShyPWUucHJvZ3JhbUluZm8ubmFtZSkmJnZvaWQgMCE9PXI/cjoidW5rbm93biBrZXJuZWwifWAsKCgpPT57dmFyIHI7Y29uc3QgaT10aGlzLmdsQ29udGV4dC5nbCxzPWUucHJvZ3JhbTtpLnVzZVByb2dyYW0ocyk7dHJ5e3RoaXMuYmluZE91dHB1dChuKSx0aGlzLmF0dHJpYnV0ZXNCb3VuZHx8dGhpcy5iaW5kQXR0cmlidXRlcyhlLmF0dHJpYkxvY2F0aW9ucyksdGhpcy5iaW5kVW5pZm9ybXMoZS51bmlmb3JtTG9jYXRpb25zLG51bGwhPT0ocj1lLnByb2dyYW1JbmZvLnZhcmlhYmxlcykmJnZvaWQgMCE9PXI/cjpbXSx0KTt9Y2F0Y2godCl7dGhyb3cgby5Mb2dnZXIuZXJyb3IoIlByb2dyYW1NYW5hZ2VyIixlLnByb2dyYW1JbmZvLnNoYWRlclNvdXJjZSksdH10aGlzLnByb2ZpbGVyLmV2ZW50KCJiYWNrZW5kIiwiR2xDb250ZXh0LmRyYXcoKSIsKCgpPT57dGhpcy5nbENvbnRleHQuZHJhdygpO30pKTt9KSx0aGlzLmdsQ29udGV4dCk7fWRpc3Bvc2UoKXt0aGlzLnZlcnRleFNoYWRlciYmdGhpcy5nbENvbnRleHQuZGVsZXRlU2hhZGVyKHRoaXMudmVydGV4U2hhZGVyKSx0aGlzLnJlcG8uZm9yRWFjaCgoZT0+dGhpcy5nbENvbnRleHQuZGVsZXRlUHJvZ3JhbShlLnByb2dyYW0pKSk7fWJ1aWxkKGUsdCxuKXtyZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgiYmFja2VuZCIsIlByb2dyYW1NYW5hZ2VyLmJ1aWxkIiwoKCk9Pntjb25zdCByPW5ldyBpLkdsc2xQcmVwcm9jZXNzb3IodGhpcy5nbENvbnRleHQsZSx0LG4pLG89ci5wcmVwcm9jZXNzKCkscz10aGlzLmNvbXBpbGUobyk7cmV0dXJuIHtwcm9ncmFtSW5mbzplLHByb2dyYW06cyx1bmlmb3JtTG9jYXRpb25zOnRoaXMuZ2V0VW5pZm9ybUxvY2F0aW9ucyhzLHIuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLHIuY29udGV4dC5wcm9ncmFtSW5mby52YXJpYWJsZXMpLGF0dHJpYkxvY2F0aW9uczp0aGlzLmdldEF0dHJpYkxvY2F0aW9ucyhzKX19KSl9Y29tcGlsZShlKXtpZighdGhpcy52ZXJ0ZXhTaGFkZXIpe28uTG9nZ2VyLnZlcmJvc2UoIlByb3JncmFtTWFuYWdlciIsIkNvbXBpbGluZyBhbmQgY2FjaGluZyBWZXJ0ZXggc2hhZGVyIGZvciB0aGUgZmlyc3QgdGltZSIpO2NvbnN0IGU9KDAsIHMuZ2V0VmVydGV4U2hhZGVyU291cmNlKSh0aGlzLmdsQ29udGV4dC52ZXJzaW9uKTt0aGlzLnZlcnRleFNoYWRlcj10aGlzLmdsQ29udGV4dC5jb21waWxlU2hhZGVyKGUsdGhpcy5nbENvbnRleHQuZ2wuVkVSVEVYX1NIQURFUik7fXIuZW52LmRlYnVnJiZvLkxvZ2dlci52ZXJib3NlKCJQcm9yZ3JhbU1hbmFnZXIiLGBGcmFnU2hhZGVyOlxuJHtlfVxuYCk7Y29uc3QgdD10aGlzLmdsQ29udGV4dC5jb21waWxlU2hhZGVyKGUsdGhpcy5nbENvbnRleHQuZ2wuRlJBR01FTlRfU0hBREVSKSxuPXRoaXMuZ2xDb250ZXh0LmNyZWF0ZVByb2dyYW0odGhpcy52ZXJ0ZXhTaGFkZXIsdCk7cmV0dXJuIHRoaXMuZ2xDb250ZXh0LmRlbGV0ZVNoYWRlcih0KSxufWJpbmRPdXRwdXQoZSl7Y29uc3QgdD1lLndpZHRoLG49ZS5oZWlnaHQ7by5Mb2dnZXIudmVyYm9zZSgiUHJvcmdyYW1NYW5hZ2VyIixgQmluZGluZyBvdXRwdXQgdGV4dHVyZSB0byBGcmFtZWJ1ZmZlcjogdy9oPSR7dH0vJHtufSwgc2hhcGU9JHtlLnNoYXBlfSwgdHlwZT0ke2UudGVuc29yLnR5cGV9YCksdGhpcy5nbENvbnRleHQuYXR0YWNoRnJhbWVidWZmZXIoZS50ZXh0dXJlLHQsbik7fWJpbmRBdHRyaWJ1dGVzKGUpe2NvbnN0IHQ9ZS5wb3NpdGlvbixuPWUudGV4dHVyZUNvb3JkO3RoaXMuZ2xDb250ZXh0LnNldFZlcnRleEF0dHJpYnV0ZXModCxuKSx0aGlzLmF0dHJpYnV0ZXNCb3VuZD0hMDt9YmluZFVuaWZvcm1zKGUsdCxuKXt2YXIgcjtjb25zdCBvPXRoaXMuZ2xDb250ZXh0LmdsO2xldCBpPTA7Zm9yKGNvbnN0e25hbWU6cyx0eXBlOmEsbG9jYXRpb246dSxhcnJheUxlbmd0aDpsfW9mIGUpe2NvbnN0IGU9bnVsbD09PShyPXQuZmluZCgoZT0+ZS5uYW1lPT09cykpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5kYXRhO2lmKCJzYW1wbGVyMkQiIT09YSYmIWUpdGhyb3cgbmV3IEVycm9yKGB2YXJpYWJsZSAnJHtzfScgZG9lcyBub3QgaGF2ZSBkYXRhIGRlZmluZWQgaW4gcHJvZ3JhbSBpbmZvYCk7c3dpdGNoKGEpe2Nhc2Uic2FtcGxlcjJEIjp0aGlzLmJpbmRUZXh0dXJlKG5baV0sdSxpKSxpKys7YnJlYWs7Y2FzZSJmbG9hdCI6bD9vLnVuaWZvcm0xZnYodSxlKTpvLnVuaWZvcm0xZih1LGUpO2JyZWFrO2Nhc2UiaW50IjpsP28udW5pZm9ybTFpdih1LGUpOm8udW5pZm9ybTFpKHUsZSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuaWZvcm0gbm90IGltcGxlbWVudGVkOiAke2F9YCl9fX1iaW5kVGV4dHVyZShlLHQsbil7dGhpcy5nbENvbnRleHQuYmluZFRleHR1cmVUb1VuaWZvcm0oZS50ZXh0dXJlLG4sdCk7fWdldEF0dHJpYkxvY2F0aW9ucyhlKXtyZXR1cm4ge3Bvc2l0aW9uOnRoaXMuZ2V0QXR0cmliTG9jYXRpb24oZSwicG9zaXRpb24iKSx0ZXh0dXJlQ29vcmQ6dGhpcy5nZXRBdHRyaWJMb2NhdGlvbihlLCJ0ZXh0dXJlQ29vcmQiKX19Z2V0VW5pZm9ybUxvY2F0aW9ucyhlLHQsbil7Y29uc3Qgcj1bXTtpZih0KWZvcihjb25zdCBuIG9mIHQpci5wdXNoKHtuYW1lOm4sdHlwZToic2FtcGxlcjJEIixsb2NhdGlvbjp0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbihlLG4pfSk7aWYobilmb3IoY29uc3QgdCBvZiBuKXIucHVzaChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2xvY2F0aW9uOnRoaXMuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsdC5uYW1lKX0pKTtyZXR1cm4gcn1nZXRVbmlmb3JtTG9jYXRpb24oZSx0KXtjb25zdCBuPXRoaXMuZ2xDb250ZXh0LmdsLmdldFVuaWZvcm1Mb2NhdGlvbihlLHQpO2lmKG51bGw9PT1uKXRocm93IG5ldyBFcnJvcihgVW5pZm9ybSAke3R9IG5vdCBmb3VuZC5gKTtyZXR1cm4gbn1nZXRBdHRyaWJMb2NhdGlvbihlLHQpe3JldHVybiB0aGlzLmdsQ29udGV4dC5nbC5nZXRBdHRyaWJMb2NhdGlvbihlLHQpfX07fSwyMTcxOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5XZWJHTFNlc3Npb25IYW5kbGVyPXZvaWQgMDtjb25zdCByPW4oMTMxNSksbz1uKDU4ODEpLGk9big3ODYwKSxzPW4oNDExMCksYT1uKDI3NTcpLHU9big3NjE4KSxsPW4oNTI0Myk7dC5XZWJHTFNlc3Npb25IYW5kbGVyPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5iYWNrZW5kPWUsdGhpcy5jb250ZXh0PXQsdGhpcy5sYXlvdXRTdHJhdGVneT1uZXcgdS5QcmVmZXJMb2dpY2FsU3RyYXRlZ3koZS5nbENvbnRleHQubWF4VGV4dHVyZVNpemUpLHRoaXMucHJvZ3JhbU1hbmFnZXI9bmV3IGEuUHJvZ3JhbU1hbmFnZXIodGhpcy5jb250ZXh0LnByb2ZpbGVyLGUuZ2xDb250ZXh0LHRoaXMubGF5b3V0U3RyYXRlZ3kpLHRoaXMudGV4dHVyZU1hbmFnZXI9bmV3IGwuVGV4dHVyZU1hbmFnZXIoZS5nbENvbnRleHQsdGhpcy5sYXlvdXRTdHJhdGVneSx0aGlzLmNvbnRleHQucHJvZmlsZXIse3JldXNlVGV4dHVyZXM6ImZ1bGwiPT09ZS50ZXh0dXJlQ2FjaGVNb2RlfSksdGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlPW5ldyBNYXAsdGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcCx0aGlzLnBhY2s9ZS5wYWNrLHRoaXMucGFjazJ1bnBhY2tNYXA9bmV3IE1hcCx0aGlzLnVucGFjazJwYWNrTWFwPW5ldyBNYXA7fWNyZWF0ZUluZmVyZW5jZUhhbmRsZXIoKXtyZXR1cm4gbmV3IGkuV2ViR0xJbmZlcmVuY2VIYW5kbGVyKHRoaXMpfW9uR3JhcGhJbml0aWFsaXplZChlKXtjb25zdCB0PWUuZ2V0VmFsdWVzKCkuZmlsdGVyKChlPT4tMT09PWUuZnJvbSYmZS50ZW5zb3IpKS5tYXAoKGU9PmUudGVuc29yLmRhdGFJZCkpO3RoaXMuaW5pdGlhbGl6ZXJzPW5ldyBTZXQodCk7fWlzSW5pdGlhbGl6ZXIoZSl7cmV0dXJuICEhdGhpcy5pbml0aWFsaXplcnMmJnRoaXMuaW5pdGlhbGl6ZXJzLmhhcyhlKX1hZGRJbml0aWFsaXplcihlKXt0aGlzLmluaXRpYWxpemVycy5hZGQoZSk7fWdldFRleHR1cmVEYXRhKGUsdCl7cmV0dXJuIHQ/dGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmdldChlKTp0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZS5nZXQoZSl9c2V0VGV4dHVyZURhdGEoZSx0LG49ITEpe3IuTG9nZ2VyLnZlcmJvc2UoIldlYkdMU2Vzc2lvbkhhbmRsZXIiLCJTdG9yaW5nIFRleHR1cmUgZGF0YSBpbiBjYWNoZSIpLG4/dGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLnNldChlLHQpOnRoaXMudW5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLnNldChlLHQpO31kaXNwb3NlKCl7dGhpcy5wcm9ncmFtTWFuYWdlci5kaXNwb3NlKCksdGhpcy50ZXh0dXJlTWFuYWdlci5jbGVhckFjdGl2ZVRleHR1cmVzKCksdGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmZvckVhY2goKGU9PnRoaXMudGV4dHVyZU1hbmFnZXIucmVsZWFzZVRleHR1cmUoZSwhMCkpKSx0aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcCx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZS5mb3JFYWNoKChlPT50aGlzLnRleHR1cmVNYW5hZ2VyLnJlbGVhc2VUZXh0dXJlKGUsITApKSksdGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcDt9cmVzb2x2ZShlLHQsbil7Y29uc3Qgcj0oMCwgby5yZXNvbHZlT3BlcmF0b3IpKGUsdCxzLldFQkdMX09QX1JFU09MVkVfUlVMRVMpO3JldHVybiB7aW1wbDpyLm9wSW1wbCxjb250ZXh0OnIub3BJbml0P3Iub3BJbml0KGUsbik6ZX19fTt9LDk2MjI6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlVpbnQ4RGF0YUVuY29kZXI9dC5SR0JBRmxvYXREYXRhRW5jb2Rlcj10LlJlZEZsb2F0MzJEYXRhRW5jb2Rlcj12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpO3QuUmVkRmxvYXQzMkRhdGFFbmNvZGVyPWNsYXNze2NvbnN0cnVjdG9yKGUsdD0xKXtpZigxPT09dCl0aGlzLmludGVybmFsRm9ybWF0PWUuUjMyRix0aGlzLmZvcm1hdD1lLlJFRCx0aGlzLnRleHR1cmVUeXBlPWUuRkxPQVQsdGhpcy5jaGFubmVsU2l6ZT10O2Vsc2Uge2lmKDQhPT10KXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHM6ICR7dH1gKTt0aGlzLmludGVybmFsRm9ybWF0PWUuUkdCQTMyRix0aGlzLmZvcm1hdD1lLlJHQkEsdGhpcy50ZXh0dXJlVHlwZT1lLkZMT0FULHRoaXMuY2hhbm5lbFNpemU9dDt9fWVuY29kZShlLHQpe2xldCBuLG87cmV0dXJuIGUuY29uc3RydWN0b3IhPT1GbG9hdDMyQXJyYXkmJihyLkxvZ2dlci53YXJuaW5nKCJFbmNvZGVyIiwiZGF0YSB3YXMgbm90IG9mIHR5cGUgRmxvYXQzMjsgY3JlYXRpbmcgbmV3IEZsb2F0MzJBcnJheSIpLG89bmV3IEZsb2F0MzJBcnJheShlKSksdCp0aGlzLmNoYW5uZWxTaXplPmUubGVuZ3RoPyhyLkxvZ2dlci53YXJuaW5nKCJFbmNvZGVyIiwiU291cmNlIGRhdGEgdG9vIHNtYWxsLiBBbGxvY2F0aW5nIGxhcmdlciBhcnJheSIpLG89ZSxuPXRoaXMuYWxsb2NhdGUodCp0aGlzLmNoYW5uZWxTaXplKSxvLmZvckVhY2goKChlLHQpPT5uW3RdPWUpKSk6KG89ZSxuPW8pLG59YWxsb2NhdGUoZSl7cmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoNCplKX1kZWNvZGUoZSx0KXtyZXR1cm4gMT09PXRoaXMuY2hhbm5lbFNpemU/ZS5maWx0ZXIoKChlLHQpPT50JTQ9PTApKS5zdWJhcnJheSgwLHQpOmUuc3ViYXJyYXkoMCx0KX19LHQuUkdCQUZsb2F0RGF0YUVuY29kZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0PTEsbil7aWYoMSE9PXQmJjQhPT10KXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHM6ICR7dH1gKTt0aGlzLmludGVybmFsRm9ybWF0PWUuUkdCQSx0aGlzLmZvcm1hdD1lLlJHQkEsdGhpcy5jaGFubmVsU2l6ZT10LHRoaXMudGV4dHVyZVR5cGU9bnx8ZS5GTE9BVDt9ZW5jb2RlKGUsdCl7bGV0IG49ZTtyZXR1cm4gMT09PXRoaXMuY2hhbm5lbFNpemUmJihyLkxvZ2dlci52ZXJib3NlKCJFbmNvZGVyIiwiRXhwbG9kaW5nIGludG8gYSBsYXJnZXIgYXJyYXkiKSxuPXRoaXMuYWxsb2NhdGUodCksZS5mb3JFYWNoKCgoZSx0KT0+bls0KnRdPWUpKSksbn1hbGxvY2F0ZShlKXtyZXR1cm4gbmV3IEZsb2F0MzJBcnJheSg0KmUpfWRlY29kZShlLHQpe3JldHVybiAxPT09dGhpcy5jaGFubmVsU2l6ZT9lLmZpbHRlcigoKGUsdCk9PnQlND09MCkpLnN1YmFycmF5KDAsdCk6ZS5zdWJhcnJheSgwLHQpfX0sdC5VaW50OERhdGFFbmNvZGVyPWNsYXNze2NvbnN0cnVjdG9yKGUsdD0xKXtpZih0aGlzLmNoYW5uZWxTaXplPTQsMT09PXQpdGhpcy5pbnRlcm5hbEZvcm1hdD1lLkFMUEhBLHRoaXMuZm9ybWF0PWUuQUxQSEEsdGhpcy50ZXh0dXJlVHlwZT1lLlVOU0lHTkVEX0JZVEUsdGhpcy5jaGFubmVsU2l6ZT10O2Vsc2Uge2lmKDQhPT10KXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHM6ICR7dH1gKTt0aGlzLmludGVybmFsRm9ybWF0PWUuUkdCQSx0aGlzLmZvcm1hdD1lLlJHQkEsdGhpcy50ZXh0dXJlVHlwZT1lLlVOU0lHTkVEX0JZVEUsdGhpcy5jaGFubmVsU2l6ZT10O319ZW5jb2RlKGUsdCl7cmV0dXJuIG5ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpfWFsbG9jYXRlKGUpe3JldHVybiBuZXcgVWludDhBcnJheShlKnRoaXMuY2hhbm5lbFNpemUpfWRlY29kZShlLHQpe2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBlLnN1YmFycmF5KDAsdCk7dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFycmF5IHR5cGU6ICR7ZS5jb25zdHJ1Y3Rvcn1gKX19O30sNzYxODooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0QmF0Y2hEaW09dC5zaXplVG9TcXVhcmlzaFNoYXBlPXQuZ2V0Um93c0NvbHM9dC5zaXplRnJvbVNoYXBlPXQuaXNJbnQ9dC5wYXJzZUF4aXNQYXJhbT10LnNxdWVlemVTaGFwZT10LlByZWZlckxvZ2ljYWxTdHJhdGVneT10LkFsd2F5c0tlZXBPcmlnaW5hbFNpemVTdHJhdGVneT12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpLG89big3MjczKTtmdW5jdGlvbiBpKGUsdCl7Y29uc3Qgbj1bXSxyPVtdLG89bnVsbCE9dCYmQXJyYXkuaXNBcnJheSh0KSYmMD09PXQubGVuZ3RoLGk9bnVsbD09dHx8bz9udWxsOnModCxlKS5zb3J0KCk7bGV0IGE9MDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdCl7aWYobnVsbCE9aSl7aWYoaVthXT09PXQmJjEhPT1lW3RdKXRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc3F1ZWV6ZSBheGlzICR7dH0gc2luY2UgaXRzIGRpbSAnJHtlW3RdfScgaXMgbm90IDFgKTsobnVsbD09aVthXXx8aVthXT50KSYmMT09PWVbdF0mJihuLnB1c2goZVt0XSksci5wdXNoKHQpKSxpW2FdPD10JiZhKys7fTEhPT1lW3RdJiYobi5wdXNoKGVbdF0pLHIucHVzaCh0KSk7fXJldHVybiB7bmV3U2hhcGU6bixrZXB0RGltczpyfX1mdW5jdGlvbiBzKGUsdCl7Y29uc3Qgbj10Lmxlbmd0aDtyZXR1cm4gZT1udWxsPT1lP3QubWFwKCgoZSx0KT0+dCkpOltdLmNvbmNhdChlKSwoMCwgby5hc3NlcnQpKGUuZXZlcnkoKGU9PmU+PS1uJiZlPG4pKSwoKCk9PmBBbGwgdmFsdWVzIGluIGF4aXMgcGFyYW0gbXVzdCBiZSBpbiByYW5nZSBbLSR7bn0sICR7bn0pIGJ1dCBnb3QgYXhpcyAke2V9YCkpLCgwLCBvLmFzc2VydCkoZS5ldmVyeShhKSwoKCk9PmBBbGwgdmFsdWVzIGluIGF4aXMgcGFyYW0gbXVzdCBiZSBpbnRlZ2VycyBidXQgZ290IGF4aXMgJHtlfWApKSxlLm1hcCgoZT0+ZTwwP24rZTplKSl9ZnVuY3Rpb24gYShlKXtyZXR1cm4gZSUxPT0wfWZ1bmN0aW9uIHUoZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybiAxO2xldCB0PWVbMF07Zm9yKGxldCBuPTE7bjxlLmxlbmd0aDtuKyspdCo9ZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBsKGUpe2NvbnN0IHQ9TWF0aC5jZWlsKE1hdGguc3FydChlKSk7cmV0dXJuIFt0LE1hdGguY2VpbChlL3QpXX10LkFsd2F5c0tlZXBPcmlnaW5hbFNpemVTdHJhdGVneT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm1heFRleHR1cmVTaXplPWU7fWNvbXB1dGVUZXh0dXJlV0goZSx0KXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIFsxLDFdO2NvbnN0IG49dGhpcy5tYXhUZXh0dXJlU2l6ZTtpZih0JiZ2b2lkIDAhPT10LmJyZWFrQXhpcyl7Y29uc3Qgbz10LmJyZWFrQXhpcz49ZS5sZW5ndGg/MTplLnNsaWNlKHQuYnJlYWtBeGlzKS5yZWR1Y2UoKChlLHQpPT5lKnQpKSxpPXQuYnJlYWtBeGlzPD0wPzE6ZS5zbGljZSgwLHQuYnJlYWtBeGlzKS5yZWR1Y2UoKChlLHQpPT5lKnQpKTtpZighKG8+bnx8aT5uKSlyZXR1cm4gW28saV07ci5Mb2dnZXIudmVyYm9zZSgiVGV4dHVyZUxheW91dCIsYEdpdmVuIHdpZHRoL2hlaWdodCBwcmVmZXJlbmNlcyB3ZXJlIHVuYXR0YWluYWJsZTogc2hhcGU6JHtlfSwgYnJlYWtBeGlzOiR7dC5icmVha0F4aXN9YCk7fWNvbnN0IG89ZS5yZWR1Y2UoKChlLHQpPT5lKnQpKTtsZXQgaT1NYXRoLmZsb29yKE1hdGguc3FydChvKSk7Zm9yKDtpPG4mJmk8byYmbyVpIT0wO2krKyk7aWYoaT49bnx8byVpIT0wKXRocm93IG5ldyBFcnJvcihgVGhlIGdpdmVuIGRpbWVuc2lvbnMgYXJlIG91dHNpZGUgdGhpcyBHUFUncyBib3VuZGFyaWVzOiAke2V9YCk7cmV0dXJuIFtpLG8vaV19fSx0LlByZWZlckxvZ2ljYWxTdHJhdGVneT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm1heFRleHR1cmVTaXplPWU7fWNvbXB1dGVUZXh0dXJlV0goZSx0KXtjb25zdCBuPXRoaXMuY29tcHV0ZVRleHR1cmUoZSx0KTtyZXR1cm4gdCYmdC5pc1BhY2tlZCYmKG5bMF0vPTIsblsxXS89MiksdCYmdC5yZXZlcnNlV0g/W25bMV0sblswXV06bn1jb21wdXRlVGV4dHVyZShlLHQpe2NvbnN0IG49dCYmdC5pc1BhY2tlZDtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIG4/WzIsMl06WzEsMV07bGV0IG89dGhpcy5tYXhUZXh0dXJlU2l6ZTtpZih0JiZ2b2lkIDAhPT10LmJyZWFrQXhpcyl7Y29uc3Qgbj10LmJyZWFrQXhpcz49ZS5sZW5ndGg/MTplLnNsaWNlKHQuYnJlYWtBeGlzKS5yZWR1Y2UoKChlLHQpPT5lKnQpKSxpPXQuYnJlYWtBeGlzPD0wPzE6ZS5zbGljZSgwLHQuYnJlYWtBeGlzKS5yZWR1Y2UoKChlLHQpPT5lKnQpKTtpZighKG4+b3x8aT5vKSlyZXR1cm4gW24saV07ci5Mb2dnZXIudmVyYm9zZSgiVGV4dHVyZUxheW91dCIsYEdpdmVuIHdpZHRoL2hlaWdodCBwcmVmZXJlbmNlcyB3ZXJlIHVuYXR0YWluYWJsZTogc2hhcGU6JHtlfSwgYnJlYWtBeGlzOiR7dC5icmVha0F4aXN9YCk7fWxldCBzPWUuc2xpY2UoMCk7aWYobiYmKG8qPTIscz1zLm1hcCgoKGUsdCk9PnQ+PXMubGVuZ3RoLTI/c1t0XSUyPT0wP3NbdF06c1t0XSsxOnNbdF0pKSwxPT09cy5sZW5ndGgmJihzPVsyLHNbMF1dKSksMiE9PXMubGVuZ3RoKXtjb25zdCBlPWkocyk7cz1lLm5ld1NoYXBlO31jb25zdCBhPXUocyk7cmV0dXJuIHMubGVuZ3RoPD0xJiZhPD1vP1sxLGFdOjI9PT1zLmxlbmd0aCYmc1swXTw9byYmc1sxXTw9bz9zOjM9PT1zLmxlbmd0aCYmc1swXSpzWzFdPD1vJiZzWzJdPD1vP1tzWzBdKnNbMV0sc1syXV06Mz09PXMubGVuZ3RoJiZzWzBdPD1vJiZzWzFdKnNbMl08PW8/W3NbMF0sc1sxXSpzWzJdXTo0PT09cy5sZW5ndGgmJnNbMF0qc1sxXSpzWzJdPD1vJiZzWzNdPD1vP1tzWzBdKnNbMV0qc1syXSxzWzNdXTo0PT09cy5sZW5ndGgmJnNbMF08PW8mJnNbMV0qc1syXSpzWzNdPD1vP1tzWzBdLHNbMV0qc1syXSpzWzNdXTpuP2woYS80KS5tYXAoKGU9PjIqZSkpOmwoYSl9fSx0LnNxdWVlemVTaGFwZT1pLHQucGFyc2VBeGlzUGFyYW09cyx0LmlzSW50PWEsdC5zaXplRnJvbVNoYXBlPXUsdC5nZXRSb3dzQ29scz1mdW5jdGlvbihlKXtpZigwPT09ZS5sZW5ndGgpdGhyb3cgRXJyb3IoIkNhbm5vdCBnZXQgcm93cyBhbmQgY29sdW1ucyBvZiBhbiBlbXB0eSBzaGFwZSBhcnJheS4iKTtyZXR1cm4gW2UubGVuZ3RoPjE/ZVtlLmxlbmd0aC0yXToxLGVbZS5sZW5ndGgtMV1dfSx0LnNpemVUb1NxdWFyaXNoU2hhcGU9bCx0LmdldEJhdGNoRGltPWZ1bmN0aW9uKGUsdD0yKXtyZXR1cm4gdShlLnNsaWNlKDAsZS5sZW5ndGgtdCkpfTt9LDMzMTQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZVRleHR1cmVMYXlvdXRGcm9tU2hhcGU9dC5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQ9dC5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVRleHR1cmVUeXBlPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDU2MzkpO3QuY3JlYXRlVGV4dHVyZUxheW91dEZyb21UZXh0dXJlVHlwZT0oZSxuLHIpPT57Y29uc3QgaT1yPT09by5UZXh0dXJlVHlwZS51bnBhY2tlZHx8cj09PW8uVGV4dHVyZVR5cGUudW5wYWNrZWRSZXZlcnNlZD8xOjQscz1yPT09by5UZXh0dXJlVHlwZS5wYWNrZWQsYT1yPT09by5UZXh0dXJlVHlwZS51bnBhY2tlZFJldmVyc2VkfHxyPT09by5UZXh0dXJlVHlwZS5wYWNrZWQsdT1yPT09by5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uP24ubGVuZ3RoLTE6dm9pZCAwLGw9cj09PW8uVGV4dHVyZVR5cGUucGFja2VkTGFzdERpbWVuc2lvbj9uLm1hcCgoKGUsdCk9PnQ9PT1uLmxlbmd0aC0xPzQqZTplKSk6dm9pZCAwO3JldHVybiAoMCwgdC5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVNoYXBlKShlLG4saSxsLHtpc1BhY2tlZDpzLHJldmVyc2VXSDphLGJyZWFrQXhpczp1fSl9LHQuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0PShlLG4scik9Pntjb25zdCBvPSgwLCB0LmNyZWF0ZVRleHR1cmVMYXlvdXRGcm9tVGV4dHVyZVR5cGUpKGUsbixyKTtyZXR1cm4gW28ud2lkdGgsby5oZWlnaHRdfSx0LmNyZWF0ZVRleHR1cmVMYXlvdXRGcm9tU2hhcGU9KGUsdCxuPTEsbyxpKT0+e2NvbnN0IHM9ISghaXx8IWkuaXNQYWNrZWQpLFthLHVdPWUuY29tcHV0ZVRleHR1cmVXSChzJiZvfHx0LGkpLGw9dC5sZW5ndGg7bGV0IGM9dC5zbGljZSgwKTtpZigwPT09bCYmKGM9WzFdKSwxPT09bilvPXQ7ZWxzZSBpZihzKXtpZig0IT09bil0aHJvdyBuZXcgRXJyb3IoImEgcGFja2VkIHRleHR1cmUgbXVzdCBiZSA0LWNoYW5uZWwiKTtvPXQsbD4wJiYoY1tsLTFdPU1hdGguY2VpbChjW2wtMV0vMikpLGw+MSYmKGNbbC0yXT1NYXRoLmNlaWwoY1tsLTJdLzIpKTt9ZWxzZSBpZighbyl0aHJvdyBuZXcgRXJyb3IoIlVucGFja2VkIHNoYXBlIGlzIG5lZWRlZCB3aGVuIHVzaW5nIGNoYW5uZWxzID4gMSIpO3JldHVybiB7d2lkdGg6YSxoZWlnaHQ6dSxjaGFubmVsczpuLGlzUGFja2VkOnMsc2hhcGU6YyxzdHJpZGVzOnIuU2hhcGVVdGlsLmNvbXB1dGVTdHJpZGVzKGMpLHVucGFja2VkU2hhcGU6byxyZXZlcnNlZFdIOmkmJmkucmV2ZXJzZVdIfX07fSw1MjQzOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UZXh0dXJlTWFuYWdlcj12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpO3QuVGV4dHVyZU1hbmFnZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scil7dGhpcy5nbENvbnRleHQ9ZSx0aGlzLmxheW91dFN0cmF0ZWd5PXQsdGhpcy5wcm9maWxlcj1uLHRoaXMuY29uZmlnPXIsdGhpcy5wZW5kaW5nUmVhZD1uZXcgTWFwLHIucmV1c2VUZXh0dXJlcyYmKHRoaXMuaW5Vc2VUZXh0dXJlcz1uZXcgTWFwLHRoaXMuaWRsZVRleHR1cmVzPW5ldyBNYXAsdGhpcy50ZXh0dXJlTG9va3VwPW5ldyBNYXApO31jcmVhdGVUZXh0dXJlRnJvbUxheW91dChlLHQsbixvKXtjb25zdCBpPXRoaXMudG9FbmNvZGVyVHlwZShlKSxzPXRoaXMuZ2xDb250ZXh0LmdldEVuY29kZXIoaSx0LmNoYW5uZWxzfHwxLG8pO2lmKHQuaXNQYWNrZWQmJjE9PT1vKXRocm93IG5ldyBFcnJvcigibm90IGltcGxlbWVudGVkIik7Y29uc3QgYT10LndpZHRoLHU9dC5oZWlnaHQ7bGV0IGwsYztpZih0aGlzLmNvbmZpZy5yZXVzZVRleHR1cmVzKXtsPWAke2F9eCR7dX1fJHtzLmZvcm1hdH1fJHtzLmludGVybmFsRm9ybWF0fV8ke3MudGV4dHVyZVR5cGV9YCxjPXRoaXMuaW5Vc2VUZXh0dXJlcy5nZXQobCksY3x8KGM9W10sdGhpcy5pblVzZVRleHR1cmVzLnNldChsLGMpKTtjb25zdCB0PXRoaXMuaWRsZVRleHR1cmVzLmdldChsKTtpZih0JiZ0Lmxlbmd0aD4wKXtjb25zdCByPXQucG9wKCk7cmV0dXJuIGMucHVzaChyKSwxPT09byYmdGhpcy5nbENvbnRleHQudXBkYXRlVGV4dHVyZShyLGEsdSxzLHRoaXMudG9UZXh0dXJlRGF0YShlLG4pKSxyfX1yLkxvZ2dlci52ZXJib3NlKCJUZXh0dXJlTWFuYWdlciIsYENyZWF0aW5nIG5ldyB0ZXh0dXJlIG9mIHNpemUgJHt0LndpZHRofXgke3QuaGVpZ2h0fWApO2NvbnN0IHA9dGhpcy5nbENvbnRleHQuYWxsb2NhdGVUZXh0dXJlKGEsdSxzLHRoaXMudG9UZXh0dXJlRGF0YShlLG4pKTtyZXR1cm4gdGhpcy5jb25maWcucmV1c2VUZXh0dXJlcyYmKGMucHVzaChwKSx0aGlzLnRleHR1cmVMb29rdXAuc2V0KHAsbCkpLHB9cmVhZFRleHR1cmUoZSx0LG4pe3JldHVybiBufHwobj0xKSx0aGlzLnByb2ZpbGVyLmV2ZW50KCJiYWNrZW5kIiwiVGV4dHVyZU1hbmFnZXIucmVhZFRleHR1cmUiLCgoKT0+e2NvbnN0IHI9ZS5zaGFwZS5yZWR1Y2UoKChlLHQpPT5lKnQpKSpuLG89dGhpcy5nbENvbnRleHQucmVhZFRleHR1cmUoZS50ZXh0dXJlLGUud2lkdGgsZS5oZWlnaHQscix0aGlzLnRvRW5jb2RlclR5cGUodCksbik7cmV0dXJuIHRoaXMudG9UZW5zb3JEYXRhKHQsbyl9KSl9YXN5bmMgcmVhZFRleHR1cmVBc3luYyhlLHQsbil7Y29uc3Qgcj1lLnRlbnNvci5kYXRhSWQ7aWYobnx8KG49MSksdGhpcy5wZW5kaW5nUmVhZC5oYXMocikpe2NvbnN0IGU9dGhpcy5wZW5kaW5nUmVhZC5nZXQocik7cmV0dXJuIG5ldyBQcm9taXNlKCh0PT5udWxsPT1lP3ZvaWQgMDplLnB1c2godCkpKX1yZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgiYmFja2VuZCIsIlRleHR1cmVNYW5hZ2VyLnJlYWRUZXh0dXJlQXN5bmMiLChhc3luYygpPT57dGhpcy5wZW5kaW5nUmVhZC5zZXQocixbXSk7Y29uc3Qgbz1lLnNoYXBlLnJlZHVjZSgoKGUsdCk9PmUqdCkpKm47YXdhaXQgdGhpcy5nbENvbnRleHQuY3JlYXRlQW5kV2FpdEZvckZlbmNlKCk7Y29uc3QgaT10aGlzLmdsQ29udGV4dC5yZWFkVGV4dHVyZShlLnRleHR1cmUsZS53aWR0aCxlLmhlaWdodCxvLHRoaXMudG9FbmNvZGVyVHlwZSh0KSxuKSxzPXRoaXMudG9UZW5zb3JEYXRhKHQsaSksYT10aGlzLnBlbmRpbmdSZWFkLmdldChyKTtyZXR1cm4gdGhpcy5wZW5kaW5nUmVhZC5kZWxldGUociksbnVsbD09YXx8YS5mb3JFYWNoKChlPT5lKHMpKSksc30pKX1yZWFkVWludDhUZXh0dXJlQXNGbG9hdChlKXtyZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgiYmFja2VuZCIsIlRleHR1cmVNYW5hZ2VyLnJlYWRVaW50OFRleHR1cmVBc0Zsb2F0IiwoKCk9Pntjb25zdCB0PWUuc2hhcGUucmVkdWNlKCgoZSx0KT0+ZSp0KSksbj10aGlzLmdsQ29udGV4dC5yZWFkVGV4dHVyZShlLnRleHR1cmUsZS53aWR0aCxlLmhlaWdodCw0KnQsImJ5dGUiLDQpO3JldHVybiBuZXcgRmxvYXQzMkFycmF5KG4uYnVmZmVyLG4uYnl0ZU9mZnNldCx0KX0pKX1yZWxlYXNlVGV4dHVyZShlLHQpe2xldCBuO2lmKHRoaXMuY29uZmlnLnJldXNlVGV4dHVyZXMmJihuPXRoaXMudGV4dHVyZUxvb2t1cC5nZXQoZS50ZXh0dXJlKSxuKSl7dCYmdGhpcy50ZXh0dXJlTG9va3VwLmRlbGV0ZShuKTtjb25zdCByPXRoaXMuaW5Vc2VUZXh0dXJlcy5nZXQobik7aWYocil7Y29uc3QgdD1yLmluZGV4T2YoZS50ZXh0dXJlKTtpZigtMSE9PXQpe3Iuc3BsaWNlKHQsMSk7bGV0IG89dGhpcy5pZGxlVGV4dHVyZXMuZ2V0KG4pO298fChvPVtdLHRoaXMuaWRsZVRleHR1cmVzLnNldChuLG8pKSxvLnB1c2goZS50ZXh0dXJlKTt9fX1uJiYhdHx8KHIuTG9nZ2VyLnZlcmJvc2UoIlRleHR1cmVNYW5hZ2VyIixgRGVsZXRpbmcgdGV4dHVyZSBvZiBzaXplICR7ZS53aWR0aH14JHtlLmhlaWdodH1gKSx0aGlzLmdsQ29udGV4dC5kZWxldGVUZXh0dXJlKGUudGV4dHVyZSkpO310b1RlbnNvckRhdGEoZSx0KXtzd2l0Y2goZSl7Y2FzZSJpbnQxNiI6cmV0dXJuIHQgaW5zdGFuY2VvZiBJbnQxNkFycmF5P3Q6SW50MTZBcnJheS5mcm9tKHQpO2Nhc2UiaW50MzIiOnJldHVybiB0IGluc3RhbmNlb2YgSW50MzJBcnJheT90OkludDMyQXJyYXkuZnJvbSh0KTtjYXNlImludDgiOnJldHVybiB0IGluc3RhbmNlb2YgSW50OEFycmF5P3Q6SW50OEFycmF5LmZyb20odCk7Y2FzZSJ1aW50MTYiOnJldHVybiB0IGluc3RhbmNlb2YgVWludDE2QXJyYXk/dDpVaW50MTZBcnJheS5mcm9tKHQpO2Nhc2UidWludDMyIjpyZXR1cm4gdCBpbnN0YW5jZW9mIFVpbnQzMkFycmF5P3Q6VWludDMyQXJyYXkuZnJvbSh0KTtjYXNlInVpbnQ4IjpjYXNlImJvb2wiOnJldHVybiB0IGluc3RhbmNlb2YgVWludDhBcnJheT90OlVpbnQ4QXJyYXkuZnJvbSh0KTtjYXNlImZsb2F0MzIiOnJldHVybiB0IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5P3Q6RmxvYXQzMkFycmF5LmZyb20odCk7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gdCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheT90OkZsb2F0NjRBcnJheS5mcm9tKHQpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBUZW5zb3JEYXRhIHR5cGUgJHtlfSBpcyBub3Qgc3VwcG9ydGVkYCl9fXRvVGV4dHVyZURhdGEoZSx0KXtpZih0KXJldHVybiB0IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5P3Q6bmV3IEZsb2F0MzJBcnJheSh0KX10b0VuY29kZXJUeXBlKGUpe3JldHVybiAiZmxvYXQifWNsZWFyQWN0aXZlVGV4dHVyZXMoKXt0aGlzLmdsQ29udGV4dC5jbGVhckFjdGl2ZVRleHR1cmVzKCk7fX07fSw1NjM5OihlLHQpPT57dmFyIG47T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuVGV4dHVyZVR5cGU9dm9pZCAwLChuPXQuVGV4dHVyZVR5cGV8fCh0LlRleHR1cmVUeXBlPXt9KSlbbi51bnBhY2tlZD0wXT0idW5wYWNrZWQiLG5bbi51bnBhY2tlZFJldmVyc2VkPTFdPSJ1bnBhY2tlZFJldmVyc2VkIixuW24ucGFja2VkPTJdPSJwYWNrZWQiLG5bbi5kb3dubG9hZFVpbnQ4QXNGbG9hdD0zXT0iZG93bmxvYWRVaW50OEFzRmxvYXQiLG5bbi5wYWNrZWRMYXN0RGltZW5zaW9uPTRdPSJwYWNrZWRMYXN0RGltZW5zaW9uIjt9LDQzMjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0R2xDaGFubmVscz10LmdldENvb3Jkc0RhdGFUeXBlPXQuZ2V0U3F1ZWV6ZWRQYXJhbXM9dC5zcXVlZXplSW5wdXRTaGFwZT10LmdlbmVyYXRlU2hhZGVyRnVuY05hbWVGcm9tSW5wdXRTYW1wbGVyTmFtZUF0T3V0Q29vcmRzPXQuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lPXQucmVwZWF0ZWRUcnk9dC5nZXRQYWNrZWRTaGFwZT12b2lkIDA7Y29uc3Qgcj1uKDcyNzMpO3QuZ2V0UGFja2VkU2hhcGU9ZnVuY3Rpb24oZSl7Y29uc3QgdD1lLmxlbmd0aDtyZXR1cm4gZS5zbGljZSgwLHQtMSkuY29uY2F0KGVbdC0xXS80KX0sdC5yZXBlYXRlZFRyeT1hc3luYyBmdW5jdGlvbihlLHQ9KGU9PjApLG4pe3JldHVybiBuZXcgUHJvbWlzZSgoKHIsbyk9PntsZXQgaT0wO2NvbnN0IHM9KCk9PntpZihlKCkpcmV0dXJuIHZvaWQgcigpO2krKztjb25zdCBhPXQoaSk7bnVsbCE9biYmaT49bj9vKCk6c2V0VGltZW91dChzLGEpO307cygpO30pKX0sdC5nZW5lcmF0ZVNoYWRlckZ1bmNOYW1lRnJvbUlucHV0U2FtcGxlck5hbWU9ZnVuY3Rpb24oZSl7cmV0dXJuICgwLCByLmFzc2VydCkodm9pZCAwIT09ZSYmMCE9PWUubGVuZ3RoLCgoKT0+ImVtcHR5IHN0cmluZyBmb3VuZCBmb3Igc2FtcGxlciBuYW1lIikpLCJnZXQiK2UuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0sdC5nZW5lcmF0ZVNoYWRlckZ1bmNOYW1lRnJvbUlucHV0U2FtcGxlck5hbWVBdE91dENvb3Jkcz1mdW5jdGlvbihlKXtyZXR1cm4gKDAsIHIuYXNzZXJ0KSh2b2lkIDAhPT1lJiYwIT09ZS5sZW5ndGgsKCgpPT4iZW1wdHkgc3RyaW5nIGZvdW5kIGZvciBzYW1wbGVyIG5hbWUiKSksImdldCIrZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpKyJBdE91dENvb3JkcyJ9LHQuc3F1ZWV6ZUlucHV0U2hhcGU9ZnVuY3Rpb24oZSx0KXtsZXQgbj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKTtyZXR1cm4gbj10LG59LHQuZ2V0U3F1ZWV6ZWRQYXJhbXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5tYXAoKHQ9PmVbdF0pKS5qb2luKCIsICIpfSx0LmdldENvb3Jkc0RhdGFUeXBlPWZ1bmN0aW9uKGUpe2lmKGU8PTEpcmV0dXJuICJpbnQiO2lmKDI9PT1lKXJldHVybiAiaXZlYzIiO2lmKDM9PT1lKXJldHVybiAiaXZlYzMiO2lmKDQ9PT1lKXJldHVybiAiaXZlYzQiO2lmKDU9PT1lKXJldHVybiAiaXZlYzUiO2lmKDY9PT1lKXJldHVybiAiaXZlYzYiO3Rocm93IEVycm9yKGBHUFUgZm9yIHJhbmsgJHtlfSBpcyBub3QgeWV0IHN1cHBvcnRlZGApfSx0LmdldEdsQ2hhbm5lbHM9ZnVuY3Rpb24oZT02KXtyZXR1cm4gWyJ4IiwieSIsInoiLCJ3IiwidSIsInYiXS5zbGljZSgwLGUpfTt9LDMzODk6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZU5ld1dlYkdMQ29udGV4dD10LmNyZWF0ZVdlYkdMQ29udGV4dD12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpLG89bigzNTI0KSxpPXt9O2Z1bmN0aW9uIHMoZSx0KXtsZXQgbjtjb25zdCBpPXthbHBoYTohMSxkZXB0aDohMSxhbnRpYWxpYXM6ITEsc3RlbmNpbDohMSxwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6ITEscHJlbXVsdGlwbGllZEFscGhhOiExLGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6ITF9O2lmKCghdHx8IndlYmdsMiI9PT10KSYmKG49ZS5nZXRDb250ZXh0KCJ3ZWJnbDIiLGkpLG4pKXRyeXtyZXR1cm4gbmV3IG8uV2ViR0xDb250ZXh0KG4sMil9Y2F0Y2goZSl7ci5Mb2dnZXIud2FybmluZygiR2xDb250ZXh0RmFjdG9yeSIsYGZhaWxlZCB0byBjcmVhdGUgV2ViR0xDb250ZXh0IHVzaW5nIGNvbnRleHRJZCAnd2ViZ2wyJy4gRXJyb3I6ICR7ZX1gKTt9aWYoKCF0fHwid2ViZ2wiPT09dCkmJihuPWUuZ2V0Q29udGV4dCgid2ViZ2wiLGkpfHxlLmdldENvbnRleHQoImV4cGVyaW1lbnRhbC13ZWJnbCIsaSksbikpdHJ5e3JldHVybiBuZXcgby5XZWJHTENvbnRleHQobiwxKX1jYXRjaChlKXtyLkxvZ2dlci53YXJuaW5nKCJHbENvbnRleHRGYWN0b3J5IixgZmFpbGVkIHRvIGNyZWF0ZSBXZWJHTENvbnRleHQgdXNpbmcgY29udGV4dElkICd3ZWJnbCcgb3IgJ2V4cGVyaW1lbnRhbC13ZWJnbCcuIEVycm9yOiAke2V9YCk7fXRocm93IG5ldyBFcnJvcigiV2ViR0wgaXMgbm90IHN1cHBvcnRlZCIpfXQuY3JlYXRlV2ViR0xDb250ZXh0PWZ1bmN0aW9uIGUodCl7bGV0IG47aWYodCYmIndlYmdsMiIhPT10fHwhKCJ3ZWJnbDIiaW4gaSk/dCYmIndlYmdsIiE9PXR8fCEoIndlYmdsImluIGkpfHwobj1pLndlYmdsKTpuPWkud2ViZ2wyLCFuKXRyeXtuPXMoZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIE9mZnNjcmVlbkNhbnZhcyl0aHJvdyBuZXcgVHlwZUVycm9yKCJmYWlsZWQgdG8gY3JlYXRlIG9mZnNjcmVlbiBjYW52YXM6IE9mZnNjcmVlbkNhbnZhcyBpcyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuIG5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKX0oKSx0KTt9Y2F0Y2goZSl7bj1zKGZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBkb2N1bWVudCl0aHJvdyBuZXcgVHlwZUVycm9yKCJmYWlsZWQgdG8gY3JlYXRlIGNhbnZhczogZG9jdW1lbnQgaXMgbm90IHN1cHBvcnRlZCIpO2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7cmV0dXJuIGUud2lkdGg9MSxlLmhlaWdodD0xLGV9KCksdCk7fXQ9dHx8MT09PW4udmVyc2lvbj8id2ViZ2wiOiJ3ZWJnbDIiO2NvbnN0IHI9bi5nbDtyZXR1cm4gaVt0XT1uLHIuaXNDb250ZXh0TG9zdCgpPyhkZWxldGUgaVt0XSxlKHQpKTooci5kaXNhYmxlKHIuREVQVEhfVEVTVCksci5kaXNhYmxlKHIuU1RFTkNJTF9URVNUKSxyLmRpc2FibGUoci5CTEVORCksci5kaXNhYmxlKHIuRElUSEVSKSxyLmRpc2FibGUoci5QT0xZR09OX09GRlNFVF9GSUxMKSxyLmRpc2FibGUoci5TQU1QTEVfQ09WRVJBR0UpLHIuZW5hYmxlKHIuU0NJU1NPUl9URVNUKSxyLmVuYWJsZShyLkNVTExfRkFDRSksci5jdWxsRmFjZShyLkJBQ0spLG4pfSx0LmNyZWF0ZU5ld1dlYkdMQ29udGV4dD1zO30sMzUyNDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyYmdGhpcy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pO3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtvJiYhKCJnZXQiaW4gbz8hdC5fX2VzTW9kdWxlOm8ud3JpdGFibGV8fG8uY29uZmlndXJhYmxlKXx8KG89e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixvKTt9OmZ1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pLGVbcl09dFtuXTt9KSxvPXRoaXMmJnRoaXMuX19zZXRNb2R1bGVEZWZhdWx0fHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihlLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSk7fTpmdW5jdGlvbihlLHQpe2UuZGVmYXVsdD10O30pLGk9dGhpcyYmdGhpcy5fX2ltcG9ydFN0YXJ8fGZ1bmN0aW9uKGUpe2lmKGUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgdD17fTtpZihudWxsIT1lKWZvcih2YXIgbiBpbiBlKSJkZWZhdWx0IiE9PW4mJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZyKHQsZSxuKTtyZXR1cm4gbyh0LGUpLHR9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LldlYkdMQ29udGV4dD10LmxpbmVhclNlYXJjaExhc3RUcnVlPXZvaWQgMDtjb25zdCBzPW4oMjIzNSksYT1pKG4oOTYyMikpLHU9big0MzIpO2Z1bmN0aW9uIGwoZSl7bGV0IHQ9MDtmb3IoO3Q8ZS5sZW5ndGgmJmVbdF0oKTsrK3QpO3JldHVybiB0LTF9dC5saW5lYXJTZWFyY2hMYXN0VHJ1ZT1sLHQuV2ViR0xDb250ZXh0PWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5mcmFtZUJ1ZmZlckJvdW5kPSExLHRoaXMuaXRlbXNUb1BvbGw9W10sdGhpcy5nbD1lLHRoaXMudmVyc2lvbj10LHRoaXMuZ2V0RXh0ZW5zaW9ucygpLHRoaXMudmVydGV4YnVmZmVyPXRoaXMuY3JlYXRlVmVydGV4YnVmZmVyKCksdGhpcy5mcmFtZWJ1ZmZlcj10aGlzLmNyZWF0ZUZyYW1lYnVmZmVyKCksdGhpcy5xdWVyeVZpdGFsUGFyYW1ldGVycygpO31hbGxvY2F0ZVRleHR1cmUoZSx0LG4scil7Y29uc3Qgbz10aGlzLmdsLGk9by5jcmVhdGVUZXh0dXJlKCk7by5iaW5kVGV4dHVyZShvLlRFWFRVUkVfMkQsaSksby50ZXhQYXJhbWV0ZXJpKG8uVEVYVFVSRV8yRCxvLlRFWFRVUkVfTUlOX0ZJTFRFUixvLk5FQVJFU1QpLG8udGV4UGFyYW1ldGVyaShvLlRFWFRVUkVfMkQsby5URVhUVVJFX01BR19GSUxURVIsby5ORUFSRVNUKSxvLnRleFBhcmFtZXRlcmkoby5URVhUVVJFXzJELG8uVEVYVFVSRV9XUkFQX1Msby5DTEFNUF9UT19FREdFKSxvLnRleFBhcmFtZXRlcmkoby5URVhUVVJFXzJELG8uVEVYVFVSRV9XUkFQX1Qsby5DTEFNUF9UT19FREdFKTtjb25zdCBzPXI/bi5lbmNvZGUocixlKnQpOm51bGw7cmV0dXJuIG8udGV4SW1hZ2UyRChvLlRFWFRVUkVfMkQsMCxuLmludGVybmFsRm9ybWF0LGUsdCwwLG4uZm9ybWF0LG4udGV4dHVyZVR5cGUscyksdGhpcy5jaGVja0Vycm9yKCksaX11cGRhdGVUZXh0dXJlKGUsdCxuLHIsbyl7Y29uc3QgaT10aGlzLmdsO2kuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELGUpO2NvbnN0IHM9ci5lbmNvZGUobyx0Km4pO2kudGV4U3ViSW1hZ2UyRChpLlRFWFRVUkVfMkQsMCwwLDAsdCxuLHIuZm9ybWF0LHIudGV4dHVyZVR5cGUscyksdGhpcy5jaGVja0Vycm9yKCk7fWF0dGFjaEZyYW1lYnVmZmVyKGUsdCxuKXtjb25zdCByPXRoaXMuZ2w7ci5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsZSksci5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUix0aGlzLmZyYW1lYnVmZmVyKSxyLmZyYW1lYnVmZmVyVGV4dHVyZTJEKHIuRlJBTUVCVUZGRVIsci5DT0xPUl9BVFRBQ0hNRU5UMCxyLlRFWFRVUkVfMkQsZSwwKSx0aGlzLmNoZWNrRXJyb3IoKSxyLnZpZXdwb3J0KDAsMCx0LG4pLHIuc2Npc3NvcigwLDAsdCxuKTt9cmVhZFRleHR1cmUoZSx0LG4scixvLGkpe2NvbnN0IHM9dGhpcy5nbDtpfHwoaT0xKSx0aGlzLmZyYW1lQnVmZmVyQm91bmR8fHRoaXMuYXR0YWNoRnJhbWVidWZmZXIoZSx0LG4pO2NvbnN0IGE9dGhpcy5nZXRFbmNvZGVyKG8saSksdT1hLmFsbG9jYXRlKHQqbik7cmV0dXJuIHMuYmluZFRleHR1cmUocy5URVhUVVJFXzJELGUpLHMuZnJhbWVidWZmZXJUZXh0dXJlMkQocy5GUkFNRUJVRkZFUixzLkNPTE9SX0FUVEFDSE1FTlQwLHMuVEVYVFVSRV8yRCxlLDApLHMucmVhZFBpeGVscygwLDAsdCxuLHMuUkdCQSxhLnRleHR1cmVUeXBlLHUpLHRoaXMuY2hlY2tFcnJvcigpLGEuZGVjb2RlKHUscil9aXNGcmFtZWJ1ZmZlclJlYWR5KCl7cmV0dXJuICEwfWdldEFjdGl2ZVRleHR1cmUoKXtjb25zdCBlPXRoaXMuZ2w7cmV0dXJuICJURVhUVVJFIisoZS5nZXRQYXJhbWV0ZXIodGhpcy5nbC5BQ1RJVkVfVEVYVFVSRSktZS5URVhUVVJFMCl9Z2V0VGV4dHVyZUJpbmRpbmcoKXtyZXR1cm4gdGhpcy5nbC5nZXRQYXJhbWV0ZXIodGhpcy5nbC5URVhUVVJFX0JJTkRJTkdfMkQpfWdldEZyYW1lYnVmZmVyQmluZGluZygpe3JldHVybiB0aGlzLmdsLmdldFBhcmFtZXRlcih0aGlzLmdsLkZSQU1FQlVGRkVSX0JJTkRJTkcpfXNldFZlcnRleEF0dHJpYnV0ZXMoZSx0KXtjb25zdCBuPXRoaXMuZ2w7bi52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUsMyxuLkZMT0FULCExLDIwLDApLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZSksLTEhPT10JiYobi52ZXJ0ZXhBdHRyaWJQb2ludGVyKHQsMixuLkZMT0FULCExLDIwLDEyKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHQpKSx0aGlzLmNoZWNrRXJyb3IoKTt9Y3JlYXRlUHJvZ3JhbShlLHQpe2NvbnN0IG49dGhpcy5nbCxyPW4uY3JlYXRlUHJvZ3JhbSgpO3JldHVybiBuLmF0dGFjaFNoYWRlcihyLGUpLG4uYXR0YWNoU2hhZGVyKHIsdCksbi5saW5rUHJvZ3JhbShyKSxyfWNvbXBpbGVTaGFkZXIoZSx0KXtjb25zdCBuPXRoaXMuZ2wscj1uLmNyZWF0ZVNoYWRlcih0KTtpZighcil0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZVNoYWRlcigpIHJldHVybmVkIG51bGwgd2l0aCB0eXBlICR7dH1gKTtpZihuLnNoYWRlclNvdXJjZShyLGUpLG4uY29tcGlsZVNoYWRlcihyKSwhMT09PW4uZ2V0U2hhZGVyUGFyYW1ldGVyKHIsbi5DT01QSUxFX1NUQVRVUykpdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY29tcGlsZSBzaGFkZXI6ICR7bi5nZXRTaGFkZXJJbmZvTG9nKHIpfVxuU2hhZGVyIHNvdXJjZTpcbiR7ZX1gKTtyZXR1cm4gcn1kZWxldGVTaGFkZXIoZSl7dGhpcy5nbC5kZWxldGVTaGFkZXIoZSk7fWJpbmRUZXh0dXJlVG9Vbmlmb3JtKGUsdCxuKXtjb25zdCByPXRoaXMuZ2w7ci5hY3RpdmVUZXh0dXJlKHIuVEVYVFVSRTArdCksdGhpcy5jaGVja0Vycm9yKCksci5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsZSksdGhpcy5jaGVja0Vycm9yKCksci51bmlmb3JtMWkobix0KSx0aGlzLmNoZWNrRXJyb3IoKTt9ZHJhdygpe3RoaXMuZ2wuZHJhd0FycmF5cyh0aGlzLmdsLlRSSUFOR0xFX1NUUklQLDAsNCksdGhpcy5jaGVja0Vycm9yKCk7fWNoZWNrRXJyb3IoKXtpZihzLmVudi5kZWJ1Zyl7Y29uc3QgZT10aGlzLmdsLHQ9ZS5nZXRFcnJvcigpO2xldCBuPSIiO3N3aXRjaCh0KXtjYXNlIGUuTk9fRVJST1I6cmV0dXJuO2Nhc2UgZS5JTlZBTElEX0VOVU06bj0iSU5WQUxJRF9FTlVNIjticmVhaztjYXNlIGUuSU5WQUxJRF9WQUxVRTpuPSJJTlZBTElEX1ZBTFVFIjticmVhaztjYXNlIGUuSU5WQUxJRF9PUEVSQVRJT046bj0iSU5WQUxJRF9PUEVSQVRJT04iO2JyZWFrO2Nhc2UgZS5JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTjpuPSJJTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTiI7YnJlYWs7Y2FzZSBlLk9VVF9PRl9NRU1PUlk6bj0iT1VUX09GX01FTU9SWSI7YnJlYWs7Y2FzZSBlLkNPTlRFWFRfTE9TVF9XRUJHTDpuPSJDT05URVhUX0xPU1RfV0VCR0wiO2JyZWFrO2RlZmF1bHQ6bj1gVW5rbm93biBXZWJHTCBFcnJvcjogJHt0LnRvU3RyaW5nKDE2KX1gO310aHJvdyBuZXcgRXJyb3Iobil9fWRlbGV0ZVRleHR1cmUoZSl7dGhpcy5nbC5kZWxldGVUZXh0dXJlKGUpO31kZWxldGVQcm9ncmFtKGUpe3RoaXMuZ2wuZGVsZXRlUHJvZ3JhbShlKTt9Z2V0RW5jb2RlcihlLHQsbj0wKXtpZigyPT09dGhpcy52ZXJzaW9uKXJldHVybiBuZXcgYS5SZWRGbG9hdDMyRGF0YUVuY29kZXIodGhpcy5nbCx0KTtzd2l0Y2goZSl7Y2FzZSJmbG9hdCI6cmV0dXJuIDE9PT1ufHx0aGlzLmlzUmVuZGVyRmxvYXQzMlN1cHBvcnRlZD9uZXcgYS5SR0JBRmxvYXREYXRhRW5jb2Rlcih0aGlzLmdsLHQpOm5ldyBhLlJHQkFGbG9hdERhdGFFbmNvZGVyKHRoaXMuZ2wsdCx0aGlzLnRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24uSEFMRl9GTE9BVF9PRVMpO2Nhc2UiaW50Ijp0aHJvdyBuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpO2Nhc2UiYnl0ZSI6cmV0dXJuIG5ldyBhLlVpbnQ4RGF0YUVuY29kZXIodGhpcy5nbCx0KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkYXRhVHlwZTogJHtlfWApfX1jbGVhckFjdGl2ZVRleHR1cmVzKCl7Y29uc3QgZT10aGlzLmdsO2ZvcihsZXQgdD0wO3Q8dGhpcy5tYXhUZXh0dXJlSW1hZ2VVbml0czsrK3QpZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTArdCksZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsbnVsbCk7fWRpc3Bvc2UoKXtpZih0aGlzLmRpc3Bvc2VkKXJldHVybjtjb25zdCBlPXRoaXMuZ2w7ZS5iaW5kRnJhbWVidWZmZXIoZS5GUkFNRUJVRkZFUixudWxsKSxlLmRlbGV0ZUZyYW1lYnVmZmVyKHRoaXMuZnJhbWVidWZmZXIpLGUuYmluZEJ1ZmZlcihlLkFSUkFZX0JVRkZFUixudWxsKSxlLmRlbGV0ZUJ1ZmZlcih0aGlzLnZlcnRleGJ1ZmZlciksZS5iaW5kQnVmZmVyKGUuRUxFTUVOVF9BUlJBWV9CVUZGRVIsbnVsbCksZS5maW5pc2goKSx0aGlzLmRpc3Bvc2VkPSEwO31jcmVhdGVEZWZhdWx0R2VvbWV0cnkoKXtyZXR1cm4gbmV3IEZsb2F0MzJBcnJheShbLTEsMSwwLDAsMSwtMSwtMSwwLDAsMCwxLDEsMCwxLDEsMSwtMSwwLDEsMF0pfWNyZWF0ZVZlcnRleGJ1ZmZlcigpe2NvbnN0IGU9dGhpcy5nbCx0PWUuY3JlYXRlQnVmZmVyKCk7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjcmVhdGVCdWZmZXIoKSByZXR1cm5lZCBudWxsIik7Y29uc3Qgbj10aGlzLmNyZWF0ZURlZmF1bHRHZW9tZXRyeSgpO3JldHVybiBlLmJpbmRCdWZmZXIoZS5BUlJBWV9CVUZGRVIsdCksZS5idWZmZXJEYXRhKGUuQVJSQVlfQlVGRkVSLG4sZS5TVEFUSUNfRFJBVyksdGhpcy5jaGVja0Vycm9yKCksdH1jcmVhdGVGcmFtZWJ1ZmZlcigpe2NvbnN0IGU9dGhpcy5nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO2lmKCFlKXRocm93IG5ldyBFcnJvcigiY3JlYXRlRnJhbWVidWZmZXIgcmV0dXJuZWQgbnVsbCIpO3JldHVybiBlfXF1ZXJ5Vml0YWxQYXJhbWV0ZXJzKCl7Y29uc3QgZT10aGlzLmdsO2lmKHRoaXMuaXNGbG9hdFRleHR1cmVBdHRhY2hhYmxlVG9GcmFtZUJ1ZmZlcj10aGlzLmNoZWNrRmxvYXRUZXh0dXJlQXR0YWNoYWJsZVRvRnJhbWVCdWZmZXIoKSx0aGlzLmlzUmVuZGVyRmxvYXQzMlN1cHBvcnRlZD10aGlzLmNoZWNrUmVuZGVyRmxvYXQzMigpLHRoaXMuaXNGbG9hdDMyRG93bmxvYWRTdXBwb3J0ZWQ9dGhpcy5jaGVja0Zsb2F0MzJEb3dubG9hZCgpLDE9PT10aGlzLnZlcnNpb24mJiF0aGlzLnRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24mJiF0aGlzLmlzUmVuZGVyRmxvYXQzMlN1cHBvcnRlZCl0aHJvdyBuZXcgRXJyb3IoImJvdGggZmxvYXQzMiBhbmQgZmxvYXQxNiBUZXh0dXJlVHlwZSBhcmUgbm90IHN1cHBvcnRlZCIpO3RoaXMuaXNCbGVuZFN1cHBvcnRlZD0hdGhpcy5pc1JlbmRlckZsb2F0MzJTdXBwb3J0ZWR8fHRoaXMuY2hlY2tGbG9hdDMyQmxlbmQoKSx0aGlzLm1heFRleHR1cmVTaXplPWUuZ2V0UGFyYW1ldGVyKGUuTUFYX1RFWFRVUkVfU0laRSksdGhpcy5tYXhUZXh0dXJlSW1hZ2VVbml0cz1lLmdldFBhcmFtZXRlcihlLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKSx0aGlzLnZlcnNpb247fWdldEV4dGVuc2lvbnMoKXsyPT09dGhpcy52ZXJzaW9uPyh0aGlzLmNvbG9yQnVmZmVyRmxvYXRFeHRlbnNpb249dGhpcy5nbC5nZXRFeHRlbnNpb24oIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKSx0aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbj10aGlzLmdsLmdldEV4dGVuc2lvbigiRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5X3dlYmdsMiIpKToodGhpcy50ZXh0dXJlRmxvYXRFeHRlbnNpb249dGhpcy5nbC5nZXRFeHRlbnNpb24oIk9FU190ZXh0dXJlX2Zsb2F0IiksdGhpcy50ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uPXRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IikpO31jaGVja0Zsb2F0VGV4dHVyZUF0dGFjaGFibGVUb0ZyYW1lQnVmZmVyKCl7Y29uc3QgZT10aGlzLmdsLHQ9ZS5jcmVhdGVUZXh0dXJlKCk7ZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsdCk7Y29uc3Qgbj0yPT09dGhpcy52ZXJzaW9uP2UuUkdCQTMyRjplLlJHQkE7ZS50ZXhJbWFnZTJEKGUuVEVYVFVSRV8yRCwwLG4sMSwxLDAsZS5SR0JBLGUuRkxPQVQsbnVsbCk7Y29uc3Qgcj1lLmNyZWF0ZUZyYW1lYnVmZmVyKCk7ZS5iaW5kRnJhbWVidWZmZXIoZS5GUkFNRUJVRkZFUixyKSxlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGUuRlJBTUVCVUZGRVIsZS5DT0xPUl9BVFRBQ0hNRU5UMCxlLlRFWFRVUkVfMkQsdCwwKTtjb25zdCBvPWUuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhlLkZSQU1FQlVGRkVSKT09PWUuRlJBTUVCVUZGRVJfQ09NUExFVEU7cmV0dXJuIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELG51bGwpLGUuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsbnVsbCksZS5kZWxldGVUZXh0dXJlKHQpLGUuZGVsZXRlRnJhbWVidWZmZXIociksb31jaGVja1JlbmRlckZsb2F0MzIoKXtpZigyPT09dGhpcy52ZXJzaW9uKXtpZighdGhpcy5jb2xvckJ1ZmZlckZsb2F0RXh0ZW5zaW9uKXJldHVybiAhMX1lbHNlIGlmKCF0aGlzLnRleHR1cmVGbG9hdEV4dGVuc2lvbilyZXR1cm4gITE7cmV0dXJuIHRoaXMuaXNGbG9hdFRleHR1cmVBdHRhY2hhYmxlVG9GcmFtZUJ1ZmZlcn1jaGVja0Zsb2F0MzJEb3dubG9hZCgpe2lmKDI9PT10aGlzLnZlcnNpb24pe2lmKCF0aGlzLmNvbG9yQnVmZmVyRmxvYXRFeHRlbnNpb24pcmV0dXJuICExfWVsc2Uge2lmKCF0aGlzLnRleHR1cmVGbG9hdEV4dGVuc2lvbilyZXR1cm4gITE7aWYoIXRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9jb2xvcl9idWZmZXJfZmxvYXQiKSlyZXR1cm4gITF9cmV0dXJuIHRoaXMuaXNGbG9hdFRleHR1cmVBdHRhY2hhYmxlVG9GcmFtZUJ1ZmZlcn1jaGVja0Zsb2F0MzJCbGVuZCgpe2NvbnN0IGU9dGhpcy5nbDtsZXQgdCxuLHIsbyxpO3RyeXt0PWUuY3JlYXRlVGV4dHVyZSgpLG49ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpLGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELHQpO2NvbnN0IHM9Mj09PXRoaXMudmVyc2lvbj9lLlJHQkEzMkY6ZS5SR0JBO3JldHVybiBlLnRleEltYWdlMkQoZS5URVhUVVJFXzJELDAscywxLDEsMCxlLlJHQkEsZS5GTE9BVCxudWxsKSxlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLG4pLGUuZnJhbWVidWZmZXJUZXh0dXJlMkQoZS5GUkFNRUJVRkZFUixlLkNPTE9SX0FUVEFDSE1FTlQwLGUuVEVYVFVSRV8yRCx0LDApLGUuZW5hYmxlKGUuQkxFTkQpLHI9ZS5jcmVhdGVTaGFkZXIoZS5WRVJURVhfU0hBREVSKSwhIXImJihlLnNoYWRlclNvdXJjZShyLCJ2b2lkIG1haW4oKXt9IiksZS5jb21waWxlU2hhZGVyKHIpLG89ZS5jcmVhdGVTaGFkZXIoZS5GUkFHTUVOVF9TSEFERVIpLCEhbyYmKGUuc2hhZGVyU291cmNlKG8sInByZWNpc2lvbiBoaWdocCBmbG9hdDt2b2lkIG1haW4oKXtnbF9GcmFnQ29sb3I9dmVjNCgwLjUpO30iKSxlLmNvbXBpbGVTaGFkZXIobyksaT1lLmNyZWF0ZVByb2dyYW0oKSwhIWkmJihlLmF0dGFjaFNoYWRlcihpLHIpLGUuYXR0YWNoU2hhZGVyKGksbyksZS5saW5rUHJvZ3JhbShpKSxlLnVzZVByb2dyYW0oaSksZS5kcmF3QXJyYXlzKGUuUE9JTlRTLDAsMSksZS5nZXRFcnJvcigpPT09ZS5OT19FUlJPUikpKX1maW5hbGx5e2UuZGlzYWJsZShlLkJMRU5EKSxpJiZlLmRlbGV0ZVByb2dyYW0oaSksciYmZS5kZWxldGVTaGFkZXIociksbyYmZS5kZWxldGVTaGFkZXIobyksbiYmKGUuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsbnVsbCksZS5kZWxldGVGcmFtZWJ1ZmZlcihuKSksdCYmKGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELG51bGwpLGUuZGVsZXRlVGV4dHVyZSh0KSk7fX1iZWdpblRpbWVyKCl7aWYoMj09PXRoaXMudmVyc2lvbiYmdGhpcy5kaXNqb2ludFRpbWVyUXVlcnlXZWJnbDJFeHRlbnNpb24pe2NvbnN0IGU9dGhpcy5nbCx0PXRoaXMuZGlzam9pbnRUaW1lclF1ZXJ5V2ViZ2wyRXh0ZW5zaW9uLG49ZS5jcmVhdGVRdWVyeSgpO3JldHVybiBlLmJlZ2luUXVlcnkodC5USU1FX0VMQVBTRURfRVhULG4pLG59dGhyb3cgbmV3IEVycm9yKCJXZWJHTDEgcHJvZmlsaW5nIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLiIpfWVuZFRpbWVyKCl7aWYoMiE9PXRoaXMudmVyc2lvbnx8IXRoaXMuZGlzam9pbnRUaW1lclF1ZXJ5V2ViZ2wyRXh0ZW5zaW9uKXRocm93IG5ldyBFcnJvcigiV2ViR0wxIHByb2ZpbGluZyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCIpO3tjb25zdCBlPXRoaXMuZ2wsdD10aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbjtlLmVuZFF1ZXJ5KHQuVElNRV9FTEFQU0VEX0VYVCk7fX1pc1RpbWVyUmVzdWx0QXZhaWxhYmxlKGUpe2xldCB0PSExLG49ITE7aWYoMiE9PXRoaXMudmVyc2lvbnx8IXRoaXMuZGlzam9pbnRUaW1lclF1ZXJ5V2ViZ2wyRXh0ZW5zaW9uKXRocm93IG5ldyBFcnJvcigiV2ViR0wxIHByb2ZpbGluZyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCIpO3tjb25zdCByPXRoaXMuZ2wsbz10aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbjt0PXIuZ2V0UXVlcnlQYXJhbWV0ZXIoZSxyLlFVRVJZX1JFU1VMVF9BVkFJTEFCTEUpLG49ci5nZXRQYXJhbWV0ZXIoby5HUFVfRElTSk9JTlRfRVhUKTt9cmV0dXJuIHQmJiFufWdldFRpbWVyUmVzdWx0KGUpe2xldCB0PTA7aWYoMiE9PXRoaXMudmVyc2lvbil0aHJvdyBuZXcgRXJyb3IoIldlYkdMMSBwcm9maWxpbmcgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQiKTt7Y29uc3Qgbj10aGlzLmdsO3Q9bi5nZXRRdWVyeVBhcmFtZXRlcihlLG4uUVVFUllfUkVTVUxUKSxuLmRlbGV0ZVF1ZXJ5KGUpO31yZXR1cm4gdC8xZTZ9YXN5bmMgd2FpdEZvclF1ZXJ5QW5kR2V0VGltZShlKXtyZXR1cm4gYXdhaXQoMCwgdS5yZXBlYXRlZFRyeSkoKCgpPT50aGlzLmlzVGltZXJSZXN1bHRBdmFpbGFibGUoZSkpKSx0aGlzLmdldFRpbWVyUmVzdWx0KGUpfWFzeW5jIGNyZWF0ZUFuZFdhaXRGb3JGZW5jZSgpe2NvbnN0IGU9dGhpcy5jcmVhdGVGZW5jZSh0aGlzLmdsKTtyZXR1cm4gdGhpcy5wb2xsRmVuY2UoZSl9Y3JlYXRlRmVuY2UoZSl7bGV0IHQ7Y29uc3Qgbj1lLHI9bi5mZW5jZVN5bmMobi5TWU5DX0dQVV9DT01NQU5EU19DT01QTEVURSwwKTtyZXR1cm4gZS5mbHVzaCgpLHQ9bnVsbD09PXI/KCk9PiEwOigpPT57Y29uc3QgZT1uLmNsaWVudFdhaXRTeW5jKHIsMCwwKTtyZXR1cm4gZT09PW4uQUxSRUFEWV9TSUdOQUxFRHx8ZT09PW4uQ09ORElUSU9OX1NBVElTRklFRH0se3F1ZXJ5OnIsaXNGZW5jZVBhc3NlZDp0fX1hc3luYyBwb2xsRmVuY2UoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0PT57dGhpcy5hZGRJdGVtVG9Qb2xsKCgoKT0+ZS5pc0ZlbmNlUGFzc2VkKCkpLCgoKT0+dCgpKSk7fSkpfXBvbGxJdGVtcygpe2NvbnN0IGU9bCh0aGlzLml0ZW1zVG9Qb2xsLm1hcCgoZT0+ZS5pc0RvbmVGbikpKTtmb3IobGV0IHQ9MDt0PD1lOysrdCl7Y29uc3R7cmVzb2x2ZUZuOmV9PXRoaXMuaXRlbXNUb1BvbGxbdF07ZSgpO310aGlzLml0ZW1zVG9Qb2xsPXRoaXMuaXRlbXNUb1BvbGwuc2xpY2UoZSsxKTt9YXN5bmMgYWRkSXRlbVRvUG9sbChlLHQpe3RoaXMuaXRlbXNUb1BvbGwucHVzaCh7aXNEb25lRm46ZSxyZXNvbHZlRm46dH0pLHRoaXMuaXRlbXNUb1BvbGwubGVuZ3RoPjF8fGF3YWl0KDAsIHUucmVwZWF0ZWRUcnkpKCgoKT0+KHRoaXMucG9sbEl0ZW1zKCksMD09PXRoaXMuaXRlbXNUb1BvbGwubGVuZ3RoKSkpO319O30sNjQ5NjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuRXhlY3V0aW9uUGxhbj12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpO2NsYXNzIG97Y29uc3RydWN0b3IoZSx0KXt0aGlzLm9wPWUsdGhpcy5ub2RlPXQ7fX10LkV4ZWN1dGlvblBsYW49Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuZ3JhcGg9ZSx0aGlzLnByb2ZpbGVyPW4sdGhpcy5pbml0aWFsaXplKHQpO31pbml0aWFsaXplKGUpe3RoaXMucHJvZmlsZXIuZXZlbnQoInNlc3Npb24iLCJFeGVjdXRpb25QbGFuLmluaXRpYWxpemUiLCgoKT0+e2NvbnN0IHQ9dGhpcy5ncmFwaC5nZXROb2RlcygpO2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgc2l6ZSBvZiBub2RlcyBhbmQgT1BzIGRvIG5vdCBtYXRjaC4iKTt0aGlzLl9vcHM9ZS5tYXAoKChlLG4pPT5uZXcgbyhlLHRbbl0pKSksdGhpcy5yZXNldCgpLHRoaXMuX3N0YXJ0ZXI9W10sdGhpcy5fb3BzLmZvckVhY2goKChlLHQpPT57bGV0IG49ITA7Zm9yKGNvbnN0IHQgb2YgZS5ub2RlLmlucHV0cylpZighdGhpcy5fdmFsdWVzW3RdJiYtMT09PXRoaXMuZ3JhcGguZ2V0SW5wdXRJbmRpY2VzKCkuaW5kZXhPZih0KSl7bj0hMTticmVha31uJiZ0aGlzLl9zdGFydGVyLnB1c2godCk7fSkpO30pKTt9cmVzZXQoKXt0aGlzLl92YWx1ZXM9dGhpcy5ncmFwaC5nZXRWYWx1ZXMoKS5tYXAoKGU9PmUudGVuc29yKSk7fWFzeW5jIGV4ZWN1dGUoZSx0KXtyZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgic2Vzc2lvbiIsIkV4ZWN1dGlvblBsYW4uZXhlY3V0ZSIsKGFzeW5jKCk9Pnt0aGlzLnJlc2V0KCk7Y29uc3Qgbj1lLmNyZWF0ZUluZmVyZW5jZUhhbmRsZXIoKSxvPXRoaXMuZ3JhcGguZ2V0SW5wdXRJbmRpY2VzKCk7aWYodC5sZW5ndGghPT1vLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYG51bWJlciBvZiBpbnB1dCB0ZW5zb3JzIGRvbid0IG1hdGNoIHRoZSBudW1iZXIgb2YgaW5wdXRzIHRvIHRoZSBtb2RlbDogYWN0dWFsOiAke3QubGVuZ3RofSBleHBlY3RlZDogJHtvLmxlbmd0aH1gKTt0LmZvckVhY2goKChlLHQpPT57Y29uc3Qgbj1vW3RdO3RoaXMuX3ZhbHVlc1tuXT1lO30pKTtjb25zdCBpPXRoaXMuX3N0YXJ0ZXIuc2xpY2UoMCkscz10aGlzLmdyYXBoLmdldFZhbHVlcygpLGE9dGhpcy5ncmFwaC5nZXROb2RlcygpO2xldCB1PTA7Zm9yKDt1PGkubGVuZ3RoOyl7Y29uc3QgZT1pW3UrK10sdD10aGlzLl9vcHNbZV0sbz10Lm5vZGUuaW5wdXRzLm1hcCgoZT0+dGhpcy5fdmFsdWVzW2VdKSk7aWYoLTEhPT1vLmluZGV4T2Yodm9pZCAwKSl0aHJvdyBuZXcgRXJyb3IoYHVucmVzb2x2ZWQgaW5wdXQgZGV0ZWN0ZWQ6IG9wOiAke3Qubm9kZX1gKTtjb25zdCBsPW87ci5Mb2dnZXIudmVyYm9zZSgiRXhlY1BsYW4iLGBSdW5pbmcgb3A6JHt0Lm5vZGUubmFtZX0gKCR7bC5tYXAoKChlLG4pPT5gJyR7dC5ub2RlLmlucHV0c1tuXX0nOiAke2UudHlwZX1bJHtlLmRpbXMuam9pbigiLCIpfV1gKSkuam9pbigiLCAiKX0pYCk7Y29uc3QgYz1hd2FpdCB0aGlzLnByb2ZpbGVyLmV2ZW50KCJub2RlIix0Lm5vZGUubmFtZSwoYXN5bmMoKT0+dC5vcC5pbXBsKG4sbCx0Lm9wLmNvbnRleHQpKSk7aWYoYy5sZW5ndGghPT10Lm5vZGUub3V0cHV0cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgc2l6ZSBvZiBvdXRwdXQgZG9lcyBub3QgbWF0Y2ggbW9kZWwgZGVmaW5pdGlvbi4iKTtjLmZvckVhY2goKChlLG4pPT57Y29uc3Qgcj10Lm5vZGUub3V0cHV0c1tuXTtpZih0aGlzLl92YWx1ZXNbcl0pdGhyb3cgbmV3IEVycm9yKGBvdXRwdXQgWyR7cn1dIGFscmVhZHkgaGFzIHZhbHVlOiBvcDoke3Qubm9kZS5uYW1lfWApO3RoaXMuX3ZhbHVlc1tyXT1lO30pKTtjb25zdCBwPW5ldyBTZXQ7Yy5mb3JFYWNoKCgoZSxuKT0+e2NvbnN0IHI9dC5ub2RlLm91dHB1dHNbbl07Zm9yKGNvbnN0IGUgb2Ygc1tyXS50byl7Y29uc3QgdD1hW2VdO2xldCBuPSEwO2Zvcihjb25zdCBlIG9mIHQuaW5wdXRzKWlmKCF0aGlzLl92YWx1ZXNbZV0pe249ITE7YnJlYWt9biYmcC5hZGQoZSk7fX0pKSxpLnB1c2goLi4ucCk7fWNvbnN0IGw9W107Zm9yKGxldCBlPTA7ZTx0aGlzLmdyYXBoLmdldE91dHB1dEluZGljZXMoKS5sZW5ndGg7ZSsrKXtjb25zdCB0PXRoaXMuZ3JhcGguZ2V0T3V0cHV0SW5kaWNlcygpW2VdLG49dGhpcy5fdmFsdWVzW3RdO2lmKHZvaWQgMD09PW4pdGhyb3cgbmV3IEVycm9yKGByZXF1aXJlZCBvdXRwdXQgWyR7dH1dIGRvZXMgbm90IGhhdmUgdmFsdWVgKTswPT09dD9hd2FpdCBuLmdldERhdGEoKTpuLmRhdGEsbC5wdXNoKG4pO31yZXR1cm4gci5Mb2dnZXIudmVyYm9zZSgiRXhlY1BsYW4iLCJkaXNwb3Npbmcgb2YgaW5mZXJlbmNlSGFuZGxlciIpLG4uZGlzcG9zZSgpLGx9KSl9fTt9LDQ2NjI6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkdyYXBoPXZvaWQgMDtjb25zdCByPW4oNjg3NCksbz1uKDUxMjcpLGk9bigyNDQ2KSxzPW4oOTI0MCksYT1uKDcyNzMpO3ZhciB1PW8ub25ueHJ1bnRpbWUuZXhwZXJpbWVudGFsLmZiczt0LkdyYXBoPXtmcm9tOihlLHQpPT5uZXcgcChlLHQpfTtjbGFzcyBse2NvbnN0cnVjdG9yKGUpe3RoaXMuX2Zyb209dm9pZCAwLHRoaXMuX3RvPVtdLHRoaXMudGVuc29yPXZvaWQgMCx0aGlzLnR5cGU9dm9pZCAwLGUmJih0aGlzLnR5cGU9YS5Qcm90b1V0aWwudGVuc29yVmFsdWVUeXBlRnJvbVByb3RvKGUudHlwZS50ZW5zb3JUeXBlKSk7fWdldCBmcm9tKCl7cmV0dXJuIHRoaXMuX2Zyb219Z2V0IHRvKCl7cmV0dXJuIHRoaXMuX3RvfX1jbGFzcyBje2NvbnN0cnVjdG9yKGUsdCl7ZSBpbnN0YW5jZW9mIGkub25ueC5Ob2RlUHJvdG8/KHRoaXMubmFtZT1lLm5hbWUsdGhpcy5vcFR5cGU9ZS5vcFR5cGUsdGhpcy5hdHRyaWJ1dGVzPW5ldyByLkF0dHJpYnV0ZShlLmF0dHJpYnV0ZSkpOmUgaW5zdGFuY2VvZiB1Lk5vZGUmJih0aGlzLm5hbWU9bnVsbCE9dD90OmUubmFtZSgpLHRoaXMub3BUeXBlPWUub3BUeXBlKCksdGhpcy5hdHRyaWJ1dGVzPW5ldyByLkF0dHJpYnV0ZShhLlByb3RvVXRpbC50ZW5zb3JBdHRyaWJ1dGVzRnJvbU9SVEZvcm1hdChlKSkpLHRoaXMuaW5wdXRzPVtdLHRoaXMub3V0cHV0cz1bXSx0aGlzLmV4ZWN1dGVOb2RlPSEwO319Y2xhc3MgcHtjb25zdHJ1Y3RvcihlLHQpe2lmKCFlKXRocm93IG5ldyBUeXBlRXJyb3IoImdyYXBoIGlzIGVtcHR5Iik7dGhpcy5idWlsZEdyYXBoKGUpLHRoaXMudHJhbnNmb3JtR3JhcGgodCksdGhpcy5jaGVja0lzQWN5Y2xpYygpO31nZXRJbnB1dEluZGljZXMoKXtyZXR1cm4gdGhpcy5fYWxsSW5wdXRJbmRpY2VzfWdldElucHV0TmFtZXMoKXtyZXR1cm4gdGhpcy5fYWxsSW5wdXROYW1lc31nZXRPdXRwdXRJbmRpY2VzKCl7cmV0dXJuIHRoaXMuX2FsbE91dHB1dEluZGljZXN9Z2V0T3V0cHV0TmFtZXMoKXtyZXR1cm4gdGhpcy5fYWxsT3V0cHV0TmFtZXN9Z2V0VmFsdWVzKCl7cmV0dXJuIHRoaXMuX2FsbERhdGF9Z2V0Tm9kZXMoKXtyZXR1cm4gdGhpcy5fbm9kZXN9YnVpbGRHcmFwaChlKXtpZihlIGluc3RhbmNlb2YgaS5vbm54LkdyYXBoUHJvdG8pdGhpcy5idWlsZEdyYXBoRnJvbU9ubnhGb3JtYXQoZSk7ZWxzZSB7aWYoIShlIGluc3RhbmNlb2YgdS5HcmFwaCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiR3JhcGggdHlwZSBpcyBub3Qgc3VwcG9ydGVkLiIpO3RoaXMuYnVpbGRHcmFwaEZyb21PcnRGb3JtYXQoZSk7fX1idWlsZEdyYXBoRnJvbU9ubnhGb3JtYXQoZSl7Y29uc3QgdD1uZXcgTWFwO3RoaXMuX2FsbERhdGE9W10sdGhpcy5fYWxsSW5wdXRJbmRpY2VzPVtdLHRoaXMuX2FsbElucHV0TmFtZXM9W10sdGhpcy5fYWxsT3V0cHV0SW5kaWNlcz1bXSx0aGlzLl9hbGxPdXRwdXROYW1lcz1bXSx0aGlzLl9ub2Rlcz1bXTtjb25zdCBuPW5ldyBNYXA7aWYoIWUuaW5wdXQpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIGluZm9ybWF0aW9uIGluIGdyYXBoOiBpbnB1dCIpO2NvbnN0IHI9W107Zm9yKGNvbnN0IG4gb2YgZS5pbnB1dCl7aWYodC5oYXMobi5uYW1lKSl0aHJvdyBuZXcgRXJyb3IoYGR1cGxpY2F0ZWQgaW5wdXQgbmFtZTogJHtuLm5hbWV9YCk7Y29uc3QgZT10aGlzLl9hbGxEYXRhLnB1c2gobmV3IGwobikpLTE7dC5zZXQobi5uYW1lLGUpLHIucHVzaChuLm5hbWUpO31pZighZS5pbml0aWFsaXplcil0aHJvdyBuZXcgRXJyb3IoIm1pc3NpbmcgaW5mb3JtYXRpb24gaW4gZ3JhcGg6IGluaXRpYWxpemVyIik7Zm9yKGNvbnN0IG4gb2YgZS5pbml0aWFsaXplcil7bGV0IGU9dC5nZXQobi5uYW1lKTtpZih2b2lkIDA9PT1lKXtjb25zdCByPW5ldyBsO3IudHlwZT17c2hhcGU6e2RpbXM6YS5Qcm90b1V0aWwudGVuc29yRGltc0Zyb21Qcm90byhuLmRpbXMpfSx0ZW5zb3JUeXBlOmEuUHJvdG9VdGlsLnRlbnNvckRhdGFUeXBlRnJvbVByb3RvKG4uZGF0YVR5cGUpfSxlPXRoaXMuX2FsbERhdGEucHVzaChyKS0xLHQuc2V0KG4ubmFtZSxlKTt9dGhpcy5fYWxsRGF0YVtlXS5fZnJvbT0tMSx0aGlzLl9hbGxEYXRhW2VdLnRlbnNvcj1zLlRlbnNvci5mcm9tUHJvdG8obik7fWZvcihsZXQgZT0wO2U8dGhpcy5fYWxsRGF0YS5sZW5ndGg7ZSsrKXRoaXMuX2FsbERhdGFbZV0udGVuc29yfHwodGhpcy5fYWxsSW5wdXRJbmRpY2VzLnB1c2goZSksdGhpcy5fYWxsSW5wdXROYW1lcy5wdXNoKHJbZV0pKTtpZighZS5vdXRwdXQpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIGluZm9ybWF0aW9uIGluIGdyYXBoOiBvdXRwdXQiKTtmb3IoY29uc3QgbiBvZiBlLm91dHB1dCl7aWYodC5oYXMobi5uYW1lKSl0aHJvdyBuZXcgRXJyb3IoYGR1cGxpY2F0ZWQgb3V0cHV0IG5hbWU6ICR7bi5uYW1lfWApO2NvbnN0IGU9dGhpcy5fYWxsRGF0YS5wdXNoKG5ldyBsKG4pKS0xO3Quc2V0KG4ubmFtZSxlKSx0aGlzLl9hbGxPdXRwdXRJbmRpY2VzLnB1c2goZSksdGhpcy5fYWxsT3V0cHV0TmFtZXMucHVzaChuLm5hbWUpO31pZighZS5ub2RlKXRocm93IG5ldyBFcnJvcigibWlzc2luZyBpbmZvcm1hdGlvbiBpbiBncmFwaDogbm9kZSIpO2Zvcihjb25zdCB0IG9mIGUubm9kZSl7aWYoIXQubmFtZSlmb3IobGV0IGU9MDs7ZSsrKXtjb25zdCByPWB1bm5hbWVkXyR7dC5vcFR5cGV9XyR7ZX1gO2lmKCFuLmhhcyhyKSl7dC5uYW1lPXI7YnJlYWt9fWlmKG4uaGFzKHQubmFtZSkpdGhyb3cgbmV3IEVycm9yKGBkdXBsaWNhdGVkIG5vZGUgbmFtZTogJHt0Lm5hbWV9YCk7Y29uc3QgZT10aGlzLl9ub2Rlcy5wdXNoKG5ldyBjKHQpKS0xO24uc2V0KHQubmFtZSxlKTt9Zm9yKGxldCBuPTA7bjx0aGlzLl9ub2Rlcy5sZW5ndGg7bisrKXtjb25zdCByPXRoaXMuX25vZGVzW25dLG89ZS5ub2RlW25dO2lmKCFvLm91dHB1dCl0aHJvdyBuZXcgRXJyb3IoYG1pc3Npbmcgb3V0cHV0IGZvciBub2RlOiAke28ubmFtZX1gKTtmb3IoY29uc3QgZSBvZiBvLm91dHB1dCl7bGV0IGk9dC5nZXQoZSk7aWYodm9pZCAwPT09aSYmKGk9dGhpcy5fYWxsRGF0YS5wdXNoKG5ldyBsKS0xLHQuc2V0KGUsaSkpLHIub3V0cHV0cy5wdXNoKGkpLHZvaWQgMCE9PXRoaXMuX2FsbERhdGFbaV0uX2Zyb20pdGhyb3cgbmV3IEVycm9yKGBtdWx0aXBsZSBub2RlcyBvdXRwdXQgdG8gb25lIGRhdGEgdmFsdWU6ICR7aX1gKTtpZih0aGlzLl9hbGxEYXRhW2ldLl9mcm9tPW4sIkNvbnN0YW50Ij09PW8ub3BUeXBlKXtpZighby5hdHRyaWJ1dGV8fDEhPT1vLmF0dHJpYnV0ZS5sZW5ndGh8fCFvLmF0dHJpYnV0ZVswXS50KXRocm93IG5ldyBFcnJvcigibWlzc2luZyBhdHRyaWJ1dGVzIG9yIG1pc3NpbmcgdGVuc29yIHZhbHVlIGluIGF0dHJpYnV0ZXMgZm9yIHRoaXMgQ29uc3RhbnQgb3BlcmF0b3IiKTtpZighby5vdXRwdXR8fDEhPT1vLm91dHB1dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIG91dHB1dCBvciBpbmNvcnJlY3QgbnVtYmVyIG9mIG91dHB1dHMgZm9yIHRoaXMgQ29uc3RhbnQgb3BlcmF0b3IiKTtyLm91dHB1dHMucG9wKCksci5leGVjdXRlTm9kZT0hMSx0aGlzLl9hbGxEYXRhW2ldLl9mcm9tPS0xLHRoaXMuX2FsbERhdGFbaV0udGVuc29yPXMuVGVuc29yLmZyb21Qcm90byhvLmF0dHJpYnV0ZVswXS50KTt9fX1mb3IobGV0IG49MDtuPHRoaXMuX25vZGVzLmxlbmd0aDtuKyspe2NvbnN0IHI9dGhpcy5fbm9kZXNbbl0sbz1lLm5vZGVbbl07aWYoIW8uaW5wdXQpdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIGlucHV0IGZvciBub2RlOiAke28ubmFtZX1gKTtmb3IoY29uc3QgZSBvZiBvLmlucHV0KXtjb25zdCBpPXQuZ2V0KGUpO2lmKHZvaWQgMD09PWkpe2lmKCIiPT09ZSYmKDM9PT1vLmlucHV0Lmxlbmd0aHx8ND09PW8uaW5wdXQubGVuZ3RoKSYmIlJlc2l6ZSI9PT1vLm9wVHlwZSljb250aW51ZTt0aHJvdyBuZXcgRXJyb3IoYHVucmVjb2duaXplZCBpbnB1dCAnJHtlfScgZm9yIG5vZGU6ICR7by5uYW1lfWApfXIuaW5wdXRzLnB1c2goaSksdGhpcy5fYWxsRGF0YVtpXS5fdG8ucHVzaChuKTt9fXJldHVybiAhMH1idWlsZEdyYXBoRnJvbU9ydEZvcm1hdChlKXt2YXIgdCxuLHI7Y29uc3Qgbz1uZXcgTWFwO3RoaXMuX2FsbERhdGE9W10sdGhpcy5fYWxsSW5wdXRJbmRpY2VzPVtdLHRoaXMuX2FsbElucHV0TmFtZXM9W10sdGhpcy5fYWxsT3V0cHV0SW5kaWNlcz1bXSx0aGlzLl9hbGxPdXRwdXROYW1lcz1bXSx0aGlzLl9ub2Rlcz1bXTtjb25zdCBpPW5ldyBNYXAscD1bXTtmb3IobGV0IGk9MDtpPGUuaW5wdXRzTGVuZ3RoKCk7aSsrKXtjb25zdCBzPWUuaW5wdXRzKGkpO2lmKG8uaGFzKHMpKXRocm93IG5ldyBFcnJvcihgZHVwbGljYXRlZCBpbnB1dCBuYW1lOiAke3N9YCk7Zm9yKGxldCBpPTA7aTxlLm5vZGVBcmdzTGVuZ3RoKCk7aSsrKWlmKChudWxsPT09KHQ9ZS5ub2RlQXJncyhpKSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQubmFtZSgpKT09PXMpe2NvbnN0IHQ9bmV3IGw7aWYoKG51bGw9PT0ocj1udWxsPT09KG49ZS5ub2RlQXJncyhpKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4udHlwZSgpKXx8dm9pZCAwPT09cj92b2lkIDA6ci52YWx1ZVR5cGUoKSkhPT11LlR5cGVJbmZvVmFsdWUudGVuc29yX3R5cGUpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHZhbHVlIHR5cGUgZm9yIHRoZSBub2RlQXJnLiIpO2NvbnN0IGM9ZS5ub2RlQXJncyhpKS50eXBlKCkudmFsdWUobmV3IHUuVGVuc29yVHlwZUFuZFNoYXBlKSxkPWEuUHJvdG9VdGlsLnRlbnNvckRhdGFUeXBlRnJvbVByb3RvKGMuZWxlbVR5cGUoKSksZj1jLnNoYXBlKCksaD1bXTtmb3IobGV0IGU9MDtlPGYuZGltTGVuZ3RoKCk7ZSsrKWgucHVzaChhLkxvbmdVdGlsLmxvbmdUb051bWJlcihmLmRpbShlKS52YWx1ZSgpLmRpbVZhbHVlKCkpKTt0LnR5cGU9e3NoYXBlOntkaW1zOmh9LHRlbnNvclR5cGU6ZH07Y29uc3QgZz10aGlzLl9hbGxEYXRhLnB1c2godCktMTtvLnNldChzLGcpLHAucHVzaChzKTt9fWZvcihsZXQgdD0wO3Q8ZS5pbml0aWFsaXplcnNMZW5ndGgoKTt0Kyspe2NvbnN0IG49ZS5pbml0aWFsaXplcnModCk7bGV0IHI9by5nZXQobi5uYW1lKCkpO2lmKHZvaWQgMD09PXIpe2NvbnN0IGU9bmV3IGwsdD1hLlByb3RvVXRpbC50ZW5zb3JEaW1zRnJvbU9SVEZvcm1hdChuKSxpPWEuUHJvdG9VdGlsLnRlbnNvckRhdGFUeXBlRnJvbVByb3RvKG4uZGF0YVR5cGUoKSk7ZS50eXBlPXtzaGFwZTp7ZGltczp0fSx0ZW5zb3JUeXBlOml9LHI9dGhpcy5fYWxsRGF0YS5wdXNoKGUpLTEsby5zZXQobi5uYW1lKCkscik7fXRoaXMuX2FsbERhdGFbcl0uX2Zyb209LTEsdGhpcy5fYWxsRGF0YVtyXS50ZW5zb3I9cy5UZW5zb3IuZnJvbU9ydFRlbnNvcihuKTt9Zm9yKGxldCBlPTA7ZTx0aGlzLl9hbGxEYXRhLmxlbmd0aDtlKyspdGhpcy5fYWxsRGF0YVtlXS50ZW5zb3J8fCh0aGlzLl9hbGxJbnB1dEluZGljZXMucHVzaChlKSx0aGlzLl9hbGxJbnB1dE5hbWVzLnB1c2gocFtlXSkpO2ZvcihsZXQgdD0wO3Q8ZS5vdXRwdXRzTGVuZ3RoKCk7dCsrKXtjb25zdCBuPWUub3V0cHV0cyh0KTtpZihvLmhhcyhuKSl0aHJvdyBuZXcgRXJyb3IoYGR1cGxpY2F0ZWQgb3V0cHV0IG5hbWU6ICR7bn1gKTtjb25zdCByPXRoaXMuX2FsbERhdGEucHVzaChuZXcgbCktMTtvLnNldChuLHIpLHRoaXMuX2FsbE91dHB1dEluZGljZXMucHVzaChyKSx0aGlzLl9hbGxPdXRwdXROYW1lcy5wdXNoKG4pO31pZighZS5ub2Rlcyl0aHJvdyBuZXcgRXJyb3IoIm1pc3NpbmcgaW5mb3JtYXRpb24gaW4gZ3JhcGg6IG5vZGUiKTtmb3IobGV0IHQ9MDt0PGUubm9kZXNMZW5ndGgoKTt0Kyspe2NvbnN0IG49ZS5ub2Rlcyh0KTtsZXQgcj1uLm5hbWUoKTtpZighcilmb3IobGV0IGU9MDtyPWB1bm5hbWVkXyR7bi5vcFR5cGUoKX1fJHtlfWAsaS5oYXMocik7ZSsrKTtpZihpLmhhcyhyKSl0aHJvdyBuZXcgRXJyb3IoYGR1cGxpY2F0ZWQgbm9kZSBuYW1lOiAke3J9YCk7Y29uc3Qgbz10aGlzLl9ub2Rlcy5wdXNoKG5ldyBjKG4scikpLTE7aS5zZXQocixvKTt9Zm9yKGxldCB0PTA7dDx0aGlzLl9ub2Rlcy5sZW5ndGg7dCsrKXtjb25zdCBuPXRoaXMuX25vZGVzW3RdLHI9ZS5ub2Rlcyh0KTtpZihudWxsPT1yKXRocm93IG5ldyBFcnJvcihgTm8gbm9kZSBleGlzdHMgYXQgaW5kZXggJHt0fWApO2lmKDA9PT0obnVsbD09cj92b2lkIDA6ci5vdXRwdXRzTGVuZ3RoKCkpKXRocm93IG5ldyBFcnJvcihgbWlzc2luZyBvdXRwdXQgZm9yIG5vZGU6ICR7ci5uYW1lfWApO2ZvcihsZXQgZT0wO2U8KG51bGw9PXI/dm9pZCAwOnIub3V0cHV0c0xlbmd0aCgpKTtlKyspe2NvbnN0IGk9bnVsbD09cj92b2lkIDA6ci5vdXRwdXRzKGUpO2xldCBhPW8uZ2V0KGkpO2lmKHZvaWQgMD09PWEmJihhPXRoaXMuX2FsbERhdGEucHVzaChuZXcgbCktMSxvLnNldChpLGEpKSxuLm91dHB1dHMucHVzaChhKSx2b2lkIDAhPT10aGlzLl9hbGxEYXRhW2FdLl9mcm9tKXRocm93IG5ldyBFcnJvcihgbXVsdGlwbGUgbm9kZXMgb3V0cHV0IHRvIG9uZSBkYXRhIHZhbHVlOiAke2F9YCk7aWYodGhpcy5fYWxsRGF0YVthXS5fZnJvbT10LCJDb25zdGFudCI9PT1yLm9wVHlwZSgpKXtpZigxIT09ci5hdHRyaWJ1dGVzTGVuZ3RoKCl8fCFyLmF0dHJpYnV0ZXMoMCkudCgpKXRocm93IG5ldyBFcnJvcigibWlzc2luZyBhdHRyaWJ1dGVzIG9yIG1pc3NpbmcgdGVuc29yIHZhbHVlIGluIGF0dHJpYnV0ZXMgZm9yIHRoaXMgQ29uc3RhbnQgb3BlcmF0b3IiKTtpZigxIT09ci5vdXRwdXRzTGVuZ3RoKCkpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIG91dHB1dCBvciBpbmNvcnJlY3QgbnVtYmVyIG9mIG91dHB1dHMgZm9yIHRoaXMgQ29uc3RhbnQgb3BlcmF0b3IiKTtuLm91dHB1dHMucG9wKCksbi5leGVjdXRlTm9kZT0hMSx0aGlzLl9hbGxEYXRhW2FdLl9mcm9tPS0xLHRoaXMuX2FsbERhdGFbYV0udGVuc29yPXMuVGVuc29yLmZyb21PcnRUZW5zb3Ioci5hdHRyaWJ1dGVzKDApLnQoKSk7fX19Zm9yKGxldCB0PTA7dDx0aGlzLl9ub2Rlcy5sZW5ndGg7dCsrKXtjb25zdCBuPXRoaXMuX25vZGVzW3RdLHI9ZS5ub2Rlcyh0KTtpZigwPT09ci5pbnB1dHNMZW5ndGgoKSl0aHJvdyBuZXcgRXJyb3IoYG1pc3NpbmcgaW5wdXQgZm9yIG5vZGU6ICR7ci5uYW1lfWApO2ZvcihsZXQgZT0wO2U8ci5pbnB1dHNMZW5ndGgoKTtlKyspe2NvbnN0IGk9ci5pbnB1dHMoZSkscz1vLmdldChpKTtpZih2b2lkIDA9PT1zKXRocm93IG5ldyBFcnJvcihgdW5yZWNvZ25pemVkIGlucHV0ICcke2l9JyBmb3Igbm9kZTogJHtyLm5hbWUoKX1gKTtuLmlucHV0cy5wdXNoKHMpLHRoaXMuX2FsbERhdGFbc10uX3RvLnB1c2godCk7fX19Y2hlY2tJc0FjeWNsaWMoKXtjb25zdCBlPW5ldyBTZXQ7dGhpcy5fYWxsSW5wdXRJbmRpY2VzLmZvckVhY2goKHQ9Pnt0aGlzLl9hbGxEYXRhW3RdLl90by5mb3JFYWNoKCh0PT57ZS5hZGQodCk7fSkpO30pKTtjb25zdCB0PUFycmF5LmZyb20oZSksbj1uZXcgQXJyYXkodGhpcy5fbm9kZXMubGVuZ3RoKS5maWxsKCJ3aGl0ZSIpO2Zvcig7dC5sZW5ndGg+MDspe2NvbnN0IGU9dC5wb3AoKTsiZ3JheSI9PT1uW2VdP25bZV09ImJsYWNrIjoodC5wdXNoKGUpLG5bZV09ImdyYXkiLHRoaXMuX25vZGVzW2VdLm91dHB1dHMuZm9yRWFjaCgocj0+e2NvbnN0IG89dGhpcy5fYWxsRGF0YVtyXTtpZih2b2lkIDAhPT1vLnRlbnNvcil0aHJvdyBuZXcgRXJyb3IoIm5vZGUgb3V0cHV0cyBzaG91bGQgbm90IGJlIGluaXRpYWxpemVkIik7aWYoby5fZnJvbSE9PWUpdGhyb3cgbmV3IEVycm9yKCJmcm9tIHByb3BlcnR5IG9mIHRoZSBWYWx1ZSBvYmplY3QgZG9lc24ndCBtYXRjaCBpbmRleCBvZiBOb2RlIGJlaW5nIHByb2Nlc3NlZCIpO28uX3RvLmZvckVhY2goKGU9PntpZigiZ3JheSI9PT1uW2VdKXRocm93IG5ldyBFcnJvcigibW9kZWwgZ3JhcGggaXMgY3ljbGljIik7IndoaXRlIj09PW5bZV0mJnQucHVzaChlKTt9KSk7fSkpKTt9fXRyYW5zZm9ybUdyYXBoKGUpe3RoaXMucmVtb3ZlQWxsSWRlbnRpdHlOb2RlcygpLHRoaXMucmVtb3ZlQWxsRHJvcG91dE5vZGVzKCksdGhpcy5mdXNlQ29udkFjdGl2YXRpb25Ob2RlcygpLGUmJmUudHJhbnNmb3JtR3JhcGgodGhpcyksdGhpcy5maW5hbGl6ZUdyYXBoKCk7fWZpbmFsaXplR3JhcGgoKXtsZXQgZT0wO2NvbnN0IHQ9bmV3IEFycmF5KHRoaXMuX25vZGVzLmxlbmd0aCwwKTtsZXQgbj0wO2ZvcihsZXQgZT0wO2U8dGhpcy5fbm9kZXMubGVuZ3RoO2UrKyl0W2VdPW4sdGhpcy5fbm9kZXNbZV0uZXhlY3V0ZU5vZGU/KG4hPT1lJiYodGhpcy5fbm9kZXNbbl09dGhpcy5fbm9kZXNbZV0pLG4rKyk6dGhpcy5fbm9kZXNbZV0ub3V0cHV0cy5mb3JFYWNoKChlPT57dGhpcy5fYWxsRGF0YVtlXS5fZnJvbT0tMjt9KSk7dGhpcy5fbm9kZXMuc3BsaWNlKG4sdGhpcy5fbm9kZXMubGVuZ3RoLW4pO2ZvcihsZXQgZT0wO2U8dGhpcy5fYWxsRGF0YS5sZW5ndGg7ZSsrKXtjb25zdCBuPXRoaXMuX2FsbERhdGFbZV07dm9pZCAwIT09bi5fZnJvbSYmLTEhPT1uLl9mcm9tJiYtMiE9PW4uX2Zyb20mJihuLl9mcm9tPXRbbi5fZnJvbV0pO2ZvcihsZXQgZT0wO2U8bi5fdG8ubGVuZ3RoO2UrKyl7aWYoIShuLl90b1tlXT49MCkpdGhyb3cgbmV3IEVycm9yKCJUcnlpbmcgdG8gdXBkYXRlIGEgcmVtb3ZlZCBub2RlIik7bi5fdG9bZV09dFtuLl90b1tlXV07fX1lPTA7Zm9yKGxldCB0PTA7dDx0aGlzLl9hbGxEYXRhLmxlbmd0aDt0KyspaWYoLTIhPT10aGlzLl9hbGxEYXRhW3RdLmZyb218fC0xIT09dGhpcy5fYWxsT3V0cHV0SW5kaWNlcy5pbmRleE9mKHQrZSkpe2lmKGU+MCl7bGV0IG49LTE7dm9pZCAwIT09dGhpcy5fYWxsRGF0YVt0XS5mcm9tJiYtMSE9PXRoaXMuX2FsbERhdGFbdF0uZnJvbT8obj10aGlzLl9ub2Rlc1t0aGlzLl9hbGxEYXRhW3RdLmZyb21dLm91dHB1dHMuaW5kZXhPZih0K2UpLC0xIT09biYmKHRoaXMuX25vZGVzW3RoaXMuX2FsbERhdGFbdF0uZnJvbV0ub3V0cHV0c1tuXT10KSk6KG49dGhpcy5fYWxsSW5wdXRJbmRpY2VzLmluZGV4T2YodCtlKSwtMSE9PW4mJih0aGlzLl9hbGxJbnB1dEluZGljZXNbbl09dCkpLHRoaXMuX2FsbERhdGFbdF0udG8uZm9yRWFjaCgocj0+e249dGhpcy5fbm9kZXNbcl0uaW5wdXRzLmluZGV4T2YodCtlKSwtMSE9PW4mJih0aGlzLl9ub2Rlc1tyXS5pbnB1dHNbbl09dCk7fSkpLDA9PT10aGlzLl9hbGxEYXRhW3RdLnRvLmxlbmd0aCYmKG49dGhpcy5fYWxsT3V0cHV0SW5kaWNlcy5pbmRleE9mKHQrZSksLTEhPT1uJiYodGhpcy5fYWxsT3V0cHV0SW5kaWNlc1tuXT10KSk7fX1lbHNlIGUrKyx0aGlzLl9hbGxEYXRhLnNwbGljZSh0LDEpLHQtLTt9ZGVsZXRlTm9kZShlKXtjb25zdCB0PXRoaXMuX25vZGVzW2VdO2lmKHQub3V0cHV0cy5sZW5ndGg+MSlmb3IobGV0IGU9MTtlPHQub3V0cHV0cy5sZW5ndGg7ZSsrKWlmKHRoaXMuX2FsbERhdGFbdC5vdXRwdXRzW2VdXS50by5sZW5ndGg+MCl0aHJvdyBuZXcgRXJyb3IoIk5vZGUgZGVsZXRpb24gd2l0aCBtb3JlIHRoYW4gb25lIG91dHB1dCBjb25uZWN0ZWQgdG8gb3RoZXIgbm9kZXMgaXMgbm90IHN1cHBvcnRlZC4gIik7dC5leGVjdXRlTm9kZT0hMTtjb25zdCBuPXQuaW5wdXRzWzBdLHI9dC5vdXRwdXRzWzBdLG89dGhpcy5fYWxsRGF0YVtyXS50bztmb3IobGV0IG49MDtuPHQuaW5wdXRzLmxlbmd0aDtuKyspe2NvbnN0IHI9dGhpcy5fYWxsRGF0YVt0LmlucHV0c1tuXV0udG8uaW5kZXhPZihlKTtpZigtMT09PXIpdGhyb3cgbmV3IEVycm9yKCJUaGUgVmFsdWUgb2JqZWN0IGRvZXNuJ3QgaGF2ZSB0aGUgY3VycmVudCBOb2RlIGluIGl0J3MgJ3RvJyBwcm9wZXJ0eSAiKTt0aGlzLl9hbGxEYXRhW3QuaW5wdXRzW25dXS50by5zcGxpY2UociwxKTt9dGhpcy5fYWxsRGF0YVtyXS5fdG89W107Y29uc3QgaT10aGlzLl9hbGxPdXRwdXRJbmRpY2VzLmluZGV4T2Yocik7aWYoLTEhPT1pJiYodGhpcy5fYWxsT3V0cHV0SW5kaWNlc1tpXT1uKSxvJiZvLmxlbmd0aD4wKWZvcihjb25zdCBlIG9mIG8pe2NvbnN0IHQ9dGhpcy5fbm9kZXNbZV0uaW5wdXRzLmluZGV4T2Yocik7aWYoLTE9PT10KXRocm93IG5ldyBFcnJvcigiVGhlIE5vZGUgb2JqZWN0IGRvZXNuJ3QgaGF2ZSB0aGUgb3V0cHV0IFZhbHVlIGluIGl0J3MgJ2lucHV0cycgcHJvcGVydHkgIik7dGhpcy5fbm9kZXNbZV0uaW5wdXRzW3RdPW4sdGhpcy5fYWxsRGF0YVtuXS50by5wdXNoKGUpO319cmVtb3ZlQWxsRHJvcG91dE5vZGVzKCl7bGV0IGU9MDtmb3IoY29uc3QgdCBvZiB0aGlzLl9ub2Rlcyl7aWYoIkRyb3BvdXQiPT09dC5vcFR5cGUpe2lmKDEhPT10LmlucHV0cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJEcm9wb3V0IG5vZGVzIHNob3VsZCBvbmx5IGNvbnRhaW4gb25lIGlucHV0LiAiKTtpZigxIT09dC5vdXRwdXRzLmxlbmd0aCYmMiE9PXQub3V0cHV0cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJEcm9wb3V0IG5vZGVzIHNob3VsZCBjb250YWluIGVpdGhlciAxIG9yIDIgb3V0cHV0KHMpIik7aWYoMj09PXQub3V0cHV0cy5sZW5ndGgmJjAhPT10aGlzLl9hbGxEYXRhW3Qub3V0cHV0c1sxXV0uX3RvLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkRyb3BvdXQgbm9kZXMncyBzZWNvbmQgb3V0cHV0IHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBieSBvdGhlciBub2RlcyIpO3RoaXMuZGVsZXRlTm9kZShlKTt9ZSsrO319cmVtb3ZlQWxsSWRlbnRpdHlOb2Rlcygpe2xldCBlPTA7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fbm9kZXMpIklkZW50aXR5Ij09PXQub3BUeXBlJiZ0aGlzLmRlbGV0ZU5vZGUoZSksZSsrO31pc0FjdGl2YXRpb24oZSl7c3dpdGNoKGUub3BUeXBlKXtjYXNlIlJlbHUiOmNhc2UiU2lnbW9pZCI6Y2FzZSJDbGlwIjpyZXR1cm4gITA7ZGVmYXVsdDpyZXR1cm4gITF9fWZ1c2VDb252QWN0aXZhdGlvbk5vZGVzKCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5fbm9kZXMpaWYoIkNvbnYiPT09ZS5vcFR5cGUpe2NvbnN0IHQ9dGhpcy5fYWxsRGF0YVtlLm91dHB1dHNbMF1dLl90bztpZigxPT09dC5sZW5ndGgmJnRoaXMuaXNBY3RpdmF0aW9uKHRoaXMuX25vZGVzW3RbMF1dKSl7Y29uc3Qgbj10aGlzLl9ub2Rlc1t0WzBdXTtpZigiQ2xpcCI9PT1uLm9wVHlwZSlpZigxPT09bi5pbnB1dHMubGVuZ3RoKXRyeXtlLmF0dHJpYnV0ZXMuc2V0KCJhY3RpdmF0aW9uX3BhcmFtcyIsImZsb2F0cyIsW24uYXR0cmlidXRlcy5nZXRGbG9hdCgibWluIiksbi5hdHRyaWJ1dGVzLmdldEZsb2F0KCJtYXgiKV0pO31jYXRjaCh0KXtlLmF0dHJpYnV0ZXMuc2V0KCJhY3RpdmF0aW9uX3BhcmFtcyIsImZsb2F0cyIsW2EuTUlOX0NMSVAsYS5NQVhfQ0xJUF0pO31lbHNlIHtpZighKG4uaW5wdXRzLmxlbmd0aD49MyYmdm9pZCAwIT09dGhpcy5fYWxsRGF0YVtuLmlucHV0c1sxXV0udGVuc29yJiZ2b2lkIDAhPT10aGlzLl9hbGxEYXRhW24uaW5wdXRzWzJdXS50ZW5zb3IpKWNvbnRpbnVlO2UuYXR0cmlidXRlcy5zZXQoImFjdGl2YXRpb25fcGFyYW1zIiwiZmxvYXRzIixbdGhpcy5fYWxsRGF0YVtuLmlucHV0c1sxXV0udGVuc29yLmZsb2F0RGF0YVswXSx0aGlzLl9hbGxEYXRhW24uaW5wdXRzWzJdXS50ZW5zb3IuZmxvYXREYXRhWzBdXSk7fWUuYXR0cmlidXRlcy5zZXQoImFjdGl2YXRpb24iLCJzdHJpbmciLG4ub3BUeXBlKSx0aGlzLmRlbGV0ZU5vZGUodFswXSk7fX19fX0sMTMxNTooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lm5vdz10LlByb2ZpbGVyPXQuTG9nZ2VyPXZvaWQgMDtjb25zdCBuPXt2ZXJib3NlOjFlMyxpbmZvOjJlMyx3YXJuaW5nOjRlMyxlcnJvcjo1ZTMsZmF0YWw6NmUzfSxyPXtub25lOm5ldyBjbGFzc3tsb2coZSx0LG4pe319LGNvbnNvbGU6bmV3IGNsYXNze2xvZyhlLHQsbil7Y29uc29sZS5sb2coYCR7dGhpcy5jb2xvcihlKX0gJHtuPyIbWzM1bSIrbisiG1swbSAiOiIifSR7dH1gKTt9Y29sb3IoZSl7c3dpdGNoKGUpe2Nhc2UidmVyYm9zZSI6cmV0dXJuICIbWzM0OzQwbXYbWzBtIjtjYXNlImluZm8iOnJldHVybiAiG1szMm1pG1swbSI7Y2FzZSJ3YXJuaW5nIjpyZXR1cm4gIhtbMzA7NDNtdxtbMG0iO2Nhc2UiZXJyb3IiOnJldHVybiAiG1szMTs0MG1lG1swbSI7Y2FzZSJmYXRhbCI6cmV0dXJuICIbWzEwMW1mG1swbSI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHNldmVyaXR5OiAke2V9YCl9fX19LG89e3Byb3ZpZGVyOiJjb25zb2xlIixtaW5pbWFsU2V2ZXJpdHk6Indhcm5pbmciLGxvZ0RhdGVUaW1lOiEwLGxvZ1NvdXJjZUxvY2F0aW9uOiExfTtsZXQgaT17IiI6b307ZnVuY3Rpb24gcyhlLHQsbixyKXtpZih2b2lkIDA9PT10KXJldHVybiBvPWUse3ZlcmJvc2U6cy52ZXJib3NlLmJpbmQobnVsbCxvKSxpbmZvOnMuaW5mby5iaW5kKG51bGwsbyksd2FybmluZzpzLndhcm5pbmcuYmluZChudWxsLG8pLGVycm9yOnMuZXJyb3IuYmluZChudWxsLG8pLGZhdGFsOnMuZmF0YWwuYmluZChudWxsLG8pfTtpZih2b2lkIDA9PT1uKWEoZSx0KTtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgbiYmdm9pZCAwPT09cilhKGUsdCk7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIG4mJnZvaWQgMD09PXIpYShlLG4sMCx0KTtlbHNlIHtpZigic3RyaW5nIiE9dHlwZW9mIG58fCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBpcyB2YWxpZCIpO2EoZSxuLDAsdCk7fXZhciBvO31mdW5jdGlvbiBhKGUsdCxvLHMpe2NvbnN0IGE9aVtzfHwiIl18fGlbIiJdO25bZV08blthLm1pbmltYWxTZXZlcml0eV18fChhLmxvZ0RhdGVUaW1lJiYodD1gJHsobmV3IERhdGUpLnRvSVNPU3RyaW5nKCl9fCR7dH1gKSxhLmxvZ1NvdXJjZUxvY2F0aW9uLHJbYS5wcm92aWRlcl0ubG9nKGUsdCxzKSk7fSFmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe2k9e30sbigiIixlfHx7fSk7fWZ1bmN0aW9uIG4oZSxuKXtpZigiKiI9PT1lKXQobik7ZWxzZSB7Y29uc3QgdD1pW2VdfHxvO2lbZV09e3Byb3ZpZGVyOm4ucHJvdmlkZXJ8fHQucHJvdmlkZXIsbWluaW1hbFNldmVyaXR5Om4ubWluaW1hbFNldmVyaXR5fHx0Lm1pbmltYWxTZXZlcml0eSxsb2dEYXRlVGltZTp2b2lkIDA9PT1uLmxvZ0RhdGVUaW1lP3QubG9nRGF0ZVRpbWU6bi5sb2dEYXRlVGltZSxsb2dTb3VyY2VMb2NhdGlvbjp2b2lkIDA9PT1uLmxvZ1NvdXJjZUxvY2F0aW9uP3QubG9nU291cmNlTG9jYXRpb246bi5sb2dTb3VyY2VMb2NhdGlvbn07fX1lLnZlcmJvc2U9ZnVuY3Rpb24odCxuKXtlKCJ2ZXJib3NlIix0LG4pO30sZS5pbmZvPWZ1bmN0aW9uKHQsbil7ZSgiaW5mbyIsdCxuKTt9LGUud2FybmluZz1mdW5jdGlvbih0LG4pe2UoIndhcm5pbmciLHQsbik7fSxlLmVycm9yPWZ1bmN0aW9uKHQsbil7ZSgiZXJyb3IiLHQsbik7fSxlLmZhdGFsPWZ1bmN0aW9uKHQsbil7ZSgiZmF0YWwiLHQsbik7fSxlLnJlc2V0PXQsZS5zZXQ9bixlLnNldFdpdGhFbnY9ZnVuY3Rpb24oZSl7Y29uc3QgdD17fTtlLmxvZ0xldmVsJiYodC5taW5pbWFsU2V2ZXJpdHk9ZS5sb2dMZXZlbCksbigiIix0KTt9O30oc3x8KHM9e30pKSx0LkxvZ2dlcj1zO2NsYXNzIHV7Y29uc3RydWN0b3IoZSx0LG4scixvLGkpe3RoaXMuY2F0ZWdvcnk9ZSx0aGlzLm5hbWU9dCx0aGlzLnN0YXJ0VGltZT1uLHRoaXMuZW5kQ2FsbGJhY2s9cix0aGlzLnRpbWVyPW8sdGhpcy5jdHg9aTt9YXN5bmMgZW5kKCl7cmV0dXJuIHRoaXMuZW5kQ2FsbGJhY2sodGhpcyl9YXN5bmMgY2hlY2tUaW1lcigpe2lmKHZvaWQgMD09PXRoaXMuY3R4fHx2b2lkIDA9PT10aGlzLnRpbWVyKXRocm93IG5ldyBFcnJvcigiTm8gd2ViZ2wgdGltZXIgZm91bmQiKTtyZXR1cm4gdGhpcy5jdHguZW5kVGltZXIoKSx0aGlzLmN0eC53YWl0Rm9yUXVlcnlBbmRHZXRUaW1lKHRoaXMudGltZXIpfX1jbGFzcyBse2NvbnN0cnVjdG9yKGUsdCxuLHIpe3RoaXMuY2F0ZWdvcnk9ZSx0aGlzLm5hbWU9dCx0aGlzLnN0YXJ0VGltZT1uLHRoaXMuZW5kVGltZT1yO319dC5Qcm9maWxlcj1jbGFzc3tzdGF0aWMgY3JlYXRlKGUpe3JldHVybiB2b2lkIDA9PT1lP25ldyB0aGlzOm5ldyB0aGlzKGUubWF4TnVtYmVyRXZlbnRzLGUuZmx1c2hCYXRjaFNpemUsZS5mbHVzaEludGVydmFsSW5NaWxsaXNlY29uZHMpfWNvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLl9zdGFydGVkPSExLHRoaXMuX2ZsdXNoUG9pbnRlcj0wLHRoaXMuX3N0YXJ0ZWQ9ITEsdGhpcy5fbWF4TnVtYmVyRXZlbnRzPXZvaWQgMD09PWU/MWU0OmUsdGhpcy5fZmx1c2hCYXRjaFNpemU9dm9pZCAwPT09dD8xMDp0LHRoaXMuX2ZsdXNoSW50ZXJ2YWxJbk1pbGxpc2Vjb25kcz12b2lkIDA9PT1uPzVlMzpuO31zdGFydCgpe3RoaXMuX3N0YXJ0ZWQ9ITAsdGhpcy5fdGltaW5nRXZlbnRzPVtdLHRoaXMuX2ZsdXNoVGltZT0oMCwgdC5ub3cpKCksdGhpcy5fZmx1c2hQb2ludGVyPTA7fXN0b3AoKXtmb3IodGhpcy5fc3RhcnRlZD0hMTt0aGlzLl9mbHVzaFBvaW50ZXI8dGhpcy5fdGltaW5nRXZlbnRzLmxlbmd0aDt0aGlzLl9mbHVzaFBvaW50ZXIrKyl0aGlzLmxvZ09uZUV2ZW50KHRoaXMuX3RpbWluZ0V2ZW50c1t0aGlzLl9mbHVzaFBvaW50ZXJdKTt9ZXZlbnQoZSx0LG4scil7Y29uc3Qgbz10aGlzLl9zdGFydGVkP3RoaXMuYmVnaW4oZSx0LHIpOnZvaWQgMDtsZXQgaT0hMTtjb25zdCBzPW4oKTtpZihzJiYiZnVuY3Rpb24iPT10eXBlb2Ygcy50aGVuKXJldHVybiBpPSEwLG5ldyBQcm9taXNlKCgoZSx0KT0+e3MudGhlbigoYXN5bmMgdD0+e28mJmF3YWl0IG8uZW5kKCksZSh0KTt9KSwoYXN5bmMgZT0+e28mJmF3YWl0IG8uZW5kKCksdChlKTt9KSk7fSkpO2lmKCFpJiZvKXtjb25zdCBlPW8uZW5kKCk7aWYoZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbilyZXR1cm4gbmV3IFByb21pc2UoKCh0LG4pPT57ZS50aGVuKCgoKT0+e3Qocyk7fSksKGU9PntuKGUpO30pKTt9KSl9cmV0dXJuIHN9YmVnaW4oZSxuLHIpe2lmKCF0aGlzLl9zdGFydGVkKXRocm93IG5ldyBFcnJvcigicHJvZmlsZXIgaXMgbm90IHN0YXJ0ZWQgeWV0Iik7aWYodm9pZCAwPT09cil7Y29uc3Qgcj0oMCwgdC5ub3cpKCk7cmV0dXJuIHRoaXMuZmx1c2gociksbmV3IHUoZSxuLHIsKGU9PnRoaXMuZW5kU3luYyhlKSkpfXtjb25zdCB0PXIuYmVnaW5UaW1lcigpO3JldHVybiBuZXcgdShlLG4sMCwoYXN5bmMgZT0+dGhpcy5lbmQoZSkpLHQscil9fWFzeW5jIGVuZChlKXtjb25zdCB0PWF3YWl0IGUuY2hlY2tUaW1lcigpO3RoaXMuX3RpbWluZ0V2ZW50cy5sZW5ndGg8dGhpcy5fbWF4TnVtYmVyRXZlbnRzJiYodGhpcy5fdGltaW5nRXZlbnRzLnB1c2gobmV3IGwoZS5jYXRlZ29yeSxlLm5hbWUsZS5zdGFydFRpbWUsdCkpLHRoaXMuZmx1c2godCkpO31lbmRTeW5jKGUpe2NvbnN0IG49KDAsIHQubm93KSgpO3RoaXMuX3RpbWluZ0V2ZW50cy5sZW5ndGg8dGhpcy5fbWF4TnVtYmVyRXZlbnRzJiYodGhpcy5fdGltaW5nRXZlbnRzLnB1c2gobmV3IGwoZS5jYXRlZ29yeSxlLm5hbWUsZS5zdGFydFRpbWUsbikpLHRoaXMuZmx1c2gobikpO31sb2dPbmVFdmVudChlKXt0LkxvZ2dlci52ZXJib3NlKGBQcm9maWxlci4ke2UuY2F0ZWdvcnl9YCxgJHsoZS5lbmRUaW1lLWUuc3RhcnRUaW1lKS50b0ZpeGVkKDIpfW1zIG9uIGV2ZW50ICcke2UubmFtZX0nIGF0ICR7ZS5lbmRUaW1lLnRvRml4ZWQoMil9YCk7fWZsdXNoKGUpe2lmKHRoaXMuX3RpbWluZ0V2ZW50cy5sZW5ndGgtdGhpcy5fZmx1c2hQb2ludGVyPj10aGlzLl9mbHVzaEJhdGNoU2l6ZXx8ZS10aGlzLl9mbHVzaFRpbWU+PXRoaXMuX2ZsdXNoSW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyl7Zm9yKGNvbnN0IGU9dGhpcy5fZmx1c2hQb2ludGVyO3RoaXMuX2ZsdXNoUG9pbnRlcjxlK3RoaXMuX2ZsdXNoQmF0Y2hTaXplJiZ0aGlzLl9mbHVzaFBvaW50ZXI8dGhpcy5fdGltaW5nRXZlbnRzLmxlbmd0aDt0aGlzLl9mbHVzaFBvaW50ZXIrKyl0aGlzLmxvZ09uZUV2ZW50KHRoaXMuX3RpbWluZ0V2ZW50c1t0aGlzLl9mbHVzaFBvaW50ZXJdKTt0aGlzLl9mbHVzaFRpbWU9KDAsIHQubm93KSgpO319Z2V0IHN0YXJ0ZWQoKXtyZXR1cm4gdGhpcy5fc3RhcnRlZH19LHQubm93PSJ1bmRlZmluZWQiIT10eXBlb2YgcGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz8oKT0+cGVyZm9ybWFuY2Uubm93KCk6RGF0ZS5ub3c7fSwxNzQ1OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Nb2RlbD12b2lkIDA7Y29uc3Qgcj1uKDU2ODYpLG89big0NjYyKSxpPW4oNTEyNykscz1uKDI0NDYpLGE9big3MjczKTt2YXIgdT1pLm9ubnhydW50aW1lLmV4cGVyaW1lbnRhbC5mYnM7dC5Nb2RlbD1jbGFzc3tjb25zdHJ1Y3Rvcigpe31sb2FkKGUsdCxuKXtpZighbil0cnl7cmV0dXJuIHZvaWQgdGhpcy5sb2FkRnJvbU9ubnhGb3JtYXQoZSx0KX1jYXRjaChlKXtpZih2b2lkIDAhPT1uKXRocm93IGV9dGhpcy5sb2FkRnJvbU9ydEZvcm1hdChlLHQpO31sb2FkRnJvbU9ubnhGb3JtYXQoZSx0KXtjb25zdCBuPXMub25ueC5Nb2RlbFByb3RvLmRlY29kZShlKTtpZihhLkxvbmdVdGlsLmxvbmdUb051bWJlcihuLmlyVmVyc2lvbik8Myl0aHJvdyBuZXcgRXJyb3IoIm9ubHkgc3VwcG9ydCBPTk5YIG1vZGVsIHdpdGggSVJfVkVSU0lPTj49MyIpO3RoaXMuX29wc2V0cz1uLm9wc2V0SW1wb3J0Lm1hcCgoZT0+KHtkb21haW46ZS5kb21haW4sdmVyc2lvbjphLkxvbmdVdGlsLmxvbmdUb051bWJlcihlLnZlcnNpb24pfSkpKSx0aGlzLl9ncmFwaD1vLkdyYXBoLmZyb20obi5ncmFwaCx0KTt9bG9hZEZyb21PcnRGb3JtYXQoZSx0KXtjb25zdCBuPW5ldyByLmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIoZSksaT11LkluZmVyZW5jZVNlc3Npb24uZ2V0Um9vdEFzSW5mZXJlbmNlU2Vzc2lvbihuKS5tb2RlbCgpO2lmKGEuTG9uZ1V0aWwubG9uZ1RvTnVtYmVyKGkuaXJWZXJzaW9uKCkpPDMpdGhyb3cgbmV3IEVycm9yKCJvbmx5IHN1cHBvcnQgT05OWCBtb2RlbCB3aXRoIElSX1ZFUlNJT04+PTMiKTt0aGlzLl9vcHNldHM9W107Zm9yKGxldCBlPTA7ZTxpLm9wc2V0SW1wb3J0TGVuZ3RoKCk7ZSsrKXtjb25zdCB0PWkub3BzZXRJbXBvcnQoZSk7dGhpcy5fb3BzZXRzLnB1c2goe2RvbWFpbjpudWxsPT10P3ZvaWQgMDp0LmRvbWFpbigpLHZlcnNpb246YS5Mb25nVXRpbC5sb25nVG9OdW1iZXIodC52ZXJzaW9uKCkpfSk7fXRoaXMuX2dyYXBoPW8uR3JhcGguZnJvbShpLmdyYXBoKCksdCk7fWdldCBncmFwaCgpe3JldHVybiB0aGlzLl9ncmFwaH1nZXQgb3BzZXRzKCl7cmV0dXJuIHRoaXMuX29wc2V0c319O30sNjE0NTooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkZMT0FUX1RZUEVTPXQuSU5UX1RZUEVTPXQuTlVNQkVSX1RZUEVTPXZvaWQgMCx0Lk5VTUJFUl9UWVBFUz1bImZsb2F0MzIiLCJmbG9hdDY0IiwiaW50MzIiLCJpbnQxNiIsImludDgiLCJ1aW50MTYiLCJ1aW50MzIiLCJ1aW50OCJdLHQuSU5UX1RZUEVTPVsiaW50MzIiLCJpbnQxNiIsImludDgiLCJ1aW50MTYiLCJ1aW50MzIiLCJ1aW50OCJdLHQuRkxPQVRfVFlQRVM9WyJmbG9hdDMyIiwiZmxvYXQ2NCJdO30sNTg4MTooZSx0KT0+e2Z1bmN0aW9uIG4oZSx0KXtpZih0LmVuZHNXaXRoKCIrIikpe2NvbnN0IG49TnVtYmVyLnBhcnNlSW50KHQuc3Vic3RyaW5nKDAsdC5sZW5ndGgtMSksMTApO3JldHVybiAhaXNOYU4obikmJm48PWV9aWYoMj09PXQuc3BsaXQoIi0iKS5sZW5ndGgpe2NvbnN0IG49dC5zcGxpdCgiLSIpLHI9TnVtYmVyLnBhcnNlSW50KG5bMF0sMTApLG89TnVtYmVyLnBhcnNlSW50KG5bMV0sMTApO3JldHVybiAhaXNOYU4ocikmJiFpc05hTihvKSYmcjw9ZSYmZTw9b31yZXR1cm4gTnVtYmVyLnBhcnNlSW50KHQsMTApPT09ZX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZXNvbHZlT3BlcmF0b3I9dm9pZCAwLHQucmVzb2x2ZU9wZXJhdG9yPWZ1bmN0aW9uKGUsdCxyKXtmb3IoY29uc3QgbyBvZiByKXtjb25zdCByPW9bMF0saT1vWzFdLHM9b1syXSxhPW9bM10sdT1vWzRdO2lmKGUub3BUeXBlPT09cilmb3IoY29uc3QgZSBvZiB0KWlmKChlLmRvbWFpbj09PWl8fCJhaS5vbm54Ij09PWUuZG9tYWluJiYiIj09PWkpJiZuKGUudmVyc2lvbixzKSlyZXR1cm4ge29wSW1wbDphLG9wSW5pdDp1fX10aHJvdyBuZXcgVHlwZUVycm9yKGBjYW5ub3QgcmVzb2x2ZSBvcGVyYXRvciAnJHtlLm9wVHlwZX0nIHdpdGggb3BzZXRzOiAke3QubWFwKChlPT5gJHtlLmRvbWFpbnx8ImFpLm9ubngifSB2JHtlLnZlcnNpb259YCkpLmpvaW4oIiwgIil9YCl9O30sNTEyNzooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQub25ueHJ1bnRpbWU9dm9pZCAwO2NvbnN0IHI9big1Njg2KTt2YXIgbyxpOygoZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpe2VbZS5VTkRFRklORUQ9MF09IlVOREVGSU5FRCIsZVtlLkZMT0FUPTFdPSJGTE9BVCIsZVtlLklOVD0yXT0iSU5UIixlW2UuU1RSSU5HPTNdPSJTVFJJTkciLGVbZS5URU5TT1I9NF09IlRFTlNPUiIsZVtlLkdSQVBIPTVdPSJHUkFQSCIsZVtlLkZMT0FUUz02XT0iRkxPQVRTIixlW2UuSU5UUz03XT0iSU5UUyIsZVtlLlNUUklOR1M9OF09IlNUUklOR1MiLGVbZS5URU5TT1JTPTldPSJURU5TT1JTIixlW2UuR1JBUEhTPTEwXT0iR1JBUEhTIixlW2UuU1BBUlNFX1RFTlNPUj0xMV09IlNQQVJTRV9URU5TT1IiLGVbZS5TUEFSU0VfVEVOU09SUz0xMl09IlNQQVJTRV9URU5TT1JTIjt9KGUuQXR0cmlidXRlVHlwZXx8KGUuQXR0cmlidXRlVHlwZT17fSkpO30pKSgoaT0obz10Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLmV4cGVyaW1lbnRhbHx8KG8uZXhwZXJpbWVudGFsPXt9KSkuZmJzfHwoaS5mYnM9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXtlW2UuVU5LTk9XTj0wXT0iVU5LTk9XTiIsZVtlLlZBTFVFPTFdPSJWQUxVRSIsZVtlLlBBUkFNPTJdPSJQQVJBTSI7fShlLkRpbWVuc2lvblZhbHVlVHlwZXx8KGUuRGltZW5zaW9uVmFsdWVUeXBlPXt9KSk7fShlLmZic3x8KGUuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpe2VbZS5VTkRFRklORUQ9MF09IlVOREVGSU5FRCIsZVtlLkZMT0FUPTFdPSJGTE9BVCIsZVtlLlVJTlQ4PTJdPSJVSU5UOCIsZVtlLklOVDg9M109IklOVDgiLGVbZS5VSU5UMTY9NF09IlVJTlQxNiIsZVtlLklOVDE2PTVdPSJJTlQxNiIsZVtlLklOVDMyPTZdPSJJTlQzMiIsZVtlLklOVDY0PTddPSJJTlQ2NCIsZVtlLlNUUklORz04XT0iU1RSSU5HIixlW2UuQk9PTD05XT0iQk9PTCIsZVtlLkZMT0FUMTY9MTBdPSJGTE9BVDE2IixlW2UuRE9VQkxFPTExXT0iRE9VQkxFIixlW2UuVUlOVDMyPTEyXT0iVUlOVDMyIixlW2UuVUlOVDY0PTEzXT0iVUlOVDY0IixlW2UuQ09NUExFWDY0PTE0XT0iQ09NUExFWDY0IixlW2UuQ09NUExFWDEyOD0xNV09IkNPTVBMRVgxMjgiLGVbZS5CRkxPQVQxNj0xNl09IkJGTE9BVDE2IixlW2UuRkxPQVQ4RTRNM0ZOPTE3XT0iRkxPQVQ4RTRNM0ZOIixlW2UuRkxPQVQ4RTRNM0ZOVVo9MThdPSJGTE9BVDhFNE0zRk5VWiIsZVtlLkZMT0FUOEU1TTI9MTldPSJGTE9BVDhFNU0yIixlW2UuRkxPQVQ4RTVNMkZOVVo9MjBdPSJGTE9BVDhFNU0yRk5VWiI7fShlLlRlbnNvckRhdGFUeXBlfHwoZS5UZW5zb3JEYXRhVHlwZT17fSkpO30oZS5mYnN8fChlLmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXtlW2UuUHJpbWl0aXZlPTBdPSJQcmltaXRpdmUiLGVbZS5GdXNlZD0xXT0iRnVzZWQiO30oZS5Ob2RlVHlwZXx8KGUuTm9kZVR5cGU9e30pKTt9KGUuZmJzfHwoZS5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7ZVtlLk5PTkU9MF09Ik5PTkUiLGVbZS50ZW5zb3JfdHlwZT0xXT0idGVuc29yX3R5cGUiLGVbZS5zZXF1ZW5jZV90eXBlPTJdPSJzZXF1ZW5jZV90eXBlIixlW2UubWFwX3R5cGU9M109Im1hcF90eXBlIjt9KGUuVHlwZUluZm9WYWx1ZXx8KGUuVHlwZUluZm9WYWx1ZT17fSkpO30oZS5mYnN8fChlLmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc1NoYXBlKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNTaGFwZShlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9ZGltKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gcj8obnx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5EaW1lbnNpb24pLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSs0KnQpLHRoaXMuYmIpOm51bGx9ZGltTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXN0YXRpYyBzdGFydFNoYXBlKGUpe2Uuc3RhcnRPYmplY3QoMSk7fXN0YXRpYyBhZGREaW0oZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGNyZWF0ZURpbVZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnREaW1WZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGVuZFNoYXBlKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVTaGFwZShlLHQpe3JldHVybiBuLnN0YXJ0U2hhcGUoZSksbi5hZGREaW0oZSx0KSxuLmVuZFNoYXBlKGUpfX10LlNoYXBlPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzRGltZW5zaW9uKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNEaW1lbnNpb24oZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXZhbHVlKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuRGltZW5zaW9uVmFsdWUpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrbiksdGhpcy5iYik6bnVsbH1kZW5vdGF0aW9uKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9c3RhdGljIHN0YXJ0RGltZW5zaW9uKGUpe2Uuc3RhcnRPYmplY3QoMik7fXN0YXRpYyBhZGRWYWx1ZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkRGVub3RhdGlvbihlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgZW5kRGltZW5zaW9uKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVEaW1lbnNpb24oZSx0LHIpe3JldHVybiBuLnN0YXJ0RGltZW5zaW9uKGUpLG4uYWRkVmFsdWUoZSx0KSxuLmFkZERlbm90YXRpb24oZSxyKSxuLmVuZERpbWVuc2lvbihlKX19dC5EaW1lbnNpb249bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNEaW1lbnNpb25WYWx1ZShlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRGltZW5zaW9uVmFsdWUoZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfWRpbVR5cGUoKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIucmVhZEludDgodGhpcy5iYl9wb3MrdCk6ZS5leHBlcmltZW50YWwuZmJzLkRpbWVuc2lvblZhbHVlVHlwZS5VTktOT1dOfWRpbVZhbHVlKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gZT90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcytlKTp0aGlzLmJiLmNyZWF0ZUxvbmcoMCwwKX1kaW1QYXJhbShlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXN0YXRpYyBzdGFydERpbWVuc2lvblZhbHVlKGUpe2Uuc3RhcnRPYmplY3QoMyk7fXN0YXRpYyBhZGREaW1UeXBlKHQsbil7dC5hZGRGaWVsZEludDgoMCxuLGUuZXhwZXJpbWVudGFsLmZicy5EaW1lbnNpb25WYWx1ZVR5cGUuVU5LTk9XTik7fXN0YXRpYyBhZGREaW1WYWx1ZShlLHQpe2UuYWRkRmllbGRJbnQ2NCgxLHQsZS5jcmVhdGVMb25nKDAsMCkpO31zdGF0aWMgYWRkRGltUGFyYW0oZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDIsdCwwKTt9c3RhdGljIGVuZERpbWVuc2lvblZhbHVlKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVEaW1lbnNpb25WYWx1ZShlLHQscixvKXtyZXR1cm4gbi5zdGFydERpbWVuc2lvblZhbHVlKGUpLG4uYWRkRGltVHlwZShlLHQpLG4uYWRkRGltVmFsdWUoZSxyKSxuLmFkZERpbVBhcmFtKGUsbyksbi5lbmREaW1lbnNpb25WYWx1ZShlKX19dC5EaW1lbnNpb25WYWx1ZT1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc1RlbnNvclR5cGVBbmRTaGFwZShlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVGVuc29yVHlwZUFuZFNoYXBlKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1lbGVtVHlwZSgpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHQ/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MrdCk6ZS5leHBlcmltZW50YWwuZmJzLlRlbnNvckRhdGFUeXBlLlVOREVGSU5FRH1zaGFwZSh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlNoYXBlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0VGVuc29yVHlwZUFuZFNoYXBlKGUpe2Uuc3RhcnRPYmplY3QoMik7fXN0YXRpYyBhZGRFbGVtVHlwZSh0LG4pe3QuYWRkRmllbGRJbnQzMigwLG4sZS5leHBlcmltZW50YWwuZmJzLlRlbnNvckRhdGFUeXBlLlVOREVGSU5FRCk7fXN0YXRpYyBhZGRTaGFwZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgZW5kVGVuc29yVHlwZUFuZFNoYXBlKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVUZW5zb3JUeXBlQW5kU2hhcGUoZSx0LHIpe3JldHVybiBuLnN0YXJ0VGVuc29yVHlwZUFuZFNoYXBlKGUpLG4uYWRkRWxlbVR5cGUoZSx0KSxuLmFkZFNoYXBlKGUsciksbi5lbmRUZW5zb3JUeXBlQW5kU2hhcGUoZSl9fXQuVGVuc29yVHlwZUFuZFNoYXBlPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzTWFwVHlwZShlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzTWFwVHlwZShlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9a2V5VHlwZSgpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHQ/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MrdCk6ZS5leHBlcmltZW50YWwuZmJzLlRlbnNvckRhdGFUeXBlLlVOREVGSU5FRH12YWx1ZVR5cGUodCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gbj8odHx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5UeXBlSW5mbykuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfXN0YXRpYyBzdGFydE1hcFR5cGUoZSl7ZS5zdGFydE9iamVjdCgyKTt9c3RhdGljIGFkZEtleVR5cGUodCxuKXt0LmFkZEZpZWxkSW50MzIoMCxuLGUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3JEYXRhVHlwZS5VTkRFRklORUQpO31zdGF0aWMgYWRkVmFsdWVUeXBlKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBlbmRNYXBUeXBlKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVNYXBUeXBlKGUsdCxyKXtyZXR1cm4gbi5zdGFydE1hcFR5cGUoZSksbi5hZGRLZXlUeXBlKGUsdCksbi5hZGRWYWx1ZVR5cGUoZSxyKSxuLmVuZE1hcFR5cGUoZSl9fXQuTWFwVHlwZT1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc1NlcXVlbmNlVHlwZShlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU2VxdWVuY2VUeXBlKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1lbGVtVHlwZSh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlR5cGVJbmZvKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0U2VxdWVuY2VUeXBlKGUpe2Uuc3RhcnRPYmplY3QoMSk7fXN0YXRpYyBhZGRFbGVtVHlwZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgZW5kU2VxdWVuY2VUeXBlKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVTZXF1ZW5jZVR5cGUoZSx0KXtyZXR1cm4gbi5zdGFydFNlcXVlbmNlVHlwZShlKSxuLmFkZEVsZW1UeXBlKGUsdCksbi5lbmRTZXF1ZW5jZVR5cGUoZSl9fXQuU2VxdWVuY2VUeXBlPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXsoZS5mYnN8fChlLmZicz17fSkpLkVkZ2VFbmQ9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9bm9kZUluZGV4KCl7cmV0dXJuIHRoaXMuYmIucmVhZFVpbnQzMih0aGlzLmJiX3Bvcyl9c3JjQXJnSW5kZXgoKXtyZXR1cm4gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MrNCl9ZHN0QXJnSW5kZXgoKXtyZXR1cm4gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MrOCl9c3RhdGljIGNyZWF0ZUVkZ2VFbmQoZSx0LG4scil7cmV0dXJuIGUucHJlcCg0LDEyKSxlLndyaXRlSW50MzIociksZS53cml0ZUludDMyKG4pLGUud3JpdGVJbnQzMih0KSxlLm9mZnNldCgpfX07fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzTm9kZUVkZ2UoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc05vZGVFZGdlKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1ub2RlSW5kZXgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBlP3RoaXMuYmIucmVhZFVpbnQzMih0aGlzLmJiX3BvcytlKTowfWlucHV0RWRnZXModCxuKXtsZXQgcj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiByPyhufHxuZXcgZS5leHBlcmltZW50YWwuZmJzLkVkZ2VFbmQpLl9faW5pdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3IpKzEyKnQsdGhpcy5iYik6bnVsbH1pbnB1dEVkZ2VzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfW91dHB1dEVkZ2VzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gcj8obnx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5FZGdlRW5kKS5fX2luaXQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSsxMip0LHRoaXMuYmIpOm51bGx9b3V0cHV0RWRnZXNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9c3RhdGljIHN0YXJ0Tm9kZUVkZ2UoZSl7ZS5zdGFydE9iamVjdCgzKTt9c3RhdGljIGFkZE5vZGVJbmRleChlLHQpe2UuYWRkRmllbGRJbnQzMigwLHQsMCk7fXN0YXRpYyBhZGRJbnB1dEVkZ2VzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBzdGFydElucHV0RWRnZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDEyLHQsNCk7fXN0YXRpYyBhZGRPdXRwdXRFZGdlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMix0LDApO31zdGF0aWMgc3RhcnRPdXRwdXRFZGdlc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoMTIsdCw0KTt9c3RhdGljIGVuZE5vZGVFZGdlKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVOb2RlRWRnZShlLHQscixvKXtyZXR1cm4gbi5zdGFydE5vZGVFZGdlKGUpLG4uYWRkTm9kZUluZGV4KGUsdCksbi5hZGRJbnB1dEVkZ2VzKGUsciksbi5hZGRPdXRwdXRFZGdlcyhlLG8pLG4uZW5kTm9kZUVkZ2UoZSl9fXQuTm9kZUVkZ2U9bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNOb2RlKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNOb2RlKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1uYW1lKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9ZG9jU3RyaW5nKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9ZG9tYWluKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9c2luY2VWZXJzaW9uKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMCk7cmV0dXJuIGU/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MrZSk6MH1pbmRleCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTIpO3JldHVybiBlP3RoaXMuYmIucmVhZFVpbnQzMih0aGlzLmJiX3BvcytlKTowfW9wVHlwZShlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH10eXBlKCl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNik7cmV0dXJuIHQ/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MrdCk6ZS5leHBlcmltZW50YWwuZmJzLk5vZGVUeXBlLlByaW1pdGl2ZX1leGVjdXRpb25Qcm92aWRlclR5cGUoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxOCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9aW5wdXRzKGUsdCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMCk7cmV0dXJuIG4/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK24pKzQqZSx0KTpudWxsfWlucHV0c0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjApO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9b3V0cHV0cyhlLHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjIpO3JldHVybiBuP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytuKSs0KmUsdCk6bnVsbH1vdXRwdXRzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1hdHRyaWJ1dGVzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNCk7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuQXR0cmlidXRlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrcikrNCp0KSx0aGlzLmJiKTpudWxsfWF0dHJpYnV0ZXNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI0KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfWlucHV0QXJnQ291bnRzKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjYpO3JldHVybiB0P3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrdCkrNCplKTowfWlucHV0QXJnQ291bnRzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1pbnB1dEFyZ0NvdW50c0FycmF5KCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNik7cmV0dXJuIGU/bmV3IEludDMyQXJyYXkodGhpcy5iYi5ieXRlcygpLmJ1ZmZlcix0aGlzLmJiLmJ5dGVzKCkuYnl0ZU9mZnNldCt0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2UpLHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpKTpudWxsfWltcGxpY2l0SW5wdXRzKGUsdCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyOCk7cmV0dXJuIG4/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK24pKzQqZSx0KTpudWxsfWltcGxpY2l0SW5wdXRzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyOCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1zdGF0aWMgc3RhcnROb2RlKGUpe2Uuc3RhcnRPYmplY3QoMTMpO31zdGF0aWMgYWRkTmFtZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkRG9jU3RyaW5nKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBhZGREb21haW4oZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDIsdCwwKTt9c3RhdGljIGFkZFNpbmNlVmVyc2lvbihlLHQpe2UuYWRkRmllbGRJbnQzMigzLHQsMCk7fXN0YXRpYyBhZGRJbmRleChlLHQpe2UuYWRkRmllbGRJbnQzMig0LHQsMCk7fXN0YXRpYyBhZGRPcFR5cGUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDUsdCwwKTt9c3RhdGljIGFkZFR5cGUodCxuKXt0LmFkZEZpZWxkSW50MzIoNixuLGUuZXhwZXJpbWVudGFsLmZicy5Ob2RlVHlwZS5QcmltaXRpdmUpO31zdGF0aWMgYWRkRXhlY3V0aW9uUHJvdmlkZXJUeXBlKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg3LHQsMCk7fXN0YXRpYyBhZGRJbnB1dHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDgsdCwwKTt9c3RhdGljIGNyZWF0ZUlucHV0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRJbnB1dHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZE91dHB1dHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDksdCwwKTt9c3RhdGljIGNyZWF0ZU91dHB1dHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0T3V0cHV0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkQXR0cmlidXRlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMTAsdCwwKTt9c3RhdGljIGNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0QXR0cmlidXRlc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkSW5wdXRBcmdDb3VudHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDExLHQsMCk7fXN0YXRpYyBjcmVhdGVJbnB1dEFyZ0NvdW50c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZEludDMyKHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydElucHV0QXJnQ291bnRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGRJbXBsaWNpdElucHV0cyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMTIsdCwwKTt9c3RhdGljIGNyZWF0ZUltcGxpY2l0SW5wdXRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEltcGxpY2l0SW5wdXRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBlbmROb2RlKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVOb2RlKGUsdCxyLG8saSxzLGEsdSxsLGMscCxkLGYsaCl7cmV0dXJuIG4uc3RhcnROb2RlKGUpLG4uYWRkTmFtZShlLHQpLG4uYWRkRG9jU3RyaW5nKGUsciksbi5hZGREb21haW4oZSxvKSxuLmFkZFNpbmNlVmVyc2lvbihlLGkpLG4uYWRkSW5kZXgoZSxzKSxuLmFkZE9wVHlwZShlLGEpLG4uYWRkVHlwZShlLHUpLG4uYWRkRXhlY3V0aW9uUHJvdmlkZXJUeXBlKGUsbCksbi5hZGRJbnB1dHMoZSxjKSxuLmFkZE91dHB1dHMoZSxwKSxuLmFkZEF0dHJpYnV0ZXMoZSxkKSxuLmFkZElucHV0QXJnQ291bnRzKGUsZiksbi5hZGRJbXBsaWNpdElucHV0cyhlLGgpLG4uZW5kTm9kZShlKX19dC5Ob2RlPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzVmFsdWVJbmZvKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNWYWx1ZUluZm8oZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfW5hbWUoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1kb2NTdHJpbmcoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH10eXBlKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuVHlwZUluZm8pLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrbiksdGhpcy5iYik6bnVsbH1zdGF0aWMgc3RhcnRWYWx1ZUluZm8oZSl7ZS5zdGFydE9iamVjdCgzKTt9c3RhdGljIGFkZE5hbWUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGFkZERvY1N0cmluZyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgYWRkVHlwZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMix0LDApO31zdGF0aWMgZW5kVmFsdWVJbmZvKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVWYWx1ZUluZm8oZSx0LHIsbyl7cmV0dXJuIG4uc3RhcnRWYWx1ZUluZm8oZSksbi5hZGROYW1lKGUsdCksbi5hZGREb2NTdHJpbmcoZSxyKSxuLmFkZFR5cGUoZSxvKSxuLmVuZFZhbHVlSW5mbyhlKX19dC5WYWx1ZUluZm89bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNUeXBlSW5mbyhlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVHlwZUluZm8oZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfWRlbm90YXRpb24oZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH12YWx1ZVR5cGUoKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB0P3RoaXMuYmIucmVhZFVpbnQ4KHRoaXMuYmJfcG9zK3QpOmUuZXhwZXJpbWVudGFsLmZicy5UeXBlSW5mb1ZhbHVlLk5PTkV9dmFsdWUoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gdD90aGlzLmJiLl9fdW5pb24oZSx0aGlzLmJiX3Bvcyt0KTpudWxsfXN0YXRpYyBzdGFydFR5cGVJbmZvKGUpe2Uuc3RhcnRPYmplY3QoMyk7fXN0YXRpYyBhZGREZW5vdGF0aW9uKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgwLHQsMCk7fXN0YXRpYyBhZGRWYWx1ZVR5cGUodCxuKXt0LmFkZEZpZWxkSW50OCgxLG4sZS5leHBlcmltZW50YWwuZmJzLlR5cGVJbmZvVmFsdWUuTk9ORSk7fXN0YXRpYyBhZGRWYWx1ZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMix0LDApO31zdGF0aWMgZW5kVHlwZUluZm8oZSl7cmV0dXJuIGUuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZVR5cGVJbmZvKGUsdCxyLG8pe3JldHVybiBuLnN0YXJ0VHlwZUluZm8oZSksbi5hZGREZW5vdGF0aW9uKGUsdCksbi5hZGRWYWx1ZVR5cGUoZSxyKSxuLmFkZFZhbHVlKGUsbyksbi5lbmRUeXBlSW5mbyhlKX19dC5UeXBlSW5mbz1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpe2NsYXNzIHR7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc09wZXJhdG9yU2V0SWQoZSxuKXtyZXR1cm4gKG58fG5ldyB0KS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc09wZXJhdG9yU2V0SWQoZSxuKXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLChufHxuZXcgdCkuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfWRvbWFpbihlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXZlcnNpb24oKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBlP3RoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zK2UpOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfXN0YXRpYyBzdGFydE9wZXJhdG9yU2V0SWQoZSl7ZS5zdGFydE9iamVjdCgyKTt9c3RhdGljIGFkZERvbWFpbihlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkVmVyc2lvbihlLHQpe2UuYWRkRmllbGRJbnQ2NCgxLHQsZS5jcmVhdGVMb25nKDAsMCkpO31zdGF0aWMgZW5kT3BlcmF0b3JTZXRJZChlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlT3BlcmF0b3JTZXRJZChlLG4scil7cmV0dXJuIHQuc3RhcnRPcGVyYXRvclNldElkKGUpLHQuYWRkRG9tYWluKGUsbiksdC5hZGRWZXJzaW9uKGUsciksdC5lbmRPcGVyYXRvclNldElkKGUpfX1lLk9wZXJhdG9yU2V0SWQ9dDt9KGUuZmJzfHwoZS5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNUZW5zb3IoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1RlbnNvcihlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9bmFtZShlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfWRvY1N0cmluZyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfWRpbXMoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gdD90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3QpKzgqZSk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9ZGltc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1kYXRhVHlwZSgpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTApO3JldHVybiB0P3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zK3QpOmUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3JEYXRhVHlwZS5VTkRFRklORUR9cmF3RGF0YShlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gdD90aGlzLmJiLnJlYWRVaW50OCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3QpK2UpOjB9cmF3RGF0YUxlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTIpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9cmF3RGF0YUFycmF5KCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIGU/bmV3IFVpbnQ4QXJyYXkodGhpcy5iYi5ieXRlcygpLmJ1ZmZlcix0aGlzLmJiLmJ5dGVzKCkuYnl0ZU9mZnNldCt0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2UpLHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpKTpudWxsfXN0cmluZ0RhdGEoZSx0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gbj90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbikrNCplLHQpOm51bGx9c3RyaW5nRGF0YUxlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTQpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9c3RhdGljIHN0YXJ0VGVuc29yKGUpe2Uuc3RhcnRPYmplY3QoNik7fXN0YXRpYyBhZGROYW1lKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgwLHQsMCk7fXN0YXRpYyBhZGREb2NTdHJpbmcoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGFkZERpbXMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDIsdCwwKTt9c3RhdGljIGNyZWF0ZURpbXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDgsdC5sZW5ndGgsOCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRJbnQ2NCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnREaW1zVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig4LHQsOCk7fXN0YXRpYyBhZGREYXRhVHlwZSh0LG4pe3QuYWRkRmllbGRJbnQzMigzLG4sZS5leHBlcmltZW50YWwuZmJzLlRlbnNvckRhdGFUeXBlLlVOREVGSU5FRCk7fXN0YXRpYyBhZGRSYXdEYXRhKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg0LHQsMCk7fXN0YXRpYyBjcmVhdGVSYXdEYXRhVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3RvcigxLHQubGVuZ3RoLDEpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkSW50OCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRSYXdEYXRhVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3RvcigxLHQsMSk7fXN0YXRpYyBhZGRTdHJpbmdEYXRhKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg1LHQsMCk7fXN0YXRpYyBjcmVhdGVTdHJpbmdEYXRhVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydFN0cmluZ0RhdGFWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGVuZFRlbnNvcihlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlVGVuc29yKGUsdCxyLG8saSxzLGEpe3JldHVybiBuLnN0YXJ0VGVuc29yKGUpLG4uYWRkTmFtZShlLHQpLG4uYWRkRG9jU3RyaW5nKGUsciksbi5hZGREaW1zKGUsbyksbi5hZGREYXRhVHlwZShlLGkpLG4uYWRkUmF3RGF0YShlLHMpLG4uYWRkU3RyaW5nRGF0YShlLGEpLG4uZW5kVGVuc29yKGUpfX10LlRlbnNvcj1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc1NwYXJzZVRlbnNvcihlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU3BhcnNlVGVuc29yKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX12YWx1ZXModCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gbj8odHx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3IpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrbiksdGhpcy5iYik6bnVsbH1pbmRpY2VzKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9ZGltcyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiB0P3RoaXMuYmIucmVhZEludDY0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrdCkrOCplKTp0aGlzLmJiLmNyZWF0ZUxvbmcoMCwwKX1kaW1zTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXN0YXRpYyBzdGFydFNwYXJzZVRlbnNvcihlKXtlLnN0YXJ0T2JqZWN0KDMpO31zdGF0aWMgYWRkVmFsdWVzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgwLHQsMCk7fXN0YXRpYyBhZGRJbmRpY2VzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBhZGREaW1zKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgyLHQsMCk7fXN0YXRpYyBjcmVhdGVEaW1zVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig4LHQubGVuZ3RoLDgpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkSW50NjQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0RGltc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoOCx0LDgpO31zdGF0aWMgZW5kU3BhcnNlVGVuc29yKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVTcGFyc2VUZW5zb3IoZSx0LHIsbyl7cmV0dXJuIG4uc3RhcnRTcGFyc2VUZW5zb3IoZSksbi5hZGRWYWx1ZXMoZSx0KSxuLmFkZEluZGljZXMoZSxyKSxuLmFkZERpbXMoZSxvKSxuLmVuZFNwYXJzZVRlbnNvcihlKX19dC5TcGFyc2VUZW5zb3I9bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNBdHRyaWJ1dGUoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0F0dHJpYnV0ZShlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9bmFtZShlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfWRvY1N0cmluZyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXR5cGUoKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiB0P3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zK3QpOmUuZXhwZXJpbWVudGFsLmZicy5BdHRyaWJ1dGVUeXBlLlVOREVGSU5FRH1mKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMCk7cmV0dXJuIGU/dGhpcy5iYi5yZWFkRmxvYXQzMih0aGlzLmJiX3BvcytlKTowfWkoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gZT90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcytlKTp0aGlzLmJiLmNyZWF0ZUxvbmcoMCwwKX1zKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTQpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXQodCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNik7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9Zyh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE4KTtyZXR1cm4gbj8odHx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5HcmFwaCkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfWZsb2F0cyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIwKTtyZXR1cm4gdD90aGlzLmJiLnJlYWRGbG9hdDMyKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrdCkrNCplKTowfWZsb2F0c0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjApO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9ZmxvYXRzQXJyYXkoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIwKTtyZXR1cm4gZT9uZXcgRmxvYXQzMkFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsdGhpcy5iYi5ieXRlcygpLmJ5dGVPZmZzZXQrdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytlKSx0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKSk6bnVsbH1pbnRzKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjIpO3JldHVybiB0P3RoaXMuYmIucmVhZEludDY0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrdCkrOCplKTp0aGlzLmJiLmNyZWF0ZUxvbmcoMCwwKX1pbnRzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1zdHJpbmdzKGUsdCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNCk7cmV0dXJuIG4/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK24pKzQqZSx0KTpudWxsfXN0cmluZ3NMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI0KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXRlbnNvcnModCxuKXtsZXQgcj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI2KTtyZXR1cm4gcj8obnx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3IpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSs0KnQpLHRoaXMuYmIpOm51bGx9dGVuc29yc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjYpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9Z3JhcGhzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyOCk7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuR3JhcGgpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSs0KnQpLHRoaXMuYmIpOm51bGx9Z3JhcGhzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyOCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1zdGF0aWMgc3RhcnRBdHRyaWJ1dGUoZSl7ZS5zdGFydE9iamVjdCgxMyk7fXN0YXRpYyBhZGROYW1lKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgwLHQsMCk7fXN0YXRpYyBhZGREb2NTdHJpbmcoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGFkZFR5cGUodCxuKXt0LmFkZEZpZWxkSW50MzIoMixuLGUuZXhwZXJpbWVudGFsLmZicy5BdHRyaWJ1dGVUeXBlLlVOREVGSU5FRCk7fXN0YXRpYyBhZGRGKGUsdCl7ZS5hZGRGaWVsZEZsb2F0MzIoMyx0LDApO31zdGF0aWMgYWRkSShlLHQpe2UuYWRkRmllbGRJbnQ2NCg0LHQsZS5jcmVhdGVMb25nKDAsMCkpO31zdGF0aWMgYWRkUyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoNSx0LDApO31zdGF0aWMgYWRkVChlLHQpe2UuYWRkRmllbGRPZmZzZXQoNix0LDApO31zdGF0aWMgYWRkRyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoNyx0LDApO31zdGF0aWMgYWRkRmxvYXRzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg4LHQsMCk7fXN0YXRpYyBjcmVhdGVGbG9hdHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRGbG9hdDMyKHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEZsb2F0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkSW50cyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoOSx0LDApO31zdGF0aWMgY3JlYXRlSW50c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoOCx0Lmxlbmd0aCw4KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZEludDY0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEludHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDgsdCw4KTt9c3RhdGljIGFkZFN0cmluZ3MoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEwLHQsMCk7fXN0YXRpYyBjcmVhdGVTdHJpbmdzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydFN0cmluZ3NWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZFRlbnNvcnMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDExLHQsMCk7fXN0YXRpYyBjcmVhdGVUZW5zb3JzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydFRlbnNvcnNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZEdyYXBocyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMTIsdCwwKTt9c3RhdGljIGNyZWF0ZUdyYXBoc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRHcmFwaHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGVuZEF0dHJpYnV0ZShlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlQXR0cmlidXRlKGUsdCxyLG8saSxzLGEsdSxsLGMscCxkLGYsaCl7cmV0dXJuIG4uc3RhcnRBdHRyaWJ1dGUoZSksbi5hZGROYW1lKGUsdCksbi5hZGREb2NTdHJpbmcoZSxyKSxuLmFkZFR5cGUoZSxvKSxuLmFkZEYoZSxpKSxuLmFkZEkoZSxzKSxuLmFkZFMoZSxhKSxuLmFkZFQoZSx1KSxuLmFkZEcoZSxsKSxuLmFkZEZsb2F0cyhlLGMpLG4uYWRkSW50cyhlLHApLG4uYWRkU3RyaW5ncyhlLGQpLG4uYWRkVGVuc29ycyhlLGYpLG4uYWRkR3JhcGhzKGUsaCksbi5lbmRBdHRyaWJ1dGUoZSl9fXQuQXR0cmlidXRlPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzR3JhcGgoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0dyYXBoKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1pbml0aWFsaXplcnModCxuKXtsZXQgcj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiByPyhufHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlRlbnNvcikuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3IpKzQqdCksdGhpcy5iYik6bnVsbH1pbml0aWFsaXplcnNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9bm9kZUFyZ3ModCxuKXtsZXQgcj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiByPyhufHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlZhbHVlSW5mbykuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3IpKzQqdCksdGhpcy5iYik6bnVsbH1ub2RlQXJnc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1ub2Rlcyh0LG4pe2xldCByPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuTm9kZSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3IpKzQqdCksdGhpcy5iYik6bnVsbH1ub2Rlc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1tYXhOb2RlSW5kZXgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEwKTtyZXR1cm4gZT90aGlzLmJiLnJlYWRVaW50MzIodGhpcy5iYl9wb3MrZSk6MH1ub2RlRWRnZXModCxuKXtsZXQgcj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gcj8obnx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5Ob2RlRWRnZSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3IpKzQqdCksdGhpcy5iYik6bnVsbH1ub2RlRWRnZXNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfWlucHV0cyhlLHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTQpO3JldHVybiBuP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytuKSs0KmUsdCk6bnVsbH1pbnB1dHNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfW91dHB1dHMoZSx0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE2KTtyZXR1cm4gbj90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbikrNCplLHQpOm51bGx9b3V0cHV0c0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTYpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9c3BhcnNlSW5pdGlhbGl6ZXJzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxOCk7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuU3BhcnNlVGVuc29yKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrcikrNCp0KSx0aGlzLmJiKTpudWxsfXNwYXJzZUluaXRpYWxpemVyc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTgpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9c3RhdGljIHN0YXJ0R3JhcGgoZSl7ZS5zdGFydE9iamVjdCg4KTt9c3RhdGljIGFkZEluaXRpYWxpemVycyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgY3JlYXRlSW5pdGlhbGl6ZXJzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEluaXRpYWxpemVyc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkTm9kZUFyZ3MoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGNyZWF0ZU5vZGVBcmdzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydE5vZGVBcmdzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGROb2RlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMix0LDApO31zdGF0aWMgY3JlYXRlTm9kZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0Tm9kZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZE1heE5vZGVJbmRleChlLHQpe2UuYWRkRmllbGRJbnQzMigzLHQsMCk7fXN0YXRpYyBhZGROb2RlRWRnZXMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDQsdCwwKTt9c3RhdGljIGNyZWF0ZU5vZGVFZGdlc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnROb2RlRWRnZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZElucHV0cyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoNSx0LDApO31zdGF0aWMgY3JlYXRlSW5wdXRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydElucHV0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkT3V0cHV0cyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoNix0LDApO31zdGF0aWMgY3JlYXRlT3V0cHV0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRPdXRwdXRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGRTcGFyc2VJbml0aWFsaXplcnMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDcsdCwwKTt9c3RhdGljIGNyZWF0ZVNwYXJzZUluaXRpYWxpemVyc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRTcGFyc2VJbml0aWFsaXplcnNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGVuZEdyYXBoKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVHcmFwaChlLHQscixvLGkscyxhLHUsbCl7cmV0dXJuIG4uc3RhcnRHcmFwaChlKSxuLmFkZEluaXRpYWxpemVycyhlLHQpLG4uYWRkTm9kZUFyZ3MoZSxyKSxuLmFkZE5vZGVzKGUsbyksbi5hZGRNYXhOb2RlSW5kZXgoZSxpKSxuLmFkZE5vZGVFZGdlcyhlLHMpLG4uYWRkSW5wdXRzKGUsYSksbi5hZGRPdXRwdXRzKGUsdSksbi5hZGRTcGFyc2VJbml0aWFsaXplcnMoZSxsKSxuLmVuZEdyYXBoKGUpfX10LkdyYXBoPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzTW9kZWwoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc01vZGVsKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1pclZlcnNpb24oKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBlP3RoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zK2UpOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfW9wc2V0SW1wb3J0KHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gcj8obnx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5PcGVyYXRvclNldElkKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrcikrNCp0KSx0aGlzLmJiKTpudWxsfW9wc2V0SW1wb3J0TGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXByb2R1Y2VyTmFtZShlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXByb2R1Y2VyVmVyc2lvbihlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEwKTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1kb21haW4oZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9bW9kZWxWZXJzaW9uKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNCk7cmV0dXJuIGU/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MrZSk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9ZG9jU3RyaW5nKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTYpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfWdyYXBoKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTgpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLkdyYXBoKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9Z3JhcGhEb2NTdHJpbmcoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9c3RhdGljIHN0YXJ0TW9kZWwoZSl7ZS5zdGFydE9iamVjdCg5KTt9c3RhdGljIGFkZElyVmVyc2lvbihlLHQpe2UuYWRkRmllbGRJbnQ2NCgwLHQsZS5jcmVhdGVMb25nKDAsMCkpO31zdGF0aWMgYWRkT3BzZXRJbXBvcnQoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGNyZWF0ZU9wc2V0SW1wb3J0VmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydE9wc2V0SW1wb3J0VmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGRQcm9kdWNlck5hbWUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDIsdCwwKTt9c3RhdGljIGFkZFByb2R1Y2VyVmVyc2lvbihlLHQpe2UuYWRkRmllbGRPZmZzZXQoMyx0LDApO31zdGF0aWMgYWRkRG9tYWluKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg0LHQsMCk7fXN0YXRpYyBhZGRNb2RlbFZlcnNpb24oZSx0KXtlLmFkZEZpZWxkSW50NjQoNSx0LGUuY3JlYXRlTG9uZygwLDApKTt9c3RhdGljIGFkZERvY1N0cmluZyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoNix0LDApO31zdGF0aWMgYWRkR3JhcGgoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDcsdCwwKTt9c3RhdGljIGFkZEdyYXBoRG9jU3RyaW5nKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg4LHQsMCk7fXN0YXRpYyBlbmRNb2RlbChlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlTW9kZWwoZSx0LHIsbyxpLHMsYSx1LGwsYyl7cmV0dXJuIG4uc3RhcnRNb2RlbChlKSxuLmFkZElyVmVyc2lvbihlLHQpLG4uYWRkT3BzZXRJbXBvcnQoZSxyKSxuLmFkZFByb2R1Y2VyTmFtZShlLG8pLG4uYWRkUHJvZHVjZXJWZXJzaW9uKGUsaSksbi5hZGREb21haW4oZSxzKSxuLmFkZE1vZGVsVmVyc2lvbihlLGEpLG4uYWRkRG9jU3RyaW5nKGUsdSksbi5hZGRHcmFwaChlLGwpLG4uYWRkR3JhcGhEb2NTdHJpbmcoZSxjKSxuLmVuZE1vZGVsKGUpfX10Lk1vZGVsPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7Y2xhc3MgdHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzS2VybmVsQ3JlYXRlSW5mb3MoZSxuKXtyZXR1cm4gKG58fG5ldyB0KS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0tlcm5lbENyZWF0ZUluZm9zKGUsbil7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwobnx8bmV3IHQpLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1ub2RlSW5kaWNlcyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIucmVhZFVpbnQzMih0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3QpKzQqZSk6MH1ub2RlSW5kaWNlc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1ub2RlSW5kaWNlc0FycmF5KCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gZT9uZXcgVWludDMyQXJyYXkodGhpcy5iYi5ieXRlcygpLmJ1ZmZlcix0aGlzLmJiLmJ5dGVzKCkuYnl0ZU9mZnNldCt0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2UpLHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpKTpudWxsfWtlcm5lbERlZkhhc2hlcyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB0P3RoaXMuYmIucmVhZFVpbnQ2NCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3QpKzgqZSk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9a2VybmVsRGVmSGFzaGVzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXN0YXRpYyBzdGFydEtlcm5lbENyZWF0ZUluZm9zKGUpe2Uuc3RhcnRPYmplY3QoMik7fXN0YXRpYyBhZGROb2RlSW5kaWNlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgY3JlYXRlTm9kZUluZGljZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRJbnQzMih0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnROb2RlSW5kaWNlc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkS2VybmVsRGVmSGFzaGVzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBjcmVhdGVLZXJuZWxEZWZIYXNoZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDgsdC5sZW5ndGgsOCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRJbnQ2NCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRLZXJuZWxEZWZIYXNoZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDgsdCw4KTt9c3RhdGljIGVuZEtlcm5lbENyZWF0ZUluZm9zKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVLZXJuZWxDcmVhdGVJbmZvcyhlLG4scil7cmV0dXJuIHQuc3RhcnRLZXJuZWxDcmVhdGVJbmZvcyhlKSx0LmFkZE5vZGVJbmRpY2VzKGUsbiksdC5hZGRLZXJuZWxEZWZIYXNoZXMoZSxyKSx0LmVuZEtlcm5lbENyZWF0ZUluZm9zKGUpfX1lLktlcm5lbENyZWF0ZUluZm9zPXQ7fShlLmZic3x8KGUuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzU3ViR3JhcGhTZXNzaW9uU3RhdGUoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1N1YkdyYXBoU2Vzc2lvblN0YXRlKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1ncmFwaElkKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9c2Vzc2lvblN0YXRlKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuU2Vzc2lvblN0YXRlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0U3ViR3JhcGhTZXNzaW9uU3RhdGUoZSl7ZS5zdGFydE9iamVjdCgyKTt9c3RhdGljIGFkZEdyYXBoSWQoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGFkZFNlc3Npb25TdGF0ZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgZW5kU3ViR3JhcGhTZXNzaW9uU3RhdGUoZSl7bGV0IHQ9ZS5lbmRPYmplY3QoKTtyZXR1cm4gZS5yZXF1aXJlZEZpZWxkKHQsNCksdH1zdGF0aWMgY3JlYXRlU3ViR3JhcGhTZXNzaW9uU3RhdGUoZSx0LHIpe3JldHVybiBuLnN0YXJ0U3ViR3JhcGhTZXNzaW9uU3RhdGUoZSksbi5hZGRHcmFwaElkKGUsdCksbi5hZGRTZXNzaW9uU3RhdGUoZSxyKSxuLmVuZFN1YkdyYXBoU2Vzc2lvblN0YXRlKGUpfX10LlN1YkdyYXBoU2Vzc2lvblN0YXRlPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzU2Vzc2lvblN0YXRlKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNTZXNzaW9uU3RhdGUoZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfWtlcm5lbHModCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gbj8odHx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5LZXJuZWxDcmVhdGVJbmZvcykuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfXN1YkdyYXBoU2Vzc2lvblN0YXRlcyh0LG4pe2xldCByPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuU3ViR3JhcGhTZXNzaW9uU3RhdGUpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSs0KnQpLHRoaXMuYmIpOm51bGx9c3ViR3JhcGhTZXNzaW9uU3RhdGVzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXN0YXRpYyBzdGFydFNlc3Npb25TdGF0ZShlKXtlLnN0YXJ0T2JqZWN0KDIpO31zdGF0aWMgYWRkS2VybmVscyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkU3ViR3JhcGhTZXNzaW9uU3RhdGVzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBjcmVhdGVTdWJHcmFwaFNlc3Npb25TdGF0ZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0U3ViR3JhcGhTZXNzaW9uU3RhdGVzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBlbmRTZXNzaW9uU3RhdGUoZSl7cmV0dXJuIGUuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZVNlc3Npb25TdGF0ZShlLHQscil7cmV0dXJuIG4uc3RhcnRTZXNzaW9uU3RhdGUoZSksbi5hZGRLZXJuZWxzKGUsdCksbi5hZGRTdWJHcmFwaFNlc3Npb25TdGF0ZXMoZSxyKSxuLmVuZFNlc3Npb25TdGF0ZShlKX19dC5TZXNzaW9uU3RhdGU9bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNJbmZlcmVuY2VTZXNzaW9uKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNJbmZlcmVuY2VTZXNzaW9uKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgYnVmZmVySGFzSWRlbnRpZmllcihlKXtyZXR1cm4gZS5fX2hhc19pZGVudGlmaWVyKCJPUlRNIil9b3J0VmVyc2lvbihlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfW1vZGVsKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuTW9kZWwpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrbiksdGhpcy5iYik6bnVsbH1zZXNzaW9uU3RhdGUodCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gbj8odHx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5TZXNzaW9uU3RhdGUpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrbiksdGhpcy5iYik6bnVsbH1zdGF0aWMgc3RhcnRJbmZlcmVuY2VTZXNzaW9uKGUpe2Uuc3RhcnRPYmplY3QoMyk7fXN0YXRpYyBhZGRPcnRWZXJzaW9uKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgwLHQsMCk7fXN0YXRpYyBhZGRNb2RlbChlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgYWRkU2Vzc2lvblN0YXRlKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgyLHQsMCk7fXN0YXRpYyBlbmRJbmZlcmVuY2VTZXNzaW9uKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBmaW5pc2hJbmZlcmVuY2VTZXNzaW9uQnVmZmVyKGUsdCl7ZS5maW5pc2godCwiT1JUTSIpO31zdGF0aWMgZmluaXNoU2l6ZVByZWZpeGVkSW5mZXJlbmNlU2Vzc2lvbkJ1ZmZlcihlLHQpe2UuZmluaXNoKHQsIk9SVE0iLCEwKTt9c3RhdGljIGNyZWF0ZUluZmVyZW5jZVNlc3Npb24oZSx0LHIsbyl7cmV0dXJuIG4uc3RhcnRJbmZlcmVuY2VTZXNzaW9uKGUpLG4uYWRkT3J0VmVyc2lvbihlLHQpLG4uYWRkTW9kZWwoZSxyKSxuLmFkZFNlc3Npb25TdGF0ZShlLG8pLG4uZW5kSW5mZXJlbmNlU2Vzc2lvbihlKX19dC5JbmZlcmVuY2VTZXNzaW9uPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpO30sMTcyMzooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuT25ueGpzU2Vzc2lvbkhhbmRsZXI9dm9pZCAwO2NvbnN0IHI9bigyMjM1KSxvPW4oOTI0MCk7dC5Pbm54anNTZXNzaW9uSGFuZGxlcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLnNlc3Npb249ZSx0aGlzLmlucHV0TmFtZXM9dGhpcy5zZXNzaW9uLmlucHV0TmFtZXMsdGhpcy5vdXRwdXROYW1lcz10aGlzLnNlc3Npb24ub3V0cHV0TmFtZXM7fWFzeW5jIGRpc3Bvc2UoKXt9YXN5bmMgcnVuKGUsdCxuKXtjb25zdCBpPW5ldyBNYXA7Zm9yKGNvbnN0IHQgaW4gZSlpZihPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpKXtjb25zdCBuPWVbdF07aS5zZXQodCxuZXcgby5UZW5zb3Iobi5kaW1zLG4udHlwZSx2b2lkIDAsdm9pZCAwLG4uZGF0YSkpO31jb25zdCBzPWF3YWl0IHRoaXMuc2Vzc2lvbi5ydW4oaSksYT17fTtyZXR1cm4gcy5mb3JFYWNoKCgoZSx0KT0+e2FbdF09bmV3IHIuVGVuc29yKGUudHlwZSxlLmRhdGEsZS5kaW1zKTt9KSksYX1zdGFydFByb2ZpbGluZygpe3RoaXMuc2Vzc2lvbi5zdGFydFByb2ZpbGluZygpO31lbmRQcm9maWxpbmcoKXt0aGlzLnNlc3Npb24uZW5kUHJvZmlsaW5nKCk7fX07fSw2MDI3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5TZXNzaW9uPXZvaWQgMDtjb25zdCByPW4oNzA2Nyksbz1uKDEyOTYpLGk9bigxOTc1KSxzPW4oNjQ5NiksYT1uKDEzMTUpLHU9bigxNzQ1KTt0LlNlc3Npb249Y2xhc3N7Y29uc3RydWN0b3IoZT17fSl7dGhpcy5faW5pdGlhbGl6ZWQ9ITEsdGhpcy5iYWNrZW5kSGludD1lLmJhY2tlbmRIaW50LHRoaXMucHJvZmlsZXI9YS5Qcm9maWxlci5jcmVhdGUoZS5wcm9maWxlciksdGhpcy5jb250ZXh0PXtwcm9maWxlcjp0aGlzLnByb2ZpbGVyLGdyYXBoSW5wdXRUeXBlczpbXSxncmFwaElucHV0RGltczpbXX07fWdldCBpbnB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuX21vZGVsLmdyYXBoLmdldElucHV0TmFtZXMoKX1nZXQgb3V0cHV0TmFtZXMoKXtyZXR1cm4gdGhpcy5fbW9kZWwuZ3JhcGguZ2V0T3V0cHV0TmFtZXMoKX1zdGFydFByb2ZpbGluZygpe3RoaXMucHJvZmlsZXIuc3RhcnQoKTt9ZW5kUHJvZmlsaW5nKCl7dGhpcy5wcm9maWxlci5zdG9wKCk7fWFzeW5jIGxvYWRNb2RlbChlLHQsbil7YXdhaXQgdGhpcy5wcm9maWxlci5ldmVudCgic2Vzc2lvbiIsIlNlc3Npb24ubG9hZE1vZGVsIiwoYXN5bmMoKT0+e2NvbnN0IHM9YXdhaXQoMCwgaS5yZXNvbHZlQmFja2VuZCkodGhpcy5iYWNrZW5kSGludCk7aWYodGhpcy5zZXNzaW9uSGFuZGxlcj1zLmNyZWF0ZVNlc3Npb25IYW5kbGVyKHRoaXMuY29udGV4dCksdGhpcy5fbW9kZWw9bmV3IHUuTW9kZWwsInN0cmluZyI9PXR5cGVvZiBlKXtjb25zdCB0PWUuZW5kc1dpdGgoIi5vcnQiKTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJnByb2Nlc3MudmVyc2lvbnMmJnByb2Nlc3MudmVyc2lvbnMubm9kZSl7Y29uc3Qgbj1hd2FpdCgwLCBvLnByb21pc2lmeSkoci5yZWFkRmlsZSkoZSk7dGhpcy5pbml0aWFsaXplKG4sdCk7fWVsc2Uge2NvbnN0IG49YXdhaXQgZmV0Y2goZSkscj1hd2FpdCBuLmFycmF5QnVmZmVyKCk7dGhpcy5pbml0aWFsaXplKG5ldyBVaW50OEFycmF5KHIpLHQpO319ZWxzZSBpZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpdGhpcy5pbml0aWFsaXplKGUpO2Vsc2Uge2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkoZSx0fHwwLG58fGUuYnl0ZUxlbmd0aCk7dGhpcy5pbml0aWFsaXplKHIpO319KSk7fWluaXRpYWxpemUoZSx0KXtpZih0aGlzLl9pbml0aWFsaXplZCl0aHJvdyBuZXcgRXJyb3IoImFscmVhZHkgaW5pdGlhbGl6ZWQiKTt0aGlzLnByb2ZpbGVyLmV2ZW50KCJzZXNzaW9uIiwiU2Vzc2lvbi5pbml0aWFsaXplIiwoKCk9Pntjb25zdCBuPXRoaXMuc2Vzc2lvbkhhbmRsZXIudHJhbnNmb3JtR3JhcGg/dGhpcy5zZXNzaW9uSGFuZGxlcjp2b2lkIDA7dGhpcy5fbW9kZWwubG9hZChlLG4sdCksdGhpcy5zZXNzaW9uSGFuZGxlci5vbkdyYXBoSW5pdGlhbGl6ZWQmJnRoaXMuc2Vzc2lvbkhhbmRsZXIub25HcmFwaEluaXRpYWxpemVkKHRoaXMuX21vZGVsLmdyYXBoKSx0aGlzLmluaXRpYWxpemVPcHModGhpcy5fbW9kZWwuZ3JhcGgpLHRoaXMuX2V4ZWN1dGlvblBsYW49bmV3IHMuRXhlY3V0aW9uUGxhbih0aGlzLl9tb2RlbC5ncmFwaCx0aGlzLl9vcHMsdGhpcy5wcm9maWxlcik7fSkpLHRoaXMuX2luaXRpYWxpemVkPSEwO31hc3luYyBydW4oZSl7aWYoIXRoaXMuX2luaXRpYWxpemVkKXRocm93IG5ldyBFcnJvcigic2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7cmV0dXJuIHRoaXMucHJvZmlsZXIuZXZlbnQoInNlc3Npb24iLCJTZXNzaW9uLnJ1biIsKGFzeW5jKCk9Pntjb25zdCB0PXRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVJbnB1dHMoZSksbj1hd2FpdCB0aGlzLl9leGVjdXRpb25QbGFuLmV4ZWN1dGUodGhpcy5zZXNzaW9uSGFuZGxlcix0KTtyZXR1cm4gdGhpcy5jcmVhdGVPdXRwdXQobil9KSl9bm9ybWFsaXplQW5kVmFsaWRhdGVJbnB1dHMoZSl7Y29uc3QgdD10aGlzLl9tb2RlbC5ncmFwaC5nZXRJbnB1dE5hbWVzKCk7aWYoQXJyYXkuaXNBcnJheShlKSl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYGluY29ycmVjdCBpbnB1dCBhcnJheSBsZW5ndGg6IGV4cGVjdGVkICR7dC5sZW5ndGh9IGJ1dCBnb3QgJHtlLmxlbmd0aH1gKX1lbHNlIHtpZihlLnNpemUhPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYGluY29ycmVjdCBpbnB1dCBtYXAgc2l6ZTogZXhwZWN0ZWQgJHt0Lmxlbmd0aH0gYnV0IGdvdCAke2Uuc2l6ZX1gKTtjb25zdCBuPW5ldyBBcnJheShlLnNpemUpO2xldCByPTA7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDsrK28pe2NvbnN0IGk9ZS5nZXQodFtvXSk7aWYoIWkpdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIGlucHV0IHRlbnNvciBmb3I6ICcke25hbWV9J2ApO25bcisrXT1pO31lPW47fWlmKHRoaXMuY29udGV4dC5ncmFwaElucHV0VHlwZXMmJjAhPT10aGlzLmNvbnRleHQuZ3JhcGhJbnB1dFR5cGVzLmxlbmd0aCYmdGhpcy5jb250ZXh0LmdyYXBoSW5wdXREaW1zJiYwIT09dGhpcy5jb250ZXh0LmdyYXBoSW5wdXREaW1zLmxlbmd0aCl0aGlzLnZhbGlkYXRlSW5wdXRUZW5zb3JEaW1zKHRoaXMuY29udGV4dC5ncmFwaElucHV0RGltcyxlLCExKTtlbHNlIHtjb25zdCB0PXRoaXMuX21vZGVsLmdyYXBoLmdldElucHV0SW5kaWNlcygpLG49dGhpcy5fbW9kZWwuZ3JhcGguZ2V0VmFsdWVzKCkscj1uZXcgQXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7KytvKXtjb25zdCBpPW5bdFtvXV07cltvXT1pLnR5cGUuc2hhcGUuZGltcyx0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dFR5cGVzLnB1c2goaS50eXBlLnRlbnNvclR5cGUpLHRoaXMuY29udGV4dC5ncmFwaElucHV0RGltcy5wdXNoKGVbb10uZGltcyk7fXRoaXMudmFsaWRhdGVJbnB1dFRlbnNvckRpbXMocixlLCEwKTt9cmV0dXJuIHRoaXMudmFsaWRhdGVJbnB1dFRlbnNvclR5cGVzKHRoaXMuY29udGV4dC5ncmFwaElucHV0VHlwZXMsZSksZX12YWxpZGF0ZUlucHV0VGVuc29yVHlwZXMoZSx0KXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgcj1lW25dLG89dFtuXS50eXBlO2lmKHIhPT1vKXRocm93IG5ldyBFcnJvcihgaW5wdXQgdGVuc29yWyR7bn1dIGNoZWNrIGZhaWxlZDogZXhwZWN0ZWQgdHlwZSAnJHtyfScgYnV0IGdvdCAke299YCl9fXZhbGlkYXRlSW5wdXRUZW5zb3JEaW1zKGUsdCxuKXtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7Y29uc3Qgbz1lW3JdLGk9dFtyXS5kaW1zO2lmKCF0aGlzLmNvbXBhcmVUZW5zb3JEaW1zKG8saSxuKSl0aHJvdyBuZXcgRXJyb3IoYGlucHV0IHRlbnNvclske3J9XSBjaGVjayBmYWlsZWQ6IGV4cGVjdGVkIHNoYXBlICdbJHtvLmpvaW4oIiwiKX1dJyBidXQgZ290IFske2kuam9pbigiLCIpfV1gKX19Y29tcGFyZVRlbnNvckRpbXMoZSx0LG4pe2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuICExO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7KytyKWlmKGVbcl0hPT10W3JdJiYoIW58fDAhPT1lW3JdKSlyZXR1cm4gITE7cmV0dXJuICEwfWNyZWF0ZU91dHB1dChlKXtjb25zdCB0PXRoaXMuX21vZGVsLmdyYXBoLmdldE91dHB1dE5hbWVzKCk7aWYoZS5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImV4cGVjdGVkIG51bWJlciBvZiBvdXRwdXRzIGRvIG5vdCBtYXRjaCBudW1iZXIgb2YgZ2VuZXJhdGVkIG91dHB1dHMiKTtjb25zdCBuPW5ldyBNYXA7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDsrK3Ipbi5zZXQodFtyXSxlW3JdKTtyZXR1cm4gbn1pbml0aWFsaXplT3BzKGUpe2NvbnN0IHQ9ZS5nZXROb2RlcygpO3RoaXMuX29wcz1uZXcgQXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXRoaXMuX29wc1tuXT10aGlzLnNlc3Npb25IYW5kbGVyLnJlc29sdmUodFtuXSx0aGlzLl9tb2RlbC5vcHNldHMsZSk7fX07fSw5MjQwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UZW5zb3I9dm9pZCAwO2NvbnN0IG89bigzNDQyKSxpPXIobigxNTgzKSkscz1uKDUxMjcpLGE9bigyNDQ2KSx1PW4oNzI3Myk7dmFyIGw9cy5vbm54cnVudGltZS5leHBlcmltZW50YWwuZmJzO2NsYXNzIGN7Z2V0IGRhdGEoKXtpZih2b2lkIDA9PT10aGlzLmNhY2hlKXtjb25zdCBlPXRoaXMuZGF0YVByb3ZpZGVyKHRoaXMuZGF0YUlkKTtpZihlLmxlbmd0aCE9PXRoaXMuc2l6ZSl0aHJvdyBuZXcgRXJyb3IoIkxlbmd0aCBvZiBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBEYXRhIFByb3ZpZGVyIGlzIGluY29uc2lzdGVudCB3aXRoIHRoZSBkaW1zIG9mIHRoaXMgVGVuc29yLiIpO3RoaXMuY2FjaGU9ZTt9cmV0dXJuIHRoaXMuY2FjaGV9Z2V0IHN0cmluZ0RhdGEoKXtpZigic3RyaW5nIiE9PXRoaXMudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJkYXRhIHR5cGUgaXMgbm90IHN0cmluZyIpO3JldHVybiB0aGlzLmRhdGF9Z2V0IGludGVnZXJEYXRhKCl7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSJ1aW50OCI6Y2FzZSJpbnQ4IjpjYXNlInVpbnQxNiI6Y2FzZSJpbnQxNiI6Y2FzZSJpbnQzMiI6Y2FzZSJ1aW50MzIiOmNhc2UiYm9vbCI6cmV0dXJuIHRoaXMuZGF0YTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoImRhdGEgdHlwZSBpcyBub3QgaW50ZWdlciAodWludDgsIGludDgsIHVpbnQxNiwgaW50MTYsIGludDMyLCB1aW50MzIsIGJvb2wpIil9fWdldCBmbG9hdERhdGEoKXtzd2l0Y2godGhpcy50eXBlKXtjYXNlImZsb2F0MzIiOmNhc2UiZmxvYXQ2NCI6cmV0dXJuIHRoaXMuZGF0YTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoImRhdGEgdHlwZSBpcyBub3QgZmxvYXQgKGZsb2F0MzIsIGZsb2F0NjQpIil9fWdldCBudW1iZXJEYXRhKCl7aWYoInN0cmluZyIhPT10aGlzLnR5cGUpcmV0dXJuIHRoaXMuZGF0YTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlIGNhbm5vdCBiZSBub24tbnVtYmVyIChzdHJpbmcpIil9Z2V0KGUpe3JldHVybiB0aGlzLmRhdGFbdS5TaGFwZVV0aWwuaW5kaWNlc1RvT2Zmc2V0KGUsdGhpcy5zdHJpZGVzKV19c2V0KGUsdCl7dGhpcy5kYXRhW3UuU2hhcGVVdGlsLmluZGljZXNUb09mZnNldChlLHRoaXMuc3RyaWRlcyldPXQ7fWFzeW5jIGdldERhdGEoKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5jYWNoZSYmKHRoaXMuY2FjaGU9YXdhaXQgdGhpcy5hc3luY0RhdGFQcm92aWRlcih0aGlzLmRhdGFJZCkpLHRoaXMuY2FjaGV9Z2V0IHN0cmlkZXMoKXtyZXR1cm4gdGhpcy5fc3RyaWRlc3x8KHRoaXMuX3N0cmlkZXM9dS5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXModGhpcy5kaW1zKSksdGhpcy5fc3RyaWRlc31jb25zdHJ1Y3RvcihlLHQsbixyLGkscz1vLkd1aWQuY3JlYXRlKCkpe3RoaXMuZGltcz1lLHRoaXMudHlwZT10LHRoaXMuZGF0YVByb3ZpZGVyPW4sdGhpcy5hc3luY0RhdGFQcm92aWRlcj1yLHRoaXMuY2FjaGU9aSx0aGlzLmRhdGFJZD1zLHRoaXMuc2l6ZT11LlNoYXBlVXRpbC52YWxpZGF0ZURpbXNBbmRDYWxjU2l6ZShlKTtjb25zdCBhPXRoaXMuc2l6ZSxsPXZvaWQgMD09PW4mJnZvaWQgMD09PXImJnZvaWQgMD09PWk7aWYodm9pZCAwIT09aSYmaS5sZW5ndGghPT1hKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnB1dCBkaW1zIGRvZXNuJ3QgbWF0Y2ggZGF0YSBsZW5ndGguIik7aWYoInN0cmluZyI9PT10KXtpZighKHZvaWQgMD09PWl8fEFycmF5LmlzQXJyYXkoaSkmJmkuZXZlcnkoKGU9PiJzdHJpbmciPT10eXBlb2YgZSkpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWNoZSBzaG91bGQgYmUgYSBzdHJpbmcgYXJyYXkiKTtsJiYodGhpcy5jYWNoZT1uZXcgQXJyYXkoYSkpO31lbHNlIHtpZih2b2lkIDAhPT1pKXtjb25zdCBlPWQodCk7aWYoIShpIGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihgY2FjaGUgc2hvdWxkIGJlIHR5cGUgJHtlLm5hbWV9YCl9aWYobCl7Y29uc3QgZT1uZXcgQXJyYXlCdWZmZXIoYSpmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSJib29sIjpjYXNlImludDgiOmNhc2UidWludDgiOnJldHVybiAxO2Nhc2UiaW50MTYiOmNhc2UidWludDE2IjpyZXR1cm4gMjtjYXNlImludDMyIjpjYXNlInVpbnQzMiI6Y2FzZSJmbG9hdDMyIjpyZXR1cm4gNDtjYXNlImZsb2F0NjQiOnJldHVybiA4O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgY2FsY3VsYXRlIHNpemVvZigpIG9uIHR5cGUgJHtlfWApfX0odCkpO3RoaXMuY2FjaGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3KGQodCkpKGUpfShlLHQpO319fXN0YXRpYyBmcm9tUHJvdG8oZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJjYW5ub3QgY29uc3RydWN0IFZhbHVlIGZyb20gYW4gZW1wdHkgdGVuc29yIik7Y29uc3QgdD11LlByb3RvVXRpbC50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byhlLmRhdGFUeXBlKSxuPXUuUHJvdG9VdGlsLnRlbnNvckRpbXNGcm9tUHJvdG8oZS5kaW1zKSxyPW5ldyBjKG4sdCk7aWYoInN0cmluZyI9PT10KWUuc3RyaW5nRGF0YS5mb3JFYWNoKCgoZSx0KT0+e3IuZGF0YVt0XT0oMCwgdS5kZWNvZGVVdGY4U3RyaW5nKShlKTt9KSk7ZWxzZSBpZihlLnJhd0RhdGEmJiJudW1iZXIiPT10eXBlb2YgZS5yYXdEYXRhLmJ5dGVMZW5ndGgmJmUucmF3RGF0YS5ieXRlTGVuZ3RoPjApe2NvbnN0IHQ9ci5kYXRhLG49bmV3IERhdGFWaWV3KGUucmF3RGF0YS5idWZmZXIsZS5yYXdEYXRhLmJ5dGVPZmZzZXQsZS5yYXdEYXRhLmJ5dGVMZW5ndGgpLG89cChlLmRhdGFUeXBlKSxpPWUucmF3RGF0YS5ieXRlTGVuZ3RoL287aWYoZS5yYXdEYXRhLmJ5dGVMZW5ndGglbyE9MCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYnVmZmVyIGxlbmd0aCIpO2lmKHQubGVuZ3RoIT09aSl0aHJvdyBuZXcgRXJyb3IoImJ1ZmZlciBsZW5ndGggbWlzbWF0Y2giKTtmb3IobGV0IHI9MDtyPGk7cisrKXtjb25zdCBpPWgobixlLmRhdGFUeXBlLHIqbyk7dFtyXT1pO319ZWxzZSB7bGV0IHQ7c3dpdGNoKGUuZGF0YVR5cGUpe2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkZMT0FUOnQ9ZS5mbG9hdERhdGE7YnJlYWs7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMzI6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMTY6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDE2OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDg6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDg6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuQk9PTDp0PWUuaW50MzJEYXRhO2JyZWFrO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDY0OnQ9ZS5pbnQ2NERhdGE7YnJlYWs7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuRE9VQkxFOnQ9ZS5kb3VibGVEYXRhO2JyZWFrO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQzMjpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UNjQ6dD1lLnVpbnQ2NERhdGE7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoInVuc3BlY2lmaWMgZXJyb3IiKX1pZihudWxsPT10KXRocm93IG5ldyBFcnJvcigiZmFpbGVkIHRvIHBvcHVsYXRlIGRhdGEgZnJvbSBhIHRlbnNvcnByb3RvIHZhbHVlIik7Y29uc3Qgbj1yLmRhdGE7aWYobi5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImFycmF5IGxlbmd0aCBtaXNtYXRjaCIpO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKXtjb25zdCBvPXRbcl07aS5kZWZhdWx0LmlzTG9uZyhvKT9uW3JdPWYobyxlLmRhdGFUeXBlKTpuW3JdPW87fX1yZXR1cm4gcn1zdGF0aWMgZnJvbURhdGEoZSx0LG4pe3JldHVybiBuZXcgYyh0LG4sdm9pZCAwLHZvaWQgMCxlKX1zdGF0aWMgZnJvbU9ydFRlbnNvcihlKXtpZighZSl0aHJvdyBuZXcgRXJyb3IoImNhbm5vdCBjb25zdHJ1Y3QgVmFsdWUgZnJvbSBhbiBlbXB0eSB0ZW5zb3IiKTtjb25zdCB0PXUuUHJvdG9VdGlsLnRlbnNvckRpbXNGcm9tT1JURm9ybWF0KGUpLG49dS5Qcm90b1V0aWwudGVuc29yRGF0YVR5cGVGcm9tUHJvdG8oZS5kYXRhVHlwZSgpKSxyPW5ldyBjKHQsbik7aWYoInN0cmluZyI9PT1uKWZvcihsZXQgdD0wO3Q8ZS5zdHJpbmdEYXRhTGVuZ3RoKCk7dCsrKXIuZGF0YVt0XT1lLnN0cmluZ0RhdGEodCk7ZWxzZSBpZihlLnJhd0RhdGFBcnJheSgpJiYibnVtYmVyIj09dHlwZW9mIGUucmF3RGF0YUxlbmd0aCgpJiZlLnJhd0RhdGFMZW5ndGgoKT4wKXtjb25zdCB0PXIuZGF0YSxuPW5ldyBEYXRhVmlldyhlLnJhd0RhdGFBcnJheSgpLmJ1ZmZlcixlLnJhd0RhdGFBcnJheSgpLmJ5dGVPZmZzZXQsZS5yYXdEYXRhTGVuZ3RoKCkpLG89cChlLmRhdGFUeXBlKCkpLGk9ZS5yYXdEYXRhTGVuZ3RoKCkvbztpZihlLnJhd0RhdGFMZW5ndGgoKSVvIT0wKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBidWZmZXIgbGVuZ3RoIik7aWYodC5sZW5ndGghPT1pKXRocm93IG5ldyBFcnJvcigiYnVmZmVyIGxlbmd0aCBtaXNtYXRjaCIpO2ZvcihsZXQgcj0wO3I8aTtyKyspe2NvbnN0IGk9aChuLGUuZGF0YVR5cGUoKSxyKm8pO3Rbcl09aTt9fXJldHVybiByfX1mdW5jdGlvbiBwKGUpe3N3aXRjaChlKXtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UODpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ4OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkJPT0w6cmV0dXJuIDE7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDE2OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDE2OnJldHVybiAyO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkZMT0FUOmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDMyOmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQzMjpyZXR1cm4gNDtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ2NDpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5ET1VCTEU6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDY0OnJldHVybiA4O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgY2FsY3VsYXRlIHNpemVvZigpIG9uIHR5cGUgJHthLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGVbZV19YCl9fWZ1bmN0aW9uIGQoZSl7c3dpdGNoKGUpe2Nhc2UiYm9vbCI6Y2FzZSJ1aW50OCI6cmV0dXJuIFVpbnQ4QXJyYXk7Y2FzZSJpbnQ4IjpyZXR1cm4gSW50OEFycmF5O2Nhc2UiaW50MTYiOnJldHVybiBJbnQxNkFycmF5O2Nhc2UidWludDE2IjpyZXR1cm4gVWludDE2QXJyYXk7Y2FzZSJpbnQzMiI6cmV0dXJuIEludDMyQXJyYXk7Y2FzZSJ1aW50MzIiOnJldHVybiBVaW50MzJBcnJheTtjYXNlImludDY0IjpyZXR1cm4gQmlnSW50NjRBcnJheTtjYXNlImZsb2F0MzIiOnJldHVybiBGbG9hdDMyQXJyYXk7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gRmxvYXQ2NEFycmF5O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ1bnNwZWNpZmllZCBlcnJvciIpfX1mdW5jdGlvbiBmKGUsdCl7aWYodD09PWEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ2NHx8dD09PWwuVGVuc29yRGF0YVR5cGUuSU5UNjQpe2lmKGUuZ3JlYXRlclRoYW5PckVxdWFsKDIxNDc0ODM2NDgpfHxlLmxlc3NUaGFuKC0yMTQ3NDgzNjQ4KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnQ2NCBpcyBub3Qgc3VwcG9ydGVkIil9ZWxzZSB7aWYodCE9PWEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMzImJnQhPT1sLlRlbnNvckRhdGFUeXBlLlVJTlQzMiYmdCE9PWEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UNjQmJnQhPT1sLlRlbnNvckRhdGFUeXBlLlVJTlQ2NCl0aHJvdyBuZXcgVHlwZUVycm9yKGBub3QgYSBMT05HIHR5cGU6ICR7YS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlW3RdfWApO2lmKGUuZ3JlYXRlclRoYW5PckVxdWFsKDQyOTQ5NjcyOTYpfHxlLmxlc3NUaGFuKDApKXRocm93IG5ldyBUeXBlRXJyb3IoInVpbnQ2NCBpcyBub3Qgc3VwcG9ydGVkIil9cmV0dXJuIGUudG9OdW1iZXIoKX1mdW5jdGlvbiBoKGUsdCxuKXtzd2l0Y2godCl7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuQk9PTDpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UODpyZXR1cm4gZS5nZXRVaW50OChuKTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ4OnJldHVybiBlLmdldEludDgobik7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDE2OnJldHVybiBlLmdldFVpbnQxNihuLCEwKTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQxNjpyZXR1cm4gZS5nZXRJbnQxNihuLCEwKTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5GTE9BVDpyZXR1cm4gZS5nZXRGbG9hdDMyKG4sITApO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDMyOnJldHVybiBlLmdldEludDMyKG4sITApO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQzMjpyZXR1cm4gZS5nZXRVaW50MzIobiwhMCk7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UNjQ6cmV0dXJuIGYoaS5kZWZhdWx0LmZyb21CaXRzKGUuZ2V0VWludDMyKG4sITApLGUuZ2V0VWludDMyKG4rNCwhMCksITEpLHQpO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkRPVUJMRTpyZXR1cm4gZS5nZXRGbG9hdDY0KG4sITApO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQ2NDpyZXR1cm4gZihpLmRlZmF1bHQuZnJvbUJpdHMoZS5nZXRVaW50MzIobiwhMCksZS5nZXRVaW50MzIobis0LCEwKSwhMCksdCk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCByZWFkIGZyb20gRGF0YVZpZXcgZm9yIHR5cGUgJHthLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGVbdF19YCl9fXQuVGVuc29yPWM7fSw3MjczOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5kZWNvZGVVdGY4U3RyaW5nPXQuTUFYX0NMSVA9dC5NSU5fQ0xJUD10LlBvb2xDb252VXRpbD10LlJlZHVjZVV0aWw9dC5TcGxpdFV0aWw9dC5NYXRoVXRpbD10LlNoYXBlVXRpbD10LkxvbmdVdGlsPXQuUHJvdG9VdGlsPXQuR2VtbVV0aWw9dC5hcnJheUNvcHlIZWxwZXI9dC5Ccm9hZGNhc3RVdGlsPXQuTWF0TXVsVXRpbD10LkFycmF5VXRpbD10LmFzc2VydD10LmNoZWNrSW5wdXRzU2hhcGU9dm9pZCAwO2NvbnN0IG89big1Njg2KSxpPXIobigxNTgzKSkscz1uKDI0NDYpLGE9big5MjQwKTt0LmNoZWNrSW5wdXRzU2hhcGU9ZnVuY3Rpb24oZSwuLi50KXtpZighZXx8ZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4gITE7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYoIWVbbl0uZGltc3x8ZVtuXS5kaW1zLmxlbmd0aCE9PXRbbl0pcmV0dXJuICExO3JldHVybiAhMH0sdC5hc3NlcnQ9ZnVuY3Rpb24oZSx0KXtpZighZSl0aHJvdyBuZXcgRXJyb3IoInN0cmluZyI9PXR5cGVvZiB0P3Q6dCgpKX0sdC5BcnJheVV0aWw9Y2xhc3N7c3RhdGljIGFycmF5c0VxdWFsKGUsdCl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4gITE7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYoZVtuXSE9PXRbbl0pcmV0dXJuICExO3JldHVybiAhMH19O2NsYXNzIHV7c3RhdGljIHByZXByb2Nlc3NJbnB1dFNoYXBlcyhlLHQpe3JldHVybiBbMT09PWUubGVuZ3RoP1sxLGVbMF1dOmUsMT09PXQubGVuZ3RoP1t0WzBdLDFdOnRdfXN0YXRpYyBwb3N0cHJvY2Vzc091dHB1dFNoYXBlKGUsdCxuKXsxPT09dCYmZS5zcGxpY2UoZS5sZW5ndGgtMiwxKSwxPT09biYmZS5wb3AoKTt9c3RhdGljIGNhbGNNYXRNdWxTaGFwZShlLHQpe3JldHVybiBlWzFdIT09dFswXT92b2lkIDA6W2VbMF0sdFsxXV19fXQuTWF0TXVsVXRpbD11O2NsYXNzIGx7c3RhdGljIGNhbGNTaGFwZShlLHQsbj0hMSl7Y29uc3Qgcj1lLmxlbmd0aCxvPXQubGVuZ3RoO2lmKDA9PT1yKXJldHVybiB0O2lmKDA9PT1vKXJldHVybiBlO2NvbnN0IGk9TWF0aC5tYXgoZS5sZW5ndGgsdC5sZW5ndGgpLHM9bmV3IEFycmF5KGkpO2lmKG4pe2lmKHI8Mnx8bzwyKXJldHVybjtjb25zdCBuPXUuY2FsY01hdE11bFNoYXBlKFtlW3ItMl0sZVtyLTFdXSxbdFtvLTJdLHRbby0xXV0pO2lmKHZvaWQgMD09PW4pcmV0dXJuO1tzW2ktMl0sc1tpLTFdXT1uO31mb3IobGV0IGE9bj8zOjE7YTw9aTthKyspe2NvbnN0IG49ci1hPDA/MTplW3ItYV0sdT1vLWE8MD8xOnRbby1hXTtpZihuIT09dSYmbj4xJiZ1PjEpcmV0dXJuO3NbaS1hXT1NYXRoLm1heChuLHUpO31yZXR1cm4gc31zdGF0aWMgaW5kZXgoZSx0KXtjb25zdCBuPW5ldyBBcnJheSh0Lmxlbmd0aCk7cmV0dXJuIGwuZmlsbEluZGV4KGUsdCxuKSxufXN0YXRpYyBmaWxsSW5kZXgoZSx0LG4pe2NvbnN0IHI9ZS5sZW5ndGgtdC5sZW5ndGg7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspbltvXT1lW3Irb10ldFtvXTt9c3RhdGljIGNhbGMoZSx0LG4scixvKXtjb25zdCBpPWwuY2FsY1NoYXBlKGUuZGltcyx0LmRpbXMpO2lmKGkpe2lmKHImJiFkLmFyZUVxdWFsKGksZS5kaW1zKSlyZXR1cm47Y29uc3Qgcz1kLnNpemUoaSksdT1yP2U6bmV3IGEuVGVuc29yKGksb3x8ZS50eXBlKTtpZigwPT09aS5sZW5ndGgpdS5zZXQoW10sbihlLmdldChbXSksdC5nZXQoW10pKSk7ZWxzZSB7Y29uc3Qgcj1uZXcgQXJyYXkoaS5sZW5ndGgpLG89bmV3IEFycmF5KGUuZGltcy5sZW5ndGgpLGE9bmV3IEFycmF5KHQuZGltcy5sZW5ndGgpO2xldCBjLHA9MCxkPTAsZj0hMSxoPSExOzA9PT1lLmRpbXMubGVuZ3RoJiYocD1lLmdldChbXSksZj0hMCksMD09PXQuZGltcy5sZW5ndGgmJihkPXQuZ2V0KFtdKSxoPSEwKTtmb3IobGV0IGc9MDtnPHM7ZysrKXtjPWc7Zm9yKGxldCBlPWkubGVuZ3RoLTE7ZT49MDtlLS0pcltlXT1jJWlbZV0sYz1NYXRoLmZsb29yKGMvaVtlXSk7Znx8KGwuZmlsbEluZGV4KHIsZS5kaW1zLG8pLHA9ZS5nZXQobykpLGh8fChsLmZpbGxJbmRleChyLHQuZGltcyxhKSxkPXQuZ2V0KGEpKSx1LnNldChyLG4ocCxkKSk7fX1yZXR1cm4gdX19c3RhdGljIGlzVmFsaWRCcm9hZGNhc3QoZSx0KXtjb25zdCBuPWUubGVuZ3RoLHI9dC5sZW5ndGg7aWYobj5yKXJldHVybiAhMTtmb3IobGV0IG89MTtvPD1uO28rKylpZigxIT09ZVtuLW9dJiZlW24tb10hPT10W3Itb10pcmV0dXJuICExO3JldHVybiAhMH1zdGF0aWMgZ2V0QnJvYWRjYXN0RGltcyhlLHQpe2NvbnN0IG49ZS5sZW5ndGgscj1bXTtmb3IobGV0IG89MDtvPG47bysrKXtjb25zdCBpPW4tMS1vLHM9ZVtpXXx8MTsodFt0Lmxlbmd0aC0xLW9dfHwxKT4xJiYxPT09cyYmci51bnNoaWZ0KGkpO31yZXR1cm4gcn19dC5Ccm9hZGNhc3RVdGlsPWwsdC5hcnJheUNvcHlIZWxwZXI9ZnVuY3Rpb24oZSx0LG4scixvKXtpZihyPDB8fHI+PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic291cmNlSW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKG48MHx8bj49ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXRJbmRleCBvdXQgb2YgYm91bmRzIik7aWYocitvPnQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic291cmNlIGluZGljZXMgdG8gYmUgY29waWVkIGFyZSBvdXRzaWRlIGJvdW5kcyIpO2lmKG4rbz5lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRhcmdldCBhcnJheSBpcyB0b28gc21hbGwgdG8gaG9sZCByZXN1bHQiKTtmb3IobGV0IGk9MDtpPG87aSsrKWVbbitpXT10W3IraV07fSx0LkdlbW1VdGlsPWNsYXNze3N0YXRpYyBnZXRTaGFwZU9mR2VtbVJlc3VsdChlLHQsbixyLG8pe2lmKDIhPT1lLmxlbmd0aHx8MiE9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic2hhcGUgbmVlZCB0byBiZSBvZiBzaXplIDIiKTtsZXQgaSxzLGE7dD8oaT1lWzFdLHM9ZVswXSk6KGk9ZVswXSxzPWVbMV0pO2xldCB1PS0xO2lmKHI/KGE9blswXSx1PTEpOihhPW5bMV0sdT0wKSxuW3VdIT09cyl0aHJvdyBuZXcgRXJyb3IoImRpbWVuc2lvbiBtaXNtYXRjaCIpO2lmKGk8PTB8fGE8PTB8fHM8PTApdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNoYXBlIHNwZWNpZmllZCIpO2lmKG8mJiFsLmlzVmFsaWRCcm9hZGNhc3QobyxbaSxhXSkpdGhyb3cgbmV3IEVycm9yKCJnZW1tOiBpbnZhbGlkIGJpYXMgc2hhcGUgZm9yIGJyb2FkY2FzdCIpO3JldHVybiBbaSxhLHNdfX07Y2xhc3MgY3tzdGF0aWMgdGVuc29yRGF0YVR5cGVGcm9tUHJvdG8oZSl7c3dpdGNoKGUpe2Nhc2Ugcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDg6cmV0dXJuICJpbnQ4IjtjYXNlIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UODpyZXR1cm4gInVpbnQ4IjtjYXNlIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5CT09MOnJldHVybiAiYm9vbCI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMTY6cmV0dXJuICJpbnQxNiI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDE2OnJldHVybiAidWludDE2IjtjYXNlIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQzMjpyZXR1cm4gImludDMyIjtjYXNlIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMzI6cmV0dXJuICJ1aW50MzIiO2Nhc2Ugcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkZMT0FUOnJldHVybiAiZmxvYXQzMiI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuRE9VQkxFOnJldHVybiAiZmxvYXQ2NCI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuU1RSSU5HOnJldHVybiAic3RyaW5nIjtjYXNlIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ2NDpyZXR1cm4gImludDMyIjtjYXNlIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UNjQ6cmV0dXJuICJ1aW50MzIiO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7cy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlW2VdfWApfX1zdGF0aWMgdGVuc29yRGF0YVR5cGVTdHJpbmdUb0VudW0oZSl7c3dpdGNoKGUpe2Nhc2UiaW50OCI6cmV0dXJuIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ4O2Nhc2UidWludDgiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDg7Y2FzZSJib29sIjpyZXR1cm4gcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkJPT0w7Y2FzZSJpbnQxNiI6cmV0dXJuIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQxNjtjYXNlInVpbnQxNiI6cmV0dXJuIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMTY7Y2FzZSJpbnQzMiI6cmV0dXJuIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQzMjtjYXNlInVpbnQzMiI6cmV0dXJuIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMzI7Y2FzZSJmbG9hdDMyIjpyZXR1cm4gcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkZMT0FUO2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5ET1VCTEU7Y2FzZSJzdHJpbmciOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuU1RSSU5HO2Nhc2UiaW50NjQiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UNjQ7Y2FzZSJ1aW50NjQiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDY0O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7ZX1gKX19c3RhdGljIHRlbnNvckRpbXNGcm9tUHJvdG8oZSl7cmV0dXJuIGUubWFwKChlPT5pLmRlZmF1bHQuaXNMb25nKGUpP2UudG9OdW1iZXIoKTplKSl9c3RhdGljIHRlbnNvclZhbHVlVHlwZUZyb21Qcm90byhlKXtyZXR1cm4ge3RlbnNvclR5cGU6Yy50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byhlLmVsZW1UeXBlKSxzaGFwZTp7ZGltczpjLnRlbnNvckRpbXNGcm9tUHJvdG8oZS5zaGFwZS5kaW0ubWFwKChlPT5lLmRpbVZhbHVlKSkpfX19c3RhdGljIHRlbnNvckRpbXNGcm9tT1JURm9ybWF0KGUpe2NvbnN0IHQ9W107Zm9yKGxldCBuPTA7bjxlLmRpbXNMZW5ndGgoKTtuKyspdC5wdXNoKHAubG9uZ1RvTnVtYmVyKGUuZGltcyhuKSkpO3JldHVybiB0fXN0YXRpYyB0ZW5zb3JBdHRyaWJ1dGVzRnJvbU9SVEZvcm1hdChlKXtjb25zdCB0PVtdO2ZvcihsZXQgbj0wO248ZS5hdHRyaWJ1dGVzTGVuZ3RoKCk7bisrKXQucHVzaChlLmF0dHJpYnV0ZXMobikpO3JldHVybiB0fX10LlByb3RvVXRpbD1jO2NsYXNzIHB7c3RhdGljIGxvbmdUb051bWJlcihlLHQpe3JldHVybiBpLmRlZmF1bHQuaXNMb25nKGUpP2UudG9OdW1iZXIoKTplIGluc3RhbmNlb2Ygby5mbGF0YnVmZmVycy5Mb25nP2kuZGVmYXVsdC5mcm9tVmFsdWUoe2xvdzplLmxvdyxoaWdoOmUuaGlnaCx1bnNpZ25lZDpudWxsIT10JiZ0fSkudG9OdW1iZXIoKTplfXN0YXRpYyBpc0xvbmcoZSl7cmV0dXJuIGkuZGVmYXVsdC5pc0xvbmcoZSl8fGUgaW5zdGFuY2VvZiBvLmZsYXRidWZmZXJzLkxvbmd9fXQuTG9uZ1V0aWw9cDtjbGFzcyBke3N0YXRpYyBzaXplKGUpe3JldHVybiBkLmdldFNpemVGcm9tRGltZW5zaW9uUmFuZ2UoZSwwLGUubGVuZ3RoKX1zdGF0aWMgc2l6ZUZyb21EaW1lbnNpb24oZSx0KXtpZih0PDB8fHQ+ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRpbWVuc2lvbiBvZiAke3R9IGZvciBzaXplRnJvbURpbWVuc2lvbiBhcyBUZW5zb3IgaGFzICR7ZS5sZW5ndGh9IGRpbWVuc2lvbnMuYCk7cmV0dXJuIGQuZ2V0U2l6ZUZyb21EaW1lbnNpb25SYW5nZShlLHQsZS5sZW5ndGgpfXN0YXRpYyBzaXplVG9EaW1lbnNpb24oZSx0KXtpZih0PDB8fHQ+ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRpbWVuc2lvbiBvZiAke3R9IGZvciBzaXplVG9EaW1lbnNpb24gYXMgVGVuc29yIGhhcyAke2UubGVuZ3RofSBkaW1lbnNpb25zLmApO3JldHVybiBkLmdldFNpemVGcm9tRGltZW5zaW9uUmFuZ2UoZSwwLHQpfXN0YXRpYyBnZXRTaXplRnJvbURpbWVuc2lvblJhbmdlKGUsdCxuKXtsZXQgcj0xO2ZvcihsZXQgbz10O288bjtvKyspe2lmKGVbb108PTApdGhyb3cgbmV3IEVycm9yKCJjYW5ub3QgZ2V0IHZhbGlkIHNpemUgZnJvbSBzcGVjaWZpZWQgZGltZW5zaW9uIHJhbmdlLiBNb3N0IGxpa2VseSB0aGUgcmFuZ2UgY29udGFpbnMgMCBvciBuZWdhdGl2ZSB2YWx1ZXMgaW4gdGhlbS4iKTtyKj1lW29dO31yZXR1cm4gcn1zdGF0aWMgY29tcHV0ZVN0cmlkZXMoZSl7Y29uc3QgdD1lLmxlbmd0aDtpZigwPT09dClyZXR1cm4gW107aWYoMT09PXQpcmV0dXJuIFsxXTtjb25zdCBuPW5ldyBBcnJheSh0KTtuW3QtMV09MSxuW3QtMl09ZVt0LTFdO2ZvcihsZXQgcj10LTM7cj49MDstLXIpbltyXT1uW3IrMV0qZVtyKzFdO3JldHVybiBufXN0YXRpYyB0cmFuc3Bvc2UoZSl7cmV0dXJuIGUuc2xpY2UoKS5yZXZlcnNlKCl9c3RhdGljIGluZGljZXNUb09mZnNldChlLHQsbil7dm9pZCAwPT09biYmKG49ZS5sZW5ndGgpO2xldCByPTA7Zm9yKGxldCBvPTA7bzxuOysrbylyKz10W29dKmVbb107cmV0dXJuIHJ9c3RhdGljIG9mZnNldFRvSW5kaWNlcyhlLHQpe2NvbnN0IG49dC5sZW5ndGg7aWYoMD09PW4pcmV0dXJuIFtdO2lmKDE9PT1uKXJldHVybiBbZSp0WzBdXTtjb25zdCByPW5ldyBBcnJheSh0Lmxlbmd0aCk7Zm9yKGxldCBuPTA7bjxyLmxlbmd0aC0xOysrbilyW25dPU1hdGguZmxvb3IoZS90W25dKSxlLT1yW25dKnRbbl07cmV0dXJuIHJbci5sZW5ndGgtMV09ZSxyfXN0YXRpYyBub3JtYWxpemVBeGlzKGUsdCl7aWYoZTwtdCYmZT49dCl0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIGF4aXMgZm9yIHRoaXMgb3BlcmF0aW9uLiIpO3JldHVybiBlPDA/ZSt0OmV9c3RhdGljIG5vcm1hbGl6ZUF4ZXMoZSx0KXtyZXR1cm4gZS5tYXAoKGU9PnRoaXMubm9ybWFsaXplQXhpcyhlLHQpKSl9c3RhdGljIGluY3JlbWVudEluZGV4KGUsdCxuKXtpZigwPT09dC5sZW5ndGh8fDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkluZGV4IGluY3JlbWVudGluZyB1bnN1cHBvcnRlZCBmb3Igc2NhbGFyIFRlbnNvciIpO2lmKHZvaWQgMD09PW4pbj10Lmxlbmd0aDtlbHNlIGlmKG48PTB8fG4+dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbmNvcnJlY3QgYXhpcyB0byBpbmNyZW1lbnQgb24iKTtmb3IobGV0IHI9bi0xO3I+PTAmJihlW3JdKyssIShlW3JdPHRbcl0pKTstLXIpZVtyXT0wO31zdGF0aWMgY2FsY3VsYXRlUmVzaGFwZWREaW1zKGUsdCl7aWYoMD09PXQubGVuZ3RoKXtpZigwPT09ZS5sZW5ndGh8fDE9PT1kLnNpemUoZSkpcmV0dXJuIFtdO3Rocm93IG5ldyBFcnJvcigiY2Fubm90IHJlc2hhcGUgdG8gYSBzY2FsYXIgVGVuc29yIil9Y29uc3Qgbj10Lmxlbmd0aCxyPW5ldyBBcnJheShuKTtsZXQgbz0tMSxpPTE7Zm9yKGxldCBzPTA7czxuO3MrKyl7aWYodFtzXTwtMSl0aHJvdyBuZXcgRXJyb3IoImEgZGltZW5zaW9uIGluIHNoYXBlIGhpbnRzIGNhbm5vdCBiZSBsZXNzIHRoYW4gLTEiKTtpZigtMT09PXRbc10pe2lmKC0xIT09byl0aHJvdyBuZXcgRXJyb3IoImF0IG1vc3Qgb25lIGRpbWVuc2lvbiBpbiBzaGFwZSBoaW50cyBjYW4gYmUgLTEiKTtvPXM7fWVsc2Uge2lmKDA9PT10W3NdKXtpZihzPj1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRoZSBkaW1lbnNpb24gd2l0aCB2YWx1ZSB6ZXJvIGV4Y2VlZHMgdGhlIGRpbWVuc2lvbiBzaXplIG9mIHRoZSBpbnB1dCB0ZW5zb3IiKTtyW3NdPWVbc107fWVsc2UgcltzXT10W3NdO2kqPXJbc107fX1jb25zdCBzPWQuc2l6ZShlKTtpZigtMSE9PW8pe2lmKHMlaSE9MCl0aHJvdyBuZXcgRXJyb3IoYHRoZSBpbnB1dCB0ZW5zb3IgY2Fubm90IGJlIHJlc2hhcGVkIHRvIHRoZSByZXF1ZXN0ZWQgc2hhcGUuIElucHV0IHNoYXBlOiBbJHtlfV0gT3V0cHV0IHNoYXBlOiBbJHt0fV1gKTtyW29dPXMvaTt9ZWxzZSBpZihpIT09cyl0aHJvdyBuZXcgRXJyb3IoInJlc2hhcGVkRGltcyBhbmQgb3JpZ2luYWxEaW1zIGRvbid0IGhhdmUgbWF0Y2hpbmcgc2l6ZXMiKTtyZXR1cm4gcn1zdGF0aWMgc29ydEJhc2VkT25QZXJtKGUsdCl7cmV0dXJuIHQ/dC5tYXAoKHQ9PmVbdF0pKTplLnNsaWNlKCkucmV2ZXJzZSgpfXN0YXRpYyBwYWRTaGFwZShlLHQpe2NvbnN0IG49ZS5sZW5ndGg7cmV0dXJuIGUubWFwKCgoZSxyKT0+ZSt0W3JdK3RbcituXSkpfXN0YXRpYyBhcmVFcXVhbChlLHQpe3JldHVybiBlLmxlbmd0aD09PXQubGVuZ3RoJiZlLmV2ZXJ5KCgoZSxuKT0+ZT09PXRbbl0pKX1zdGF0aWMgdmFsaWRhdGVEaW1zQW5kQ2FsY1NpemUoZSl7aWYoZS5sZW5ndGg+Nil0aHJvdyBuZXcgVHlwZUVycm9yKCJPbmx5IHJhbmsgMCB0byA2IGlzIHN1cHBvcnRlZCBmb3IgdGVuc29yIHNoYXBlLiIpO2xldCB0PTE7Zm9yKGNvbnN0IG4gb2YgZSl7aWYoIU51bWJlci5pc0ludGVnZXIobikpdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBzaGFwZTogJHtufSBpcyBub3QgYW4gaW50ZWdlcmApO2lmKG48MHx8bj4yMTQ3NDgzNjQ3KXRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgc2hhcGU6IGxlbmd0aCAke259IGlzIG5vdCBhbGxvd2VkYCk7dCo9bjt9cmV0dXJuIHR9c3RhdGljIGZsYXR0ZW5TaGFwZShlLHQpe3Q8MCYmKHQrPWUubGVuZ3RoKTtjb25zdCBuPWUucmVkdWNlKCgoZSx0KT0+ZSp0KSwxKSxyPWUuc2xpY2UodCkucmVkdWNlKCgoZSx0KT0+ZSp0KSwxKTtyZXR1cm4gW24vcixyXX1zdGF0aWMgc3F1ZWV6ZVNoYXBlKGUsdCl7Y29uc3Qgbj1uZXcgQXJyYXk7dD1kLm5vcm1hbGl6ZUF4ZXModCxlLmxlbmd0aCk7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspe2NvbnN0IG89dC5pbmRleE9mKHIpPj0wO2lmKG8mJjEhPT1lW3JdKXRocm93IG5ldyBFcnJvcigic3F1ZWV6ZSBhbiBheGlzIG9mIHNpemUgZGlmZmVyZW50IHRoYW4gMSIpOygwPT09dC5sZW5ndGgmJmVbcl0+MXx8dC5sZW5ndGg+MCYmIW8pJiZuLnB1c2goZVtyXSk7fXJldHVybiBufXN0YXRpYyB1bnNxdWVlemVTaGFwZShlLHQpe2NvbnN0IG49bmV3IEFycmF5KGUubGVuZ3RoK3QubGVuZ3RoKTtuLmZpbGwoMCk7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2NvbnN0IHI9ZC5ub3JtYWxpemVBeGlzKHRbZV0sbi5sZW5ndGgpO2lmKHI+PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiJ2F4ZXMnIGhhcyBhbiBvdXQgb2YgcmFuZ2UgYXhpcyIpO2lmKDAhPT1uW3JdKXRocm93IG5ldyBFcnJvcigiJ2F4ZXMnIGhhcyBhIGR1cGxpY2F0ZSBheGlzIik7bltyXT0xO31sZXQgcj0wO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKTA9PT1uW3RdJiYoblt0XT1lW3IrK10pO2lmKHIhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRoZSB1bnNxdWVlemVkIGRpbWVuc2lvbiBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQiKTtyZXR1cm4gbn19dC5TaGFwZVV0aWw9ZCx0Lk1hdGhVdGlsPWNsYXNze3N0YXRpYyBzcXIoZSx0LG4scixvKXtpZihyPDB8fHI+PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic291cmNlSW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKG48MHx8bj49ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXRJbmRleCBvdXQgb2YgYm91bmRzIik7aWYocitvPnQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic291cmNlIGluZGljZXMgdG8gYmUgY29waWVkIGFyZSBvdXRzaWRlIGJvdW5kcyIpO2lmKG4rbz5lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRhcmdldCBhcnJheSBpcyB0b28gc21hbGwgdG8gaG9sZCByZXN1bHQiKTtmb3IobGV0IGk9MDtpPG87aSsrKWVbbitpXSs9TWF0aC5wb3codFtyK2ldLDIpO31zdGF0aWMgYXhweShlLHQsbixyLG8saSl7aWYocjwwfHxyPj10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZUluZGV4IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0SW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKHIrbz50Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZSBpbmRpY2VzIHRvIGJlIGNvcGllZCBhcmUgb3V0c2lkZSBib3VuZHMiKTtpZihuK28+ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXQgYXJyYXkgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVzdWx0Iik7Zm9yKGxldCBzPTA7czxvO3MrKyllW24rc10rPWkqdFtyK3NdO31zdGF0aWMgcG93eChlLHQsbixyLG8saSl7aWYocjwwfHxyPj10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZUluZGV4IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0SW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKHIrbz50Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZSBpbmRpY2VzIHRvIGJlIGNvcGllZCBhcmUgb3V0c2lkZSBib3VuZHMiKTtpZihuK28+ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXQgYXJyYXkgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVzdWx0Iik7Zm9yKGxldCBzPTA7czxvO3MrKyllW24rc109TWF0aC5wb3codFtyK3NdLGkpO31zdGF0aWMgbXVsKGUsdCxuLHIsbyl7aWYocjwwfHxyPj10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZUluZGV4IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0SW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKHIrbz50Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZSBpbmRpY2VzIHRvIGJlIGNvcGllZCBhcmUgb3V0c2lkZSBib3VuZHMiKTtpZihuK28+ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXQgYXJyYXkgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVzdWx0Iik7Zm9yKGxldCBpPTA7aTxvO2krKyllW24raV09dFtyK2ldKmVbbitpXTt9fTtjbGFzcyBme3N0YXRpYyBzcGxpdFNoYXBlKGUsdCxuLHIpe2lmKDA9PT1uLmxlbmd0aCl7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJuZWVkIHRvIGtub3cgbnVtYmVyIG9mIG91dHB1dHMgd2hlbiB0aGUgJ3NwbGl0JyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCIpO2YuZGV0ZXJtaW5lU3BsaXQoZVt0XSxyLG4pO31jb25zdCBvPVtdLGk9WzBdO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7KytyKXswIT09ciYmaS5wdXNoKGlbci0xXStuW3ItMV0pO2NvbnN0IHM9ZS5zbGljZSgpO3NbdF09bltyXSxvLnB1c2gocyk7fXJldHVybiBbbyxpXX1zdGF0aWMgZGV0ZXJtaW5lU3BsaXQoZSx0LG4pe2lmKGUldCE9MCl0aHJvdyBuZXcgRXJyb3IoImNhbm5vdCBzcGxpdCB0ZW5zb3IgdG8gZXF1YWwgc2l6ZWQgcGFydHMiKTtmb3IobGV0IHI9MDtyPHQ7KytyKW4ucHVzaChlL3QpO319dC5TcGxpdFV0aWw9ZjtjbGFzcyBoe3N0YXRpYyBjYWxjUmVkdWNlKGUsdCxuLHIsbyl7Y29uc3QgaT1lLmRpbXMuc2xpY2UoMCk7MD09PXQubGVuZ3RoJiZpLmZvckVhY2goKChlLG4pPT50LnB1c2gobikpKTtjb25zdCBzPWguY2FsY1JlZHVjZVNoYXBlKGksdCwhMCksdT1kLnNpemUocyksYz1uZXcgYS5UZW5zb3IocyxlLnR5cGUpLHA9ZC5jb21wdXRlU3RyaWRlcyhzKSxmPWQuY29tcHV0ZVN0cmlkZXMoaSksZz1uZXcgQXJyYXkoaS5sZW5ndGgpO2ZvcihsZXQgbj0wO248dTtuKyspe2NvbnN0IHM9ZC5vZmZzZXRUb0luZGljZXMobixwKTtsLmZpbGxJbmRleChzLGksZyksYy5zZXQocyxoLmNhbGNSZWR1Y2VCeUF4aXMoZS5udW1iZXJEYXRhLHQsaSwwLGQuaW5kaWNlc1RvT2Zmc2V0KGcsZikscixvKSk7fXJldHVybiBuP2M6bmV3IGEuVGVuc29yKGguY2FsY1JlZHVjZVNoYXBlKGksdCxuKSxjLnR5cGUsdm9pZCAwLHZvaWQgMCxjLmRhdGEsYy5kYXRhSWQpfXN0YXRpYyBjYWxjUmVkdWNlQnlBeGlzKGUsdCxuLHIsbyxpLHMpe2xldCBhPTA7aWYocj49dC5sZW5ndGgpcmV0dXJuIGkoZVtvXSk7Y29uc3QgdT10W3JdLGw9dT49bi5sZW5ndGg/MTpkLnNpemUobi5zbGljZSh1KzEpKTtmb3IobGV0IGM9MDtjPG5bdV07YysrKWE9MD09PWM/aC5jYWxjUmVkdWNlQnlBeGlzKGUsdCxuLHIrMSxvLGkscyk6cyhhLGguY2FsY1JlZHVjZUJ5QXhpcyhlLHQsbixyKzEsbyxpLHMpKSxvKz1sO3JldHVybiBhfXN0YXRpYyBjYWxjUmVkdWNlU2hhcGUoZSx0LG4pe2NvbnN0IHI9ZS5zbGljZSgpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXJbdFtlXV09bj8xOjA7cmV0dXJuIHIuZmlsdGVyKChlPT4wIT09ZSkpfX10LlJlZHVjZVV0aWw9aDtjbGFzcyBne3N0YXRpYyBhZGp1c3RQb29sQXR0cmlidXRlcyhlLHQsbixyLG8saSl7aWYoIWUmJm4ubGVuZ3RoIT09dC5sZW5ndGgtMil0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBvZiBzcGVjaWZpZWQga2VybmVsIHNoYXBlcyBzaG91bGQgYmUgMiBsZXNzIHRoYW4gbGVuZ3RoIG9mIGlucHV0IGRpbWVuc2lvbnMiKTtpZihlKWZvcihsZXQgZT0wO2U8dC5sZW5ndGgtMjtlKyspZT49bi5sZW5ndGg/bi5wdXNoKHRbZSsyXSk6bltlXT10W2UrMl07Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspaWYoZTxyLmxlbmd0aCl7aWYocltlXTwwKXRocm93IG5ldyBFcnJvcigic3RyaWRlcyBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEiKX1lbHNlIHIucHVzaCgxKTtmb3IobGV0IGU9MDtlPG4ubGVuZ3RoO2UrKylpZihlPG8ubGVuZ3RoKXtpZihvW2VdPDApdGhyb3cgbmV3IEVycm9yKCJkaWxhdGlvbnMgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIil9ZWxzZSBvLnB1c2goMSk7Zm9yKGxldCBlPTA7ZTwyKm4ubGVuZ3RoO2UrKylpZihlPGkubGVuZ3RoKXtpZihpW2VdPDApdGhyb3cgbmV3IEVycm9yKCJwYWQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIil9ZWxzZSBpLnB1c2goMCk7Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspe2lmKG5bZV08PTApdGhyb3cgbmV3IEVycm9yKCJrZXJuZWwgc2hhcGVzIG5lZWQgdG8gYmUgZ3JlYXRlciB0aGFuIDAiKTtpZihpW2VdPj1uW2VdfHxpW2Urbi5sZW5ndGhdPj1uW2VdKXRocm93IG5ldyBFcnJvcigicGFkcyBzaG91bGQgYmUgc21hbGxlciB0aGFuIGtlcm5lbCIpfX1zdGF0aWMgYWRqdXN0UGFkc0Jhc2VkT25BdXRvUGFkKGUsdCxuLHIsbyxpKXtpZihpKXtpZihvLmxlbmd0aCE9PTIqKGUubGVuZ3RoLTIpKXRocm93IG5ldyBFcnJvcigibGVuZ3RoIG9mIHBhZHMgc2hvdWxkIGJlIHR3aWNlIHRoZSBsZW5ndGggb2YgZGF0YSBkaW1lbnNpb25zIik7aWYodC5sZW5ndGghPT1lLmxlbmd0aC0yKXRocm93IG5ldyBFcnJvcigibGVuZ3RoIG9mIHN0cmlkZXMgc2hvdWxkIGJlIHRoZSBsZW5ndGggb2YgZGF0YSBkaW1lbnNpb25zIik7aWYoci5sZW5ndGghPT1lLmxlbmd0aC0yKXRocm93IG5ldyBFcnJvcigibGVuZ3RoIG9mIGtlcm5lbCBzaGFwZXMgc2hvdWxkIGJlIHRoZSBsZW5ndGggb2YgZGF0YSBkaW1lbnNpb25zIik7Zm9yKGxldCBzPTA7czxlLmxlbmd0aC0yO3MrKylnLmFkanVzdFBhZEFuZFJldHVyblNoYXBlKGVbcysyXSx0W3NdLG5bc10scltzXSxvLHMscytlLmxlbmd0aC0yLGkpO319c3RhdGljIGNvbXB1dGVQb29sT3V0cHV0U2hhcGUoZSx0LG4scixvLGkscyl7aWYodC5sZW5ndGg8PTApdGhyb3cgbmV3IEVycm9yKCJpbnB1dCBzaGFwZSBtdXN0IGJlIG9mIHNpemUgZ3JlYXRlciB0aGFuIDAiKTtjb25zdCBhPVt0WzBdLHRbMV1dO3JldHVybiBnLmNvbXB1dGVTaGFwZUhlbHBlcihlLHQsYSxuLHIsbyxpLHMpLGF9c3RhdGljIGNvbXB1dGVDb252T3V0cHV0U2hhcGUoZSx0LG4scixvLGkscyl7aWYoZS5sZW5ndGg8PTB8fHQubGVuZ3RoPD0wKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBpbnB1dCB0ZW5zb3IgZGltcyBvciBpbnZhbGlkIGZpbHRlciB0ZW5zb3IgZGltcyIpO2NvbnN0IGE9W2VbMF0sdFswXV07cmV0dXJuIGcuY29tcHV0ZVNoYXBlSGVscGVyKCExLGUsYSxuLHIsbyxpLHMpLGF9c3RhdGljIGNvbXB1dGVTaGFwZUhlbHBlcihlLHQsbixyLG8saSxzLGEpe2lmKGUpZm9yKGxldCBlPTA7ZTx0Lmxlbmd0aC0yO2UrKyluLnB1c2goMSk7ZWxzZSBmb3IobGV0IGU9MDtlPHQubGVuZ3RoLTI7ZSsrKW4ucHVzaChnLmFkanVzdFBhZEFuZFJldHVyblNoYXBlKHRbZSsyXSxyW2VdLG9bZV0saVtlXSxzLGUsZSt0Lmxlbmd0aC0yLGEpKTt9c3RhdGljIGFkanVzdFBhZEFuZFJldHVyblNoYXBlKGUsdCxuLHIsbyxpLHMsYSl7Y29uc3QgdT1uKihyLTEpKzE7aWYoIWF8fCJOT1RTRVQiPT09YSlyZXR1cm4gTWF0aC5mbG9vcigoZStvW2ldK29bc10tdSkvdCsxKTtzd2l0Y2goYSl7Y2FzZSJWQUxJRCI6cmV0dXJuIG9baV09MCxvW3NdPTAsTWF0aC5mbG9vcigoZS11KS90KzEpO2Nhc2UiU0FNRV9MT1dFUiI6Y2FzZSJTQU1FX1VQUEVSIjppZigxIT09bil0aHJvdyBuZXcgRXJyb3IoIkRpbGF0aW9uIG5vdCBzdXBwb3J0ZWQgZm9yIFNBTUVfVVBQRVIgb3IgU0FNRV9MT1dFUiIpO3tjb25zdCBuPSgoZSt0LTEpL3QtMSkqdCtyLWU7cmV0dXJuIG9baV09IlNBTUVfTE9XRVIiPT09YT9NYXRoLmZsb29yKChuKzEpLzIpOk1hdGguZmxvb3Iobi8yKSxvW3NdPW4tb1tpXSxNYXRoLmZsb29yKChlK24tcikvdCsxKX1kZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgQXV0b1BhZCB0eXBlIil9fX10LlBvb2xDb252VXRpbD1nLHQuTUlOX0NMSVA9LTM0MDI4MjM0NjYzODUyODg2ZTIyLHQuTUFYX0NMSVA9MzQwMjgyMzQ2NjM4NTI4ODZlMjIsdC5kZWNvZGVVdGY4U3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiAobmV3IFRleHREZWNvZGVyKS5kZWNvZGUoZSl9O30sODQwODooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnZlcnNpb249dm9pZCAwLHQudmVyc2lvbj0iMS4xNi4zIjt9LDk1NDQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLG89dGhpcyYmdGhpcy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pO3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtvJiYhKCJnZXQiaW4gbz8hdC5fX2VzTW9kdWxlOm8ud3JpdGFibGV8fG8uY29uZmlndXJhYmxlKXx8KG89e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixvKTt9OmZ1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pLGVbcl09dFtuXTt9KSxpPXRoaXMmJnRoaXMuX19zZXRNb2R1bGVEZWZhdWx0fHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihlLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSk7fTpmdW5jdGlvbihlLHQpe2UuZGVmYXVsdD10O30pLHM9dGhpcyYmdGhpcy5fX2ltcG9ydFN0YXJ8fGZ1bmN0aW9uKGUpe2lmKGUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgdD17fTtpZihudWxsIT1lKWZvcih2YXIgbiBpbiBlKSJkZWZhdWx0IiE9PW4mJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZvKHQsZSxuKTtyZXR1cm4gaSh0LGUpLHR9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmVuZFByb2ZpbGluZz10LnJ1bj10LnJlbGVhc2VTZXNzaW9uPXQuY3JlYXRlU2Vzc2lvbj10LmNyZWF0ZVNlc3Npb25GaW5hbGl6ZT10LmNyZWF0ZVNlc3Npb25BbGxvY2F0ZT10LmluaXRpYWxpemVSdW50aW1lPXQuaW5pdGlhbGl6ZVdlYkFzc2VtYmx5SW5zdGFuY2U9dm9pZCAwO2NvbnN0IGE9bigyMjM1KSx1PXMobigxMjU5KSksbD1uKDI2MyksYz0oKT0+ISFhLmVudi53YXNtLnByb3h5JiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50O2xldCBwLGQsZixoPSExLGc9ITEsYj0hMTtjb25zdCBtPVtdLHk9W10sdj1bXSxfPVtdLHc9W10sVD1bXSx4PSgpPT57aWYoaHx8IWd8fGJ8fCFwKXRocm93IG5ldyBFcnJvcigid29ya2VyIG5vdCByZWFkeSIpfSxPPWU9Pntzd2l0Y2goZS5kYXRhLnR5cGUpe2Nhc2UiaW5pdC13YXNtIjpoPSExLGUuZGF0YS5lcnI/KGI9ITAsZFsxXShlLmRhdGEuZXJyKSk6KGc9ITAsZFswXSgpKTticmVhaztjYXNlImluaXQtb3J0IjplLmRhdGEuZXJyP2ZbMV0oZS5kYXRhLmVycik6ZlswXSgpO2JyZWFrO2Nhc2UiY3JlYXRlX2FsbG9jYXRlIjplLmRhdGEuZXJyP20uc2hpZnQoKVsxXShlLmRhdGEuZXJyKTptLnNoaWZ0KClbMF0oZS5kYXRhLm91dCk7YnJlYWs7Y2FzZSJjcmVhdGVfZmluYWxpemUiOmUuZGF0YS5lcnI/eS5zaGlmdCgpWzFdKGUuZGF0YS5lcnIpOnkuc2hpZnQoKVswXShlLmRhdGEub3V0KTticmVhaztjYXNlImNyZWF0ZSI6ZS5kYXRhLmVycj92LnNoaWZ0KClbMV0oZS5kYXRhLmVycik6di5zaGlmdCgpWzBdKGUuZGF0YS5vdXQpO2JyZWFrO2Nhc2UicmVsZWFzZSI6ZS5kYXRhLmVycj9fLnNoaWZ0KClbMV0oZS5kYXRhLmVycik6Xy5zaGlmdCgpWzBdKCk7YnJlYWs7Y2FzZSJydW4iOmUuZGF0YS5lcnI/dy5zaGlmdCgpWzFdKGUuZGF0YS5lcnIpOncuc2hpZnQoKVswXShlLmRhdGEub3V0KTticmVhaztjYXNlImVuZC1wcm9maWxpbmciOmUuZGF0YS5lcnI/VC5zaGlmdCgpWzFdKGUuZGF0YS5lcnIpOlQuc2hpZnQoKVswXSgpO319LFM9InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudD9udWxsPT09KHI9bnVsbD09PWRvY3VtZW50fHx2b2lkIDA9PT1kb2N1bWVudD92b2lkIDA6ZG9jdW1lbnQuY3VycmVudFNjcmlwdCl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3JjOnZvaWQgMDt0LmluaXRpYWxpemVXZWJBc3NlbWJseUluc3RhbmNlPWFzeW5jKCk9PntpZihjKCkpe2lmKGcpcmV0dXJuO2lmKGgpdGhyb3cgbmV3IEVycm9yKCJtdWx0aXBsZSBjYWxscyB0byAnaW5pdFdhc20oKScgZGV0ZWN0ZWQuIik7aWYoYil0aHJvdyBuZXcgRXJyb3IoInByZXZpb3VzIGNhbGwgdG8gJ2luaXRXYXNtKCknIGZhaWxlZC4iKTtyZXR1cm4gaD0hMCx2b2lkIDA9PT1hLmVudi53YXNtLndhc21QYXRocyYmUyYmMCE9PVMuaW5kZXhPZigiYmxvYjoiKSYmKGEuZW52Lndhc20ud2FzbVBhdGhzPVMuc3Vic3RyKDAsK1MubGFzdEluZGV4T2YoIi8iKSsxKSksbmV3IFByb21pc2UoKChlLHQpPT57bnVsbD09cHx8cC50ZXJtaW5hdGUoKSxwPW4oODA1MCkuWigpLHAub25tZXNzYWdlPU8sZD1bZSx0XTtjb25zdCByPXt0eXBlOiJpbml0LXdhc20iLGluOmEuZW52Lndhc219O3AucG9zdE1lc3NhZ2Uocik7fSkpfXJldHVybiAoMCwgbC5pbml0aWFsaXplV2ViQXNzZW1ibHkpKGEuZW52Lndhc20pfSx0LmluaXRpYWxpemVSdW50aW1lPWFzeW5jIGU9PntpZihjKCkpcmV0dXJuIHgoKSxuZXcgUHJvbWlzZSgoKHQsbik9PntmPVt0LG5dO2NvbnN0IHI9e3R5cGU6ImluaXQtb3J0IixpbjplfTtwLnBvc3RNZXNzYWdlKHIpO30pKTthd2FpdCB1LmluaXRSdW50aW1lKGUpO30sdC5jcmVhdGVTZXNzaW9uQWxsb2NhdGU9YXN5bmMgZT0+YygpPyh4KCksbmV3IFByb21pc2UoKCh0LG4pPT57bS5wdXNoKFt0LG5dKTtjb25zdCByPXt0eXBlOiJjcmVhdGVfYWxsb2NhdGUiLGluOnttb2RlbDplfX07cC5wb3N0TWVzc2FnZShyLFtlLmJ1ZmZlcl0pO30pKSk6dS5jcmVhdGVTZXNzaW9uQWxsb2NhdGUoZSksdC5jcmVhdGVTZXNzaW9uRmluYWxpemU9YXN5bmMoZSx0KT0+YygpPyh4KCksbmV3IFByb21pc2UoKChuLHIpPT57eS5wdXNoKFtuLHJdKTtjb25zdCBvPXt0eXBlOiJjcmVhdGVfZmluYWxpemUiLGluOnttb2RlbGRhdGE6ZSxvcHRpb25zOnR9fTtwLnBvc3RNZXNzYWdlKG8pO30pKSk6dS5jcmVhdGVTZXNzaW9uRmluYWxpemUoZSx0KSx0LmNyZWF0ZVNlc3Npb249YXN5bmMoZSx0KT0+YygpPyh4KCksbmV3IFByb21pc2UoKChuLHIpPT57di5wdXNoKFtuLHJdKTtjb25zdCBvPXt0eXBlOiJjcmVhdGUiLGluOnttb2RlbDplLG9wdGlvbnM6dH19O3AucG9zdE1lc3NhZ2UobyxbZS5idWZmZXJdKTt9KSkpOnUuY3JlYXRlU2Vzc2lvbihlLHQpLHQucmVsZWFzZVNlc3Npb249YXN5bmMgZT0+e2lmKGMoKSlyZXR1cm4geCgpLG5ldyBQcm9taXNlKCgodCxuKT0+e18ucHVzaChbdCxuXSk7Y29uc3Qgcj17dHlwZToicmVsZWFzZSIsaW46ZX07cC5wb3N0TWVzc2FnZShyKTt9KSk7dS5yZWxlYXNlU2Vzc2lvbihlKTt9LHQucnVuPWFzeW5jKGUsdCxuLHIsbyk9PmMoKT8oeCgpLG5ldyBQcm9taXNlKCgoaSxzKT0+e3cucHVzaChbaSxzXSk7Y29uc3QgYT17dHlwZToicnVuIixpbjp7c2Vzc2lvbklkOmUsaW5wdXRJbmRpY2VzOnQsaW5wdXRzOm4sb3V0cHV0SW5kaWNlczpyLG9wdGlvbnM6b319O3AucG9zdE1lc3NhZ2UoYSx1LmV4dHJhY3RUcmFuc2ZlcmFibGVCdWZmZXJzKG4pKTt9KSkpOnUucnVuKGUsdCxuLHIsbyksdC5lbmRQcm9maWxpbmc9YXN5bmMgZT0+e2lmKGMoKSlyZXR1cm4geCgpLG5ldyBQcm9taXNlKCgodCxuKT0+e1QucHVzaChbdCxuXSk7Y29uc3Qgcj17dHlwZToiZW5kLXByb2ZpbGluZyIsaW46ZX07cC5wb3N0TWVzc2FnZShyKTt9KSk7dS5lbmRQcm9maWxpbmcoZSk7fTt9LDc5MTg6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnNldFJ1bk9wdGlvbnM9dm9pZCAwO2NvbnN0IHI9bigyNjMpLG89bigxNDk3KTt0LnNldFJ1bk9wdGlvbnM9ZT0+e2NvbnN0IHQ9KDAsIHIuZ2V0SW5zdGFuY2UpKCk7bGV0IG49MDtjb25zdCBpPVtdLHM9ZXx8e307dHJ5e2lmKHZvaWQgMD09PShudWxsPT1lP3ZvaWQgMDplLmxvZ1NldmVyaXR5TGV2ZWwpKXMubG9nU2V2ZXJpdHlMZXZlbD0yO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiBlLmxvZ1NldmVyaXR5TGV2ZWx8fCFOdW1iZXIuaXNJbnRlZ2VyKGUubG9nU2V2ZXJpdHlMZXZlbCl8fGUubG9nU2V2ZXJpdHlMZXZlbDwwfHxlLmxvZ1NldmVyaXR5TGV2ZWw+NCl0aHJvdyBuZXcgRXJyb3IoYGxvZyBzZXJ2ZXJpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke2UubG9nU2V2ZXJpdHlMZXZlbH1gKTtpZih2b2lkIDA9PT0obnVsbD09ZT92b2lkIDA6ZS5sb2dWZXJib3NpdHlMZXZlbCkpcy5sb2dWZXJib3NpdHlMZXZlbD0wO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiBlLmxvZ1ZlcmJvc2l0eUxldmVsfHwhTnVtYmVyLmlzSW50ZWdlcihlLmxvZ1ZlcmJvc2l0eUxldmVsKSl0aHJvdyBuZXcgRXJyb3IoYGxvZyB2ZXJib3NpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke2UubG9nVmVyYm9zaXR5TGV2ZWx9YCk7dm9pZCAwPT09KG51bGw9PWU/dm9pZCAwOmUudGVybWluYXRlKSYmKHMudGVybWluYXRlPSExKTtsZXQgcj0wO3JldHVybiB2b2lkIDAhPT0obnVsbD09ZT92b2lkIDA6ZS50YWcpJiYocj0oMCxvLmFsbG9jV2FzbVN0cmluZykoZS50YWcsaSkpLG49dC5fT3J0Q3JlYXRlUnVuT3B0aW9ucyhzLmxvZ1NldmVyaXR5TGV2ZWwscy5sb2dWZXJib3NpdHlMZXZlbCwhIXMudGVybWluYXRlLHIpLDA9PT1uJiYoMCxvLmNoZWNrTGFzdEVycm9yKSgiQ2FuJ3QgY3JlYXRlIHJ1biBvcHRpb25zLiIpLHZvaWQgMCE9PShudWxsPT1lP3ZvaWQgMDplLmV4dHJhKSYmKDAsby5pdGVyYXRlRXh0cmFPcHRpb25zKShlLmV4dHJhLCIiLG5ldyBXZWFrU2V0LCgoZSxyKT0+e2NvbnN0IHM9KDAsby5hbGxvY1dhc21TdHJpbmcpKGUsaSksYT0oMCxvLmFsbG9jV2FzbVN0cmluZykocixpKTswIT09dC5fT3J0QWRkUnVuQ29uZmlnRW50cnkobixzLGEpJiYoMCxvLmNoZWNrTGFzdEVycm9yKShgQ2FuJ3Qgc2V0IGEgcnVuIGNvbmZpZyBlbnRyeTogJHtlfSAtICR7cn0uYCk7fSkpLFtuLGldfWNhdGNoKGUpe3Rocm93IDAhPT1uJiZ0Ll9PcnRSZWxlYXNlUnVuT3B0aW9ucyhuKSxpLmZvckVhY2goKGU9PnQuX2ZyZWUoZSkpKSxlfX07fSw2NjQwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Pbm54cnVudGltZVdlYkFzc2VtYmx5U2Vzc2lvbkhhbmRsZXI9dm9pZCAwO2NvbnN0IHI9bigyODA2KSxvPW4oMjIzNSksaT1uKDI4NTApLHM9big5NTQ0KTtsZXQgYTt0Lk9ubnhydW50aW1lV2ViQXNzZW1ibHlTZXNzaW9uSGFuZGxlcj1jbGFzc3thc3luYyBjcmVhdGVTZXNzaW9uQWxsb2NhdGUoZSl7Y29uc3QgdD1hd2FpdCBmZXRjaChlKTtpZigyMDAhPT10LnN0YXR1cyl0aHJvdyBuZXcgRXJyb3IoYGZhaWxlZCB0byBsb2FkIG1vZGVsOiAke2V9YCk7Y29uc3Qgbj1hd2FpdCB0LmFycmF5QnVmZmVyKCk7cmV0dXJuICgwLCBzLmNyZWF0ZVNlc3Npb25BbGxvY2F0ZSkobmV3IFVpbnQ4QXJyYXkobikpfWFzeW5jIGxvYWRNb2RlbChlLHQpe2lmKGF8fChhd2FpdCgwLCBzLmluaXRpYWxpemVSdW50aW1lKShvLmVudiksYT0hMCksInN0cmluZyI9PXR5cGVvZiBlKWlmKCJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy52ZXJzaW9ucyYmcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKXtjb25zdCBuPWF3YWl0KDAsIGkucHJvbWlzaWZ5KShyLnJlYWRGaWxlKShlKTtbdGhpcy5zZXNzaW9uSWQsdGhpcy5pbnB1dE5hbWVzLHRoaXMub3V0cHV0TmFtZXNdPWF3YWl0KDAsIHMuY3JlYXRlU2Vzc2lvbikobix0KTt9ZWxzZSB7Y29uc3Qgbj1hd2FpdCB0aGlzLmNyZWF0ZVNlc3Npb25BbGxvY2F0ZShlKTtbdGhpcy5zZXNzaW9uSWQsdGhpcy5pbnB1dE5hbWVzLHRoaXMub3V0cHV0TmFtZXNdPWF3YWl0KDAsIHMuY3JlYXRlU2Vzc2lvbkZpbmFsaXplKShuLHQpO31lbHNlIFt0aGlzLnNlc3Npb25JZCx0aGlzLmlucHV0TmFtZXMsdGhpcy5vdXRwdXROYW1lc109YXdhaXQoMCwgcy5jcmVhdGVTZXNzaW9uKShlLHQpO31hc3luYyBkaXNwb3NlKCl7cmV0dXJuICgwLCBzLnJlbGVhc2VTZXNzaW9uKSh0aGlzLnNlc3Npb25JZCl9YXN5bmMgcnVuKGUsdCxuKXtjb25zdCByPVtdLGk9W107T2JqZWN0LmVudHJpZXMoZSkuZm9yRWFjaCgoZT0+e2NvbnN0IHQ9ZVswXSxuPWVbMV0sbz10aGlzLmlucHV0TmFtZXMuaW5kZXhPZih0KTtpZigtMT09PW8pdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGlucHV0ICcke3R9J2ApO3IucHVzaChuKSxpLnB1c2gobyk7fSkpO2NvbnN0IGE9W107T2JqZWN0LmVudHJpZXModCkuZm9yRWFjaCgoZT0+e2NvbnN0IHQ9ZVswXSxuPXRoaXMub3V0cHV0TmFtZXMuaW5kZXhPZih0KTtpZigtMT09PW4pdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG91dHB1dCAnJHt0fSdgKTthLnB1c2gobik7fSkpO2NvbnN0IHU9YXdhaXQoMCwgcy5ydW4pKHRoaXMuc2Vzc2lvbklkLGksci5tYXAoKGU9PltlLnR5cGUsZS5kaW1zLGUuZGF0YV0pKSxhLG4pLGw9e307Zm9yKGxldCBlPTA7ZTx1Lmxlbmd0aDtlKyspbFt0aGlzLm91dHB1dE5hbWVzW2FbZV1dXT1uZXcgby5UZW5zb3IodVtlXVswXSx1W2VdWzJdLHVbZV1bMV0pO3JldHVybiBsfXN0YXJ0UHJvZmlsaW5nKCl7fWVuZFByb2ZpbGluZygpeygwLCBzLmVuZFByb2ZpbGluZykodGhpcy5zZXNzaW9uSWQpO319O30sNzYyMjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuc2V0U2Vzc2lvbk9wdGlvbnM9dm9pZCAwO2NvbnN0IHI9bigyNjMpLG89bigxNDk3KTt0LnNldFNlc3Npb25PcHRpb25zPWU9Pnt2YXIgdCxuLGkscztjb25zdCBhPSgwLCByLmdldEluc3RhbmNlKSgpO2xldCB1PTA7Y29uc3QgbD1bXSxjPWV8fHt9OyhlPT57ZS5leHRyYXx8KGUuZXh0cmE9e30pLGUuZXh0cmEuc2Vzc2lvbnx8KGUuZXh0cmEuc2Vzc2lvbj17fSk7Y29uc3QgdD1lLmV4dHJhLnNlc3Npb247dC51c2Vfb3J0X21vZGVsX2J5dGVzX2RpcmVjdGx5fHwodC51c2Vfb3J0X21vZGVsX2J5dGVzX2RpcmVjdGx5PSIxIiksZS5leGVjdXRpb25Qcm92aWRlcnMmJmUuZXhlY3V0aW9uUHJvdmlkZXJzLnNvbWUoKGU9PiJ3ZWJncHUiPT09KCJzdHJpbmciPT10eXBlb2YgZT9lOmUubmFtZSkpKSYmKGUuZW5hYmxlTWVtUGF0dGVybj0hMSk7fSkoYyk7dHJ5e2NvbnN0IGU9KGU9Pntzd2l0Y2goZSl7Y2FzZSJkaXNhYmxlZCI6cmV0dXJuIDA7Y2FzZSJiYXNpYyI6cmV0dXJuIDE7Y2FzZSJleHRlbmRlZCI6cmV0dXJuIDI7Y2FzZSJhbGwiOnJldHVybiA5OTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZ3JhcGggb3B0aW1pemF0aW9uIGxldmVsOiAke2V9YCl9fSkobnVsbCE9PSh0PWMuZ3JhcGhPcHRpbWl6YXRpb25MZXZlbCkmJnZvaWQgMCE9PXQ/dDoiYWxsIikscD0oZT0+e3N3aXRjaChlKXtjYXNlInNlcXVlbnRpYWwiOnJldHVybiAwO2Nhc2UicGFyYWxsZWwiOnJldHVybiAxO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBleGVjdXRpb24gbW9kZTogJHtlfWApfX0pKG51bGwhPT0obj1jLmV4ZWN1dGlvbk1vZGUpJiZ2b2lkIDAhPT1uP246InNlcXVlbnRpYWwiKSxkPSJzdHJpbmciPT10eXBlb2YgYy5sb2dJZD8oMCxvLmFsbG9jV2FzbVN0cmluZykoYy5sb2dJZCxsKTowLGY9bnVsbCE9PShpPWMubG9nU2V2ZXJpdHlMZXZlbCkmJnZvaWQgMCE9PWk/aToyO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGYpfHxmPDB8fGY+NCl0aHJvdyBuZXcgRXJyb3IoYGxvZyBzZXJ2ZXJpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke2Z9YCk7Y29uc3QgaD1udWxsIT09KHM9Yy5sb2dWZXJib3NpdHlMZXZlbCkmJnZvaWQgMCE9PXM/czowO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGgpfHxoPDB8fGg+NCl0aHJvdyBuZXcgRXJyb3IoYGxvZyB2ZXJib3NpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke2h9YCk7Y29uc3QgZz0ic3RyaW5nIj09dHlwZW9mIGMub3B0aW1pemVkTW9kZWxGaWxlUGF0aD8oMCxvLmFsbG9jV2FzbVN0cmluZykoYy5vcHRpbWl6ZWRNb2RlbEZpbGVQYXRoLGwpOjA7cmV0dXJuIHU9YS5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnMoZSwhIWMuZW5hYmxlQ3B1TWVtQXJlbmEsISFjLmVuYWJsZU1lbVBhdHRlcm4scCwhIWMuZW5hYmxlUHJvZmlsaW5nLDAsZCxmLGgsZyksMD09PXUmJigwLG8uY2hlY2tMYXN0RXJyb3IpKCJDYW4ndCBjcmVhdGUgc2Vzc2lvbiBvcHRpb25zLiIpLGMuZXhlY3V0aW9uUHJvdmlkZXJzJiYoKGUsdCxuKT0+e2Zvcihjb25zdCBpIG9mIHQpe2xldCB0PSJzdHJpbmciPT10eXBlb2YgaT9pOmkubmFtZTtzd2l0Y2godCl7Y2FzZSJ4bm5wYWNrIjp0PSJYTk5QQUNLIjticmVhaztjYXNlIndlYm5uIjppZih0PSJXRUJOTiIsInN0cmluZyIhPXR5cGVvZiBpKXtjb25zdCB0PWk7aWYobnVsbD09dD92b2lkIDA6dC5kZXZpY2VUeXBlKXtjb25zdCBpPSgwLG8uYWxsb2NXYXNtU3RyaW5nKSgiZGV2aWNlVHlwZSIsbikscz0oMCxvLmFsbG9jV2FzbVN0cmluZykodC5kZXZpY2VUeXBlLG4pOzAhPT0oMCxyLmdldEluc3RhbmNlKSgpLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnkoZSxpLHMpJiYoMCxvLmNoZWNrTGFzdEVycm9yKShgQ2FuJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6ICdkZXZpY2VUeXBlJyAtICR7dC5kZXZpY2VUeXBlfS5gKTt9aWYobnVsbD09dD92b2lkIDA6dC5wb3dlclByZWZlcmVuY2Upe2NvbnN0IGk9KDAsby5hbGxvY1dhc21TdHJpbmcpKCJwb3dlclByZWZlcmVuY2UiLG4pLHM9KDAsby5hbGxvY1dhc21TdHJpbmcpKHQucG93ZXJQcmVmZXJlbmNlLG4pOzAhPT0oMCxyLmdldEluc3RhbmNlKSgpLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnkoZSxpLHMpJiYoMCxvLmNoZWNrTGFzdEVycm9yKShgQ2FuJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6ICdwb3dlclByZWZlcmVuY2UnIC0gJHt0LnBvd2VyUHJlZmVyZW5jZX0uYCk7fX1icmVhaztjYXNlIndlYmdwdSI6dD0iSlMiO2JyZWFrO2Nhc2Uid2FzbSI6Y2FzZSJjcHUiOmNvbnRpbnVlO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBub3Qgc3VwcG9ydGVkIGV4ZWN1dGlvbiBwcm92aWRlcjogJHt0fWApfWNvbnN0IHM9KDAsby5hbGxvY1dhc21TdHJpbmcpKHQsbik7MCE9PSgwLHIuZ2V0SW5zdGFuY2UpKCkuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyKGUscykmJigwLG8uY2hlY2tMYXN0RXJyb3IpKGBDYW4ndCBhcHBlbmQgZXhlY3V0aW9uIHByb3ZpZGVyOiAke3R9LmApO319KSh1LGMuZXhlY3V0aW9uUHJvdmlkZXJzLGwpLHZvaWQgMCE9PWMuZXh0cmEmJigwLG8uaXRlcmF0ZUV4dHJhT3B0aW9ucykoYy5leHRyYSwiIixuZXcgV2Vha1NldCwoKGUsdCk9Pntjb25zdCBuPSgwLG8uYWxsb2NXYXNtU3RyaW5nKShlLGwpLHI9KDAsby5hbGxvY1dhc21TdHJpbmcpKHQsbCk7MCE9PWEuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeSh1LG4scikmJigwLG8uY2hlY2tMYXN0RXJyb3IpKGBDYW4ndCBzZXQgYSBzZXNzaW9uIGNvbmZpZyBlbnRyeTogJHtlfSAtICR7dH0uYCk7fSkpLFt1LGxdfWNhdGNoKGUpe3Rocm93IDAhPT11JiZhLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnModSksbC5mb3JFYWNoKChlPT5hLl9mcmVlKGUpKSksZX19O30sNzkxNzooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmxvZ0xldmVsU3RyaW5nVG9FbnVtPXQudGVuc29yVHlwZVRvVHlwZWRBcnJheUNvbnN0cnVjdG9yPXQuZ2V0VGVuc29yRWxlbWVudFNpemU9dC50ZW5zb3JEYXRhVHlwZUVudW1Ub1N0cmluZz10LnRlbnNvckRhdGFUeXBlU3RyaW5nVG9FbnVtPXZvaWQgMCx0LnRlbnNvckRhdGFUeXBlU3RyaW5nVG9FbnVtPWU9Pntzd2l0Y2goZSl7Y2FzZSJpbnQ4IjpyZXR1cm4gMztjYXNlInVpbnQ4IjpyZXR1cm4gMjtjYXNlImJvb2wiOnJldHVybiA5O2Nhc2UiaW50MTYiOnJldHVybiA1O2Nhc2UidWludDE2IjpyZXR1cm4gNDtjYXNlImludDMyIjpyZXR1cm4gNjtjYXNlInVpbnQzMiI6cmV0dXJuIDEyO2Nhc2UiZmxvYXQxNiI6cmV0dXJuIDEwO2Nhc2UiZmxvYXQzMiI6cmV0dXJuIDE7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gMTE7Y2FzZSJzdHJpbmciOnJldHVybiA4O2Nhc2UiaW50NjQiOnJldHVybiA3O2Nhc2UidWludDY0IjpyZXR1cm4gMTM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGRhdGEgdHlwZTogJHtlfWApfX0sdC50ZW5zb3JEYXRhVHlwZUVudW1Ub1N0cmluZz1lPT57c3dpdGNoKGUpe2Nhc2UgMzpyZXR1cm4gImludDgiO2Nhc2UgMjpyZXR1cm4gInVpbnQ4IjtjYXNlIDk6cmV0dXJuICJib29sIjtjYXNlIDU6cmV0dXJuICJpbnQxNiI7Y2FzZSA0OnJldHVybiAidWludDE2IjtjYXNlIDY6cmV0dXJuICJpbnQzMiI7Y2FzZSAxMjpyZXR1cm4gInVpbnQzMiI7Y2FzZSAxMDpyZXR1cm4gImZsb2F0MTYiO2Nhc2UgMTpyZXR1cm4gImZsb2F0MzIiO2Nhc2UgMTE6cmV0dXJuICJmbG9hdDY0IjtjYXNlIDg6cmV0dXJuICJzdHJpbmciO2Nhc2UgNzpyZXR1cm4gImludDY0IjtjYXNlIDEzOnJldHVybiAidWludDY0IjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAke2V9YCl9fSx0LmdldFRlbnNvckVsZW1lbnRTaXplPWU9Plt2b2lkIDAsNCwxLDEsMiwyLDQsOCx2b2lkIDAsMSwyLDgsNCw4LHZvaWQgMCx2b2lkIDAsdm9pZCAwXVtlXSx0LnRlbnNvclR5cGVUb1R5cGVkQXJyYXlDb25zdHJ1Y3Rvcj1lPT57c3dpdGNoKGUpe2Nhc2UiZmxvYXQxNiI6Y2FzZSJ1aW50MTYiOnJldHVybiBVaW50MTZBcnJheTtjYXNlImZsb2F0MzIiOnJldHVybiBGbG9hdDMyQXJyYXk7Y2FzZSJ1aW50OCI6Y2FzZSJib29sIjpyZXR1cm4gVWludDhBcnJheTtjYXNlImludDgiOnJldHVybiBJbnQ4QXJyYXk7Y2FzZSJpbnQxNiI6cmV0dXJuIEludDE2QXJyYXk7Y2FzZSJpbnQzMiI6cmV0dXJuIEludDMyQXJyYXk7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gRmxvYXQ2NEFycmF5O2Nhc2UidWludDMyIjpyZXR1cm4gVWludDMyQXJyYXk7Y2FzZSJpbnQ2NCI6cmV0dXJuIEJpZ0ludDY0QXJyYXk7Y2FzZSJ1aW50NjQiOnJldHVybiBCaWdVaW50NjRBcnJheTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdHlwZTogJHtlfWApfX0sdC5sb2dMZXZlbFN0cmluZ1RvRW51bT1lPT57c3dpdGNoKGUpe2Nhc2UidmVyYm9zZSI6cmV0dXJuIDA7Y2FzZSJpbmZvIjpyZXR1cm4gMTtjYXNlIndhcm5pbmciOnJldHVybiAyO2Nhc2UiZXJyb3IiOnJldHVybiAzO2Nhc2UiZmF0YWwiOnJldHVybiA0O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBsb2dnaW5nIGxldmVsOiAke2V9YCl9fTt9LDEyNTk6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmV4dHJhY3RUcmFuc2ZlcmFibGVCdWZmZXJzPXQuZW5kUHJvZmlsaW5nPXQucnVuPXQucmVsZWFzZVNlc3Npb249dC5jcmVhdGVTZXNzaW9uPXQuY3JlYXRlU2Vzc2lvbkZpbmFsaXplPXQuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlPXQuaW5pdFJ1bnRpbWU9dm9pZCAwO2NvbnN0IHI9big3OTE4KSxvPW4oNzYyMiksaT1uKDc5MTcpLHM9bigyNjMpLGE9bigxNDk3KTt0LmluaXRSdW50aW1lPWFzeW5jIGU9Pnt2YXIgdCxuO3Q9ZS53YXNtLm51bVRocmVhZHMsbj0oMCwgaS5sb2dMZXZlbFN0cmluZ1RvRW51bSkoZS5sb2dMZXZlbCksMCE9PSgwLCBzLmdldEluc3RhbmNlKSgpLl9PcnRJbml0KHQsbikmJigwLCBhLmNoZWNrTGFzdEVycm9yKSgiQ2FuJ3QgaW5pdGlhbGl6ZSBvbm54cnVudGltZS4iKTt9O2NvbnN0IHU9bmV3IE1hcDt0LmNyZWF0ZVNlc3Npb25BbGxvY2F0ZT1lPT57Y29uc3QgdD0oMCwgcy5nZXRJbnN0YW5jZSkoKSxuPXQuX21hbGxvYyhlLmJ5dGVMZW5ndGgpO2lmKDA9PT1uKXRocm93IG5ldyBFcnJvcihgQ2FuJ3QgY3JlYXRlIGEgc2Vzc2lvbi4gZmFpbGVkIHRvIGFsbG9jYXRlIGEgYnVmZmVyIG9mIHNpemUgJHtlLmJ5dGVMZW5ndGh9LmApO3JldHVybiB0LkhFQVBVOC5zZXQoZSxuKSxbbixlLmJ5dGVMZW5ndGhdfSx0LmNyZWF0ZVNlc3Npb25GaW5hbGl6ZT0oZSx0KT0+e2NvbnN0IG49KDAsIHMuZ2V0SW5zdGFuY2UpKCk7bGV0IHI9MCxpPTAsbD1bXTtjb25zdCBjPVtdLHA9W107dHJ5e1tpLGxdPSgwLG8uc2V0U2Vzc2lvbk9wdGlvbnMpKHQpLHI9bi5fT3J0Q3JlYXRlU2Vzc2lvbihlWzBdLGVbMV0saSksMD09PXImJigwLGEuY2hlY2tMYXN0RXJyb3IpKCJDYW4ndCBjcmVhdGUgYSBzZXNzaW9uLiIpO2NvbnN0W2QsZl09KGU9Pntjb25zdCB0PSgwLHMuZ2V0SW5zdGFuY2UpKCksbj10LnN0YWNrU2F2ZSgpO3RyeXtjb25zdCBuPXQuc3RhY2tBbGxvYyg4KTtyZXR1cm4gMCE9PXQuX09ydEdldElucHV0T3V0cHV0Q291bnQoZSxuLG4rNCkmJigwLGEuY2hlY2tMYXN0RXJyb3IpKCJDYW4ndCBnZXQgc2Vzc2lvbiBpbnB1dC9vdXRwdXQgY291bnQuIiksW3QuSEVBUDMyW24vNF0sdC5IRUFQMzJbbi80KzFdXX1maW5hbGx5e3Quc3RhY2tSZXN0b3JlKG4pO319KShyKSxoPVtdLGc9W107Zm9yKGxldCBlPTA7ZTxkO2UrKyl7Y29uc3QgdD1uLl9PcnRHZXRJbnB1dE5hbWUocixlKTswPT09dCYmKDAsYS5jaGVja0xhc3RFcnJvcikoIkNhbid0IGdldCBhbiBpbnB1dCBuYW1lLiIpLGMucHVzaCh0KSxoLnB1c2gobi5VVEY4VG9TdHJpbmcodCkpO31mb3IobGV0IGU9MDtlPGY7ZSsrKXtjb25zdCB0PW4uX09ydEdldE91dHB1dE5hbWUocixlKTswPT09dCYmKDAsYS5jaGVja0xhc3RFcnJvcikoIkNhbid0IGdldCBhbiBvdXRwdXQgbmFtZS4iKSxwLnB1c2godCksZy5wdXNoKG4uVVRGOFRvU3RyaW5nKHQpKTt9cmV0dXJuIHUuc2V0KHIsW3IsYyxwXSksW3IsaCxnXX1jYXRjaChlKXt0aHJvdyBjLmZvckVhY2goKGU9Pm4uX09ydEZyZWUoZSkpKSxwLmZvckVhY2goKGU9Pm4uX09ydEZyZWUoZSkpKSwwIT09ciYmbi5fT3J0UmVsZWFzZVNlc3Npb24ociksZX1maW5hbGx5e24uX2ZyZWUoZVswXSksMCE9PWkmJm4uX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucyhpKSxsLmZvckVhY2goKGU9Pm4uX2ZyZWUoZSkpKTt9fSx0LmNyZWF0ZVNlc3Npb249KGUsbik9Pntjb25zdCByPSgwLCB0LmNyZWF0ZVNlc3Npb25BbGxvY2F0ZSkoZSk7cmV0dXJuICgwLCB0LmNyZWF0ZVNlc3Npb25GaW5hbGl6ZSkocixuKX0sdC5yZWxlYXNlU2Vzc2lvbj1lPT57Y29uc3QgdD0oMCwgcy5nZXRJbnN0YW5jZSkoKSxuPXUuZ2V0KGUpO2lmKCFuKXRocm93IG5ldyBFcnJvcihgY2Fubm90IHJlbGVhc2Ugc2Vzc2lvbi4gaW52YWxpZCBzZXNzaW9uIGlkOiAke2V9YCk7Y29uc3RbcixvLGldPW47by5mb3JFYWNoKChlPT50Ll9PcnRGcmVlKGUpKSksaS5mb3JFYWNoKChlPT50Ll9PcnRGcmVlKGUpKSksdC5fT3J0UmVsZWFzZVNlc3Npb24ociksdS5kZWxldGUoZSk7fSx0LnJ1bj1hc3luYyhlLHQsbixvLGwpPT57Y29uc3QgYz0oMCwgcy5nZXRJbnN0YW5jZSkoKSxwPXUuZ2V0KGUpO2lmKCFwKXRocm93IG5ldyBFcnJvcihgY2Fubm90IHJ1biBpbmZlcmVuY2UuIGludmFsaWQgc2Vzc2lvbiBpZDogJHtlfWApO2NvbnN0W2QsZixoXT1wLGc9dC5sZW5ndGgsYj1vLmxlbmd0aDtsZXQgbT0wLHk9W107Y29uc3Qgdj1bXSxfPVtdO3RyeXtbbSx5XT0oMCxyLnNldFJ1bk9wdGlvbnMpKGwpO2ZvcihsZXQgZT0wO2U8ZztlKyspe2NvbnN0IHQ9bltlXVswXSxyPW5bZV1bMV0sbz1uW2VdWzJdO2xldCBzLHU7aWYoQXJyYXkuaXNBcnJheShvKSl7dT00Km8ubGVuZ3RoLHM9Yy5fbWFsbG9jKHUpLF8ucHVzaChzKTtsZXQgZT1zLzQ7Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kyspe2lmKCJzdHJpbmciIT10eXBlb2Ygb1t0XSl0aHJvdyBuZXcgVHlwZUVycm9yKGB0ZW5zb3IgZGF0YSBhdCBpbmRleCAke3R9IGlzIG5vdCBhIHN0cmluZ2ApO2MuSEVBUFUzMltlKytdPSgwLGEuYWxsb2NXYXNtU3RyaW5nKShvW3RdLF8pO319ZWxzZSB1PW8uYnl0ZUxlbmd0aCxzPWMuX21hbGxvYyh1KSxfLnB1c2gocyksYy5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KG8uYnVmZmVyLG8uYnl0ZU9mZnNldCx1KSxzKTtjb25zdCBsPWMuc3RhY2tTYXZlKCkscD1jLnN0YWNrQWxsb2MoNCpyLmxlbmd0aCk7dHJ5e2xldCBuPXAvNDtyLmZvckVhY2goKGU9PmMuSEVBUDMyW24rK109ZSkpO2NvbnN0IG89Yy5fT3J0Q3JlYXRlVGVuc29yKCgwLGkudGVuc29yRGF0YVR5cGVTdHJpbmdUb0VudW0pKHQpLHMsdSxwLHIubGVuZ3RoKTswPT09byYmKDAsYS5jaGVja0xhc3RFcnJvcikoYENhbid0IGNyZWF0ZSB0ZW5zb3IgZm9yIGlucHV0WyR7ZX1dLmApLHYucHVzaChvKTt9ZmluYWxseXtjLnN0YWNrUmVzdG9yZShsKTt9fWNvbnN0IGU9Yy5zdGFja1NhdmUoKSxzPWMuc3RhY2tBbGxvYyg0KmcpLHU9Yy5zdGFja0FsbG9jKDQqZykscD1jLnN0YWNrQWxsb2MoNCpiKSx3PWMuc3RhY2tBbGxvYyg0KmIpO3RyeXtsZXQgZT1zLzQsbj11LzQscj1wLzQsbD13LzQ7Zm9yKGxldCByPTA7cjxnO3IrKyljLkhFQVBVMzJbZSsrXT12W3JdLGMuSEVBUFUzMltuKytdPWZbdFtyXV07Zm9yKGxldCBlPTA7ZTxiO2UrKyljLkhFQVBVMzJbcisrXT0wLGMuSEVBUFUzMltsKytdPWhbb1tlXV07bGV0IHk9Yy5fT3J0UnVuKGQsdSxzLGcsdyxiLHAsbSk7Y29uc3QgXz1jLmpzZXBSdW5Qcm9taXNlO18mJnZvaWQgMCE9PV8udGhlbiYmKHk9YXdhaXQgXyk7Y29uc3QgVD1bXTswIT09eSYmKDAsYS5jaGVja0xhc3RFcnJvcikoImZhaWxlZCB0byBjYWxsIE9ydFJ1bigpLiIpO2ZvcihsZXQgZT0wO2U8YjtlKyspe2NvbnN0IHQ9Yy5IRUFQVTMyW3AvNCtlXSxuPWMuc3RhY2tTYXZlKCkscj1jLnN0YWNrQWxsb2MoMTYpO2xldCBvLHM9MDt0cnl7eT1jLl9PcnRHZXRUZW5zb3JEYXRhKHQscixyKzQscis4LHIrMTIpLDAhPT15JiYoMCxhLmNoZWNrTGFzdEVycm9yKShgQ2FuJ3QgYWNjZXNzIG91dHB1dCB0ZW5zb3IgZGF0YSBvbiBpbmRleCAke2V9LmApO2xldCBuPXIvNDtjb25zdCB1PWMuSEVBUFUzMltuKytdO3M9Yy5IRUFQVTMyW24rK107Y29uc3QgbD1jLkhFQVBVMzJbbisrXSxwPWMuSEVBUFUzMltuKytdLGQ9W107Zm9yKGxldCBlPTA7ZTxwO2UrKylkLnB1c2goYy5IRUFQVTMyW2wvNCtlXSk7Yy5fT3J0RnJlZShsKTtjb25zdCBmPTA9PT1kLmxlbmd0aD8xOmQucmVkdWNlKCgoZSx0KT0+ZSp0KSk7aWYobz0oMCxpLnRlbnNvckRhdGFUeXBlRW51bVRvU3RyaW5nKSh1KSwic3RyaW5nIj09PW8pe2NvbnN0IGU9W107bGV0IHQ9cy80O2ZvcihsZXQgbj0wO248ZjtuKyspe2NvbnN0IHI9Yy5IRUFQVTMyW3QrK10sbz1uPT09Zi0xP3ZvaWQgMDpjLkhFQVBVMzJbdF0tcjtlLnB1c2goYy5VVEY4VG9TdHJpbmcocixvKSk7fVQucHVzaChbbyxkLGVdKTt9ZWxzZSB7Y29uc3QgZT1uZXcoKDAsaS50ZW5zb3JUeXBlVG9UeXBlZEFycmF5Q29uc3RydWN0b3IpKG8pKShmKTtuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKS5zZXQoYy5IRUFQVTguc3ViYXJyYXkocyxzK2UuYnl0ZUxlbmd0aCkpLFQucHVzaChbbyxkLGVdKTt9fWZpbmFsbHl7Yy5zdGFja1Jlc3RvcmUobiksInN0cmluZyI9PT1vJiZzJiZjLl9mcmVlKHMpLGMuX09ydFJlbGVhc2VUZW5zb3IodCk7fX1yZXR1cm4gVH1maW5hbGx5e2Muc3RhY2tSZXN0b3JlKGUpO319ZmluYWxseXt2LmZvckVhY2goKGU9PmMuX09ydFJlbGVhc2VUZW5zb3IoZSkpKSxfLmZvckVhY2goKGU9PmMuX2ZyZWUoZSkpKSwwIT09bSYmYy5fT3J0UmVsZWFzZVJ1bk9wdGlvbnMobSkseS5mb3JFYWNoKChlPT5jLl9mcmVlKGUpKSk7fX0sdC5lbmRQcm9maWxpbmc9ZT0+e2NvbnN0IHQ9KDAsIHMuZ2V0SW5zdGFuY2UpKCksbj11LmdldChlKTtpZighbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2Vzc2lvbiBpZCIpO2NvbnN0IHI9blswXSxvPXQuX09ydEVuZFByb2ZpbGluZyhyKTswPT09byYmKDAsIGEuY2hlY2tMYXN0RXJyb3IpKCJDYW4ndCBnZXQgYW4gcHJvZmlsZSBmaWxlIG5hbWUuIiksdC5fT3J0RnJlZShvKTt9LHQuZXh0cmFjdFRyYW5zZmVyYWJsZUJ1ZmZlcnM9ZT0+e2NvbnN0IHQ9W107Zm9yKGNvbnN0IG4gb2YgZSl7Y29uc3QgZT1uWzJdOyFBcnJheS5pc0FycmF5KGUpJiZlLmJ1ZmZlciYmdC5wdXNoKGUuYnVmZmVyKTt9cmV0dXJuIHR9O30sMjYzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzJiZ0aGlzLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9bik7dmFyIG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pO28mJiEoImdldCJpbiBvPyF0Ll9fZXNNb2R1bGU6by53cml0YWJsZXx8by5jb25maWd1cmFibGUpfHwobz17ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtuXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLG8pO306ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9biksZVtyXT10W25dO30pLG89dGhpcyYmdGhpcy5fX3NldE1vZHVsZURlZmF1bHR8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KTt9OmZ1bmN0aW9uKGUsdCl7ZS5kZWZhdWx0PXQ7fSksaT10aGlzJiZ0aGlzLl9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24oZSl7aWYoZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciB0PXt9O2lmKG51bGwhPWUpZm9yKHZhciBuIGluIGUpImRlZmF1bHQiIT09biYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJnIodCxlLG4pO3JldHVybiBvKHQsZSksdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZGlzcG9zZT10LmdldEluc3RhbmNlPXQuaW5pdGlhbGl6ZVdlYkFzc2VtYmx5PXZvaWQgMDtjb25zdCBzPWkobig2NDQ5KSksYT1uKDkzMiksdT1uKDM0NzQpO2xldCBsLGM9ITEscD0hMSxkPSExO3QuaW5pdGlhbGl6ZVdlYkFzc2VtYmx5PWFzeW5jIGU9PntpZihjKXJldHVybiBQcm9taXNlLnJlc29sdmUoKTtpZihwKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgY2FsbHMgdG8gJ2luaXRpYWxpemVXZWJBc3NlbWJseSgpJyBkZXRlY3RlZC4iKTtpZihkKXRocm93IG5ldyBFcnJvcigicHJldmlvdXMgY2FsbCB0byAnaW5pdGlhbGl6ZVdlYkFzc2VtYmx5KCknIGZhaWxlZC4iKTtwPSEwO2NvbnN0IHQ9ZS5pbml0VGltZW91dCxyPWUubnVtVGhyZWFkcyxvPWUuc2ltZCxpPXI+MSYmKCgpPT57dHJ5e3JldHVybiAidW5kZWZpbmVkIiE9dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyJiYoInVuZGVmaW5lZCIhPXR5cGVvZiBNZXNzYWdlQ2hhbm5lbCYmKG5ldyBNZXNzYWdlQ2hhbm5lbCkucG9ydDEucG9zdE1lc3NhZ2UobmV3IFNoYXJlZEFycmF5QnVmZmVyKDEpKSxXZWJBc3NlbWJseS52YWxpZGF0ZShuZXcgVWludDhBcnJheShbMCw5NywxMTUsMTA5LDEsMCwwLDAsMSw0LDEsOTYsMCwwLDMsMiwxLDAsNSw0LDEsMywxLDEsMTAsMTEsMSw5LDAsNjUsMCwyNTQsMTYsMiwwLDI2LDExXSkpKX1jYXRjaChlKXtyZXR1cm4gITF9fSkoKSxmPW8mJigoKT0+e3RyeXtyZXR1cm4gV2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNCwxLDk2LDAsMCwzLDIsMSwwLDEwLDMwLDEsMjgsMCw2NSwwLDI1MywxNSwyNTMsMTIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyNTMsMTg2LDEsMjYsMTFdKSl9Y2F0Y2goZSl7cmV0dXJuICExfX0pKCksaD1lLndhc21QYXRocyxnPSJzdHJpbmciPT10eXBlb2YgaD9oOnZvaWQgMCxiPSgoZSx0KT0+dD9lPyJvcnQtd2FzbS1zaW1kLXRocmVhZGVkLndhc20iOiJvcnQtd2FzbS10aHJlYWRlZC53YXNtIjplPyJvcnQtd2FzbS1zaW1kLndhc20iOiJvcnQtd2FzbS53YXNtIikoZixpKSxtPSJvYmplY3QiPT10eXBlb2YgaD9oW2JdOnZvaWQgMDtsZXQgeT0hMTtjb25zdCB2PVtdO2lmKHQ+MCYmdi5wdXNoKG5ldyBQcm9taXNlKChlPT57c2V0VGltZW91dCgoKCk9Pnt5PSEwLGUoKTt9KSx0KTt9KSkpLHYucHVzaChuZXcgUHJvbWlzZSgoKGUsdCk9Pntjb25zdCByPWk/dTphLG89e2xvY2F0ZUZpbGU6KGUsdCk9PmkmJmUuZW5kc1dpdGgoIi53b3JrZXIuanMiKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBCbG9iP1VSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW24oNDE1NCldLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSkpOmUuZW5kc1dpdGgoIi53YXNtIik/bXx8KG51bGwhPWc/Zzp0KStiOnQrZX07aWYoaSlpZigidW5kZWZpbmVkIj09dHlwZW9mIEJsb2Ipby5tYWluU2NyaXB0VXJsT3JCbG9iPXMuam9pbihfX2Rpcm5hbWUsIm9ydC13YXNtLXRocmVhZGVkLmpzIik7ZWxzZSB7Y29uc3QgZT1gdmFyIG9ydFdhc21UaHJlYWRlZD0oZnVuY3Rpb24oKXt2YXIgX3NjcmlwdERpcjtyZXR1cm4gJHtyLnRvU3RyaW5nKCl9fSkoKTtgO28ubWFpblNjcmlwdFVybE9yQmxvYj1uZXcgQmxvYihbZV0se3R5cGU6InRleHQvamF2YXNjcmlwdCJ9KTt9cihvKS50aGVuKCh0PT57cD0hMSxjPSEwLGw9dCxlKCk7fSksKGU9PntwPSExLGQ9ITAsdChlKTt9KSk7fSkpKSxhd2FpdCBQcm9taXNlLnJhY2UodikseSl0aHJvdyBuZXcgRXJyb3IoYFdlYkFzc2VtYmx5IGJhY2tlbmQgaW5pdGlhbGl6aW5nIGZhaWxlZCBkdWUgdG8gdGltZW91dDogJHt0fW1zYCl9LHQuZ2V0SW5zdGFuY2U9KCk9PntpZihjJiZsKXJldHVybiBsO3Rocm93IG5ldyBFcnJvcigiV2ViQXNzZW1ibHkgaXMgbm90IGluaXRpYWxpemVkIHlldC4iKX0sdC5kaXNwb3NlPSgpPT57dmFyIGU7IWN8fHB8fGR8fChwPSEwLG51bGw9PT0oZT1sLlBUaHJlYWQpfHx2b2lkIDA9PT1lfHxlLnRlcm1pbmF0ZUFsbFRocmVhZHMoKSxsPXZvaWQgMCxwPSExLGM9ITEsZD0hMCk7fTt9LDE0OTc6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNoZWNrTGFzdEVycm9yPXQuaXRlcmF0ZUV4dHJhT3B0aW9ucz10LmFsbG9jV2FzbVN0cmluZz12b2lkIDA7Y29uc3Qgcj1uKDI2Myk7dC5hbGxvY1dhc21TdHJpbmc9KGUsdCk9Pntjb25zdCBuPSgwLCByLmdldEluc3RhbmNlKSgpLG89bi5sZW5ndGhCeXRlc1VURjgoZSkrMSxpPW4uX21hbGxvYyhvKTtyZXR1cm4gbi5zdHJpbmdUb1VURjgoZSxpLG8pLHQucHVzaChpKSxpfSx0Lml0ZXJhdGVFeHRyYU9wdGlvbnM9KGUsbixyLG8pPT57aWYoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZSl7aWYoci5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKCJDaXJjdWxhciByZWZlcmVuY2UgaW4gb3B0aW9ucyIpO3IuYWRkKGUpO31PYmplY3QuZW50cmllcyhlKS5mb3JFYWNoKCgoW2UsaV0pPT57Y29uc3Qgcz1uP24rZTplO2lmKCJvYmplY3QiPT10eXBlb2YgaSkoMCwgdC5pdGVyYXRlRXh0cmFPcHRpb25zKShpLHMrIi4iLHIsbyk7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGl8fCJudW1iZXIiPT10eXBlb2YgaSlvKHMsaS50b1N0cmluZygpKTtlbHNlIHtpZigiYm9vbGVhbiIhPXR5cGVvZiBpKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgaGFuZGxlIGV4dHJhIGNvbmZpZyB0eXBlOiAiK3R5cGVvZiBpKTtvKHMsaT8iMSI6IjAiKTt9fSkpO30sdC5jaGVja0xhc3RFcnJvcj1lPT57Y29uc3QgdD0oMCwgci5nZXRJbnN0YW5jZSkoKSxuPXQuc3RhY2tTYXZlKCk7dHJ5e2NvbnN0IG49dC5zdGFja0FsbG9jKDgpO3QuX09ydEdldExhc3RFcnJvcihuLG4rNCk7Y29uc3Qgcj10LkhFQVAzMltuLzRdLG89dC5IRUFQVTMyW24vNCsxXSxpPW8/dC5VVEY4VG9TdHJpbmcobyk6IiI7dGhyb3cgbmV3IEVycm9yKGAke2V9IEVSUk9SX0NPREU6ICR7cn0sIEVSUk9SX01FU1NBR0U6ICR7aX1gKX1maW5hbGx5e3Quc3RhY2tSZXN0b3JlKG4pO319O30sODA1MDooZSx0LG4pPT57bi5kKHQse1o6KCk9Pml9KTt2YXIgcj1uKDY2MTQpLG89bi5uKHIpO2Z1bmN0aW9uIGkoKXtyZXR1cm4gbygpKCcvKiFcbiogT05OWCBSdW50aW1lIFdlYiB2MS4xNi4zXG4qIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4qL1xuKCgpPT57dmFyIGU9ezkxODooZSx0LHIpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnNldFJ1bk9wdGlvbnM9dm9pZCAwO2NvbnN0IG49cigyNjMpLGE9cig0OTcpO3Quc2V0UnVuT3B0aW9ucz1lPT57Y29uc3QgdD0oMCxuLmdldEluc3RhbmNlKSgpO2xldCByPTA7Y29uc3Qgbz1bXSxpPWV8fHt9O3RyeXtpZih2b2lkIDA9PT0obnVsbD09ZT92b2lkIDA6ZS5sb2dTZXZlcml0eUxldmVsKSlpLmxvZ1NldmVyaXR5TGV2ZWw9MjtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2YgZS5sb2dTZXZlcml0eUxldmVsfHwhTnVtYmVyLmlzSW50ZWdlcihlLmxvZ1NldmVyaXR5TGV2ZWwpfHxlLmxvZ1NldmVyaXR5TGV2ZWw8MHx8ZS5sb2dTZXZlcml0eUxldmVsPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgc2VydmVyaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtlLmxvZ1NldmVyaXR5TGV2ZWx9YCk7aWYodm9pZCAwPT09KG51bGw9PWU/dm9pZCAwOmUubG9nVmVyYm9zaXR5TGV2ZWwpKWkubG9nVmVyYm9zaXR5TGV2ZWw9MDtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2YgZS5sb2dWZXJib3NpdHlMZXZlbHx8IU51bWJlci5pc0ludGVnZXIoZS5sb2dWZXJib3NpdHlMZXZlbCkpdGhyb3cgbmV3IEVycm9yKGBsb2cgdmVyYm9zaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtlLmxvZ1ZlcmJvc2l0eUxldmVsfWApO3ZvaWQgMD09PShudWxsPT1lP3ZvaWQgMDplLnRlcm1pbmF0ZSkmJihpLnRlcm1pbmF0ZT0hMSk7bGV0IG49MDtyZXR1cm4gdm9pZCAwIT09KG51bGw9PWU/dm9pZCAwOmUudGFnKSYmKG49KDAsYS5hbGxvY1dhc21TdHJpbmcpKGUudGFnLG8pKSxyPXQuX09ydENyZWF0ZVJ1bk9wdGlvbnMoaS5sb2dTZXZlcml0eUxldmVsLGkubG9nVmVyYm9zaXR5TGV2ZWwsISFpLnRlcm1pbmF0ZSxuKSwwPT09ciYmKDAsYS5jaGVja0xhc3RFcnJvcikoIkNhblwndCBjcmVhdGUgcnVuIG9wdGlvbnMuIiksdm9pZCAwIT09KG51bGw9PWU/dm9pZCAwOmUuZXh0cmEpJiYoMCxhLml0ZXJhdGVFeHRyYU9wdGlvbnMpKGUuZXh0cmEsIiIsbmV3IFdlYWtTZXQsKChlLG4pPT57Y29uc3QgaT0oMCxhLmFsbG9jV2FzbVN0cmluZykoZSxvKSxzPSgwLGEuYWxsb2NXYXNtU3RyaW5nKShuLG8pOzAhPT10Ll9PcnRBZGRSdW5Db25maWdFbnRyeShyLGkscykmJigwLGEuY2hlY2tMYXN0RXJyb3IpKGBDYW5cJ3Qgc2V0IGEgcnVuIGNvbmZpZyBlbnRyeTogJHtlfSAtICR7bn0uYCl9KSksW3Isb119Y2F0Y2goZSl7dGhyb3cgMCE9PXImJnQuX09ydFJlbGVhc2VSdW5PcHRpb25zKHIpLG8uZm9yRWFjaCgoZT0+dC5fZnJlZShlKSkpLGV9fX0sNjIyOihlLHQscik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuc2V0U2Vzc2lvbk9wdGlvbnM9dm9pZCAwO2NvbnN0IG49cigyNjMpLGE9cig0OTcpO3Quc2V0U2Vzc2lvbk9wdGlvbnM9ZT0+e3ZhciB0LHIsbyxpO2NvbnN0IHM9KDAsbi5nZXRJbnN0YW5jZSkoKTtsZXQgdT0wO2NvbnN0IGM9W10sbD1lfHx7fTsoZT0+e2UuZXh0cmF8fChlLmV4dHJhPXt9KSxlLmV4dHJhLnNlc3Npb258fChlLmV4dHJhLnNlc3Npb249e30pO2NvbnN0IHQ9ZS5leHRyYS5zZXNzaW9uO3QudXNlX29ydF9tb2RlbF9ieXRlc19kaXJlY3RseXx8KHQudXNlX29ydF9tb2RlbF9ieXRlc19kaXJlY3RseT0iMSIpLGUuZXhlY3V0aW9uUHJvdmlkZXJzJiZlLmV4ZWN1dGlvblByb3ZpZGVycy5zb21lKChlPT4id2ViZ3B1Ij09PSgic3RyaW5nIj09dHlwZW9mIGU/ZTplLm5hbWUpKSkmJihlLmVuYWJsZU1lbVBhdHRlcm49ITEpfSkobCk7dHJ5e2NvbnN0IGU9KGU9Pntzd2l0Y2goZSl7Y2FzZSJkaXNhYmxlZCI6cmV0dXJuIDA7Y2FzZSJiYXNpYyI6cmV0dXJuIDE7Y2FzZSJleHRlbmRlZCI6cmV0dXJuIDI7Y2FzZSJhbGwiOnJldHVybiA5OTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZ3JhcGggb3B0aW1pemF0aW9uIGxldmVsOiAke2V9YCl9fSkobnVsbCE9PSh0PWwuZ3JhcGhPcHRpbWl6YXRpb25MZXZlbCkmJnZvaWQgMCE9PXQ/dDoiYWxsIiksZj0oZT0+e3N3aXRjaChlKXtjYXNlInNlcXVlbnRpYWwiOnJldHVybiAwO2Nhc2UicGFyYWxsZWwiOnJldHVybiAxO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBleGVjdXRpb24gbW9kZTogJHtlfWApfX0pKG51bGwhPT0ocj1sLmV4ZWN1dGlvbk1vZGUpJiZ2b2lkIDAhPT1yP3I6InNlcXVlbnRpYWwiKSxkPSJzdHJpbmciPT10eXBlb2YgbC5sb2dJZD8oMCxhLmFsbG9jV2FzbVN0cmluZykobC5sb2dJZCxjKTowLHA9bnVsbCE9PShvPWwubG9nU2V2ZXJpdHlMZXZlbCkmJnZvaWQgMCE9PW8/bzoyO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHApfHxwPDB8fHA+NCl0aHJvdyBuZXcgRXJyb3IoYGxvZyBzZXJ2ZXJpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke3B9YCk7Y29uc3QgZz1udWxsIT09KGk9bC5sb2dWZXJib3NpdHlMZXZlbCkmJnZvaWQgMCE9PWk/aTowO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGcpfHxnPDB8fGc+NCl0aHJvdyBuZXcgRXJyb3IoYGxvZyB2ZXJib3NpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke2d9YCk7Y29uc3QgaD0ic3RyaW5nIj09dHlwZW9mIGwub3B0aW1pemVkTW9kZWxGaWxlUGF0aD8oMCxhLmFsbG9jV2FzbVN0cmluZykobC5vcHRpbWl6ZWRNb2RlbEZpbGVQYXRoLGMpOjA7cmV0dXJuIHU9cy5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnMoZSwhIWwuZW5hYmxlQ3B1TWVtQXJlbmEsISFsLmVuYWJsZU1lbVBhdHRlcm4sZiwhIWwuZW5hYmxlUHJvZmlsaW5nLDAsZCxwLGcsaCksMD09PXUmJigwLGEuY2hlY2tMYXN0RXJyb3IpKCJDYW5cJ3QgY3JlYXRlIHNlc3Npb24gb3B0aW9ucy4iKSxsLmV4ZWN1dGlvblByb3ZpZGVycyYmKChlLHQscik9Pntmb3IoY29uc3QgbyBvZiB0KXtsZXQgdD0ic3RyaW5nIj09dHlwZW9mIG8/bzpvLm5hbWU7c3dpdGNoKHQpe2Nhc2UieG5ucGFjayI6dD0iWE5OUEFDSyI7YnJlYWs7Y2FzZSJ3ZWJubiI6aWYodD0iV0VCTk4iLCJzdHJpbmciIT10eXBlb2Ygbyl7Y29uc3QgdD1vO2lmKG51bGw9PXQ/dm9pZCAwOnQuZGV2aWNlVHlwZSl7Y29uc3Qgbz0oMCxhLmFsbG9jV2FzbVN0cmluZykoImRldmljZVR5cGUiLHIpLGk9KDAsYS5hbGxvY1dhc21TdHJpbmcpKHQuZGV2aWNlVHlwZSxyKTswIT09KDAsbi5nZXRJbnN0YW5jZSkoKS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KGUsbyxpKSYmKDAsYS5jaGVja0xhc3RFcnJvcikoYENhblwndCBzZXQgYSBzZXNzaW9uIGNvbmZpZyBlbnRyeTogXCdkZXZpY2VUeXBlXCcgLSAke3QuZGV2aWNlVHlwZX0uYCl9aWYobnVsbD09dD92b2lkIDA6dC5wb3dlclByZWZlcmVuY2Upe2NvbnN0IG89KDAsYS5hbGxvY1dhc21TdHJpbmcpKCJwb3dlclByZWZlcmVuY2UiLHIpLGk9KDAsYS5hbGxvY1dhc21TdHJpbmcpKHQucG93ZXJQcmVmZXJlbmNlLHIpOzAhPT0oMCxuLmdldEluc3RhbmNlKSgpLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnkoZSxvLGkpJiYoMCxhLmNoZWNrTGFzdEVycm9yKShgQ2FuXCd0IHNldCBhIHNlc3Npb24gY29uZmlnIGVudHJ5OiBcJ3Bvd2VyUHJlZmVyZW5jZVwnIC0gJHt0LnBvd2VyUHJlZmVyZW5jZX0uYCl9fWJyZWFrO2Nhc2Uid2ViZ3B1Ijp0PSJKUyI7YnJlYWs7Y2FzZSJ3YXNtIjpjYXNlImNwdSI6Y29udGludWU7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYG5vdCBzdXBwb3J0ZWQgZXhlY3V0aW9uIHByb3ZpZGVyOiAke3R9YCl9Y29uc3QgaT0oMCxhLmFsbG9jV2FzbVN0cmluZykodCxyKTswIT09KDAsbi5nZXRJbnN0YW5jZSkoKS5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXIoZSxpKSYmKDAsYS5jaGVja0xhc3RFcnJvcikoYENhblwndCBhcHBlbmQgZXhlY3V0aW9uIHByb3ZpZGVyOiAke3R9LmApfX0pKHUsbC5leGVjdXRpb25Qcm92aWRlcnMsYyksdm9pZCAwIT09bC5leHRyYSYmKDAsYS5pdGVyYXRlRXh0cmFPcHRpb25zKShsLmV4dHJhLCIiLG5ldyBXZWFrU2V0LCgoZSx0KT0+e2NvbnN0IHI9KDAsYS5hbGxvY1dhc21TdHJpbmcpKGUsYyksbj0oMCxhLmFsbG9jV2FzbVN0cmluZykodCxjKTswIT09cy5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KHUscixuKSYmKDAsYS5jaGVja0xhc3RFcnJvcikoYENhblwndCBzZXQgYSBzZXNzaW9uIGNvbmZpZyBlbnRyeTogJHtlfSAtICR7dH0uYCl9KSksW3UsY119Y2F0Y2goZSl7dGhyb3cgMCE9PXUmJnMuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucyh1KSxjLmZvckVhY2goKGU9PnMuX2ZyZWUoZSkpKSxlfX19LDkxNzooZSx0KT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5sb2dMZXZlbFN0cmluZ1RvRW51bT10LnRlbnNvclR5cGVUb1R5cGVkQXJyYXlDb25zdHJ1Y3Rvcj10LmdldFRlbnNvckVsZW1lbnRTaXplPXQudGVuc29yRGF0YVR5cGVFbnVtVG9TdHJpbmc9dC50ZW5zb3JEYXRhVHlwZVN0cmluZ1RvRW51bT12b2lkIDAsdC50ZW5zb3JEYXRhVHlwZVN0cmluZ1RvRW51bT1lPT57c3dpdGNoKGUpe2Nhc2UiaW50OCI6cmV0dXJuIDM7Y2FzZSJ1aW50OCI6cmV0dXJuIDI7Y2FzZSJib29sIjpyZXR1cm4gOTtjYXNlImludDE2IjpyZXR1cm4gNTtjYXNlInVpbnQxNiI6cmV0dXJuIDQ7Y2FzZSJpbnQzMiI6cmV0dXJuIDY7Y2FzZSJ1aW50MzIiOnJldHVybiAxMjtjYXNlImZsb2F0MTYiOnJldHVybiAxMDtjYXNlImZsb2F0MzIiOnJldHVybiAxO2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIDExO2Nhc2Uic3RyaW5nIjpyZXR1cm4gODtjYXNlImludDY0IjpyZXR1cm4gNztjYXNlInVpbnQ2NCI6cmV0dXJuIDEzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7ZX1gKX19LHQudGVuc29yRGF0YVR5cGVFbnVtVG9TdHJpbmc9ZT0+e3N3aXRjaChlKXtjYXNlIDM6cmV0dXJuImludDgiO2Nhc2UgMjpyZXR1cm4idWludDgiO2Nhc2UgOTpyZXR1cm4iYm9vbCI7Y2FzZSA1OnJldHVybiJpbnQxNiI7Y2FzZSA0OnJldHVybiJ1aW50MTYiO2Nhc2UgNjpyZXR1cm4iaW50MzIiO2Nhc2UgMTI6cmV0dXJuInVpbnQzMiI7Y2FzZSAxMDpyZXR1cm4iZmxvYXQxNiI7Y2FzZSAxOnJldHVybiJmbG9hdDMyIjtjYXNlIDExOnJldHVybiJmbG9hdDY0IjtjYXNlIDg6cmV0dXJuInN0cmluZyI7Y2FzZSA3OnJldHVybiJpbnQ2NCI7Y2FzZSAxMzpyZXR1cm4idWludDY0IjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAke2V9YCl9fSx0LmdldFRlbnNvckVsZW1lbnRTaXplPWU9Plt2b2lkIDAsNCwxLDEsMiwyLDQsOCx2b2lkIDAsMSwyLDgsNCw4LHZvaWQgMCx2b2lkIDAsdm9pZCAwXVtlXSx0LnRlbnNvclR5cGVUb1R5cGVkQXJyYXlDb25zdHJ1Y3Rvcj1lPT57c3dpdGNoKGUpe2Nhc2UiZmxvYXQxNiI6Y2FzZSJ1aW50MTYiOnJldHVybiBVaW50MTZBcnJheTtjYXNlImZsb2F0MzIiOnJldHVybiBGbG9hdDMyQXJyYXk7Y2FzZSJ1aW50OCI6Y2FzZSJib29sIjpyZXR1cm4gVWludDhBcnJheTtjYXNlImludDgiOnJldHVybiBJbnQ4QXJyYXk7Y2FzZSJpbnQxNiI6cmV0dXJuIEludDE2QXJyYXk7Y2FzZSJpbnQzMiI6cmV0dXJuIEludDMyQXJyYXk7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gRmxvYXQ2NEFycmF5O2Nhc2UidWludDMyIjpyZXR1cm4gVWludDMyQXJyYXk7Y2FzZSJpbnQ2NCI6cmV0dXJuIEJpZ0ludDY0QXJyYXk7Y2FzZSJ1aW50NjQiOnJldHVybiBCaWdVaW50NjRBcnJheTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdHlwZTogJHtlfWApfX0sdC5sb2dMZXZlbFN0cmluZ1RvRW51bT1lPT57c3dpdGNoKGUpe2Nhc2UidmVyYm9zZSI6cmV0dXJuIDA7Y2FzZSJpbmZvIjpyZXR1cm4gMTtjYXNlIndhcm5pbmciOnJldHVybiAyO2Nhc2UiZXJyb3IiOnJldHVybiAzO2Nhc2UiZmF0YWwiOnJldHVybiA0O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBsb2dnaW5nIGxldmVsOiAke2V9YCl9fX0sMjU5OihlLHQscik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZXh0cmFjdFRyYW5zZmVyYWJsZUJ1ZmZlcnM9dC5lbmRQcm9maWxpbmc9dC5ydW49dC5yZWxlYXNlU2Vzc2lvbj10LmNyZWF0ZVNlc3Npb249dC5jcmVhdGVTZXNzaW9uRmluYWxpemU9dC5jcmVhdGVTZXNzaW9uQWxsb2NhdGU9dC5pbml0UnVudGltZT12b2lkIDA7Y29uc3Qgbj1yKDkxOCksYT1yKDYyMiksbz1yKDkxNyksaT1yKDI2Mykscz1yKDQ5Nyk7dC5pbml0UnVudGltZT1hc3luYyBlPT57dmFyIHQscjt0PWUud2FzbS5udW1UaHJlYWRzLHI9KDAsby5sb2dMZXZlbFN0cmluZ1RvRW51bSkoZS5sb2dMZXZlbCksMCE9PSgwLGkuZ2V0SW5zdGFuY2UpKCkuX09ydEluaXQodCxyKSYmKDAscy5jaGVja0xhc3RFcnJvcikoIkNhblwndCBpbml0aWFsaXplIG9ubnhydW50aW1lLiIpfTtjb25zdCB1PW5ldyBNYXA7dC5jcmVhdGVTZXNzaW9uQWxsb2NhdGU9ZT0+e2NvbnN0IHQ9KDAsaS5nZXRJbnN0YW5jZSkoKSxyPXQuX21hbGxvYyhlLmJ5dGVMZW5ndGgpO2lmKDA9PT1yKXRocm93IG5ldyBFcnJvcihgQ2FuXCd0IGNyZWF0ZSBhIHNlc3Npb24uIGZhaWxlZCB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBvZiBzaXplICR7ZS5ieXRlTGVuZ3RofS5gKTtyZXR1cm4gdC5IRUFQVTguc2V0KGUsciksW3IsZS5ieXRlTGVuZ3RoXX0sdC5jcmVhdGVTZXNzaW9uRmluYWxpemU9KGUsdCk9Pntjb25zdCByPSgwLGkuZ2V0SW5zdGFuY2UpKCk7bGV0IG49MCxvPTAsYz1bXTtjb25zdCBsPVtdLGY9W107dHJ5e1tvLGNdPSgwLGEuc2V0U2Vzc2lvbk9wdGlvbnMpKHQpLG49ci5fT3J0Q3JlYXRlU2Vzc2lvbihlWzBdLGVbMV0sbyksMD09PW4mJigwLHMuY2hlY2tMYXN0RXJyb3IpKCJDYW5cJ3QgY3JlYXRlIGEgc2Vzc2lvbi4iKTtjb25zdFtkLHBdPShlPT57Y29uc3QgdD0oMCxpLmdldEluc3RhbmNlKSgpLHI9dC5zdGFja1NhdmUoKTt0cnl7Y29uc3Qgcj10LnN0YWNrQWxsb2MoOCk7cmV0dXJuIDAhPT10Ll9PcnRHZXRJbnB1dE91dHB1dENvdW50KGUscixyKzQpJiYoMCxzLmNoZWNrTGFzdEVycm9yKSgiQ2FuXCd0IGdldCBzZXNzaW9uIGlucHV0L291dHB1dCBjb3VudC4iKSxbdC5IRUFQMzJbci80XSx0LkhFQVAzMltyLzQrMV1dfWZpbmFsbHl7dC5zdGFja1Jlc3RvcmUocil9fSkobiksZz1bXSxoPVtdO2ZvcihsZXQgZT0wO2U8ZDtlKyspe2NvbnN0IHQ9ci5fT3J0R2V0SW5wdXROYW1lKG4sZSk7MD09PXQmJigwLHMuY2hlY2tMYXN0RXJyb3IpKCJDYW5cJ3QgZ2V0IGFuIGlucHV0IG5hbWUuIiksbC5wdXNoKHQpLGcucHVzaChyLlVURjhUb1N0cmluZyh0KSl9Zm9yKGxldCBlPTA7ZTxwO2UrKyl7Y29uc3QgdD1yLl9PcnRHZXRPdXRwdXROYW1lKG4sZSk7MD09PXQmJigwLHMuY2hlY2tMYXN0RXJyb3IpKCJDYW5cJ3QgZ2V0IGFuIG91dHB1dCBuYW1lLiIpLGYucHVzaCh0KSxoLnB1c2goci5VVEY4VG9TdHJpbmcodCkpfXJldHVybiB1LnNldChuLFtuLGwsZl0pLFtuLGcsaF19Y2F0Y2goZSl7dGhyb3cgbC5mb3JFYWNoKChlPT5yLl9PcnRGcmVlKGUpKSksZi5mb3JFYWNoKChlPT5yLl9PcnRGcmVlKGUpKSksMCE9PW4mJnIuX09ydFJlbGVhc2VTZXNzaW9uKG4pLGV9ZmluYWxseXtyLl9mcmVlKGVbMF0pLDAhPT1vJiZyLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnMobyksYy5mb3JFYWNoKChlPT5yLl9mcmVlKGUpKSl9fSx0LmNyZWF0ZVNlc3Npb249KGUscik9Pntjb25zdCBuPSgwLHQuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlKShlKTtyZXR1cm4oMCx0LmNyZWF0ZVNlc3Npb25GaW5hbGl6ZSkobixyKX0sdC5yZWxlYXNlU2Vzc2lvbj1lPT57Y29uc3QgdD0oMCxpLmdldEluc3RhbmNlKSgpLHI9dS5nZXQoZSk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgcmVsZWFzZSBzZXNzaW9uLiBpbnZhbGlkIHNlc3Npb24gaWQ6ICR7ZX1gKTtjb25zdFtuLGEsb109cjthLmZvckVhY2goKGU9PnQuX09ydEZyZWUoZSkpKSxvLmZvckVhY2goKGU9PnQuX09ydEZyZWUoZSkpKSx0Ll9PcnRSZWxlYXNlU2Vzc2lvbihuKSx1LmRlbGV0ZShlKX0sdC5ydW49YXN5bmMoZSx0LHIsYSxjKT0+e2NvbnN0IGw9KDAsaS5nZXRJbnN0YW5jZSkoKSxmPXUuZ2V0KGUpO2lmKCFmKXRocm93IG5ldyBFcnJvcihgY2Fubm90IHJ1biBpbmZlcmVuY2UuIGludmFsaWQgc2Vzc2lvbiBpZDogJHtlfWApO2NvbnN0W2QscCxnXT1mLGg9dC5sZW5ndGgsbT1hLmxlbmd0aDtsZXQgeT0wLHY9W107Y29uc3QgYj1bXSx3PVtdO3RyeXtbeSx2XT0oMCxuLnNldFJ1bk9wdGlvbnMpKGMpO2ZvcihsZXQgZT0wO2U8aDtlKyspe2NvbnN0IHQ9cltlXVswXSxuPXJbZV1bMV0sYT1yW2VdWzJdO2xldCBpLHU7aWYoQXJyYXkuaXNBcnJheShhKSl7dT00KmEubGVuZ3RoLGk9bC5fbWFsbG9jKHUpLHcucHVzaChpKTtsZXQgZT1pLzQ7Zm9yKGxldCB0PTA7dDxhLmxlbmd0aDt0Kyspe2lmKCJzdHJpbmciIT10eXBlb2YgYVt0XSl0aHJvdyBuZXcgVHlwZUVycm9yKGB0ZW5zb3IgZGF0YSBhdCBpbmRleCAke3R9IGlzIG5vdCBhIHN0cmluZ2ApO2wuSEVBUFUzMltlKytdPSgwLHMuYWxsb2NXYXNtU3RyaW5nKShhW3RdLHcpfX1lbHNlIHU9YS5ieXRlTGVuZ3RoLGk9bC5fbWFsbG9jKHUpLHcucHVzaChpKSxsLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkoYS5idWZmZXIsYS5ieXRlT2Zmc2V0LHUpLGkpO2NvbnN0IGM9bC5zdGFja1NhdmUoKSxmPWwuc3RhY2tBbGxvYyg0Km4ubGVuZ3RoKTt0cnl7bGV0IHI9Zi80O24uZm9yRWFjaCgoZT0+bC5IRUFQMzJbcisrXT1lKSk7Y29uc3QgYT1sLl9PcnRDcmVhdGVUZW5zb3IoKDAsby50ZW5zb3JEYXRhVHlwZVN0cmluZ1RvRW51bSkodCksaSx1LGYsbi5sZW5ndGgpOzA9PT1hJiYoMCxzLmNoZWNrTGFzdEVycm9yKShgQ2FuXCd0IGNyZWF0ZSB0ZW5zb3IgZm9yIGlucHV0WyR7ZX1dLmApLGIucHVzaChhKX1maW5hbGx5e2wuc3RhY2tSZXN0b3JlKGMpfX1jb25zdCBlPWwuc3RhY2tTYXZlKCksaT1sLnN0YWNrQWxsb2MoNCpoKSx1PWwuc3RhY2tBbGxvYyg0KmgpLGY9bC5zdGFja0FsbG9jKDQqbSksXz1sLnN0YWNrQWxsb2MoNCptKTt0cnl7bGV0IGU9aS80LHI9dS80LG49Zi80LGM9Xy80O2ZvcihsZXQgbj0wO248aDtuKyspbC5IRUFQVTMyW2UrK109YltuXSxsLkhFQVBVMzJbcisrXT1wW3Rbbl1dO2ZvcihsZXQgZT0wO2U8bTtlKyspbC5IRUFQVTMyW24rK109MCxsLkhFQVBVMzJbYysrXT1nW2FbZV1dO2xldCB2PWwuX09ydFJ1bihkLHUsaSxoLF8sbSxmLHkpO2NvbnN0IHc9bC5qc2VwUnVuUHJvbWlzZTt3JiZ2b2lkIDAhPT13LnRoZW4mJih2PWF3YWl0IHcpO2NvbnN0IE89W107MCE9PXYmJigwLHMuY2hlY2tMYXN0RXJyb3IpKCJmYWlsZWQgdG8gY2FsbCBPcnRSdW4oKS4iKTtmb3IobGV0IGU9MDtlPG07ZSsrKXtjb25zdCB0PWwuSEVBUFUzMltmLzQrZV0scj1sLnN0YWNrU2F2ZSgpLG49bC5zdGFja0FsbG9jKDE2KTtsZXQgYSxpPTA7dHJ5e3Y9bC5fT3J0R2V0VGVuc29yRGF0YSh0LG4sbis0LG4rOCxuKzEyKSwwIT09diYmKDAscy5jaGVja0xhc3RFcnJvcikoYENhblwndCBhY2Nlc3Mgb3V0cHV0IHRlbnNvciBkYXRhIG9uIGluZGV4ICR7ZX0uYCk7bGV0IHI9bi80O2NvbnN0IHU9bC5IRUFQVTMyW3IrK107aT1sLkhFQVBVMzJbcisrXTtjb25zdCBjPWwuSEVBUFUzMltyKytdLGY9bC5IRUFQVTMyW3IrK10sZD1bXTtmb3IobGV0IGU9MDtlPGY7ZSsrKWQucHVzaChsLkhFQVBVMzJbYy80K2VdKTtsLl9PcnRGcmVlKGMpO2NvbnN0IHA9MD09PWQubGVuZ3RoPzE6ZC5yZWR1Y2UoKChlLHQpPT5lKnQpKTtpZihhPSgwLG8udGVuc29yRGF0YVR5cGVFbnVtVG9TdHJpbmcpKHUpLCJzdHJpbmciPT09YSl7Y29uc3QgZT1bXTtsZXQgdD1pLzQ7Zm9yKGxldCByPTA7cjxwO3IrKyl7Y29uc3Qgbj1sLkhFQVBVMzJbdCsrXSxhPXI9PT1wLTE/dm9pZCAwOmwuSEVBUFUzMlt0XS1uO2UucHVzaChsLlVURjhUb1N0cmluZyhuLGEpKX1PLnB1c2goW2EsZCxlXSl9ZWxzZXtjb25zdCBlPW5ldygoMCxvLnRlbnNvclR5cGVUb1R5cGVkQXJyYXlDb25zdHJ1Y3RvcikoYSkpKHApO25ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpLnNldChsLkhFQVBVOC5zdWJhcnJheShpLGkrZS5ieXRlTGVuZ3RoKSksTy5wdXNoKFthLGQsZV0pfX1maW5hbGx5e2wuc3RhY2tSZXN0b3JlKHIpLCJzdHJpbmciPT09YSYmaSYmbC5fZnJlZShpKSxsLl9PcnRSZWxlYXNlVGVuc29yKHQpfX1yZXR1cm4gT31maW5hbGx5e2wuc3RhY2tSZXN0b3JlKGUpfX1maW5hbGx5e2IuZm9yRWFjaCgoZT0+bC5fT3J0UmVsZWFzZVRlbnNvcihlKSkpLHcuZm9yRWFjaCgoZT0+bC5fZnJlZShlKSkpLDAhPT15JiZsLl9PcnRSZWxlYXNlUnVuT3B0aW9ucyh5KSx2LmZvckVhY2goKGU9PmwuX2ZyZWUoZSkpKX19LHQuZW5kUHJvZmlsaW5nPWU9Pntjb25zdCB0PSgwLGkuZ2V0SW5zdGFuY2UpKCkscj11LmdldChlKTtpZighcil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2Vzc2lvbiBpZCIpO2NvbnN0IG49clswXSxhPXQuX09ydEVuZFByb2ZpbGluZyhuKTswPT09YSYmKDAscy5jaGVja0xhc3RFcnJvcikoIkNhblwndCBnZXQgYW4gcHJvZmlsZSBmaWxlIG5hbWUuIiksdC5fT3J0RnJlZShhKX0sdC5leHRyYWN0VHJhbnNmZXJhYmxlQnVmZmVycz1lPT57Y29uc3QgdD1bXTtmb3IoY29uc3QgciBvZiBlKXtjb25zdCBlPXJbMl07IUFycmF5LmlzQXJyYXkoZSkmJmUuYnVmZmVyJiZ0LnB1c2goZS5idWZmZXIpfXJldHVybiB0fX0sMjYzOmZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7dmFyIG49dGhpcyYmdGhpcy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxyLG4pe3ZvaWQgMD09PW4mJihuPXIpO3ZhciBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxyKTthJiYhKCJnZXQiaW4gYT8hdC5fX2VzTW9kdWxlOmEud3JpdGFibGV8fGEuY29uZmlndXJhYmxlKXx8KGE9e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbcl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbixhKX06ZnVuY3Rpb24oZSx0LHIsbil7dm9pZCAwPT09biYmKG49ciksZVtuXT10W3JdfSksYT10aGlzJiZ0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdHx8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pfTpmdW5jdGlvbihlLHQpe2UuZGVmYXVsdD10fSksbz10aGlzJiZ0aGlzLl9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24oZSl7aWYoZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciB0PXt9O2lmKG51bGwhPWUpZm9yKHZhciByIGluIGUpImRlZmF1bHQiIT09ciYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJm4odCxlLHIpO3JldHVybiBhKHQsZSksdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZGlzcG9zZT10LmdldEluc3RhbmNlPXQuaW5pdGlhbGl6ZVdlYkFzc2VtYmx5PXZvaWQgMDtjb25zdCBpPW8ocig0NDkpKSxzPXIoOTMyKSx1PXIoNDc0KTtsZXQgYyxsPSExLGY9ITEsZD0hMTt0LmluaXRpYWxpemVXZWJBc3NlbWJseT1hc3luYyBlPT57aWYobClyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7aWYoZil0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIGNhbGxzIHRvIFwnaW5pdGlhbGl6ZVdlYkFzc2VtYmx5KClcJyBkZXRlY3RlZC4iKTtpZihkKXRocm93IG5ldyBFcnJvcigicHJldmlvdXMgY2FsbCB0byBcJ2luaXRpYWxpemVXZWJBc3NlbWJseSgpXCcgZmFpbGVkLiIpO2Y9ITA7Y29uc3QgdD1lLmluaXRUaW1lb3V0LG49ZS5udW1UaHJlYWRzLGE9ZS5zaW1kLG89bj4xJiYoKCk9Pnt0cnl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciYmKCJ1bmRlZmluZWQiIT10eXBlb2YgTWVzc2FnZUNoYW5uZWwmJihuZXcgTWVzc2FnZUNoYW5uZWwpLnBvcnQxLnBvc3RNZXNzYWdlKG5ldyBTaGFyZWRBcnJheUJ1ZmZlcigxKSksV2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNCwxLDk2LDAsMCwzLDIsMSwwLDUsNCwxLDMsMSwxLDEwLDExLDEsOSwwLDY1LDAsMjU0LDE2LDIsMCwyNiwxMV0pKSl9Y2F0Y2goZSl7cmV0dXJuITF9fSkoKSxwPWEmJigoKT0+e3RyeXtyZXR1cm4gV2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNCwxLDk2LDAsMCwzLDIsMSwwLDEwLDMwLDEsMjgsMCw2NSwwLDI1MywxNSwyNTMsMTIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyNTMsMTg2LDEsMjYsMTFdKSl9Y2F0Y2goZSl7cmV0dXJuITF9fSkoKSxnPWUud2FzbVBhdGhzLGg9InN0cmluZyI9PXR5cGVvZiBnP2c6dm9pZCAwLG09KChlLHQpPT50P2U/Im9ydC13YXNtLXNpbWQtdGhyZWFkZWQud2FzbSI6Im9ydC13YXNtLXRocmVhZGVkLndhc20iOmU/Im9ydC13YXNtLXNpbWQud2FzbSI6Im9ydC13YXNtLndhc20iKShwLG8pLHk9Im9iamVjdCI9PXR5cGVvZiBnP2dbbV06dm9pZCAwO2xldCB2PSExO2NvbnN0IGI9W107aWYodD4wJiZiLnB1c2gobmV3IFByb21pc2UoKGU9PntzZXRUaW1lb3V0KCgoKT0+e3Y9ITAsZSgpfSksdCl9KSkpLGIucHVzaChuZXcgUHJvbWlzZSgoKGUsdCk9Pntjb25zdCBuPW8/dTpzLGE9e2xvY2F0ZUZpbGU6KGUsdCk9Pm8mJmUuZW5kc1dpdGgoIi53b3JrZXIuanMiKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBCbG9iP1VSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3IoMTU0KV0se3R5cGU6InRleHQvamF2YXNjcmlwdCJ9KSk6ZS5lbmRzV2l0aCgiLndhc20iKT95fHwobnVsbCE9aD9oOnQpK206dCtlfTtpZihvKWlmKCJ1bmRlZmluZWQiPT10eXBlb2YgQmxvYilhLm1haW5TY3JpcHRVcmxPckJsb2I9aS5qb2luKF9fZGlybmFtZSwib3J0LXdhc20tdGhyZWFkZWQuanMiKTtlbHNle2NvbnN0IGU9YHZhciBvcnRXYXNtVGhyZWFkZWQ9KGZ1bmN0aW9uKCl7dmFyIF9zY3JpcHREaXI7cmV0dXJuICR7bi50b1N0cmluZygpfX0pKCk7YDthLm1haW5TY3JpcHRVcmxPckJsb2I9bmV3IEJsb2IoW2VdLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSl9bihhKS50aGVuKCh0PT57Zj0hMSxsPSEwLGM9dCxlKCl9KSwoZT0+e2Y9ITEsZD0hMCx0KGUpfSkpfSkpKSxhd2FpdCBQcm9taXNlLnJhY2UoYiksdil0aHJvdyBuZXcgRXJyb3IoYFdlYkFzc2VtYmx5IGJhY2tlbmQgaW5pdGlhbGl6aW5nIGZhaWxlZCBkdWUgdG8gdGltZW91dDogJHt0fW1zYCl9LHQuZ2V0SW5zdGFuY2U9KCk9PntpZihsJiZjKXJldHVybiBjO3Rocm93IG5ldyBFcnJvcigiV2ViQXNzZW1ibHkgaXMgbm90IGluaXRpYWxpemVkIHlldC4iKX0sdC5kaXNwb3NlPSgpPT57dmFyIGU7IWx8fGZ8fGR8fChmPSEwLG51bGw9PT0oZT1jLlBUaHJlYWQpfHx2b2lkIDA9PT1lfHxlLnRlcm1pbmF0ZUFsbFRocmVhZHMoKSxjPXZvaWQgMCxmPSExLGw9ITEsZD0hMCl9fSw0OTc6KGUsdCxyKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jaGVja0xhc3RFcnJvcj10Lml0ZXJhdGVFeHRyYU9wdGlvbnM9dC5hbGxvY1dhc21TdHJpbmc9dm9pZCAwO2NvbnN0IG49cigyNjMpO3QuYWxsb2NXYXNtU3RyaW5nPShlLHQpPT57Y29uc3Qgcj0oMCxuLmdldEluc3RhbmNlKSgpLGE9ci5sZW5ndGhCeXRlc1VURjgoZSkrMSxvPXIuX21hbGxvYyhhKTtyZXR1cm4gci5zdHJpbmdUb1VURjgoZSxvLGEpLHQucHVzaChvKSxvfSx0Lml0ZXJhdGVFeHRyYU9wdGlvbnM9KGUscixuLGEpPT57aWYoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZSl7aWYobi5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKCJDaXJjdWxhciByZWZlcmVuY2UgaW4gb3B0aW9ucyIpO24uYWRkKGUpfU9iamVjdC5lbnRyaWVzKGUpLmZvckVhY2goKChbZSxvXSk9Pntjb25zdCBpPXI/citlOmU7aWYoIm9iamVjdCI9PXR5cGVvZiBvKSgwLHQuaXRlcmF0ZUV4dHJhT3B0aW9ucykobyxpKyIuIixuLGEpO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBvfHwibnVtYmVyIj09dHlwZW9mIG8pYShpLG8udG9TdHJpbmcoKSk7ZWxzZXtpZigiYm9vbGVhbiIhPXR5cGVvZiBvKXRocm93IG5ldyBFcnJvcigiQ2FuXCd0IGhhbmRsZSBleHRyYSBjb25maWcgdHlwZTogIit0eXBlb2Ygbyk7YShpLG8/IjEiOiIwIil9fSkpfSx0LmNoZWNrTGFzdEVycm9yPWU9Pntjb25zdCB0PSgwLG4uZ2V0SW5zdGFuY2UpKCkscj10LnN0YWNrU2F2ZSgpO3RyeXtjb25zdCByPXQuc3RhY2tBbGxvYyg4KTt0Ll9PcnRHZXRMYXN0RXJyb3IocixyKzQpO2NvbnN0IG49dC5IRUFQMzJbci80XSxhPXQuSEVBUFUzMltyLzQrMV0sbz1hP3QuVVRGOFRvU3RyaW5nKGEpOiIiO3Rocm93IG5ldyBFcnJvcihgJHtlfSBFUlJPUl9DT0RFOiAke259LCBFUlJPUl9NRVNTQUdFOiAke299YCl9ZmluYWxseXt0LnN0YWNrUmVzdG9yZShyKX19fSw0NzQ6KGUsdCxyKT0+e3ZhciBfc2NyaXB0RGlyLG49KF9zY3JpcHREaXI9InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdD9kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYzp2b2lkIDAsInVuZGVmaW5lZCIhPXR5cGVvZiBfX2ZpbGVuYW1lJiYoX3NjcmlwdERpcj1fc2NyaXB0RGlyfHxfX2ZpbGVuYW1lKSxmdW5jdGlvbihlPXt9KXtmdW5jdGlvbiB0KCl7cmV0dXJuIGsuYnVmZmVyIT14LmJ1ZmZlciYmWSgpLHh9ZnVuY3Rpb24gbigpe3JldHVybiBrLmJ1ZmZlciE9eC5idWZmZXImJlkoKSxJfWZ1bmN0aW9uIGEoKXtyZXR1cm4gay5idWZmZXIhPXguYnVmZmVyJiZZKCksVX1mdW5jdGlvbiBvKCl7cmV0dXJuIGsuYnVmZmVyIT14LmJ1ZmZlciYmWSgpLEx9ZnVuY3Rpb24gaSgpe3JldHVybiBrLmJ1ZmZlciE9eC5idWZmZXImJlkoKSxXfXZhciBzLHUsYz1lO2MucmVhZHk9bmV3IFByb21pc2UoKChlLHQpPT57cz1lLHU9dH0pKTt2YXIgbCxmLGQscD1PYmplY3QuYXNzaWduKHt9LGMpLGc9Ii4vdGhpcy5wcm9ncmFtIixoPShlLHQpPT57dGhyb3cgdH0sbT0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyx5PSJmdW5jdGlvbiI9PXR5cGVvZiBpbXBvcnRTY3JpcHRzLHY9Im9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiYib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMmJiJzdHJpbmciPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLGI9Yy5FTlZJUk9OTUVOVF9JU19QVEhSRUFEfHwhMSx3PSIiO2Z1bmN0aW9uIF8oZSl7cmV0dXJuIGMubG9jYXRlRmlsZT9jLmxvY2F0ZUZpbGUoZSx3KTp3K2V9aWYodil7dmFyIE89cigzODQpLFM9cig5MDgpO2xldCB0O3c9eT9TLmRpcm5hbWUodykrIi8iOl9fZGlybmFtZSsiLyIsbD0oZSx0KT0+KGU9ZS5zdGFydHNXaXRoKCJmaWxlOi8vIik/bmV3IFVSTChlKTpTLm5vcm1hbGl6ZShlKSxPLnJlYWRGaWxlU3luYyhlLHQ/dm9pZCAwOiJ1dGY4IikpLGQ9ZT0+KChlPWwoZSwhMCkpLmJ1ZmZlcnx8KGU9bmV3IFVpbnQ4QXJyYXkoZSkpLGUpLGY9KGUsdCxyLG49ITApPT57ZT1lLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKT9uZXcgVVJMKGUpOlMubm9ybWFsaXplKGUpLE8ucmVhZEZpbGUoZSxuP3ZvaWQgMDoidXRmOCIsKChlLGEpPT57ZT9yKGUpOnQobj9hLmJ1ZmZlcjphKX0pKX0sIWMudGhpc1Byb2dyYW0mJjE8cHJvY2Vzcy5hcmd2Lmxlbmd0aCYmKGc9cHJvY2Vzcy5hcmd2WzFdLnJlcGxhY2UoL1xcXFwvZywiLyIpKSxwcm9jZXNzLmFyZ3Yuc2xpY2UoMiksaD0oZSx0KT0+e3Rocm93IHByb2Nlc3MuZXhpdENvZGU9ZSx0fSxjLmluc3BlY3Q9KCk9PiJbRW1zY3JpcHRlbiBNb2R1bGUgb2JqZWN0XSI7dHJ5e3Q9cig5MjUpfWNhdGNoKGUpe3Rocm93IGNvbnNvbGUuZXJyb3IoXCdUaGUgIndvcmtlcl90aHJlYWRzIiBtb2R1bGUgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIG5vZGUuanMgYnVpbGQgLSBwZXJoYXBzIGEgbmV3ZXIgdmVyc2lvbiBpcyBuZWVkZWQ/XCcpLGV9Z2xvYmFsLldvcmtlcj10Lldvcmtlcn1lbHNlKG18fHkpJiYoeT93PXNlbGYubG9jYXRpb24uaHJlZjoidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYodz1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksX3NjcmlwdERpciYmKHc9X3NjcmlwdERpciksdz0wIT09dy5pbmRleE9mKCJibG9iOiIpP3cuc3Vic3RyKDAsdy5yZXBsYWNlKC9bPyNdLiovLCIiKS5sYXN0SW5kZXhPZigiLyIpKzEpOiIiLHZ8fChsPWU9Pnt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHQub3BlbigiR0VUIixlLCExKSx0LnNlbmQobnVsbCksdC5yZXNwb25zZVRleHR9LHkmJihkPWU9Pnt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHQub3BlbigiR0VUIixlLCExKSx0LnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLHQuc2VuZChudWxsKSxuZXcgVWludDhBcnJheSh0LnJlc3BvbnNlKX0pLGY9KGUsdCxyKT0+e3ZhciBuPW5ldyBYTUxIdHRwUmVxdWVzdDtuLm9wZW4oIkdFVCIsZSwhMCksbi5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixuLm9ubG9hZD0oKT0+ezIwMD09bi5zdGF0dXN8fDA9PW4uc3RhdHVzJiZuLnJlc3BvbnNlP3Qobi5yZXNwb25zZSk6cigpfSxuLm9uZXJyb3I9cixuLnNlbmQobnVsbCl9KSk7diYmInVuZGVmaW5lZCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmKGdsb2JhbC5wZXJmb3JtYW5jZT1yKDk1MykucGVyZm9ybWFuY2UpO3ZhciBFPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksQT1jb25zb2xlLmVycm9yLmJpbmQoY29uc29sZSk7diYmKEU9KC4uLmUpPT5PLndyaXRlU3luYygxLGUuam9pbigiICIpKyJcXG4iKSxBPSguLi5lKT0+Ty53cml0ZVN5bmMoMixlLmpvaW4oIiAiKSsiXFxuIikpO3ZhciBULE09Yy5wcmludHx8RSxSPWMucHJpbnRFcnJ8fEE7T2JqZWN0LmFzc2lnbihjLHApLHA9bnVsbCxjLnRoaXNQcm9ncmFtJiYoZz1jLnRoaXNQcm9ncmFtKSxjLnF1aXQmJihoPWMucXVpdCksYy53YXNtQmluYXJ5JiYoVD1jLndhc21CaW5hcnkpO3ZhciBGPWMubm9FeGl0UnVudGltZXx8ITA7Im9iamVjdCIhPXR5cGVvZiBXZWJBc3NlbWJseSYmdGUoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTt2YXIgayxDLFAsRCx4LEksVSxMLFcsSD0hMTtmdW5jdGlvbiBZKCl7dmFyIGU9ay5idWZmZXI7Yy5IRUFQOD14PW5ldyBJbnQ4QXJyYXkoZSksYy5IRUFQMTY9bmV3IEludDE2QXJyYXkoZSksYy5IRUFQMzI9VT1uZXcgSW50MzJBcnJheShlKSxjLkhFQVBVOD1JPW5ldyBVaW50OEFycmF5KGUpLGMuSEVBUFUxNj1uZXcgVWludDE2QXJyYXkoZSksYy5IRUFQVTMyPUw9bmV3IFVpbnQzMkFycmF5KGUpLGMuSEVBUEYzMj1uZXcgRmxvYXQzMkFycmF5KGUpLGMuSEVBUEY2ND1XPW5ldyBGbG9hdDY0QXJyYXkoZSl9dmFyIGo9Yy5JTklUSUFMX01FTU9SWXx8MTY3NzcyMTY7aWYoNTI0Mjg4MDw9anx8dGUoIklOSVRJQUxfTUVNT1JZIHNob3VsZCBiZSBsYXJnZXIgdGhhbiBTVEFDS19TSVpFLCB3YXMgIitqKyIhIChTVEFDS19TSVpFPTUyNDI4ODApIiksYilrPWMud2FzbU1lbW9yeTtlbHNlIGlmKGMud2FzbU1lbW9yeSlrPWMud2FzbU1lbW9yeTtlbHNlIGlmKCEoKGs9bmV3IFdlYkFzc2VtYmx5Lk1lbW9yeSh7aW5pdGlhbDpqLzY1NTM2LG1heGltdW06NjU1MzYsc2hhcmVkOiEwfSkpLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSl0aHJvdyBSKCJyZXF1ZXN0ZWQgYSBzaGFyZWQgV2ViQXNzZW1ibHkuTWVtb3J5IGJ1dCB0aGUgcmV0dXJuZWQgYnVmZmVyIGlzIG5vdCBhIFNoYXJlZEFycmF5QnVmZmVyLCBpbmRpY2F0aW5nIHRoYXQgd2hpbGUgdGhlIGJyb3dzZXIgaGFzIFNoYXJlZEFycmF5QnVmZmVyIGl0IGRvZXMgbm90IGhhdmUgV2ViQXNzZW1ibHkgdGhyZWFkcyBzdXBwb3J0IC0geW91IG1heSBuZWVkIHRvIHNldCBhIGZsYWciKSx2JiZSKCIob24gbm9kZSB5b3UgbWF5IG5lZWQ6IC0tZXhwZXJpbWVudGFsLXdhc20tdGhyZWFkcyAtLWV4cGVyaW1lbnRhbC13YXNtLWJ1bGstbWVtb3J5IGFuZC9vciByZWNlbnQgdmVyc2lvbikiKSxFcnJvcigiYmFkIG1lbW9yeSIpO1koKSxqPWsuYnVmZmVyLmJ5dGVMZW5ndGg7dmFyIHosRz1bXSxOPVtdLEI9W10sJD0wO2Z1bmN0aW9uIHEoKXtyZXR1cm4gRnx8MDwkfXZhciBWLEosWD0wLEs9bnVsbCxaPW51bGw7ZnVuY3Rpb24gUSgpe1grKyxjLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJmMubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhYKX1mdW5jdGlvbiBlZSgpe2lmKFgtLSxjLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJmMubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhYKSwwPT1YJiYobnVsbCE9PUsmJihjbGVhckludGVydmFsKEspLEs9bnVsbCksWikpe3ZhciBlPVo7Wj1udWxsLGUoKX19ZnVuY3Rpb24gdGUoZSl7dGhyb3cgYy5vbkFib3J0JiZjLm9uQWJvcnQoZSksUihlPSJBYm9ydGVkKCIrZSsiKSIpLEg9ITAsRD0xLGU9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihlKyIuIEJ1aWxkIHdpdGggLXNBU1NFUlRJT05TIGZvciBtb3JlIGluZm8uIiksdShlKSxlfWZ1bmN0aW9uIHJlKGUpe3JldHVybiBlLnN0YXJ0c1dpdGgoImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiKX1mdW5jdGlvbiBuZShlKXtpZihlPT1WJiZUKXJldHVybiBuZXcgVWludDhBcnJheShUKTtpZihkKXJldHVybiBkKGUpO3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1mdW5jdGlvbiBhZShlLHQscil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKCFUJiYobXx8eSkpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBmZXRjaCYmIWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpKXJldHVybiBmZXRjaChlLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbigodD0+e2lmKCF0Lm9rKXRocm93ImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgXCciK2UrIlwnIjtyZXR1cm4gdC5hcnJheUJ1ZmZlcigpfSkpLmNhdGNoKCgoKT0+bmUoZSkpKTtpZihmKXJldHVybiBuZXcgUHJvbWlzZSgoKHQscik9PntmKGUsKGU9PnQobmV3IFVpbnQ4QXJyYXkoZSkpKSxyKX0pKX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKCk9Pm5lKGUpKSl9KGUpLnRoZW4oKGU9PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGUsdCkpKS50aGVuKChlPT5lKSkudGhlbihyLChlPT57UigiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIitlKSx0ZShlKX0pKX1mdW5jdGlvbiBvZShlKXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiLHRoaXMubWVzc2FnZT1gUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgke2V9KWAsdGhpcy5zdGF0dXM9ZX1mdW5jdGlvbiBpZShlKXtlLnRlcm1pbmF0ZSgpLGUub25tZXNzYWdlPSgpPT57fX1mdW5jdGlvbiBzZShlKXsoZT1nZS5GYVtlXSl8fHRlKCksZ2UuZmIoZSl9ZnVuY3Rpb24gdWUoZSl7dmFyIHQ9Z2UuWmEoKTtpZighdClyZXR1cm4gNjtnZS5JYS5wdXNoKHQpLGdlLkZhW2UuSGFdPXQsdC5IYT1lLkhhO3ZhciByPXtjbWQ6InJ1biIsc3RhcnRfcm91dGluZTplLmdiLGFyZzplLllhLHB0aHJlYWRfcHRyOmUuSGF9O3JldHVybiB2JiZ0LnVucmVmKCksdC5wb3N0TWVzc2FnZShyLGUubWIpLDB9cmUoVj0ib3J0LXdhc20tdGhyZWFkZWQud2FzbSIpfHwoVj1fKFYpKTt2YXIgY2U9InVuZGVmaW5lZCIhPXR5cGVvZiBUZXh0RGVjb2Rlcj9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDAsbGU9KGUsdCxyKT0+e3ZhciBuPSh0Pj4+PTApK3I7Zm9yKHI9dDtlW3JdJiYhKHI+PW4pOykrK3I7aWYoMTY8ci10JiZlLmJ1ZmZlciYmY2UpcmV0dXJuIGNlLmRlY29kZShlLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyP2Uuc2xpY2UodCxyKTplLnN1YmFycmF5KHQscikpO2ZvcihuPSIiO3Q8cjspe3ZhciBhPWVbdCsrXTtpZigxMjgmYSl7dmFyIG89NjMmZVt0KytdO2lmKDE5Mj09KDIyNCZhKSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgzMSZhKTw8NnxvKTtlbHNle3ZhciBpPTYzJmVbdCsrXTs2NTUzNj4oYT0yMjQ9PSgyNDAmYSk/KDE1JmEpPDwxMnxvPDw2fGk6KDcmYSk8PDE4fG88PDEyfGk8PDZ8NjMmZVt0KytdKT9uKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpOihhLT02NTUzNixuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGE+PjEwLDU2MzIwfDEwMjMmYSkpfX1lbHNlIG4rPVN0cmluZy5mcm9tQ2hhckNvZGUoYSl9cmV0dXJuIG59LGZlPShlLHQpPT4oZT4+Pj0wKT9sZShuKCksZSx0KToiIjtmdW5jdGlvbiBkZShlKXtpZihiKXJldHVybiBxZSgxLDEsZSk7RD1lLHEoKXx8KGdlLmhiKCksYy5vbkV4aXQmJmMub25FeGl0KGUpLEg9ITApLGgoZSxuZXcgb2UoZSkpfXZhciBwZT1lPT57aWYoRD1lLGIpdGhyb3cgbWUoZSksInVud2luZCI7ZGUoZSl9LGdlPXtMYTpbXSxJYTpbXSxUYTpbXSxGYTp7fSxQYTpmdW5jdGlvbigpe2I/Z2UuYWIoKTpnZS4kYSgpfSwkYTpmdW5jdGlvbigpe0cudW5zaGlmdCgoKCk9PntRKCksZ2UuYmIoKCgpPT5lZSgpKSl9KSl9LGFiOmZ1bmN0aW9uKCl7Z2UucmVjZWl2ZU9iamVjdFRyYW5zZmVyPWdlLmViLGdlLnRocmVhZEluaXRUTFM9Z2UuU2EsZ2Uuc2V0RXhpdFN0YXR1cz1nZS5SYSxGPSExfSxSYTpmdW5jdGlvbihlKXtEPWV9LHJiOlsiJHRlcm1pbmF0ZVdvcmtlciJdLGhiOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIG9mIGdlLklhKWllKGUpO2ZvcihlIG9mIGdlLkxhKWllKGUpO2dlLkxhPVtdLGdlLklhPVtdLGdlLkZhPVtdfSxmYjpmdW5jdGlvbihlKXt2YXIgdD1lLkhhO2RlbGV0ZSBnZS5GYVt0XSxnZS5MYS5wdXNoKGUpLGdlLklhLnNwbGljZShnZS5JYS5pbmRleE9mKGUpLDEpLGUuSGE9MCx5dCh0KX0sZWI6ZnVuY3Rpb24oKXt9LFNhOmZ1bmN0aW9uKCl7Z2UuVGEuZm9yRWFjaCgoZT0+ZSgpKSl9LGNiOmU9Pm5ldyBQcm9taXNlKCh0PT57ZS5vbm1lc3NhZ2U9cj0+e3ZhciBuPShyPXIuZGF0YSkuY21kO2lmKHIudGFyZ2V0VGhyZWFkJiZyLnRhcmdldFRocmVhZCE9ZHQoKSl7dmFyIGE9Z2UuRmFbci5xYl07YT9hLnBvc3RNZXNzYWdlKHIsci50cmFuc2Zlckxpc3QpOlIoXCdJbnRlcm5hbCBlcnJvciEgV29ya2VyIHNlbnQgYSBtZXNzYWdlICJcJytuK1wnIiB0byB0YXJnZXQgcHRocmVhZCBcJytyLnRhcmdldFRocmVhZCsiLCBidXQgdGhhdCB0aHJlYWQgbm8gbG9uZ2VyIGV4aXN0cyEiKX1lbHNlImNoZWNrTWFpbGJveCI9PT1uP0hlKCk6InNwYXduVGhyZWFkIj09PW4/dWUocik6ImNsZWFudXBUaHJlYWQiPT09bj9zZShyLnRocmVhZCk6ImtpbGxUaHJlYWQiPT09bj8ocj1yLnRocmVhZCxuPWdlLkZhW3JdLGRlbGV0ZSBnZS5GYVtyXSxpZShuKSx5dChyKSxnZS5JYS5zcGxpY2UoZ2UuSWEuaW5kZXhPZihuKSwxKSxuLkhhPTApOiJjYW5jZWxUaHJlYWQiPT09bj9nZS5GYVtyLnRocmVhZF0ucG9zdE1lc3NhZ2Uoe2NtZDoiY2FuY2VsIn0pOiJsb2FkZWQiPT09bj8oZS5sb2FkZWQ9ITAsdChlKSk6ImFsZXJ0Ij09PW4/YWxlcnQoIlRocmVhZCAiK3IudGhyZWFkSWQrIjogIityLnRleHQpOiJzZXRpbW1lZGlhdGUiPT09ci50YXJnZXQ/ZS5wb3N0TWVzc2FnZShyKToiY2FsbEhhbmRsZXIiPT09bj9jW3IuaGFuZGxlcl0oLi4uci5hcmdzKTpuJiZSKCJ3b3JrZXIgc2VudCBhbiB1bmtub3duIGNvbW1hbmQgIituKX0sZS5vbmVycm9yPWU9Pnt0aHJvdyBSKCJ3b3JrZXIgc2VudCBhbiBlcnJvciEgIitlLmZpbGVuYW1lKyI6IitlLmxpbmVubysiOiAiK2UubWVzc2FnZSksZX0sdiYmKGUub24oIm1lc3NhZ2UiLChmdW5jdGlvbih0KXtlLm9ubWVzc2FnZSh7ZGF0YTp0fSl9KSksZS5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtlLm9uZXJyb3IodCl9KSkpO3ZhciByLG49W107Zm9yKHIgb2ZbIm9uRXhpdCIsIm9uQWJvcnQiLCJwcmludCIsInByaW50RXJyIl0pYy5oYXNPd25Qcm9wZXJ0eShyKSYmbi5wdXNoKHIpO2UucG9zdE1lc3NhZ2Uoe2NtZDoibG9hZCIsaGFuZGxlcnM6bix1cmxPckJsb2I6Yy5tYWluU2NyaXB0VXJsT3JCbG9ifHxfc2NyaXB0RGlyLHdhc21NZW1vcnk6ayx3YXNtTW9kdWxlOlB9KX0pKSxiYjpmdW5jdGlvbihlKXtlKCl9LFhhOmZ1bmN0aW9uKCl7dmFyIGU9Xygib3J0LXdhc20tdGhyZWFkZWQud29ya2VyLmpzIik7ZT1uZXcgV29ya2VyKGUpLGdlLkxhLnB1c2goZSl9LFphOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PWdlLkxhLmxlbmd0aCYmKGdlLlhhKCksZ2UuY2IoZ2UuTGFbMF0pKSxnZS5MYS5wb3AoKX19O2MuUFRocmVhZD1nZTt2YXIgaGU9ZT0+e2Zvcig7MDxlLmxlbmd0aDspZS5zaGlmdCgpKGMpfTtmdW5jdGlvbiBtZShlKXtpZihiKXJldHVybiBxZSgyLDAsZSk7cGUoZSl9Yy5lc3RhYmxpc2hTdGFja1NwYWNlPWZ1bmN0aW9uKCl7dmFyIGU9ZHQoKSx0PWEoKVtlKzUyPj4yPj4+MF07ZT1hKClbZSs1Nj4+Mj4+PjBdLF90KHQsdC1lKSxTdCh0KX07dmFyIHllPVtdO2Z1bmN0aW9uIHZlKGUpe3RoaXMuT2E9ZS0yNCx0aGlzLldhPWZ1bmN0aW9uKGUpe28oKVt0aGlzLk9hKzQ+PjI+Pj4wXT1lfSx0aGlzLlZhPWZ1bmN0aW9uKGUpe28oKVt0aGlzLk9hKzg+PjI+Pj4wXT1lfSx0aGlzLlBhPWZ1bmN0aW9uKGUsdCl7dGhpcy5VYSgpLHRoaXMuV2EoZSksdGhpcy5WYSh0KX0sdGhpcy5VYT1mdW5jdGlvbigpe28oKVt0aGlzLk9hKzE2Pj4yPj4+MF09MH19ZnVuY3Rpb24gYmUoZSx0LHIsbil7cmV0dXJuIGI/cWUoMywxLGUsdCxyLG4pOndlKGUsdCxyLG4pfWZ1bmN0aW9uIHdlKGUsdCxyLG4pe2lmKGU+Pj49MCx0Pj4+PTAscj4+Pj0wLG4+Pj49MCwidW5kZWZpbmVkIj09dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyKXJldHVybiBSKCJDdXJyZW50IGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgU2hhcmVkQXJyYXlCdWZmZXIsIHB0aHJlYWRzIGFyZSBub3QgYXZhaWxhYmxlISIpLDY7dmFyIGE9W107cmV0dXJuIGImJjA9PT1hLmxlbmd0aD9iZShlLHQscixuKTooZT17Z2I6cixIYTplLFlhOm4sbWI6YX0sYj8oZS5vYj0ic3Bhd25UaHJlYWQiLHBvc3RNZXNzYWdlKGUsYSksMCk6dWUoZSkpfWZ1bmN0aW9uIF9lKGUsdCxyKXtyZXR1cm4gYj9xZSg0LDEsZSx0LHIpOjB9ZnVuY3Rpb24gT2UoZSx0KXtpZihiKXJldHVybiBxZSg1LDEsZSx0KX1jLmludm9rZUVudHJ5UG9pbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgcj15ZVtlXTtyfHwoZT49eWUubGVuZ3RoJiYoeWUubGVuZ3RoPWUrMSkseWVbZV09cj16LmdldChlKSksZT1yKHQpLHEoKT9nZS5SYShlKTp2dChlKX07dmFyIFNlPWU9Pntmb3IodmFyIHQ9MCxyPTA7cjxlLmxlbmd0aDsrK3Ipe3ZhciBuPWUuY2hhckNvZGVBdChyKTsxMjc+PW4/dCsrOjIwNDc+PW4/dCs9Mjo1NTI5Njw9biYmNTczNDM+PW4/KHQrPTQsKytyKTp0Kz0zfXJldHVybiB0fSxFZT0oZSx0LHIsbik9PntpZighKDA8bikpcmV0dXJuIDA7dmFyIGE9cj4+Pj0wO249cituLTE7Zm9yKHZhciBvPTA7bzxlLmxlbmd0aDsrK28pe3ZhciBpPWUuY2hhckNvZGVBdChvKTtpZig1NTI5Njw9aSYmNTczNDM+PWkmJihpPTY1NTM2KygoMTAyMyZpKTw8MTApfDEwMjMmZS5jaGFyQ29kZUF0KCsrbykpLDEyNz49aSl7aWYocj49bilicmVhazt0W3IrKz4+PjBdPWl9ZWxzZXtpZigyMDQ3Pj1pKXtpZihyKzE+PW4pYnJlYWs7dFtyKys+Pj4wXT0xOTJ8aT4+Nn1lbHNle2lmKDY1NTM1Pj1pKXtpZihyKzI+PW4pYnJlYWs7dFtyKys+Pj4wXT0yMjR8aT4+MTJ9ZWxzZXtpZihyKzM+PW4pYnJlYWs7dFtyKys+Pj4wXT0yNDB8aT4+MTgsdFtyKys+Pj4wXT0xMjh8aT4+MTImNjN9dFtyKys+Pj4wXT0xMjh8aT4+NiY2M310W3IrKz4+PjBdPTEyOHw2MyZpfX1yZXR1cm4gdFtyPj4+MF09MCxyLWF9LEFlPShlLHQscik9PkVlKGUsbigpLHQscik7ZnVuY3Rpb24gVGUoZSx0KXtpZihiKXJldHVybiBxZSg2LDEsZSx0KX1mdW5jdGlvbiBNZShlLHQscil7aWYoYilyZXR1cm4gcWUoNywxLGUsdCxyKX1mdW5jdGlvbiBSZShlLHQscil7cmV0dXJuIGI/cWUoOCwxLGUsdCxyKTowfWZ1bmN0aW9uIEZlKGUsdCl7aWYoYilyZXR1cm4gcWUoOSwxLGUsdCl9ZnVuY3Rpb24ga2UoZSx0LHIpe2lmKGIpcmV0dXJuIHFlKDEwLDEsZSx0LHIpfWZ1bmN0aW9uIENlKGUsdCxyLG4pe2lmKGIpcmV0dXJuIHFlKDExLDEsZSx0LHIsbil9ZnVuY3Rpb24gUGUoZSx0LHIsbil7aWYoYilyZXR1cm4gcWUoMTIsMSxlLHQscixuKX1mdW5jdGlvbiBEZShlLHQscixuKXtpZihiKXJldHVybiBxZSgxMywxLGUsdCxyLG4pfWZ1bmN0aW9uIHhlKGUpe2lmKGIpcmV0dXJuIHFlKDE0LDEsZSl9ZnVuY3Rpb24gSWUoZSx0KXtpZihiKXJldHVybiBxZSgxNSwxLGUsdCl9ZnVuY3Rpb24gVWUoZSx0LHIpe2lmKGIpcmV0dXJuIHFlKDE2LDEsZSx0LHIpfXZhciBMZT1lPT57aWYoIUgpdHJ5e2lmKGUoKSwhcSgpKXRyeXtiP3Z0KEQpOnBlKEQpfWNhdGNoKGUpe2UgaW5zdGFuY2VvZiBvZXx8InVud2luZCI9PWV8fGgoMSxlKX19Y2F0Y2goZSl7ZSBpbnN0YW5jZW9mIG9lfHwidW53aW5kIj09ZXx8aCgxLGUpfX07ZnVuY3Rpb24gV2UoZSl7ZT4+Pj0wLCJmdW5jdGlvbiI9PXR5cGVvZiBBdG9taWNzLm5iJiYoQXRvbWljcy5uYihhKCksZT4+MixlKS52YWx1ZS50aGVuKEhlKSxlKz0xMjgsQXRvbWljcy5zdG9yZShhKCksZT4+MiwxKSl9ZnVuY3Rpb24gSGUoKXt2YXIgZT1kdCgpO2UmJihXZShlKSxMZSgoKCk9PmJ0KCkpKSl9Yy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX21haWxib3hfYXdhaXQ9V2UsYy5jaGVja01haWxib3g9SGU7dmFyIFllPWU9PjA9PWUlNCYmKDAhPWUlMTAwfHwwPT1lJTQwMCksamU9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV0semU9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF07ZnVuY3Rpb24gR2UoZSx0LHIsbixhLG8saSxzKXtyZXR1cm4gYj9xZSgxNywxLGUsdCxyLG4sYSxvLGkscyk6LTUyfWZ1bmN0aW9uIE5lKGUsdCxyLG4sYSxvLGkpe2lmKGIpcmV0dXJuIHFlKDE4LDEsZSx0LHIsbixhLG8saSl9dmFyIEJlPWU9Pnt2YXIgdD1TZShlKSsxLHI9cHQodCk7cmV0dXJuIHImJkFlKGUscix0KSxyfSwkZT1lPT57dmFyIHQ9T3QoKTtyZXR1cm4gZT1lKCksU3QodCksZX07ZnVuY3Rpb24gcWUoZSx0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoLTIsbj1hcmd1bWVudHM7cmV0dXJuICRlKCgoKT0+e2Zvcih2YXIgYT1FdCg4KnIpLG89YT4+MyxzPTA7czxyO3MrKyl7dmFyIHU9blsyK3NdO2koKVtvK3M+Pj4wXT11fXJldHVybiBtdChlLHIsYSx0KX0pKX12YXIgVmUsSmU9W10sWGU9e30sS2U9KCk9PntpZighVmUpe3ZhciBlLHQ9e1VTRVI6IndlYl91c2VyIixMT0dOQU1FOiJ3ZWJfdXNlciIsUEFUSDoiLyIsUFdEOiIvIixIT01FOiIvaG9tZS93ZWJfdXNlciIsTEFORzooIm9iamVjdCI9PXR5cGVvZiBuYXZpZ2F0b3ImJm5hdmlnYXRvci5sYW5ndWFnZXMmJm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fCJDIikucmVwbGFjZSgiLSIsIl8iKSsiLlVURi04IixfOmd8fCIuL3RoaXMucHJvZ3JhbSJ9O2ZvcihlIGluIFhlKXZvaWQgMD09PVhlW2VdP2RlbGV0ZSB0W2VdOnRbZV09WGVbZV07dmFyIHI9W107Zm9yKGUgaW4gdClyLnB1c2goYCR7ZX09JHt0W2VdfWApO1ZlPXJ9cmV0dXJuIFZlfTtmdW5jdGlvbiBaZShlLHIpe2lmKGIpcmV0dXJuIHFlKDE5LDEsZSxyKTtlPj4+PTAscj4+Pj0wO3ZhciBuPTA7cmV0dXJuIEtlKCkuZm9yRWFjaCgoZnVuY3Rpb24oYSxpKXt2YXIgcz1yK247Zm9yKGk9bygpW2UrNCppPj4yPj4+MF09cyxzPTA7czxhLmxlbmd0aDsrK3MpdCgpW2krKz4+MD4+PjBdPWEuY2hhckNvZGVBdChzKTt0KClbaT4+MD4+PjBdPTAsbis9YS5sZW5ndGgrMX0pKSwwfWZ1bmN0aW9uIFFlKGUsdCl7aWYoYilyZXR1cm4gcWUoMjAsMSxlLHQpO2U+Pj49MCx0Pj4+PTA7dmFyIHI9S2UoKTtvKClbZT4+Mj4+PjBdPXIubGVuZ3RoO3ZhciBuPTA7cmV0dXJuIHIuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bis9ZS5sZW5ndGgrMX0pKSxvKClbdD4+Mj4+PjBdPW4sMH1mdW5jdGlvbiBldChlKXtyZXR1cm4gYj9xZSgyMSwxLGUpOjUyfWZ1bmN0aW9uIHR0KGUsdCxyLG4pe3JldHVybiBiP3FlKDIyLDEsZSx0LHIsbik6NTJ9ZnVuY3Rpb24gcnQoZSx0LHIsbixhKXtyZXR1cm4gYj9xZSgyMywxLGUsdCxyLG4sYSk6NzB9dmFyIG50PVtudWxsLFtdLFtdXTtmdW5jdGlvbiBhdChlLHQscixhKXtpZihiKXJldHVybiBxZSgyNCwxLGUsdCxyLGEpO3Q+Pj49MCxyPj4+PTAsYT4+Pj0wO2Zvcih2YXIgaT0wLHM9MDtzPHI7cysrKXt2YXIgdT1vKClbdD4+Mj4+PjBdLGM9bygpW3QrND4+Mj4+PjBdO3QrPTg7Zm9yKHZhciBsPTA7bDxjO2wrKyl7dmFyIGY9bigpW3UrbD4+PjBdLGQ9bnRbZV07MD09PWZ8fDEwPT09Zj8oKDE9PT1lP006UikobGUoZCwwKSksZC5sZW5ndGg9MCk6ZC5wdXNoKGYpfWkrPWN9cmV0dXJuIG8oKVthPj4yPj4+MF09aSwwfXZhciBvdD1lPT4ob3Q9KCgpPT57aWYoIm9iamVjdCI9PXR5cGVvZiBjcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXJldHVybiBlPT4oZS5zZXQoY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShlLmJ5dGVMZW5ndGgpKSksZSk7aWYodil0cnl7dmFyIGU9cig3NjApO2lmKGUucmFuZG9tRmlsbFN5bmMpcmV0dXJuIHQ9PmUucmFuZG9tRmlsbFN5bmModCk7dmFyIHQ9ZS5yYW5kb21CeXRlcztyZXR1cm4gZT0+KGUuc2V0KHQoZS5ieXRlTGVuZ3RoKSksZSl9Y2F0Y2goZSl7fXRlKCJpbml0UmFuZG9tRGV2aWNlIil9KSgpKShlKSxpdD1bMzEsMjksMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLHN0PVszMSwyOCwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMV0sdXQ9KGUscik9Pnt0KCkuc2V0KGUscj4+PjApfTtmdW5jdGlvbiBjdChlLHQscixuKXtmdW5jdGlvbiBvKGUsdCxyKXtmb3IoZT0ibnVtYmVyIj09dHlwZW9mIGU/ZS50b1N0cmluZygpOmV8fCIiO2UubGVuZ3RoPHQ7KWU9clswXStlO3JldHVybiBlfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gbyhlLHQsIjAiKX1mdW5jdGlvbiBzKGUsdCl7ZnVuY3Rpb24gcihlKXtyZXR1cm4gMD5lPy0xOjA8ZT8xOjB9dmFyIG47cmV0dXJuIDA9PT0obj1yKGUuZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpKSYmMD09PShuPXIoZS5nZXRNb250aCgpLXQuZ2V0TW9udGgoKSkpJiYobj1yKGUuZ2V0RGF0ZSgpLXQuZ2V0RGF0ZSgpKSksbn1mdW5jdGlvbiB1KGUpe3N3aXRjaChlLmdldERheSgpKXtjYXNlIDA6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDI5KTtjYXNlIDE6cmV0dXJuIGU7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwzKTtjYXNlIDM6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDIpO2Nhc2UgNDpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCktMSwxMSwzMSk7Y2FzZSA2OnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCktMSwxMSwzMCl9fWZ1bmN0aW9uIGMoZSl7dmFyIHQ9ZS5KYTtmb3IoZT1uZXcgRGF0ZShuZXcgRGF0ZShlLkthKzE5MDAsMCwxKS5nZXRUaW1lKCkpOzA8dDspe3ZhciByPWUuZ2V0TW9udGgoKSxuPShZZShlLmdldEZ1bGxZZWFyKCkpP2l0OnN0KVtyXTtpZighKHQ+bi1lLmdldERhdGUoKSkpe2Uuc2V0RGF0ZShlLmdldERhdGUoKSt0KTticmVha310LT1uLWUuZ2V0RGF0ZSgpKzEsZS5zZXREYXRlKDEpLDExPnI/ZS5zZXRNb250aChyKzEpOihlLnNldE1vbnRoKDApLGUuc2V0RnVsbFllYXIoZS5nZXRGdWxsWWVhcigpKzEpKX1yZXR1cm4gcj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCkrMSwwLDQpLHQ9dShuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCw0KSkscj11KHIpLDA+PXModCxlKT8wPj1zKHIsZSk/ZS5nZXRGdWxsWWVhcigpKzE6ZS5nZXRGdWxsWWVhcigpOmUuZ2V0RnVsbFllYXIoKS0xfWU+Pj49MCx0Pj4+PTAscj4+Pj0wLG4+Pj49MDt2YXIgbD1hKClbbis0MD4+Mj4+PjBdO2Zvcih2YXIgZiBpbiBuPXtrYjphKClbbj4+Mj4+PjBdLGpiOmEoKVtuKzQ+PjI+Pj4wXSxNYTphKClbbis4Pj4yPj4+MF0sUWE6YSgpW24rMTI+PjI+Pj4wXSxOYTphKClbbisxNj4+Mj4+PjBdLEthOmEoKVtuKzIwPj4yPj4+MF0sR2E6YSgpW24rMjQ+PjI+Pj4wXSxKYTphKClbbisyOD4+Mj4+PjBdLHNiOmEoKVtuKzMyPj4yPj4+MF0saWI6YSgpW24rMzY+PjI+Pj4wXSxsYjpsP2ZlKGwpOiIifSxyPWZlKHIpLGw9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9KXI9ci5yZXBsYWNlKG5ldyBSZWdFeHAoZiwiZyIpLGxbZl0pO3ZhciBkPSJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheSIuc3BsaXQoIiAiKSxwPSJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyIi5zcGxpdCgiICIpO2ZvcihmIGluIGw9eyIlYSI6ZT0+ZFtlLkdhXS5zdWJzdHJpbmcoMCwzKSwiJUEiOmU9PmRbZS5HYV0sIiViIjplPT5wW2UuTmFdLnN1YnN0cmluZygwLDMpLCIlQiI6ZT0+cFtlLk5hXSwiJUMiOmU9PmkoKGUuS2ErMTkwMCkvMTAwfDAsMiksIiVkIjplPT5pKGUuUWEsMiksIiVlIjplPT5vKGUuUWEsMiwiICIpLCIlZyI6ZT0+YyhlKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJUciOmU9PmMoZSksIiVIIjplPT5pKGUuTWEsMiksIiVJIjplPT4oMD09KGU9ZS5NYSk/ZT0xMjoxMjxlJiYoZS09MTIpLGkoZSwyKSksIiVqIjplPT57Zm9yKHZhciB0PTAscj0wO3I8PWUuTmEtMTt0Kz0oWWUoZS5LYSsxOTAwKT9pdDpzdClbcisrXSk7cmV0dXJuIGkoZS5RYSt0LDMpfSwiJW0iOmU9PmkoZS5OYSsxLDIpLCIlTSI6ZT0+aShlLmpiLDIpLCIlbiI6KCk9PiJcXG4iLCIlcCI6ZT0+MDw9ZS5NYSYmMTI+ZS5NYT8iQU0iOiJQTSIsIiVTIjplPT5pKGUua2IsMiksIiV0IjooKT0+IlxcdCIsIiV1IjplPT5lLkdhfHw3LCIlVSI6ZT0+aShNYXRoLmZsb29yKChlLkphKzctZS5HYSkvNyksMiksIiVWIjplPT57dmFyIHQ9TWF0aC5mbG9vcigoZS5KYSs3LShlLkdhKzYpJTcpLzcpO2lmKDI+PShlLkdhKzM3MS1lLkphLTIpJTcmJnQrKyx0KTUzPT10JiYoND09KHI9KGUuR2ErMzcxLWUuSmEpJTcpfHwzPT1yJiZZZShlLkthKXx8KHQ9MSkpO2Vsc2V7dD01Mjt2YXIgcj0oZS5HYSs3LWUuSmEtMSklNzsoND09cnx8NT09ciYmWWUoZS5LYSU0MDAtMSkpJiZ0Kyt9cmV0dXJuIGkodCwyKX0sIiV3IjplPT5lLkdhLCIlVyI6ZT0+aShNYXRoLmZsb29yKChlLkphKzctKGUuR2ErNiklNykvNyksMiksIiV5IjplPT4oZS5LYSsxOTAwKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJVkiOmU9PmUuS2ErMTkwMCwiJXoiOmU9Pnt2YXIgdD0wPD0oZT1lLmliKTtyZXR1cm4gZT1NYXRoLmFicyhlKS82MCwodD8iKyI6Ii0iKStTdHJpbmcoIjAwMDAiKyhlLzYwKjEwMCtlJTYwKSkuc2xpY2UoLTQpfSwiJVoiOmU9PmUubGIsIiUlIjooKT0+IiUifSxyPXIucmVwbGFjZSgvJSUvZywiXFwwXFwwIiksbClyLmluY2x1ZGVzKGYpJiYocj1yLnJlcGxhY2UobmV3IFJlZ0V4cChmLCJnIiksbFtmXShuKSkpO3JldHVybiBmPWZ1bmN0aW9uKGUpe3ZhciB0PUFycmF5KFNlKGUpKzEpO3JldHVybiBFZShlLHQsMCx0Lmxlbmd0aCksdH0ocj1yLnJlcGxhY2UoL1xcMFxcMC9nLCIlIikpLGYubGVuZ3RoPnQ/MDoodXQoZixlKSxmLmxlbmd0aC0xKX1nZS5QYSgpO3ZhciBsdD1bbnVsbCxkZSxtZSxiZSxfZSxPZSxUZSxNZSxSZSxGZSxrZSxDZSxQZSxEZSx4ZSxJZSxVZSxHZSxOZSxaZSxRZSxldCx0dCxydCxhdF0sZnQ9e2I6ZnVuY3Rpb24oZSx0LHIpe3Rocm93IG5ldyB2ZShlPj4+PTApLlBhKHQ+Pj4wLHI+Pj4wKSxlfSxOOmZ1bmN0aW9uKGUpe2d0KGU+Pj4wLCF5LDEsIW0sMTMxMDcyLCExKSxnZS5TYSgpfSxrOmZ1bmN0aW9uKGUpe2U+Pj49MCxiP3Bvc3RNZXNzYWdlKHtjbWQ6ImNsZWFudXBUaHJlYWQiLHRocmVhZDplfSk6c2UoZSl9LEk6d2UsaDpfZSxUOk9lLEU6VGUsRzpNZSxVOlJlLFI6RmUsSjprZSxROkNlLG86UGUsRjpEZSxDOnhlLFM6SWUsRDpVZSxxOigpPT4hMCxBOmZ1bmN0aW9uKGUsdCl7KGU+Pj49MCk9PXQ+Pj4wP3NldFRpbWVvdXQoKCgpPT5IZSgpKSk6Yj9wb3N0TWVzc2FnZSh7dGFyZ2V0VGhyZWFkOmUsY21kOiJjaGVja01haWxib3gifSk6KGU9Z2UuRmFbZV0pJiZlLnBvc3RNZXNzYWdlKHtjbWQ6ImNoZWNrTWFpbGJveCJ9KX0sTDpmdW5jdGlvbigpe3JldHVybi0xfSxNOldlLHA6ZnVuY3Rpb24oZSl7diYmZ2UuRmFbZT4+PjBdLnJlZigpfSx0OmZ1bmN0aW9uKGUsdCxyKXtlPXQrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKSs0Mjk0OTY3Mjk2KnQ6TmFOLHI+Pj49MCxlPW5ldyBEYXRlKDFlMyplKSxhKClbcj4+Mj4+PjBdPWUuZ2V0VVRDU2Vjb25kcygpLGEoKVtyKzQ+PjI+Pj4wXT1lLmdldFVUQ01pbnV0ZXMoKSxhKClbcis4Pj4yPj4+MF09ZS5nZXRVVENIb3VycygpLGEoKVtyKzEyPj4yPj4+MF09ZS5nZXRVVENEYXRlKCksYSgpW3IrMTY+PjI+Pj4wXT1lLmdldFVUQ01vbnRoKCksYSgpW3IrMjA+PjI+Pj4wXT1lLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCxhKClbcisyND4+Mj4+PjBdPWUuZ2V0VVRDRGF5KCksZT0oZS5nZXRUaW1lKCktRGF0ZS5VVEMoZS5nZXRVVENGdWxsWWVhcigpLDAsMSwwLDAsMCwwKSkvODY0ZTV8MCxhKClbcisyOD4+Mj4+PjBdPWV9LHU6ZnVuY3Rpb24oZSx0LHIpe2U9dCsyMDk3MTUyPj4+MDw0MTk0MzA1LSEhZT8oZT4+PjApKzQyOTQ5NjcyOTYqdDpOYU4scj4+Pj0wLGU9bmV3IERhdGUoMWUzKmUpLGEoKVtyPj4yPj4+MF09ZS5nZXRTZWNvbmRzKCksYSgpW3IrND4+Mj4+PjBdPWUuZ2V0TWludXRlcygpLGEoKVtyKzg+PjI+Pj4wXT1lLmdldEhvdXJzKCksYSgpW3IrMTI+PjI+Pj4wXT1lLmdldERhdGUoKSxhKClbcisxNj4+Mj4+PjBdPWUuZ2V0TW9udGgoKSxhKClbcisyMD4+Mj4+PjBdPWUuZ2V0RnVsbFllYXIoKS0xOTAwLGEoKVtyKzI0Pj4yPj4+MF09ZS5nZXREYXkoKSx0PShZZShlLmdldEZ1bGxZZWFyKCkpP2plOnplKVtlLmdldE1vbnRoKCldK2UuZ2V0RGF0ZSgpLTF8MCxhKClbcisyOD4+Mj4+PjBdPXQsYSgpW3IrMzY+PjI+Pj4wXT0tNjAqZS5nZXRUaW1lem9uZU9mZnNldCgpLHQ9bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgbj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpO2U9MHwodCE9biYmZS5nZXRUaW1lem9uZU9mZnNldCgpPT1NYXRoLm1pbihuLHQpKSxhKClbciszMj4+Mj4+PjBdPWV9LHY6ZnVuY3Rpb24oZSl7ZT4+Pj0wO3ZhciB0PW5ldyBEYXRlKGEoKVtlKzIwPj4yPj4+MF0rMTkwMCxhKClbZSsxNj4+Mj4+PjBdLGEoKVtlKzEyPj4yPj4+MF0sYSgpW2UrOD4+Mj4+PjBdLGEoKVtlKzQ+PjI+Pj4wXSxhKClbZT4+Mj4+PjBdLDApLHI9YSgpW2UrMzI+PjI+Pj4wXSxuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSxvPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCksaT1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpLHM9TWF0aC5taW4oaSxvKTtyZXR1cm4gMD5yP2EoKVtlKzMyPj4yPj4+MF09TnVtYmVyKG8hPWkmJnM9PW4pOjA8ciE9KHM9PW4pJiYobz1NYXRoLm1heChpLG8pLHQuc2V0VGltZSh0LmdldFRpbWUoKSs2ZTQqKCgwPHI/czpvKS1uKSkpLGEoKVtlKzI0Pj4yPj4+MF09dC5nZXREYXkoKSxyPShZZSh0LmdldEZ1bGxZZWFyKCkpP2plOnplKVt0LmdldE1vbnRoKCldK3QuZ2V0RGF0ZSgpLTF8MCxhKClbZSsyOD4+Mj4+PjBdPXIsYSgpW2U+PjI+Pj4wXT10LmdldFNlY29uZHMoKSxhKClbZSs0Pj4yPj4+MF09dC5nZXRNaW51dGVzKCksYSgpW2UrOD4+Mj4+PjBdPXQuZ2V0SG91cnMoKSxhKClbZSsxMj4+Mj4+PjBdPXQuZ2V0RGF0ZSgpLGEoKVtlKzE2Pj4yPj4+MF09dC5nZXRNb250aCgpLGEoKVtlKzIwPj4yPj4+MF09dC5nZXRZZWFyKCksZT10LmdldFRpbWUoKS8xZTMsd3QoKEo9ZSwxPD0rTWF0aC5hYnMoSik/MDxKPytNYXRoLmZsb29yKEovNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoSi0rKH5+Sj4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCkpLGU+Pj4wfSxyOkdlLHM6TmUsejpmdW5jdGlvbihlLHQscil7ZnVuY3Rpb24gbihlKXtyZXR1cm4oZT1lLnRvVGltZVN0cmluZygpLm1hdGNoKC9cXCgoW0EtWmEteiBdKylcXCkkLykpP2VbMV06IkdNVCJ9ZT4+Pj0wLHQ+Pj49MCxyPj4+PTA7dmFyIGk9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLHM9bmV3IERhdGUoaSwwLDEpLHU9bmV3IERhdGUoaSw2LDEpO2k9cy5nZXRUaW1lem9uZU9mZnNldCgpO3ZhciBjPXUuZ2V0VGltZXpvbmVPZmZzZXQoKSxsPU1hdGgubWF4KGksYyk7bygpW2U+PjI+Pj4wXT02MCpsLGEoKVt0Pj4yPj4+MF09TnVtYmVyKGkhPWMpLGU9bihzKSx0PW4odSksZT1CZShlKSx0PUJlKHQpLGM8aT8obygpW3I+PjI+Pj4wXT1lLG8oKVtyKzQ+PjI+Pj4wXT10KToobygpW3I+PjI+Pj4wXT10LG8oKVtyKzQ+PjI+Pj4wXT1lKX0sYzooKT0+e3RlKCIiKX0sbDpmdW5jdGlvbigpe30saTpmdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdygpfSxWOigpPT57dGhyb3cgJCs9MSwidW53aW5kIn0sQjpmdW5jdGlvbigpe3JldHVybiA0Mjk0OTAxNzYwfSxlOigpPT5wZXJmb3JtYW5jZS50aW1lT3JpZ2luK3BlcmZvcm1hbmNlLm5vdygpLGY6ZnVuY3Rpb24oKXtyZXR1cm4gdj9yKDk5MykuY3B1cygpLmxlbmd0aDpuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeX0sSzpmdW5jdGlvbihlLHQscixuKXtmb3IoZ2UucGI9dD4+PjAsSmUubGVuZ3RoPXIsdD1uPj4+MD4+MyxuPTA7bjxyO24rKylKZVtuXT1pKClbdCtuPj4+MF07cmV0dXJuIGx0W2VdLmFwcGx5KG51bGwsSmUpfSx5OmZ1bmN0aW9uKGUpe2U+Pj49MDt2YXIgdD1uKCkubGVuZ3RoO2lmKGU8PXR8fDQyOTQ5MDE3NjA8ZSlyZXR1cm4hMTtmb3IodmFyIHI9MTs0Pj1yO3IqPTIpe3ZhciBhPXQqKDErLjIvcik7YT1NYXRoLm1pbihhLGUrMTAwNjYzMjk2KTt2YXIgbz1NYXRoO2E9TWF0aC5tYXgoZSxhKTtlOntvPW8ubWluLmNhbGwobyw0Mjk0OTAxNzYwLGErKDY1NTM2LWElNjU1MzYpJTY1NTM2KS1rLmJ1ZmZlci5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTY7dHJ5e2suZ3JvdyhvKSxZKCk7dmFyIGk9MTticmVhayBlfWNhdGNoKGUpe31pPXZvaWQgMH1pZihpKXJldHVybiEwfXJldHVybiExfSxPOlplLFA6UWUsajpwZSxnOmV0LG46dHQsdzpydCxtOmF0LHg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT4+Pj0wLHQ+Pj49MCxvdChuKCkuc3ViYXJyYXkoZT4+PjAsZSt0Pj4+MCkpLDB9LGE6a3x8Yy53YXNtTWVtb3J5LEg6Y3QsZDpmdW5jdGlvbihlLHQscixuKXtyZXR1cm4gY3QoZT4+PjAsdD4+PjAscj4+PjAsbj4+PjApfX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3JldHVybiBlPWUuZXhwb3J0cyxDPWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZT0+KCk9PmUoKT4+PjAscj1lPT50PT5lKHQpPj4+MDtyZXR1cm4oZT1PYmplY3QuYXNzaWduKHt9LGUpKS5fX2Vycm5vX2xvY2F0aW9uPXQoZS5fX2Vycm5vX2xvY2F0aW9uKSxlLnB0aHJlYWRfc2VsZj10KGUucHRocmVhZF9zZWxmKSxlLm1hbGxvYz1yKGUubWFsbG9jKSxlLnN0YWNrU2F2ZT10KGUuc3RhY2tTYXZlKSxlLnN0YWNrQWxsb2M9cihlLnN0YWNrQWxsb2MpLGV9KGUpLGdlLlRhLnB1c2goQy5zYSksej1DLnRhLE4udW5zaGlmdChDLlcpLFA9dCxlZSgpLGV9dmFyIHQ9e2E6ZnR9O2lmKFEoKSxjLmluc3RhbnRpYXRlV2FzbSl0cnl7cmV0dXJuIGMuaW5zdGFudGlhdGVXYXNtKHQsZSl9Y2F0Y2goZSl7UigiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIitlKSx1KGUpfShmdW5jdGlvbihlLHQpe3ZhciByPVY7cmV0dXJuIFR8fCJmdW5jdGlvbiIhPXR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZ3x8cmUocil8fHIuc3RhcnRzV2l0aCgiZmlsZTovLyIpfHx2fHwiZnVuY3Rpb24iIT10eXBlb2YgZmV0Y2g/YWUocixlLHQpOmZldGNoKHIse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKChuPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhuLGUpLnRoZW4odCwoZnVuY3Rpb24obil7cmV0dXJuIFIoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK24pLFIoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksYWUocixlLHQpfSkpKSl9KSh0LChmdW5jdGlvbih0KXtlKHQuaW5zdGFuY2UsdC5tb2R1bGUpfSkpLmNhdGNoKHUpfSgpLGMuX09ydEluaXQ9KGUsdCk9PihjLl9PcnRJbml0PUMuWCkoZSx0KSxjLl9PcnRHZXRMYXN0RXJyb3I9KGUsdCk9PihjLl9PcnRHZXRMYXN0RXJyb3I9Qy5ZKShlLHQpLGMuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zPShlLHQscixuLGEsbyxpLHMsdSxsKT0+KGMuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zPUMuWikoZSx0LHIsbixhLG8saSxzLHUsbCksYy5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXI9KGUsdCk9PihjLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj1DLl8pKGUsdCksYy5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PShlLHQscik9PihjLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9Qy4kKShlLHQsciksYy5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zPWU9PihjLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnM9Qy5hYSkoZSksYy5fT3J0Q3JlYXRlU2Vzc2lvbj0oZSx0LHIpPT4oYy5fT3J0Q3JlYXRlU2Vzc2lvbj1DLmJhKShlLHQsciksYy5fT3J0UmVsZWFzZVNlc3Npb249ZT0+KGMuX09ydFJlbGVhc2VTZXNzaW9uPUMuY2EpKGUpLGMuX09ydEdldElucHV0T3V0cHV0Q291bnQ9KGUsdCxyKT0+KGMuX09ydEdldElucHV0T3V0cHV0Q291bnQ9Qy5kYSkoZSx0LHIpLGMuX09ydEdldElucHV0TmFtZT0oZSx0KT0+KGMuX09ydEdldElucHV0TmFtZT1DLmVhKShlLHQpLGMuX09ydEdldE91dHB1dE5hbWU9KGUsdCk9PihjLl9PcnRHZXRPdXRwdXROYW1lPUMuZmEpKGUsdCksYy5fT3J0RnJlZT1lPT4oYy5fT3J0RnJlZT1DLmdhKShlKSxjLl9PcnRDcmVhdGVUZW5zb3I9KGUsdCxyLG4sYSk9PihjLl9PcnRDcmVhdGVUZW5zb3I9Qy5oYSkoZSx0LHIsbixhKSxjLl9PcnRHZXRUZW5zb3JEYXRhPShlLHQscixuLGEpPT4oYy5fT3J0R2V0VGVuc29yRGF0YT1DLmlhKShlLHQscixuLGEpLGMuX09ydFJlbGVhc2VUZW5zb3I9ZT0+KGMuX09ydFJlbGVhc2VUZW5zb3I9Qy5qYSkoZSksYy5fT3J0Q3JlYXRlUnVuT3B0aW9ucz0oZSx0LHIsbik9PihjLl9PcnRDcmVhdGVSdW5PcHRpb25zPUMua2EpKGUsdCxyLG4pLGMuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PShlLHQscik9PihjLl9PcnRBZGRSdW5Db25maWdFbnRyeT1DLmxhKShlLHQsciksYy5fT3J0UmVsZWFzZVJ1bk9wdGlvbnM9ZT0+KGMuX09ydFJlbGVhc2VSdW5PcHRpb25zPUMubWEpKGUpLGMuX09ydFJ1bj0oZSx0LHIsbixhLG8saSxzKT0+KGMuX09ydFJ1bj1DLm5hKShlLHQscixuLGEsbyxpLHMpLGMuX09ydEVuZFByb2ZpbGluZz1lPT4oYy5fT3J0RW5kUHJvZmlsaW5nPUMub2EpKGUpO3ZhciBkdD1jLl9wdGhyZWFkX3NlbGY9KCk9PihkdD1jLl9wdGhyZWFkX3NlbGY9Qy5wYSkoKSxwdD1jLl9tYWxsb2M9ZT0+KHB0PWMuX21hbGxvYz1DLnFhKShlKTtjLl9mcmVlPWU9PihjLl9mcmVlPUMucmEpKGUpLGMuX19lbXNjcmlwdGVuX3Rsc19pbml0PSgpPT4oYy5fX2Vtc2NyaXB0ZW5fdGxzX2luaXQ9Qy5zYSkoKTt2YXIgZ3Q9Yy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQ9KGUsdCxyLG4sYSxvKT0+KGd0PWMuX19lbXNjcmlwdGVuX3RocmVhZF9pbml0PUMudWEpKGUsdCxyLG4sYSxvKTtjLl9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZD0oKT0+KGMuX19lbXNjcmlwdGVuX3RocmVhZF9jcmFzaGVkPUMudmEpKCk7dmFyIGh0LG10PShlLHQscixuKT0+KG10PUMud2EpKGUsdCxyLG4pLHl0PWU9Pih5dD1DLnhhKShlKSx2dD1jLl9fZW1zY3JpcHRlbl90aHJlYWRfZXhpdD1lPT4odnQ9Yy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2V4aXQ9Qy55YSkoZSksYnQ9Yy5fX2Vtc2NyaXB0ZW5fY2hlY2tfbWFpbGJveD0oKT0+KGJ0PWMuX19lbXNjcmlwdGVuX2NoZWNrX21haWxib3g9Qy56YSkoKSx3dD1lPT4od3Q9Qy5BYSkoZSksX3Q9KGUsdCk9PihfdD1DLkJhKShlLHQpLE90PSgpPT4oT3Q9Qy5DYSkoKSxTdD1lPT4oU3Q9Qy5EYSkoZSksRXQ9ZT0+KEV0PUMuRWEpKGUpO2Z1bmN0aW9uIEF0KCl7ZnVuY3Rpb24gZSgpe2lmKCFodCYmKGh0PSEwLGMuY2FsbGVkUnVuPSEwLCFIKSYmKGJ8fGhlKE4pLHMoYyksYy5vblJ1bnRpbWVJbml0aWFsaXplZCYmYy5vblJ1bnRpbWVJbml0aWFsaXplZCgpLCFiKSl7aWYoYy5wb3N0UnVuKWZvcigiZnVuY3Rpb24iPT10eXBlb2YgYy5wb3N0UnVuJiYoYy5wb3N0UnVuPVtjLnBvc3RSdW5dKTtjLnBvc3RSdW4ubGVuZ3RoOyl7dmFyIGU9Yy5wb3N0UnVuLnNoaWZ0KCk7Qi51bnNoaWZ0KGUpfWhlKEIpfX1pZighKDA8WCkpaWYoYilzKGMpLGJ8fGhlKE4pLHN0YXJ0V29ya2VyKGMpO2Vsc2V7aWYoYy5wcmVSdW4pZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBjLnByZVJ1biYmKGMucHJlUnVuPVtjLnByZVJ1bl0pO2MucHJlUnVuLmxlbmd0aDspRy51bnNoaWZ0KGMucHJlUnVuLnNoaWZ0KCkpO2hlKEcpLDA8WHx8KGMuc2V0U3RhdHVzPyhjLnNldFN0YXR1cygiUnVubmluZy4uLiIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtjLnNldFN0YXR1cygiIil9KSwxKSxlKCl9KSwxKSk6ZSgpKX19aWYoYy5rZWVwUnVudGltZUFsaXZlPXEsYy53YXNtTWVtb3J5PWssYy5zdGFja0FsbG9jPUV0LGMuc3RhY2tTYXZlPU90LGMuc3RhY2tSZXN0b3JlPVN0LGMuVVRGOFRvU3RyaW5nPWZlLGMuc3RyaW5nVG9VVEY4PUFlLGMubGVuZ3RoQnl0ZXNVVEY4PVNlLGMuRXhpdFN0YXR1cz1vZSxjLlBUaHJlYWQ9Z2UsWj1mdW5jdGlvbiBlKCl7aHR8fEF0KCksaHR8fChaPWUpfSxjLnByZUluaXQpZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBjLnByZUluaXQmJihjLnByZUluaXQ9W2MucHJlSW5pdF0pOzA8Yy5wcmVJbml0Lmxlbmd0aDspYy5wcmVJbml0LnBvcCgpKCk7cmV0dXJuIEF0KCksZS5yZWFkeX0pO2UuZXhwb3J0cz1ufSw5MzI6KGUsdCxyKT0+e3ZhciBfc2NyaXB0RGlyLG49KF9zY3JpcHREaXI9InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdD9kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYzp2b2lkIDAsInVuZGVmaW5lZCIhPXR5cGVvZiBfX2ZpbGVuYW1lJiYoX3NjcmlwdERpcj1fc2NyaXB0RGlyfHxfX2ZpbGVuYW1lKSxmdW5jdGlvbihlPXt9KXt2YXIgdCxuLGE9ZTthLnJlYWR5PW5ldyBQcm9taXNlKCgoZSxyKT0+e3Q9ZSxuPXJ9KSk7dmFyIG8saSxzLHU9T2JqZWN0LmFzc2lnbih7fSxhKSxjPSIuL3RoaXMucHJvZ3JhbSIsbD0oZSx0KT0+e3Rocm93IHR9LGY9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3csZD0iZnVuY3Rpb24iPT10eXBlb2YgaW1wb3J0U2NyaXB0cyxwPSJvYmplY3QiPT10eXBlb2YgcHJvY2VzcyYmIm9iamVjdCI9PXR5cGVvZiBwcm9jZXNzLnZlcnNpb25zJiYic3RyaW5nIj09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSxnPSIiO2lmKHApe3ZhciBoPXIoMzg0KSxtPXIoOTA4KTtnPWQ/bS5kaXJuYW1lKGcpKyIvIjpfX2Rpcm5hbWUrIi8iLG89KGUsdCk9PihlPWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpP25ldyBVUkwoZSk6bS5ub3JtYWxpemUoZSksaC5yZWFkRmlsZVN5bmMoZSx0P3ZvaWQgMDoidXRmOCIpKSxzPWU9PigoZT1vKGUsITApKS5idWZmZXJ8fChlPW5ldyBVaW50OEFycmF5KGUpKSxlKSxpPShlLHQscixuPSEwKT0+e2U9ZS5zdGFydHNXaXRoKCJmaWxlOi8vIik/bmV3IFVSTChlKTptLm5vcm1hbGl6ZShlKSxoLnJlYWRGaWxlKGUsbj92b2lkIDA6InV0ZjgiLCgoZSxhKT0+e2U/cihlKTp0KG4/YS5idWZmZXI6YSl9KSl9LCFhLnRoaXNQcm9ncmFtJiYxPHByb2Nlc3MuYXJndi5sZW5ndGgmJihjPXByb2Nlc3MuYXJndlsxXS5yZXBsYWNlKC9cXFxcL2csIi8iKSkscHJvY2Vzcy5hcmd2LnNsaWNlKDIpLGw9KGUsdCk9Pnt0aHJvdyBwcm9jZXNzLmV4aXRDb2RlPWUsdH0sYS5pbnNwZWN0PSgpPT4iW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0ifWVsc2UoZnx8ZCkmJihkP2c9c2VsZi5sb2NhdGlvbi5ocmVmOiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQmJihnPWRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjKSxfc2NyaXB0RGlyJiYoZz1fc2NyaXB0RGlyKSxnPTAhPT1nLmluZGV4T2YoImJsb2I6Iik/Zy5zdWJzdHIoMCxnLnJlcGxhY2UoL1s/I10uKi8sIiIpLmxhc3RJbmRleE9mKCIvIikrMSk6IiIsbz1lPT57dmFyIHQ9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB0Lm9wZW4oIkdFVCIsZSwhMSksdC5zZW5kKG51bGwpLHQucmVzcG9uc2VUZXh0fSxkJiYocz1lPT57dmFyIHQ9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB0Lm9wZW4oIkdFVCIsZSwhMSksdC5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIix0LnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkodC5yZXNwb25zZSl9KSxpPShlLHQscik9Pnt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKCJHRVQiLGUsITApLG4ucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsbi5vbmxvYWQ9KCk9PnsyMDA9PW4uc3RhdHVzfHwwPT1uLnN0YXR1cyYmbi5yZXNwb25zZT90KG4ucmVzcG9uc2UpOnIoKX0sbi5vbmVycm9yPXIsbi5zZW5kKG51bGwpfSk7dmFyIHksdj1hLnByaW50fHxjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLGI9YS5wcmludEVycnx8Y29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpO09iamVjdC5hc3NpZ24oYSx1KSx1PW51bGwsYS50aGlzUHJvZ3JhbSYmKGM9YS50aGlzUHJvZ3JhbSksYS5xdWl0JiYobD1hLnF1aXQpLGEud2FzbUJpbmFyeSYmKHk9YS53YXNtQmluYXJ5KTt2YXIgdz1hLm5vRXhpdFJ1bnRpbWV8fCEwOyJvYmplY3QiIT10eXBlb2YgV2ViQXNzZW1ibHkmJlcoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTt2YXIgXyxPLFMsRSxBLFQsTT0hMTtmdW5jdGlvbiBSKCl7dmFyIGU9Xy5idWZmZXI7YS5IRUFQOD1TPW5ldyBJbnQ4QXJyYXkoZSksYS5IRUFQMTY9bmV3IEludDE2QXJyYXkoZSksYS5IRUFQMzI9QT1uZXcgSW50MzJBcnJheShlKSxhLkhFQVBVOD1FPW5ldyBVaW50OEFycmF5KGUpLGEuSEVBUFUxNj1uZXcgVWludDE2QXJyYXkoZSksYS5IRUFQVTMyPVQ9bmV3IFVpbnQzMkFycmF5KGUpLGEuSEVBUEYzMj1uZXcgRmxvYXQzMkFycmF5KGUpLGEuSEVBUEY2ND1uZXcgRmxvYXQ2NEFycmF5KGUpfXZhciBGPVtdLGs9W10sQz1bXTtmdW5jdGlvbiBQKCl7dmFyIGU9YS5wcmVSdW4uc2hpZnQoKTtGLnVuc2hpZnQoZSl9dmFyIEQseCxJPTAsVT1udWxsLEw9bnVsbDtmdW5jdGlvbiBXKGUpe3Rocm93IGEub25BYm9ydCYmYS5vbkFib3J0KGUpLGIoZT0iQWJvcnRlZCgiK2UrIikiKSxNPSEwLGU9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihlKyIuIEJ1aWxkIHdpdGggLXNBU1NFUlRJT05TIGZvciBtb3JlIGluZm8uIiksbihlKSxlfWZ1bmN0aW9uIEgoZSl7cmV0dXJuIGUuc3RhcnRzV2l0aCgiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCIpfWlmKCFIKEQ9Im9ydC13YXNtLndhc20iKSl7dmFyIFk9RDtEPWEubG9jYXRlRmlsZT9hLmxvY2F0ZUZpbGUoWSxnKTpnK1l9ZnVuY3Rpb24gaihlKXtpZihlPT1EJiZ5KXJldHVybiBuZXcgVWludDhBcnJheSh5KTtpZihzKXJldHVybiBzKGUpO3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1mdW5jdGlvbiB6KGUsdCxyKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoIXkmJihmfHxkKSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGZldGNoJiYhZS5zdGFydHNXaXRoKCJmaWxlOi8vIikpcmV0dXJuIGZldGNoKGUse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKCh0PT57aWYoIXQub2spdGhyb3ciZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCBcJyIrZSsiXCciO3JldHVybiB0LmFycmF5QnVmZmVyKCl9KSkuY2F0Y2goKCgpPT5qKGUpKSk7aWYoaSlyZXR1cm4gbmV3IFByb21pc2UoKCh0LHIpPT57aShlLChlPT50KG5ldyBVaW50OEFycmF5KGUpKSkscil9KSl9cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT5qKGUpKSl9KGUpLnRoZW4oKGU9PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGUsdCkpKS50aGVuKChlPT5lKSkudGhlbihyLChlPT57YigiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIitlKSxXKGUpfSkpfWZ1bmN0aW9uIEcoZSl7dGhpcy5uYW1lPSJFeGl0U3RhdHVzIix0aGlzLm1lc3NhZ2U9YFByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoJHtlfSlgLHRoaXMuc3RhdHVzPWV9dmFyIE49ZT0+e2Zvcig7MDxlLmxlbmd0aDspZS5zaGlmdCgpKGEpfTtmdW5jdGlvbiBCKGUpe3RoaXMucWE9ZS0yNCx0aGlzLnZhPWZ1bmN0aW9uKGUpe1RbdGhpcy5xYSs0Pj4yPj4+MF09ZX0sdGhpcy51YT1mdW5jdGlvbihlKXtUW3RoaXMucWErOD4+Mj4+PjBdPWV9LHRoaXMuc2E9ZnVuY3Rpb24oZSx0KXt0aGlzLnRhKCksdGhpcy52YShlKSx0aGlzLnVhKHQpfSx0aGlzLnRhPWZ1bmN0aW9uKCl7VFt0aGlzLnFhKzE2Pj4yPj4+MF09MH19dmFyICQscT0idW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxWPShlLHQscik9Pnt2YXIgbj0odD4+Pj0wKStyO2ZvcihyPXQ7ZVtyXSYmIShyPj1uKTspKytyO2lmKDE2PHItdCYmZS5idWZmZXImJnEpcmV0dXJuIHEuZGVjb2RlKGUuc3ViYXJyYXkodCxyKSk7Zm9yKG49IiI7dDxyOyl7dmFyIGE9ZVt0KytdO2lmKDEyOCZhKXt2YXIgbz02MyZlW3QrK107aWYoMTkyPT0oMjI0JmEpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoKDMxJmEpPDw2fG8pO2Vsc2V7dmFyIGk9NjMmZVt0KytdOzY1NTM2PihhPTIyND09KDI0MCZhKT8oMTUmYSk8PDEyfG88PDZ8aTooNyZhKTw8MTh8bzw8MTJ8aTw8Nnw2MyZlW3QrK10pP24rPVN0cmluZy5mcm9tQ2hhckNvZGUoYSk6KGEtPTY1NTM2LG4rPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8YT4+MTAsNTYzMjB8MTAyMyZhKSl9fWVsc2Ugbis9U3RyaW5nLmZyb21DaGFyQ29kZShhKX1yZXR1cm4gbn0sSj0oZSx0KT0+KGU+Pj49MCk/VihFLGUsdCk6IiIsWD1lPT57Zm9yKHZhciB0PTAscj0wO3I8ZS5sZW5ndGg7KytyKXt2YXIgbj1lLmNoYXJDb2RlQXQocik7MTI3Pj1uP3QrKzoyMDQ3Pj1uP3QrPTI6NTUyOTY8PW4mJjU3MzQzPj1uPyh0Kz00LCsrcik6dCs9M31yZXR1cm4gdH0sSz0oZSx0LHIsbik9PntpZighKDA8bikpcmV0dXJuIDA7dmFyIGE9cj4+Pj0wO249cituLTE7Zm9yKHZhciBvPTA7bzxlLmxlbmd0aDsrK28pe3ZhciBpPWUuY2hhckNvZGVBdChvKTtpZig1NTI5Njw9aSYmNTczNDM+PWkmJihpPTY1NTM2KygoMTAyMyZpKTw8MTApfDEwMjMmZS5jaGFyQ29kZUF0KCsrbykpLDEyNz49aSl7aWYocj49bilicmVhazt0W3IrKz4+PjBdPWl9ZWxzZXtpZigyMDQ3Pj1pKXtpZihyKzE+PW4pYnJlYWs7dFtyKys+Pj4wXT0xOTJ8aT4+Nn1lbHNle2lmKDY1NTM1Pj1pKXtpZihyKzI+PW4pYnJlYWs7dFtyKys+Pj4wXT0yMjR8aT4+MTJ9ZWxzZXtpZihyKzM+PW4pYnJlYWs7dFtyKys+Pj4wXT0yNDB8aT4+MTgsdFtyKys+Pj4wXT0xMjh8aT4+MTImNjN9dFtyKys+Pj4wXT0xMjh8aT4+NiY2M310W3IrKz4+PjBdPTEyOHw2MyZpfX1yZXR1cm4gdFtyPj4+MF09MCxyLWF9LFo9ZT0+MD09ZSU0JiYoMCE9ZSUxMDB8fDA9PWUlNDAwKSxRPVswLDMxLDYwLDkxLDEyMSwxNTIsMTgyLDIxMywyNDQsMjc0LDMwNSwzMzVdLGVlPVswLDMxLDU5LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzRdLHRlPWU9Pnt2YXIgdD1YKGUpKzEscj1sZSh0KTtyZXR1cm4gciYmSyhlLEUscix0KSxyfSxyZT17fSxuZT0oKT0+e2lmKCEkKXt2YXIgZSx0PXtVU0VSOiJ3ZWJfdXNlciIsTE9HTkFNRToid2ViX3VzZXIiLFBBVEg6Ii8iLFBXRDoiLyIsSE9NRToiL2hvbWUvd2ViX3VzZXIiLExBTkc6KCJvYmplY3QiPT10eXBlb2YgbmF2aWdhdG9yJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIsXzpjfHwiLi90aGlzLnByb2dyYW0ifTtmb3IoZSBpbiByZSl2b2lkIDA9PT1yZVtlXT9kZWxldGUgdFtlXTp0W2VdPXJlW2VdO3ZhciByPVtdO2ZvcihlIGluIHQpci5wdXNoKGAke2V9PSR7dFtlXX1gKTskPXJ9cmV0dXJuICR9LGFlPVtudWxsLFtdLFtdXSxvZT1lPT4ob2U9KCgpPT57aWYoIm9iamVjdCI9PXR5cGVvZiBjcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXJldHVybiBlPT5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpO2lmKHApdHJ5e3ZhciBlPXIoNzYwKTtpZihlLnJhbmRvbUZpbGxTeW5jKXJldHVybiB0PT5lLnJhbmRvbUZpbGxTeW5jKHQpO3ZhciB0PWUucmFuZG9tQnl0ZXM7cmV0dXJuIGU9PihlLnNldCh0KGUuYnl0ZUxlbmd0aCkpLGUpfWNhdGNoKGUpe31XKCJpbml0UmFuZG9tRGV2aWNlIil9KSgpKShlKSxpZT1bMzEsMjksMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLHNlPVszMSwyOCwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMV07ZnVuY3Rpb24gdWUoZSx0LHIsbil7ZnVuY3Rpb24gYShlLHQscil7Zm9yKGU9Im51bWJlciI9PXR5cGVvZiBlP2UudG9TdHJpbmcoKTplfHwiIjtlLmxlbmd0aDx0OyllPXJbMF0rZTtyZXR1cm4gZX1mdW5jdGlvbiBvKGUsdCl7cmV0dXJuIGEoZSx0LCIwIil9ZnVuY3Rpb24gaShlLHQpe2Z1bmN0aW9uIHIoZSl7cmV0dXJuIDA+ZT8tMTowPGU/MTowfXZhciBuO3JldHVybiAwPT09KG49cihlLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpKSkmJjA9PT0obj1yKGUuZ2V0TW9udGgoKS10LmdldE1vbnRoKCkpKSYmKG49cihlLmdldERhdGUoKS10LmdldERhdGUoKSkpLG59ZnVuY3Rpb24gcyhlKXtzd2l0Y2goZS5nZXREYXkoKSl7Y2FzZSAwOnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCktMSwxMSwyOSk7Y2FzZSAxOnJldHVybiBlO2Nhc2UgMjpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMyk7Y2FzZSAzOnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwyKTtjYXNlIDQ6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDEpO2Nhc2UgNTpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMzEpO2Nhc2UgNjpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMzApfX1mdW5jdGlvbiB1KGUpe3ZhciB0PWUubWE7Zm9yKGU9bmV3IERhdGUobmV3IERhdGUoZS5uYSsxOTAwLDAsMSkuZ2V0VGltZSgpKTswPHQ7KXt2YXIgcj1lLmdldE1vbnRoKCksbj0oWihlLmdldEZ1bGxZZWFyKCkpP2llOnNlKVtyXTtpZighKHQ+bi1lLmdldERhdGUoKSkpe2Uuc2V0RGF0ZShlLmdldERhdGUoKSt0KTticmVha310LT1uLWUuZ2V0RGF0ZSgpKzEsZS5zZXREYXRlKDEpLDExPnI/ZS5zZXRNb250aChyKzEpOihlLnNldE1vbnRoKDApLGUuc2V0RnVsbFllYXIoZS5nZXRGdWxsWWVhcigpKzEpKX1yZXR1cm4gcj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCkrMSwwLDQpLHQ9cyhuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCw0KSkscj1zKHIpLDA+PWkodCxlKT8wPj1pKHIsZSk/ZS5nZXRGdWxsWWVhcigpKzE6ZS5nZXRGdWxsWWVhcigpOmUuZ2V0RnVsbFllYXIoKS0xfWU+Pj49MCx0Pj4+PTAscj4+Pj0wO3ZhciBjPUFbNDArKG4+Pj49MCk+PjI+Pj4wXTtmb3IodmFyIGwgaW4gbj17eWE6QVtuPj4yPj4+MF0seGE6QVtuKzQ+PjI+Pj4wXSxvYTpBW24rOD4+Mj4+PjBdLHJhOkFbbisxMj4+Mj4+PjBdLHBhOkFbbisxNj4+Mj4+PjBdLG5hOkFbbisyMD4+Mj4+PjBdLGhhOkFbbisyND4+Mj4+PjBdLG1hOkFbbisyOD4+Mj4+PjBdLEFhOkFbbiszMj4+Mj4+PjBdLHdhOkFbbiszNj4+Mj4+PjBdLHphOmM/SihjKToiIn0scj1KKHIpLGM9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9KXI9ci5yZXBsYWNlKG5ldyBSZWdFeHAobCwiZyIpLGNbbF0pO3ZhciBmPSJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheSIuc3BsaXQoIiAiKSxkPSJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyIi5zcGxpdCgiICIpO2ZvcihsIGluIGM9eyIlYSI6ZT0+ZltlLmhhXS5zdWJzdHJpbmcoMCwzKSwiJUEiOmU9PmZbZS5oYV0sIiViIjplPT5kW2UucGFdLnN1YnN0cmluZygwLDMpLCIlQiI6ZT0+ZFtlLnBhXSwiJUMiOmU9Pm8oKGUubmErMTkwMCkvMTAwfDAsMiksIiVkIjplPT5vKGUucmEsMiksIiVlIjplPT5hKGUucmEsMiwiICIpLCIlZyI6ZT0+dShlKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJUciOmU9PnUoZSksIiVIIjplPT5vKGUub2EsMiksIiVJIjplPT4oMD09KGU9ZS5vYSk/ZT0xMjoxMjxlJiYoZS09MTIpLG8oZSwyKSksIiVqIjplPT57Zm9yKHZhciB0PTAscj0wO3I8PWUucGEtMTt0Kz0oWihlLm5hKzE5MDApP2llOnNlKVtyKytdKTtyZXR1cm4gbyhlLnJhK3QsMyl9LCIlbSI6ZT0+byhlLnBhKzEsMiksIiVNIjplPT5vKGUueGEsMiksIiVuIjooKT0+IlxcbiIsIiVwIjplPT4wPD1lLm9hJiYxMj5lLm9hPyJBTSI6IlBNIiwiJVMiOmU9Pm8oZS55YSwyKSwiJXQiOigpPT4iXFx0IiwiJXUiOmU9PmUuaGF8fDcsIiVVIjplPT5vKE1hdGguZmxvb3IoKGUubWErNy1lLmhhKS83KSwyKSwiJVYiOmU9Pnt2YXIgdD1NYXRoLmZsb29yKChlLm1hKzctKGUuaGErNiklNykvNyk7aWYoMj49KGUuaGErMzcxLWUubWEtMiklNyYmdCsrLHQpNTM9PXQmJig0PT0ocj0oZS5oYSszNzEtZS5tYSklNyl8fDM9PXImJlooZS5uYSl8fCh0PTEpKTtlbHNle3Q9NTI7dmFyIHI9KGUuaGErNy1lLm1hLTEpJTc7KDQ9PXJ8fDU9PXImJlooZS5uYSU0MDAtMSkpJiZ0Kyt9cmV0dXJuIG8odCwyKX0sIiV3IjplPT5lLmhhLCIlVyI6ZT0+byhNYXRoLmZsb29yKChlLm1hKzctKGUuaGErNiklNykvNyksMiksIiV5IjplPT4oZS5uYSsxOTAwKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJVkiOmU9PmUubmErMTkwMCwiJXoiOmU9Pnt2YXIgdD0wPD0oZT1lLndhKTtyZXR1cm4gZT1NYXRoLmFicyhlKS82MCwodD8iKyI6Ii0iKStTdHJpbmcoIjAwMDAiKyhlLzYwKjEwMCtlJTYwKSkuc2xpY2UoLTQpfSwiJVoiOmU9PmUuemEsIiUlIjooKT0+IiUifSxyPXIucmVwbGFjZSgvJSUvZywiXFwwXFwwIiksYylyLmluY2x1ZGVzKGwpJiYocj1yLnJlcGxhY2UobmV3IFJlZ0V4cChsLCJnIiksY1tsXShuKSkpO3JldHVybiBsPWZ1bmN0aW9uKGUpe3ZhciB0PUFycmF5KFgoZSkrMSk7cmV0dXJuIEsoZSx0LDAsdC5sZW5ndGgpLHR9KHI9ci5yZXBsYWNlKC9cXDBcXDAvZywiJSIpKSxsLmxlbmd0aD50PzA6KFMuc2V0KGwsZT4+PjApLGwubGVuZ3RoLTEpfXZhciBjZT17YTpmdW5jdGlvbihlLHQscil7dGhyb3cgbmV3IEIoZT4+Pj0wKS5zYSh0Pj4+MCxyPj4+MCksZX0sZTpmdW5jdGlvbigpe3JldHVybiAwfSxJOmZ1bmN0aW9uKCl7fSx5OmZ1bmN0aW9uKCl7fSxBOmZ1bmN0aW9uKCl7fSxLOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LEc6ZnVuY3Rpb24oKXt9LEI6ZnVuY3Rpb24oKXt9LEY6ZnVuY3Rpb24oKXt9LGc6ZnVuY3Rpb24oKXt9LHo6ZnVuY3Rpb24oKXt9LHc6ZnVuY3Rpb24oKXt9LEg6ZnVuY3Rpb24oKXt9LHg6ZnVuY3Rpb24oKXt9LGs6KCk9PiEwLG46ZnVuY3Rpb24oZSx0LHIpe2U9dCsyMDk3MTUyPj4+MDw0MTk0MzA1LSEhZT8oZT4+PjApKzQyOTQ5NjcyOTYqdDpOYU4scj4+Pj0wLGU9bmV3IERhdGUoMWUzKmUpLEFbcj4+Mj4+PjBdPWUuZ2V0VVRDU2Vjb25kcygpLEFbcis0Pj4yPj4+MF09ZS5nZXRVVENNaW51dGVzKCksQVtyKzg+PjI+Pj4wXT1lLmdldFVUQ0hvdXJzKCksQVtyKzEyPj4yPj4+MF09ZS5nZXRVVENEYXRlKCksQVtyKzE2Pj4yPj4+MF09ZS5nZXRVVENNb250aCgpLEFbcisyMD4+Mj4+PjBdPWUuZ2V0VVRDRnVsbFllYXIoKS0xOTAwLEFbcisyND4+Mj4+PjBdPWUuZ2V0VVRDRGF5KCksQVtyKzI4Pj4yPj4+MF09KGUuZ2V0VGltZSgpLURhdGUuVVRDKGUuZ2V0VVRDRnVsbFllYXIoKSwwLDEsMCwwLDAsMCkpLzg2NGU1fDB9LG86ZnVuY3Rpb24oZSx0LHIpe2U9dCsyMDk3MTUyPj4+MDw0MTk0MzA1LSEhZT8oZT4+PjApKzQyOTQ5NjcyOTYqdDpOYU4scj4+Pj0wLGU9bmV3IERhdGUoMWUzKmUpLEFbcj4+Mj4+PjBdPWUuZ2V0U2Vjb25kcygpLEFbcis0Pj4yPj4+MF09ZS5nZXRNaW51dGVzKCksQVtyKzg+PjI+Pj4wXT1lLmdldEhvdXJzKCksQVtyKzEyPj4yPj4+MF09ZS5nZXREYXRlKCksQVtyKzE2Pj4yPj4+MF09ZS5nZXRNb250aCgpLEFbcisyMD4+Mj4+PjBdPWUuZ2V0RnVsbFllYXIoKS0xOTAwLEFbcisyND4+Mj4+PjBdPWUuZ2V0RGF5KCksQVtyKzI4Pj4yPj4+MF09KFooZS5nZXRGdWxsWWVhcigpKT9ROmVlKVtlLmdldE1vbnRoKCldK2UuZ2V0RGF0ZSgpLTF8MCxBW3IrMzY+PjI+Pj4wXT0tNjAqZS5nZXRUaW1lem9uZU9mZnNldCgpLHQ9bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgbj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpO0FbciszMj4+Mj4+PjBdPTB8KHQhPW4mJmUuZ2V0VGltZXpvbmVPZmZzZXQoKT09TWF0aC5taW4obix0KSl9LHA6ZnVuY3Rpb24oZSl7ZT4+Pj0wO3ZhciB0PW5ldyBEYXRlKEFbZSsyMD4+Mj4+PjBdKzE5MDAsQVtlKzE2Pj4yPj4+MF0sQVtlKzEyPj4yPj4+MF0sQVtlKzg+PjI+Pj4wXSxBW2UrND4+Mj4+PjBdLEFbZT4+Mj4+PjBdLDApLHI9QVtlKzMyPj4yPj4+MF0sbj10LmdldFRpbWV6b25lT2Zmc2V0KCksYT1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksNiwxKS5nZXRUaW1lem9uZU9mZnNldCgpLG89bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLDAsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKSxpPU1hdGgubWluKG8sYSk7cmV0dXJuIDA+cj9BW2UrMzI+PjI+Pj4wXT1OdW1iZXIoYSE9byYmaT09bik6MDxyIT0oaT09bikmJihhPU1hdGgubWF4KG8sYSksdC5zZXRUaW1lKHQuZ2V0VGltZSgpKzZlNCooKDA8cj9pOmEpLW4pKSksQVtlKzI0Pj4yPj4+MF09dC5nZXREYXkoKSxBW2UrMjg+PjI+Pj4wXT0oWih0LmdldEZ1bGxZZWFyKCkpP1E6ZWUpW3QuZ2V0TW9udGgoKV0rdC5nZXREYXRlKCktMXwwLEFbZT4+Mj4+PjBdPXQuZ2V0U2Vjb25kcygpLEFbZSs0Pj4yPj4+MF09dC5nZXRNaW51dGVzKCksQVtlKzg+PjI+Pj4wXT10LmdldEhvdXJzKCksQVtlKzEyPj4yPj4+MF09dC5nZXREYXRlKCksQVtlKzE2Pj4yPj4+MF09dC5nZXRNb250aCgpLEFbZSsyMD4+Mj4+PjBdPXQuZ2V0WWVhcigpLGU9dC5nZXRUaW1lKCkvMWUzLGRlKCh4PWUsMTw9K01hdGguYWJzKHgpPzA8eD8rTWF0aC5mbG9vcih4LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHgtKyh+fng+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApKSxlPj4+MH0sbDpmdW5jdGlvbigpe3JldHVybi01Mn0sbTpmdW5jdGlvbigpe30sdTpmdW5jdGlvbihlLHQscil7ZnVuY3Rpb24gbihlKXtyZXR1cm4oZT1lLnRvVGltZVN0cmluZygpLm1hdGNoKC9cXCgoW0EtWmEteiBdKylcXCkkLykpP2VbMV06IkdNVCJ9cj4+Pj0wO3ZhciBhPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSxvPW5ldyBEYXRlKGEsMCwxKSxpPW5ldyBEYXRlKGEsNiwxKTthPW8uZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgcz1pLmdldFRpbWV6b25lT2Zmc2V0KCk7VFtlPj4+MD4+Mj4+PjBdPTYwKk1hdGgubWF4KGEscyksQVt0Pj4+MD4+Mj4+PjBdPU51bWJlcihhIT1zKSxlPW4obyksdD1uKGkpLGU9dGUoZSksdD10ZSh0KSxzPGE/KFRbcj4+Mj4+PjBdPWUsVFtyKzQ+PjI+Pj4wXT10KTooVFtyPj4yPj4+MF09dCxUW3IrND4+Mj4+PjBdPWUpfSxkOigpPT57VygiIil9LGg6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX0sdjpmdW5jdGlvbigpe3JldHVybiA0Mjk0OTAxNzYwfSxiOigpPT5wZXJmb3JtYW5jZS5ub3coKSxKOmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdD4+Pj0wLEUuY29weVdpdGhpbihlPj4+MD4+PjAsdD4+PjAsdCsocj4+PjApPj4+MCl9LHQ6ZnVuY3Rpb24oZSl7ZT4+Pj0wO3ZhciB0PUUubGVuZ3RoO2lmKDQyOTQ5MDE3NjA8ZSlyZXR1cm4hMTtmb3IodmFyIHI9MTs0Pj1yO3IqPTIpe3ZhciBuPXQqKDErLjIvcik7bj1NYXRoLm1pbihuLGUrMTAwNjYzMjk2KTt2YXIgYT1NYXRoO249TWF0aC5tYXgoZSxuKTtlOnthPWEubWluLmNhbGwoYSw0Mjk0OTAxNzYwLG4rKDY1NTM2LW4lNjU1MzYpJTY1NTM2KS1fLmJ1ZmZlci5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTY7dHJ5e18uZ3JvdyhhKSxSKCk7dmFyIG89MTticmVhayBlfWNhdGNoKGUpe31vPXZvaWQgMH1pZihvKXJldHVybiEwfXJldHVybiExfSxEOmZ1bmN0aW9uKGUsdCl7ZT4+Pj0wLHQ+Pj49MDt2YXIgcj0wO3JldHVybiBuZSgpLmZvckVhY2goKGZ1bmN0aW9uKG4sYSl7dmFyIG89dCtyO2ZvcihhPVRbZSs0KmE+PjI+Pj4wXT1vLG89MDtvPG4ubGVuZ3RoOysrbylTW2ErKz4+MD4+PjBdPW4uY2hhckNvZGVBdChvKTtTW2E+PjA+Pj4wXT0wLHIrPW4ubGVuZ3RoKzF9KSksMH0sRTpmdW5jdGlvbihlLHQpe2U+Pj49MCx0Pj4+PTA7dmFyIHI9bmUoKTtUW2U+PjI+Pj4wXT1yLmxlbmd0aDt2YXIgbj0wO3JldHVybiByLmZvckVhY2goKGZ1bmN0aW9uKGUpe24rPWUubGVuZ3RoKzF9KSksVFt0Pj4yPj4+MF09biwwfSxzOmU9Pnt3fHwoYS5vbkV4aXQmJmEub25FeGl0KGUpLE09ITApLGwoZSxuZXcgRyhlKSl9LGY6KCk9PjUyLGo6ZnVuY3Rpb24oKXtyZXR1cm4gNTJ9LHE6ZnVuY3Rpb24oKXtyZXR1cm4gNzB9LGk6ZnVuY3Rpb24oZSx0LHIsbil7dD4+Pj0wLHI+Pj49MCxuPj4+PTA7Zm9yKHZhciBhPTAsbz0wO288cjtvKyspe3ZhciBpPVRbdD4+Mj4+PjBdLHM9VFt0KzQ+PjI+Pj4wXTt0Kz04O2Zvcih2YXIgdT0wO3U8czt1Kyspe3ZhciBjPUVbaSt1Pj4+MF0sbD1hZVtlXTswPT09Y3x8MTA9PT1jPygoMT09PWU/djpiKShWKGwsMCkpLGwubGVuZ3RoPTApOmwucHVzaChjKX1hKz1zfXJldHVybiBUW24+PjI+Pj4wXT1hLDB9LHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT4+Pj0wLG9lKEUuc3ViYXJyYXkoZT4+PjAsZSsodD4+PjApPj4+MCkpLDB9LEM6dWUsYzpmdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdWUoZT4+PjAsdD4+PjAscj4+PjAsbj4+PjApfX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlPWUuZXhwb3J0cyxPPWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZT0+KCk9PmUoKT4+PjAscj1lPT50PT5lKHQpPj4+MDtyZXR1cm4oZT1PYmplY3QuYXNzaWduKHt9LGUpKS5fX2Vycm5vX2xvY2F0aW9uPXQoZS5fX2Vycm5vX2xvY2F0aW9uKSxlLm1hbGxvYz1yKGUubWFsbG9jKSxlLnN0YWNrU2F2ZT10KGUuc3RhY2tTYXZlKSxlLnN0YWNrQWxsb2M9cihlLnN0YWNrQWxsb2MpLGV9KGUpLF89Ty5MLFIoKSxrLnVuc2hpZnQoTy5NKSxJLS0sYS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZhLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoSSksMD09SSYmKG51bGwhPT1VJiYoY2xlYXJJbnRlcnZhbChVKSxVPW51bGwpLEwpKXt2YXIgdD1MO0w9bnVsbCx0KCl9cmV0dXJuIGV9dmFyIHQ9e2E6Y2V9O2lmKEkrKyxhLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJmEubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhJKSxhLmluc3RhbnRpYXRlV2FzbSl0cnl7cmV0dXJuIGEuaW5zdGFudGlhdGVXYXNtKHQsZSl9Y2F0Y2goZSl7YigiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIitlKSxuKGUpfShmdW5jdGlvbihlLHQpe3ZhciByPUQ7cmV0dXJuIHl8fCJmdW5jdGlvbiIhPXR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZ3x8SChyKXx8ci5zdGFydHNXaXRoKCJmaWxlOi8vIil8fHB8fCJmdW5jdGlvbiIhPXR5cGVvZiBmZXRjaD96KHIsZSx0KTpmZXRjaChyLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbigobj0+V2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcobixlKS50aGVuKHQsKGZ1bmN0aW9uKG4pe3JldHVybiBiKCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogIituKSxiKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpLHoocixlLHQpfSkpKSl9KSh0LChmdW5jdGlvbih0KXtlKHQuaW5zdGFuY2UpfSkpLmNhdGNoKG4pfSgpLGEuX09ydEluaXQ9KGUsdCk9PihhLl9PcnRJbml0PU8uTikoZSx0KSxhLl9PcnRHZXRMYXN0RXJyb3I9KGUsdCk9PihhLl9PcnRHZXRMYXN0RXJyb3I9Ty5PKShlLHQpLGEuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zPShlLHQscixuLG8saSxzLHUsYyxsKT0+KGEuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zPU8uUCkoZSx0LHIsbixvLGkscyx1LGMsbCksYS5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXI9KGUsdCk9PihhLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj1PLlEpKGUsdCksYS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PShlLHQscik9PihhLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9Ty5SKShlLHQsciksYS5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zPWU9PihhLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnM9Ty5TKShlKSxhLl9PcnRDcmVhdGVTZXNzaW9uPShlLHQscik9PihhLl9PcnRDcmVhdGVTZXNzaW9uPU8uVCkoZSx0LHIpLGEuX09ydFJlbGVhc2VTZXNzaW9uPWU9PihhLl9PcnRSZWxlYXNlU2Vzc2lvbj1PLlUpKGUpLGEuX09ydEdldElucHV0T3V0cHV0Q291bnQ9KGUsdCxyKT0+KGEuX09ydEdldElucHV0T3V0cHV0Q291bnQ9Ty5WKShlLHQsciksYS5fT3J0R2V0SW5wdXROYW1lPShlLHQpPT4oYS5fT3J0R2V0SW5wdXROYW1lPU8uVykoZSx0KSxhLl9PcnRHZXRPdXRwdXROYW1lPShlLHQpPT4oYS5fT3J0R2V0T3V0cHV0TmFtZT1PLlgpKGUsdCksYS5fT3J0RnJlZT1lPT4oYS5fT3J0RnJlZT1PLlkpKGUpLGEuX09ydENyZWF0ZVRlbnNvcj0oZSx0LHIsbixvKT0+KGEuX09ydENyZWF0ZVRlbnNvcj1PLlopKGUsdCxyLG4sbyksYS5fT3J0R2V0VGVuc29yRGF0YT0oZSx0LHIsbixvKT0+KGEuX09ydEdldFRlbnNvckRhdGE9Ty5fKShlLHQscixuLG8pLGEuX09ydFJlbGVhc2VUZW5zb3I9ZT0+KGEuX09ydFJlbGVhc2VUZW5zb3I9Ty4kKShlKSxhLl9PcnRDcmVhdGVSdW5PcHRpb25zPShlLHQscixuKT0+KGEuX09ydENyZWF0ZVJ1bk9wdGlvbnM9Ty5hYSkoZSx0LHIsbiksYS5fT3J0QWRkUnVuQ29uZmlnRW50cnk9KGUsdCxyKT0+KGEuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PU8uYmEpKGUsdCxyKSxhLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1lPT4oYS5fT3J0UmVsZWFzZVJ1bk9wdGlvbnM9Ty5jYSkoZSksYS5fT3J0UnVuPShlLHQscixuLG8saSxzLHUpPT4oYS5fT3J0UnVuPU8uZGEpKGUsdCxyLG4sbyxpLHMsdSksYS5fT3J0RW5kUHJvZmlsaW5nPWU9PihhLl9PcnRFbmRQcm9maWxpbmc9Ty5lYSkoZSk7dmFyIGxlPWEuX21hbGxvYz1lPT4obGU9YS5fbWFsbG9jPU8uZmEpKGUpO2EuX2ZyZWU9ZT0+KGEuX2ZyZWU9Ty5nYSkoZSk7dmFyIGZlLGRlPWU9PihkZT1PLmlhKShlKSxwZT0oKT0+KHBlPU8uamEpKCksZ2U9ZT0+KGdlPU8ua2EpKGUpLGhlPWU9PihoZT1PLmxhKShlKTtmdW5jdGlvbiBtZSgpe2Z1bmN0aW9uIGUoKXtpZighZmUmJihmZT0hMCxhLmNhbGxlZFJ1bj0hMCwhTSkpe2lmKE4oayksdChhKSxhLm9uUnVudGltZUluaXRpYWxpemVkJiZhLm9uUnVudGltZUluaXRpYWxpemVkKCksYS5wb3N0UnVuKWZvcigiZnVuY3Rpb24iPT10eXBlb2YgYS5wb3N0UnVuJiYoYS5wb3N0UnVuPVthLnBvc3RSdW5dKTthLnBvc3RSdW4ubGVuZ3RoOyl7dmFyIGU9YS5wb3N0UnVuLnNoaWZ0KCk7Qy51bnNoaWZ0KGUpfU4oQyl9fWlmKCEoMDxJKSl7aWYoYS5wcmVSdW4pZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBhLnByZVJ1biYmKGEucHJlUnVuPVthLnByZVJ1bl0pO2EucHJlUnVuLmxlbmd0aDspUCgpO04oRiksMDxJfHwoYS5zZXRTdGF0dXM/KGEuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Euc2V0U3RhdHVzKCIiKX0pLDEpLGUoKX0pLDEpKTplKCkpfX1pZihhLnN0YWNrQWxsb2M9aGUsYS5zdGFja1NhdmU9cGUsYS5zdGFja1Jlc3RvcmU9Z2UsYS5VVEY4VG9TdHJpbmc9SixhLnN0cmluZ1RvVVRGOD0oZSx0LHIpPT5LKGUsRSx0LHIpLGEubGVuZ3RoQnl0ZXNVVEY4PVgsTD1mdW5jdGlvbiBlKCl7ZmV8fG1lKCksZmV8fChMPWUpfSxhLnByZUluaXQpZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBhLnByZUluaXQmJihhLnByZUluaXQ9W2EucHJlSW5pdF0pOzA8YS5wcmVJbml0Lmxlbmd0aDspYS5wcmVJbml0LnBvcCgpKCk7cmV0dXJuIG1lKCksZS5yZWFkeX0pO2UuZXhwb3J0cz1ufSwxNTQ6ZT0+eyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9XCcidXNlIHN0cmljdCI7dmFyIGU9e30sYT0ib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MmJiJvYmplY3QiPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyYmInN0cmluZyI9PXR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGU7aWYoYSl7dmFyIHI9cmVxdWlyZSgid29ya2VyX3RocmVhZHMiKSx0PXIucGFyZW50UG9ydDt0Lm9uKCJtZXNzYWdlIiwoZT0+b25tZXNzYWdlKHtkYXRhOmV9KSkpO3ZhciBzPXJlcXVpcmUoImZzIik7T2JqZWN0LmFzc2lnbihnbG9iYWwse3NlbGY6Z2xvYmFsLHJlcXVpcmU6cmVxdWlyZSxNb2R1bGU6ZSxsb2NhdGlvbjp7aHJlZjpfX2ZpbGVuYW1lfSxXb3JrZXI6ci5Xb3JrZXIsaW1wb3J0U2NyaXB0czplPT4oMCxldmFsKShzLnJlYWRGaWxlU3luYyhlLCJ1dGY4IikrIi8vIyBzb3VyY2VVUkw9IitlKSxwb3N0TWVzc2FnZTplPT50LnBvc3RNZXNzYWdlKGUpLHBlcmZvcm1hbmNlOmdsb2JhbC5wZXJmb3JtYW5jZXx8e25vdzpEYXRlLm5vd319KX12YXIgbz0hMSxkPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIgIik7YT9zLndyaXRlU3luYygyLGUrIlxcXFxuIik6Y29uc29sZS5lcnJvcihlKX07c2VsZi5hbGVydD1mdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiICIpO3Bvc3RNZXNzYWdlKHtjbWQ6ImFsZXJ0Iix0ZXh0OmEsdGhyZWFkSWQ6ZS5fcHRocmVhZF9zZWxmKCl9KX0sZS5pbnN0YW50aWF0ZVdhc209KGEscik9Pnt2YXIgdD1lLndhc21Nb2R1bGU7cmV0dXJuIGUud2FzbU1vZHVsZT1udWxsLHIobmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKHQsYSkpfSxzZWxmLm9udW5oYW5kbGVkcmVqZWN0aW9uPWU9Pnt0aHJvdyBlLnJlYXNvbj8/ZX0sc2VsZi5vbm1lc3NhZ2U9ZnVuY3Rpb24gYShyKXt0cnl7aWYoImxvYWQiPT09ci5kYXRhLmNtZCl7bGV0IHM9W107c2VsZi5vbm1lc3NhZ2U9ZT0+cy5wdXNoKGUpLHNlbGYuc3RhcnRXb3JrZXI9cj0+e2U9cixwb3N0TWVzc2FnZSh7Y21kOiJsb2FkZWQifSk7Zm9yKGxldCBlIG9mIHMpYShlKTtzZWxmLm9ubWVzc2FnZT1hfSxlLndhc21Nb2R1bGU9ci5kYXRhLndhc21Nb2R1bGU7Zm9yKGNvbnN0IGEgb2Ygci5kYXRhLmhhbmRsZXJzKWVbYV09KC4uLmUpPT57cG9zdE1lc3NhZ2Uoe2NtZDoiY2FsbEhhbmRsZXIiLGhhbmRsZXI6YSxhcmdzOmV9KX07aWYoZS53YXNtTWVtb3J5PXIuZGF0YS53YXNtTWVtb3J5LGUuYnVmZmVyPWUud2FzbU1lbW9yeS5idWZmZXIsZS5FTlZJUk9OTUVOVF9JU19QVEhSRUFEPSEwLCJzdHJpbmciPT10eXBlb2Ygci5kYXRhLnVybE9yQmxvYilpbXBvcnRTY3JpcHRzKHIuZGF0YS51cmxPckJsb2IpO2Vsc2V7dmFyIHQ9VVJMLmNyZWF0ZU9iamVjdFVSTChyLmRhdGEudXJsT3JCbG9iKTtpbXBvcnRTY3JpcHRzKHQpLFVSTC5yZXZva2VPYmplY3RVUkwodCl9b3J0V2FzbVRocmVhZGVkKGUpfWVsc2UgaWYoInJ1biI9PT1yLmRhdGEuY21kKXtlLl9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdChyLmRhdGEucHRocmVhZF9wdHIsMCwwLDEpLGUuX19lbXNjcmlwdGVuX3RocmVhZF9tYWlsYm94X2F3YWl0KHIuZGF0YS5wdGhyZWFkX3B0ciksZS5lc3RhYmxpc2hTdGFja1NwYWNlKCksZS5QVGhyZWFkLnJlY2VpdmVPYmplY3RUcmFuc2ZlcihyLmRhdGEpLGUuUFRocmVhZC50aHJlYWRJbml0VExTKCksb3x8KG89ITApO3RyeXtlLmludm9rZUVudHJ5UG9pbnQoci5kYXRhLnN0YXJ0X3JvdXRpbmUsci5kYXRhLmFyZyl9Y2F0Y2goZSl7aWYoInVud2luZCIhPWUpdGhyb3cgZX19ZWxzZSJjYW5jZWwiPT09ci5kYXRhLmNtZD9lLl9wdGhyZWFkX3NlbGYoKSYmZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2V4aXQoLTEpOiJzZXRpbW1lZGlhdGUiPT09ci5kYXRhLnRhcmdldHx8KCJjaGVja01haWxib3giPT09ci5kYXRhLmNtZD9vJiZlLmNoZWNrTWFpbGJveCgpOnIuZGF0YS5jbWQmJihkKCJ3b3JrZXIuanMgcmVjZWl2ZWQgdW5rbm93biBjb21tYW5kICIrci5kYXRhLmNtZCksZChyLmRhdGEpKSl9Y2F0Y2goYSl7dGhyb3cgZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2NyYXNoZWQmJmUuX19lbXNjcmlwdGVuX3RocmVhZF9jcmFzaGVkKCksYX19O1xcblwnfSw3NjA6KCk9Pnt9LDM4NDooKT0+e30sOTkzOigpPT57fSw5MDg6KCk9Pnt9LDk1MzooKT0+e30sOTI1OigpPT57fSw0NDk6KCk9Pnt9fSx0PXt9O2Z1bmN0aW9uIHIobil7dmFyIGE9dFtuXTtpZih2b2lkIDAhPT1hKXJldHVybiBhLmV4cG9ydHM7dmFyIG89dFtuXT17ZXhwb3J0czp7fX07cmV0dXJuIGVbbl0uY2FsbChvLmV4cG9ydHMsbyxvLmV4cG9ydHMsciksby5leHBvcnRzfSgoKT0+eyJ1c2Ugc3RyaWN0Ijtjb25zdCBlPXIoMjU5KSx0PXIoMjYzKTtzZWxmLm9ubWVzc2FnZT1yPT57c3dpdGNoKHIuZGF0YS50eXBlKXtjYXNlImluaXQtd2FzbSI6dHJ5eygwLHQuaW5pdGlhbGl6ZVdlYkFzc2VtYmx5KShyLmRhdGEuaW4pLnRoZW4oKCgpPT5wb3N0TWVzc2FnZSh7dHlwZToiaW5pdC13YXNtIn0pKSwoZT0+cG9zdE1lc3NhZ2Uoe3R5cGU6ImluaXQtd2FzbSIsZXJyOmV9KSkpfWNhdGNoKGUpe3Bvc3RNZXNzYWdlKHt0eXBlOiJpbml0LXdhc20iLGVycjplfSl9YnJlYWs7Y2FzZSJpbml0LW9ydCI6dHJ5eygwLGUuaW5pdFJ1bnRpbWUpKHIuZGF0YS5pbikudGhlbigoKCk9PnBvc3RNZXNzYWdlKHt0eXBlOiJpbml0LW9ydCJ9KSksKGU9PnBvc3RNZXNzYWdlKHt0eXBlOiJpbml0LW9ydCIsZXJyOmV9KSkpLHBvc3RNZXNzYWdlKHt0eXBlOiJpbml0LW9ydCJ9KX1jYXRjaChlKXtwb3N0TWVzc2FnZSh7dHlwZToiaW5pdC1vcnQiLGVycjplfSl9YnJlYWs7Y2FzZSJjcmVhdGVfYWxsb2NhdGUiOnRyeXtjb25zdHttb2RlbDp0fT1yLmRhdGEuaW4sbj0oMCxlLmNyZWF0ZVNlc3Npb25BbGxvY2F0ZSkodCk7cG9zdE1lc3NhZ2Uoe3R5cGU6ImNyZWF0ZV9hbGxvY2F0ZSIsb3V0Om59KX1jYXRjaChlKXtwb3N0TWVzc2FnZSh7dHlwZToiY3JlYXRlX2FsbG9jYXRlIixlcnI6ZX0pfWJyZWFrO2Nhc2UiY3JlYXRlX2ZpbmFsaXplIjp0cnl7Y29uc3R7bW9kZWxkYXRhOnQsb3B0aW9uczpufT1yLmRhdGEuaW4sYT0oMCxlLmNyZWF0ZVNlc3Npb25GaW5hbGl6ZSkodCxuKTtwb3N0TWVzc2FnZSh7dHlwZToiY3JlYXRlX2ZpbmFsaXplIixvdXQ6YX0pfWNhdGNoKGUpe3Bvc3RNZXNzYWdlKHt0eXBlOiJjcmVhdGVfZmluYWxpemUiLGVycjplfSl9YnJlYWs7Y2FzZSJjcmVhdGUiOnRyeXtjb25zdHttb2RlbDp0LG9wdGlvbnM6bn09ci5kYXRhLmluLGE9KDAsZS5jcmVhdGVTZXNzaW9uKSh0LG4pO3Bvc3RNZXNzYWdlKHt0eXBlOiJjcmVhdGUiLG91dDphfSl9Y2F0Y2goZSl7cG9zdE1lc3NhZ2Uoe3R5cGU6ImNyZWF0ZSIsZXJyOmV9KX1icmVhaztjYXNlInJlbGVhc2UiOnRyeXtjb25zdCB0PXIuZGF0YS5pbjsoMCxlLnJlbGVhc2VTZXNzaW9uKSh0KSxwb3N0TWVzc2FnZSh7dHlwZToicmVsZWFzZSJ9KX1jYXRjaChlKXtwb3N0TWVzc2FnZSh7dHlwZToicmVsZWFzZSIsZXJyOmV9KX1icmVhaztjYXNlInJ1biI6dHJ5e2NvbnN0e3Nlc3Npb25JZDp0LGlucHV0SW5kaWNlczpuLGlucHV0czphLG91dHB1dEluZGljZXM6byxvcHRpb25zOml9PXIuZGF0YS5pbjsoMCxlLnJ1bikodCxuLGEsbyxpKS50aGVuKCh0PT57cG9zdE1lc3NhZ2Uoe3R5cGU6InJ1biIsb3V0OnR9LCgwLGUuZXh0cmFjdFRyYW5zZmVyYWJsZUJ1ZmZlcnMpKHQpKX0pLChlPT57cG9zdE1lc3NhZ2Uoe3R5cGU6InJ1biIsZXJyOmV9KX0pKX1jYXRjaChlKXtwb3N0TWVzc2FnZSh7dHlwZToicnVuIixlcnI6ZX0pfWJyZWFrO2Nhc2UiZW5kLXByb2ZpbGluZyI6dHJ5e2NvbnN0IHQ9ci5kYXRhLmluOygwLGUuZW5kUHJvZmlsaW5nKSh0KSxwb3N0TWVzc2FnZSh7dHlwZToiZW5kLXByb2ZpbGluZyJ9KX1jYXRjaChlKXtwb3N0TWVzc2FnZSh7dHlwZToiZW5kLXByb2ZpbGluZyIsZXJyOmV9KX19fX0pKCl9KSgpO1xuJywiV29ya2VyIix2b2lkIDAsdm9pZCAwKX19LDY2MTQ6ZT0+e2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz1zZWxmfHx3aW5kb3c7dHJ5e3RyeXt2YXIgaTt0cnl7aT1uZXcgby5CbG9iKFtlXSk7fWNhdGNoKHQpeyhpPW5ldyhvLkJsb2JCdWlsZGVyfHxvLldlYktpdEJsb2JCdWlsZGVyfHxvLk1vekJsb2JCdWlsZGVyfHxvLk1TQmxvYkJ1aWxkZXIpKS5hcHBlbmQoZSksaT1pLmdldEJsb2IoKTt9dmFyIHM9by5VUkx8fG8ud2Via2l0VVJMLGE9cy5jcmVhdGVPYmplY3RVUkwoaSksdT1uZXcgb1t0XShhLG4pO3JldHVybiBzLnJldm9rZU9iamVjdFVSTChhKSx1fWNhdGNoKHIpe3JldHVybiBuZXcgb1t0XSgiZGF0YTphcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCIuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChlKSksbil9fWNhdGNoKGUpe2lmKCFyKXRocm93IEVycm9yKCJJbmxpbmUgd29ya2VyIGlzIG5vdCBzdXBwb3J0ZWQiKTtyZXR1cm4gbmV3IG9bdF0ocixuKX19O30sMjQ0NjooZSx0LG4pPT57dmFyIHIsbyxpLHM9bigyMTAwKSxhPXMuUmVhZGVyLHU9cy5Xcml0ZXIsbD1zLnV0aWwsYz1zLnJvb3RzLmRlZmF1bHR8fChzLnJvb3RzLmRlZmF1bHQ9e30pO2Mub25ueD0oKGk9e30pLlZlcnNpb249KHI9e30sKG89T2JqZWN0LmNyZWF0ZShyKSlbclswXT0iX1NUQVJUX1ZFUlNJT04iXT0wLG9bclsxXT0iSVJfVkVSU0lPTl8yMDE3XzEwXzEwIl09MSxvW3JbMl09IklSX1ZFUlNJT05fMjAxN18xMF8zMCJdPTIsb1tyWzNdPSJJUl9WRVJTSU9OXzIwMTdfMTFfMyJdPTMsb1tyWzRdPSJJUl9WRVJTSU9OXzIwMTlfMV8yMiJdPTQsb1tyWzVdPSJJUl9WRVJTSU9OXzIwMTlfM18xOCJdPTUsb1tyWzZdPSJJUl9WRVJTSU9OXzIwMTlfOV8xOSJdPTYsb1tyWzddPSJJUl9WRVJTSU9OXzIwMjBfNV84Il09NyxvW3JbOF09IklSX1ZFUlNJT05fMjAyMV83XzMwIl09OCxvW3JbOV09IklSX1ZFUlNJT04iXT05LG8pLGkuQXR0cmlidXRlUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuZmxvYXRzPVtdLHRoaXMuaW50cz1bXSx0aGlzLnN0cmluZ3M9W10sdGhpcy50ZW5zb3JzPVtdLHRoaXMuZ3JhcGhzPVtdLHRoaXMuc3BhcnNlVGVuc29ycz1bXSx0aGlzLnR5cGVQcm90b3M9W10sZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUubmFtZT0iIixlLnByb3RvdHlwZS5yZWZBdHRyTmFtZT0iIixlLnByb3RvdHlwZS5kb2NTdHJpbmc9IiIsZS5wcm90b3R5cGUudHlwZT0wLGUucHJvdG90eXBlLmY9MCxlLnByb3RvdHlwZS5pPWwuTG9uZz9sLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLGUucHJvdG90eXBlLnM9bC5uZXdCdWZmZXIoW10pLGUucHJvdG90eXBlLnQ9bnVsbCxlLnByb3RvdHlwZS5nPW51bGwsZS5wcm90b3R5cGUuc3BhcnNlVGVuc29yPW51bGwsZS5wcm90b3R5cGUudHA9bnVsbCxlLnByb3RvdHlwZS5mbG9hdHM9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmludHM9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnN0cmluZ3M9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnRlbnNvcnM9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmdyYXBocz1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuc3BhcnNlVGVuc29ycz1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUudHlwZVByb3Rvcz1sLmVtcHR5QXJyYXksZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe2lmKHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUubmFtZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwibmFtZSIpJiZ0LnVpbnQzMigxMCkuc3RyaW5nKGUubmFtZSksbnVsbCE9ZS5mJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJmIikmJnQudWludDMyKDIxKS5mbG9hdChlLmYpLG51bGwhPWUuaSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiaSIpJiZ0LnVpbnQzMigyNCkuaW50NjQoZS5pKSxudWxsIT1lLnMmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInMiKSYmdC51aW50MzIoMzQpLmJ5dGVzKGUucyksbnVsbCE9ZS50JiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJ0IikmJmMub25ueC5UZW5zb3JQcm90by5lbmNvZGUoZS50LHQudWludDMyKDQyKS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuZyYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZyIpJiZjLm9ubnguR3JhcGhQcm90by5lbmNvZGUoZS5nLHQudWludDMyKDUwKS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuZmxvYXRzJiZlLmZsb2F0cy5sZW5ndGgpe3QudWludDMyKDU4KS5mb3JrKCk7Zm9yKHZhciBuPTA7bjxlLmZsb2F0cy5sZW5ndGg7KytuKXQuZmxvYXQoZS5mbG9hdHNbbl0pO3QubGRlbGltKCk7fWlmKG51bGwhPWUuaW50cyYmZS5pbnRzLmxlbmd0aCl7Zm9yKHQudWludDMyKDY2KS5mb3JrKCksbj0wO248ZS5pbnRzLmxlbmd0aDsrK24pdC5pbnQ2NChlLmludHNbbl0pO3QubGRlbGltKCk7fWlmKG51bGwhPWUuc3RyaW5ncyYmZS5zdHJpbmdzLmxlbmd0aClmb3Iobj0wO248ZS5zdHJpbmdzLmxlbmd0aDsrK24pdC51aW50MzIoNzQpLmJ5dGVzKGUuc3RyaW5nc1tuXSk7aWYobnVsbCE9ZS50ZW5zb3JzJiZlLnRlbnNvcnMubGVuZ3RoKWZvcihuPTA7bjxlLnRlbnNvcnMubGVuZ3RoOysrbiljLm9ubnguVGVuc29yUHJvdG8uZW5jb2RlKGUudGVuc29yc1tuXSx0LnVpbnQzMig4MikuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLmdyYXBocyYmZS5ncmFwaHMubGVuZ3RoKWZvcihuPTA7bjxlLmdyYXBocy5sZW5ndGg7KytuKWMub25ueC5HcmFwaFByb3RvLmVuY29kZShlLmdyYXBoc1tuXSx0LnVpbnQzMig5MCkuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLmRvY1N0cmluZyYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZG9jU3RyaW5nIikmJnQudWludDMyKDEwNikuc3RyaW5nKGUuZG9jU3RyaW5nKSxudWxsIT1lLnRwJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJ0cCIpJiZjLm9ubnguVHlwZVByb3RvLmVuY29kZShlLnRwLHQudWludDMyKDExNCkuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLnR5cGVQcm90b3MmJmUudHlwZVByb3Rvcy5sZW5ndGgpZm9yKG49MDtuPGUudHlwZVByb3Rvcy5sZW5ndGg7KytuKWMub25ueC5UeXBlUHJvdG8uZW5jb2RlKGUudHlwZVByb3Rvc1tuXSx0LnVpbnQzMigxMjIpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS50eXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJ0eXBlIikmJnQudWludDMyKDE2MCkuaW50MzIoZS50eXBlKSxudWxsIT1lLnJlZkF0dHJOYW1lJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJyZWZBdHRyTmFtZSIpJiZ0LnVpbnQzMigxNzApLnN0cmluZyhlLnJlZkF0dHJOYW1lKSxudWxsIT1lLnNwYXJzZVRlbnNvciYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwic3BhcnNlVGVuc29yIikmJmMub25ueC5TcGFyc2VUZW5zb3JQcm90by5lbmNvZGUoZS5zcGFyc2VUZW5zb3IsdC51aW50MzIoMTc4KS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuc3BhcnNlVGVuc29ycyYmZS5zcGFyc2VUZW5zb3JzLmxlbmd0aClmb3Iobj0wO248ZS5zcGFyc2VUZW5zb3JzLmxlbmd0aDsrK24pYy5vbm54LlNwYXJzZVRlbnNvclByb3RvLmVuY29kZShlLnNwYXJzZVRlbnNvcnNbbl0sdC51aW50MzIoMTg2KS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiB0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguQXR0cmlidXRlUHJvdG87ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci5uYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAyMTpyLnJlZkF0dHJOYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAxMzpyLmRvY1N0cmluZz1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMjA6ci50eXBlPWUuaW50MzIoKTticmVhaztjYXNlIDI6ci5mPWUuZmxvYXQoKTticmVhaztjYXNlIDM6ci5pPWUuaW50NjQoKTticmVhaztjYXNlIDQ6ci5zPWUuYnl0ZXMoKTticmVhaztjYXNlIDU6ci50PWMub25ueC5UZW5zb3JQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDY6ci5nPWMub25ueC5HcmFwaFByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMjI6ci5zcGFyc2VUZW5zb3I9Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMTQ6ci50cD1jLm9ubnguVHlwZVByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgNzppZihyLmZsb2F0cyYmci5mbG9hdHMubGVuZ3RofHwoci5mbG9hdHM9W10pLDI9PSg3Jm8pKWZvcih2YXIgaT1lLnVpbnQzMigpK2UucG9zO2UucG9zPGk7KXIuZmxvYXRzLnB1c2goZS5mbG9hdCgpKTtlbHNlIHIuZmxvYXRzLnB1c2goZS5mbG9hdCgpKTticmVhaztjYXNlIDg6aWYoci5pbnRzJiZyLmludHMubGVuZ3RofHwoci5pbnRzPVtdKSwyPT0oNyZvKSlmb3IoaT1lLnVpbnQzMigpK2UucG9zO2UucG9zPGk7KXIuaW50cy5wdXNoKGUuaW50NjQoKSk7ZWxzZSByLmludHMucHVzaChlLmludDY0KCkpO2JyZWFrO2Nhc2UgOTpyLnN0cmluZ3MmJnIuc3RyaW5ncy5sZW5ndGh8fChyLnN0cmluZ3M9W10pLHIuc3RyaW5ncy5wdXNoKGUuYnl0ZXMoKSk7YnJlYWs7Y2FzZSAxMDpyLnRlbnNvcnMmJnIudGVuc29ycy5sZW5ndGh8fChyLnRlbnNvcnM9W10pLHIudGVuc29ycy5wdXNoKGMub25ueC5UZW5zb3JQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAxMTpyLmdyYXBocyYmci5ncmFwaHMubGVuZ3RofHwoci5ncmFwaHM9W10pLHIuZ3JhcGhzLnB1c2goYy5vbm54LkdyYXBoUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMjM6ci5zcGFyc2VUZW5zb3JzJiZyLnNwYXJzZVRlbnNvcnMubGVuZ3RofHwoci5zcGFyc2VUZW5zb3JzPVtdKSxyLnNwYXJzZVRlbnNvcnMucHVzaChjLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTU6ci50eXBlUHJvdG9zJiZyLnR5cGVQcm90b3MubGVuZ3RofHwoci50eXBlUHJvdG9zPVtdKSxyLnR5cGVQcm90b3MucHVzaChjLm9ubnguVHlwZVByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmIWwuaXNTdHJpbmcoZS5uYW1lKSlyZXR1cm4gIm5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5yZWZBdHRyTmFtZSYmZS5oYXNPd25Qcm9wZXJ0eSgicmVmQXR0ck5hbWUiKSYmIWwuaXNTdHJpbmcoZS5yZWZBdHRyTmFtZSkpcmV0dXJuICJyZWZBdHRyTmFtZTogc3RyaW5nIGV4cGVjdGVkIjtpZihudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJiFsLmlzU3RyaW5nKGUuZG9jU3RyaW5nKSlyZXR1cm4gImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjtpZihudWxsIT1lLnR5cGUmJmUuaGFzT3duUHJvcGVydHkoInR5cGUiKSlzd2l0Y2goZS50eXBlKXtkZWZhdWx0OnJldHVybiAidHlwZTogZW51bSB2YWx1ZSBleHBlY3RlZCI7Y2FzZSAwOmNhc2UgMTpjYXNlIDI6Y2FzZSAzOmNhc2UgNDpjYXNlIDU6Y2FzZSAxMTpjYXNlIDEzOmNhc2UgNjpjYXNlIDc6Y2FzZSA4OmNhc2UgOTpjYXNlIDEwOmNhc2UgMTI6Y2FzZSAxNDp9aWYobnVsbCE9ZS5mJiZlLmhhc093blByb3BlcnR5KCJmIikmJiJudW1iZXIiIT10eXBlb2YgZS5mKXJldHVybiAiZjogbnVtYmVyIGV4cGVjdGVkIjtpZihudWxsIT1lLmkmJmUuaGFzT3duUHJvcGVydHkoImkiKSYmIShsLmlzSW50ZWdlcihlLmkpfHxlLmkmJmwuaXNJbnRlZ2VyKGUuaS5sb3cpJiZsLmlzSW50ZWdlcihlLmkuaGlnaCkpKXJldHVybiAiaTogaW50ZWdlcnxMb25nIGV4cGVjdGVkIjtpZihudWxsIT1lLnMmJmUuaGFzT3duUHJvcGVydHkoInMiKSYmIShlLnMmJiJudW1iZXIiPT10eXBlb2YgZS5zLmxlbmd0aHx8bC5pc1N0cmluZyhlLnMpKSlyZXR1cm4gInM6IGJ1ZmZlciBleHBlY3RlZCI7aWYobnVsbCE9ZS50JiZlLmhhc093blByb3BlcnR5KCJ0IikmJihuPWMub25ueC5UZW5zb3JQcm90by52ZXJpZnkoZS50KSkpcmV0dXJuICJ0LiIrbjtpZihudWxsIT1lLmcmJmUuaGFzT3duUHJvcGVydHkoImciKSYmKG49Yy5vbm54LkdyYXBoUHJvdG8udmVyaWZ5KGUuZykpKXJldHVybiAiZy4iK247aWYobnVsbCE9ZS5zcGFyc2VUZW5zb3ImJmUuaGFzT3duUHJvcGVydHkoInNwYXJzZVRlbnNvciIpJiYobj1jLm9ubnguU3BhcnNlVGVuc29yUHJvdG8udmVyaWZ5KGUuc3BhcnNlVGVuc29yKSkpcmV0dXJuICJzcGFyc2VUZW5zb3IuIituO2lmKG51bGwhPWUudHAmJmUuaGFzT3duUHJvcGVydHkoInRwIikmJihuPWMub25ueC5UeXBlUHJvdG8udmVyaWZ5KGUudHApKSlyZXR1cm4gInRwLiIrbjtpZihudWxsIT1lLmZsb2F0cyYmZS5oYXNPd25Qcm9wZXJ0eSgiZmxvYXRzIikpe2lmKCFBcnJheS5pc0FycmF5KGUuZmxvYXRzKSlyZXR1cm4gImZsb2F0czogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgdD0wO3Q8ZS5mbG9hdHMubGVuZ3RoOysrdClpZigibnVtYmVyIiE9dHlwZW9mIGUuZmxvYXRzW3RdKXJldHVybiAiZmxvYXRzOiBudW1iZXJbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS5pbnRzJiZlLmhhc093blByb3BlcnR5KCJpbnRzIikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW50cykpcmV0dXJuICJpbnRzOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuaW50cy5sZW5ndGg7Kyt0KWlmKCEobC5pc0ludGVnZXIoZS5pbnRzW3RdKXx8ZS5pbnRzW3RdJiZsLmlzSW50ZWdlcihlLmludHNbdF0ubG93KSYmbC5pc0ludGVnZXIoZS5pbnRzW3RdLmhpZ2gpKSlyZXR1cm4gImludHM6IGludGVnZXJ8TG9uZ1tdIGV4cGVjdGVkIn1pZihudWxsIT1lLnN0cmluZ3MmJmUuaGFzT3duUHJvcGVydHkoInN0cmluZ3MiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5zdHJpbmdzKSlyZXR1cm4gInN0cmluZ3M6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5zdHJpbmdzLmxlbmd0aDsrK3QpaWYoIShlLnN0cmluZ3NbdF0mJiJudW1iZXIiPT10eXBlb2YgZS5zdHJpbmdzW3RdLmxlbmd0aHx8bC5pc1N0cmluZyhlLnN0cmluZ3NbdF0pKSlyZXR1cm4gInN0cmluZ3M6IGJ1ZmZlcltdIGV4cGVjdGVkIn1pZihudWxsIT1lLnRlbnNvcnMmJmUuaGFzT3duUHJvcGVydHkoInRlbnNvcnMiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS50ZW5zb3JzKSlyZXR1cm4gInRlbnNvcnM6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS50ZW5zb3JzLmxlbmd0aDsrK3QpaWYobj1jLm9ubnguVGVuc29yUHJvdG8udmVyaWZ5KGUudGVuc29yc1t0XSkpcmV0dXJuICJ0ZW5zb3JzLiIrbn1pZihudWxsIT1lLmdyYXBocyYmZS5oYXNPd25Qcm9wZXJ0eSgiZ3JhcGhzIikpe2lmKCFBcnJheS5pc0FycmF5KGUuZ3JhcGhzKSlyZXR1cm4gImdyYXBoczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmdyYXBocy5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LkdyYXBoUHJvdG8udmVyaWZ5KGUuZ3JhcGhzW3RdKSlyZXR1cm4gImdyYXBocy4iK259aWYobnVsbCE9ZS5zcGFyc2VUZW5zb3JzJiZlLmhhc093blByb3BlcnR5KCJzcGFyc2VUZW5zb3JzIikpe2lmKCFBcnJheS5pc0FycmF5KGUuc3BhcnNlVGVuc29ycykpcmV0dXJuICJzcGFyc2VUZW5zb3JzOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuc3BhcnNlVGVuc29ycy5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLnZlcmlmeShlLnNwYXJzZVRlbnNvcnNbdF0pKXJldHVybiAic3BhcnNlVGVuc29ycy4iK259aWYobnVsbCE9ZS50eXBlUHJvdG9zJiZlLmhhc093blByb3BlcnR5KCJ0eXBlUHJvdG9zIikpe2lmKCFBcnJheS5pc0FycmF5KGUudHlwZVByb3RvcykpcmV0dXJuICJ0eXBlUHJvdG9zOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUudHlwZVByb3Rvcy5sZW5ndGg7Kyt0KXt2YXIgbjtpZihuPWMub25ueC5UeXBlUHJvdG8udmVyaWZ5KGUudHlwZVByb3Rvc1t0XSkpcmV0dXJuICJ0eXBlUHJvdG9zLiIrbn19cmV0dXJuIG51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LkF0dHJpYnV0ZVByb3RvKXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguQXR0cmlidXRlUHJvdG87c3dpdGNoKG51bGwhPWUubmFtZSYmKHQubmFtZT1TdHJpbmcoZS5uYW1lKSksbnVsbCE9ZS5yZWZBdHRyTmFtZSYmKHQucmVmQXR0ck5hbWU9U3RyaW5nKGUucmVmQXR0ck5hbWUpKSxudWxsIT1lLmRvY1N0cmluZyYmKHQuZG9jU3RyaW5nPVN0cmluZyhlLmRvY1N0cmluZykpLGUudHlwZSl7ZGVmYXVsdDppZigibnVtYmVyIj09dHlwZW9mIGUudHlwZSl7dC50eXBlPWUudHlwZTticmVha31icmVhaztjYXNlIlVOREVGSU5FRCI6Y2FzZSAwOnQudHlwZT0wO2JyZWFrO2Nhc2UiRkxPQVQiOmNhc2UgMTp0LnR5cGU9MTticmVhaztjYXNlIklOVCI6Y2FzZSAyOnQudHlwZT0yO2JyZWFrO2Nhc2UiU1RSSU5HIjpjYXNlIDM6dC50eXBlPTM7YnJlYWs7Y2FzZSJURU5TT1IiOmNhc2UgNDp0LnR5cGU9NDticmVhaztjYXNlIkdSQVBIIjpjYXNlIDU6dC50eXBlPTU7YnJlYWs7Y2FzZSJTUEFSU0VfVEVOU09SIjpjYXNlIDExOnQudHlwZT0xMTticmVhaztjYXNlIlRZUEVfUFJPVE8iOmNhc2UgMTM6dC50eXBlPTEzO2JyZWFrO2Nhc2UiRkxPQVRTIjpjYXNlIDY6dC50eXBlPTY7YnJlYWs7Y2FzZSJJTlRTIjpjYXNlIDc6dC50eXBlPTc7YnJlYWs7Y2FzZSJTVFJJTkdTIjpjYXNlIDg6dC50eXBlPTg7YnJlYWs7Y2FzZSJURU5TT1JTIjpjYXNlIDk6dC50eXBlPTk7YnJlYWs7Y2FzZSJHUkFQSFMiOmNhc2UgMTA6dC50eXBlPTEwO2JyZWFrO2Nhc2UiU1BBUlNFX1RFTlNPUlMiOmNhc2UgMTI6dC50eXBlPTEyO2JyZWFrO2Nhc2UiVFlQRV9QUk9UT1MiOmNhc2UgMTQ6dC50eXBlPTE0O31pZihudWxsIT1lLmYmJih0LmY9TnVtYmVyKGUuZikpLG51bGwhPWUuaSYmKGwuTG9uZz8odC5pPWwuTG9uZy5mcm9tVmFsdWUoZS5pKSkudW5zaWduZWQ9ITE6InN0cmluZyI9PXR5cGVvZiBlLmk/dC5pPXBhcnNlSW50KGUuaSwxMCk6Im51bWJlciI9PXR5cGVvZiBlLmk/dC5pPWUuaToib2JqZWN0Ij09dHlwZW9mIGUuaSYmKHQuaT1uZXcgbC5Mb25nQml0cyhlLmkubG93Pj4+MCxlLmkuaGlnaD4+PjApLnRvTnVtYmVyKCkpKSxudWxsIT1lLnMmJigic3RyaW5nIj09dHlwZW9mIGUucz9sLmJhc2U2NC5kZWNvZGUoZS5zLHQucz1sLm5ld0J1ZmZlcihsLmJhc2U2NC5sZW5ndGgoZS5zKSksMCk6ZS5zLmxlbmd0aD49MCYmKHQucz1lLnMpKSxudWxsIT1lLnQpe2lmKCJvYmplY3QiIT10eXBlb2YgZS50KXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8udDogb2JqZWN0IGV4cGVjdGVkIik7dC50PWMub25ueC5UZW5zb3JQcm90by5mcm9tT2JqZWN0KGUudCk7fWlmKG51bGwhPWUuZyl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmcpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5nOiBvYmplY3QgZXhwZWN0ZWQiKTt0Lmc9Yy5vbm54LkdyYXBoUHJvdG8uZnJvbU9iamVjdChlLmcpO31pZihudWxsIT1lLnNwYXJzZVRlbnNvcil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnNwYXJzZVRlbnNvcil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnNwYXJzZVRlbnNvcjogb2JqZWN0IGV4cGVjdGVkIik7dC5zcGFyc2VUZW5zb3I9Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLmZyb21PYmplY3QoZS5zcGFyc2VUZW5zb3IpO31pZihudWxsIT1lLnRwKXtpZigib2JqZWN0IiE9dHlwZW9mIGUudHApdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by50cDogb2JqZWN0IGV4cGVjdGVkIik7dC50cD1jLm9ubnguVHlwZVByb3RvLmZyb21PYmplY3QoZS50cCk7fWlmKGUuZmxvYXRzKXtpZighQXJyYXkuaXNBcnJheShlLmZsb2F0cykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5mbG9hdHM6IGFycmF5IGV4cGVjdGVkIik7dC5mbG9hdHM9W107Zm9yKHZhciBuPTA7bjxlLmZsb2F0cy5sZW5ndGg7KytuKXQuZmxvYXRzW25dPU51bWJlcihlLmZsb2F0c1tuXSk7fWlmKGUuaW50cyl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnRzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLmludHM6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuaW50cz1bXSxuPTA7bjxlLmludHMubGVuZ3RoOysrbilsLkxvbmc/KHQuaW50c1tuXT1sLkxvbmcuZnJvbVZhbHVlKGUuaW50c1tuXSkpLnVuc2lnbmVkPSExOiJzdHJpbmciPT10eXBlb2YgZS5pbnRzW25dP3QuaW50c1tuXT1wYXJzZUludChlLmludHNbbl0sMTApOiJudW1iZXIiPT10eXBlb2YgZS5pbnRzW25dP3QuaW50c1tuXT1lLmludHNbbl06Im9iamVjdCI9PXR5cGVvZiBlLmludHNbbl0mJih0LmludHNbbl09bmV3IGwuTG9uZ0JpdHMoZS5pbnRzW25dLmxvdz4+PjAsZS5pbnRzW25dLmhpZ2g+Pj4wKS50b051bWJlcigpKTt9aWYoZS5zdHJpbmdzKXtpZighQXJyYXkuaXNBcnJheShlLnN0cmluZ3MpKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8uc3RyaW5nczogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5zdHJpbmdzPVtdLG49MDtuPGUuc3RyaW5ncy5sZW5ndGg7KytuKSJzdHJpbmciPT10eXBlb2YgZS5zdHJpbmdzW25dP2wuYmFzZTY0LmRlY29kZShlLnN0cmluZ3Nbbl0sdC5zdHJpbmdzW25dPWwubmV3QnVmZmVyKGwuYmFzZTY0Lmxlbmd0aChlLnN0cmluZ3Nbbl0pKSwwKTplLnN0cmluZ3Nbbl0ubGVuZ3RoPj0wJiYodC5zdHJpbmdzW25dPWUuc3RyaW5nc1tuXSk7fWlmKGUudGVuc29ycyl7aWYoIUFycmF5LmlzQXJyYXkoZS50ZW5zb3JzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnRlbnNvcnM6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQudGVuc29ycz1bXSxuPTA7bjxlLnRlbnNvcnMubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnRlbnNvcnNbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by50ZW5zb3JzOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnRlbnNvcnNbbl09Yy5vbm54LlRlbnNvclByb3RvLmZyb21PYmplY3QoZS50ZW5zb3JzW25dKTt9fWlmKGUuZ3JhcGhzKXtpZighQXJyYXkuaXNBcnJheShlLmdyYXBocykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5ncmFwaHM6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuZ3JhcGhzPVtdLG49MDtuPGUuZ3JhcGhzLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5ncmFwaHNbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5ncmFwaHM6IG9iamVjdCBleHBlY3RlZCIpO3QuZ3JhcGhzW25dPWMub25ueC5HcmFwaFByb3RvLmZyb21PYmplY3QoZS5ncmFwaHNbbl0pO319aWYoZS5zcGFyc2VUZW5zb3JzKXtpZighQXJyYXkuaXNBcnJheShlLnNwYXJzZVRlbnNvcnMpKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8uc3BhcnNlVGVuc29yczogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5zcGFyc2VUZW5zb3JzPVtdLG49MDtuPGUuc3BhcnNlVGVuc29ycy5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuc3BhcnNlVGVuc29yc1tuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnNwYXJzZVRlbnNvcnM6IG9iamVjdCBleHBlY3RlZCIpO3Quc3BhcnNlVGVuc29yc1tuXT1jLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZnJvbU9iamVjdChlLnNwYXJzZVRlbnNvcnNbbl0pO319aWYoZS50eXBlUHJvdG9zKXtpZighQXJyYXkuaXNBcnJheShlLnR5cGVQcm90b3MpKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8udHlwZVByb3RvczogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC50eXBlUHJvdG9zPVtdLG49MDtuPGUudHlwZVByb3Rvcy5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUudHlwZVByb3Rvc1tuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnR5cGVQcm90b3M6IG9iamVjdCBleHBlY3RlZCIpO3QudHlwZVByb3Rvc1tuXT1jLm9ubnguVHlwZVByb3RvLmZyb21PYmplY3QoZS50eXBlUHJvdG9zW25dKTt9fXJldHVybiB0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O2lmKCh0LmFycmF5c3x8dC5kZWZhdWx0cykmJihuLmZsb2F0cz1bXSxuLmludHM9W10sbi5zdHJpbmdzPVtdLG4udGVuc29ycz1bXSxuLmdyYXBocz1bXSxuLnR5cGVQcm90b3M9W10sbi5zcGFyc2VUZW5zb3JzPVtdKSx0LmRlZmF1bHRzKXtpZihuLm5hbWU9IiIsbi5mPTAsbC5Mb25nKXt2YXIgcj1uZXcgbC5Mb25nKDAsMCwhMSk7bi5pPXQubG9uZ3M9PT1TdHJpbmc/ci50b1N0cmluZygpOnQubG9uZ3M9PT1OdW1iZXI/ci50b051bWJlcigpOnI7fWVsc2Ugbi5pPXQubG9uZ3M9PT1TdHJpbmc/IjAiOjA7dC5ieXRlcz09PVN0cmluZz9uLnM9IiI6KG4ucz1bXSx0LmJ5dGVzIT09QXJyYXkmJihuLnM9bC5uZXdCdWZmZXIobi5zKSkpLG4udD1udWxsLG4uZz1udWxsLG4uZG9jU3RyaW5nPSIiLG4udHA9bnVsbCxuLnR5cGU9dC5lbnVtcz09PVN0cmluZz8iVU5ERUZJTkVEIjowLG4ucmVmQXR0ck5hbWU9IiIsbi5zcGFyc2VUZW5zb3I9bnVsbDt9aWYobnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJihuLm5hbWU9ZS5uYW1lKSxudWxsIT1lLmYmJmUuaGFzT3duUHJvcGVydHkoImYiKSYmKG4uZj10Lmpzb24mJiFpc0Zpbml0ZShlLmYpP1N0cmluZyhlLmYpOmUuZiksbnVsbCE9ZS5pJiZlLmhhc093blByb3BlcnR5KCJpIikmJigibnVtYmVyIj09dHlwZW9mIGUuaT9uLmk9dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5pKTplLmk6bi5pPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuaSk6dC5sb25ncz09PU51bWJlcj9uZXcgbC5Mb25nQml0cyhlLmkubG93Pj4+MCxlLmkuaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5pKSxudWxsIT1lLnMmJmUuaGFzT3duUHJvcGVydHkoInMiKSYmKG4ucz10LmJ5dGVzPT09U3RyaW5nP2wuYmFzZTY0LmVuY29kZShlLnMsMCxlLnMubGVuZ3RoKTp0LmJ5dGVzPT09QXJyYXk/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5zKTplLnMpLG51bGwhPWUudCYmZS5oYXNPd25Qcm9wZXJ0eSgidCIpJiYobi50PWMub25ueC5UZW5zb3JQcm90by50b09iamVjdChlLnQsdCkpLG51bGwhPWUuZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZyIpJiYobi5nPWMub25ueC5HcmFwaFByb3RvLnRvT2JqZWN0KGUuZyx0KSksZS5mbG9hdHMmJmUuZmxvYXRzLmxlbmd0aCl7bi5mbG9hdHM9W107Zm9yKHZhciBvPTA7bzxlLmZsb2F0cy5sZW5ndGg7KytvKW4uZmxvYXRzW29dPXQuanNvbiYmIWlzRmluaXRlKGUuZmxvYXRzW29dKT9TdHJpbmcoZS5mbG9hdHNbb10pOmUuZmxvYXRzW29dO31pZihlLmludHMmJmUuaW50cy5sZW5ndGgpZm9yKG4uaW50cz1bXSxvPTA7bzxlLmludHMubGVuZ3RoOysrbykibnVtYmVyIj09dHlwZW9mIGUuaW50c1tvXT9uLmludHNbb109dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5pbnRzW29dKTplLmludHNbb106bi5pbnRzW29dPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuaW50c1tvXSk6dC5sb25ncz09PU51bWJlcj9uZXcgbC5Mb25nQml0cyhlLmludHNbb10ubG93Pj4+MCxlLmludHNbb10uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5pbnRzW29dO2lmKGUuc3RyaW5ncyYmZS5zdHJpbmdzLmxlbmd0aClmb3Iobi5zdHJpbmdzPVtdLG89MDtvPGUuc3RyaW5ncy5sZW5ndGg7KytvKW4uc3RyaW5nc1tvXT10LmJ5dGVzPT09U3RyaW5nP2wuYmFzZTY0LmVuY29kZShlLnN0cmluZ3Nbb10sMCxlLnN0cmluZ3Nbb10ubGVuZ3RoKTp0LmJ5dGVzPT09QXJyYXk/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5zdHJpbmdzW29dKTplLnN0cmluZ3Nbb107aWYoZS50ZW5zb3JzJiZlLnRlbnNvcnMubGVuZ3RoKWZvcihuLnRlbnNvcnM9W10sbz0wO288ZS50ZW5zb3JzLmxlbmd0aDsrK28pbi50ZW5zb3JzW29dPWMub25ueC5UZW5zb3JQcm90by50b09iamVjdChlLnRlbnNvcnNbb10sdCk7aWYoZS5ncmFwaHMmJmUuZ3JhcGhzLmxlbmd0aClmb3Iobi5ncmFwaHM9W10sbz0wO288ZS5ncmFwaHMubGVuZ3RoOysrbyluLmdyYXBoc1tvXT1jLm9ubnguR3JhcGhQcm90by50b09iamVjdChlLmdyYXBoc1tvXSx0KTtpZihudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJihuLmRvY1N0cmluZz1lLmRvY1N0cmluZyksbnVsbCE9ZS50cCYmZS5oYXNPd25Qcm9wZXJ0eSgidHAiKSYmKG4udHA9Yy5vbm54LlR5cGVQcm90by50b09iamVjdChlLnRwLHQpKSxlLnR5cGVQcm90b3MmJmUudHlwZVByb3Rvcy5sZW5ndGgpZm9yKG4udHlwZVByb3Rvcz1bXSxvPTA7bzxlLnR5cGVQcm90b3MubGVuZ3RoOysrbyluLnR5cGVQcm90b3Nbb109Yy5vbm54LlR5cGVQcm90by50b09iamVjdChlLnR5cGVQcm90b3Nbb10sdCk7aWYobnVsbCE9ZS50eXBlJiZlLmhhc093blByb3BlcnR5KCJ0eXBlIikmJihuLnR5cGU9dC5lbnVtcz09PVN0cmluZz92b2lkIDA9PT1jLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZVtlLnR5cGVdP2UudHlwZTpjLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZVtlLnR5cGVdOmUudHlwZSksbnVsbCE9ZS5yZWZBdHRyTmFtZSYmZS5oYXNPd25Qcm9wZXJ0eSgicmVmQXR0ck5hbWUiKSYmKG4ucmVmQXR0ck5hbWU9ZS5yZWZBdHRyTmFtZSksbnVsbCE9ZS5zcGFyc2VUZW5zb3ImJmUuaGFzT3duUHJvcGVydHkoInNwYXJzZVRlbnNvciIpJiYobi5zcGFyc2VUZW5zb3I9Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLnRvT2JqZWN0KGUuc3BhcnNlVGVuc29yLHQpKSxlLnNwYXJzZVRlbnNvcnMmJmUuc3BhcnNlVGVuc29ycy5sZW5ndGgpZm9yKG4uc3BhcnNlVGVuc29ycz1bXSxvPTA7bzxlLnNwYXJzZVRlbnNvcnMubGVuZ3RoOysrbyluLnNwYXJzZVRlbnNvcnNbb109Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLnRvT2JqZWN0KGUuc3BhcnNlVGVuc29yc1tvXSx0KTtyZXR1cm4gbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5BdHRyaWJ1dGVQcm90byJ9LGUuQXR0cmlidXRlVHlwZT1mdW5jdGlvbigpe3ZhciBlPXt9LHQ9T2JqZWN0LmNyZWF0ZShlKTtyZXR1cm4gdFtlWzBdPSJVTkRFRklORUQiXT0wLHRbZVsxXT0iRkxPQVQiXT0xLHRbZVsyXT0iSU5UIl09Mix0W2VbM109IlNUUklORyJdPTMsdFtlWzRdPSJURU5TT1IiXT00LHRbZVs1XT0iR1JBUEgiXT01LHRbZVsxMV09IlNQQVJTRV9URU5TT1IiXT0xMSx0W2VbMTNdPSJUWVBFX1BST1RPIl09MTMsdFtlWzZdPSJGTE9BVFMiXT02LHRbZVs3XT0iSU5UUyJdPTcsdFtlWzhdPSJTVFJJTkdTIl09OCx0W2VbOV09IlRFTlNPUlMiXT05LHRbZVsxMF09IkdSQVBIUyJdPTEwLHRbZVsxMl09IlNQQVJTRV9URU5TT1JTIl09MTIsdFtlWzE0XT0iVFlQRV9QUk9UT1MiXT0xNCx0fSgpLGV9KCksaS5WYWx1ZUluZm9Qcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUubmFtZT0iIixlLnByb3RvdHlwZS50eXBlPW51bGwsZS5wcm90b3R5cGUuZG9jU3RyaW5nPSIiLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5uYW1lJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJuYW1lIikmJnQudWludDMyKDEwKS5zdHJpbmcoZS5uYW1lKSxudWxsIT1lLnR5cGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInR5cGUiKSYmYy5vbm54LlR5cGVQcm90by5lbmNvZGUoZS50eXBlLHQudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuZG9jU3RyaW5nJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb2NTdHJpbmciKSYmdC51aW50MzIoMjYpLnN0cmluZyhlLmRvY1N0cmluZyksdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlZhbHVlSW5mb1Byb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIubmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMjpyLnR5cGU9Yy5vbm54LlR5cGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDM6ci5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmIWwuaXNTdHJpbmcoZS5uYW1lKSlyZXR1cm4gIm5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS50eXBlJiZlLmhhc093blByb3BlcnR5KCJ0eXBlIikpe3ZhciB0PWMub25ueC5UeXBlUHJvdG8udmVyaWZ5KGUudHlwZSk7aWYodClyZXR1cm4gInR5cGUuIit0fXJldHVybiBudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJiFsLmlzU3RyaW5nKGUuZG9jU3RyaW5nKT8iZG9jU3RyaW5nOiBzdHJpbmcgZXhwZWN0ZWQiOm51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlZhbHVlSW5mb1Byb3RvKXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguVmFsdWVJbmZvUHJvdG87aWYobnVsbCE9ZS5uYW1lJiYodC5uYW1lPVN0cmluZyhlLm5hbWUpKSxudWxsIT1lLnR5cGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZS50eXBlKXRocm93IFR5cGVFcnJvcigiLm9ubnguVmFsdWVJbmZvUHJvdG8udHlwZTogb2JqZWN0IGV4cGVjdGVkIik7dC50eXBlPWMub25ueC5UeXBlUHJvdG8uZnJvbU9iamVjdChlLnR5cGUpO31yZXR1cm4gbnVsbCE9ZS5kb2NTdHJpbmcmJih0LmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSx0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O3JldHVybiB0LmRlZmF1bHRzJiYobi5uYW1lPSIiLG4udHlwZT1udWxsLG4uZG9jU3RyaW5nPSIiKSxudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmKG4ubmFtZT1lLm5hbWUpLG51bGwhPWUudHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgidHlwZSIpJiYobi50eXBlPWMub25ueC5UeXBlUHJvdG8udG9PYmplY3QoZS50eXBlLHQpKSxudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJihuLmRvY1N0cmluZz1lLmRvY1N0cmluZyksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5WYWx1ZUluZm9Qcm90byJ9LGV9KCksaS5Ob2RlUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuaW5wdXQ9W10sdGhpcy5vdXRwdXQ9W10sdGhpcy5hdHRyaWJ1dGU9W10sZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUuaW5wdXQ9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLm91dHB1dD1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUubmFtZT0iIixlLnByb3RvdHlwZS5vcFR5cGU9IiIsZS5wcm90b3R5cGUuZG9tYWluPSIiLGUucHJvdG90eXBlLmF0dHJpYnV0ZT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuZG9jU3RyaW5nPSIiLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtpZih0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmlucHV0JiZlLmlucHV0Lmxlbmd0aClmb3IodmFyIG49MDtuPGUuaW5wdXQubGVuZ3RoOysrbil0LnVpbnQzMigxMCkuc3RyaW5nKGUuaW5wdXRbbl0pO2lmKG51bGwhPWUub3V0cHV0JiZlLm91dHB1dC5sZW5ndGgpZm9yKG49MDtuPGUub3V0cHV0Lmxlbmd0aDsrK24pdC51aW50MzIoMTgpLnN0cmluZyhlLm91dHB1dFtuXSk7aWYobnVsbCE9ZS5uYW1lJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJuYW1lIikmJnQudWludDMyKDI2KS5zdHJpbmcoZS5uYW1lKSxudWxsIT1lLm9wVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwib3BUeXBlIikmJnQudWludDMyKDM0KS5zdHJpbmcoZS5vcFR5cGUpLG51bGwhPWUuYXR0cmlidXRlJiZlLmF0dHJpYnV0ZS5sZW5ndGgpZm9yKG49MDtuPGUuYXR0cmlidXRlLmxlbmd0aDsrK24pYy5vbm54LkF0dHJpYnV0ZVByb3RvLmVuY29kZShlLmF0dHJpYnV0ZVtuXSx0LnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gbnVsbCE9ZS5kb2NTdHJpbmcmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvY1N0cmluZyIpJiZ0LnVpbnQzMig1MCkuc3RyaW5nKGUuZG9jU3RyaW5nKSxudWxsIT1lLmRvbWFpbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZG9tYWluIikmJnQudWludDMyKDU4KS5zdHJpbmcoZS5kb21haW4pLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5Ob2RlUHJvdG87ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci5pbnB1dCYmci5pbnB1dC5sZW5ndGh8fChyLmlucHV0PVtdKSxyLmlucHV0LnB1c2goZS5zdHJpbmcoKSk7YnJlYWs7Y2FzZSAyOnIub3V0cHV0JiZyLm91dHB1dC5sZW5ndGh8fChyLm91dHB1dD1bXSksci5vdXRwdXQucHVzaChlLnN0cmluZygpKTticmVhaztjYXNlIDM6ci5uYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA0OnIub3BUeXBlPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA3OnIuZG9tYWluPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA1OnIuYXR0cmlidXRlJiZyLmF0dHJpYnV0ZS5sZW5ndGh8fChyLmF0dHJpYnV0ZT1bXSksci5hdHRyaWJ1dGUucHVzaChjLm9ubnguQXR0cmlidXRlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgNjpyLmRvY1N0cmluZz1lLnN0cmluZygpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO2lmKG51bGwhPWUuaW5wdXQmJmUuaGFzT3duUHJvcGVydHkoImlucHV0Iikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5wdXQpKXJldHVybiAiaW5wdXQ6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHQ9MDt0PGUuaW5wdXQubGVuZ3RoOysrdClpZighbC5pc1N0cmluZyhlLmlucHV0W3RdKSlyZXR1cm4gImlucHV0OiBzdHJpbmdbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS5vdXRwdXQmJmUuaGFzT3duUHJvcGVydHkoIm91dHB1dCIpKXtpZighQXJyYXkuaXNBcnJheShlLm91dHB1dCkpcmV0dXJuICJvdXRwdXQ6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5vdXRwdXQubGVuZ3RoOysrdClpZighbC5pc1N0cmluZyhlLm91dHB1dFt0XSkpcmV0dXJuICJvdXRwdXQ6IHN0cmluZ1tdIGV4cGVjdGVkIn1pZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmIWwuaXNTdHJpbmcoZS5uYW1lKSlyZXR1cm4gIm5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5vcFR5cGUmJmUuaGFzT3duUHJvcGVydHkoIm9wVHlwZSIpJiYhbC5pc1N0cmluZyhlLm9wVHlwZSkpcmV0dXJuICJvcFR5cGU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5kb21haW4mJmUuaGFzT3duUHJvcGVydHkoImRvbWFpbiIpJiYhbC5pc1N0cmluZyhlLmRvbWFpbikpcmV0dXJuICJkb21haW46IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5hdHRyaWJ1dGUmJmUuaGFzT3duUHJvcGVydHkoImF0dHJpYnV0ZSIpKXtpZighQXJyYXkuaXNBcnJheShlLmF0dHJpYnV0ZSkpcmV0dXJuICJhdHRyaWJ1dGU6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5hdHRyaWJ1dGUubGVuZ3RoOysrdCl7dmFyIG49Yy5vbm54LkF0dHJpYnV0ZVByb3RvLnZlcmlmeShlLmF0dHJpYnV0ZVt0XSk7aWYobilyZXR1cm4gImF0dHJpYnV0ZS4iK259fXJldHVybiBudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJiFsLmlzU3RyaW5nKGUuZG9jU3RyaW5nKT8iZG9jU3RyaW5nOiBzdHJpbmcgZXhwZWN0ZWQiOm51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54Lk5vZGVQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54Lk5vZGVQcm90bztpZihlLmlucHV0KXtpZighQXJyYXkuaXNBcnJheShlLmlucHV0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk5vZGVQcm90by5pbnB1dDogYXJyYXkgZXhwZWN0ZWQiKTt0LmlucHV0PVtdO2Zvcih2YXIgbj0wO248ZS5pbnB1dC5sZW5ndGg7KytuKXQuaW5wdXRbbl09U3RyaW5nKGUuaW5wdXRbbl0pO31pZihlLm91dHB1dCl7aWYoIUFycmF5LmlzQXJyYXkoZS5vdXRwdXQpKXRocm93IFR5cGVFcnJvcigiLm9ubnguTm9kZVByb3RvLm91dHB1dDogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5vdXRwdXQ9W10sbj0wO248ZS5vdXRwdXQubGVuZ3RoOysrbil0Lm91dHB1dFtuXT1TdHJpbmcoZS5vdXRwdXRbbl0pO31pZihudWxsIT1lLm5hbWUmJih0Lm5hbWU9U3RyaW5nKGUubmFtZSkpLG51bGwhPWUub3BUeXBlJiYodC5vcFR5cGU9U3RyaW5nKGUub3BUeXBlKSksbnVsbCE9ZS5kb21haW4mJih0LmRvbWFpbj1TdHJpbmcoZS5kb21haW4pKSxlLmF0dHJpYnV0ZSl7aWYoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGUpKXRocm93IFR5cGVFcnJvcigiLm9ubnguTm9kZVByb3RvLmF0dHJpYnV0ZTogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5hdHRyaWJ1dGU9W10sbj0wO248ZS5hdHRyaWJ1dGUubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmF0dHJpYnV0ZVtuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk5vZGVQcm90by5hdHRyaWJ1dGU6IG9iamVjdCBleHBlY3RlZCIpO3QuYXR0cmlidXRlW25dPWMub25ueC5BdHRyaWJ1dGVQcm90by5mcm9tT2JqZWN0KGUuYXR0cmlidXRlW25dKTt9fXJldHVybiBudWxsIT1lLmRvY1N0cmluZyYmKHQuZG9jU3RyaW5nPVN0cmluZyhlLmRvY1N0cmluZykpLHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYoKHQuYXJyYXlzfHx0LmRlZmF1bHRzKSYmKG4uaW5wdXQ9W10sbi5vdXRwdXQ9W10sbi5hdHRyaWJ1dGU9W10pLHQuZGVmYXVsdHMmJihuLm5hbWU9IiIsbi5vcFR5cGU9IiIsbi5kb2NTdHJpbmc9IiIsbi5kb21haW49IiIpLGUuaW5wdXQmJmUuaW5wdXQubGVuZ3RoKXtuLmlucHV0PVtdO2Zvcih2YXIgcj0wO3I8ZS5pbnB1dC5sZW5ndGg7KytyKW4uaW5wdXRbcl09ZS5pbnB1dFtyXTt9aWYoZS5vdXRwdXQmJmUub3V0cHV0Lmxlbmd0aClmb3Iobi5vdXRwdXQ9W10scj0wO3I8ZS5vdXRwdXQubGVuZ3RoOysrciluLm91dHB1dFtyXT1lLm91dHB1dFtyXTtpZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmKG4ubmFtZT1lLm5hbWUpLG51bGwhPWUub3BUeXBlJiZlLmhhc093blByb3BlcnR5KCJvcFR5cGUiKSYmKG4ub3BUeXBlPWUub3BUeXBlKSxlLmF0dHJpYnV0ZSYmZS5hdHRyaWJ1dGUubGVuZ3RoKWZvcihuLmF0dHJpYnV0ZT1bXSxyPTA7cjxlLmF0dHJpYnV0ZS5sZW5ndGg7KytyKW4uYXR0cmlidXRlW3JdPWMub25ueC5BdHRyaWJ1dGVQcm90by50b09iamVjdChlLmF0dHJpYnV0ZVtyXSx0KTtyZXR1cm4gbnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYobi5kb2NTdHJpbmc9ZS5kb2NTdHJpbmcpLG51bGwhPWUuZG9tYWluJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmKG4uZG9tYWluPWUuZG9tYWluKSxufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54Lk5vZGVQcm90byJ9LGV9KCksaS5UcmFpbmluZ0luZm9Qcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5pbml0aWFsaXphdGlvbkJpbmRpbmc9W10sdGhpcy51cGRhdGVCaW5kaW5nPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmluaXRpYWxpemF0aW9uPW51bGwsZS5wcm90b3R5cGUuYWxnb3JpdGhtPW51bGwsZS5wcm90b3R5cGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS51cGRhdGVCaW5kaW5nPWwuZW1wdHlBcnJheSxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7aWYodHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5pbml0aWFsaXphdGlvbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiaW5pdGlhbGl6YXRpb24iKSYmYy5vbm54LkdyYXBoUHJvdG8uZW5jb2RlKGUuaW5pdGlhbGl6YXRpb24sdC51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS5hbGdvcml0aG0mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImFsZ29yaXRobSIpJiZjLm9ubnguR3JhcGhQcm90by5lbmNvZGUoZS5hbGdvcml0aG0sdC51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS5pbml0aWFsaXphdGlvbkJpbmRpbmcmJmUuaW5pdGlhbGl6YXRpb25CaW5kaW5nLmxlbmd0aClmb3IodmFyIG49MDtuPGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nLmxlbmd0aDsrK24pYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZW5jb2RlKGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nW25dLHQudWludDMyKDI2KS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUudXBkYXRlQmluZGluZyYmZS51cGRhdGVCaW5kaW5nLmxlbmd0aClmb3Iobj0wO248ZS51cGRhdGVCaW5kaW5nLmxlbmd0aDsrK24pYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZW5jb2RlKGUudXBkYXRlQmluZGluZ1tuXSx0LnVpbnQzMigzNCkuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlRyYWluaW5nSW5mb1Byb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIuaW5pdGlhbGl6YXRpb249Yy5vbm54LkdyYXBoUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSAyOnIuYWxnb3JpdGhtPWMub25ueC5HcmFwaFByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMzpyLmluaXRpYWxpemF0aW9uQmluZGluZyYmci5pbml0aWFsaXphdGlvbkJpbmRpbmcubGVuZ3RofHwoci5pbml0aWFsaXphdGlvbkJpbmRpbmc9W10pLHIuaW5pdGlhbGl6YXRpb25CaW5kaW5nLnB1c2goYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgNDpyLnVwZGF0ZUJpbmRpbmcmJnIudXBkYXRlQmluZGluZy5sZW5ndGh8fChyLnVwZGF0ZUJpbmRpbmc9W10pLHIudXBkYXRlQmluZGluZy5wdXNoKGMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLmluaXRpYWxpemF0aW9uJiZlLmhhc093blByb3BlcnR5KCJpbml0aWFsaXphdGlvbiIpJiYobj1jLm9ubnguR3JhcGhQcm90by52ZXJpZnkoZS5pbml0aWFsaXphdGlvbikpKXJldHVybiAiaW5pdGlhbGl6YXRpb24uIituO2lmKG51bGwhPWUuYWxnb3JpdGhtJiZlLmhhc093blByb3BlcnR5KCJhbGdvcml0aG0iKSYmKG49Yy5vbm54LkdyYXBoUHJvdG8udmVyaWZ5KGUuYWxnb3JpdGhtKSkpcmV0dXJuICJhbGdvcml0aG0uIituO2lmKG51bGwhPWUuaW5pdGlhbGl6YXRpb25CaW5kaW5nJiZlLmhhc093blByb3BlcnR5KCJpbml0aWFsaXphdGlvbkJpbmRpbmciKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbml0aWFsaXphdGlvbkJpbmRpbmcpKXJldHVybiAiaW5pdGlhbGl6YXRpb25CaW5kaW5nOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciB0PTA7dDxlLmluaXRpYWxpemF0aW9uQmluZGluZy5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udmVyaWZ5KGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nW3RdKSlyZXR1cm4gImluaXRpYWxpemF0aW9uQmluZGluZy4iK259aWYobnVsbCE9ZS51cGRhdGVCaW5kaW5nJiZlLmhhc093blByb3BlcnR5KCJ1cGRhdGVCaW5kaW5nIikpe2lmKCFBcnJheS5pc0FycmF5KGUudXBkYXRlQmluZGluZykpcmV0dXJuICJ1cGRhdGVCaW5kaW5nOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUudXBkYXRlQmluZGluZy5sZW5ndGg7Kyt0KXt2YXIgbjtpZihuPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnZlcmlmeShlLnVwZGF0ZUJpbmRpbmdbdF0pKXJldHVybiAidXBkYXRlQmluZGluZy4iK259fXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UcmFpbmluZ0luZm9Qcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlRyYWluaW5nSW5mb1Byb3RvO2lmKG51bGwhPWUuaW5pdGlhbGl6YXRpb24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5pbml0aWFsaXphdGlvbil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRyYWluaW5nSW5mb1Byb3RvLmluaXRpYWxpemF0aW9uOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmluaXRpYWxpemF0aW9uPWMub25ueC5HcmFwaFByb3RvLmZyb21PYmplY3QoZS5pbml0aWFsaXphdGlvbik7fWlmKG51bGwhPWUuYWxnb3JpdGhtKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuYWxnb3JpdGhtKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8uYWxnb3JpdGhtOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmFsZ29yaXRobT1jLm9ubnguR3JhcGhQcm90by5mcm9tT2JqZWN0KGUuYWxnb3JpdGhtKTt9aWYoZS5pbml0aWFsaXphdGlvbkJpbmRpbmcpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRyYWluaW5nSW5mb1Byb3RvLmluaXRpYWxpemF0aW9uQmluZGluZzogYXJyYXkgZXhwZWN0ZWQiKTt0LmluaXRpYWxpemF0aW9uQmluZGluZz1bXTtmb3IodmFyIG49MDtuPGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5pbml0aWFsaXphdGlvbkJpbmRpbmdbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5UcmFpbmluZ0luZm9Qcm90by5pbml0aWFsaXphdGlvbkJpbmRpbmc6IG9iamVjdCBleHBlY3RlZCIpO3QuaW5pdGlhbGl6YXRpb25CaW5kaW5nW25dPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmZyb21PYmplY3QoZS5pbml0aWFsaXphdGlvbkJpbmRpbmdbbl0pO319aWYoZS51cGRhdGVCaW5kaW5nKXtpZighQXJyYXkuaXNBcnJheShlLnVwZGF0ZUJpbmRpbmcpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8udXBkYXRlQmluZGluZzogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC51cGRhdGVCaW5kaW5nPVtdLG49MDtuPGUudXBkYXRlQmluZGluZy5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUudXBkYXRlQmluZGluZ1tuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRyYWluaW5nSW5mb1Byb3RvLnVwZGF0ZUJpbmRpbmc6IG9iamVjdCBleHBlY3RlZCIpO3QudXBkYXRlQmluZGluZ1tuXT1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5mcm9tT2JqZWN0KGUudXBkYXRlQmluZGluZ1tuXSk7fX1yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5pbml0aWFsaXphdGlvbkJpbmRpbmc9W10sbi51cGRhdGVCaW5kaW5nPVtdKSx0LmRlZmF1bHRzJiYobi5pbml0aWFsaXphdGlvbj1udWxsLG4uYWxnb3JpdGhtPW51bGwpLG51bGwhPWUuaW5pdGlhbGl6YXRpb24mJmUuaGFzT3duUHJvcGVydHkoImluaXRpYWxpemF0aW9uIikmJihuLmluaXRpYWxpemF0aW9uPWMub25ueC5HcmFwaFByb3RvLnRvT2JqZWN0KGUuaW5pdGlhbGl6YXRpb24sdCkpLG51bGwhPWUuYWxnb3JpdGhtJiZlLmhhc093blByb3BlcnR5KCJhbGdvcml0aG0iKSYmKG4uYWxnb3JpdGhtPWMub25ueC5HcmFwaFByb3RvLnRvT2JqZWN0KGUuYWxnb3JpdGhtLHQpKSxlLmluaXRpYWxpemF0aW9uQmluZGluZyYmZS5pbml0aWFsaXphdGlvbkJpbmRpbmcubGVuZ3RoKXtuLmluaXRpYWxpemF0aW9uQmluZGluZz1bXTtmb3IodmFyIHI9MDtyPGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nLmxlbmd0aDsrK3Ipbi5pbml0aWFsaXphdGlvbkJpbmRpbmdbcl09Yy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udG9PYmplY3QoZS5pbml0aWFsaXphdGlvbkJpbmRpbmdbcl0sdCk7fWlmKGUudXBkYXRlQmluZGluZyYmZS51cGRhdGVCaW5kaW5nLmxlbmd0aClmb3Iobi51cGRhdGVCaW5kaW5nPVtdLHI9MDtyPGUudXBkYXRlQmluZGluZy5sZW5ndGg7KytyKW4udXBkYXRlQmluZGluZ1tyXT1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by50b09iamVjdChlLnVwZGF0ZUJpbmRpbmdbcl0sdCk7cmV0dXJuIG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVHJhaW5pbmdJbmZvUHJvdG8ifSxlfSgpLGkuTW9kZWxQcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5vcHNldEltcG9ydD1bXSx0aGlzLm1ldGFkYXRhUHJvcHM9W10sdGhpcy50cmFpbmluZ0luZm89W10sdGhpcy5mdW5jdGlvbnM9W10sZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUuaXJWZXJzaW9uPWwuTG9uZz9sLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLGUucHJvdG90eXBlLm9wc2V0SW1wb3J0PWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5wcm9kdWNlck5hbWU9IiIsZS5wcm90b3R5cGUucHJvZHVjZXJWZXJzaW9uPSIiLGUucHJvdG90eXBlLmRvbWFpbj0iIixlLnByb3RvdHlwZS5tb2RlbFZlcnNpb249bC5Mb25nP2wuTG9uZy5mcm9tQml0cygwLDAsITEpOjAsZS5wcm90b3R5cGUuZG9jU3RyaW5nPSIiLGUucHJvdG90eXBlLmdyYXBoPW51bGwsZS5wcm90b3R5cGUubWV0YWRhdGFQcm9wcz1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUudHJhaW5pbmdJbmZvPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5mdW5jdGlvbnM9bC5lbXB0eUFycmF5LGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtpZih0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmlyVmVyc2lvbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiaXJWZXJzaW9uIikmJnQudWludDMyKDgpLmludDY0KGUuaXJWZXJzaW9uKSxudWxsIT1lLnByb2R1Y2VyTmFtZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwicHJvZHVjZXJOYW1lIikmJnQudWludDMyKDE4KS5zdHJpbmcoZS5wcm9kdWNlck5hbWUpLG51bGwhPWUucHJvZHVjZXJWZXJzaW9uJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJwcm9kdWNlclZlcnNpb24iKSYmdC51aW50MzIoMjYpLnN0cmluZyhlLnByb2R1Y2VyVmVyc2lvbiksbnVsbCE9ZS5kb21haW4mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvbWFpbiIpJiZ0LnVpbnQzMigzNCkuc3RyaW5nKGUuZG9tYWluKSxudWxsIT1lLm1vZGVsVmVyc2lvbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwibW9kZWxWZXJzaW9uIikmJnQudWludDMyKDQwKS5pbnQ2NChlLm1vZGVsVmVyc2lvbiksbnVsbCE9ZS5kb2NTdHJpbmcmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvY1N0cmluZyIpJiZ0LnVpbnQzMig1MCkuc3RyaW5nKGUuZG9jU3RyaW5nKSxudWxsIT1lLmdyYXBoJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJncmFwaCIpJiZjLm9ubnguR3JhcGhQcm90by5lbmNvZGUoZS5ncmFwaCx0LnVpbnQzMig1OCkuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLm9wc2V0SW1wb3J0JiZlLm9wc2V0SW1wb3J0Lmxlbmd0aClmb3IodmFyIG49MDtuPGUub3BzZXRJbXBvcnQubGVuZ3RoOysrbiljLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLmVuY29kZShlLm9wc2V0SW1wb3J0W25dLHQudWludDMyKDY2KS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUubWV0YWRhdGFQcm9wcyYmZS5tZXRhZGF0YVByb3BzLmxlbmd0aClmb3Iobj0wO248ZS5tZXRhZGF0YVByb3BzLmxlbmd0aDsrK24pYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZW5jb2RlKGUubWV0YWRhdGFQcm9wc1tuXSx0LnVpbnQzMigxMTQpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS50cmFpbmluZ0luZm8mJmUudHJhaW5pbmdJbmZvLmxlbmd0aClmb3Iobj0wO248ZS50cmFpbmluZ0luZm8ubGVuZ3RoOysrbiljLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8uZW5jb2RlKGUudHJhaW5pbmdJbmZvW25dLHQudWludDMyKDE2MikuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLmZ1bmN0aW9ucyYmZS5mdW5jdGlvbnMubGVuZ3RoKWZvcihuPTA7bjxlLmZ1bmN0aW9ucy5sZW5ndGg7KytuKWMub25ueC5GdW5jdGlvblByb3RvLmVuY29kZShlLmZ1bmN0aW9uc1tuXSx0LnVpbnQzMigyMDIpLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5Nb2RlbFByb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIuaXJWZXJzaW9uPWUuaW50NjQoKTticmVhaztjYXNlIDg6ci5vcHNldEltcG9ydCYmci5vcHNldEltcG9ydC5sZW5ndGh8fChyLm9wc2V0SW1wb3J0PVtdKSxyLm9wc2V0SW1wb3J0LnB1c2goYy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAyOnIucHJvZHVjZXJOYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAzOnIucHJvZHVjZXJWZXJzaW9uPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA0OnIuZG9tYWluPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA1OnIubW9kZWxWZXJzaW9uPWUuaW50NjQoKTticmVhaztjYXNlIDY6ci5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVhaztjYXNlIDc6ci5ncmFwaD1jLm9ubnguR3JhcGhQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDE0OnIubWV0YWRhdGFQcm9wcyYmci5tZXRhZGF0YVByb3BzLmxlbmd0aHx8KHIubWV0YWRhdGFQcm9wcz1bXSksci5tZXRhZGF0YVByb3BzLnB1c2goYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMjA6ci50cmFpbmluZ0luZm8mJnIudHJhaW5pbmdJbmZvLmxlbmd0aHx8KHIudHJhaW5pbmdJbmZvPVtdKSxyLnRyYWluaW5nSW5mby5wdXNoKGMub25ueC5UcmFpbmluZ0luZm9Qcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAyNTpyLmZ1bmN0aW9ucyYmci5mdW5jdGlvbnMubGVuZ3RofHwoci5mdW5jdGlvbnM9W10pLHIuZnVuY3Rpb25zLnB1c2goYy5vbm54LkZ1bmN0aW9uUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO2lmKG51bGwhPWUuaXJWZXJzaW9uJiZlLmhhc093blByb3BlcnR5KCJpclZlcnNpb24iKSYmIShsLmlzSW50ZWdlcihlLmlyVmVyc2lvbil8fGUuaXJWZXJzaW9uJiZsLmlzSW50ZWdlcihlLmlyVmVyc2lvbi5sb3cpJiZsLmlzSW50ZWdlcihlLmlyVmVyc2lvbi5oaWdoKSkpcmV0dXJuICJpclZlcnNpb246IGludGVnZXJ8TG9uZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5vcHNldEltcG9ydCYmZS5oYXNPd25Qcm9wZXJ0eSgib3BzZXRJbXBvcnQiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5vcHNldEltcG9ydCkpcmV0dXJuICJvcHNldEltcG9ydDogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgdD0wO3Q8ZS5vcHNldEltcG9ydC5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by52ZXJpZnkoZS5vcHNldEltcG9ydFt0XSkpcmV0dXJuICJvcHNldEltcG9ydC4iK259aWYobnVsbCE9ZS5wcm9kdWNlck5hbWUmJmUuaGFzT3duUHJvcGVydHkoInByb2R1Y2VyTmFtZSIpJiYhbC5pc1N0cmluZyhlLnByb2R1Y2VyTmFtZSkpcmV0dXJuICJwcm9kdWNlck5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5wcm9kdWNlclZlcnNpb24mJmUuaGFzT3duUHJvcGVydHkoInByb2R1Y2VyVmVyc2lvbiIpJiYhbC5pc1N0cmluZyhlLnByb2R1Y2VyVmVyc2lvbikpcmV0dXJuICJwcm9kdWNlclZlcnNpb246IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5kb21haW4mJmUuaGFzT3duUHJvcGVydHkoImRvbWFpbiIpJiYhbC5pc1N0cmluZyhlLmRvbWFpbikpcmV0dXJuICJkb21haW46IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5tb2RlbFZlcnNpb24mJmUuaGFzT3duUHJvcGVydHkoIm1vZGVsVmVyc2lvbiIpJiYhKGwuaXNJbnRlZ2VyKGUubW9kZWxWZXJzaW9uKXx8ZS5tb2RlbFZlcnNpb24mJmwuaXNJbnRlZ2VyKGUubW9kZWxWZXJzaW9uLmxvdykmJmwuaXNJbnRlZ2VyKGUubW9kZWxWZXJzaW9uLmhpZ2gpKSlyZXR1cm4gIm1vZGVsVmVyc2lvbjogaW50ZWdlcnxMb25nIGV4cGVjdGVkIjtpZihudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJiFsLmlzU3RyaW5nKGUuZG9jU3RyaW5nKSlyZXR1cm4gImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjtpZihudWxsIT1lLmdyYXBoJiZlLmhhc093blByb3BlcnR5KCJncmFwaCIpJiYobj1jLm9ubnguR3JhcGhQcm90by52ZXJpZnkoZS5ncmFwaCkpKXJldHVybiAiZ3JhcGguIituO2lmKG51bGwhPWUubWV0YWRhdGFQcm9wcyYmZS5oYXNPd25Qcm9wZXJ0eSgibWV0YWRhdGFQcm9wcyIpKXtpZighQXJyYXkuaXNBcnJheShlLm1ldGFkYXRhUHJvcHMpKXJldHVybiAibWV0YWRhdGFQcm9wczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLm1ldGFkYXRhUHJvcHMubGVuZ3RoOysrdClpZihuPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnZlcmlmeShlLm1ldGFkYXRhUHJvcHNbdF0pKXJldHVybiAibWV0YWRhdGFQcm9wcy4iK259aWYobnVsbCE9ZS50cmFpbmluZ0luZm8mJmUuaGFzT3duUHJvcGVydHkoInRyYWluaW5nSW5mbyIpKXtpZighQXJyYXkuaXNBcnJheShlLnRyYWluaW5nSW5mbykpcmV0dXJuICJ0cmFpbmluZ0luZm86IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS50cmFpbmluZ0luZm8ubGVuZ3RoOysrdClpZihuPWMub25ueC5UcmFpbmluZ0luZm9Qcm90by52ZXJpZnkoZS50cmFpbmluZ0luZm9bdF0pKXJldHVybiAidHJhaW5pbmdJbmZvLiIrbn1pZihudWxsIT1lLmZ1bmN0aW9ucyYmZS5oYXNPd25Qcm9wZXJ0eSgiZnVuY3Rpb25zIikpe2lmKCFBcnJheS5pc0FycmF5KGUuZnVuY3Rpb25zKSlyZXR1cm4gImZ1bmN0aW9uczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmZ1bmN0aW9ucy5sZW5ndGg7Kyt0KXt2YXIgbjtpZihuPWMub25ueC5GdW5jdGlvblByb3RvLnZlcmlmeShlLmZ1bmN0aW9uc1t0XSkpcmV0dXJuICJmdW5jdGlvbnMuIitufX1yZXR1cm4gbnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguTW9kZWxQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54Lk1vZGVsUHJvdG87aWYobnVsbCE9ZS5pclZlcnNpb24mJihsLkxvbmc/KHQuaXJWZXJzaW9uPWwuTG9uZy5mcm9tVmFsdWUoZS5pclZlcnNpb24pKS51bnNpZ25lZD0hMToic3RyaW5nIj09dHlwZW9mIGUuaXJWZXJzaW9uP3QuaXJWZXJzaW9uPXBhcnNlSW50KGUuaXJWZXJzaW9uLDEwKToibnVtYmVyIj09dHlwZW9mIGUuaXJWZXJzaW9uP3QuaXJWZXJzaW9uPWUuaXJWZXJzaW9uOiJvYmplY3QiPT10eXBlb2YgZS5pclZlcnNpb24mJih0LmlyVmVyc2lvbj1uZXcgbC5Mb25nQml0cyhlLmlyVmVyc2lvbi5sb3c+Pj4wLGUuaXJWZXJzaW9uLmhpZ2g+Pj4wKS50b051bWJlcigpKSksZS5vcHNldEltcG9ydCl7aWYoIUFycmF5LmlzQXJyYXkoZS5vcHNldEltcG9ydCkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLm9wc2V0SW1wb3J0OiBhcnJheSBleHBlY3RlZCIpO3Qub3BzZXRJbXBvcnQ9W107Zm9yKHZhciBuPTA7bjxlLm9wc2V0SW1wb3J0Lmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5vcHNldEltcG9ydFtuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk1vZGVsUHJvdG8ub3BzZXRJbXBvcnQ6IG9iamVjdCBleHBlY3RlZCIpO3Qub3BzZXRJbXBvcnRbbl09Yy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by5mcm9tT2JqZWN0KGUub3BzZXRJbXBvcnRbbl0pO319aWYobnVsbCE9ZS5wcm9kdWNlck5hbWUmJih0LnByb2R1Y2VyTmFtZT1TdHJpbmcoZS5wcm9kdWNlck5hbWUpKSxudWxsIT1lLnByb2R1Y2VyVmVyc2lvbiYmKHQucHJvZHVjZXJWZXJzaW9uPVN0cmluZyhlLnByb2R1Y2VyVmVyc2lvbikpLG51bGwhPWUuZG9tYWluJiYodC5kb21haW49U3RyaW5nKGUuZG9tYWluKSksbnVsbCE9ZS5tb2RlbFZlcnNpb24mJihsLkxvbmc/KHQubW9kZWxWZXJzaW9uPWwuTG9uZy5mcm9tVmFsdWUoZS5tb2RlbFZlcnNpb24pKS51bnNpZ25lZD0hMToic3RyaW5nIj09dHlwZW9mIGUubW9kZWxWZXJzaW9uP3QubW9kZWxWZXJzaW9uPXBhcnNlSW50KGUubW9kZWxWZXJzaW9uLDEwKToibnVtYmVyIj09dHlwZW9mIGUubW9kZWxWZXJzaW9uP3QubW9kZWxWZXJzaW9uPWUubW9kZWxWZXJzaW9uOiJvYmplY3QiPT10eXBlb2YgZS5tb2RlbFZlcnNpb24mJih0Lm1vZGVsVmVyc2lvbj1uZXcgbC5Mb25nQml0cyhlLm1vZGVsVmVyc2lvbi5sb3c+Pj4wLGUubW9kZWxWZXJzaW9uLmhpZ2g+Pj4wKS50b051bWJlcigpKSksbnVsbCE9ZS5kb2NTdHJpbmcmJih0LmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSxudWxsIT1lLmdyYXBoKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuZ3JhcGgpdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLmdyYXBoOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmdyYXBoPWMub25ueC5HcmFwaFByb3RvLmZyb21PYmplY3QoZS5ncmFwaCk7fWlmKGUubWV0YWRhdGFQcm9wcyl7aWYoIUFycmF5LmlzQXJyYXkoZS5tZXRhZGF0YVByb3BzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk1vZGVsUHJvdG8ubWV0YWRhdGFQcm9wczogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5tZXRhZGF0YVByb3BzPVtdLG49MDtuPGUubWV0YWRhdGFQcm9wcy5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUubWV0YWRhdGFQcm9wc1tuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk1vZGVsUHJvdG8ubWV0YWRhdGFQcm9wczogb2JqZWN0IGV4cGVjdGVkIik7dC5tZXRhZGF0YVByb3BzW25dPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmZyb21PYmplY3QoZS5tZXRhZGF0YVByb3BzW25dKTt9fWlmKGUudHJhaW5pbmdJbmZvKXtpZighQXJyYXkuaXNBcnJheShlLnRyYWluaW5nSW5mbykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLnRyYWluaW5nSW5mbzogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC50cmFpbmluZ0luZm89W10sbj0wO248ZS50cmFpbmluZ0luZm8ubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnRyYWluaW5nSW5mb1tuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk1vZGVsUHJvdG8udHJhaW5pbmdJbmZvOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnRyYWluaW5nSW5mb1tuXT1jLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8uZnJvbU9iamVjdChlLnRyYWluaW5nSW5mb1tuXSk7fX1pZihlLmZ1bmN0aW9ucyl7aWYoIUFycmF5LmlzQXJyYXkoZS5mdW5jdGlvbnMpKXRocm93IFR5cGVFcnJvcigiLm9ubnguTW9kZWxQcm90by5mdW5jdGlvbnM6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuZnVuY3Rpb25zPVtdLG49MDtuPGUuZnVuY3Rpb25zLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5mdW5jdGlvbnNbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLmZ1bmN0aW9uczogb2JqZWN0IGV4cGVjdGVkIik7dC5mdW5jdGlvbnNbbl09Yy5vbm54LkZ1bmN0aW9uUHJvdG8uZnJvbU9iamVjdChlLmZ1bmN0aW9uc1tuXSk7fX1yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5vcHNldEltcG9ydD1bXSxuLm1ldGFkYXRhUHJvcHM9W10sbi50cmFpbmluZ0luZm89W10sbi5mdW5jdGlvbnM9W10pLHQuZGVmYXVsdHMpe2lmKGwuTG9uZyl7dmFyIHI9bmV3IGwuTG9uZygwLDAsITEpO24uaXJWZXJzaW9uPXQubG9uZ3M9PT1TdHJpbmc/ci50b1N0cmluZygpOnQubG9uZ3M9PT1OdW1iZXI/ci50b051bWJlcigpOnI7fWVsc2Ugbi5pclZlcnNpb249dC5sb25ncz09PVN0cmluZz8iMCI6MDtuLnByb2R1Y2VyTmFtZT0iIixuLnByb2R1Y2VyVmVyc2lvbj0iIixuLmRvbWFpbj0iIixsLkxvbmc/KHI9bmV3IGwuTG9uZygwLDAsITEpLG4ubW9kZWxWZXJzaW9uPXQubG9uZ3M9PT1TdHJpbmc/ci50b1N0cmluZygpOnQubG9uZ3M9PT1OdW1iZXI/ci50b051bWJlcigpOnIpOm4ubW9kZWxWZXJzaW9uPXQubG9uZ3M9PT1TdHJpbmc/IjAiOjAsbi5kb2NTdHJpbmc9IiIsbi5ncmFwaD1udWxsO31pZihudWxsIT1lLmlyVmVyc2lvbiYmZS5oYXNPd25Qcm9wZXJ0eSgiaXJWZXJzaW9uIikmJigibnVtYmVyIj09dHlwZW9mIGUuaXJWZXJzaW9uP24uaXJWZXJzaW9uPXQubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUuaXJWZXJzaW9uKTplLmlyVmVyc2lvbjpuLmlyVmVyc2lvbj10LmxvbmdzPT09U3RyaW5nP2wuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLmlyVmVyc2lvbik6dC5sb25ncz09PU51bWJlcj9uZXcgbC5Mb25nQml0cyhlLmlyVmVyc2lvbi5sb3c+Pj4wLGUuaXJWZXJzaW9uLmhpZ2g+Pj4wKS50b051bWJlcigpOmUuaXJWZXJzaW9uKSxudWxsIT1lLnByb2R1Y2VyTmFtZSYmZS5oYXNPd25Qcm9wZXJ0eSgicHJvZHVjZXJOYW1lIikmJihuLnByb2R1Y2VyTmFtZT1lLnByb2R1Y2VyTmFtZSksbnVsbCE9ZS5wcm9kdWNlclZlcnNpb24mJmUuaGFzT3duUHJvcGVydHkoInByb2R1Y2VyVmVyc2lvbiIpJiYobi5wcm9kdWNlclZlcnNpb249ZS5wcm9kdWNlclZlcnNpb24pLG51bGwhPWUuZG9tYWluJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmKG4uZG9tYWluPWUuZG9tYWluKSxudWxsIT1lLm1vZGVsVmVyc2lvbiYmZS5oYXNPd25Qcm9wZXJ0eSgibW9kZWxWZXJzaW9uIikmJigibnVtYmVyIj09dHlwZW9mIGUubW9kZWxWZXJzaW9uP24ubW9kZWxWZXJzaW9uPXQubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUubW9kZWxWZXJzaW9uKTplLm1vZGVsVmVyc2lvbjpuLm1vZGVsVmVyc2lvbj10LmxvbmdzPT09U3RyaW5nP2wuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLm1vZGVsVmVyc2lvbik6dC5sb25ncz09PU51bWJlcj9uZXcgbC5Mb25nQml0cyhlLm1vZGVsVmVyc2lvbi5sb3c+Pj4wLGUubW9kZWxWZXJzaW9uLmhpZ2g+Pj4wKS50b051bWJlcigpOmUubW9kZWxWZXJzaW9uKSxudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJihuLmRvY1N0cmluZz1lLmRvY1N0cmluZyksbnVsbCE9ZS5ncmFwaCYmZS5oYXNPd25Qcm9wZXJ0eSgiZ3JhcGgiKSYmKG4uZ3JhcGg9Yy5vbm54LkdyYXBoUHJvdG8udG9PYmplY3QoZS5ncmFwaCx0KSksZS5vcHNldEltcG9ydCYmZS5vcHNldEltcG9ydC5sZW5ndGgpe24ub3BzZXRJbXBvcnQ9W107Zm9yKHZhciBvPTA7bzxlLm9wc2V0SW1wb3J0Lmxlbmd0aDsrK28pbi5vcHNldEltcG9ydFtvXT1jLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLnRvT2JqZWN0KGUub3BzZXRJbXBvcnRbb10sdCk7fWlmKGUubWV0YWRhdGFQcm9wcyYmZS5tZXRhZGF0YVByb3BzLmxlbmd0aClmb3Iobi5tZXRhZGF0YVByb3BzPVtdLG89MDtvPGUubWV0YWRhdGFQcm9wcy5sZW5ndGg7KytvKW4ubWV0YWRhdGFQcm9wc1tvXT1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by50b09iamVjdChlLm1ldGFkYXRhUHJvcHNbb10sdCk7aWYoZS50cmFpbmluZ0luZm8mJmUudHJhaW5pbmdJbmZvLmxlbmd0aClmb3Iobi50cmFpbmluZ0luZm89W10sbz0wO288ZS50cmFpbmluZ0luZm8ubGVuZ3RoOysrbyluLnRyYWluaW5nSW5mb1tvXT1jLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8udG9PYmplY3QoZS50cmFpbmluZ0luZm9bb10sdCk7aWYoZS5mdW5jdGlvbnMmJmUuZnVuY3Rpb25zLmxlbmd0aClmb3Iobi5mdW5jdGlvbnM9W10sbz0wO288ZS5mdW5jdGlvbnMubGVuZ3RoOysrbyluLmZ1bmN0aW9uc1tvXT1jLm9ubnguRnVuY3Rpb25Qcm90by50b09iamVjdChlLmZ1bmN0aW9uc1tvXSx0KTtyZXR1cm4gbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5Nb2RlbFByb3RvIn0sZX0oKSxpLlN0cmluZ1N0cmluZ0VudHJ5UHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmtleT0iIixlLnByb3RvdHlwZS52YWx1ZT0iIixlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUua2V5JiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJrZXkiKSYmdC51aW50MzIoMTApLnN0cmluZyhlLmtleSksbnVsbCE9ZS52YWx1ZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidmFsdWUiKSYmdC51aW50MzIoMTgpLnN0cmluZyhlLnZhbHVlKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLmtleT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMjpyLnZhbHVlPWUuc3RyaW5nKCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7cmV0dXJuICJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWU/Im9iamVjdCBleHBlY3RlZCI6bnVsbCE9ZS5rZXkmJmUuaGFzT3duUHJvcGVydHkoImtleSIpJiYhbC5pc1N0cmluZyhlLmtleSk/ImtleTogc3RyaW5nIGV4cGVjdGVkIjpudWxsIT1lLnZhbHVlJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZSIpJiYhbC5pc1N0cmluZyhlLnZhbHVlKT8idmFsdWU6IHN0cmluZyBleHBlY3RlZCI6bnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG87cmV0dXJuIG51bGwhPWUua2V5JiYodC5rZXk9U3RyaW5nKGUua2V5KSksbnVsbCE9ZS52YWx1ZSYmKHQudmFsdWU9U3RyaW5nKGUudmFsdWUpKSx0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O3JldHVybiB0LmRlZmF1bHRzJiYobi5rZXk9IiIsbi52YWx1ZT0iIiksbnVsbCE9ZS5rZXkmJmUuaGFzT3duUHJvcGVydHkoImtleSIpJiYobi5rZXk9ZS5rZXkpLG51bGwhPWUudmFsdWUmJmUuaGFzT3duUHJvcGVydHkoInZhbHVlIikmJihuLnZhbHVlPWUudmFsdWUpLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90byJ9LGV9KCksaS5UZW5zb3JBbm5vdGF0aW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXM9W10sZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUudGVuc29yTmFtZT0iIixlLnByb3RvdHlwZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzPWwuZW1wdHlBcnJheSxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7aWYodHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS50ZW5zb3JOYW1lJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJ0ZW5zb3JOYW1lIikmJnQudWludDMyKDEwKS5zdHJpbmcoZS50ZW5zb3JOYW1lKSxudWxsIT1lLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMmJmUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcy5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMubGVuZ3RoOysrbiljLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5lbmNvZGUoZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzW25dLHQudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiB0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguVGVuc29yQW5ub3RhdGlvbjtlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLnRlbnNvck5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDI6ci5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzJiZyLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMubGVuZ3RofHwoci5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzPVtdKSxyLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMucHVzaChjLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS50ZW5zb3JOYW1lJiZlLmhhc093blByb3BlcnR5KCJ0ZW5zb3JOYW1lIikmJiFsLmlzU3RyaW5nKGUudGVuc29yTmFtZSkpcmV0dXJuICJ0ZW5zb3JOYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcyYmZS5oYXNPd25Qcm9wZXJ0eSgicXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcyIpKXtpZighQXJyYXkuaXNBcnJheShlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMpKXJldHVybiAicXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgdD0wO3Q8ZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aDsrK3Qpe3ZhciBuPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnZlcmlmeShlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXNbdF0pO2lmKG4pcmV0dXJuICJxdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLiIrbn19cmV0dXJuIG51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlRlbnNvckFubm90YXRpb24pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UZW5zb3JBbm5vdGF0aW9uO2lmKG51bGwhPWUudGVuc29yTmFtZSYmKHQudGVuc29yTmFtZT1TdHJpbmcoZS50ZW5zb3JOYW1lKSksZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzKXtpZighQXJyYXkuaXNBcnJheShlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yQW5ub3RhdGlvbi5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzOiBhcnJheSBleHBlY3RlZCIpO3QucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcz1bXTtmb3IodmFyIG49MDtuPGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcy5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lc1tuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvckFubm90YXRpb24ucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lczogb2JqZWN0IGV4cGVjdGVkIik7dC5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzW25dPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmZyb21PYmplY3QoZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzW25dKTt9fXJldHVybiB0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O2lmKCh0LmFycmF5c3x8dC5kZWZhdWx0cykmJihuLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXM9W10pLHQuZGVmYXVsdHMmJihuLnRlbnNvck5hbWU9IiIpLG51bGwhPWUudGVuc29yTmFtZSYmZS5oYXNPd25Qcm9wZXJ0eSgidGVuc29yTmFtZSIpJiYobi50ZW5zb3JOYW1lPWUudGVuc29yTmFtZSksZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzJiZlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMubGVuZ3RoKXtuLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXM9W107Zm9yKHZhciByPTA7cjxlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMubGVuZ3RoOysrciluLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXNbcl09Yy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udG9PYmplY3QoZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzW3JdLHQpO31yZXR1cm4gbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UZW5zb3JBbm5vdGF0aW9uIn0sZX0oKSxpLkdyYXBoUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMubm9kZT1bXSx0aGlzLmluaXRpYWxpemVyPVtdLHRoaXMuc3BhcnNlSW5pdGlhbGl6ZXI9W10sdGhpcy5pbnB1dD1bXSx0aGlzLm91dHB1dD1bXSx0aGlzLnZhbHVlSW5mbz1bXSx0aGlzLnF1YW50aXphdGlvbkFubm90YXRpb249W10sZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUubm9kZT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUubmFtZT0iIixlLnByb3RvdHlwZS5pbml0aWFsaXplcj1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuc3BhcnNlSW5pdGlhbGl6ZXI9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmRvY1N0cmluZz0iIixlLnByb3RvdHlwZS5pbnB1dD1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUub3V0cHV0PWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS52YWx1ZUluZm89bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnF1YW50aXphdGlvbkFubm90YXRpb249bC5lbXB0eUFycmF5LGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtpZih0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLm5vZGUmJmUubm9kZS5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLm5vZGUubGVuZ3RoOysrbiljLm9ubnguTm9kZVByb3RvLmVuY29kZShlLm5vZGVbbl0sdC51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS5uYW1lJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJuYW1lIikmJnQudWludDMyKDE4KS5zdHJpbmcoZS5uYW1lKSxudWxsIT1lLmluaXRpYWxpemVyJiZlLmluaXRpYWxpemVyLmxlbmd0aClmb3Iobj0wO248ZS5pbml0aWFsaXplci5sZW5ndGg7KytuKWMub25ueC5UZW5zb3JQcm90by5lbmNvZGUoZS5pbml0aWFsaXplcltuXSx0LnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLmRvY1N0cmluZyYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZG9jU3RyaW5nIikmJnQudWludDMyKDgyKS5zdHJpbmcoZS5kb2NTdHJpbmcpLG51bGwhPWUuaW5wdXQmJmUuaW5wdXQubGVuZ3RoKWZvcihuPTA7bjxlLmlucHV0Lmxlbmd0aDsrK24pYy5vbm54LlZhbHVlSW5mb1Byb3RvLmVuY29kZShlLmlucHV0W25dLHQudWludDMyKDkwKS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUub3V0cHV0JiZlLm91dHB1dC5sZW5ndGgpZm9yKG49MDtuPGUub3V0cHV0Lmxlbmd0aDsrK24pYy5vbm54LlZhbHVlSW5mb1Byb3RvLmVuY29kZShlLm91dHB1dFtuXSx0LnVpbnQzMig5OCkuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLnZhbHVlSW5mbyYmZS52YWx1ZUluZm8ubGVuZ3RoKWZvcihuPTA7bjxlLnZhbHVlSW5mby5sZW5ndGg7KytuKWMub25ueC5WYWx1ZUluZm9Qcm90by5lbmNvZGUoZS52YWx1ZUluZm9bbl0sdC51aW50MzIoMTA2KS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUucXVhbnRpemF0aW9uQW5ub3RhdGlvbiYmZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uLmxlbmd0aClmb3Iobj0wO248ZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uLmxlbmd0aDsrK24pYy5vbm54LlRlbnNvckFubm90YXRpb24uZW5jb2RlKGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbltuXSx0LnVpbnQzMigxMTQpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS5zcGFyc2VJbml0aWFsaXplciYmZS5zcGFyc2VJbml0aWFsaXplci5sZW5ndGgpZm9yKG49MDtuPGUuc3BhcnNlSW5pdGlhbGl6ZXIubGVuZ3RoOysrbiljLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZW5jb2RlKGUuc3BhcnNlSW5pdGlhbGl6ZXJbbl0sdC51aW50MzIoMTIyKS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiB0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguR3JhcGhQcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLm5vZGUmJnIubm9kZS5sZW5ndGh8fChyLm5vZGU9W10pLHIubm9kZS5wdXNoKGMub25ueC5Ob2RlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMjpyLm5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDU6ci5pbml0aWFsaXplciYmci5pbml0aWFsaXplci5sZW5ndGh8fChyLmluaXRpYWxpemVyPVtdKSxyLmluaXRpYWxpemVyLnB1c2goYy5vbm54LlRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDE1OnIuc3BhcnNlSW5pdGlhbGl6ZXImJnIuc3BhcnNlSW5pdGlhbGl6ZXIubGVuZ3RofHwoci5zcGFyc2VJbml0aWFsaXplcj1bXSksci5zcGFyc2VJbml0aWFsaXplci5wdXNoKGMub25ueC5TcGFyc2VUZW5zb3JQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAxMDpyLmRvY1N0cmluZz1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMTE6ci5pbnB1dCYmci5pbnB1dC5sZW5ndGh8fChyLmlucHV0PVtdKSxyLmlucHV0LnB1c2goYy5vbm54LlZhbHVlSW5mb1Byb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDEyOnIub3V0cHV0JiZyLm91dHB1dC5sZW5ndGh8fChyLm91dHB1dD1bXSksci5vdXRwdXQucHVzaChjLm9ubnguVmFsdWVJbmZvUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTM6ci52YWx1ZUluZm8mJnIudmFsdWVJbmZvLmxlbmd0aHx8KHIudmFsdWVJbmZvPVtdKSxyLnZhbHVlSW5mby5wdXNoKGMub25ueC5WYWx1ZUluZm9Qcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAxNDpyLnF1YW50aXphdGlvbkFubm90YXRpb24mJnIucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGh8fChyLnF1YW50aXphdGlvbkFubm90YXRpb249W10pLHIucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5wdXNoKGMub25ueC5UZW5zb3JBbm5vdGF0aW9uLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLm5vZGUmJmUuaGFzT3duUHJvcGVydHkoIm5vZGUiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5ub2RlKSlyZXR1cm4gIm5vZGU6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHQ9MDt0PGUubm9kZS5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54Lk5vZGVQcm90by52ZXJpZnkoZS5ub2RlW3RdKSlyZXR1cm4gIm5vZGUuIitufWlmKG51bGwhPWUubmFtZSYmZS5oYXNPd25Qcm9wZXJ0eSgibmFtZSIpJiYhbC5pc1N0cmluZyhlLm5hbWUpKXJldHVybiAibmFtZTogc3RyaW5nIGV4cGVjdGVkIjtpZihudWxsIT1lLmluaXRpYWxpemVyJiZlLmhhc093blByb3BlcnR5KCJpbml0aWFsaXplciIpKXtpZighQXJyYXkuaXNBcnJheShlLmluaXRpYWxpemVyKSlyZXR1cm4gImluaXRpYWxpemVyOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuaW5pdGlhbGl6ZXIubGVuZ3RoOysrdClpZihuPWMub25ueC5UZW5zb3JQcm90by52ZXJpZnkoZS5pbml0aWFsaXplclt0XSkpcmV0dXJuICJpbml0aWFsaXplci4iK259aWYobnVsbCE9ZS5zcGFyc2VJbml0aWFsaXplciYmZS5oYXNPd25Qcm9wZXJ0eSgic3BhcnNlSW5pdGlhbGl6ZXIiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5zcGFyc2VJbml0aWFsaXplcikpcmV0dXJuICJzcGFyc2VJbml0aWFsaXplcjogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLnNwYXJzZUluaXRpYWxpemVyLmxlbmd0aDsrK3QpaWYobj1jLm9ubnguU3BhcnNlVGVuc29yUHJvdG8udmVyaWZ5KGUuc3BhcnNlSW5pdGlhbGl6ZXJbdF0pKXJldHVybiAic3BhcnNlSW5pdGlhbGl6ZXIuIitufWlmKG51bGwhPWUuZG9jU3RyaW5nJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmIWwuaXNTdHJpbmcoZS5kb2NTdHJpbmcpKXJldHVybiAiZG9jU3RyaW5nOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUuaW5wdXQmJmUuaGFzT3duUHJvcGVydHkoImlucHV0Iikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5wdXQpKXJldHVybiAiaW5wdXQ6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5pbnB1dC5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LlZhbHVlSW5mb1Byb3RvLnZlcmlmeShlLmlucHV0W3RdKSlyZXR1cm4gImlucHV0LiIrbn1pZihudWxsIT1lLm91dHB1dCYmZS5oYXNPd25Qcm9wZXJ0eSgib3V0cHV0Iikpe2lmKCFBcnJheS5pc0FycmF5KGUub3V0cHV0KSlyZXR1cm4gIm91dHB1dDogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLm91dHB1dC5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LlZhbHVlSW5mb1Byb3RvLnZlcmlmeShlLm91dHB1dFt0XSkpcmV0dXJuICJvdXRwdXQuIitufWlmKG51bGwhPWUudmFsdWVJbmZvJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZUluZm8iKSl7aWYoIUFycmF5LmlzQXJyYXkoZS52YWx1ZUluZm8pKXJldHVybiAidmFsdWVJbmZvOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUudmFsdWVJbmZvLmxlbmd0aDsrK3QpaWYobj1jLm9ubnguVmFsdWVJbmZvUHJvdG8udmVyaWZ5KGUudmFsdWVJbmZvW3RdKSlyZXR1cm4gInZhbHVlSW5mby4iK259aWYobnVsbCE9ZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uJiZlLmhhc093blByb3BlcnR5KCJxdWFudGl6YXRpb25Bbm5vdGF0aW9uIikpe2lmKCFBcnJheS5pc0FycmF5KGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbikpcmV0dXJuICJxdWFudGl6YXRpb25Bbm5vdGF0aW9uOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGg7Kyt0KXt2YXIgbjtpZihuPWMub25ueC5UZW5zb3JBbm5vdGF0aW9uLnZlcmlmeShlLnF1YW50aXphdGlvbkFubm90YXRpb25bdF0pKXJldHVybiAicXVhbnRpemF0aW9uQW5ub3RhdGlvbi4iK259fXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5HcmFwaFByb3RvKXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguR3JhcGhQcm90bztpZihlLm5vZGUpe2lmKCFBcnJheS5pc0FycmF5KGUubm9kZSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLm5vZGU6IGFycmF5IGV4cGVjdGVkIik7dC5ub2RlPVtdO2Zvcih2YXIgbj0wO248ZS5ub2RlLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5ub2RlW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5ub2RlOiBvYmplY3QgZXhwZWN0ZWQiKTt0Lm5vZGVbbl09Yy5vbm54Lk5vZGVQcm90by5mcm9tT2JqZWN0KGUubm9kZVtuXSk7fX1pZihudWxsIT1lLm5hbWUmJih0Lm5hbWU9U3RyaW5nKGUubmFtZSkpLGUuaW5pdGlhbGl6ZXIpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5pdGlhbGl6ZXIpKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5pbml0aWFsaXplcjogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5pbml0aWFsaXplcj1bXSxuPTA7bjxlLmluaXRpYWxpemVyLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5pbml0aWFsaXplcltuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8uaW5pdGlhbGl6ZXI6IG9iamVjdCBleHBlY3RlZCIpO3QuaW5pdGlhbGl6ZXJbbl09Yy5vbm54LlRlbnNvclByb3RvLmZyb21PYmplY3QoZS5pbml0aWFsaXplcltuXSk7fX1pZihlLnNwYXJzZUluaXRpYWxpemVyKXtpZighQXJyYXkuaXNBcnJheShlLnNwYXJzZUluaXRpYWxpemVyKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8uc3BhcnNlSW5pdGlhbGl6ZXI6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuc3BhcnNlSW5pdGlhbGl6ZXI9W10sbj0wO248ZS5zcGFyc2VJbml0aWFsaXplci5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuc3BhcnNlSW5pdGlhbGl6ZXJbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLnNwYXJzZUluaXRpYWxpemVyOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnNwYXJzZUluaXRpYWxpemVyW25dPWMub25ueC5TcGFyc2VUZW5zb3JQcm90by5mcm9tT2JqZWN0KGUuc3BhcnNlSW5pdGlhbGl6ZXJbbl0pO319aWYobnVsbCE9ZS5kb2NTdHJpbmcmJih0LmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSxlLmlucHV0KXtpZighQXJyYXkuaXNBcnJheShlLmlucHV0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8uaW5wdXQ6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuaW5wdXQ9W10sbj0wO248ZS5pbnB1dC5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuaW5wdXRbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLmlucHV0OiBvYmplY3QgZXhwZWN0ZWQiKTt0LmlucHV0W25dPWMub25ueC5WYWx1ZUluZm9Qcm90by5mcm9tT2JqZWN0KGUuaW5wdXRbbl0pO319aWYoZS5vdXRwdXQpe2lmKCFBcnJheS5pc0FycmF5KGUub3V0cHV0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8ub3V0cHV0OiBhcnJheSBleHBlY3RlZCIpO2Zvcih0Lm91dHB1dD1bXSxuPTA7bjxlLm91dHB1dC5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUub3V0cHV0W25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5vdXRwdXQ6IG9iamVjdCBleHBlY3RlZCIpO3Qub3V0cHV0W25dPWMub25ueC5WYWx1ZUluZm9Qcm90by5mcm9tT2JqZWN0KGUub3V0cHV0W25dKTt9fWlmKGUudmFsdWVJbmZvKXtpZighQXJyYXkuaXNBcnJheShlLnZhbHVlSW5mbykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLnZhbHVlSW5mbzogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC52YWx1ZUluZm89W10sbj0wO248ZS52YWx1ZUluZm8ubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnZhbHVlSW5mb1tuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8udmFsdWVJbmZvOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnZhbHVlSW5mb1tuXT1jLm9ubnguVmFsdWVJbmZvUHJvdG8uZnJvbU9iamVjdChlLnZhbHVlSW5mb1tuXSk7fX1pZihlLnF1YW50aXphdGlvbkFubm90YXRpb24pe2lmKCFBcnJheS5pc0FycmF5KGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbikpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLnF1YW50aXphdGlvbkFubm90YXRpb246IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQucXVhbnRpemF0aW9uQW5ub3RhdGlvbj1bXSxuPTA7bjxlLnF1YW50aXphdGlvbkFubm90YXRpb24ubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnF1YW50aXphdGlvbkFubm90YXRpb25bbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLnF1YW50aXphdGlvbkFubm90YXRpb246IG9iamVjdCBleHBlY3RlZCIpO3QucXVhbnRpemF0aW9uQW5ub3RhdGlvbltuXT1jLm9ubnguVGVuc29yQW5ub3RhdGlvbi5mcm9tT2JqZWN0KGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbltuXSk7fX1yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5ub2RlPVtdLG4uaW5pdGlhbGl6ZXI9W10sbi5pbnB1dD1bXSxuLm91dHB1dD1bXSxuLnZhbHVlSW5mbz1bXSxuLnF1YW50aXphdGlvbkFubm90YXRpb249W10sbi5zcGFyc2VJbml0aWFsaXplcj1bXSksdC5kZWZhdWx0cyYmKG4ubmFtZT0iIixuLmRvY1N0cmluZz0iIiksZS5ub2RlJiZlLm5vZGUubGVuZ3RoKXtuLm5vZGU9W107Zm9yKHZhciByPTA7cjxlLm5vZGUubGVuZ3RoOysrciluLm5vZGVbcl09Yy5vbm54Lk5vZGVQcm90by50b09iamVjdChlLm5vZGVbcl0sdCk7fWlmKG51bGwhPWUubmFtZSYmZS5oYXNPd25Qcm9wZXJ0eSgibmFtZSIpJiYobi5uYW1lPWUubmFtZSksZS5pbml0aWFsaXplciYmZS5pbml0aWFsaXplci5sZW5ndGgpZm9yKG4uaW5pdGlhbGl6ZXI9W10scj0wO3I8ZS5pbml0aWFsaXplci5sZW5ndGg7KytyKW4uaW5pdGlhbGl6ZXJbcl09Yy5vbm54LlRlbnNvclByb3RvLnRvT2JqZWN0KGUuaW5pdGlhbGl6ZXJbcl0sdCk7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYobi5kb2NTdHJpbmc9ZS5kb2NTdHJpbmcpLGUuaW5wdXQmJmUuaW5wdXQubGVuZ3RoKWZvcihuLmlucHV0PVtdLHI9MDtyPGUuaW5wdXQubGVuZ3RoOysrciluLmlucHV0W3JdPWMub25ueC5WYWx1ZUluZm9Qcm90by50b09iamVjdChlLmlucHV0W3JdLHQpO2lmKGUub3V0cHV0JiZlLm91dHB1dC5sZW5ndGgpZm9yKG4ub3V0cHV0PVtdLHI9MDtyPGUub3V0cHV0Lmxlbmd0aDsrK3Ipbi5vdXRwdXRbcl09Yy5vbm54LlZhbHVlSW5mb1Byb3RvLnRvT2JqZWN0KGUub3V0cHV0W3JdLHQpO2lmKGUudmFsdWVJbmZvJiZlLnZhbHVlSW5mby5sZW5ndGgpZm9yKG4udmFsdWVJbmZvPVtdLHI9MDtyPGUudmFsdWVJbmZvLmxlbmd0aDsrK3Ipbi52YWx1ZUluZm9bcl09Yy5vbm54LlZhbHVlSW5mb1Byb3RvLnRvT2JqZWN0KGUudmFsdWVJbmZvW3JdLHQpO2lmKGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbiYmZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uLmxlbmd0aClmb3Iobi5xdWFudGl6YXRpb25Bbm5vdGF0aW9uPVtdLHI9MDtyPGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGg7KytyKW4ucXVhbnRpemF0aW9uQW5ub3RhdGlvbltyXT1jLm9ubnguVGVuc29yQW5ub3RhdGlvbi50b09iamVjdChlLnF1YW50aXphdGlvbkFubm90YXRpb25bcl0sdCk7aWYoZS5zcGFyc2VJbml0aWFsaXplciYmZS5zcGFyc2VJbml0aWFsaXplci5sZW5ndGgpZm9yKG4uc3BhcnNlSW5pdGlhbGl6ZXI9W10scj0wO3I8ZS5zcGFyc2VJbml0aWFsaXplci5sZW5ndGg7KytyKW4uc3BhcnNlSW5pdGlhbGl6ZXJbcl09Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLnRvT2JqZWN0KGUuc3BhcnNlSW5pdGlhbGl6ZXJbcl0sdCk7cmV0dXJuIG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguR3JhcGhQcm90byJ9LGV9KCksaS5UZW5zb3JQcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5kaW1zPVtdLHRoaXMuZmxvYXREYXRhPVtdLHRoaXMuaW50MzJEYXRhPVtdLHRoaXMuc3RyaW5nRGF0YT1bXSx0aGlzLmludDY0RGF0YT1bXSx0aGlzLmV4dGVybmFsRGF0YT1bXSx0aGlzLmRvdWJsZURhdGE9W10sdGhpcy51aW50NjREYXRhPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmRpbXM9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmRhdGFUeXBlPTAsZS5wcm90b3R5cGUuc2VnbWVudD1udWxsLGUucHJvdG90eXBlLmZsb2F0RGF0YT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuaW50MzJEYXRhPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5zdHJpbmdEYXRhPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5pbnQ2NERhdGE9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLm5hbWU9IiIsZS5wcm90b3R5cGUuZG9jU3RyaW5nPSIiLGUucHJvdG90eXBlLnJhd0RhdGE9bC5uZXdCdWZmZXIoW10pLGUucHJvdG90eXBlLmV4dGVybmFsRGF0YT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuZGF0YUxvY2F0aW9uPTAsZS5wcm90b3R5cGUuZG91YmxlRGF0YT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUudWludDY0RGF0YT1sLmVtcHR5QXJyYXksZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe2lmKHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUuZGltcyYmZS5kaW1zLmxlbmd0aCl7dC51aW50MzIoMTApLmZvcmsoKTtmb3IodmFyIG49MDtuPGUuZGltcy5sZW5ndGg7KytuKXQuaW50NjQoZS5kaW1zW25dKTt0LmxkZWxpbSgpO31pZihudWxsIT1lLmRhdGFUeXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkYXRhVHlwZSIpJiZ0LnVpbnQzMigxNikuaW50MzIoZS5kYXRhVHlwZSksbnVsbCE9ZS5zZWdtZW50JiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJzZWdtZW50IikmJmMub25ueC5UZW5zb3JQcm90by5TZWdtZW50LmVuY29kZShlLnNlZ21lbnQsdC51aW50MzIoMjYpLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS5mbG9hdERhdGEmJmUuZmxvYXREYXRhLmxlbmd0aCl7Zm9yKHQudWludDMyKDM0KS5mb3JrKCksbj0wO248ZS5mbG9hdERhdGEubGVuZ3RoOysrbil0LmZsb2F0KGUuZmxvYXREYXRhW25dKTt0LmxkZWxpbSgpO31pZihudWxsIT1lLmludDMyRGF0YSYmZS5pbnQzMkRhdGEubGVuZ3RoKXtmb3IodC51aW50MzIoNDIpLmZvcmsoKSxuPTA7bjxlLmludDMyRGF0YS5sZW5ndGg7KytuKXQuaW50MzIoZS5pbnQzMkRhdGFbbl0pO3QubGRlbGltKCk7fWlmKG51bGwhPWUuc3RyaW5nRGF0YSYmZS5zdHJpbmdEYXRhLmxlbmd0aClmb3Iobj0wO248ZS5zdHJpbmdEYXRhLmxlbmd0aDsrK24pdC51aW50MzIoNTApLmJ5dGVzKGUuc3RyaW5nRGF0YVtuXSk7aWYobnVsbCE9ZS5pbnQ2NERhdGEmJmUuaW50NjREYXRhLmxlbmd0aCl7Zm9yKHQudWludDMyKDU4KS5mb3JrKCksbj0wO248ZS5pbnQ2NERhdGEubGVuZ3RoOysrbil0LmludDY0KGUuaW50NjREYXRhW25dKTt0LmxkZWxpbSgpO31pZihudWxsIT1lLm5hbWUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm5hbWUiKSYmdC51aW50MzIoNjYpLnN0cmluZyhlLm5hbWUpLG51bGwhPWUucmF3RGF0YSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwicmF3RGF0YSIpJiZ0LnVpbnQzMig3NCkuYnl0ZXMoZS5yYXdEYXRhKSxudWxsIT1lLmRvdWJsZURhdGEmJmUuZG91YmxlRGF0YS5sZW5ndGgpe2Zvcih0LnVpbnQzMig4MikuZm9yaygpLG49MDtuPGUuZG91YmxlRGF0YS5sZW5ndGg7KytuKXQuZG91YmxlKGUuZG91YmxlRGF0YVtuXSk7dC5sZGVsaW0oKTt9aWYobnVsbCE9ZS51aW50NjREYXRhJiZlLnVpbnQ2NERhdGEubGVuZ3RoKXtmb3IodC51aW50MzIoOTApLmZvcmsoKSxuPTA7bjxlLnVpbnQ2NERhdGEubGVuZ3RoOysrbil0LnVpbnQ2NChlLnVpbnQ2NERhdGFbbl0pO3QubGRlbGltKCk7fWlmKG51bGwhPWUuZG9jU3RyaW5nJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb2NTdHJpbmciKSYmdC51aW50MzIoOTgpLnN0cmluZyhlLmRvY1N0cmluZyksbnVsbCE9ZS5leHRlcm5hbERhdGEmJmUuZXh0ZXJuYWxEYXRhLmxlbmd0aClmb3Iobj0wO248ZS5leHRlcm5hbERhdGEubGVuZ3RoOysrbiljLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5lbmNvZGUoZS5leHRlcm5hbERhdGFbbl0sdC51aW50MzIoMTA2KS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiBudWxsIT1lLmRhdGFMb2NhdGlvbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZGF0YUxvY2F0aW9uIikmJnQudWludDMyKDExMikuaW50MzIoZS5kYXRhTG9jYXRpb24pLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UZW5zb3JQcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTppZihyLmRpbXMmJnIuZGltcy5sZW5ndGh8fChyLmRpbXM9W10pLDI9PSg3Jm8pKWZvcih2YXIgaT1lLnVpbnQzMigpK2UucG9zO2UucG9zPGk7KXIuZGltcy5wdXNoKGUuaW50NjQoKSk7ZWxzZSByLmRpbXMucHVzaChlLmludDY0KCkpO2JyZWFrO2Nhc2UgMjpyLmRhdGFUeXBlPWUuaW50MzIoKTticmVhaztjYXNlIDM6ci5zZWdtZW50PWMub25ueC5UZW5zb3JQcm90by5TZWdtZW50LmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgNDppZihyLmZsb2F0RGF0YSYmci5mbG9hdERhdGEubGVuZ3RofHwoci5mbG9hdERhdGE9W10pLDI9PSg3Jm8pKWZvcihpPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8aTspci5mbG9hdERhdGEucHVzaChlLmZsb2F0KCkpO2Vsc2Ugci5mbG9hdERhdGEucHVzaChlLmZsb2F0KCkpO2JyZWFrO2Nhc2UgNTppZihyLmludDMyRGF0YSYmci5pbnQzMkRhdGEubGVuZ3RofHwoci5pbnQzMkRhdGE9W10pLDI9PSg3Jm8pKWZvcihpPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8aTspci5pbnQzMkRhdGEucHVzaChlLmludDMyKCkpO2Vsc2Ugci5pbnQzMkRhdGEucHVzaChlLmludDMyKCkpO2JyZWFrO2Nhc2UgNjpyLnN0cmluZ0RhdGEmJnIuc3RyaW5nRGF0YS5sZW5ndGh8fChyLnN0cmluZ0RhdGE9W10pLHIuc3RyaW5nRGF0YS5wdXNoKGUuYnl0ZXMoKSk7YnJlYWs7Y2FzZSA3OmlmKHIuaW50NjREYXRhJiZyLmludDY0RGF0YS5sZW5ndGh8fChyLmludDY0RGF0YT1bXSksMj09KDcmbykpZm9yKGk9ZS51aW50MzIoKStlLnBvcztlLnBvczxpOylyLmludDY0RGF0YS5wdXNoKGUuaW50NjQoKSk7ZWxzZSByLmludDY0RGF0YS5wdXNoKGUuaW50NjQoKSk7YnJlYWs7Y2FzZSA4OnIubmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMTI6ci5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVhaztjYXNlIDk6ci5yYXdEYXRhPWUuYnl0ZXMoKTticmVhaztjYXNlIDEzOnIuZXh0ZXJuYWxEYXRhJiZyLmV4dGVybmFsRGF0YS5sZW5ndGh8fChyLmV4dGVybmFsRGF0YT1bXSksci5leHRlcm5hbERhdGEucHVzaChjLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAxNDpyLmRhdGFMb2NhdGlvbj1lLmludDMyKCk7YnJlYWs7Y2FzZSAxMDppZihyLmRvdWJsZURhdGEmJnIuZG91YmxlRGF0YS5sZW5ndGh8fChyLmRvdWJsZURhdGE9W10pLDI9PSg3Jm8pKWZvcihpPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8aTspci5kb3VibGVEYXRhLnB1c2goZS5kb3VibGUoKSk7ZWxzZSByLmRvdWJsZURhdGEucHVzaChlLmRvdWJsZSgpKTticmVhaztjYXNlIDExOmlmKHIudWludDY0RGF0YSYmci51aW50NjREYXRhLmxlbmd0aHx8KHIudWludDY0RGF0YT1bXSksMj09KDcmbykpZm9yKGk9ZS51aW50MzIoKStlLnBvcztlLnBvczxpOylyLnVpbnQ2NERhdGEucHVzaChlLnVpbnQ2NCgpKTtlbHNlIHIudWludDY0RGF0YS5wdXNoKGUudWludDY0KCkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO2lmKG51bGwhPWUuZGltcyYmZS5oYXNPd25Qcm9wZXJ0eSgiZGltcyIpKXtpZighQXJyYXkuaXNBcnJheShlLmRpbXMpKXJldHVybiAiZGltczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgdD0wO3Q8ZS5kaW1zLmxlbmd0aDsrK3QpaWYoIShsLmlzSW50ZWdlcihlLmRpbXNbdF0pfHxlLmRpbXNbdF0mJmwuaXNJbnRlZ2VyKGUuZGltc1t0XS5sb3cpJiZsLmlzSW50ZWdlcihlLmRpbXNbdF0uaGlnaCkpKXJldHVybiAiZGltczogaW50ZWdlcnxMb25nW10gZXhwZWN0ZWQifWlmKG51bGwhPWUuZGF0YVR5cGUmJmUuaGFzT3duUHJvcGVydHkoImRhdGFUeXBlIikmJiFsLmlzSW50ZWdlcihlLmRhdGFUeXBlKSlyZXR1cm4gImRhdGFUeXBlOiBpbnRlZ2VyIGV4cGVjdGVkIjtpZihudWxsIT1lLnNlZ21lbnQmJmUuaGFzT3duUHJvcGVydHkoInNlZ21lbnQiKSYmKG49Yy5vbm54LlRlbnNvclByb3RvLlNlZ21lbnQudmVyaWZ5KGUuc2VnbWVudCkpKXJldHVybiAic2VnbWVudC4iK247aWYobnVsbCE9ZS5mbG9hdERhdGEmJmUuaGFzT3duUHJvcGVydHkoImZsb2F0RGF0YSIpKXtpZighQXJyYXkuaXNBcnJheShlLmZsb2F0RGF0YSkpcmV0dXJuICJmbG9hdERhdGE6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5mbG9hdERhdGEubGVuZ3RoOysrdClpZigibnVtYmVyIiE9dHlwZW9mIGUuZmxvYXREYXRhW3RdKXJldHVybiAiZmxvYXREYXRhOiBudW1iZXJbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS5pbnQzMkRhdGEmJmUuaGFzT3duUHJvcGVydHkoImludDMyRGF0YSIpKXtpZighQXJyYXkuaXNBcnJheShlLmludDMyRGF0YSkpcmV0dXJuICJpbnQzMkRhdGE6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5pbnQzMkRhdGEubGVuZ3RoOysrdClpZighbC5pc0ludGVnZXIoZS5pbnQzMkRhdGFbdF0pKXJldHVybiAiaW50MzJEYXRhOiBpbnRlZ2VyW10gZXhwZWN0ZWQifWlmKG51bGwhPWUuc3RyaW5nRGF0YSYmZS5oYXNPd25Qcm9wZXJ0eSgic3RyaW5nRGF0YSIpKXtpZighQXJyYXkuaXNBcnJheShlLnN0cmluZ0RhdGEpKXJldHVybiAic3RyaW5nRGF0YTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLnN0cmluZ0RhdGEubGVuZ3RoOysrdClpZighKGUuc3RyaW5nRGF0YVt0XSYmIm51bWJlciI9PXR5cGVvZiBlLnN0cmluZ0RhdGFbdF0ubGVuZ3RofHxsLmlzU3RyaW5nKGUuc3RyaW5nRGF0YVt0XSkpKXJldHVybiAic3RyaW5nRGF0YTogYnVmZmVyW10gZXhwZWN0ZWQifWlmKG51bGwhPWUuaW50NjREYXRhJiZlLmhhc093blByb3BlcnR5KCJpbnQ2NERhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnQ2NERhdGEpKXJldHVybiAiaW50NjREYXRhOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuaW50NjREYXRhLmxlbmd0aDsrK3QpaWYoIShsLmlzSW50ZWdlcihlLmludDY0RGF0YVt0XSl8fGUuaW50NjREYXRhW3RdJiZsLmlzSW50ZWdlcihlLmludDY0RGF0YVt0XS5sb3cpJiZsLmlzSW50ZWdlcihlLmludDY0RGF0YVt0XS5oaWdoKSkpcmV0dXJuICJpbnQ2NERhdGE6IGludGVnZXJ8TG9uZ1tdIGV4cGVjdGVkIn1pZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmIWwuaXNTdHJpbmcoZS5uYW1lKSlyZXR1cm4gIm5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhbC5pc1N0cmluZyhlLmRvY1N0cmluZykpcmV0dXJuICJkb2NTdHJpbmc6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5yYXdEYXRhJiZlLmhhc093blByb3BlcnR5KCJyYXdEYXRhIikmJiEoZS5yYXdEYXRhJiYibnVtYmVyIj09dHlwZW9mIGUucmF3RGF0YS5sZW5ndGh8fGwuaXNTdHJpbmcoZS5yYXdEYXRhKSkpcmV0dXJuICJyYXdEYXRhOiBidWZmZXIgZXhwZWN0ZWQiO2lmKG51bGwhPWUuZXh0ZXJuYWxEYXRhJiZlLmhhc093blByb3BlcnR5KCJleHRlcm5hbERhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5leHRlcm5hbERhdGEpKXJldHVybiAiZXh0ZXJuYWxEYXRhOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuZXh0ZXJuYWxEYXRhLmxlbmd0aDsrK3Qpe3ZhciBuO2lmKG49Yy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udmVyaWZ5KGUuZXh0ZXJuYWxEYXRhW3RdKSlyZXR1cm4gImV4dGVybmFsRGF0YS4iK259fWlmKG51bGwhPWUuZGF0YUxvY2F0aW9uJiZlLmhhc093blByb3BlcnR5KCJkYXRhTG9jYXRpb24iKSlzd2l0Y2goZS5kYXRhTG9jYXRpb24pe2RlZmF1bHQ6cmV0dXJuICJkYXRhTG9jYXRpb246IGVudW0gdmFsdWUgZXhwZWN0ZWQiO2Nhc2UgMDpjYXNlIDE6fWlmKG51bGwhPWUuZG91YmxlRGF0YSYmZS5oYXNPd25Qcm9wZXJ0eSgiZG91YmxlRGF0YSIpKXtpZighQXJyYXkuaXNBcnJheShlLmRvdWJsZURhdGEpKXJldHVybiAiZG91YmxlRGF0YTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmRvdWJsZURhdGEubGVuZ3RoOysrdClpZigibnVtYmVyIiE9dHlwZW9mIGUuZG91YmxlRGF0YVt0XSlyZXR1cm4gImRvdWJsZURhdGE6IG51bWJlcltdIGV4cGVjdGVkIn1pZihudWxsIT1lLnVpbnQ2NERhdGEmJmUuaGFzT3duUHJvcGVydHkoInVpbnQ2NERhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS51aW50NjREYXRhKSlyZXR1cm4gInVpbnQ2NERhdGE6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS51aW50NjREYXRhLmxlbmd0aDsrK3QpaWYoIShsLmlzSW50ZWdlcihlLnVpbnQ2NERhdGFbdF0pfHxlLnVpbnQ2NERhdGFbdF0mJmwuaXNJbnRlZ2VyKGUudWludDY0RGF0YVt0XS5sb3cpJiZsLmlzSW50ZWdlcihlLnVpbnQ2NERhdGFbdF0uaGlnaCkpKXJldHVybiAidWludDY0RGF0YTogaW50ZWdlcnxMb25nW10gZXhwZWN0ZWQifXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UZW5zb3JQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlRlbnNvclByb3RvO2lmKGUuZGltcyl7aWYoIUFycmF5LmlzQXJyYXkoZS5kaW1zKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLmRpbXM6IGFycmF5IGV4cGVjdGVkIik7dC5kaW1zPVtdO2Zvcih2YXIgbj0wO248ZS5kaW1zLmxlbmd0aDsrK24pbC5Mb25nPyh0LmRpbXNbbl09bC5Mb25nLmZyb21WYWx1ZShlLmRpbXNbbl0pKS51bnNpZ25lZD0hMToic3RyaW5nIj09dHlwZW9mIGUuZGltc1tuXT90LmRpbXNbbl09cGFyc2VJbnQoZS5kaW1zW25dLDEwKToibnVtYmVyIj09dHlwZW9mIGUuZGltc1tuXT90LmRpbXNbbl09ZS5kaW1zW25dOiJvYmplY3QiPT10eXBlb2YgZS5kaW1zW25dJiYodC5kaW1zW25dPW5ldyBsLkxvbmdCaXRzKGUuZGltc1tuXS5sb3c+Pj4wLGUuZGltc1tuXS5oaWdoPj4+MCkudG9OdW1iZXIoKSk7fWlmKG51bGwhPWUuZGF0YVR5cGUmJih0LmRhdGFUeXBlPTB8ZS5kYXRhVHlwZSksbnVsbCE9ZS5zZWdtZW50KXtpZigib2JqZWN0IiE9dHlwZW9mIGUuc2VnbWVudCl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLnNlZ21lbnQ6IG9iamVjdCBleHBlY3RlZCIpO3Quc2VnbWVudD1jLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudC5mcm9tT2JqZWN0KGUuc2VnbWVudCk7fWlmKGUuZmxvYXREYXRhKXtpZighQXJyYXkuaXNBcnJheShlLmZsb2F0RGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5mbG9hdERhdGE6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuZmxvYXREYXRhPVtdLG49MDtuPGUuZmxvYXREYXRhLmxlbmd0aDsrK24pdC5mbG9hdERhdGFbbl09TnVtYmVyKGUuZmxvYXREYXRhW25dKTt9aWYoZS5pbnQzMkRhdGEpe2lmKCFBcnJheS5pc0FycmF5KGUuaW50MzJEYXRhKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLmludDMyRGF0YTogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5pbnQzMkRhdGE9W10sbj0wO248ZS5pbnQzMkRhdGEubGVuZ3RoOysrbil0LmludDMyRGF0YVtuXT0wfGUuaW50MzJEYXRhW25dO31pZihlLnN0cmluZ0RhdGEpe2lmKCFBcnJheS5pc0FycmF5KGUuc3RyaW5nRGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5zdHJpbmdEYXRhOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LnN0cmluZ0RhdGE9W10sbj0wO248ZS5zdHJpbmdEYXRhLmxlbmd0aDsrK24pInN0cmluZyI9PXR5cGVvZiBlLnN0cmluZ0RhdGFbbl0/bC5iYXNlNjQuZGVjb2RlKGUuc3RyaW5nRGF0YVtuXSx0LnN0cmluZ0RhdGFbbl09bC5uZXdCdWZmZXIobC5iYXNlNjQubGVuZ3RoKGUuc3RyaW5nRGF0YVtuXSkpLDApOmUuc3RyaW5nRGF0YVtuXS5sZW5ndGg+PTAmJih0LnN0cmluZ0RhdGFbbl09ZS5zdHJpbmdEYXRhW25dKTt9aWYoZS5pbnQ2NERhdGEpe2lmKCFBcnJheS5pc0FycmF5KGUuaW50NjREYXRhKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLmludDY0RGF0YTogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5pbnQ2NERhdGE9W10sbj0wO248ZS5pbnQ2NERhdGEubGVuZ3RoOysrbilsLkxvbmc/KHQuaW50NjREYXRhW25dPWwuTG9uZy5mcm9tVmFsdWUoZS5pbnQ2NERhdGFbbl0pKS51bnNpZ25lZD0hMToic3RyaW5nIj09dHlwZW9mIGUuaW50NjREYXRhW25dP3QuaW50NjREYXRhW25dPXBhcnNlSW50KGUuaW50NjREYXRhW25dLDEwKToibnVtYmVyIj09dHlwZW9mIGUuaW50NjREYXRhW25dP3QuaW50NjREYXRhW25dPWUuaW50NjREYXRhW25dOiJvYmplY3QiPT10eXBlb2YgZS5pbnQ2NERhdGFbbl0mJih0LmludDY0RGF0YVtuXT1uZXcgbC5Mb25nQml0cyhlLmludDY0RGF0YVtuXS5sb3c+Pj4wLGUuaW50NjREYXRhW25dLmhpZ2g+Pj4wKS50b051bWJlcigpKTt9aWYobnVsbCE9ZS5uYW1lJiYodC5uYW1lPVN0cmluZyhlLm5hbWUpKSxudWxsIT1lLmRvY1N0cmluZyYmKHQuZG9jU3RyaW5nPVN0cmluZyhlLmRvY1N0cmluZykpLG51bGwhPWUucmF3RGF0YSYmKCJzdHJpbmciPT10eXBlb2YgZS5yYXdEYXRhP2wuYmFzZTY0LmRlY29kZShlLnJhd0RhdGEsdC5yYXdEYXRhPWwubmV3QnVmZmVyKGwuYmFzZTY0Lmxlbmd0aChlLnJhd0RhdGEpKSwwKTplLnJhd0RhdGEubGVuZ3RoPj0wJiYodC5yYXdEYXRhPWUucmF3RGF0YSkpLGUuZXh0ZXJuYWxEYXRhKXtpZighQXJyYXkuaXNBcnJheShlLmV4dGVybmFsRGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5leHRlcm5hbERhdGE6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuZXh0ZXJuYWxEYXRhPVtdLG49MDtuPGUuZXh0ZXJuYWxEYXRhLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5leHRlcm5hbERhdGFbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5leHRlcm5hbERhdGE6IG9iamVjdCBleHBlY3RlZCIpO3QuZXh0ZXJuYWxEYXRhW25dPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmZyb21PYmplY3QoZS5leHRlcm5hbERhdGFbbl0pO319c3dpdGNoKGUuZGF0YUxvY2F0aW9uKXtkZWZhdWx0OmlmKCJudW1iZXIiPT10eXBlb2YgZS5kYXRhTG9jYXRpb24pe3QuZGF0YUxvY2F0aW9uPWUuZGF0YUxvY2F0aW9uO2JyZWFrfWJyZWFrO2Nhc2UiREVGQVVMVCI6Y2FzZSAwOnQuZGF0YUxvY2F0aW9uPTA7YnJlYWs7Y2FzZSJFWFRFUk5BTCI6Y2FzZSAxOnQuZGF0YUxvY2F0aW9uPTE7fWlmKGUuZG91YmxlRGF0YSl7aWYoIUFycmF5LmlzQXJyYXkoZS5kb3VibGVEYXRhKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLmRvdWJsZURhdGE6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuZG91YmxlRGF0YT1bXSxuPTA7bjxlLmRvdWJsZURhdGEubGVuZ3RoOysrbil0LmRvdWJsZURhdGFbbl09TnVtYmVyKGUuZG91YmxlRGF0YVtuXSk7fWlmKGUudWludDY0RGF0YSl7aWYoIUFycmF5LmlzQXJyYXkoZS51aW50NjREYXRhKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLnVpbnQ2NERhdGE6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQudWludDY0RGF0YT1bXSxuPTA7bjxlLnVpbnQ2NERhdGEubGVuZ3RoOysrbilsLkxvbmc/KHQudWludDY0RGF0YVtuXT1sLkxvbmcuZnJvbVZhbHVlKGUudWludDY0RGF0YVtuXSkpLnVuc2lnbmVkPSEwOiJzdHJpbmciPT10eXBlb2YgZS51aW50NjREYXRhW25dP3QudWludDY0RGF0YVtuXT1wYXJzZUludChlLnVpbnQ2NERhdGFbbl0sMTApOiJudW1iZXIiPT10eXBlb2YgZS51aW50NjREYXRhW25dP3QudWludDY0RGF0YVtuXT1lLnVpbnQ2NERhdGFbbl06Im9iamVjdCI9PXR5cGVvZiBlLnVpbnQ2NERhdGFbbl0mJih0LnVpbnQ2NERhdGFbbl09bmV3IGwuTG9uZ0JpdHMoZS51aW50NjREYXRhW25dLmxvdz4+PjAsZS51aW50NjREYXRhW25dLmhpZ2g+Pj4wKS50b051bWJlcighMCkpO31yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5kaW1zPVtdLG4uZmxvYXREYXRhPVtdLG4uaW50MzJEYXRhPVtdLG4uc3RyaW5nRGF0YT1bXSxuLmludDY0RGF0YT1bXSxuLmRvdWJsZURhdGE9W10sbi51aW50NjREYXRhPVtdLG4uZXh0ZXJuYWxEYXRhPVtdKSx0LmRlZmF1bHRzJiYobi5kYXRhVHlwZT0wLG4uc2VnbWVudD1udWxsLG4ubmFtZT0iIix0LmJ5dGVzPT09U3RyaW5nP24ucmF3RGF0YT0iIjoobi5yYXdEYXRhPVtdLHQuYnl0ZXMhPT1BcnJheSYmKG4ucmF3RGF0YT1sLm5ld0J1ZmZlcihuLnJhd0RhdGEpKSksbi5kb2NTdHJpbmc9IiIsbi5kYXRhTG9jYXRpb249dC5lbnVtcz09PVN0cmluZz8iREVGQVVMVCI6MCksZS5kaW1zJiZlLmRpbXMubGVuZ3RoKXtuLmRpbXM9W107Zm9yKHZhciByPTA7cjxlLmRpbXMubGVuZ3RoOysrcikibnVtYmVyIj09dHlwZW9mIGUuZGltc1tyXT9uLmRpbXNbcl09dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5kaW1zW3JdKTplLmRpbXNbcl06bi5kaW1zW3JdPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuZGltc1tyXSk6dC5sb25ncz09PU51bWJlcj9uZXcgbC5Mb25nQml0cyhlLmRpbXNbcl0ubG93Pj4+MCxlLmRpbXNbcl0uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5kaW1zW3JdO31pZihudWxsIT1lLmRhdGFUeXBlJiZlLmhhc093blByb3BlcnR5KCJkYXRhVHlwZSIpJiYobi5kYXRhVHlwZT1lLmRhdGFUeXBlKSxudWxsIT1lLnNlZ21lbnQmJmUuaGFzT3duUHJvcGVydHkoInNlZ21lbnQiKSYmKG4uc2VnbWVudD1jLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudC50b09iamVjdChlLnNlZ21lbnQsdCkpLGUuZmxvYXREYXRhJiZlLmZsb2F0RGF0YS5sZW5ndGgpZm9yKG4uZmxvYXREYXRhPVtdLHI9MDtyPGUuZmxvYXREYXRhLmxlbmd0aDsrK3Ipbi5mbG9hdERhdGFbcl09dC5qc29uJiYhaXNGaW5pdGUoZS5mbG9hdERhdGFbcl0pP1N0cmluZyhlLmZsb2F0RGF0YVtyXSk6ZS5mbG9hdERhdGFbcl07aWYoZS5pbnQzMkRhdGEmJmUuaW50MzJEYXRhLmxlbmd0aClmb3Iobi5pbnQzMkRhdGE9W10scj0wO3I8ZS5pbnQzMkRhdGEubGVuZ3RoOysrciluLmludDMyRGF0YVtyXT1lLmludDMyRGF0YVtyXTtpZihlLnN0cmluZ0RhdGEmJmUuc3RyaW5nRGF0YS5sZW5ndGgpZm9yKG4uc3RyaW5nRGF0YT1bXSxyPTA7cjxlLnN0cmluZ0RhdGEubGVuZ3RoOysrciluLnN0cmluZ0RhdGFbcl09dC5ieXRlcz09PVN0cmluZz9sLmJhc2U2NC5lbmNvZGUoZS5zdHJpbmdEYXRhW3JdLDAsZS5zdHJpbmdEYXRhW3JdLmxlbmd0aCk6dC5ieXRlcz09PUFycmF5P0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuc3RyaW5nRGF0YVtyXSk6ZS5zdHJpbmdEYXRhW3JdO2lmKGUuaW50NjREYXRhJiZlLmludDY0RGF0YS5sZW5ndGgpZm9yKG4uaW50NjREYXRhPVtdLHI9MDtyPGUuaW50NjREYXRhLmxlbmd0aDsrK3IpIm51bWJlciI9PXR5cGVvZiBlLmludDY0RGF0YVtyXT9uLmludDY0RGF0YVtyXT10LmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLmludDY0RGF0YVtyXSk6ZS5pbnQ2NERhdGFbcl06bi5pbnQ2NERhdGFbcl09dC5sb25ncz09PVN0cmluZz9sLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5pbnQ2NERhdGFbcl0pOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5pbnQ2NERhdGFbcl0ubG93Pj4+MCxlLmludDY0RGF0YVtyXS5oaWdoPj4+MCkudG9OdW1iZXIoKTplLmludDY0RGF0YVtyXTtpZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmKG4ubmFtZT1lLm5hbWUpLG51bGwhPWUucmF3RGF0YSYmZS5oYXNPd25Qcm9wZXJ0eSgicmF3RGF0YSIpJiYobi5yYXdEYXRhPXQuYnl0ZXM9PT1TdHJpbmc/bC5iYXNlNjQuZW5jb2RlKGUucmF3RGF0YSwwLGUucmF3RGF0YS5sZW5ndGgpOnQuYnl0ZXM9PT1BcnJheT9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLnJhd0RhdGEpOmUucmF3RGF0YSksZS5kb3VibGVEYXRhJiZlLmRvdWJsZURhdGEubGVuZ3RoKWZvcihuLmRvdWJsZURhdGE9W10scj0wO3I8ZS5kb3VibGVEYXRhLmxlbmd0aDsrK3Ipbi5kb3VibGVEYXRhW3JdPXQuanNvbiYmIWlzRmluaXRlKGUuZG91YmxlRGF0YVtyXSk/U3RyaW5nKGUuZG91YmxlRGF0YVtyXSk6ZS5kb3VibGVEYXRhW3JdO2lmKGUudWludDY0RGF0YSYmZS51aW50NjREYXRhLmxlbmd0aClmb3Iobi51aW50NjREYXRhPVtdLHI9MDtyPGUudWludDY0RGF0YS5sZW5ndGg7KytyKSJudW1iZXIiPT10eXBlb2YgZS51aW50NjREYXRhW3JdP24udWludDY0RGF0YVtyXT10LmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLnVpbnQ2NERhdGFbcl0pOmUudWludDY0RGF0YVtyXTpuLnVpbnQ2NERhdGFbcl09dC5sb25ncz09PVN0cmluZz9sLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS51aW50NjREYXRhW3JdKTp0LmxvbmdzPT09TnVtYmVyP25ldyBsLkxvbmdCaXRzKGUudWludDY0RGF0YVtyXS5sb3c+Pj4wLGUudWludDY0RGF0YVtyXS5oaWdoPj4+MCkudG9OdW1iZXIoITApOmUudWludDY0RGF0YVtyXTtpZihudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJihuLmRvY1N0cmluZz1lLmRvY1N0cmluZyksZS5leHRlcm5hbERhdGEmJmUuZXh0ZXJuYWxEYXRhLmxlbmd0aClmb3Iobi5leHRlcm5hbERhdGE9W10scj0wO3I8ZS5leHRlcm5hbERhdGEubGVuZ3RoOysrciluLmV4dGVybmFsRGF0YVtyXT1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by50b09iamVjdChlLmV4dGVybmFsRGF0YVtyXSx0KTtyZXR1cm4gbnVsbCE9ZS5kYXRhTG9jYXRpb24mJmUuaGFzT3duUHJvcGVydHkoImRhdGFMb2NhdGlvbiIpJiYobi5kYXRhTG9jYXRpb249dC5lbnVtcz09PVN0cmluZz92b2lkIDA9PT1jLm9ubnguVGVuc29yUHJvdG8uRGF0YUxvY2F0aW9uW2UuZGF0YUxvY2F0aW9uXT9lLmRhdGFMb2NhdGlvbjpjLm9ubnguVGVuc29yUHJvdG8uRGF0YUxvY2F0aW9uW2UuZGF0YUxvY2F0aW9uXTplLmRhdGFMb2NhdGlvbiksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UZW5zb3JQcm90byJ9LGUuRGF0YVR5cGU9ZnVuY3Rpb24oKXt2YXIgZT17fSx0PU9iamVjdC5jcmVhdGUoZSk7cmV0dXJuIHRbZVswXT0iVU5ERUZJTkVEIl09MCx0W2VbMV09IkZMT0FUIl09MSx0W2VbMl09IlVJTlQ4Il09Mix0W2VbM109IklOVDgiXT0zLHRbZVs0XT0iVUlOVDE2Il09NCx0W2VbNV09IklOVDE2Il09NSx0W2VbNl09IklOVDMyIl09Nix0W2VbN109IklOVDY0Il09Nyx0W2VbOF09IlNUUklORyJdPTgsdFtlWzldPSJCT09MIl09OSx0W2VbMTBdPSJGTE9BVDE2Il09MTAsdFtlWzExXT0iRE9VQkxFIl09MTEsdFtlWzEyXT0iVUlOVDMyIl09MTIsdFtlWzEzXT0iVUlOVDY0Il09MTMsdFtlWzE0XT0iQ09NUExFWDY0Il09MTQsdFtlWzE1XT0iQ09NUExFWDEyOCJdPTE1LHRbZVsxNl09IkJGTE9BVDE2Il09MTYsdFtlWzE3XT0iRkxPQVQ4RTRNM0ZOIl09MTcsdFtlWzE4XT0iRkxPQVQ4RTRNM0ZOVVoiXT0xOCx0W2VbMTldPSJGTE9BVDhFNU0yIl09MTksdFtlWzIwXT0iRkxPQVQ4RTVNMkZOVVoiXT0yMCx0fSgpLGUuU2VnbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUuYmVnaW49bC5Mb25nP2wuTG9uZy5mcm9tQml0cygwLDAsITEpOjAsZS5wcm90b3R5cGUuZW5kPWwuTG9uZz9sLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5iZWdpbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiYmVnaW4iKSYmdC51aW50MzIoOCkuaW50NjQoZS5iZWdpbiksbnVsbCE9ZS5lbmQmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImVuZCIpJiZ0LnVpbnQzMigxNikuaW50NjQoZS5lbmQpLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UZW5zb3JQcm90by5TZWdtZW50O2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIuYmVnaW49ZS5pbnQ2NCgpO2JyZWFrO2Nhc2UgMjpyLmVuZD1lLmludDY0KCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7cmV0dXJuICJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWU/Im9iamVjdCBleHBlY3RlZCI6bnVsbCE9ZS5iZWdpbiYmZS5oYXNPd25Qcm9wZXJ0eSgiYmVnaW4iKSYmIShsLmlzSW50ZWdlcihlLmJlZ2luKXx8ZS5iZWdpbiYmbC5pc0ludGVnZXIoZS5iZWdpbi5sb3cpJiZsLmlzSW50ZWdlcihlLmJlZ2luLmhpZ2gpKT8iYmVnaW46IGludGVnZXJ8TG9uZyBleHBlY3RlZCI6bnVsbCE9ZS5lbmQmJmUuaGFzT3duUHJvcGVydHkoImVuZCIpJiYhKGwuaXNJbnRlZ2VyKGUuZW5kKXx8ZS5lbmQmJmwuaXNJbnRlZ2VyKGUuZW5kLmxvdykmJmwuaXNJbnRlZ2VyKGUuZW5kLmhpZ2gpKT8iZW5kOiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWQiOm51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlRlbnNvclByb3RvLlNlZ21lbnQpcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UZW5zb3JQcm90by5TZWdtZW50O3JldHVybiBudWxsIT1lLmJlZ2luJiYobC5Mb25nPyh0LmJlZ2luPWwuTG9uZy5mcm9tVmFsdWUoZS5iZWdpbikpLnVuc2lnbmVkPSExOiJzdHJpbmciPT10eXBlb2YgZS5iZWdpbj90LmJlZ2luPXBhcnNlSW50KGUuYmVnaW4sMTApOiJudW1iZXIiPT10eXBlb2YgZS5iZWdpbj90LmJlZ2luPWUuYmVnaW46Im9iamVjdCI9PXR5cGVvZiBlLmJlZ2luJiYodC5iZWdpbj1uZXcgbC5Mb25nQml0cyhlLmJlZ2luLmxvdz4+PjAsZS5iZWdpbi5oaWdoPj4+MCkudG9OdW1iZXIoKSkpLG51bGwhPWUuZW5kJiYobC5Mb25nPyh0LmVuZD1sLkxvbmcuZnJvbVZhbHVlKGUuZW5kKSkudW5zaWduZWQ9ITE6InN0cmluZyI9PXR5cGVvZiBlLmVuZD90LmVuZD1wYXJzZUludChlLmVuZCwxMCk6Im51bWJlciI9PXR5cGVvZiBlLmVuZD90LmVuZD1lLmVuZDoib2JqZWN0Ij09dHlwZW9mIGUuZW5kJiYodC5lbmQ9bmV3IGwuTG9uZ0JpdHMoZS5lbmQubG93Pj4+MCxlLmVuZC5oaWdoPj4+MCkudG9OdW1iZXIoKSkpLHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYodC5kZWZhdWx0cyl7aWYobC5Mb25nKXt2YXIgcj1uZXcgbC5Mb25nKDAsMCwhMSk7bi5iZWdpbj10LmxvbmdzPT09U3RyaW5nP3IudG9TdHJpbmcoKTp0LmxvbmdzPT09TnVtYmVyP3IudG9OdW1iZXIoKTpyO31lbHNlIG4uYmVnaW49dC5sb25ncz09PVN0cmluZz8iMCI6MDtsLkxvbmc/KHI9bmV3IGwuTG9uZygwLDAsITEpLG4uZW5kPXQubG9uZ3M9PT1TdHJpbmc/ci50b1N0cmluZygpOnQubG9uZ3M9PT1OdW1iZXI/ci50b051bWJlcigpOnIpOm4uZW5kPXQubG9uZ3M9PT1TdHJpbmc/IjAiOjA7fXJldHVybiBudWxsIT1lLmJlZ2luJiZlLmhhc093blByb3BlcnR5KCJiZWdpbiIpJiYoIm51bWJlciI9PXR5cGVvZiBlLmJlZ2luP24uYmVnaW49dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5iZWdpbik6ZS5iZWdpbjpuLmJlZ2luPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuYmVnaW4pOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5iZWdpbi5sb3c+Pj4wLGUuYmVnaW4uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5iZWdpbiksbnVsbCE9ZS5lbmQmJmUuaGFzT3duUHJvcGVydHkoImVuZCIpJiYoIm51bWJlciI9PXR5cGVvZiBlLmVuZD9uLmVuZD10LmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLmVuZCk6ZS5lbmQ6bi5lbmQ9dC5sb25ncz09PVN0cmluZz9sLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5lbmQpOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5lbmQubG93Pj4+MCxlLmVuZC5oaWdoPj4+MCkudG9OdW1iZXIoKTplLmVuZCksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UZW5zb3JQcm90by5TZWdtZW50In0sZX0oKSxlLkRhdGFMb2NhdGlvbj1mdW5jdGlvbigpe3ZhciBlPXt9LHQ9T2JqZWN0LmNyZWF0ZShlKTtyZXR1cm4gdFtlWzBdPSJERUZBVUxUIl09MCx0W2VbMV09IkVYVEVSTkFMIl09MSx0fSgpLGV9KCksaS5TcGFyc2VUZW5zb3JQcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5kaW1zPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLnZhbHVlcz1udWxsLGUucHJvdG90eXBlLmluZGljZXM9bnVsbCxlLnByb3RvdHlwZS5kaW1zPWwuZW1wdHlBcnJheSxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7aWYodHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS52YWx1ZXMmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInZhbHVlcyIpJiZjLm9ubnguVGVuc29yUHJvdG8uZW5jb2RlKGUudmFsdWVzLHQudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuaW5kaWNlcyYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiaW5kaWNlcyIpJiZjLm9ubnguVGVuc29yUHJvdG8uZW5jb2RlKGUuaW5kaWNlcyx0LnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLmRpbXMmJmUuZGltcy5sZW5ndGgpe3QudWludDMyKDI2KS5mb3JrKCk7Zm9yKHZhciBuPTA7bjxlLmRpbXMubGVuZ3RoOysrbil0LmludDY0KGUuZGltc1tuXSk7dC5sZGVsaW0oKTt9cmV0dXJuIHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5TcGFyc2VUZW5zb3JQcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLnZhbHVlcz1jLm9ubnguVGVuc29yUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSAyOnIuaW5kaWNlcz1jLm9ubnguVGVuc29yUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSAzOmlmKHIuZGltcyYmci5kaW1zLmxlbmd0aHx8KHIuZGltcz1bXSksMj09KDcmbykpZm9yKHZhciBpPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8aTspci5kaW1zLnB1c2goZS5pbnQ2NCgpKTtlbHNlIHIuZGltcy5wdXNoKGUuaW50NjQoKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7dmFyIHQ7aWYobnVsbCE9ZS52YWx1ZXMmJmUuaGFzT3duUHJvcGVydHkoInZhbHVlcyIpJiYodD1jLm9ubnguVGVuc29yUHJvdG8udmVyaWZ5KGUudmFsdWVzKSkpcmV0dXJuICJ2YWx1ZXMuIit0O2lmKG51bGwhPWUuaW5kaWNlcyYmZS5oYXNPd25Qcm9wZXJ0eSgiaW5kaWNlcyIpJiYodD1jLm9ubnguVGVuc29yUHJvdG8udmVyaWZ5KGUuaW5kaWNlcykpKXJldHVybiAiaW5kaWNlcy4iK3Q7aWYobnVsbCE9ZS5kaW1zJiZlLmhhc093blByb3BlcnR5KCJkaW1zIikpe2lmKCFBcnJheS5pc0FycmF5KGUuZGltcykpcmV0dXJuICJkaW1zOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciBuPTA7bjxlLmRpbXMubGVuZ3RoOysrbilpZighKGwuaXNJbnRlZ2VyKGUuZGltc1tuXSl8fGUuZGltc1tuXSYmbC5pc0ludGVnZXIoZS5kaW1zW25dLmxvdykmJmwuaXNJbnRlZ2VyKGUuZGltc1tuXS5oaWdoKSkpcmV0dXJuICJkaW1zOiBpbnRlZ2VyfExvbmdbXSBleHBlY3RlZCJ9cmV0dXJuIG51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlNwYXJzZVRlbnNvclByb3RvKXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguU3BhcnNlVGVuc29yUHJvdG87aWYobnVsbCE9ZS52YWx1ZXMpe2lmKCJvYmplY3QiIT10eXBlb2YgZS52YWx1ZXMpdGhyb3cgVHlwZUVycm9yKCIub25ueC5TcGFyc2VUZW5zb3JQcm90by52YWx1ZXM6IG9iamVjdCBleHBlY3RlZCIpO3QudmFsdWVzPWMub25ueC5UZW5zb3JQcm90by5mcm9tT2JqZWN0KGUudmFsdWVzKTt9aWYobnVsbCE9ZS5pbmRpY2VzKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuaW5kaWNlcyl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlNwYXJzZVRlbnNvclByb3RvLmluZGljZXM6IG9iamVjdCBleHBlY3RlZCIpO3QuaW5kaWNlcz1jLm9ubnguVGVuc29yUHJvdG8uZnJvbU9iamVjdChlLmluZGljZXMpO31pZihlLmRpbXMpe2lmKCFBcnJheS5pc0FycmF5KGUuZGltcykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5TcGFyc2VUZW5zb3JQcm90by5kaW1zOiBhcnJheSBleHBlY3RlZCIpO3QuZGltcz1bXTtmb3IodmFyIG49MDtuPGUuZGltcy5sZW5ndGg7KytuKWwuTG9uZz8odC5kaW1zW25dPWwuTG9uZy5mcm9tVmFsdWUoZS5kaW1zW25dKSkudW5zaWduZWQ9ITE6InN0cmluZyI9PXR5cGVvZiBlLmRpbXNbbl0/dC5kaW1zW25dPXBhcnNlSW50KGUuZGltc1tuXSwxMCk6Im51bWJlciI9PXR5cGVvZiBlLmRpbXNbbl0/dC5kaW1zW25dPWUuZGltc1tuXToib2JqZWN0Ij09dHlwZW9mIGUuZGltc1tuXSYmKHQuZGltc1tuXT1uZXcgbC5Mb25nQml0cyhlLmRpbXNbbl0ubG93Pj4+MCxlLmRpbXNbbl0uaGlnaD4+PjApLnRvTnVtYmVyKCkpO31yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5kaW1zPVtdKSx0LmRlZmF1bHRzJiYobi52YWx1ZXM9bnVsbCxuLmluZGljZXM9bnVsbCksbnVsbCE9ZS52YWx1ZXMmJmUuaGFzT3duUHJvcGVydHkoInZhbHVlcyIpJiYobi52YWx1ZXM9Yy5vbm54LlRlbnNvclByb3RvLnRvT2JqZWN0KGUudmFsdWVzLHQpKSxudWxsIT1lLmluZGljZXMmJmUuaGFzT3duUHJvcGVydHkoImluZGljZXMiKSYmKG4uaW5kaWNlcz1jLm9ubnguVGVuc29yUHJvdG8udG9PYmplY3QoZS5pbmRpY2VzLHQpKSxlLmRpbXMmJmUuZGltcy5sZW5ndGgpe24uZGltcz1bXTtmb3IodmFyIHI9MDtyPGUuZGltcy5sZW5ndGg7KytyKSJudW1iZXIiPT10eXBlb2YgZS5kaW1zW3JdP24uZGltc1tyXT10LmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLmRpbXNbcl0pOmUuZGltc1tyXTpuLmRpbXNbcl09dC5sb25ncz09PVN0cmluZz9sLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5kaW1zW3JdKTp0LmxvbmdzPT09TnVtYmVyP25ldyBsLkxvbmdCaXRzKGUuZGltc1tyXS5sb3c+Pj4wLGUuZGltc1tyXS5oaWdoPj4+MCkudG9OdW1iZXIoKTplLmRpbXNbcl07fXJldHVybiBufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlNwYXJzZVRlbnNvclByb3RvIn0sZX0oKSxpLlRlbnNvclNoYXBlUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuZGltPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmRpbT1sLmVtcHR5QXJyYXksZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe2lmKHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUuZGltJiZlLmRpbS5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLmRpbS5sZW5ndGg7KytuKWMub25ueC5UZW5zb3JTaGFwZVByb3RvLkRpbWVuc2lvbi5lbmNvZGUoZS5kaW1bbl0sdC51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UZW5zb3JTaGFwZVByb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO28+Pj4zPT0xPyhyLmRpbSYmci5kaW0ubGVuZ3RofHwoci5kaW09W10pLHIuZGltLnB1c2goYy5vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uLmRlY29kZShlLGUudWludDMyKCkpKSk6ZS5za2lwVHlwZSg3Jm8pO31yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5kaW0mJmUuaGFzT3duUHJvcGVydHkoImRpbSIpKXtpZighQXJyYXkuaXNBcnJheShlLmRpbSkpcmV0dXJuICJkaW06IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHQ9MDt0PGUuZGltLmxlbmd0aDsrK3Qpe3ZhciBuPWMub25ueC5UZW5zb3JTaGFwZVByb3RvLkRpbWVuc2lvbi52ZXJpZnkoZS5kaW1bdF0pO2lmKG4pcmV0dXJuICJkaW0uIitufX1yZXR1cm4gbnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguVGVuc29yU2hhcGVQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlRlbnNvclNoYXBlUHJvdG87aWYoZS5kaW0pe2lmKCFBcnJheS5pc0FycmF5KGUuZGltKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclNoYXBlUHJvdG8uZGltOiBhcnJheSBleHBlY3RlZCIpO3QuZGltPVtdO2Zvcih2YXIgbj0wO248ZS5kaW0ubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmRpbVtuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclNoYXBlUHJvdG8uZGltOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmRpbVtuXT1jLm9ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24uZnJvbU9iamVjdChlLmRpbVtuXSk7fX1yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5kaW09W10pLGUuZGltJiZlLmRpbS5sZW5ndGgpe24uZGltPVtdO2Zvcih2YXIgcj0wO3I8ZS5kaW0ubGVuZ3RoOysrciluLmRpbVtyXT1jLm9ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24udG9PYmplY3QoZS5kaW1bcl0sdCk7fXJldHVybiBufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlRlbnNvclNoYXBlUHJvdG8ifSxlLkRpbWVuc2lvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO312YXIgdDtyZXR1cm4gZS5wcm90b3R5cGUuZGltVmFsdWU9bnVsbCxlLnByb3RvdHlwZS5kaW1QYXJhbT1udWxsLGUucHJvdG90eXBlLmRlbm90YXRpb249IiIsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ2YWx1ZSIse2dldDpsLm9uZU9mR2V0dGVyKHQ9WyJkaW1WYWx1ZSIsImRpbVBhcmFtIl0pLHNldDpsLm9uZU9mU2V0dGVyKHQpfSksZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmRpbVZhbHVlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkaW1WYWx1ZSIpJiZ0LnVpbnQzMig4KS5pbnQ2NChlLmRpbVZhbHVlKSxudWxsIT1lLmRpbVBhcmFtJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkaW1QYXJhbSIpJiZ0LnVpbnQzMigxOCkuc3RyaW5nKGUuZGltUGFyYW0pLG51bGwhPWUuZGVub3RhdGlvbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZGVub3RhdGlvbiIpJiZ0LnVpbnQzMigyNikuc3RyaW5nKGUuZGVub3RhdGlvbiksdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIuZGltVmFsdWU9ZS5pbnQ2NCgpO2JyZWFrO2Nhc2UgMjpyLmRpbVBhcmFtPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAzOnIuZGVub3RhdGlvbj1lLnN0cmluZygpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO3ZhciB0PXt9O2lmKG51bGwhPWUuZGltVmFsdWUmJmUuaGFzT3duUHJvcGVydHkoImRpbVZhbHVlIikmJih0LnZhbHVlPTEsIShsLmlzSW50ZWdlcihlLmRpbVZhbHVlKXx8ZS5kaW1WYWx1ZSYmbC5pc0ludGVnZXIoZS5kaW1WYWx1ZS5sb3cpJiZsLmlzSW50ZWdlcihlLmRpbVZhbHVlLmhpZ2gpKSkpcmV0dXJuICJkaW1WYWx1ZTogaW50ZWdlcnxMb25nIGV4cGVjdGVkIjtpZihudWxsIT1lLmRpbVBhcmFtJiZlLmhhc093blByb3BlcnR5KCJkaW1QYXJhbSIpKXtpZigxPT09dC52YWx1ZSlyZXR1cm4gInZhbHVlOiBtdWx0aXBsZSB2YWx1ZXMiO2lmKHQudmFsdWU9MSwhbC5pc1N0cmluZyhlLmRpbVBhcmFtKSlyZXR1cm4gImRpbVBhcmFtOiBzdHJpbmcgZXhwZWN0ZWQifXJldHVybiBudWxsIT1lLmRlbm90YXRpb24mJmUuaGFzT3duUHJvcGVydHkoImRlbm90YXRpb24iKSYmIWwuaXNTdHJpbmcoZS5kZW5vdGF0aW9uKT8iZGVub3RhdGlvbjogc3RyaW5nIGV4cGVjdGVkIjpudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UZW5zb3JTaGFwZVByb3RvLkRpbWVuc2lvbilyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uO3JldHVybiBudWxsIT1lLmRpbVZhbHVlJiYobC5Mb25nPyh0LmRpbVZhbHVlPWwuTG9uZy5mcm9tVmFsdWUoZS5kaW1WYWx1ZSkpLnVuc2lnbmVkPSExOiJzdHJpbmciPT10eXBlb2YgZS5kaW1WYWx1ZT90LmRpbVZhbHVlPXBhcnNlSW50KGUuZGltVmFsdWUsMTApOiJudW1iZXIiPT10eXBlb2YgZS5kaW1WYWx1ZT90LmRpbVZhbHVlPWUuZGltVmFsdWU6Im9iamVjdCI9PXR5cGVvZiBlLmRpbVZhbHVlJiYodC5kaW1WYWx1ZT1uZXcgbC5Mb25nQml0cyhlLmRpbVZhbHVlLmxvdz4+PjAsZS5kaW1WYWx1ZS5oaWdoPj4+MCkudG9OdW1iZXIoKSkpLG51bGwhPWUuZGltUGFyYW0mJih0LmRpbVBhcmFtPVN0cmluZyhlLmRpbVBhcmFtKSksbnVsbCE9ZS5kZW5vdGF0aW9uJiYodC5kZW5vdGF0aW9uPVN0cmluZyhlLmRlbm90YXRpb24pKSx0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O3JldHVybiB0LmRlZmF1bHRzJiYobi5kZW5vdGF0aW9uPSIiKSxudWxsIT1lLmRpbVZhbHVlJiZlLmhhc093blByb3BlcnR5KCJkaW1WYWx1ZSIpJiYoIm51bWJlciI9PXR5cGVvZiBlLmRpbVZhbHVlP24uZGltVmFsdWU9dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5kaW1WYWx1ZSk6ZS5kaW1WYWx1ZTpuLmRpbVZhbHVlPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuZGltVmFsdWUpOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5kaW1WYWx1ZS5sb3c+Pj4wLGUuZGltVmFsdWUuaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5kaW1WYWx1ZSx0Lm9uZW9mcyYmKG4udmFsdWU9ImRpbVZhbHVlIikpLG51bGwhPWUuZGltUGFyYW0mJmUuaGFzT3duUHJvcGVydHkoImRpbVBhcmFtIikmJihuLmRpbVBhcmFtPWUuZGltUGFyYW0sdC5vbmVvZnMmJihuLnZhbHVlPSJkaW1QYXJhbSIpKSxudWxsIT1lLmRlbm90YXRpb24mJmUuaGFzT3duUHJvcGVydHkoImRlbm90YXRpb24iKSYmKG4uZGVub3RhdGlvbj1lLmRlbm90YXRpb24pLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24ifSxlfSgpLGV9KCksaS5UeXBlUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9dmFyIHQ7cmV0dXJuIGUucHJvdG90eXBlLnRlbnNvclR5cGU9bnVsbCxlLnByb3RvdHlwZS5zZXF1ZW5jZVR5cGU9bnVsbCxlLnByb3RvdHlwZS5tYXBUeXBlPW51bGwsZS5wcm90b3R5cGUub3B0aW9uYWxUeXBlPW51bGwsZS5wcm90b3R5cGUuc3BhcnNlVGVuc29yVHlwZT1udWxsLGUucHJvdG90eXBlLmRlbm90YXRpb249IiIsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ2YWx1ZSIse2dldDpsLm9uZU9mR2V0dGVyKHQ9WyJ0ZW5zb3JUeXBlIiwic2VxdWVuY2VUeXBlIiwibWFwVHlwZSIsIm9wdGlvbmFsVHlwZSIsInNwYXJzZVRlbnNvclR5cGUiXSksc2V0Omwub25lT2ZTZXR0ZXIodCl9KSxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUudGVuc29yVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidGVuc29yVHlwZSIpJiZjLm9ubnguVHlwZVByb3RvLlRlbnNvci5lbmNvZGUoZS50ZW5zb3JUeXBlLHQudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuc2VxdWVuY2VUeXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJzZXF1ZW5jZVR5cGUiKSYmYy5vbm54LlR5cGVQcm90by5TZXF1ZW5jZS5lbmNvZGUoZS5zZXF1ZW5jZVR5cGUsdC51aW50MzIoMzQpLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS5tYXBUeXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJtYXBUeXBlIikmJmMub25ueC5UeXBlUHJvdG8uTWFwLmVuY29kZShlLm1hcFR5cGUsdC51aW50MzIoNDIpLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS5kZW5vdGF0aW9uJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZW5vdGF0aW9uIikmJnQudWludDMyKDUwKS5zdHJpbmcoZS5kZW5vdGF0aW9uKSxudWxsIT1lLnNwYXJzZVRlbnNvclR5cGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInNwYXJzZVRlbnNvclR5cGUiKSYmYy5vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3IuZW5jb2RlKGUuc3BhcnNlVGVuc29yVHlwZSx0LnVpbnQzMig2NikuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLm9wdGlvbmFsVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwib3B0aW9uYWxUeXBlIikmJmMub25ueC5UeXBlUHJvdG8uT3B0aW9uYWwuZW5jb2RlKGUub3B0aW9uYWxUeXBlLHQudWludDMyKDc0KS5mb3JrKCkpLmxkZWxpbSgpLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UeXBlUHJvdG87ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci50ZW5zb3JUeXBlPWMub25ueC5UeXBlUHJvdG8uVGVuc29yLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgNDpyLnNlcXVlbmNlVHlwZT1jLm9ubnguVHlwZVByb3RvLlNlcXVlbmNlLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgNTpyLm1hcFR5cGU9Yy5vbm54LlR5cGVQcm90by5NYXAuZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSA5OnIub3B0aW9uYWxUeXBlPWMub25ueC5UeXBlUHJvdG8uT3B0aW9uYWwuZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSA4OnIuc3BhcnNlVGVuc29yVHlwZT1jLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvci5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDY6ci5kZW5vdGF0aW9uPWUuc3RyaW5nKCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7dmFyIHQ9e307aWYobnVsbCE9ZS50ZW5zb3JUeXBlJiZlLmhhc093blByb3BlcnR5KCJ0ZW5zb3JUeXBlIikmJih0LnZhbHVlPTEsbj1jLm9ubnguVHlwZVByb3RvLlRlbnNvci52ZXJpZnkoZS50ZW5zb3JUeXBlKSkpcmV0dXJuICJ0ZW5zb3JUeXBlLiIrbjtpZihudWxsIT1lLnNlcXVlbmNlVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgic2VxdWVuY2VUeXBlIikpe2lmKDE9PT10LnZhbHVlKXJldHVybiAidmFsdWU6IG11bHRpcGxlIHZhbHVlcyI7aWYodC52YWx1ZT0xLG49Yy5vbm54LlR5cGVQcm90by5TZXF1ZW5jZS52ZXJpZnkoZS5zZXF1ZW5jZVR5cGUpKXJldHVybiAic2VxdWVuY2VUeXBlLiIrbn1pZihudWxsIT1lLm1hcFR5cGUmJmUuaGFzT3duUHJvcGVydHkoIm1hcFR5cGUiKSl7aWYoMT09PXQudmFsdWUpcmV0dXJuICJ2YWx1ZTogbXVsdGlwbGUgdmFsdWVzIjtpZih0LnZhbHVlPTEsbj1jLm9ubnguVHlwZVByb3RvLk1hcC52ZXJpZnkoZS5tYXBUeXBlKSlyZXR1cm4gIm1hcFR5cGUuIitufWlmKG51bGwhPWUub3B0aW9uYWxUeXBlJiZlLmhhc093blByb3BlcnR5KCJvcHRpb25hbFR5cGUiKSl7aWYoMT09PXQudmFsdWUpcmV0dXJuICJ2YWx1ZTogbXVsdGlwbGUgdmFsdWVzIjtpZih0LnZhbHVlPTEsbj1jLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsLnZlcmlmeShlLm9wdGlvbmFsVHlwZSkpcmV0dXJuICJvcHRpb25hbFR5cGUuIitufWlmKG51bGwhPWUuc3BhcnNlVGVuc29yVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgic3BhcnNlVGVuc29yVHlwZSIpKXtpZigxPT09dC52YWx1ZSlyZXR1cm4gInZhbHVlOiBtdWx0aXBsZSB2YWx1ZXMiO3ZhciBuO2lmKHQudmFsdWU9MSxuPWMub25ueC5UeXBlUHJvdG8uU3BhcnNlVGVuc29yLnZlcmlmeShlLnNwYXJzZVRlbnNvclR5cGUpKXJldHVybiAic3BhcnNlVGVuc29yVHlwZS4iK259cmV0dXJuIG51bGwhPWUuZGVub3RhdGlvbiYmZS5oYXNPd25Qcm9wZXJ0eSgiZGVub3RhdGlvbiIpJiYhbC5pc1N0cmluZyhlLmRlbm90YXRpb24pPyJkZW5vdGF0aW9uOiBzdHJpbmcgZXhwZWN0ZWQiOm51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlR5cGVQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlR5cGVQcm90bztpZihudWxsIT1lLnRlbnNvclR5cGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZS50ZW5zb3JUeXBlKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHlwZVByb3RvLnRlbnNvclR5cGU6IG9iamVjdCBleHBlY3RlZCIpO3QudGVuc29yVHlwZT1jLm9ubnguVHlwZVByb3RvLlRlbnNvci5mcm9tT2JqZWN0KGUudGVuc29yVHlwZSk7fWlmKG51bGwhPWUuc2VxdWVuY2VUeXBlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuc2VxdWVuY2VUeXBlKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHlwZVByb3RvLnNlcXVlbmNlVHlwZTogb2JqZWN0IGV4cGVjdGVkIik7dC5zZXF1ZW5jZVR5cGU9Yy5vbm54LlR5cGVQcm90by5TZXF1ZW5jZS5mcm9tT2JqZWN0KGUuc2VxdWVuY2VUeXBlKTt9aWYobnVsbCE9ZS5tYXBUeXBlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUubWFwVHlwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5tYXBUeXBlOiBvYmplY3QgZXhwZWN0ZWQiKTt0Lm1hcFR5cGU9Yy5vbm54LlR5cGVQcm90by5NYXAuZnJvbU9iamVjdChlLm1hcFR5cGUpO31pZihudWxsIT1lLm9wdGlvbmFsVHlwZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLm9wdGlvbmFsVHlwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5vcHRpb25hbFR5cGU6IG9iamVjdCBleHBlY3RlZCIpO3Qub3B0aW9uYWxUeXBlPWMub25ueC5UeXBlUHJvdG8uT3B0aW9uYWwuZnJvbU9iamVjdChlLm9wdGlvbmFsVHlwZSk7fWlmKG51bGwhPWUuc3BhcnNlVGVuc29yVHlwZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnNwYXJzZVRlbnNvclR5cGUpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UeXBlUHJvdG8uc3BhcnNlVGVuc29yVHlwZTogb2JqZWN0IGV4cGVjdGVkIik7dC5zcGFyc2VUZW5zb3JUeXBlPWMub25ueC5UeXBlUHJvdG8uU3BhcnNlVGVuc29yLmZyb21PYmplY3QoZS5zcGFyc2VUZW5zb3JUeXBlKTt9cmV0dXJuIG51bGwhPWUuZGVub3RhdGlvbiYmKHQuZGVub3RhdGlvbj1TdHJpbmcoZS5kZW5vdGF0aW9uKSksdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtyZXR1cm4gdC5kZWZhdWx0cyYmKG4uZGVub3RhdGlvbj0iIiksbnVsbCE9ZS50ZW5zb3JUeXBlJiZlLmhhc093blByb3BlcnR5KCJ0ZW5zb3JUeXBlIikmJihuLnRlbnNvclR5cGU9Yy5vbm54LlR5cGVQcm90by5UZW5zb3IudG9PYmplY3QoZS50ZW5zb3JUeXBlLHQpLHQub25lb2ZzJiYobi52YWx1ZT0idGVuc29yVHlwZSIpKSxudWxsIT1lLnNlcXVlbmNlVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgic2VxdWVuY2VUeXBlIikmJihuLnNlcXVlbmNlVHlwZT1jLm9ubnguVHlwZVByb3RvLlNlcXVlbmNlLnRvT2JqZWN0KGUuc2VxdWVuY2VUeXBlLHQpLHQub25lb2ZzJiYobi52YWx1ZT0ic2VxdWVuY2VUeXBlIikpLG51bGwhPWUubWFwVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgibWFwVHlwZSIpJiYobi5tYXBUeXBlPWMub25ueC5UeXBlUHJvdG8uTWFwLnRvT2JqZWN0KGUubWFwVHlwZSx0KSx0Lm9uZW9mcyYmKG4udmFsdWU9Im1hcFR5cGUiKSksbnVsbCE9ZS5kZW5vdGF0aW9uJiZlLmhhc093blByb3BlcnR5KCJkZW5vdGF0aW9uIikmJihuLmRlbm90YXRpb249ZS5kZW5vdGF0aW9uKSxudWxsIT1lLnNwYXJzZVRlbnNvclR5cGUmJmUuaGFzT3duUHJvcGVydHkoInNwYXJzZVRlbnNvclR5cGUiKSYmKG4uc3BhcnNlVGVuc29yVHlwZT1jLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvci50b09iamVjdChlLnNwYXJzZVRlbnNvclR5cGUsdCksdC5vbmVvZnMmJihuLnZhbHVlPSJzcGFyc2VUZW5zb3JUeXBlIikpLG51bGwhPWUub3B0aW9uYWxUeXBlJiZlLmhhc093blByb3BlcnR5KCJvcHRpb25hbFR5cGUiKSYmKG4ub3B0aW9uYWxUeXBlPWMub25ueC5UeXBlUHJvdG8uT3B0aW9uYWwudG9PYmplY3QoZS5vcHRpb25hbFR5cGUsdCksdC5vbmVvZnMmJihuLnZhbHVlPSJvcHRpb25hbFR5cGUiKSksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UeXBlUHJvdG8ifSxlLlRlbnNvcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUuZWxlbVR5cGU9MCxlLnByb3RvdHlwZS5zaGFwZT1udWxsLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5lbGVtVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZWxlbVR5cGUiKSYmdC51aW50MzIoOCkuaW50MzIoZS5lbGVtVHlwZSksbnVsbCE9ZS5zaGFwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwic2hhcGUiKSYmYy5vbm54LlRlbnNvclNoYXBlUHJvdG8uZW5jb2RlKGUuc2hhcGUsdC51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCksdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlR5cGVQcm90by5UZW5zb3I7ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci5lbGVtVHlwZT1lLmludDMyKCk7YnJlYWs7Y2FzZSAyOnIuc2hhcGU9Yy5vbm54LlRlbnNvclNoYXBlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5lbGVtVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgiZWxlbVR5cGUiKSYmIWwuaXNJbnRlZ2VyKGUuZWxlbVR5cGUpKXJldHVybiAiZWxlbVR5cGU6IGludGVnZXIgZXhwZWN0ZWQiO2lmKG51bGwhPWUuc2hhcGUmJmUuaGFzT3duUHJvcGVydHkoInNoYXBlIikpe3ZhciB0PWMub25ueC5UZW5zb3JTaGFwZVByb3RvLnZlcmlmeShlLnNoYXBlKTtpZih0KXJldHVybiAic2hhcGUuIit0fXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UeXBlUHJvdG8uVGVuc29yKXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguVHlwZVByb3RvLlRlbnNvcjtpZihudWxsIT1lLmVsZW1UeXBlJiYodC5lbGVtVHlwZT0wfGUuZWxlbVR5cGUpLG51bGwhPWUuc2hhcGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZS5zaGFwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5UZW5zb3Iuc2hhcGU6IG9iamVjdCBleHBlY3RlZCIpO3Quc2hhcGU9Yy5vbm54LlRlbnNvclNoYXBlUHJvdG8uZnJvbU9iamVjdChlLnNoYXBlKTt9cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307cmV0dXJuIHQuZGVmYXVsdHMmJihuLmVsZW1UeXBlPTAsbi5zaGFwZT1udWxsKSxudWxsIT1lLmVsZW1UeXBlJiZlLmhhc093blByb3BlcnR5KCJlbGVtVHlwZSIpJiYobi5lbGVtVHlwZT1lLmVsZW1UeXBlKSxudWxsIT1lLnNoYXBlJiZlLmhhc093blByb3BlcnR5KCJzaGFwZSIpJiYobi5zaGFwZT1jLm9ubnguVGVuc29yU2hhcGVQcm90by50b09iamVjdChlLnNoYXBlLHQpKSxufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlR5cGVQcm90by5UZW5zb3IifSxlfSgpLGUuU2VxdWVuY2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmVsZW1UeXBlPW51bGwsZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmVsZW1UeXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJlbGVtVHlwZSIpJiZjLm9ubnguVHlwZVByb3RvLmVuY29kZShlLmVsZW1UeXBlLHQudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UeXBlUHJvdG8uU2VxdWVuY2U7ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7bz4+PjM9PTE/ci5lbGVtVHlwZT1jLm9ubnguVHlwZVByb3RvLmRlY29kZShlLGUudWludDMyKCkpOmUuc2tpcFR5cGUoNyZvKTt9cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO2lmKG51bGwhPWUuZWxlbVR5cGUmJmUuaGFzT3duUHJvcGVydHkoImVsZW1UeXBlIikpe3ZhciB0PWMub25ueC5UeXBlUHJvdG8udmVyaWZ5KGUuZWxlbVR5cGUpO2lmKHQpcmV0dXJuICJlbGVtVHlwZS4iK3R9cmV0dXJuIG51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlR5cGVQcm90by5TZXF1ZW5jZSlyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlR5cGVQcm90by5TZXF1ZW5jZTtpZihudWxsIT1lLmVsZW1UeXBlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuZWxlbVR5cGUpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UeXBlUHJvdG8uU2VxdWVuY2UuZWxlbVR5cGU6IG9iamVjdCBleHBlY3RlZCIpO3QuZWxlbVR5cGU9Yy5vbm54LlR5cGVQcm90by5mcm9tT2JqZWN0KGUuZWxlbVR5cGUpO31yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtyZXR1cm4gdC5kZWZhdWx0cyYmKG4uZWxlbVR5cGU9bnVsbCksbnVsbCE9ZS5lbGVtVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgiZWxlbVR5cGUiKSYmKG4uZWxlbVR5cGU9Yy5vbm54LlR5cGVQcm90by50b09iamVjdChlLmVsZW1UeXBlLHQpKSxufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlR5cGVQcm90by5TZXF1ZW5jZSJ9LGV9KCksZS5NYXA9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmtleVR5cGU9MCxlLnByb3RvdHlwZS52YWx1ZVR5cGU9bnVsbCxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUua2V5VHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwia2V5VHlwZSIpJiZ0LnVpbnQzMig4KS5pbnQzMihlLmtleVR5cGUpLG51bGwhPWUudmFsdWVUeXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJ2YWx1ZVR5cGUiKSYmYy5vbm54LlR5cGVQcm90by5lbmNvZGUoZS52YWx1ZVR5cGUsdC51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCksdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlR5cGVQcm90by5NYXA7ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci5rZXlUeXBlPWUuaW50MzIoKTticmVhaztjYXNlIDI6ci52YWx1ZVR5cGU9Yy5vbm54LlR5cGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLmtleVR5cGUmJmUuaGFzT3duUHJvcGVydHkoImtleVR5cGUiKSYmIWwuaXNJbnRlZ2VyKGUua2V5VHlwZSkpcmV0dXJuICJrZXlUeXBlOiBpbnRlZ2VyIGV4cGVjdGVkIjtpZihudWxsIT1lLnZhbHVlVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgidmFsdWVUeXBlIikpe3ZhciB0PWMub25ueC5UeXBlUHJvdG8udmVyaWZ5KGUudmFsdWVUeXBlKTtpZih0KXJldHVybiAidmFsdWVUeXBlLiIrdH1yZXR1cm4gbnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguVHlwZVByb3RvLk1hcClyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlR5cGVQcm90by5NYXA7aWYobnVsbCE9ZS5rZXlUeXBlJiYodC5rZXlUeXBlPTB8ZS5rZXlUeXBlKSxudWxsIT1lLnZhbHVlVHlwZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnZhbHVlVHlwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5NYXAudmFsdWVUeXBlOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnZhbHVlVHlwZT1jLm9ubnguVHlwZVByb3RvLmZyb21PYmplY3QoZS52YWx1ZVR5cGUpO31yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtyZXR1cm4gdC5kZWZhdWx0cyYmKG4ua2V5VHlwZT0wLG4udmFsdWVUeXBlPW51bGwpLG51bGwhPWUua2V5VHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgia2V5VHlwZSIpJiYobi5rZXlUeXBlPWUua2V5VHlwZSksbnVsbCE9ZS52YWx1ZVR5cGUmJmUuaGFzT3duUHJvcGVydHkoInZhbHVlVHlwZSIpJiYobi52YWx1ZVR5cGU9Yy5vbm54LlR5cGVQcm90by50b09iamVjdChlLnZhbHVlVHlwZSx0KSksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UeXBlUHJvdG8uTWFwIn0sZX0oKSxlLk9wdGlvbmFsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5lbGVtVHlwZT1udWxsLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5lbGVtVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZWxlbVR5cGUiKSYmYy5vbm54LlR5cGVQcm90by5lbmNvZGUoZS5lbGVtVHlwZSx0LnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO28+Pj4zPT0xP3IuZWxlbVR5cGU9Yy5vbm54LlR5cGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTplLnNraXBUeXBlKDcmbyk7fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLmVsZW1UeXBlJiZlLmhhc093blByb3BlcnR5KCJlbGVtVHlwZSIpKXt2YXIgdD1jLm9ubnguVHlwZVByb3RvLnZlcmlmeShlLmVsZW1UeXBlKTtpZih0KXJldHVybiAiZWxlbVR5cGUuIit0fXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UeXBlUHJvdG8uT3B0aW9uYWwpcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UeXBlUHJvdG8uT3B0aW9uYWw7aWYobnVsbCE9ZS5lbGVtVHlwZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmVsZW1UeXBlKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsLmVsZW1UeXBlOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmVsZW1UeXBlPWMub25ueC5UeXBlUHJvdG8uZnJvbU9iamVjdChlLmVsZW1UeXBlKTt9cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307cmV0dXJuIHQuZGVmYXVsdHMmJihuLmVsZW1UeXBlPW51bGwpLG51bGwhPWUuZWxlbVR5cGUmJmUuaGFzT3duUHJvcGVydHkoImVsZW1UeXBlIikmJihuLmVsZW1UeXBlPWMub25ueC5UeXBlUHJvdG8udG9PYmplY3QoZS5lbGVtVHlwZSx0KSksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UeXBlUHJvdG8uT3B0aW9uYWwifSxlfSgpLGUuU3BhcnNlVGVuc29yPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5lbGVtVHlwZT0wLGUucHJvdG90eXBlLnNoYXBlPW51bGwsZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmVsZW1UeXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJlbGVtVHlwZSIpJiZ0LnVpbnQzMig4KS5pbnQzMihlLmVsZW1UeXBlKSxudWxsIT1lLnNoYXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJzaGFwZSIpJiZjLm9ubnguVGVuc29yU2hhcGVQcm90by5lbmNvZGUoZS5zaGFwZSx0LnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvcjtlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLmVsZW1UeXBlPWUuaW50MzIoKTticmVhaztjYXNlIDI6ci5zaGFwZT1jLm9ubnguVGVuc29yU2hhcGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLmVsZW1UeXBlJiZlLmhhc093blByb3BlcnR5KCJlbGVtVHlwZSIpJiYhbC5pc0ludGVnZXIoZS5lbGVtVHlwZSkpcmV0dXJuICJlbGVtVHlwZTogaW50ZWdlciBleHBlY3RlZCI7aWYobnVsbCE9ZS5zaGFwZSYmZS5oYXNPd25Qcm9wZXJ0eSgic2hhcGUiKSl7dmFyIHQ9Yy5vbm54LlRlbnNvclNoYXBlUHJvdG8udmVyaWZ5KGUuc2hhcGUpO2lmKHQpcmV0dXJuICJzaGFwZS4iK3R9cmV0dXJuIG51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3IpcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UeXBlUHJvdG8uU3BhcnNlVGVuc29yO2lmKG51bGwhPWUuZWxlbVR5cGUmJih0LmVsZW1UeXBlPTB8ZS5lbGVtVHlwZSksbnVsbCE9ZS5zaGFwZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnNoYXBlKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvci5zaGFwZTogb2JqZWN0IGV4cGVjdGVkIik7dC5zaGFwZT1jLm9ubnguVGVuc29yU2hhcGVQcm90by5mcm9tT2JqZWN0KGUuc2hhcGUpO31yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtyZXR1cm4gdC5kZWZhdWx0cyYmKG4uZWxlbVR5cGU9MCxuLnNoYXBlPW51bGwpLG51bGwhPWUuZWxlbVR5cGUmJmUuaGFzT3duUHJvcGVydHkoImVsZW1UeXBlIikmJihuLmVsZW1UeXBlPWUuZWxlbVR5cGUpLG51bGwhPWUuc2hhcGUmJmUuaGFzT3duUHJvcGVydHkoInNoYXBlIikmJihuLnNoYXBlPWMub25ueC5UZW5zb3JTaGFwZVByb3RvLnRvT2JqZWN0KGUuc2hhcGUsdCkpLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvciJ9LGV9KCksZX0oKSxpLk9wZXJhdG9yU2V0SWRQcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUuZG9tYWluPSIiLGUucHJvdG90eXBlLnZlcnNpb249bC5Mb25nP2wuTG9uZy5mcm9tQml0cygwLDAsITEpOjAsZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmRvbWFpbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZG9tYWluIikmJnQudWludDMyKDEwKS5zdHJpbmcoZS5kb21haW4pLG51bGwhPWUudmVyc2lvbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidmVyc2lvbiIpJiZ0LnVpbnQzMigxNikuaW50NjQoZS52ZXJzaW9uKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIuZG9tYWluPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAyOnIudmVyc2lvbj1lLmludDY0KCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7cmV0dXJuICJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWU/Im9iamVjdCBleHBlY3RlZCI6bnVsbCE9ZS5kb21haW4mJmUuaGFzT3duUHJvcGVydHkoImRvbWFpbiIpJiYhbC5pc1N0cmluZyhlLmRvbWFpbik/ImRvbWFpbjogc3RyaW5nIGV4cGVjdGVkIjpudWxsIT1lLnZlcnNpb24mJmUuaGFzT3duUHJvcGVydHkoInZlcnNpb24iKSYmIShsLmlzSW50ZWdlcihlLnZlcnNpb24pfHxlLnZlcnNpb24mJmwuaXNJbnRlZ2VyKGUudmVyc2lvbi5sb3cpJiZsLmlzSW50ZWdlcihlLnZlcnNpb24uaGlnaCkpPyJ2ZXJzaW9uOiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWQiOm51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90bztyZXR1cm4gbnVsbCE9ZS5kb21haW4mJih0LmRvbWFpbj1TdHJpbmcoZS5kb21haW4pKSxudWxsIT1lLnZlcnNpb24mJihsLkxvbmc/KHQudmVyc2lvbj1sLkxvbmcuZnJvbVZhbHVlKGUudmVyc2lvbikpLnVuc2lnbmVkPSExOiJzdHJpbmciPT10eXBlb2YgZS52ZXJzaW9uP3QudmVyc2lvbj1wYXJzZUludChlLnZlcnNpb24sMTApOiJudW1iZXIiPT10eXBlb2YgZS52ZXJzaW9uP3QudmVyc2lvbj1lLnZlcnNpb246Im9iamVjdCI9PXR5cGVvZiBlLnZlcnNpb24mJih0LnZlcnNpb249bmV3IGwuTG9uZ0JpdHMoZS52ZXJzaW9uLmxvdz4+PjAsZS52ZXJzaW9uLmhpZ2g+Pj4wKS50b051bWJlcigpKSksdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZih0LmRlZmF1bHRzKWlmKG4uZG9tYWluPSIiLGwuTG9uZyl7dmFyIHI9bmV3IGwuTG9uZygwLDAsITEpO24udmVyc2lvbj10LmxvbmdzPT09U3RyaW5nP3IudG9TdHJpbmcoKTp0LmxvbmdzPT09TnVtYmVyP3IudG9OdW1iZXIoKTpyO31lbHNlIG4udmVyc2lvbj10LmxvbmdzPT09U3RyaW5nPyIwIjowO3JldHVybiBudWxsIT1lLmRvbWFpbiYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJihuLmRvbWFpbj1lLmRvbWFpbiksbnVsbCE9ZS52ZXJzaW9uJiZlLmhhc093blByb3BlcnR5KCJ2ZXJzaW9uIikmJigibnVtYmVyIj09dHlwZW9mIGUudmVyc2lvbj9uLnZlcnNpb249dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS52ZXJzaW9uKTplLnZlcnNpb246bi52ZXJzaW9uPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUudmVyc2lvbik6dC5sb25ncz09PU51bWJlcj9uZXcgbC5Mb25nQml0cyhlLnZlcnNpb24ubG93Pj4+MCxlLnZlcnNpb24uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS52ZXJzaW9uKSxufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54Lk9wZXJhdG9yU2V0SWRQcm90byJ9LGV9KCksaS5PcGVyYXRvclN0YXR1cz1mdW5jdGlvbigpe3ZhciBlPXt9LHQ9T2JqZWN0LmNyZWF0ZShlKTtyZXR1cm4gdFtlWzBdPSJFWFBFUklNRU5UQUwiXT0wLHRbZVsxXT0iU1RBQkxFIl09MSx0fSgpLGkuRnVuY3Rpb25Qcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5pbnB1dD1bXSx0aGlzLm91dHB1dD1bXSx0aGlzLmF0dHJpYnV0ZT1bXSx0aGlzLmF0dHJpYnV0ZVByb3RvPVtdLHRoaXMubm9kZT1bXSx0aGlzLm9wc2V0SW1wb3J0PVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLm5hbWU9IiIsZS5wcm90b3R5cGUuaW5wdXQ9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLm91dHB1dD1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuYXR0cmlidXRlPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5hdHRyaWJ1dGVQcm90bz1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUubm9kZT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuZG9jU3RyaW5nPSIiLGUucHJvdG90eXBlLm9wc2V0SW1wb3J0PWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5kb21haW49IiIsZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe2lmKHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUubmFtZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwibmFtZSIpJiZ0LnVpbnQzMigxMCkuc3RyaW5nKGUubmFtZSksbnVsbCE9ZS5pbnB1dCYmZS5pbnB1dC5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLmlucHV0Lmxlbmd0aDsrK24pdC51aW50MzIoMzQpLnN0cmluZyhlLmlucHV0W25dKTtpZihudWxsIT1lLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoKWZvcihuPTA7bjxlLm91dHB1dC5sZW5ndGg7KytuKXQudWludDMyKDQyKS5zdHJpbmcoZS5vdXRwdXRbbl0pO2lmKG51bGwhPWUuYXR0cmlidXRlJiZlLmF0dHJpYnV0ZS5sZW5ndGgpZm9yKG49MDtuPGUuYXR0cmlidXRlLmxlbmd0aDsrK24pdC51aW50MzIoNTApLnN0cmluZyhlLmF0dHJpYnV0ZVtuXSk7aWYobnVsbCE9ZS5ub2RlJiZlLm5vZGUubGVuZ3RoKWZvcihuPTA7bjxlLm5vZGUubGVuZ3RoOysrbiljLm9ubnguTm9kZVByb3RvLmVuY29kZShlLm5vZGVbbl0sdC51aW50MzIoNTgpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvY1N0cmluZyIpJiZ0LnVpbnQzMig2Nikuc3RyaW5nKGUuZG9jU3RyaW5nKSxudWxsIT1lLm9wc2V0SW1wb3J0JiZlLm9wc2V0SW1wb3J0Lmxlbmd0aClmb3Iobj0wO248ZS5vcHNldEltcG9ydC5sZW5ndGg7KytuKWMub25ueC5PcGVyYXRvclNldElkUHJvdG8uZW5jb2RlKGUub3BzZXRJbXBvcnRbbl0sdC51aW50MzIoNzQpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS5kb21haW4mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvbWFpbiIpJiZ0LnVpbnQzMig4Mikuc3RyaW5nKGUuZG9tYWluKSxudWxsIT1lLmF0dHJpYnV0ZVByb3RvJiZlLmF0dHJpYnV0ZVByb3RvLmxlbmd0aClmb3Iobj0wO248ZS5hdHRyaWJ1dGVQcm90by5sZW5ndGg7KytuKWMub25ueC5BdHRyaWJ1dGVQcm90by5lbmNvZGUoZS5hdHRyaWJ1dGVQcm90b1tuXSx0LnVpbnQzMig5MCkuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LkZ1bmN0aW9uUHJvdG87ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci5uYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA0OnIuaW5wdXQmJnIuaW5wdXQubGVuZ3RofHwoci5pbnB1dD1bXSksci5pbnB1dC5wdXNoKGUuc3RyaW5nKCkpO2JyZWFrO2Nhc2UgNTpyLm91dHB1dCYmci5vdXRwdXQubGVuZ3RofHwoci5vdXRwdXQ9W10pLHIub3V0cHV0LnB1c2goZS5zdHJpbmcoKSk7YnJlYWs7Y2FzZSA2OnIuYXR0cmlidXRlJiZyLmF0dHJpYnV0ZS5sZW5ndGh8fChyLmF0dHJpYnV0ZT1bXSksci5hdHRyaWJ1dGUucHVzaChlLnN0cmluZygpKTticmVhaztjYXNlIDExOnIuYXR0cmlidXRlUHJvdG8mJnIuYXR0cmlidXRlUHJvdG8ubGVuZ3RofHwoci5hdHRyaWJ1dGVQcm90bz1bXSksci5hdHRyaWJ1dGVQcm90by5wdXNoKGMub25ueC5BdHRyaWJ1dGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSA3OnIubm9kZSYmci5ub2RlLmxlbmd0aHx8KHIubm9kZT1bXSksci5ub2RlLnB1c2goYy5vbm54Lk5vZGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSA4OnIuZG9jU3RyaW5nPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA5OnIub3BzZXRJbXBvcnQmJnIub3BzZXRJbXBvcnQubGVuZ3RofHwoci5vcHNldEltcG9ydD1bXSksci5vcHNldEltcG9ydC5wdXNoKGMub25ueC5PcGVyYXRvclNldElkUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTA6ci5kb21haW49ZS5zdHJpbmcoKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmIWwuaXNTdHJpbmcoZS5uYW1lKSlyZXR1cm4gIm5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5pbnB1dCYmZS5oYXNPd25Qcm9wZXJ0eSgiaW5wdXQiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnB1dCkpcmV0dXJuICJpbnB1dDogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgdD0wO3Q8ZS5pbnB1dC5sZW5ndGg7Kyt0KWlmKCFsLmlzU3RyaW5nKGUuaW5wdXRbdF0pKXJldHVybiAiaW5wdXQ6IHN0cmluZ1tdIGV4cGVjdGVkIn1pZihudWxsIT1lLm91dHB1dCYmZS5oYXNPd25Qcm9wZXJ0eSgib3V0cHV0Iikpe2lmKCFBcnJheS5pc0FycmF5KGUub3V0cHV0KSlyZXR1cm4gIm91dHB1dDogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLm91dHB1dC5sZW5ndGg7Kyt0KWlmKCFsLmlzU3RyaW5nKGUub3V0cHV0W3RdKSlyZXR1cm4gIm91dHB1dDogc3RyaW5nW10gZXhwZWN0ZWQifWlmKG51bGwhPWUuYXR0cmlidXRlJiZlLmhhc093blByb3BlcnR5KCJhdHRyaWJ1dGUiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGUpKXJldHVybiAiYXR0cmlidXRlOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuYXR0cmlidXRlLmxlbmd0aDsrK3QpaWYoIWwuaXNTdHJpbmcoZS5hdHRyaWJ1dGVbdF0pKXJldHVybiAiYXR0cmlidXRlOiBzdHJpbmdbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS5hdHRyaWJ1dGVQcm90byYmZS5oYXNPd25Qcm9wZXJ0eSgiYXR0cmlidXRlUHJvdG8iKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGVQcm90bykpcmV0dXJuICJhdHRyaWJ1dGVQcm90bzogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmF0dHJpYnV0ZVByb3RvLmxlbmd0aDsrK3QpaWYobj1jLm9ubnguQXR0cmlidXRlUHJvdG8udmVyaWZ5KGUuYXR0cmlidXRlUHJvdG9bdF0pKXJldHVybiAiYXR0cmlidXRlUHJvdG8uIitufWlmKG51bGwhPWUubm9kZSYmZS5oYXNPd25Qcm9wZXJ0eSgibm9kZSIpKXtpZighQXJyYXkuaXNBcnJheShlLm5vZGUpKXJldHVybiAibm9kZTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLm5vZGUubGVuZ3RoOysrdClpZihuPWMub25ueC5Ob2RlUHJvdG8udmVyaWZ5KGUubm9kZVt0XSkpcmV0dXJuICJub2RlLiIrbn1pZihudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJiFsLmlzU3RyaW5nKGUuZG9jU3RyaW5nKSlyZXR1cm4gImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjtpZihudWxsIT1lLm9wc2V0SW1wb3J0JiZlLmhhc093blByb3BlcnR5KCJvcHNldEltcG9ydCIpKXtpZighQXJyYXkuaXNBcnJheShlLm9wc2V0SW1wb3J0KSlyZXR1cm4gIm9wc2V0SW1wb3J0OiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUub3BzZXRJbXBvcnQubGVuZ3RoOysrdCl7dmFyIG47aWYobj1jLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLnZlcmlmeShlLm9wc2V0SW1wb3J0W3RdKSlyZXR1cm4gIm9wc2V0SW1wb3J0LiIrbn19cmV0dXJuIG51bGwhPWUuZG9tYWluJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmIWwuaXNTdHJpbmcoZS5kb21haW4pPyJkb21haW46IHN0cmluZyBleHBlY3RlZCI6bnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguRnVuY3Rpb25Qcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LkZ1bmN0aW9uUHJvdG87aWYobnVsbCE9ZS5uYW1lJiYodC5uYW1lPVN0cmluZyhlLm5hbWUpKSxlLmlucHV0KXtpZighQXJyYXkuaXNBcnJheShlLmlucHV0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8uaW5wdXQ6IGFycmF5IGV4cGVjdGVkIik7dC5pbnB1dD1bXTtmb3IodmFyIG49MDtuPGUuaW5wdXQubGVuZ3RoOysrbil0LmlucHV0W25dPVN0cmluZyhlLmlucHV0W25dKTt9aWYoZS5vdXRwdXQpe2lmKCFBcnJheS5pc0FycmF5KGUub3V0cHV0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8ub3V0cHV0OiBhcnJheSBleHBlY3RlZCIpO2Zvcih0Lm91dHB1dD1bXSxuPTA7bjxlLm91dHB1dC5sZW5ndGg7KytuKXQub3V0cHV0W25dPVN0cmluZyhlLm91dHB1dFtuXSk7fWlmKGUuYXR0cmlidXRlKXtpZighQXJyYXkuaXNBcnJheShlLmF0dHJpYnV0ZSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5GdW5jdGlvblByb3RvLmF0dHJpYnV0ZTogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5hdHRyaWJ1dGU9W10sbj0wO248ZS5hdHRyaWJ1dGUubGVuZ3RoOysrbil0LmF0dHJpYnV0ZVtuXT1TdHJpbmcoZS5hdHRyaWJ1dGVbbl0pO31pZihlLmF0dHJpYnV0ZVByb3RvKXtpZighQXJyYXkuaXNBcnJheShlLmF0dHJpYnV0ZVByb3RvKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8uYXR0cmlidXRlUHJvdG86IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuYXR0cmlidXRlUHJvdG89W10sbj0wO248ZS5hdHRyaWJ1dGVQcm90by5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuYXR0cmlidXRlUHJvdG9bbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5GdW5jdGlvblByb3RvLmF0dHJpYnV0ZVByb3RvOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmF0dHJpYnV0ZVByb3RvW25dPWMub25ueC5BdHRyaWJ1dGVQcm90by5mcm9tT2JqZWN0KGUuYXR0cmlidXRlUHJvdG9bbl0pO319aWYoZS5ub2RlKXtpZighQXJyYXkuaXNBcnJheShlLm5vZGUpKXRocm93IFR5cGVFcnJvcigiLm9ubnguRnVuY3Rpb25Qcm90by5ub2RlOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0Lm5vZGU9W10sbj0wO248ZS5ub2RlLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5ub2RlW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguRnVuY3Rpb25Qcm90by5ub2RlOiBvYmplY3QgZXhwZWN0ZWQiKTt0Lm5vZGVbbl09Yy5vbm54Lk5vZGVQcm90by5mcm9tT2JqZWN0KGUubm9kZVtuXSk7fX1pZihudWxsIT1lLmRvY1N0cmluZyYmKHQuZG9jU3RyaW5nPVN0cmluZyhlLmRvY1N0cmluZykpLGUub3BzZXRJbXBvcnQpe2lmKCFBcnJheS5pc0FycmF5KGUub3BzZXRJbXBvcnQpKXRocm93IFR5cGVFcnJvcigiLm9ubnguRnVuY3Rpb25Qcm90by5vcHNldEltcG9ydDogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5vcHNldEltcG9ydD1bXSxuPTA7bjxlLm9wc2V0SW1wb3J0Lmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5vcHNldEltcG9ydFtuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8ub3BzZXRJbXBvcnQ6IG9iamVjdCBleHBlY3RlZCIpO3Qub3BzZXRJbXBvcnRbbl09Yy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by5mcm9tT2JqZWN0KGUub3BzZXRJbXBvcnRbbl0pO319cmV0dXJuIG51bGwhPWUuZG9tYWluJiYodC5kb21haW49U3RyaW5nKGUuZG9tYWluKSksdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5pbnB1dD1bXSxuLm91dHB1dD1bXSxuLmF0dHJpYnV0ZT1bXSxuLm5vZGU9W10sbi5vcHNldEltcG9ydD1bXSxuLmF0dHJpYnV0ZVByb3RvPVtdKSx0LmRlZmF1bHRzJiYobi5uYW1lPSIiLG4uZG9jU3RyaW5nPSIiLG4uZG9tYWluPSIiKSxudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmKG4ubmFtZT1lLm5hbWUpLGUuaW5wdXQmJmUuaW5wdXQubGVuZ3RoKXtuLmlucHV0PVtdO2Zvcih2YXIgcj0wO3I8ZS5pbnB1dC5sZW5ndGg7KytyKW4uaW5wdXRbcl09ZS5pbnB1dFtyXTt9aWYoZS5vdXRwdXQmJmUub3V0cHV0Lmxlbmd0aClmb3Iobi5vdXRwdXQ9W10scj0wO3I8ZS5vdXRwdXQubGVuZ3RoOysrciluLm91dHB1dFtyXT1lLm91dHB1dFtyXTtpZihlLmF0dHJpYnV0ZSYmZS5hdHRyaWJ1dGUubGVuZ3RoKWZvcihuLmF0dHJpYnV0ZT1bXSxyPTA7cjxlLmF0dHJpYnV0ZS5sZW5ndGg7KytyKW4uYXR0cmlidXRlW3JdPWUuYXR0cmlidXRlW3JdO2lmKGUubm9kZSYmZS5ub2RlLmxlbmd0aClmb3Iobi5ub2RlPVtdLHI9MDtyPGUubm9kZS5sZW5ndGg7KytyKW4ubm9kZVtyXT1jLm9ubnguTm9kZVByb3RvLnRvT2JqZWN0KGUubm9kZVtyXSx0KTtpZihudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJihuLmRvY1N0cmluZz1lLmRvY1N0cmluZyksZS5vcHNldEltcG9ydCYmZS5vcHNldEltcG9ydC5sZW5ndGgpZm9yKG4ub3BzZXRJbXBvcnQ9W10scj0wO3I8ZS5vcHNldEltcG9ydC5sZW5ndGg7KytyKW4ub3BzZXRJbXBvcnRbcl09Yy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by50b09iamVjdChlLm9wc2V0SW1wb3J0W3JdLHQpO2lmKG51bGwhPWUuZG9tYWluJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmKG4uZG9tYWluPWUuZG9tYWluKSxlLmF0dHJpYnV0ZVByb3RvJiZlLmF0dHJpYnV0ZVByb3RvLmxlbmd0aClmb3Iobi5hdHRyaWJ1dGVQcm90bz1bXSxyPTA7cjxlLmF0dHJpYnV0ZVByb3RvLmxlbmd0aDsrK3Ipbi5hdHRyaWJ1dGVQcm90b1tyXT1jLm9ubnguQXR0cmlidXRlUHJvdG8udG9PYmplY3QoZS5hdHRyaWJ1dGVQcm90b1tyXSx0KTtyZXR1cm4gbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5GdW5jdGlvblByb3RvIn0sZX0oKSxpKSxlLmV4cG9ydHM9Yzt9LDM0NzQ6KGUsdCxuKT0+e3ZhciByLG89KHI9InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdD9kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYzp2b2lkIDAsInVuZGVmaW5lZCIhPXR5cGVvZiBfX2ZpbGVuYW1lJiYocj1yfHxfX2ZpbGVuYW1lKSxmdW5jdGlvbihlPXt9KXtmdW5jdGlvbiB0KCl7cmV0dXJuICQuYnVmZmVyIT1qLmJ1ZmZlciYmQigpLGp9ZnVuY3Rpb24gbygpe3JldHVybiAkLmJ1ZmZlciE9ai5idWZmZXImJkIoKSxSfWZ1bmN0aW9uIGkoKXtyZXR1cm4gJC5idWZmZXIhPWouYnVmZmVyJiZCKCksTH1mdW5jdGlvbiBzKCl7cmV0dXJuICQuYnVmZmVyIT1qLmJ1ZmZlciYmQigpLEN9ZnVuY3Rpb24gYSgpe3JldHVybiAkLmJ1ZmZlciE9ai5idWZmZXImJkIoKSxNfXZhciB1LGwsYz1lO2MucmVhZHk9bmV3IFByb21pc2UoKChlLHQpPT57dT1lLGw9dDt9KSk7dmFyIHAsZCxmLGg9T2JqZWN0LmFzc2lnbih7fSxjKSxnPSIuL3RoaXMucHJvZ3JhbSIsYj0oZSx0KT0+e3Rocm93IHR9LG09Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cseT0iZnVuY3Rpb24iPT10eXBlb2YgaW1wb3J0U2NyaXB0cyx2PSJvYmplY3QiPT10eXBlb2YgcHJvY2VzcyYmIm9iamVjdCI9PXR5cGVvZiBwcm9jZXNzLnZlcnNpb25zJiYic3RyaW5nIj09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSxfPWMuRU5WSVJPTk1FTlRfSVNfUFRIUkVBRHx8ITEsdz0iIjtmdW5jdGlvbiBUKGUpe3JldHVybiBjLmxvY2F0ZUZpbGU/Yy5sb2NhdGVGaWxlKGUsdyk6dytlfWlmKHYpe3ZhciB4PW4oMTM4NCksTz1uKDkwOCk7bGV0IHQ7dz15P08uZGlybmFtZSh3KSsiLyI6X19kaXJuYW1lKyIvIixwPShlLHQpPT4oZT1lLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKT9uZXcgVVJMKGUpOk8ubm9ybWFsaXplKGUpLHgucmVhZEZpbGVTeW5jKGUsdD92b2lkIDA6InV0ZjgiKSksZj1lPT4oKGU9cChlLCEwKSkuYnVmZmVyfHwoZT1uZXcgVWludDhBcnJheShlKSksZSksZD0oZSx0LG4scj0hMCk9PntlPWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpP25ldyBVUkwoZSk6Ty5ub3JtYWxpemUoZSkseC5yZWFkRmlsZShlLHI/dm9pZCAwOiJ1dGY4IiwoKGUsbyk9PntlP24oZSk6dChyP28uYnVmZmVyOm8pO30pKTt9LCFjLnRoaXNQcm9ncmFtJiYxPHByb2Nlc3MuYXJndi5sZW5ndGgmJihnPXByb2Nlc3MuYXJndlsxXS5yZXBsYWNlKC9cXC9nLCIvIikpLHByb2Nlc3MuYXJndi5zbGljZSgyKSxiPShlLHQpPT57dGhyb3cgcHJvY2Vzcy5leGl0Q29kZT1lLHR9LGMuaW5zcGVjdD0oKT0+IltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIjt0cnl7dD1uKDk5MjUpO31jYXRjaChlKXt0aHJvdyBjb25zb2xlLmVycm9yKCdUaGUgIndvcmtlcl90aHJlYWRzIiBtb2R1bGUgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIG5vZGUuanMgYnVpbGQgLSBwZXJoYXBzIGEgbmV3ZXIgdmVyc2lvbiBpcyBuZWVkZWQ/JyksZX1jb21tb25qc0dsb2JhbC5Xb3JrZXI9dC5Xb3JrZXI7fWVsc2UgKG18fHkpJiYoeT93PXNlbGYubG9jYXRpb24uaHJlZjoidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYodz1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksciYmKHc9ciksdz0wIT09dy5pbmRleE9mKCJibG9iOiIpP3cuc3Vic3RyKDAsdy5yZXBsYWNlKC9bPyNdLiovLCIiKS5sYXN0SW5kZXhPZigiLyIpKzEpOiIiLHZ8fChwPWU9Pnt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHQub3BlbigiR0VUIixlLCExKSx0LnNlbmQobnVsbCksdC5yZXNwb25zZVRleHR9LHkmJihmPWU9Pnt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHQub3BlbigiR0VUIixlLCExKSx0LnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLHQuc2VuZChudWxsKSxuZXcgVWludDhBcnJheSh0LnJlc3BvbnNlKX0pLGQ9KGUsdCxuKT0+e3ZhciByPW5ldyBYTUxIdHRwUmVxdWVzdDtyLm9wZW4oIkdFVCIsZSwhMCksci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixyLm9ubG9hZD0oKT0+ezIwMD09ci5zdGF0dXN8fDA9PXIuc3RhdHVzJiZyLnJlc3BvbnNlP3Qoci5yZXNwb25zZSk6bigpO30sci5vbmVycm9yPW4sci5zZW5kKG51bGwpO30pKTt2JiYidW5kZWZpbmVkIj09dHlwZW9mIHBlcmZvcm1hbmNlJiYoY29tbW9uanNHbG9iYWwucGVyZm9ybWFuY2U9big2OTUzKS5wZXJmb3JtYW5jZSk7dmFyIFM9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSxBPWNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTt2JiYoUz0oLi4uZSk9Pngud3JpdGVTeW5jKDEsZS5qb2luKCIgIikrIlxuIiksQT0oLi4uZSk9Pngud3JpdGVTeW5jKDIsZS5qb2luKCIgIikrIlxuIikpO3ZhciBQLEk9Yy5wcmludHx8UyxFPWMucHJpbnRFcnJ8fEE7T2JqZWN0LmFzc2lnbihjLGgpLGg9bnVsbCxjLnRoaXNQcm9ncmFtJiYoZz1jLnRoaXNQcm9ncmFtKSxjLnF1aXQmJihiPWMucXVpdCksYy53YXNtQmluYXJ5JiYoUD1jLndhc21CaW5hcnkpO3ZhciBEPWMubm9FeGl0UnVudGltZXx8ITA7Im9iamVjdCIhPXR5cGVvZiBXZWJBc3NlbWJseSYmbmUoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTt2YXIgJCxrLEYsTixqLFIsTCxDLE0sVT0hMTtmdW5jdGlvbiBCKCl7dmFyIGU9JC5idWZmZXI7Yy5IRUFQOD1qPW5ldyBJbnQ4QXJyYXkoZSksYy5IRUFQMTY9bmV3IEludDE2QXJyYXkoZSksYy5IRUFQMzI9TD1uZXcgSW50MzJBcnJheShlKSxjLkhFQVBVOD1SPW5ldyBVaW50OEFycmF5KGUpLGMuSEVBUFUxNj1uZXcgVWludDE2QXJyYXkoZSksYy5IRUFQVTMyPUM9bmV3IFVpbnQzMkFycmF5KGUpLGMuSEVBUEYzMj1uZXcgRmxvYXQzMkFycmF5KGUpLGMuSEVBUEY2ND1NPW5ldyBGbG9hdDY0QXJyYXkoZSk7fXZhciBWPWMuSU5JVElBTF9NRU1PUll8fDE2Nzc3MjE2O2lmKDUyNDI4ODA8PVZ8fG5lKCJJTklUSUFMX01FTU9SWSBzaG91bGQgYmUgbGFyZ2VyIHRoYW4gU1RBQ0tfU0laRSwgd2FzICIrVisiISAoU1RBQ0tfU0laRT01MjQyODgwKSIpLF8pJD1jLndhc21NZW1vcnk7ZWxzZSBpZihjLndhc21NZW1vcnkpJD1jLndhc21NZW1vcnk7ZWxzZSBpZighKCgkPW5ldyBXZWJBc3NlbWJseS5NZW1vcnkoe2luaXRpYWw6Vi82NTUzNixtYXhpbXVtOjY1NTM2LHNoYXJlZDohMH0pKS5idWZmZXIgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcikpdGhyb3cgRSgicmVxdWVzdGVkIGEgc2hhcmVkIFdlYkFzc2VtYmx5Lk1lbW9yeSBidXQgdGhlIHJldHVybmVkIGJ1ZmZlciBpcyBub3QgYSBTaGFyZWRBcnJheUJ1ZmZlciwgaW5kaWNhdGluZyB0aGF0IHdoaWxlIHRoZSBicm93c2VyIGhhcyBTaGFyZWRBcnJheUJ1ZmZlciBpdCBkb2VzIG5vdCBoYXZlIFdlYkFzc2VtYmx5IHRocmVhZHMgc3VwcG9ydCAtIHlvdSBtYXkgbmVlZCB0byBzZXQgYSBmbGFnIiksdiYmRSgiKG9uIG5vZGUgeW91IG1heSBuZWVkOiAtLWV4cGVyaW1lbnRhbC13YXNtLXRocmVhZHMgLS1leHBlcmltZW50YWwtd2FzbS1idWxrLW1lbW9yeSBhbmQvb3IgcmVjZW50IHZlcnNpb24pIiksRXJyb3IoImJhZCBtZW1vcnkiKTtCKCksVj0kLmJ1ZmZlci5ieXRlTGVuZ3RoO3ZhciB6LEc9W10sSD1bXSxXPVtdLHE9MDtmdW5jdGlvbiBYKCl7cmV0dXJuIER8fDA8cX12YXIgWSxLLEo9MCxRPW51bGw7ZnVuY3Rpb24gZWUoKXtKKyssYy5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZjLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoSik7fWZ1bmN0aW9uIHRlKCl7aWYoSi0tLGMubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmYy5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKEopLDA9PUomJihRKSl7dmFyIGU9UTtRPW51bGwsZSgpO319ZnVuY3Rpb24gbmUoZSl7dGhyb3cgYy5vbkFib3J0JiZjLm9uQWJvcnQoZSksRShlPSJBYm9ydGVkKCIrZSsiKSIpLFU9ITAsTj0xLGU9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihlKyIuIEJ1aWxkIHdpdGggLXNBU1NFUlRJT05TIGZvciBtb3JlIGluZm8uIiksbChlKSxlfWZ1bmN0aW9uIHJlKGUpe3JldHVybiBlLnN0YXJ0c1dpdGgoImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiKX1mdW5jdGlvbiBvZShlKXtpZihlPT1ZJiZQKXJldHVybiBuZXcgVWludDhBcnJheShQKTtpZihmKXJldHVybiBmKGUpO3Rocm93ICJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9ZnVuY3Rpb24gaWUoZSx0LG4pe3JldHVybiBmdW5jdGlvbihlKXtpZighUCYmKG18fHkpKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZmV0Y2gmJiFlLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSlyZXR1cm4gZmV0Y2goZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oKHQ9PntpZighdC5vayl0aHJvdyAiZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnIitlKyInIjtyZXR1cm4gdC5hcnJheUJ1ZmZlcigpfSkpLmNhdGNoKCgoKT0+b2UoZSkpKTtpZihkKXJldHVybiBuZXcgUHJvbWlzZSgoKHQsbik9PntkKGUsKGU9PnQobmV3IFVpbnQ4QXJyYXkoZSkpKSxuKTt9KSl9cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT5vZShlKSkpfShlKS50aGVuKChlPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShlLHQpKSkudGhlbigoZT0+ZSkpLnRoZW4obiwoZT0+e0UoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrZSksbmUoZSk7fSkpfWZ1bmN0aW9uIHNlKGUpe3RoaXMubmFtZT0iRXhpdFN0YXR1cyIsdGhpcy5tZXNzYWdlPWBQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCR7ZX0pYCx0aGlzLnN0YXR1cz1lO31mdW5jdGlvbiBhZShlKXtlLnRlcm1pbmF0ZSgpLGUub25tZXNzYWdlPSgpPT57fTt9ZnVuY3Rpb24gdWUoZSl7KGU9Z2UuRmFbZV0pfHxuZSgpLGdlLmZiKGUpO31mdW5jdGlvbiBsZShlKXt2YXIgdD1nZS5aYSgpO2lmKCF0KXJldHVybiA2O2dlLklhLnB1c2godCksZ2UuRmFbZS5IYV09dCx0LkhhPWUuSGE7dmFyIG49e2NtZDoicnVuIixzdGFydF9yb3V0aW5lOmUuZ2IsYXJnOmUuWWEscHRocmVhZF9wdHI6ZS5IYX07cmV0dXJuIHYmJnQudW5yZWYoKSx0LnBvc3RNZXNzYWdlKG4sZS5tYiksMH1yZShZPSJvcnQtd2FzbS10aHJlYWRlZC53YXNtIil8fChZPVQoWSkpO3ZhciBjZT0idW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxwZT0oZSx0LG4pPT57dmFyIHI9KHQ+Pj49MCkrbjtmb3Iobj10O2Vbbl0mJiEobj49cik7KSsrbjtpZigxNjxuLXQmJmUuYnVmZmVyJiZjZSlyZXR1cm4gY2UuZGVjb2RlKGUuYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXI/ZS5zbGljZSh0LG4pOmUuc3ViYXJyYXkodCxuKSk7Zm9yKHI9IiI7dDxuOyl7dmFyIG89ZVt0KytdO2lmKDEyOCZvKXt2YXIgaT02MyZlW3QrK107aWYoMTkyPT0oMjI0Jm8pKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKDMxJm8pPDw2fGkpO2Vsc2Uge3ZhciBzPTYzJmVbdCsrXTs2NTUzNj4obz0yMjQ9PSgyNDAmbyk/KDE1Jm8pPDwxMnxpPDw2fHM6KDcmbyk8PDE4fGk8PDEyfHM8PDZ8NjMmZVt0KytdKT9yKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pOihvLT02NTUzNixyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fG8+PjEwLDU2MzIwfDEwMjMmbykpO319ZWxzZSByKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pO31yZXR1cm4gcn0sZGU9KGUsdCk9PihlPj4+PTApP3BlKG8oKSxlLHQpOiIiO2Z1bmN0aW9uIGZlKGUpe2lmKF8pcmV0dXJuIFhlKDEsMSxlKTtOPWUsWCgpfHwoZ2UuaGIoKSxjLm9uRXhpdCYmYy5vbkV4aXQoZSksVT0hMCksYihlLG5ldyBzZShlKSk7fXZhciBoZT1lPT57aWYoTj1lLF8pdGhyb3cgbWUoZSksInVud2luZCI7ZmUoZSk7fSxnZT17TGE6W10sSWE6W10sVGE6W10sRmE6e30sUGE6ZnVuY3Rpb24oKXtfP2dlLmFiKCk6Z2UuJGEoKTt9LCRhOmZ1bmN0aW9uKCl7Ry51bnNoaWZ0KCgoKT0+e2VlKCksZ2UuYmIoKCgpPT50ZSgpKSk7fSkpO30sYWI6ZnVuY3Rpb24oKXtnZS5yZWNlaXZlT2JqZWN0VHJhbnNmZXI9Z2UuZWIsZ2UudGhyZWFkSW5pdFRMUz1nZS5TYSxnZS5zZXRFeGl0U3RhdHVzPWdlLlJhLEQ9ITE7fSxSYTpmdW5jdGlvbihlKXtOPWU7fSxyYjpbIiR0ZXJtaW5hdGVXb3JrZXIiXSxoYjpmdW5jdGlvbigpe2Zvcih2YXIgZSBvZiBnZS5JYSlhZShlKTtmb3IoZSBvZiBnZS5MYSlhZShlKTtnZS5MYT1bXSxnZS5JYT1bXSxnZS5GYT1bXTt9LGZiOmZ1bmN0aW9uKGUpe3ZhciB0PWUuSGE7ZGVsZXRlIGdlLkZhW3RdLGdlLkxhLnB1c2goZSksZ2UuSWEuc3BsaWNlKGdlLklhLmluZGV4T2YoZSksMSksZS5IYT0wLHl0KHQpO30sZWI6ZnVuY3Rpb24oKXt9LFNhOmZ1bmN0aW9uKCl7Z2UuVGEuZm9yRWFjaCgoZT0+ZSgpKSk7fSxjYjplPT5uZXcgUHJvbWlzZSgodD0+e2Uub25tZXNzYWdlPW49Pnt2YXIgcj0obj1uLmRhdGEpLmNtZDtpZihuLnRhcmdldFRocmVhZCYmbi50YXJnZXRUaHJlYWQhPWZ0KCkpe3ZhciBvPWdlLkZhW24ucWJdO28/by5wb3N0TWVzc2FnZShuLG4udHJhbnNmZXJMaXN0KTpFKCdJbnRlcm5hbCBlcnJvciEgV29ya2VyIHNlbnQgYSBtZXNzYWdlICInK3IrJyIgdG8gdGFyZ2V0IHB0aHJlYWQgJytuLnRhcmdldFRocmVhZCsiLCBidXQgdGhhdCB0aHJlYWQgbm8gbG9uZ2VyIGV4aXN0cyEiKTt9ZWxzZSAiY2hlY2tNYWlsYm94Ij09PXI/VWUoKToic3Bhd25UaHJlYWQiPT09cj9sZShuKToiY2xlYW51cFRocmVhZCI9PT1yP3VlKG4udGhyZWFkKToia2lsbFRocmVhZCI9PT1yPyhuPW4udGhyZWFkLHI9Z2UuRmFbbl0sZGVsZXRlIGdlLkZhW25dLGFlKHIpLHl0KG4pLGdlLklhLnNwbGljZShnZS5JYS5pbmRleE9mKHIpLDEpLHIuSGE9MCk6ImNhbmNlbFRocmVhZCI9PT1yP2dlLkZhW24udGhyZWFkXS5wb3N0TWVzc2FnZSh7Y21kOiJjYW5jZWwifSk6ImxvYWRlZCI9PT1yPyhlLmxvYWRlZD0hMCx0KGUpKToiYWxlcnQiPT09cj9hbGVydCgiVGhyZWFkICIrbi50aHJlYWRJZCsiOiAiK24udGV4dCk6InNldGltbWVkaWF0ZSI9PT1uLnRhcmdldD9lLnBvc3RNZXNzYWdlKG4pOiJjYWxsSGFuZGxlciI9PT1yP2Nbbi5oYW5kbGVyXSguLi5uLmFyZ3MpOnImJkUoIndvcmtlciBzZW50IGFuIHVua25vd24gY29tbWFuZCAiK3IpO30sZS5vbmVycm9yPWU9Pnt0aHJvdyBFKCJ3b3JrZXIgc2VudCBhbiBlcnJvciEgIitlLmZpbGVuYW1lKyI6IitlLmxpbmVubysiOiAiK2UubWVzc2FnZSksZX0sdiYmKGUub24oIm1lc3NhZ2UiLChmdW5jdGlvbih0KXtlLm9ubWVzc2FnZSh7ZGF0YTp0fSk7fSkpLGUub24oImVycm9yIiwoZnVuY3Rpb24odCl7ZS5vbmVycm9yKHQpO30pKSk7dmFyIG4sbz1bXTtmb3IobiBvZiBbIm9uRXhpdCIsIm9uQWJvcnQiLCJwcmludCIsInByaW50RXJyIl0pYy5oYXNPd25Qcm9wZXJ0eShuKSYmby5wdXNoKG4pO2UucG9zdE1lc3NhZ2Uoe2NtZDoibG9hZCIsaGFuZGxlcnM6byx1cmxPckJsb2I6Yy5tYWluU2NyaXB0VXJsT3JCbG9ifHxyLHdhc21NZW1vcnk6JCx3YXNtTW9kdWxlOkZ9KTt9KSksYmI6ZnVuY3Rpb24oZSl7ZSgpO30sWGE6ZnVuY3Rpb24oKXt2YXIgZT1UKCJvcnQtd2FzbS10aHJlYWRlZC53b3JrZXIuanMiKTtlPW5ldyBXb3JrZXIoZSksZ2UuTGEucHVzaChlKTt9LFphOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PWdlLkxhLmxlbmd0aCYmKGdlLlhhKCksZ2UuY2IoZ2UuTGFbMF0pKSxnZS5MYS5wb3AoKX19O2MuUFRocmVhZD1nZTt2YXIgYmU9ZT0+e2Zvcig7MDxlLmxlbmd0aDspZS5zaGlmdCgpKGMpO307ZnVuY3Rpb24gbWUoZSl7aWYoXylyZXR1cm4gWGUoMiwwLGUpO2hlKGUpO31jLmVzdGFibGlzaFN0YWNrU3BhY2U9ZnVuY3Rpb24oKXt2YXIgZT1mdCgpLHQ9aSgpW2UrNTI+PjI+Pj4wXTtlPWkoKVtlKzU2Pj4yPj4+MF0sVHQodCx0LWUpLE90KHQpO307dmFyIHllPVtdO2Z1bmN0aW9uIHZlKGUpe3RoaXMuT2E9ZS0yNCx0aGlzLldhPWZ1bmN0aW9uKGUpe3MoKVt0aGlzLk9hKzQ+PjI+Pj4wXT1lO30sdGhpcy5WYT1mdW5jdGlvbihlKXtzKClbdGhpcy5PYSs4Pj4yPj4+MF09ZTt9LHRoaXMuUGE9ZnVuY3Rpb24oZSx0KXt0aGlzLlVhKCksdGhpcy5XYShlKSx0aGlzLlZhKHQpO30sdGhpcy5VYT1mdW5jdGlvbigpe3MoKVt0aGlzLk9hKzE2Pj4yPj4+MF09MDt9O31mdW5jdGlvbiBfZShlLHQsbixyKXtyZXR1cm4gXz9YZSgzLDEsZSx0LG4scik6d2UoZSx0LG4scil9ZnVuY3Rpb24gd2UoZSx0LG4scil7aWYoZT4+Pj0wLHQ+Pj49MCxuPj4+PTAscj4+Pj0wLCJ1bmRlZmluZWQiPT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIpcmV0dXJuIEUoIkN1cnJlbnQgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCBTaGFyZWRBcnJheUJ1ZmZlciwgcHRocmVhZHMgYXJlIG5vdCBhdmFpbGFibGUhIiksNjt2YXIgbz1bXTtyZXR1cm4gXyYmMD09PW8ubGVuZ3RoP19lKGUsdCxuLHIpOihlPXtnYjpuLEhhOmUsWWE6cixtYjpvfSxfPyhlLm9iPSJzcGF3blRocmVhZCIscG9zdE1lc3NhZ2UoZSxvKSwwKTpsZShlKSl9ZnVuY3Rpb24gVGUoZSx0LG4pe3JldHVybiBfP1hlKDQsMSxlLHQsbik6MH1mdW5jdGlvbiB4ZShlLHQpe2lmKF8pcmV0dXJuIFhlKDUsMSxlLHQpfWMuaW52b2tlRW50cnlQb2ludD1mdW5jdGlvbihlLHQpe3ZhciBuPXllW2VdO258fChlPj15ZS5sZW5ndGgmJih5ZS5sZW5ndGg9ZSsxKSx5ZVtlXT1uPXouZ2V0KGUpKSxlPW4odCksWCgpP2dlLlJhKGUpOnZ0KGUpO307dmFyIE9lPWU9Pntmb3IodmFyIHQ9MCxuPTA7bjxlLmxlbmd0aDsrK24pe3ZhciByPWUuY2hhckNvZGVBdChuKTsxMjc+PXI/dCsrOjIwNDc+PXI/dCs9Mjo1NTI5Njw9ciYmNTczNDM+PXI/KHQrPTQsKytuKTp0Kz0zO31yZXR1cm4gdH0sU2U9KGUsdCxuLHIpPT57aWYoISgwPHIpKXJldHVybiAwO3ZhciBvPW4+Pj49MDtyPW4rci0xO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7KytpKXt2YXIgcz1lLmNoYXJDb2RlQXQoaSk7aWYoNTUyOTY8PXMmJjU3MzQzPj1zJiYocz02NTUzNisoKDEwMjMmcyk8PDEwKXwxMDIzJmUuY2hhckNvZGVBdCgrK2kpKSwxMjc+PXMpe2lmKG4+PXIpYnJlYWs7dFtuKys+Pj4wXT1zO31lbHNlIHtpZigyMDQ3Pj1zKXtpZihuKzE+PXIpYnJlYWs7dFtuKys+Pj4wXT0xOTJ8cz4+Njt9ZWxzZSB7aWYoNjU1MzU+PXMpe2lmKG4rMj49cilicmVhazt0W24rKz4+PjBdPTIyNHxzPj4xMjt9ZWxzZSB7aWYobiszPj1yKWJyZWFrO3RbbisrPj4+MF09MjQwfHM+PjE4LHRbbisrPj4+MF09MTI4fHM+PjEyJjYzO310W24rKz4+PjBdPTEyOHxzPj42JjYzO310W24rKz4+PjBdPTEyOHw2MyZzO319cmV0dXJuIHRbbj4+PjBdPTAsbi1vfSxBZT0oZSx0LG4pPT5TZShlLG8oKSx0LG4pO2Z1bmN0aW9uIFBlKGUsdCl7aWYoXylyZXR1cm4gWGUoNiwxLGUsdCl9ZnVuY3Rpb24gSWUoZSx0LG4pe2lmKF8pcmV0dXJuIFhlKDcsMSxlLHQsbil9ZnVuY3Rpb24gRWUoZSx0LG4pe3JldHVybiBfP1hlKDgsMSxlLHQsbik6MH1mdW5jdGlvbiBEZShlLHQpe2lmKF8pcmV0dXJuIFhlKDksMSxlLHQpfWZ1bmN0aW9uICRlKGUsdCxuKXtpZihfKXJldHVybiBYZSgxMCwxLGUsdCxuKX1mdW5jdGlvbiBrZShlLHQsbixyKXtpZihfKXJldHVybiBYZSgxMSwxLGUsdCxuLHIpfWZ1bmN0aW9uIEZlKGUsdCxuLHIpe2lmKF8pcmV0dXJuIFhlKDEyLDEsZSx0LG4scil9ZnVuY3Rpb24gTmUoZSx0LG4scil7aWYoXylyZXR1cm4gWGUoMTMsMSxlLHQsbixyKX1mdW5jdGlvbiBqZShlKXtpZihfKXJldHVybiBYZSgxNCwxLGUpfWZ1bmN0aW9uIFJlKGUsdCl7aWYoXylyZXR1cm4gWGUoMTUsMSxlLHQpfWZ1bmN0aW9uIExlKGUsdCxuKXtpZihfKXJldHVybiBYZSgxNiwxLGUsdCxuKX12YXIgQ2U9ZT0+e2lmKCFVKXRyeXtpZihlKCksIVgoKSl0cnl7Xz92dChOKTpoZShOKTt9Y2F0Y2goZSl7ZSBpbnN0YW5jZW9mIHNlfHwidW53aW5kIj09ZXx8YigxLGUpO319Y2F0Y2goZSl7ZSBpbnN0YW5jZW9mIHNlfHwidW53aW5kIj09ZXx8YigxLGUpO319O2Z1bmN0aW9uIE1lKGUpe2U+Pj49MCwiZnVuY3Rpb24iPT10eXBlb2YgQXRvbWljcy5uYiYmKEF0b21pY3MubmIoaSgpLGU+PjIsZSkudmFsdWUudGhlbihVZSksZSs9MTI4LEF0b21pY3Muc3RvcmUoaSgpLGU+PjIsMSkpO31mdW5jdGlvbiBVZSgpe3ZhciBlPWZ0KCk7ZSYmKE1lKGUpLENlKCgoKT0+X3QoKSkpKTt9Yy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX21haWxib3hfYXdhaXQ9TWUsYy5jaGVja01haWxib3g9VWU7dmFyIEJlPWU9PjA9PWUlNCYmKDAhPWUlMTAwfHwwPT1lJTQwMCksVmU9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV0semU9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF07ZnVuY3Rpb24gR2UoZSx0LG4scixvLGkscyxhKXtyZXR1cm4gXz9YZSgxNywxLGUsdCxuLHIsbyxpLHMsYSk6LTUyfWZ1bmN0aW9uIEhlKGUsdCxuLHIsbyxpLHMpe2lmKF8pcmV0dXJuIFhlKDE4LDEsZSx0LG4scixvLGkscyl9dmFyIFdlPWU9Pnt2YXIgdD1PZShlKSsxLG49aHQodCk7cmV0dXJuIG4mJkFlKGUsbix0KSxufSxxZT1lPT57dmFyIHQ9eHQoKTtyZXR1cm4gZT1lKCksT3QodCksZX07ZnVuY3Rpb24gWGUoZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoLTIscj1hcmd1bWVudHM7cmV0dXJuIHFlKCgoKT0+e2Zvcih2YXIgbz1TdCg4Km4pLGk9bz4+MyxzPTA7czxuO3MrKyl7dmFyIHU9clsyK3NdO2EoKVtpK3M+Pj4wXT11O31yZXR1cm4gbXQoZSxuLG8sdCl9KSl9dmFyIFllLEtlPVtdLEplPXt9LFplPSgpPT57aWYoIVllKXt2YXIgZSx0PXtVU0VSOiJ3ZWJfdXNlciIsTE9HTkFNRToid2ViX3VzZXIiLFBBVEg6Ii8iLFBXRDoiLyIsSE9NRToiL2hvbWUvd2ViX3VzZXIiLExBTkc6KCJvYmplY3QiPT10eXBlb2YgbmF2aWdhdG9yJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIsXzpnfHwiLi90aGlzLnByb2dyYW0ifTtmb3IoZSBpbiBKZSl2b2lkIDA9PT1KZVtlXT9kZWxldGUgdFtlXTp0W2VdPUplW2VdO3ZhciBuPVtdO2ZvcihlIGluIHQpbi5wdXNoKGAke2V9PSR7dFtlXX1gKTtZZT1uO31yZXR1cm4gWWV9O2Z1bmN0aW9uIFFlKGUsbil7aWYoXylyZXR1cm4gWGUoMTksMSxlLG4pO2U+Pj49MCxuPj4+PTA7dmFyIHI9MDtyZXR1cm4gWmUoKS5mb3JFYWNoKChmdW5jdGlvbihvLGkpe3ZhciBhPW4rcjtmb3IoaT1zKClbZSs0Kmk+PjI+Pj4wXT1hLGE9MDthPG8ubGVuZ3RoOysrYSl0KClbaSsrPj4wPj4+MF09by5jaGFyQ29kZUF0KGEpO3QoKVtpPj4wPj4+MF09MCxyKz1vLmxlbmd0aCsxO30pKSwwfWZ1bmN0aW9uIGV0KGUsdCl7aWYoXylyZXR1cm4gWGUoMjAsMSxlLHQpO2U+Pj49MCx0Pj4+PTA7dmFyIG49WmUoKTtzKClbZT4+Mj4+PjBdPW4ubGVuZ3RoO3ZhciByPTA7cmV0dXJuIG4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7cis9ZS5sZW5ndGgrMTt9KSkscygpW3Q+PjI+Pj4wXT1yLDB9ZnVuY3Rpb24gdHQoZSl7cmV0dXJuIF8/WGUoMjEsMSxlKTo1Mn1mdW5jdGlvbiBudChlLHQsbixyKXtyZXR1cm4gXz9YZSgyMiwxLGUsdCxuLHIpOjUyfWZ1bmN0aW9uIHJ0KGUsdCxuLHIsbyl7cmV0dXJuIF8/WGUoMjMsMSxlLHQsbixyLG8pOjcwfXZhciBvdD1bbnVsbCxbXSxbXV07ZnVuY3Rpb24gaXQoZSx0LG4scil7aWYoXylyZXR1cm4gWGUoMjQsMSxlLHQsbixyKTt0Pj4+PTAsbj4+Pj0wLHI+Pj49MDtmb3IodmFyIGk9MCxhPTA7YTxuO2ErKyl7dmFyIHU9cygpW3Q+PjI+Pj4wXSxsPXMoKVt0KzQ+PjI+Pj4wXTt0Kz04O2Zvcih2YXIgYz0wO2M8bDtjKyspe3ZhciBwPW8oKVt1K2M+Pj4wXSxkPW90W2VdOzA9PT1wfHwxMD09PXA/KCgxPT09ZT9JOkUpKHBlKGQsMCkpLGQubGVuZ3RoPTApOmQucHVzaChwKTt9aSs9bDt9cmV0dXJuIHMoKVtyPj4yPj4+MF09aSwwfXZhciBzdD1lPT4oc3Q9KCgpPT57aWYoIm9iamVjdCI9PXR5cGVvZiBjcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXJldHVybiBlPT4oZS5zZXQoY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShlLmJ5dGVMZW5ndGgpKSksZSk7aWYodil0cnl7dmFyIGU9big3NjApO2lmKGUucmFuZG9tRmlsbFN5bmMpcmV0dXJuIHQ9PmUucmFuZG9tRmlsbFN5bmModCk7dmFyIHQ9ZS5yYW5kb21CeXRlcztyZXR1cm4gZT0+KGUuc2V0KHQoZS5ieXRlTGVuZ3RoKSksZSl9Y2F0Y2goZSl7fW5lKCJpbml0UmFuZG9tRGV2aWNlIik7fSkoKSkoZSksYXQ9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSx1dD1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLGx0PShlLG4pPT57dCgpLnNldChlLG4+Pj4wKTt9O2Z1bmN0aW9uIGN0KGUsdCxuLHIpe2Z1bmN0aW9uIG8oZSx0LG4pe2ZvcihlPSJudW1iZXIiPT10eXBlb2YgZT9lLnRvU3RyaW5nKCk6ZXx8IiI7ZS5sZW5ndGg8dDspZT1uWzBdK2U7cmV0dXJuIGV9ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBvKGUsdCwiMCIpfWZ1bmN0aW9uIGEoZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiAwPmU/LTE6MDxlPzE6MH12YXIgcjtyZXR1cm4gMD09PShyPW4oZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSkpJiYwPT09KHI9bihlLmdldE1vbnRoKCktdC5nZXRNb250aCgpKSkmJihyPW4oZS5nZXREYXRlKCktdC5nZXREYXRlKCkpKSxyfWZ1bmN0aW9uIHUoZSl7c3dpdGNoKGUuZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMjkpO2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMik7Y2FzZSA0OnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKTtjYXNlIDU6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMwKX19ZnVuY3Rpb24gbChlKXt2YXIgdD1lLkphO2ZvcihlPW5ldyBEYXRlKG5ldyBEYXRlKGUuS2ErMTkwMCwwLDEpLmdldFRpbWUoKSk7MDx0Oyl7dmFyIG49ZS5nZXRNb250aCgpLHI9KEJlKGUuZ2V0RnVsbFllYXIoKSk/YXQ6dXQpW25dO2lmKCEodD5yLWUuZ2V0RGF0ZSgpKSl7ZS5zZXREYXRlKGUuZ2V0RGF0ZSgpK3QpO2JyZWFrfXQtPXItZS5nZXREYXRlKCkrMSxlLnNldERhdGUoMSksMTE+bj9lLnNldE1vbnRoKG4rMSk6KGUuc2V0TW9udGgoMCksZS5zZXRGdWxsWWVhcihlLmdldEZ1bGxZZWFyKCkrMSkpO31yZXR1cm4gbj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCkrMSwwLDQpLHQ9dShuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCw0KSksbj11KG4pLDA+PWEodCxlKT8wPj1hKG4sZSk/ZS5nZXRGdWxsWWVhcigpKzE6ZS5nZXRGdWxsWWVhcigpOmUuZ2V0RnVsbFllYXIoKS0xfWU+Pj49MCx0Pj4+PTAsbj4+Pj0wLHI+Pj49MDt2YXIgYz1pKClbcis0MD4+Mj4+PjBdO2Zvcih2YXIgcCBpbiByPXtrYjppKClbcj4+Mj4+PjBdLGpiOmkoKVtyKzQ+PjI+Pj4wXSxNYTppKClbcis4Pj4yPj4+MF0sUWE6aSgpW3IrMTI+PjI+Pj4wXSxOYTppKClbcisxNj4+Mj4+PjBdLEthOmkoKVtyKzIwPj4yPj4+MF0sR2E6aSgpW3IrMjQ+PjI+Pj4wXSxKYTppKClbcisyOD4+Mj4+PjBdLHNiOmkoKVtyKzMyPj4yPj4+MF0saWI6aSgpW3IrMzY+PjI+Pj4wXSxsYjpjP2RlKGMpOiIifSxuPWRlKG4pLGM9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9KW49bi5yZXBsYWNlKG5ldyBSZWdFeHAocCwiZyIpLGNbcF0pO3ZhciBkPSJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheSIuc3BsaXQoIiAiKSxmPSJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyIi5zcGxpdCgiICIpO2ZvcihwIGluIGM9eyIlYSI6ZT0+ZFtlLkdhXS5zdWJzdHJpbmcoMCwzKSwiJUEiOmU9PmRbZS5HYV0sIiViIjplPT5mW2UuTmFdLnN1YnN0cmluZygwLDMpLCIlQiI6ZT0+ZltlLk5hXSwiJUMiOmU9PnMoKGUuS2ErMTkwMCkvMTAwfDAsMiksIiVkIjplPT5zKGUuUWEsMiksIiVlIjplPT5vKGUuUWEsMiwiICIpLCIlZyI6ZT0+bChlKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJUciOmU9PmwoZSksIiVIIjplPT5zKGUuTWEsMiksIiVJIjplPT4oMD09KGU9ZS5NYSk/ZT0xMjoxMjxlJiYoZS09MTIpLHMoZSwyKSksIiVqIjplPT57Zm9yKHZhciB0PTAsbj0wO248PWUuTmEtMTt0Kz0oQmUoZS5LYSsxOTAwKT9hdDp1dClbbisrXSk7cmV0dXJuIHMoZS5RYSt0LDMpfSwiJW0iOmU9PnMoZS5OYSsxLDIpLCIlTSI6ZT0+cyhlLmpiLDIpLCIlbiI6KCk9PiJcbiIsIiVwIjplPT4wPD1lLk1hJiYxMj5lLk1hPyJBTSI6IlBNIiwiJVMiOmU9PnMoZS5rYiwyKSwiJXQiOigpPT4iXHQiLCIldSI6ZT0+ZS5HYXx8NywiJVUiOmU9PnMoTWF0aC5mbG9vcigoZS5KYSs3LWUuR2EpLzcpLDIpLCIlViI6ZT0+e3ZhciB0PU1hdGguZmxvb3IoKGUuSmErNy0oZS5HYSs2KSU3KS83KTtpZigyPj0oZS5HYSszNzEtZS5KYS0yKSU3JiZ0KyssdCk1Mz09dCYmKDQ9PShuPShlLkdhKzM3MS1lLkphKSU3KXx8Mz09biYmQmUoZS5LYSl8fCh0PTEpKTtlbHNlIHt0PTUyO3ZhciBuPShlLkdhKzctZS5KYS0xKSU3Oyg0PT1ufHw1PT1uJiZCZShlLkthJTQwMC0xKSkmJnQrKzt9cmV0dXJuIHModCwyKX0sIiV3IjplPT5lLkdhLCIlVyI6ZT0+cyhNYXRoLmZsb29yKChlLkphKzctKGUuR2ErNiklNykvNyksMiksIiV5IjplPT4oZS5LYSsxOTAwKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJVkiOmU9PmUuS2ErMTkwMCwiJXoiOmU9Pnt2YXIgdD0wPD0oZT1lLmliKTtyZXR1cm4gZT1NYXRoLmFicyhlKS82MCwodD8iKyI6Ii0iKStTdHJpbmcoIjAwMDAiKyhlLzYwKjEwMCtlJTYwKSkuc2xpY2UoLTQpfSwiJVoiOmU9PmUubGIsIiUlIjooKT0+IiUifSxuPW4ucmVwbGFjZSgvJSUvZywiXDBcMCIpLGMpbi5pbmNsdWRlcyhwKSYmKG49bi5yZXBsYWNlKG5ldyBSZWdFeHAocCwiZyIpLGNbcF0ocikpKTtyZXR1cm4gcD1mdW5jdGlvbihlKXt2YXIgdD1BcnJheShPZShlKSsxKTtyZXR1cm4gU2UoZSx0LDAsdC5sZW5ndGgpLHR9KG49bi5yZXBsYWNlKC9cMFwwL2csIiUiKSkscC5sZW5ndGg+dD8wOihsdChwLGUpLHAubGVuZ3RoLTEpfWdlLlBhKCk7dmFyIHB0PVtudWxsLGZlLG1lLF9lLFRlLHhlLFBlLEllLEVlLERlLCRlLGtlLEZlLE5lLGplLFJlLExlLEdlLEhlLFFlLGV0LHR0LG50LHJ0LGl0XSxkdD17YjpmdW5jdGlvbihlLHQsbil7dGhyb3cgbmV3IHZlKGU+Pj49MCkuUGEodD4+PjAsbj4+PjApLGV9LE46ZnVuY3Rpb24oZSl7Z3QoZT4+PjAsIXksMSwhbSwxMzEwNzIsITEpLGdlLlNhKCk7fSxrOmZ1bmN0aW9uKGUpe2U+Pj49MCxfP3Bvc3RNZXNzYWdlKHtjbWQ6ImNsZWFudXBUaHJlYWQiLHRocmVhZDplfSk6dWUoZSk7fSxJOndlLGg6VGUsVDp4ZSxFOlBlLEc6SWUsVTpFZSxSOkRlLEo6JGUsUTprZSxvOkZlLEY6TmUsQzpqZSxTOlJlLEQ6TGUscTooKT0+ITAsQTpmdW5jdGlvbihlLHQpeyhlPj4+PTApPT10Pj4+MD9zZXRUaW1lb3V0KCgoKT0+VWUoKSkpOl8/cG9zdE1lc3NhZ2Uoe3RhcmdldFRocmVhZDplLGNtZDoiY2hlY2tNYWlsYm94In0pOihlPWdlLkZhW2VdKSYmZS5wb3N0TWVzc2FnZSh7Y21kOiJjaGVja01haWxib3gifSk7fSxMOmZ1bmN0aW9uKCl7cmV0dXJuIC0xfSxNOk1lLHA6ZnVuY3Rpb24oZSl7diYmZ2UuRmFbZT4+PjBdLnJlZigpO30sdDpmdW5jdGlvbihlLHQsbil7ZT10KzIwOTcxNTI+Pj4wPDQxOTQzMDUtISFlPyhlPj4+MCkrNDI5NDk2NzI5Nip0Ok5hTixuPj4+PTAsZT1uZXcgRGF0ZSgxZTMqZSksaSgpW24+PjI+Pj4wXT1lLmdldFVUQ1NlY29uZHMoKSxpKClbbis0Pj4yPj4+MF09ZS5nZXRVVENNaW51dGVzKCksaSgpW24rOD4+Mj4+PjBdPWUuZ2V0VVRDSG91cnMoKSxpKClbbisxMj4+Mj4+PjBdPWUuZ2V0VVRDRGF0ZSgpLGkoKVtuKzE2Pj4yPj4+MF09ZS5nZXRVVENNb250aCgpLGkoKVtuKzIwPj4yPj4+MF09ZS5nZXRVVENGdWxsWWVhcigpLTE5MDAsaSgpW24rMjQ+PjI+Pj4wXT1lLmdldFVUQ0RheSgpLGU9KGUuZ2V0VGltZSgpLURhdGUuVVRDKGUuZ2V0VVRDRnVsbFllYXIoKSwwLDEsMCwwLDAsMCkpLzg2NGU1fDAsaSgpW24rMjg+PjI+Pj4wXT1lO30sdTpmdW5jdGlvbihlLHQsbil7ZT10KzIwOTcxNTI+Pj4wPDQxOTQzMDUtISFlPyhlPj4+MCkrNDI5NDk2NzI5Nip0Ok5hTixuPj4+PTAsZT1uZXcgRGF0ZSgxZTMqZSksaSgpW24+PjI+Pj4wXT1lLmdldFNlY29uZHMoKSxpKClbbis0Pj4yPj4+MF09ZS5nZXRNaW51dGVzKCksaSgpW24rOD4+Mj4+PjBdPWUuZ2V0SG91cnMoKSxpKClbbisxMj4+Mj4+PjBdPWUuZ2V0RGF0ZSgpLGkoKVtuKzE2Pj4yPj4+MF09ZS5nZXRNb250aCgpLGkoKVtuKzIwPj4yPj4+MF09ZS5nZXRGdWxsWWVhcigpLTE5MDAsaSgpW24rMjQ+PjI+Pj4wXT1lLmdldERheSgpLHQ9KEJlKGUuZ2V0RnVsbFllYXIoKSk/VmU6emUpW2UuZ2V0TW9udGgoKV0rZS5nZXREYXRlKCktMXwwLGkoKVtuKzI4Pj4yPj4+MF09dCxpKClbbiszNj4+Mj4+PjBdPS02MCplLmdldFRpbWV6b25lT2Zmc2V0KCksdD1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksNiwxKS5nZXRUaW1lem9uZU9mZnNldCgpO3ZhciByPW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDEpLmdldFRpbWV6b25lT2Zmc2V0KCk7ZT0wfCh0IT1yJiZlLmdldFRpbWV6b25lT2Zmc2V0KCk9PU1hdGgubWluKHIsdCkpLGkoKVtuKzMyPj4yPj4+MF09ZTt9LHY6ZnVuY3Rpb24oZSl7ZT4+Pj0wO3ZhciB0PW5ldyBEYXRlKGkoKVtlKzIwPj4yPj4+MF0rMTkwMCxpKClbZSsxNj4+Mj4+PjBdLGkoKVtlKzEyPj4yPj4+MF0saSgpW2UrOD4+Mj4+PjBdLGkoKVtlKzQ+PjI+Pj4wXSxpKClbZT4+Mj4+PjBdLDApLG49aSgpW2UrMzI+PjI+Pj4wXSxyPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSxvPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCkscz1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpLGE9TWF0aC5taW4ocyxvKTtyZXR1cm4gMD5uP2koKVtlKzMyPj4yPj4+MF09TnVtYmVyKG8hPXMmJmE9PXIpOjA8biE9KGE9PXIpJiYobz1NYXRoLm1heChzLG8pLHQuc2V0VGltZSh0LmdldFRpbWUoKSs2ZTQqKCgwPG4/YTpvKS1yKSkpLGkoKVtlKzI0Pj4yPj4+MF09dC5nZXREYXkoKSxuPShCZSh0LmdldEZ1bGxZZWFyKCkpP1ZlOnplKVt0LmdldE1vbnRoKCldK3QuZ2V0RGF0ZSgpLTF8MCxpKClbZSsyOD4+Mj4+PjBdPW4saSgpW2U+PjI+Pj4wXT10LmdldFNlY29uZHMoKSxpKClbZSs0Pj4yPj4+MF09dC5nZXRNaW51dGVzKCksaSgpW2UrOD4+Mj4+PjBdPXQuZ2V0SG91cnMoKSxpKClbZSsxMj4+Mj4+PjBdPXQuZ2V0RGF0ZSgpLGkoKVtlKzE2Pj4yPj4+MF09dC5nZXRNb250aCgpLGkoKVtlKzIwPj4yPj4+MF09dC5nZXRZZWFyKCksZT10LmdldFRpbWUoKS8xZTMsd3QoKEs9ZSwxPD0rTWF0aC5hYnMoSyk/MDxLPytNYXRoLmZsb29yKEsvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoSy0rKH5+Sz4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCkpLGU+Pj4wfSxyOkdlLHM6SGUsejpmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlKXtyZXR1cm4gKGU9ZS50b1RpbWVTdHJpbmcoKS5tYXRjaCgvXCgoW0EtWmEteiBdKylcKSQvKSk/ZVsxXToiR01UIn1lPj4+PTAsdD4+Pj0wLG4+Pj49MDt2YXIgbz0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCksYT1uZXcgRGF0ZShvLDAsMSksdT1uZXcgRGF0ZShvLDYsMSk7bz1hLmdldFRpbWV6b25lT2Zmc2V0KCk7dmFyIGw9dS5nZXRUaW1lem9uZU9mZnNldCgpLGM9TWF0aC5tYXgobyxsKTtzKClbZT4+Mj4+PjBdPTYwKmMsaSgpW3Q+PjI+Pj4wXT1OdW1iZXIobyE9bCksZT1yKGEpLHQ9cih1KSxlPVdlKGUpLHQ9V2UodCksbDxvPyhzKClbbj4+Mj4+PjBdPWUscygpW24rND4+Mj4+PjBdPXQpOihzKClbbj4+Mj4+PjBdPXQscygpW24rND4+Mj4+PjBdPWUpO30sYzooKT0+e25lKCIiKTt9LGw6ZnVuY3Rpb24oKXt9LGk6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX0sVjooKT0+e3Rocm93IHErPTEsInVud2luZCJ9LEI6ZnVuY3Rpb24oKXtyZXR1cm4gNDI5NDkwMTc2MH0sZTooKT0+cGVyZm9ybWFuY2UudGltZU9yaWdpbitwZXJmb3JtYW5jZS5ub3coKSxmOmZ1bmN0aW9uKCl7cmV0dXJuIHY/bigzOTkzKS5jcHVzKCkubGVuZ3RoOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5fSxLOmZ1bmN0aW9uKGUsdCxuLHIpe2ZvcihnZS5wYj10Pj4+MCxLZS5sZW5ndGg9bix0PXI+Pj4wPj4zLHI9MDtyPG47cisrKUtlW3JdPWEoKVt0K3I+Pj4wXTtyZXR1cm4gcHRbZV0uYXBwbHkobnVsbCxLZSl9LHk6ZnVuY3Rpb24oZSl7ZT4+Pj0wO3ZhciB0PW8oKS5sZW5ndGg7aWYoZTw9dHx8NDI5NDkwMTc2MDxlKXJldHVybiAhMTtmb3IodmFyIG49MTs0Pj1uO24qPTIpe3ZhciByPXQqKDErLjIvbik7cj1NYXRoLm1pbihyLGUrMTAwNjYzMjk2KTt2YXIgaT1NYXRoO3I9TWF0aC5tYXgoZSxyKTtlOntpPWkubWluLmNhbGwoaSw0Mjk0OTAxNzYwLHIrKDY1NTM2LXIlNjU1MzYpJTY1NTM2KS0kLmJ1ZmZlci5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTY7dHJ5eyQuZ3JvdyhpKSxCKCk7dmFyIHM9MTticmVhayBlfWNhdGNoKGUpe31zPXZvaWQgMDt9aWYocylyZXR1cm4gITB9cmV0dXJuICExfSxPOlFlLFA6ZXQsajpoZSxnOnR0LG46bnQsdzpydCxtOml0LHg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT4+Pj0wLHQ+Pj49MCxzdChvKCkuc3ViYXJyYXkoZT4+PjAsZSt0Pj4+MCkpLDB9LGE6JHx8Yy53YXNtTWVtb3J5LEg6Y3QsZDpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gY3QoZT4+PjAsdD4+PjAsbj4+PjAscj4+PjApfX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3JldHVybiBlPWUuZXhwb3J0cyxrPWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZT0+KCk9PmUoKT4+PjAsbj1lPT50PT5lKHQpPj4+MDtyZXR1cm4gKGU9T2JqZWN0LmFzc2lnbih7fSxlKSkuX19lcnJub19sb2NhdGlvbj10KGUuX19lcnJub19sb2NhdGlvbiksZS5wdGhyZWFkX3NlbGY9dChlLnB0aHJlYWRfc2VsZiksZS5tYWxsb2M9bihlLm1hbGxvYyksZS5zdGFja1NhdmU9dChlLnN0YWNrU2F2ZSksZS5zdGFja0FsbG9jPW4oZS5zdGFja0FsbG9jKSxlfShlKSxnZS5UYS5wdXNoKGsuc2EpLHo9ay50YSxILnVuc2hpZnQoay5XKSxGPXQsdGUoKSxlfXZhciB0PXthOmR0fTtpZihlZSgpLGMuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gYy5pbnN0YW50aWF0ZVdhc20odCxlKX1jYXRjaChlKXtFKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK2UpLGwoZSk7fShmdW5jdGlvbihlLHQpe3ZhciBuPVk7cmV0dXJuIFB8fCJmdW5jdGlvbiIhPXR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZ3x8cmUobil8fG4uc3RhcnRzV2l0aCgiZmlsZTovLyIpfHx2fHwiZnVuY3Rpb24iIT10eXBlb2YgZmV0Y2g/aWUobixlLHQpOmZldGNoKG4se2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKChyPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyLGUpLnRoZW4odCwoZnVuY3Rpb24ocil7cmV0dXJuIEUoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK3IpLEUoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksaWUobixlLHQpfSkpKSl9KSh0LChmdW5jdGlvbih0KXtlKHQuaW5zdGFuY2UsdC5tb2R1bGUpO30pKS5jYXRjaChsKTt9KCksYy5fT3J0SW5pdD0oZSx0KT0+KGMuX09ydEluaXQ9ay5YKShlLHQpLGMuX09ydEdldExhc3RFcnJvcj0oZSx0KT0+KGMuX09ydEdldExhc3RFcnJvcj1rLlkpKGUsdCksYy5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnM9KGUsdCxuLHIsbyxpLHMsYSx1LGwpPT4oYy5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnM9ay5aKShlLHQsbixyLG8saSxzLGEsdSxsKSxjLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj0oZSx0KT0+KGMuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyPWsuXykoZSx0KSxjLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9KGUsdCxuKT0+KGMuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeT1rLiQpKGUsdCxuKSxjLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnM9ZT0+KGMuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz1rLmFhKShlKSxjLl9PcnRDcmVhdGVTZXNzaW9uPShlLHQsbik9PihjLl9PcnRDcmVhdGVTZXNzaW9uPWsuYmEpKGUsdCxuKSxjLl9PcnRSZWxlYXNlU2Vzc2lvbj1lPT4oYy5fT3J0UmVsZWFzZVNlc3Npb249ay5jYSkoZSksYy5fT3J0R2V0SW5wdXRPdXRwdXRDb3VudD0oZSx0LG4pPT4oYy5fT3J0R2V0SW5wdXRPdXRwdXRDb3VudD1rLmRhKShlLHQsbiksYy5fT3J0R2V0SW5wdXROYW1lPShlLHQpPT4oYy5fT3J0R2V0SW5wdXROYW1lPWsuZWEpKGUsdCksYy5fT3J0R2V0T3V0cHV0TmFtZT0oZSx0KT0+KGMuX09ydEdldE91dHB1dE5hbWU9ay5mYSkoZSx0KSxjLl9PcnRGcmVlPWU9PihjLl9PcnRGcmVlPWsuZ2EpKGUpLGMuX09ydENyZWF0ZVRlbnNvcj0oZSx0LG4scixvKT0+KGMuX09ydENyZWF0ZVRlbnNvcj1rLmhhKShlLHQsbixyLG8pLGMuX09ydEdldFRlbnNvckRhdGE9KGUsdCxuLHIsbyk9PihjLl9PcnRHZXRUZW5zb3JEYXRhPWsuaWEpKGUsdCxuLHIsbyksYy5fT3J0UmVsZWFzZVRlbnNvcj1lPT4oYy5fT3J0UmVsZWFzZVRlbnNvcj1rLmphKShlKSxjLl9PcnRDcmVhdGVSdW5PcHRpb25zPShlLHQsbixyKT0+KGMuX09ydENyZWF0ZVJ1bk9wdGlvbnM9ay5rYSkoZSx0LG4sciksYy5fT3J0QWRkUnVuQ29uZmlnRW50cnk9KGUsdCxuKT0+KGMuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PWsubGEpKGUsdCxuKSxjLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1lPT4oYy5fT3J0UmVsZWFzZVJ1bk9wdGlvbnM9ay5tYSkoZSksYy5fT3J0UnVuPShlLHQsbixyLG8saSxzLGEpPT4oYy5fT3J0UnVuPWsubmEpKGUsdCxuLHIsbyxpLHMsYSksYy5fT3J0RW5kUHJvZmlsaW5nPWU9PihjLl9PcnRFbmRQcm9maWxpbmc9ay5vYSkoZSk7dmFyIGZ0PWMuX3B0aHJlYWRfc2VsZj0oKT0+KGZ0PWMuX3B0aHJlYWRfc2VsZj1rLnBhKSgpLGh0PWMuX21hbGxvYz1lPT4oaHQ9Yy5fbWFsbG9jPWsucWEpKGUpO2MuX2ZyZWU9ZT0+KGMuX2ZyZWU9ay5yYSkoZSksYy5fX2Vtc2NyaXB0ZW5fdGxzX2luaXQ9KCk9PihjLl9fZW1zY3JpcHRlbl90bHNfaW5pdD1rLnNhKSgpO3ZhciBndD1jLl9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdD0oZSx0LG4scixvLGkpPT4oZ3Q9Yy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQ9ay51YSkoZSx0LG4scixvLGkpO2MuX19lbXNjcmlwdGVuX3RocmVhZF9jcmFzaGVkPSgpPT4oYy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2NyYXNoZWQ9ay52YSkoKTt2YXIgYnQsbXQ9KGUsdCxuLHIpPT4obXQ9ay53YSkoZSx0LG4scikseXQ9ZT0+KHl0PWsueGEpKGUpLHZ0PWMuX19lbXNjcmlwdGVuX3RocmVhZF9leGl0PWU9Pih2dD1jLl9fZW1zY3JpcHRlbl90aHJlYWRfZXhpdD1rLnlhKShlKSxfdD1jLl9fZW1zY3JpcHRlbl9jaGVja19tYWlsYm94PSgpPT4oX3Q9Yy5fX2Vtc2NyaXB0ZW5fY2hlY2tfbWFpbGJveD1rLnphKSgpLHd0PWU9Pih3dD1rLkFhKShlKSxUdD0oZSx0KT0+KFR0PWsuQmEpKGUsdCkseHQ9KCk9Pih4dD1rLkNhKSgpLE90PWU9PihPdD1rLkRhKShlKSxTdD1lPT4oU3Q9ay5FYSkoZSk7ZnVuY3Rpb24gQXQoKXtmdW5jdGlvbiBlKCl7aWYoIWJ0JiYoYnQ9ITAsYy5jYWxsZWRSdW49ITAsIVUpJiYoX3x8YmUoSCksdShjKSxjLm9uUnVudGltZUluaXRpYWxpemVkJiZjLm9uUnVudGltZUluaXRpYWxpemVkKCksIV8pKXtpZihjLnBvc3RSdW4pZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBjLnBvc3RSdW4mJihjLnBvc3RSdW49W2MucG9zdFJ1bl0pO2MucG9zdFJ1bi5sZW5ndGg7KXt2YXIgZT1jLnBvc3RSdW4uc2hpZnQoKTtXLnVuc2hpZnQoZSk7fWJlKFcpO319aWYoISgwPEopKWlmKF8pdShjKSxffHxiZShIKSxzdGFydFdvcmtlcihjKTtlbHNlIHtpZihjLnByZVJ1bilmb3IoImZ1bmN0aW9uIj09dHlwZW9mIGMucHJlUnVuJiYoYy5wcmVSdW49W2MucHJlUnVuXSk7Yy5wcmVSdW4ubGVuZ3RoOylHLnVuc2hpZnQoYy5wcmVSdW4uc2hpZnQoKSk7YmUoRyksMDxKfHwoYy5zZXRTdGF0dXM/KGMuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Muc2V0U3RhdHVzKCIiKTt9KSwxKSxlKCk7fSksMSkpOmUoKSk7fX1pZihjLmtlZXBSdW50aW1lQWxpdmU9WCxjLndhc21NZW1vcnk9JCxjLnN0YWNrQWxsb2M9U3QsYy5zdGFja1NhdmU9eHQsYy5zdGFja1Jlc3RvcmU9T3QsYy5VVEY4VG9TdHJpbmc9ZGUsYy5zdHJpbmdUb1VURjg9QWUsYy5sZW5ndGhCeXRlc1VURjg9T2UsYy5FeGl0U3RhdHVzPXNlLGMuUFRocmVhZD1nZSxRPWZ1bmN0aW9uIGUoKXtidHx8QXQoKSxidHx8KFE9ZSk7fSxjLnByZUluaXQpZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBjLnByZUluaXQmJihjLnByZUluaXQ9W2MucHJlSW5pdF0pOzA8Yy5wcmVJbml0Lmxlbmd0aDspYy5wcmVJbml0LnBvcCgpKCk7cmV0dXJuIEF0KCksZS5yZWFkeX0pO2UuZXhwb3J0cz1vO30sOTMyOihlLHQsbik9Pnt2YXIgcixvPShyPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwLCJ1bmRlZmluZWQiIT10eXBlb2YgX19maWxlbmFtZSYmKHI9cnx8X19maWxlbmFtZSksZnVuY3Rpb24oZT17fSl7dmFyIHQsbyxpPWU7aS5yZWFkeT1uZXcgUHJvbWlzZSgoKGUsbik9Pnt0PWUsbz1uO30pKTt2YXIgcyxhLHUsbD1PYmplY3QuYXNzaWduKHt9LGkpLGM9Ii4vdGhpcy5wcm9ncmFtIixwPShlLHQpPT57dGhyb3cgdH0sZD0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyxmPSJmdW5jdGlvbiI9PXR5cGVvZiBpbXBvcnRTY3JpcHRzLGg9Im9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiYib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMmJiJzdHJpbmciPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLGc9IiI7aWYoaCl7dmFyIGI9bigxMzg0KSxtPW4oOTA4KTtnPWY/bS5kaXJuYW1lKGcpKyIvIjpfX2Rpcm5hbWUrIi8iLHM9KGUsdCk9PihlPWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpP25ldyBVUkwoZSk6bS5ub3JtYWxpemUoZSksYi5yZWFkRmlsZVN5bmMoZSx0P3ZvaWQgMDoidXRmOCIpKSx1PWU9PigoZT1zKGUsITApKS5idWZmZXJ8fChlPW5ldyBVaW50OEFycmF5KGUpKSxlKSxhPShlLHQsbixyPSEwKT0+e2U9ZS5zdGFydHNXaXRoKCJmaWxlOi8vIik/bmV3IFVSTChlKTptLm5vcm1hbGl6ZShlKSxiLnJlYWRGaWxlKGUscj92b2lkIDA6InV0ZjgiLCgoZSxvKT0+e2U/bihlKTp0KHI/by5idWZmZXI6byk7fSkpO30sIWkudGhpc1Byb2dyYW0mJjE8cHJvY2Vzcy5hcmd2Lmxlbmd0aCYmKGM9cHJvY2Vzcy5hcmd2WzFdLnJlcGxhY2UoL1xcL2csIi8iKSkscHJvY2Vzcy5hcmd2LnNsaWNlKDIpLHA9KGUsdCk9Pnt0aHJvdyBwcm9jZXNzLmV4aXRDb2RlPWUsdH0saS5pbnNwZWN0PSgpPT4iW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0iO31lbHNlIChkfHxmKSYmKGY/Zz1zZWxmLmxvY2F0aW9uLmhyZWY6InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKGc9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHImJihnPXIpLGc9MCE9PWcuaW5kZXhPZigiYmxvYjoiKT9nLnN1YnN0cigwLGcucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKToiIixzPWU9Pnt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHQub3BlbigiR0VUIixlLCExKSx0LnNlbmQobnVsbCksdC5yZXNwb25zZVRleHR9LGYmJih1PWU9Pnt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHQub3BlbigiR0VUIixlLCExKSx0LnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLHQuc2VuZChudWxsKSxuZXcgVWludDhBcnJheSh0LnJlc3BvbnNlKX0pLGE9KGUsdCxuKT0+e3ZhciByPW5ldyBYTUxIdHRwUmVxdWVzdDtyLm9wZW4oIkdFVCIsZSwhMCksci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixyLm9ubG9hZD0oKT0+ezIwMD09ci5zdGF0dXN8fDA9PXIuc3RhdHVzJiZyLnJlc3BvbnNlP3Qoci5yZXNwb25zZSk6bigpO30sci5vbmVycm9yPW4sci5zZW5kKG51bGwpO30pO3ZhciB5LHY9aS5wcmludHx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSxfPWkucHJpbnRFcnJ8fGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKGksbCksbD1udWxsLGkudGhpc1Byb2dyYW0mJihjPWkudGhpc1Byb2dyYW0pLGkucXVpdCYmKHA9aS5xdWl0KSxpLndhc21CaW5hcnkmJih5PWkud2FzbUJpbmFyeSk7dmFyIHc9aS5ub0V4aXRSdW50aW1lfHwhMDsib2JqZWN0IiE9dHlwZW9mIFdlYkFzc2VtYmx5JiZNKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIFQseCxPLFMsQSxQLEk9ITE7ZnVuY3Rpb24gRSgpe3ZhciBlPVQuYnVmZmVyO2kuSEVBUDg9Tz1uZXcgSW50OEFycmF5KGUpLGkuSEVBUDE2PW5ldyBJbnQxNkFycmF5KGUpLGkuSEVBUDMyPUE9bmV3IEludDMyQXJyYXkoZSksaS5IRUFQVTg9Uz1uZXcgVWludDhBcnJheShlKSxpLkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGUpLGkuSEVBUFUzMj1QPW5ldyBVaW50MzJBcnJheShlKSxpLkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShlKSxpLkhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShlKTt9dmFyIEQ9W10sJD1bXSxrPVtdO2Z1bmN0aW9uIEYoKXt2YXIgZT1pLnByZVJ1bi5zaGlmdCgpO0QudW5zaGlmdChlKTt9dmFyIE4saixSPTAsQz1udWxsO2Z1bmN0aW9uIE0oZSl7dGhyb3cgaS5vbkFib3J0JiZpLm9uQWJvcnQoZSksXyhlPSJBYm9ydGVkKCIrZSsiKSIpLEk9ITAsZT1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKGUrIi4gQnVpbGQgd2l0aCAtc0FTU0VSVElPTlMgZm9yIG1vcmUgaW5mby4iKSxvKGUpLGV9ZnVuY3Rpb24gVShlKXtyZXR1cm4gZS5zdGFydHNXaXRoKCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIil9aWYoIVUoTj0ib3J0LXdhc20ud2FzbSIpKXt2YXIgQj1OO049aS5sb2NhdGVGaWxlP2kubG9jYXRlRmlsZShCLGcpOmcrQjt9ZnVuY3Rpb24gVihlKXtpZihlPT1OJiZ5KXJldHVybiBuZXcgVWludDhBcnJheSh5KTtpZih1KXJldHVybiB1KGUpO3Rocm93ICJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9ZnVuY3Rpb24geihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKCF5JiYoZHx8Zikpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBmZXRjaCYmIWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpKXJldHVybiBmZXRjaChlLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbigodD0+e2lmKCF0Lm9rKXRocm93ICJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciK2UrIiciO3JldHVybiB0LmFycmF5QnVmZmVyKCl9KSkuY2F0Y2goKCgpPT5WKGUpKSk7aWYoYSlyZXR1cm4gbmV3IFByb21pc2UoKCh0LG4pPT57YShlLChlPT50KG5ldyBVaW50OEFycmF5KGUpKSksbik7fSkpfXJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+VihlKSkpfShlKS50aGVuKChlPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShlLHQpKSkudGhlbigoZT0+ZSkpLnRoZW4obiwoZT0+e18oImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrZSksTShlKTt9KSl9ZnVuY3Rpb24gRyhlKXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiLHRoaXMubWVzc2FnZT1gUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgke2V9KWAsdGhpcy5zdGF0dXM9ZTt9dmFyIEg9ZT0+e2Zvcig7MDxlLmxlbmd0aDspZS5zaGlmdCgpKGkpO307ZnVuY3Rpb24gVyhlKXt0aGlzLnFhPWUtMjQsdGhpcy52YT1mdW5jdGlvbihlKXtQW3RoaXMucWErND4+Mj4+PjBdPWU7fSx0aGlzLnVhPWZ1bmN0aW9uKGUpe1BbdGhpcy5xYSs4Pj4yPj4+MF09ZTt9LHRoaXMuc2E9ZnVuY3Rpb24oZSx0KXt0aGlzLnRhKCksdGhpcy52YShlKSx0aGlzLnVhKHQpO30sdGhpcy50YT1mdW5jdGlvbigpe1BbdGhpcy5xYSsxNj4+Mj4+PjBdPTA7fTt9dmFyIHEsWD0idW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxZPShlLHQsbik9Pnt2YXIgcj0odD4+Pj0wKStuO2ZvcihuPXQ7ZVtuXSYmIShuPj1yKTspKytuO2lmKDE2PG4tdCYmZS5idWZmZXImJlgpcmV0dXJuIFguZGVjb2RlKGUuc3ViYXJyYXkodCxuKSk7Zm9yKHI9IiI7dDxuOyl7dmFyIG89ZVt0KytdO2lmKDEyOCZvKXt2YXIgaT02MyZlW3QrK107aWYoMTkyPT0oMjI0Jm8pKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKDMxJm8pPDw2fGkpO2Vsc2Uge3ZhciBzPTYzJmVbdCsrXTs2NTUzNj4obz0yMjQ9PSgyNDAmbyk/KDE1Jm8pPDwxMnxpPDw2fHM6KDcmbyk8PDE4fGk8PDEyfHM8PDZ8NjMmZVt0KytdKT9yKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pOihvLT02NTUzNixyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fG8+PjEwLDU2MzIwfDEwMjMmbykpO319ZWxzZSByKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pO31yZXR1cm4gcn0sSz0oZSx0KT0+KGU+Pj49MCk/WShTLGUsdCk6IiIsSj1lPT57Zm9yKHZhciB0PTAsbj0wO248ZS5sZW5ndGg7KytuKXt2YXIgcj1lLmNoYXJDb2RlQXQobik7MTI3Pj1yP3QrKzoyMDQ3Pj1yP3QrPTI6NTUyOTY8PXImJjU3MzQzPj1yPyh0Kz00LCsrbik6dCs9Mzt9cmV0dXJuIHR9LFo9KGUsdCxuLHIpPT57aWYoISgwPHIpKXJldHVybiAwO3ZhciBvPW4+Pj49MDtyPW4rci0xO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7KytpKXt2YXIgcz1lLmNoYXJDb2RlQXQoaSk7aWYoNTUyOTY8PXMmJjU3MzQzPj1zJiYocz02NTUzNisoKDEwMjMmcyk8PDEwKXwxMDIzJmUuY2hhckNvZGVBdCgrK2kpKSwxMjc+PXMpe2lmKG4+PXIpYnJlYWs7dFtuKys+Pj4wXT1zO31lbHNlIHtpZigyMDQ3Pj1zKXtpZihuKzE+PXIpYnJlYWs7dFtuKys+Pj4wXT0xOTJ8cz4+Njt9ZWxzZSB7aWYoNjU1MzU+PXMpe2lmKG4rMj49cilicmVhazt0W24rKz4+PjBdPTIyNHxzPj4xMjt9ZWxzZSB7aWYobiszPj1yKWJyZWFrO3RbbisrPj4+MF09MjQwfHM+PjE4LHRbbisrPj4+MF09MTI4fHM+PjEyJjYzO310W24rKz4+PjBdPTEyOHxzPj42JjYzO310W24rKz4+PjBdPTEyOHw2MyZzO319cmV0dXJuIHRbbj4+PjBdPTAsbi1vfSxRPWU9PjA9PWUlNCYmKDAhPWUlMTAwfHwwPT1lJTQwMCksZWU9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV0sdGU9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF0sbmU9ZT0+e3ZhciB0PUooZSkrMSxuPXBlKHQpO3JldHVybiBuJiZaKGUsUyxuLHQpLG59LHJlPXt9LG9lPSgpPT57aWYoIXEpe3ZhciBlLHQ9e1VTRVI6IndlYl91c2VyIixMT0dOQU1FOiJ3ZWJfdXNlciIsUEFUSDoiLyIsUFdEOiIvIixIT01FOiIvaG9tZS93ZWJfdXNlciIsTEFORzooIm9iamVjdCI9PXR5cGVvZiBuYXZpZ2F0b3ImJm5hdmlnYXRvci5sYW5ndWFnZXMmJm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fCJDIikucmVwbGFjZSgiLSIsIl8iKSsiLlVURi04IixfOmN8fCIuL3RoaXMucHJvZ3JhbSJ9O2ZvcihlIGluIHJlKXZvaWQgMD09PXJlW2VdP2RlbGV0ZSB0W2VdOnRbZV09cmVbZV07dmFyIG49W107Zm9yKGUgaW4gdCluLnB1c2goYCR7ZX09JHt0W2VdfWApO3E9bjt9cmV0dXJuIHF9LGllPVtudWxsLFtdLFtdXSxzZT1lPT4oc2U9KCgpPT57aWYoIm9iamVjdCI9PXR5cGVvZiBjcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXJldHVybiBlPT5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpO2lmKGgpdHJ5e3ZhciBlPW4oNzYwKTtpZihlLnJhbmRvbUZpbGxTeW5jKXJldHVybiB0PT5lLnJhbmRvbUZpbGxTeW5jKHQpO3ZhciB0PWUucmFuZG9tQnl0ZXM7cmV0dXJuIGU9PihlLnNldCh0KGUuYnl0ZUxlbmd0aCkpLGUpfWNhdGNoKGUpe31NKCJpbml0UmFuZG9tRGV2aWNlIik7fSkoKSkoZSksYWU9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSx1ZT1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO2Z1bmN0aW9uIGxlKGUsdCxuLHIpe2Z1bmN0aW9uIG8oZSx0LG4pe2ZvcihlPSJudW1iZXIiPT10eXBlb2YgZT9lLnRvU3RyaW5nKCk6ZXx8IiI7ZS5sZW5ndGg8dDspZT1uWzBdK2U7cmV0dXJuIGV9ZnVuY3Rpb24gaShlLHQpe3JldHVybiBvKGUsdCwiMCIpfWZ1bmN0aW9uIHMoZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiAwPmU/LTE6MDxlPzE6MH12YXIgcjtyZXR1cm4gMD09PShyPW4oZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSkpJiYwPT09KHI9bihlLmdldE1vbnRoKCktdC5nZXRNb250aCgpKSkmJihyPW4oZS5nZXREYXRlKCktdC5nZXREYXRlKCkpKSxyfWZ1bmN0aW9uIGEoZSl7c3dpdGNoKGUuZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMjkpO2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMik7Y2FzZSA0OnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKTtjYXNlIDU6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMwKX19ZnVuY3Rpb24gdShlKXt2YXIgdD1lLm1hO2ZvcihlPW5ldyBEYXRlKG5ldyBEYXRlKGUubmErMTkwMCwwLDEpLmdldFRpbWUoKSk7MDx0Oyl7dmFyIG49ZS5nZXRNb250aCgpLHI9KFEoZS5nZXRGdWxsWWVhcigpKT9hZTp1ZSlbbl07aWYoISh0PnItZS5nZXREYXRlKCkpKXtlLnNldERhdGUoZS5nZXREYXRlKCkrdCk7YnJlYWt9dC09ci1lLmdldERhdGUoKSsxLGUuc2V0RGF0ZSgxKSwxMT5uP2Uuc2V0TW9udGgobisxKTooZS5zZXRNb250aCgwKSxlLnNldEZ1bGxZZWFyKGUuZ2V0RnVsbFllYXIoKSsxKSk7fXJldHVybiBuPW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSsxLDAsNCksdD1hKG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDQpKSxuPWEobiksMD49cyh0LGUpPzA+PXMobixlKT9lLmdldEZ1bGxZZWFyKCkrMTplLmdldEZ1bGxZZWFyKCk6ZS5nZXRGdWxsWWVhcigpLTF9ZT4+Pj0wLHQ+Pj49MCxuPj4+PTA7dmFyIGw9QVs0MCsocj4+Pj0wKT4+Mj4+PjBdO2Zvcih2YXIgYyBpbiByPXt5YTpBW3I+PjI+Pj4wXSx4YTpBW3IrND4+Mj4+PjBdLG9hOkFbcis4Pj4yPj4+MF0scmE6QVtyKzEyPj4yPj4+MF0scGE6QVtyKzE2Pj4yPj4+MF0sbmE6QVtyKzIwPj4yPj4+MF0saGE6QVtyKzI0Pj4yPj4+MF0sbWE6QVtyKzI4Pj4yPj4+MF0sQWE6QVtyKzMyPj4yPj4+MF0sd2E6QVtyKzM2Pj4yPj4+MF0semE6bD9LKGwpOiIifSxuPUsobiksbD17IiVjIjoiJWEgJWIgJWQgJUg6JU06JVMgJVkiLCIlRCI6IiVtLyVkLyV5IiwiJUYiOiIlWS0lbS0lZCIsIiVoIjoiJWIiLCIlciI6IiVJOiVNOiVTICVwIiwiJVIiOiIlSDolTSIsIiVUIjoiJUg6JU06JVMiLCIleCI6IiVtLyVkLyV5IiwiJVgiOiIlSDolTTolUyIsIiVFYyI6IiVjIiwiJUVDIjoiJUMiLCIlRXgiOiIlbS8lZC8leSIsIiVFWCI6IiVIOiVNOiVTIiwiJUV5IjoiJXkiLCIlRVkiOiIlWSIsIiVPZCI6IiVkIiwiJU9lIjoiJWUiLCIlT0giOiIlSCIsIiVPSSI6IiVJIiwiJU9tIjoiJW0iLCIlT00iOiIlTSIsIiVPUyI6IiVTIiwiJU91IjoiJXUiLCIlT1UiOiIlVSIsIiVPViI6IiVWIiwiJU93IjoiJXciLCIlT1ciOiIlVyIsIiVPeSI6IiV5In0pbj1uLnJlcGxhY2UobmV3IFJlZ0V4cChjLCJnIiksbFtjXSk7dmFyIHA9IlN1bmRheSBNb25kYXkgVHVlc2RheSBXZWRuZXNkYXkgVGh1cnNkYXkgRnJpZGF5IFNhdHVyZGF5Ii5zcGxpdCgiICIpLGQ9IkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXIiLnNwbGl0KCIgIik7Zm9yKGMgaW4gbD17IiVhIjplPT5wW2UuaGFdLnN1YnN0cmluZygwLDMpLCIlQSI6ZT0+cFtlLmhhXSwiJWIiOmU9PmRbZS5wYV0uc3Vic3RyaW5nKDAsMyksIiVCIjplPT5kW2UucGFdLCIlQyI6ZT0+aSgoZS5uYSsxOTAwKS8xMDB8MCwyKSwiJWQiOmU9PmkoZS5yYSwyKSwiJWUiOmU9Pm8oZS5yYSwyLCIgIiksIiVnIjplPT51KGUpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpLCIlRyI6ZT0+dShlKSwiJUgiOmU9PmkoZS5vYSwyKSwiJUkiOmU9PigwPT0oZT1lLm9hKT9lPTEyOjEyPGUmJihlLT0xMiksaShlLDIpKSwiJWoiOmU9Pntmb3IodmFyIHQ9MCxuPTA7bjw9ZS5wYS0xO3QrPShRKGUubmErMTkwMCk/YWU6dWUpW24rK10pO3JldHVybiBpKGUucmErdCwzKX0sIiVtIjplPT5pKGUucGErMSwyKSwiJU0iOmU9PmkoZS54YSwyKSwiJW4iOigpPT4iXG4iLCIlcCI6ZT0+MDw9ZS5vYSYmMTI+ZS5vYT8iQU0iOiJQTSIsIiVTIjplPT5pKGUueWEsMiksIiV0IjooKT0+Ilx0IiwiJXUiOmU9PmUuaGF8fDcsIiVVIjplPT5pKE1hdGguZmxvb3IoKGUubWErNy1lLmhhKS83KSwyKSwiJVYiOmU9Pnt2YXIgdD1NYXRoLmZsb29yKChlLm1hKzctKGUuaGErNiklNykvNyk7aWYoMj49KGUuaGErMzcxLWUubWEtMiklNyYmdCsrLHQpNTM9PXQmJig0PT0obj0oZS5oYSszNzEtZS5tYSklNyl8fDM9PW4mJlEoZS5uYSl8fCh0PTEpKTtlbHNlIHt0PTUyO3ZhciBuPShlLmhhKzctZS5tYS0xKSU3Oyg0PT1ufHw1PT1uJiZRKGUubmElNDAwLTEpKSYmdCsrO31yZXR1cm4gaSh0LDIpfSwiJXciOmU9PmUuaGEsIiVXIjplPT5pKE1hdGguZmxvb3IoKGUubWErNy0oZS5oYSs2KSU3KS83KSwyKSwiJXkiOmU9PihlLm5hKzE5MDApLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpLCIlWSI6ZT0+ZS5uYSsxOTAwLCIleiI6ZT0+e3ZhciB0PTA8PShlPWUud2EpO3JldHVybiBlPU1hdGguYWJzKGUpLzYwLCh0PyIrIjoiLSIpK1N0cmluZygiMDAwMCIrKGUvNjAqMTAwK2UlNjApKS5zbGljZSgtNCl9LCIlWiI6ZT0+ZS56YSwiJSUiOigpPT4iJSJ9LG49bi5yZXBsYWNlKC8lJS9nLCJcMFwwIiksbCluLmluY2x1ZGVzKGMpJiYobj1uLnJlcGxhY2UobmV3IFJlZ0V4cChjLCJnIiksbFtjXShyKSkpO3JldHVybiBjPWZ1bmN0aW9uKGUpe3ZhciB0PUFycmF5KEooZSkrMSk7cmV0dXJuIFooZSx0LDAsdC5sZW5ndGgpLHR9KG49bi5yZXBsYWNlKC9cMFwwL2csIiUiKSksYy5sZW5ndGg+dD8wOihPLnNldChjLGU+Pj4wKSxjLmxlbmd0aC0xKX12YXIgY2U9e2E6ZnVuY3Rpb24oZSx0LG4pe3Rocm93IG5ldyBXKGU+Pj49MCkuc2EodD4+PjAsbj4+PjApLGV9LGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sSTpmdW5jdGlvbigpe30seTpmdW5jdGlvbigpe30sQTpmdW5jdGlvbigpe30sSzpmdW5jdGlvbigpe3JldHVybiAwfSxHOmZ1bmN0aW9uKCl7fSxCOmZ1bmN0aW9uKCl7fSxGOmZ1bmN0aW9uKCl7fSxnOmZ1bmN0aW9uKCl7fSx6OmZ1bmN0aW9uKCl7fSx3OmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7fSx4OmZ1bmN0aW9uKCl7fSxrOigpPT4hMCxuOmZ1bmN0aW9uKGUsdCxuKXtlPXQrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKSs0Mjk0OTY3Mjk2KnQ6TmFOLG4+Pj49MCxlPW5ldyBEYXRlKDFlMyplKSxBW24+PjI+Pj4wXT1lLmdldFVUQ1NlY29uZHMoKSxBW24rND4+Mj4+PjBdPWUuZ2V0VVRDTWludXRlcygpLEFbbis4Pj4yPj4+MF09ZS5nZXRVVENIb3VycygpLEFbbisxMj4+Mj4+PjBdPWUuZ2V0VVRDRGF0ZSgpLEFbbisxNj4+Mj4+PjBdPWUuZ2V0VVRDTW9udGgoKSxBW24rMjA+PjI+Pj4wXT1lLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCxBW24rMjQ+PjI+Pj4wXT1lLmdldFVUQ0RheSgpLEFbbisyOD4+Mj4+PjBdPShlLmdldFRpbWUoKS1EYXRlLlVUQyhlLmdldFVUQ0Z1bGxZZWFyKCksMCwxLDAsMCwwLDApKS84NjRlNXwwO30sbzpmdW5jdGlvbihlLHQsbil7ZT10KzIwOTcxNTI+Pj4wPDQxOTQzMDUtISFlPyhlPj4+MCkrNDI5NDk2NzI5Nip0Ok5hTixuPj4+PTAsZT1uZXcgRGF0ZSgxZTMqZSksQVtuPj4yPj4+MF09ZS5nZXRTZWNvbmRzKCksQVtuKzQ+PjI+Pj4wXT1lLmdldE1pbnV0ZXMoKSxBW24rOD4+Mj4+PjBdPWUuZ2V0SG91cnMoKSxBW24rMTI+PjI+Pj4wXT1lLmdldERhdGUoKSxBW24rMTY+PjI+Pj4wXT1lLmdldE1vbnRoKCksQVtuKzIwPj4yPj4+MF09ZS5nZXRGdWxsWWVhcigpLTE5MDAsQVtuKzI0Pj4yPj4+MF09ZS5nZXREYXkoKSxBW24rMjg+PjI+Pj4wXT0oUShlLmdldEZ1bGxZZWFyKCkpP2VlOnRlKVtlLmdldE1vbnRoKCldK2UuZ2V0RGF0ZSgpLTF8MCxBW24rMzY+PjI+Pj4wXT0tNjAqZS5nZXRUaW1lem9uZU9mZnNldCgpLHQ9bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgcj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpO0FbbiszMj4+Mj4+PjBdPTB8KHQhPXImJmUuZ2V0VGltZXpvbmVPZmZzZXQoKT09TWF0aC5taW4ocix0KSk7fSxwOmZ1bmN0aW9uKGUpe2U+Pj49MDt2YXIgdD1uZXcgRGF0ZShBW2UrMjA+PjI+Pj4wXSsxOTAwLEFbZSsxNj4+Mj4+PjBdLEFbZSsxMj4+Mj4+PjBdLEFbZSs4Pj4yPj4+MF0sQVtlKzQ+PjI+Pj4wXSxBW2U+PjI+Pj4wXSwwKSxuPUFbZSszMj4+Mj4+PjBdLHI9dC5nZXRUaW1lem9uZU9mZnNldCgpLG89bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKSxpPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSwwLDEpLmdldFRpbWV6b25lT2Zmc2V0KCkscz1NYXRoLm1pbihpLG8pO3JldHVybiAwPm4/QVtlKzMyPj4yPj4+MF09TnVtYmVyKG8hPWkmJnM9PXIpOjA8biE9KHM9PXIpJiYobz1NYXRoLm1heChpLG8pLHQuc2V0VGltZSh0LmdldFRpbWUoKSs2ZTQqKCgwPG4/czpvKS1yKSkpLEFbZSsyND4+Mj4+PjBdPXQuZ2V0RGF5KCksQVtlKzI4Pj4yPj4+MF09KFEodC5nZXRGdWxsWWVhcigpKT9lZTp0ZSlbdC5nZXRNb250aCgpXSt0LmdldERhdGUoKS0xfDAsQVtlPj4yPj4+MF09dC5nZXRTZWNvbmRzKCksQVtlKzQ+PjI+Pj4wXT10LmdldE1pbnV0ZXMoKSxBW2UrOD4+Mj4+PjBdPXQuZ2V0SG91cnMoKSxBW2UrMTI+PjI+Pj4wXT10LmdldERhdGUoKSxBW2UrMTY+PjI+Pj4wXT10LmdldE1vbnRoKCksQVtlKzIwPj4yPj4+MF09dC5nZXRZZWFyKCksZT10LmdldFRpbWUoKS8xZTMsZmUoKGo9ZSwxPD0rTWF0aC5hYnMoaik/MDxqPytNYXRoLmZsb29yKGovNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoai0rKH5+aj4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCkpLGU+Pj4wfSxsOmZ1bmN0aW9uKCl7cmV0dXJuIC01Mn0sbTpmdW5jdGlvbigpe30sdTpmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlKXtyZXR1cm4gKGU9ZS50b1RpbWVTdHJpbmcoKS5tYXRjaCgvXCgoW0EtWmEteiBdKylcKSQvKSk/ZVsxXToiR01UIn1uPj4+PTA7dmFyIG89KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLGk9bmV3IERhdGUobywwLDEpLHM9bmV3IERhdGUobyw2LDEpO289aS5nZXRUaW1lem9uZU9mZnNldCgpO3ZhciBhPXMuZ2V0VGltZXpvbmVPZmZzZXQoKTtQW2U+Pj4wPj4yPj4+MF09NjAqTWF0aC5tYXgobyxhKSxBW3Q+Pj4wPj4yPj4+MF09TnVtYmVyKG8hPWEpLGU9cihpKSx0PXIocyksZT1uZShlKSx0PW5lKHQpLGE8bz8oUFtuPj4yPj4+MF09ZSxQW24rND4+Mj4+PjBdPXQpOihQW24+PjI+Pj4wXT10LFBbbis0Pj4yPj4+MF09ZSk7fSxkOigpPT57TSgiIik7fSxoOmZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93KCl9LHY6ZnVuY3Rpb24oKXtyZXR1cm4gNDI5NDkwMTc2MH0sYjooKT0+cGVyZm9ybWFuY2Uubm93KCksSjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ+Pj49MCxTLmNvcHlXaXRoaW4oZT4+PjA+Pj4wLHQ+Pj4wLHQrKG4+Pj4wKT4+PjApfSx0OmZ1bmN0aW9uKGUpe2U+Pj49MDt2YXIgdD1TLmxlbmd0aDtpZig0Mjk0OTAxNzYwPGUpcmV0dXJuICExO2Zvcih2YXIgbj0xOzQ+PW47bio9Mil7dmFyIHI9dCooMSsuMi9uKTtyPU1hdGgubWluKHIsZSsxMDA2NjMyOTYpO3ZhciBvPU1hdGg7cj1NYXRoLm1heChlLHIpO2U6e289by5taW4uY2FsbChvLDQyOTQ5MDE3NjAscisoNjU1MzYtciU2NTUzNiklNjU1MzYpLVQuYnVmZmVyLmJ5dGVMZW5ndGgrNjU1MzU+Pj4xNjt0cnl7VC5ncm93KG8pLEUoKTt2YXIgaT0xO2JyZWFrIGV9Y2F0Y2goZSl7fWk9dm9pZCAwO31pZihpKXJldHVybiAhMH1yZXR1cm4gITF9LEQ6ZnVuY3Rpb24oZSx0KXtlPj4+PTAsdD4+Pj0wO3ZhciBuPTA7cmV0dXJuIG9lKCkuZm9yRWFjaCgoZnVuY3Rpb24ocixvKXt2YXIgaT10K247Zm9yKG89UFtlKzQqbz4+Mj4+PjBdPWksaT0wO2k8ci5sZW5ndGg7KytpKU9bbysrPj4wPj4+MF09ci5jaGFyQ29kZUF0KGkpO09bbz4+MD4+PjBdPTAsbis9ci5sZW5ndGgrMTt9KSksMH0sRTpmdW5jdGlvbihlLHQpe2U+Pj49MCx0Pj4+PTA7dmFyIG49b2UoKTtQW2U+PjI+Pj4wXT1uLmxlbmd0aDt2YXIgcj0wO3JldHVybiBuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3IrPWUubGVuZ3RoKzE7fSkpLFBbdD4+Mj4+PjBdPXIsMH0sczplPT57d3x8KGkub25FeGl0JiZpLm9uRXhpdChlKSxJPSEwKSxwKGUsbmV3IEcoZSkpO30sZjooKT0+NTIsajpmdW5jdGlvbigpe3JldHVybiA1Mn0scTpmdW5jdGlvbigpe3JldHVybiA3MH0saTpmdW5jdGlvbihlLHQsbixyKXt0Pj4+PTAsbj4+Pj0wLHI+Pj49MDtmb3IodmFyIG89MCxpPTA7aTxuO2krKyl7dmFyIHM9UFt0Pj4yPj4+MF0sYT1QW3QrND4+Mj4+PjBdO3QrPTg7Zm9yKHZhciB1PTA7dTxhO3UrKyl7dmFyIGw9U1tzK3U+Pj4wXSxjPWllW2VdOzA9PT1sfHwxMD09PWw/KCgxPT09ZT92Ol8pKFkoYywwKSksYy5sZW5ndGg9MCk6Yy5wdXNoKGwpO31vKz1hO31yZXR1cm4gUFtyPj4yPj4+MF09bywwfSxyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+Pj49MCxzZShTLnN1YmFycmF5KGU+Pj4wLGUrKHQ+Pj4wKT4+PjApKSwwfSxDOmxlLGM6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGxlKGU+Pj4wLHQ+Pj4wLG4+Pj4wLHI+Pj4wKX19OyFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZT1lLmV4cG9ydHMseD1lPWZ1bmN0aW9uKGUpe3ZhciB0PWU9PigpPT5lKCk+Pj4wLG49ZT0+dD0+ZSh0KT4+PjA7cmV0dXJuIChlPU9iamVjdC5hc3NpZ24oe30sZSkpLl9fZXJybm9fbG9jYXRpb249dChlLl9fZXJybm9fbG9jYXRpb24pLGUubWFsbG9jPW4oZS5tYWxsb2MpLGUuc3RhY2tTYXZlPXQoZS5zdGFja1NhdmUpLGUuc3RhY2tBbGxvYz1uKGUuc3RhY2tBbGxvYyksZX0oZSksVD14LkwsRSgpLCQudW5zaGlmdCh4Lk0pLFItLSxpLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJmkubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhSKSwwPT1SJiYoQykpe3ZhciB0PUM7Qz1udWxsLHQoKTt9cmV0dXJuIGV9dmFyIHQ9e2E6Y2V9O2lmKFIrKyxpLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJmkubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhSKSxpLmluc3RhbnRpYXRlV2FzbSl0cnl7cmV0dXJuIGkuaW5zdGFudGlhdGVXYXNtKHQsZSl9Y2F0Y2goZSl7XygiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIitlKSxvKGUpO30oZnVuY3Rpb24oZSx0KXt2YXIgbj1OO3JldHVybiB5fHwiZnVuY3Rpb24iIT10eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmd8fFUobil8fG4uc3RhcnRzV2l0aCgiZmlsZTovLyIpfHxofHwiZnVuY3Rpb24iIT10eXBlb2YgZmV0Y2g/eihuLGUsdCk6ZmV0Y2gobix7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oKHI9PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHIsZSkudGhlbih0LChmdW5jdGlvbihyKXtyZXR1cm4gXygid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIrciksXygiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSx6KG4sZSx0KX0pKSkpfSkodCwoZnVuY3Rpb24odCl7ZSh0Lmluc3RhbmNlKTt9KSkuY2F0Y2gobyk7fSgpLGkuX09ydEluaXQ9KGUsdCk9PihpLl9PcnRJbml0PXguTikoZSx0KSxpLl9PcnRHZXRMYXN0RXJyb3I9KGUsdCk9PihpLl9PcnRHZXRMYXN0RXJyb3I9eC5PKShlLHQpLGkuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zPShlLHQsbixyLG8scyxhLHUsbCxjKT0+KGkuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zPXguUCkoZSx0LG4scixvLHMsYSx1LGwsYyksaS5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXI9KGUsdCk9PihpLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj14LlEpKGUsdCksaS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PShlLHQsbik9PihpLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9eC5SKShlLHQsbiksaS5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zPWU9PihpLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnM9eC5TKShlKSxpLl9PcnRDcmVhdGVTZXNzaW9uPShlLHQsbik9PihpLl9PcnRDcmVhdGVTZXNzaW9uPXguVCkoZSx0LG4pLGkuX09ydFJlbGVhc2VTZXNzaW9uPWU9PihpLl9PcnRSZWxlYXNlU2Vzc2lvbj14LlUpKGUpLGkuX09ydEdldElucHV0T3V0cHV0Q291bnQ9KGUsdCxuKT0+KGkuX09ydEdldElucHV0T3V0cHV0Q291bnQ9eC5WKShlLHQsbiksaS5fT3J0R2V0SW5wdXROYW1lPShlLHQpPT4oaS5fT3J0R2V0SW5wdXROYW1lPXguVykoZSx0KSxpLl9PcnRHZXRPdXRwdXROYW1lPShlLHQpPT4oaS5fT3J0R2V0T3V0cHV0TmFtZT14LlgpKGUsdCksaS5fT3J0RnJlZT1lPT4oaS5fT3J0RnJlZT14LlkpKGUpLGkuX09ydENyZWF0ZVRlbnNvcj0oZSx0LG4scixvKT0+KGkuX09ydENyZWF0ZVRlbnNvcj14LlopKGUsdCxuLHIsbyksaS5fT3J0R2V0VGVuc29yRGF0YT0oZSx0LG4scixvKT0+KGkuX09ydEdldFRlbnNvckRhdGE9eC5fKShlLHQsbixyLG8pLGkuX09ydFJlbGVhc2VUZW5zb3I9ZT0+KGkuX09ydFJlbGVhc2VUZW5zb3I9eC4kKShlKSxpLl9PcnRDcmVhdGVSdW5PcHRpb25zPShlLHQsbixyKT0+KGkuX09ydENyZWF0ZVJ1bk9wdGlvbnM9eC5hYSkoZSx0LG4sciksaS5fT3J0QWRkUnVuQ29uZmlnRW50cnk9KGUsdCxuKT0+KGkuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PXguYmEpKGUsdCxuKSxpLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1lPT4oaS5fT3J0UmVsZWFzZVJ1bk9wdGlvbnM9eC5jYSkoZSksaS5fT3J0UnVuPShlLHQsbixyLG8scyxhLHUpPT4oaS5fT3J0UnVuPXguZGEpKGUsdCxuLHIsbyxzLGEsdSksaS5fT3J0RW5kUHJvZmlsaW5nPWU9PihpLl9PcnRFbmRQcm9maWxpbmc9eC5lYSkoZSk7dmFyIHBlPWkuX21hbGxvYz1lPT4ocGU9aS5fbWFsbG9jPXguZmEpKGUpO2kuX2ZyZWU9ZT0+KGkuX2ZyZWU9eC5nYSkoZSk7dmFyIGRlLGZlPWU9PihmZT14LmlhKShlKSxoZT0oKT0+KGhlPXguamEpKCksZ2U9ZT0+KGdlPXgua2EpKGUpLGJlPWU9PihiZT14LmxhKShlKTtmdW5jdGlvbiBtZSgpe2Z1bmN0aW9uIGUoKXtpZighZGUmJihkZT0hMCxpLmNhbGxlZFJ1bj0hMCwhSSkpe2lmKEgoJCksdChpKSxpLm9uUnVudGltZUluaXRpYWxpemVkJiZpLm9uUnVudGltZUluaXRpYWxpemVkKCksaS5wb3N0UnVuKWZvcigiZnVuY3Rpb24iPT10eXBlb2YgaS5wb3N0UnVuJiYoaS5wb3N0UnVuPVtpLnBvc3RSdW5dKTtpLnBvc3RSdW4ubGVuZ3RoOyl7dmFyIGU9aS5wb3N0UnVuLnNoaWZ0KCk7ay51bnNoaWZ0KGUpO31IKGspO319aWYoISgwPFIpKXtpZihpLnByZVJ1bilmb3IoImZ1bmN0aW9uIj09dHlwZW9mIGkucHJlUnVuJiYoaS5wcmVSdW49W2kucHJlUnVuXSk7aS5wcmVSdW4ubGVuZ3RoOylGKCk7SChEKSwwPFJ8fChpLnNldFN0YXR1cz8oaS5zZXRTdGF0dXMoIlJ1bm5pbmcuLi4iKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aS5zZXRTdGF0dXMoIiIpO30pLDEpLGUoKTt9KSwxKSk6ZSgpKTt9fWlmKGkuc3RhY2tBbGxvYz1iZSxpLnN0YWNrU2F2ZT1oZSxpLnN0YWNrUmVzdG9yZT1nZSxpLlVURjhUb1N0cmluZz1LLGkuc3RyaW5nVG9VVEY4PShlLHQsbik9PlooZSxTLHQsbiksaS5sZW5ndGhCeXRlc1VURjg9SixDPWZ1bmN0aW9uIGUoKXtkZXx8bWUoKSxkZXx8KEM9ZSk7fSxpLnByZUluaXQpZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBpLnByZUluaXQmJihpLnByZUluaXQ9W2kucHJlSW5pdF0pOzA8aS5wcmVJbml0Lmxlbmd0aDspaS5wcmVJbml0LnBvcCgpKCk7cmV0dXJuIG1lKCksZS5yZWFkeX0pO2UuZXhwb3J0cz1vO30sNDUzNzplPT57ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLHI9MCxvPTIsaT0hMDtvPGFyZ3VtZW50cy5sZW5ndGg7KW5bcisrXT1hcmd1bWVudHNbbysrXTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8scyl7bltyXT1mdW5jdGlvbihlKXtpZihpKWlmKGk9ITEsZSlzKGUpO2Vsc2Uge2Zvcih2YXIgdD1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxuPTA7bjx0Lmxlbmd0aDspdFtuKytdPWFyZ3VtZW50c1tuXTtvLmFwcGx5KG51bGwsdCk7fX07dHJ5e2UuYXBwbHkodHx8bnVsbCxuKTt9Y2F0Y2goZSl7aSYmKGk9ITEscyhlKSk7fX0pKX07fSw3NDE5OihlLHQpPT57dmFyIG49dDtuLmxlbmd0aD1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtpZighdClyZXR1cm4gMDtmb3IodmFyIG49MDstLXQlND4xJiYiPSI9PT1lLmNoYXJBdCh0KTspKytuO3JldHVybiBNYXRoLmNlaWwoMyplLmxlbmd0aCkvNC1ufTtmb3IodmFyIHI9bmV3IEFycmF5KDY0KSxvPW5ldyBBcnJheSgxMjMpLGk9MDtpPDY0OylvW3JbaV09aTwyNj9pKzY1Omk8NTI/aSs3MTppPDYyP2ktNDppLTU5fDQzXT1pKys7bi5lbmNvZGU9ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgbyxpPW51bGwscz1bXSxhPTAsdT0wO3Q8bjspe3ZhciBsPWVbdCsrXTtzd2l0Y2godSl7Y2FzZSAwOnNbYSsrXT1yW2w+PjJdLG89KDMmbCk8PDQsdT0xO2JyZWFrO2Nhc2UgMTpzW2ErK109cltvfGw+PjRdLG89KDE1JmwpPDwyLHU9MjticmVhaztjYXNlIDI6c1thKytdPXJbb3xsPj42XSxzW2ErK109cls2MyZsXSx1PTA7fWE+ODE5MSYmKChpfHwoaT1bXSkpLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcscykpLGE9MCk7fXJldHVybiB1JiYoc1thKytdPXJbb10sc1thKytdPTYxLDE9PT11JiYoc1thKytdPTYxKSksaT8oYSYmaS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHMuc2xpY2UoMCxhKSkpLGkuam9pbigiIikpOlN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHMuc2xpY2UoMCxhKSl9O3ZhciBzPSJpbnZhbGlkIGVuY29kaW5nIjtuLmRlY29kZT1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciByLGk9bixhPTAsdT0wO3U8ZS5sZW5ndGg7KXt2YXIgbD1lLmNoYXJDb2RlQXQodSsrKTtpZig2MT09PWwmJmE+MSlicmVhaztpZih2b2lkIDA9PT0obD1vW2xdKSl0aHJvdyBFcnJvcihzKTtzd2l0Y2goYSl7Y2FzZSAwOnI9bCxhPTE7YnJlYWs7Y2FzZSAxOnRbbisrXT1yPDwyfCg0OCZsKT4+NCxyPWwsYT0yO2JyZWFrO2Nhc2UgMjp0W24rK109KDE1JnIpPDw0fCg2MCZsKT4+MixyPWwsYT0zO2JyZWFrO2Nhc2UgMzp0W24rK109KDMmcik8PDZ8bCxhPTA7fX1pZigxPT09YSl0aHJvdyBFcnJvcihzKTtyZXR1cm4gbi1pfSxuLnRlc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIC9eKD86W0EtWmEtejAtOSsvXXs0fSkqKD86W0EtWmEtejAtOSsvXXsyfT09fFtBLVphLXowLTkrL117M309KT8kLy50ZXN0KGUpfTt9LDkyMTE6ZT0+e2Z1bmN0aW9uIHQoKXt0aGlzLl9saXN0ZW5lcnM9e307fWUuZXhwb3J0cz10LHQucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gKHRoaXMuX2xpc3RlbmVyc1tlXXx8KHRoaXMuX2xpc3RlbmVyc1tlXT1bXSkpLnB1c2goe2ZuOnQsY3R4Om58fHRoaXN9KSx0aGlzfSx0LnByb3RvdHlwZS5vZmY9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT1lKXRoaXMuX2xpc3RlbmVycz17fTtlbHNlIGlmKHZvaWQgMD09PXQpdGhpcy5fbGlzdGVuZXJzW2VdPVtdO2Vsc2UgZm9yKHZhciBuPXRoaXMuX2xpc3RlbmVyc1tlXSxyPTA7cjxuLmxlbmd0aDspbltyXS5mbj09PXQ/bi5zcGxpY2UociwxKTorK3I7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzW2VdO2lmKHQpe2Zvcih2YXIgbj1bXSxyPTE7cjxhcmd1bWVudHMubGVuZ3RoOyluLnB1c2goYXJndW1lbnRzW3IrK10pO2ZvcihyPTA7cjx0Lmxlbmd0aDspdFtyXS5mbi5hcHBseSh0W3IrK10uY3R4LG4pO31yZXR1cm4gdGhpc307fSw5NDU6ZT0+e2Z1bmN0aW9uIHQoZSl7cmV0dXJuICJ1bmRlZmluZWQiIT10eXBlb2YgRmxvYXQzMkFycmF5P2Z1bmN0aW9uKCl7dmFyIHQ9bmV3IEZsb2F0MzJBcnJheShbLTBdKSxuPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyKSxyPTEyOD09PW5bM107ZnVuY3Rpb24gbyhlLHIsbyl7dFswXT1lLHJbb109blswXSxyW28rMV09blsxXSxyW28rMl09blsyXSxyW28rM109blszXTt9ZnVuY3Rpb24gaShlLHIsbyl7dFswXT1lLHJbb109blszXSxyW28rMV09blsyXSxyW28rMl09blsxXSxyW28rM109blswXTt9ZnVuY3Rpb24gcyhlLHIpe3JldHVybiBuWzBdPWVbcl0sblsxXT1lW3IrMV0sblsyXT1lW3IrMl0sblszXT1lW3IrM10sdFswXX1mdW5jdGlvbiBhKGUscil7cmV0dXJuIG5bM109ZVtyXSxuWzJdPWVbcisxXSxuWzFdPWVbcisyXSxuWzBdPWVbciszXSx0WzBdfWUud3JpdGVGbG9hdExFPXI/bzppLGUud3JpdGVGbG9hdEJFPXI/aTpvLGUucmVhZEZsb2F0TEU9cj9zOmEsZS5yZWFkRmxvYXRCRT1yP2E6czt9KCk6ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsdCxuLHIpe3ZhciBvPXQ8MD8xOjA7aWYobyYmKHQ9LXQpLDA9PT10KWUoMS90PjA/MDoyMTQ3NDgzNjQ4LG4scik7ZWxzZSBpZihpc05hTih0KSllKDIxNDMyODkzNDQsbixyKTtlbHNlIGlmKHQ+MzQwMjgyMzQ2NjM4NTI4ODZlMjIpZSgobzw8MzF8MjEzOTA5NTA0MCk+Pj4wLG4scik7ZWxzZSBpZih0PDExNzU0OTQzNTA4MjIyODc1ZS01NCllKChvPDwzMXxNYXRoLnJvdW5kKHQvMTQwMTI5ODQ2NDMyNDgxN2UtNjApKT4+PjAsbixyKTtlbHNlIHt2YXIgaT1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKTtlKChvPDwzMXxpKzEyNzw8MjN8ODM4ODYwNyZNYXRoLnJvdW5kKHQqTWF0aC5wb3coMiwtaSkqODM4ODYwOCkpPj4+MCxuLHIpO319ZnVuY3Rpb24gcyhlLHQsbil7dmFyIHI9ZSh0LG4pLG89Mioocj4+MzEpKzEsaT1yPj4+MjMmMjU1LHM9ODM4ODYwNyZyO3JldHVybiAyNTU9PT1pP3M/TmFOOm8qKDEvMCk6MD09PWk/MTQwMTI5ODQ2NDMyNDgxN2UtNjAqbypzOm8qTWF0aC5wb3coMixpLTE1MCkqKHMrODM4ODYwOCl9ZS53cml0ZUZsb2F0TEU9dC5iaW5kKG51bGwsbiksZS53cml0ZUZsb2F0QkU9dC5iaW5kKG51bGwsciksZS5yZWFkRmxvYXRMRT1zLmJpbmQobnVsbCxvKSxlLnJlYWRGbG9hdEJFPXMuYmluZChudWxsLGkpO30oKSwidW5kZWZpbmVkIiE9dHlwZW9mIEZsb2F0NjRBcnJheT9mdW5jdGlvbigpe3ZhciB0PW5ldyBGbG9hdDY0QXJyYXkoWy0wXSksbj1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcikscj0xMjg9PT1uWzddO2Z1bmN0aW9uIG8oZSxyLG8pe3RbMF09ZSxyW29dPW5bMF0scltvKzFdPW5bMV0scltvKzJdPW5bMl0scltvKzNdPW5bM10scltvKzRdPW5bNF0scltvKzVdPW5bNV0scltvKzZdPW5bNl0scltvKzddPW5bN107fWZ1bmN0aW9uIGkoZSxyLG8pe3RbMF09ZSxyW29dPW5bN10scltvKzFdPW5bNl0scltvKzJdPW5bNV0scltvKzNdPW5bNF0scltvKzRdPW5bM10scltvKzVdPW5bMl0scltvKzZdPW5bMV0scltvKzddPW5bMF07fWZ1bmN0aW9uIHMoZSxyKXtyZXR1cm4gblswXT1lW3JdLG5bMV09ZVtyKzFdLG5bMl09ZVtyKzJdLG5bM109ZVtyKzNdLG5bNF09ZVtyKzRdLG5bNV09ZVtyKzVdLG5bNl09ZVtyKzZdLG5bN109ZVtyKzddLHRbMF19ZnVuY3Rpb24gYShlLHIpe3JldHVybiBuWzddPWVbcl0sbls2XT1lW3IrMV0sbls1XT1lW3IrMl0sbls0XT1lW3IrM10sblszXT1lW3IrNF0sblsyXT1lW3IrNV0sblsxXT1lW3IrNl0sblswXT1lW3IrN10sdFswXX1lLndyaXRlRG91YmxlTEU9cj9vOmksZS53cml0ZURvdWJsZUJFPXI/aTpvLGUucmVhZERvdWJsZUxFPXI/czphLGUucmVhZERvdWJsZUJFPXI/YTpzO30oKTpmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSx0LG4scixvLGkpe3ZhciBzPXI8MD8xOjA7aWYocyYmKHI9LXIpLDA9PT1yKWUoMCxvLGkrdCksZSgxL3I+MD8wOjIxNDc0ODM2NDgsbyxpK24pO2Vsc2UgaWYoaXNOYU4ocikpZSgwLG8saSt0KSxlKDIxNDY5NTkzNjAsbyxpK24pO2Vsc2UgaWYocj4xNzk3NjkzMTM0ODYyMzE1N2UyOTIpZSgwLG8saSt0KSxlKChzPDwzMXwyMTQ2NDM1MDcyKT4+PjAsbyxpK24pO2Vsc2Uge3ZhciBhO2lmKHI8MjIyNTA3Mzg1ODUwNzIwMTRlLTMyNCllKChhPXIvNWUtMzI0KT4+PjAsbyxpK3QpLGUoKHM8PDMxfGEvNDI5NDk2NzI5Nik+Pj4wLG8saStuKTtlbHNlIHt2YXIgdT1NYXRoLmZsb29yKE1hdGgubG9nKHIpL01hdGguTE4yKTsxMDI0PT09dSYmKHU9MTAyMyksZSg0NTAzNTk5NjI3MzcwNDk2KihhPXIqTWF0aC5wb3coMiwtdSkpPj4+MCxvLGkrdCksZSgoczw8MzF8dSsxMDIzPDwyMHwxMDQ4NTc2KmEmMTA0ODU3NSk+Pj4wLG8saStuKTt9fX1mdW5jdGlvbiBzKGUsdCxuLHIsbyl7dmFyIGk9ZShyLG8rdCkscz1lKHIsbytuKSxhPTIqKHM+PjMxKSsxLHU9cz4+PjIwJjIwNDcsbD00Mjk0OTY3Mjk2KigxMDQ4NTc1JnMpK2k7cmV0dXJuIDIwNDc9PT11P2w/TmFOOmEqKDEvMCk6MD09PXU/NWUtMzI0KmEqbDphKk1hdGgucG93KDIsdS0xMDc1KSoobCs0NTAzNTk5NjI3MzcwNDk2KX1lLndyaXRlRG91YmxlTEU9dC5iaW5kKG51bGwsbiwwLDQpLGUud3JpdGVEb3VibGVCRT10LmJpbmQobnVsbCxyLDQsMCksZS5yZWFkRG91YmxlTEU9cy5iaW5kKG51bGwsbywwLDQpLGUucmVhZERvdWJsZUJFPXMuYmluZChudWxsLGksNCwwKTt9KCksZX1mdW5jdGlvbiBuKGUsdCxuKXt0W25dPTI1NSZlLHRbbisxXT1lPj4+OCYyNTUsdFtuKzJdPWU+Pj4xNiYyNTUsdFtuKzNdPWU+Pj4yNDt9ZnVuY3Rpb24gcihlLHQsbil7dFtuXT1lPj4+MjQsdFtuKzFdPWU+Pj4xNiYyNTUsdFtuKzJdPWU+Pj44JjI1NSx0W24rM109MjU1JmU7fWZ1bmN0aW9uIG8oZSx0KXtyZXR1cm4gKGVbdF18ZVt0KzFdPDw4fGVbdCsyXTw8MTZ8ZVt0KzNdPDwyNCk+Pj4wfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gKGVbdF08PDI0fGVbdCsxXTw8MTZ8ZVt0KzJdPDw4fGVbdCszXSk+Pj4wfWUuZXhwb3J0cz10KHQpO30sNzE5OTptb2R1bGU9PntmdW5jdGlvbiBpbnF1aXJlKG1vZHVsZU5hbWUpe3RyeXt2YXIgbW9kPWV2YWwoInF1aXJlIi5yZXBsYWNlKC9eLywicmUiKSkobW9kdWxlTmFtZSk7aWYobW9kJiYobW9kLmxlbmd0aHx8T2JqZWN0LmtleXMobW9kKS5sZW5ndGgpKXJldHVybiBtb2R9Y2F0Y2goZSl7fXJldHVybiBudWxsfW1vZHVsZS5leHBvcnRzPWlucXVpcmU7fSw2NjYyOmU9PntlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW58fDgxOTIsbz1yPj4+MSxpPW51bGwscz1yO3JldHVybiBmdW5jdGlvbihuKXtpZihuPDF8fG4+bylyZXR1cm4gZShuKTtzK24+ciYmKGk9ZShyKSxzPTApO3ZhciBhPXQuY2FsbChpLHMscys9bik7cmV0dXJuIDcmcyYmKHM9MSsoN3xzKSksYX19O30sNDk5NzooZSx0KT0+e3ZhciBuPXQ7bi5sZW5ndGg9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj0wLHI9MDtyPGUubGVuZ3RoOysrcikobj1lLmNoYXJDb2RlQXQocikpPDEyOD90Kz0xOm48MjA0OD90Kz0yOjU1Mjk2PT0oNjQ1MTImbikmJjU2MzIwPT0oNjQ1MTImZS5jaGFyQ29kZUF0KHIrMSkpPygrK3IsdCs9NCk6dCs9MztyZXR1cm4gdH0sbi5yZWFkPWZ1bmN0aW9uKGUsdCxuKXtpZihuLXQ8MSlyZXR1cm4gIiI7Zm9yKHZhciByLG89bnVsbCxpPVtdLHM9MDt0PG47KShyPWVbdCsrXSk8MTI4P2lbcysrXT1yOnI+MTkxJiZyPDIyND9pW3MrK109KDMxJnIpPDw2fDYzJmVbdCsrXTpyPjIzOSYmcjwzNjU/KHI9KCg3JnIpPDwxOHwoNjMmZVt0KytdKTw8MTJ8KDYzJmVbdCsrXSk8PDZ8NjMmZVt0KytdKS02NTUzNixpW3MrK109NTUyOTYrKHI+PjEwKSxpW3MrK109NTYzMjArKDEwMjMmcikpOmlbcysrXT0oMTUmcik8PDEyfCg2MyZlW3QrK10pPDw2fDYzJmVbdCsrXSxzPjgxOTEmJigob3x8KG89W10pKS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGkpKSxzPTApO3JldHVybiBvPyhzJiZvLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsaS5zbGljZSgwLHMpKSksby5qb2luKCIiKSk6U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsaS5zbGljZSgwLHMpKX0sbi53cml0ZT1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciByLG8saT1uLHM9MDtzPGUubGVuZ3RoOysrcykocj1lLmNoYXJDb2RlQXQocykpPDEyOD90W24rK109cjpyPDIwNDg/KHRbbisrXT1yPj42fDE5Mix0W24rK109NjMmcnwxMjgpOjU1Mjk2PT0oNjQ1MTImcikmJjU2MzIwPT0oNjQ1MTImKG89ZS5jaGFyQ29kZUF0KHMrMSkpKT8ocj02NTUzNisoKDEwMjMmcik8PDEwKSsoMTAyMyZvKSwrK3MsdFtuKytdPXI+PjE4fDI0MCx0W24rK109cj4+MTImNjN8MTI4LHRbbisrXT1yPj42JjYzfDEyOCx0W24rK109NjMmcnwxMjgpOih0W24rK109cj4+MTJ8MjI0LHRbbisrXT1yPj42JjYzfDEyOCx0W24rK109NjMmcnwxMjgpO3JldHVybiBuLWl9O30sMzQ0MjooZSx0KT0+e3QuX19lc01vZHVsZT0hMDt2YXIgbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7aWYoIXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhcmd1bWVudDsgYHZhbHVlYCBoYXMgbm8gdmFsdWUuIik7dGhpcy52YWx1ZT1lLkVNUFRZLHQmJmUuaXNHdWlkKHQpJiYodGhpcy52YWx1ZT10KTt9cmV0dXJuIGUuaXNHdWlkPWZ1bmN0aW9uKHQpe3ZhciBuPXQudG9TdHJpbmcoKTtyZXR1cm4gdCYmKHQgaW5zdGFuY2VvZiBlfHxlLnZhbGlkYXRvci50ZXN0KG4pKX0sZS5jcmVhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUoW2UuZ2VuKDIpLGUuZ2VuKDEpLGUuZ2VuKDEpLGUuZ2VuKDEpLGUuZ2VuKDMpXS5qb2luKCItIikpfSxlLmNyZWF0ZUVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlKCJlbXB0eWd1aWQiKX0sZS5wYXJzZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUucmF3PWZ1bmN0aW9uKCl7cmV0dXJuIFtlLmdlbigyKSxlLmdlbigxKSxlLmdlbigxKSxlLmdlbigxKSxlLmdlbigzKV0uam9pbigiLSIpfSxlLmdlbj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9IiIsbj0wO248ZTtuKyspdCs9KDY1NTM2KigxK01hdGgucmFuZG9tKCkpfDApLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gZS5pc0d1aWQodCkmJnRoaXMudmFsdWU9PT10LnRvU3RyaW5nKCl9LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZT09PWUuRU1QVFl9LGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWV9LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB7dmFsdWU6dGhpcy52YWx1ZX19LGUudmFsaWRhdG9yPW5ldyBSZWdFeHAoIl5bYS16MC05XXs4fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXsxMn0kIiwiaSIpLGUuRU1QVFk9IjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCIsZX0oKTt0Lkd1aWQ9bjt9LDIxMDA6KGUsdCxuKT0+e2UuZXhwb3J0cz1uKDk0ODIpO30sOTQ4MjooZSx0LG4pPT57dmFyIHI9dDtmdW5jdGlvbiBvKCl7ci51dGlsLl9jb25maWd1cmUoKSxyLldyaXRlci5fY29uZmlndXJlKHIuQnVmZmVyV3JpdGVyKSxyLlJlYWRlci5fY29uZmlndXJlKHIuQnVmZmVyUmVhZGVyKTt9ci5idWlsZD0ibWluaW1hbCIsci5Xcml0ZXI9bigxMTczKSxyLkJ1ZmZlcldyaXRlcj1uKDMxNTUpLHIuUmVhZGVyPW4oMTQwOCksci5CdWZmZXJSZWFkZXI9big1OTMpLHIudXRpbD1uKDk2OTMpLHIucnBjPW4oNTk5NCksci5yb290cz1uKDUwNTQpLHIuY29uZmlndXJlPW8sbygpO30sMTQwODooZSx0LG4pPT57ZS5leHBvcnRzPXU7dmFyIHIsbz1uKDk2OTMpLGk9by5Mb25nQml0cyxzPW8udXRmODtmdW5jdGlvbiBhKGUsdCl7cmV0dXJuIFJhbmdlRXJyb3IoImluZGV4IG91dCBvZiByYW5nZTogIitlLnBvcysiICsgIisodHx8MSkrIiA+ICIrZS5sZW4pfWZ1bmN0aW9uIHUoZSl7dGhpcy5idWY9ZSx0aGlzLnBvcz0wLHRoaXMubGVuPWUubGVuZ3RoO312YXIgbCxjPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheXx8QXJyYXkuaXNBcnJheShlKSlyZXR1cm4gbmV3IHUoZSk7dGhyb3cgRXJyb3IoImlsbGVnYWwgYnVmZmVyIil9OmZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIG5ldyB1KGUpO3Rocm93IEVycm9yKCJpbGxlZ2FsIGJ1ZmZlciIpfSxwPWZ1bmN0aW9uKCl7cmV0dXJuIG8uQnVmZmVyP2Z1bmN0aW9uKGUpe3JldHVybiAodS5jcmVhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG8uQnVmZmVyLmlzQnVmZmVyKGUpP25ldyByKGUpOmMoZSl9KShlKX06Y307ZnVuY3Rpb24gZCgpe3ZhciBlPW5ldyBpKDAsMCksdD0wO2lmKCEodGhpcy5sZW4tdGhpcy5wb3M+NCkpe2Zvcig7dDwzOysrdCl7aWYodGhpcy5wb3M+PXRoaXMubGVuKXRocm93IGEodGhpcyk7aWYoZS5sbz0oZS5sb3woMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDcqdCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gZX1yZXR1cm4gZS5sbz0oZS5sb3woMTI3JnRoaXMuYnVmW3RoaXMucG9zKytdKTw8Nyp0KT4+PjAsZX1mb3IoO3Q8NDsrK3QpaWYoZS5sbz0oZS5sb3woMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDcqdCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gZTtpZihlLmxvPShlLmxvfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKTw8MjgpPj4+MCxlLmhpPShlLmhpfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKT4+NCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gZTtpZih0PTAsdGhpcy5sZW4tdGhpcy5wb3M+NCl7Zm9yKDt0PDU7Kyt0KWlmKGUuaGk9KGUuaGl8KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDw3KnQrMyk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gZX1lbHNlIGZvcig7dDw1OysrdCl7aWYodGhpcy5wb3M+PXRoaXMubGVuKXRocm93IGEodGhpcyk7aWYoZS5oaT0oZS5oaXwoMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDcqdCszKT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBlfXRocm93IEVycm9yKCJpbnZhbGlkIHZhcmludCBlbmNvZGluZyIpfWZ1bmN0aW9uIGYoZSx0KXtyZXR1cm4gKGVbdC00XXxlW3QtM108PDh8ZVt0LTJdPDwxNnxlW3QtMV08PDI0KT4+PjB9ZnVuY3Rpb24gaCgpe2lmKHRoaXMucG9zKzg+dGhpcy5sZW4pdGhyb3cgYSh0aGlzLDgpO3JldHVybiBuZXcgaShmKHRoaXMuYnVmLHRoaXMucG9zKz00KSxmKHRoaXMuYnVmLHRoaXMucG9zKz00KSl9dS5jcmVhdGU9cCgpLHUucHJvdG90eXBlLl9zbGljZT1vLkFycmF5LnByb3RvdHlwZS5zdWJhcnJheXx8by5BcnJheS5wcm90b3R5cGUuc2xpY2UsdS5wcm90b3R5cGUudWludDMyPShsPTQyOTQ5NjcyOTUsZnVuY3Rpb24oKXtpZihsPSgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBsO2lmKGw9KGx8KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDw3KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBsO2lmKGw9KGx8KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDwxNCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gbDtpZihsPShsfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKTw8MjEpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIGw7aWYobD0obHwoMTUmdGhpcy5idWZbdGhpcy5wb3NdKTw8MjgpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIGw7aWYoKHRoaXMucG9zKz01KT50aGlzLmxlbil0aHJvdyB0aGlzLnBvcz10aGlzLmxlbixhKHRoaXMsMTApO3JldHVybiBsfSksdS5wcm90b3R5cGUuaW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gMHx0aGlzLnVpbnQzMigpfSx1LnByb3RvdHlwZS5zaW50MzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnVpbnQzMigpO3JldHVybiBlPj4+MV4tKDEmZSl8MH0sdS5wcm90b3R5cGUuYm9vbD1mdW5jdGlvbigpe3JldHVybiAwIT09dGhpcy51aW50MzIoKX0sdS5wcm90b3R5cGUuZml4ZWQzMj1mdW5jdGlvbigpe2lmKHRoaXMucG9zKzQ+dGhpcy5sZW4pdGhyb3cgYSh0aGlzLDQpO3JldHVybiBmKHRoaXMuYnVmLHRoaXMucG9zKz00KX0sdS5wcm90b3R5cGUuc2ZpeGVkMzI9ZnVuY3Rpb24oKXtpZih0aGlzLnBvcys0PnRoaXMubGVuKXRocm93IGEodGhpcyw0KTtyZXR1cm4gMHxmKHRoaXMuYnVmLHRoaXMucG9zKz00KX0sdS5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24oKXtpZih0aGlzLnBvcys0PnRoaXMubGVuKXRocm93IGEodGhpcyw0KTt2YXIgZT1vLmZsb2F0LnJlYWRGbG9hdExFKHRoaXMuYnVmLHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsZX0sdS5wcm90b3R5cGUuZG91YmxlPWZ1bmN0aW9uKCl7aWYodGhpcy5wb3MrOD50aGlzLmxlbil0aHJvdyBhKHRoaXMsNCk7dmFyIGU9by5mbG9hdC5yZWFkRG91YmxlTEUodGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfSx1LnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMudWludDMyKCksdD10aGlzLnBvcyxuPXRoaXMucG9zK2U7aWYobj50aGlzLmxlbil0aHJvdyBhKHRoaXMsZSk7cmV0dXJuIHRoaXMucG9zKz1lLEFycmF5LmlzQXJyYXkodGhpcy5idWYpP3RoaXMuYnVmLnNsaWNlKHQsbik6dD09PW4/bmV3IHRoaXMuYnVmLmNvbnN0cnVjdG9yKDApOnRoaXMuX3NsaWNlLmNhbGwodGhpcy5idWYsdCxuKX0sdS5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5ieXRlcygpO3JldHVybiBzLnJlYWQoZSwwLGUubGVuZ3RoKX0sdS5wcm90b3R5cGUuc2tpcD1mdW5jdGlvbihlKXtpZigibnVtYmVyIj09dHlwZW9mIGUpe2lmKHRoaXMucG9zK2U+dGhpcy5sZW4pdGhyb3cgYSh0aGlzLGUpO3RoaXMucG9zKz1lO31lbHNlIGRve2lmKHRoaXMucG9zPj10aGlzLmxlbil0aHJvdyBhKHRoaXMpfXdoaWxlKDEyOCZ0aGlzLmJ1Zlt0aGlzLnBvcysrXSk7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnNraXBUeXBlPWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlIDA6dGhpcy5za2lwKCk7YnJlYWs7Y2FzZSAxOnRoaXMuc2tpcCg4KTticmVhaztjYXNlIDI6dGhpcy5za2lwKHRoaXMudWludDMyKCkpO2JyZWFrO2Nhc2UgMzpmb3IoOzQhPShlPTcmdGhpcy51aW50MzIoKSk7KXRoaXMuc2tpcFR5cGUoZSk7YnJlYWs7Y2FzZSA1OnRoaXMuc2tpcCg0KTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJpbnZhbGlkIHdpcmUgdHlwZSAiK2UrIiBhdCBvZmZzZXQgIit0aGlzLnBvcyl9cmV0dXJuIHRoaXN9LHUuX2NvbmZpZ3VyZT1mdW5jdGlvbihlKXtyPWUsdS5jcmVhdGU9cCgpLHIuX2NvbmZpZ3VyZSgpO3ZhciB0PW8uTG9uZz8idG9Mb25nIjoidG9OdW1iZXIiO28ubWVyZ2UodS5wcm90b3R5cGUse2ludDY0OmZ1bmN0aW9uKCl7cmV0dXJuIGQuY2FsbCh0aGlzKVt0XSghMSl9LHVpbnQ2NDpmdW5jdGlvbigpe3JldHVybiBkLmNhbGwodGhpcylbdF0oITApfSxzaW50NjQ6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpLnp6RGVjb2RlKClbdF0oITEpfSxmaXhlZDY0OmZ1bmN0aW9uKCl7cmV0dXJuIGguY2FsbCh0aGlzKVt0XSghMCl9LHNmaXhlZDY0OmZ1bmN0aW9uKCl7cmV0dXJuIGguY2FsbCh0aGlzKVt0XSghMSl9fSk7fTt9LDU5MzooZSx0LG4pPT57ZS5leHBvcnRzPWk7dmFyIHI9bigxNDA4KTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWk7dmFyIG89big5NjkzKTtmdW5jdGlvbiBpKGUpe3IuY2FsbCh0aGlzLGUpO31pLl9jb25maWd1cmU9ZnVuY3Rpb24oKXtvLkJ1ZmZlciYmKGkucHJvdG90eXBlLl9zbGljZT1vLkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UpO30saS5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy51aW50MzIoKTtyZXR1cm4gdGhpcy5idWYudXRmOFNsaWNlP3RoaXMuYnVmLnV0ZjhTbGljZSh0aGlzLnBvcyx0aGlzLnBvcz1NYXRoLm1pbih0aGlzLnBvcytlLHRoaXMubGVuKSk6dGhpcy5idWYudG9TdHJpbmcoInV0Zi04Iix0aGlzLnBvcyx0aGlzLnBvcz1NYXRoLm1pbih0aGlzLnBvcytlLHRoaXMubGVuKSl9LGkuX2NvbmZpZ3VyZSgpO30sNTA1NDplPT57ZS5leHBvcnRzPXt9O30sNTk5NDooZSx0LG4pPT57dC5TZXJ2aWNlPW4oNzk0OCk7fSw3OTQ4OihlLHQsbik9PntlLmV4cG9ydHM9bzt2YXIgcj1uKDk2OTMpO2Z1bmN0aW9uIG8oZSx0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IFR5cGVFcnJvcigicnBjSW1wbCBtdXN0IGJlIGEgZnVuY3Rpb24iKTtyLkV2ZW50RW1pdHRlci5jYWxsKHRoaXMpLHRoaXMucnBjSW1wbD1lLHRoaXMucmVxdWVzdERlbGltaXRlZD1Cb29sZWFuKHQpLHRoaXMucmVzcG9uc2VEZWxpbWl0ZWQ9Qm9vbGVhbihuKTt9KG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoci5FdmVudEVtaXR0ZXIucHJvdG90eXBlKSkuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5ycGNDYWxsPWZ1bmN0aW9uIGUodCxuLG8saSxzKXtpZighaSl0aHJvdyBUeXBlRXJyb3IoInJlcXVlc3QgbXVzdCBiZSBzcGVjaWZpZWQiKTt2YXIgYT10aGlzO2lmKCFzKXJldHVybiByLmFzUHJvbWlzZShlLGEsdCxuLG8saSk7aWYoYS5ycGNJbXBsKXRyeXtyZXR1cm4gYS5ycGNJbXBsKHQsblthLnJlcXVlc3REZWxpbWl0ZWQ/ImVuY29kZURlbGltaXRlZCI6ImVuY29kZSJdKGkpLmZpbmlzaCgpLChmdW5jdGlvbihlLG4pe2lmKGUpcmV0dXJuIGEuZW1pdCgiZXJyb3IiLGUsdCkscyhlKTtpZihudWxsIT09bil7aWYoIShuIGluc3RhbmNlb2YgbykpdHJ5e249b1thLnJlc3BvbnNlRGVsaW1pdGVkPyJkZWNvZGVEZWxpbWl0ZWQiOiJkZWNvZGUiXShuKTt9Y2F0Y2goZSl7cmV0dXJuIGEuZW1pdCgiZXJyb3IiLGUsdCkscyhlKX1yZXR1cm4gYS5lbWl0KCJkYXRhIixuLHQpLHMobnVsbCxuKX1hLmVuZCghMCk7fSkpfWNhdGNoKGUpe3JldHVybiBhLmVtaXQoImVycm9yIixlLHQpLHZvaWQgc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzKGUpO30pLDApfWVsc2Ugc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzKEVycm9yKCJhbHJlYWR5IGVuZGVkIikpO30pLDApO30sby5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJwY0ltcGwmJihlfHx0aGlzLnJwY0ltcGwobnVsbCxudWxsLG51bGwpLHRoaXMucnBjSW1wbD1udWxsLHRoaXMuZW1pdCgiZW5kIikub2ZmKCkpLHRoaXN9O30sMTk0NTooZSx0LG4pPT57ZS5leHBvcnRzPW87dmFyIHI9big5NjkzKTtmdW5jdGlvbiBvKGUsdCl7dGhpcy5sbz1lPj4+MCx0aGlzLmhpPXQ+Pj4wO312YXIgaT1vLnplcm89bmV3IG8oMCwwKTtpLnRvTnVtYmVyPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGkuenpFbmNvZGU9aS56ekRlY29kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxpLmxlbmd0aD1mdW5jdGlvbigpe3JldHVybiAxfTt2YXIgcz1vLnplcm9IYXNoPSJcMFwwXDBcMFwwXDBcMFwwIjtvLmZyb21OdW1iZXI9ZnVuY3Rpb24oZSl7aWYoMD09PWUpcmV0dXJuIGk7dmFyIHQ9ZTwwO3QmJihlPS1lKTt2YXIgbj1lPj4+MCxyPShlLW4pLzQyOTQ5NjcyOTY+Pj4wO3JldHVybiB0JiYocj1+cj4+PjAsbj1+bj4+PjAsKytuPjQyOTQ5NjcyOTUmJihuPTAsKytyPjQyOTQ5NjcyOTUmJihyPTApKSksbmV3IG8obixyKX0sby5mcm9tPWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gby5mcm9tTnVtYmVyKGUpO2lmKHIuaXNTdHJpbmcoZSkpe2lmKCFyLkxvbmcpcmV0dXJuIG8uZnJvbU51bWJlcihwYXJzZUludChlLDEwKSk7ZT1yLkxvbmcuZnJvbVN0cmluZyhlKTt9cmV0dXJuIGUubG93fHxlLmhpZ2g/bmV3IG8oZS5sb3c+Pj4wLGUuaGlnaD4+PjApOml9LG8ucHJvdG90eXBlLnRvTnVtYmVyPWZ1bmN0aW9uKGUpe2lmKCFlJiZ0aGlzLmhpPj4+MzEpe3ZhciB0PTErfnRoaXMubG8+Pj4wLG49fnRoaXMuaGk+Pj4wO3JldHVybiB0fHwobj1uKzE+Pj4wKSwtKHQrNDI5NDk2NzI5NipuKX1yZXR1cm4gdGhpcy5sbys0Mjk0OTY3Mjk2KnRoaXMuaGl9LG8ucHJvdG90eXBlLnRvTG9uZz1mdW5jdGlvbihlKXtyZXR1cm4gci5Mb25nP25ldyByLkxvbmcoMHx0aGlzLmxvLDB8dGhpcy5oaSxCb29sZWFuKGUpKTp7bG93OjB8dGhpcy5sbyxoaWdoOjB8dGhpcy5oaSx1bnNpZ25lZDpCb29sZWFuKGUpfX07dmFyIGE9U3RyaW5nLnByb3RvdHlwZS5jaGFyQ29kZUF0O28uZnJvbUhhc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1zP2k6bmV3IG8oKGEuY2FsbChlLDApfGEuY2FsbChlLDEpPDw4fGEuY2FsbChlLDIpPDwxNnxhLmNhbGwoZSwzKTw8MjQpPj4+MCwoYS5jYWxsKGUsNCl8YS5jYWxsKGUsNSk8PDh8YS5jYWxsKGUsNik8PDE2fGEuY2FsbChlLDcpPDwyNCk+Pj4wKX0sby5wcm90b3R5cGUudG9IYXNoPWZ1bmN0aW9uKCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoMjU1JnRoaXMubG8sdGhpcy5sbz4+PjgmMjU1LHRoaXMubG8+Pj4xNiYyNTUsdGhpcy5sbz4+PjI0LDI1NSZ0aGlzLmhpLHRoaXMuaGk+Pj44JjI1NSx0aGlzLmhpPj4+MTYmMjU1LHRoaXMuaGk+Pj4yNCl9LG8ucHJvdG90eXBlLnp6RW5jb2RlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oaT4+MzE7cmV0dXJuIHRoaXMuaGk9KCh0aGlzLmhpPDwxfHRoaXMubG8+Pj4zMSleZSk+Pj4wLHRoaXMubG89KHRoaXMubG88PDFeZSk+Pj4wLHRoaXN9LG8ucHJvdG90eXBlLnp6RGVjb2RlPWZ1bmN0aW9uKCl7dmFyIGU9LSgxJnRoaXMubG8pO3JldHVybiB0aGlzLmxvPSgodGhpcy5sbz4+PjF8dGhpcy5oaTw8MzEpXmUpPj4+MCx0aGlzLmhpPSh0aGlzLmhpPj4+MV5lKT4+PjAsdGhpc30sby5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sbyx0PSh0aGlzLmxvPj4+Mjh8dGhpcy5oaTw8NCk+Pj4wLG49dGhpcy5oaT4+PjI0O3JldHVybiAwPT09bj8wPT09dD9lPDE2Mzg0P2U8MTI4PzE6MjplPDIwOTcxNTI/Mzo0OnQ8MTYzODQ/dDwxMjg/NTo2OnQ8MjA5NzE1Mj83Ojg6bjwxMjg/OToxMH07fSw5NjkzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10O2Z1bmN0aW9uIG8oZSx0LG4pe2Zvcih2YXIgcj1PYmplY3Qua2V5cyh0KSxvPTA7bzxyLmxlbmd0aDsrK28pdm9pZCAwIT09ZVtyW29dXSYmbnx8KGVbcltvXV09dFtyW29dXSk7cmV0dXJuIGV9ZnVuY3Rpb24gaShlKXtmdW5jdGlvbiB0KGUsbil7aWYoISh0aGlzIGluc3RhbmNlb2YgdCkpcmV0dXJuIG5ldyB0KGUsbik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1lc3NhZ2UiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZX19KSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHQpOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzdGFjayIse3ZhbHVlOihuZXcgRXJyb3IpLnN0YWNrfHwiIn0pLG4mJm8odGhpcyxuKTt9cmV0dXJuIHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0sbmFtZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGV9LHNldDp2b2lkIDAsZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9LHRvU3RyaW5nOnt2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUrIjogIit0aGlzLm1lc3NhZ2V9LHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfX0pLHR9ci5hc1Byb21pc2U9big0NTM3KSxyLmJhc2U2ND1uKDc0MTkpLHIuRXZlbnRFbWl0dGVyPW4oOTIxMSksci5mbG9hdD1uKDk0NSksci5pbnF1aXJlPW4oNzE5OSksci51dGY4PW4oNDk5Nyksci5wb29sPW4oNjY2Miksci5Mb25nQml0cz1uKDE5NDUpLHIuaXNOb2RlPUJvb2xlYW4odm9pZCAwIT09Y29tbW9uanNHbG9iYWwmJmNvbW1vbmpzR2xvYmFsJiZjb21tb25qc0dsb2JhbC5wcm9jZXNzJiZjb21tb25qc0dsb2JhbC5wcm9jZXNzLnZlcnNpb25zJiZjb21tb25qc0dsb2JhbC5wcm9jZXNzLnZlcnNpb25zLm5vZGUpLHIuZ2xvYmFsPXIuaXNOb2RlJiZjb21tb25qc0dsb2JhbHx8InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvd3x8InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZzZWxmfHx0aGlzLHIuZW1wdHlBcnJheT1PYmplY3QuZnJlZXplP09iamVjdC5mcmVlemUoW10pOltdLHIuZW1wdHlPYmplY3Q9T2JqZWN0LmZyZWV6ZT9PYmplY3QuZnJlZXplKHt9KTp7fSxyLmlzSW50ZWdlcj1OdW1iZXIuaXNJbnRlZ2VyfHxmdW5jdGlvbihlKXtyZXR1cm4gIm51bWJlciI9PXR5cGVvZiBlJiZpc0Zpbml0ZShlKSYmTWF0aC5mbG9vcihlKT09PWV9LHIuaXNTdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuICJzdHJpbmciPT10eXBlb2YgZXx8ZSBpbnN0YW5jZW9mIFN0cmluZ30sci5pc09iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZSYmIm9iamVjdCI9PXR5cGVvZiBlfSxyLmlzc2V0PXIuaXNTZXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lW3RdO3JldHVybiAhKG51bGw9PW58fCFlLmhhc093blByb3BlcnR5KHQpKSYmKCJvYmplY3QiIT10eXBlb2Ygbnx8KEFycmF5LmlzQXJyYXkobik/bi5sZW5ndGg6T2JqZWN0LmtleXMobikubGVuZ3RoKT4wKX0sci5CdWZmZXI9ZnVuY3Rpb24oKXt0cnl7dmFyIGU9ci5pbnF1aXJlKCJidWZmZXIiKS5CdWZmZXI7cmV0dXJuIGUucHJvdG90eXBlLnV0ZjhXcml0ZT9lOm51bGx9Y2F0Y2goZSl7cmV0dXJuIG51bGx9fSgpLHIuX0J1ZmZlcl9mcm9tPW51bGwsci5fQnVmZmVyX2FsbG9jVW5zYWZlPW51bGwsci5uZXdCdWZmZXI9ZnVuY3Rpb24oZSl7cmV0dXJuICJudW1iZXIiPT10eXBlb2YgZT9yLkJ1ZmZlcj9yLl9CdWZmZXJfYWxsb2NVbnNhZmUoZSk6bmV3IHIuQXJyYXkoZSk6ci5CdWZmZXI/ci5fQnVmZmVyX2Zyb20oZSk6InVuZGVmaW5lZCI9PXR5cGVvZiBVaW50OEFycmF5P2U6bmV3IFVpbnQ4QXJyYXkoZSl9LHIuQXJyYXk9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksci5Mb25nPXIuZ2xvYmFsLmRjb2RlSU8mJnIuZ2xvYmFsLmRjb2RlSU8uTG9uZ3x8ci5nbG9iYWwuTG9uZ3x8ci5pbnF1aXJlKCJsb25nIiksci5rZXkyUmU9L150cnVlfGZhbHNlfDB8MSQvLHIua2V5MzJSZT0vXi0/KD86MHxbMS05XVswLTldKikkLyxyLmtleTY0UmU9L14oPzpbXFx4MDAtXFx4ZmZdezh9fC0/KD86MHxbMS05XVswLTldKikpJC8sci5sb25nVG9IYXNoPWZ1bmN0aW9uKGUpe3JldHVybiBlP3IuTG9uZ0JpdHMuZnJvbShlKS50b0hhc2goKTpyLkxvbmdCaXRzLnplcm9IYXNofSxyLmxvbmdGcm9tSGFzaD1mdW5jdGlvbihlLHQpe3ZhciBuPXIuTG9uZ0JpdHMuZnJvbUhhc2goZSk7cmV0dXJuIHIuTG9uZz9yLkxvbmcuZnJvbUJpdHMobi5sbyxuLmhpLHQpOm4udG9OdW1iZXIoQm9vbGVhbih0KSl9LHIubWVyZ2U9byxyLmxjRmlyc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkrZS5zdWJzdHJpbmcoMSl9LHIubmV3RXJyb3I9aSxyLlByb3RvY29sRXJyb3I9aSgiUHJvdG9jb2xFcnJvciIpLHIub25lT2ZHZXR0ZXI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoOysrbil0W2Vbbl1dPTE7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKHRoaXMpLG49ZS5sZW5ndGgtMTtuPi0xOy0tbilpZigxPT09dFtlW25dXSYmdm9pZCAwIT09dGhpc1tlW25dXSYmbnVsbCE9PXRoaXNbZVtuXV0pcmV0dXJuIGVbbl19fSxyLm9uZU9mU2V0dGVyPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoOysrbillW25dIT09dCYmZGVsZXRlIHRoaXNbZVtuXV07fX0sci50b0pTT05PcHRpb25zPXtsb25nczpTdHJpbmcsZW51bXM6U3RyaW5nLGJ5dGVzOlN0cmluZyxqc29uOiEwfSxyLl9jb25maWd1cmU9ZnVuY3Rpb24oKXt2YXIgZT1yLkJ1ZmZlcjtlPyhyLl9CdWZmZXJfZnJvbT1lLmZyb20hPT1VaW50OEFycmF5LmZyb20mJmUuZnJvbXx8ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IGUodCxuKX0sci5fQnVmZmVyX2FsbG9jVW5zYWZlPWUuYWxsb2NVbnNhZmV8fGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0pOnIuX0J1ZmZlcl9mcm9tPXIuX0J1ZmZlcl9hbGxvY1Vuc2FmZT1udWxsO307fSwxMTczOihlLHQsbik9PntlLmV4cG9ydHM9cDt2YXIgcixvPW4oOTY5MyksaT1vLkxvbmdCaXRzLHM9by5iYXNlNjQsYT1vLnV0Zjg7ZnVuY3Rpb24gdShlLHQsbil7dGhpcy5mbj1lLHRoaXMubGVuPXQsdGhpcy5uZXh0PXZvaWQgMCx0aGlzLnZhbD1uO31mdW5jdGlvbiBsKCl7fWZ1bmN0aW9uIGMoZSl7dGhpcy5oZWFkPWUuaGVhZCx0aGlzLnRhaWw9ZS50YWlsLHRoaXMubGVuPWUubGVuLHRoaXMubmV4dD1lLnN0YXRlczt9ZnVuY3Rpb24gcCgpe3RoaXMubGVuPTAsdGhpcy5oZWFkPW5ldyB1KGwsMCwwKSx0aGlzLnRhaWw9dGhpcy5oZWFkLHRoaXMuc3RhdGVzPW51bGw7fXZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuIG8uQnVmZmVyP2Z1bmN0aW9uKCl7cmV0dXJuIChwLmNyZWF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgcn0pKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwfX07ZnVuY3Rpb24gZihlLHQsbil7dFtuXT0yNTUmZTt9ZnVuY3Rpb24gaChlLHQpe3RoaXMubGVuPWUsdGhpcy5uZXh0PXZvaWQgMCx0aGlzLnZhbD10O31mdW5jdGlvbiBnKGUsdCxuKXtmb3IoO2UuaGk7KXRbbisrXT0xMjcmZS5sb3wxMjgsZS5sbz0oZS5sbz4+Pjd8ZS5oaTw8MjUpPj4+MCxlLmhpPj4+PTc7Zm9yKDtlLmxvPjEyNzspdFtuKytdPTEyNyZlLmxvfDEyOCxlLmxvPWUubG8+Pj43O3RbbisrXT1lLmxvO31mdW5jdGlvbiBiKGUsdCxuKXt0W25dPTI1NSZlLHRbbisxXT1lPj4+OCYyNTUsdFtuKzJdPWU+Pj4xNiYyNTUsdFtuKzNdPWU+Pj4yNDt9cC5jcmVhdGU9ZCgpLHAuYWxsb2M9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBvLkFycmF5KGUpfSxvLkFycmF5IT09QXJyYXkmJihwLmFsbG9jPW8ucG9vbChwLmFsbG9jLG8uQXJyYXkucHJvdG90eXBlLnN1YmFycmF5KSkscC5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLnRhaWw9dGhpcy50YWlsLm5leHQ9bmV3IHUoZSx0LG4pLHRoaXMubGVuKz10LHRoaXN9LGgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodS5wcm90b3R5cGUpLGgucHJvdG90eXBlLmZuPWZ1bmN0aW9uKGUsdCxuKXtmb3IoO2U+MTI3Oyl0W24rK109MTI3JmV8MTI4LGU+Pj49Nzt0W25dPWU7fSxwLnByb3RvdHlwZS51aW50MzI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubGVuKz0odGhpcy50YWlsPXRoaXMudGFpbC5uZXh0PW5ldyBoKChlPj4+PTApPDEyOD8xOmU8MTYzODQ/MjplPDIwOTcxNTI/MzplPDI2ODQzNTQ1Nj80OjUsZSkpLmxlbix0aGlzfSxwLnByb3RvdHlwZS5pbnQzMj1mdW5jdGlvbihlKXtyZXR1cm4gZTwwP3RoaXMuX3B1c2goZywxMCxpLmZyb21OdW1iZXIoZSkpOnRoaXMudWludDMyKGUpfSxwLnByb3RvdHlwZS5zaW50MzI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudWludDMyKChlPDwxXmU+PjMxKT4+PjApfSxwLnByb3RvdHlwZS51aW50NjQ9ZnVuY3Rpb24oZSl7dmFyIHQ9aS5mcm9tKGUpO3JldHVybiB0aGlzLl9wdXNoKGcsdC5sZW5ndGgoKSx0KX0scC5wcm90b3R5cGUuaW50NjQ9cC5wcm90b3R5cGUudWludDY0LHAucHJvdG90eXBlLnNpbnQ2ND1mdW5jdGlvbihlKXt2YXIgdD1pLmZyb20oZSkuenpFbmNvZGUoKTtyZXR1cm4gdGhpcy5fcHVzaChnLHQubGVuZ3RoKCksdCl9LHAucHJvdG90eXBlLmJvb2w9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3B1c2goZiwxLGU/MTowKX0scC5wcm90b3R5cGUuZml4ZWQzMj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcHVzaChiLDQsZT4+PjApfSxwLnByb3RvdHlwZS5zZml4ZWQzMj1wLnByb3RvdHlwZS5maXhlZDMyLHAucHJvdG90eXBlLmZpeGVkNjQ9ZnVuY3Rpb24oZSl7dmFyIHQ9aS5mcm9tKGUpO3JldHVybiB0aGlzLl9wdXNoKGIsNCx0LmxvKS5fcHVzaChiLDQsdC5oaSl9LHAucHJvdG90eXBlLnNmaXhlZDY0PXAucHJvdG90eXBlLmZpeGVkNjQscC5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3B1c2goby5mbG9hdC53cml0ZUZsb2F0TEUsNCxlKX0scC5wcm90b3R5cGUuZG91YmxlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9wdXNoKG8uZmxvYXQud3JpdGVEb3VibGVMRSw4LGUpfTt2YXIgbT1vLkFycmF5LnByb3RvdHlwZS5zZXQ/ZnVuY3Rpb24oZSx0LG4pe3Quc2V0KGUsbik7fTpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDsrK3IpdFtuK3JdPWVbcl07fTtwLnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aD4+PjA7aWYoIXQpcmV0dXJuIHRoaXMuX3B1c2goZiwxLDApO2lmKG8uaXNTdHJpbmcoZSkpe3ZhciBuPXAuYWxsb2ModD1zLmxlbmd0aChlKSk7cy5kZWNvZGUoZSxuLDApLGU9bjt9cmV0dXJuIHRoaXMudWludDMyKHQpLl9wdXNoKG0sdCxlKX0scC5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKGUpe3ZhciB0PWEubGVuZ3RoKGUpO3JldHVybiB0P3RoaXMudWludDMyKHQpLl9wdXNoKGEud3JpdGUsdCxlKTp0aGlzLl9wdXNoKGYsMSwwKX0scC5wcm90b3R5cGUuZm9yaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlcz1uZXcgYyh0aGlzKSx0aGlzLmhlYWQ9dGhpcy50YWlsPW5ldyB1KGwsMCwwKSx0aGlzLmxlbj0wLHRoaXN9LHAucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGVzPyh0aGlzLmhlYWQ9dGhpcy5zdGF0ZXMuaGVhZCx0aGlzLnRhaWw9dGhpcy5zdGF0ZXMudGFpbCx0aGlzLmxlbj10aGlzLnN0YXRlcy5sZW4sdGhpcy5zdGF0ZXM9dGhpcy5zdGF0ZXMubmV4dCk6KHRoaXMuaGVhZD10aGlzLnRhaWw9bmV3IHUobCwwLDApLHRoaXMubGVuPTApLHRoaXN9LHAucHJvdG90eXBlLmxkZWxpbT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaGVhZCx0PXRoaXMudGFpbCxuPXRoaXMubGVuO3JldHVybiB0aGlzLnJlc2V0KCkudWludDMyKG4pLG4mJih0aGlzLnRhaWwubmV4dD1lLm5leHQsdGhpcy50YWlsPXQsdGhpcy5sZW4rPW4pLHRoaXN9LHAucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmhlYWQubmV4dCx0PXRoaXMuY29uc3RydWN0b3IuYWxsb2ModGhpcy5sZW4pLG49MDtlOyllLmZuKGUudmFsLHQsbiksbis9ZS5sZW4sZT1lLm5leHQ7cmV0dXJuIHR9LHAuX2NvbmZpZ3VyZT1mdW5jdGlvbihlKXtyPWUscC5jcmVhdGU9ZCgpLHIuX2NvbmZpZ3VyZSgpO307fSwzMTU1OihlLHQsbik9PntlLmV4cG9ydHM9aTt2YXIgcj1uKDExNzMpOyhpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHIucHJvdG90eXBlKSkuY29uc3RydWN0b3I9aTt2YXIgbz1uKDk2OTMpO2Z1bmN0aW9uIGkoKXtyLmNhbGwodGhpcyk7fWZ1bmN0aW9uIHMoZSx0LG4pe2UubGVuZ3RoPDQwP28udXRmOC53cml0ZShlLHQsbik6dC51dGY4V3JpdGU/dC51dGY4V3JpdGUoZSxuKTp0LndyaXRlKGUsbik7fWkuX2NvbmZpZ3VyZT1mdW5jdGlvbigpe2kuYWxsb2M9by5fQnVmZmVyX2FsbG9jVW5zYWZlLGkud3JpdGVCeXRlc0J1ZmZlcj1vLkJ1ZmZlciYmby5CdWZmZXIucHJvdG90eXBlIGluc3RhbmNlb2YgVWludDhBcnJheSYmInNldCI9PT1vLkJ1ZmZlci5wcm90b3R5cGUuc2V0Lm5hbWU/ZnVuY3Rpb24oZSx0LG4pe3Quc2V0KGUsbik7fTpmdW5jdGlvbihlLHQsbil7aWYoZS5jb3B5KWUuY29weSh0LG4sMCxlLmxlbmd0aCk7ZWxzZSBmb3IodmFyIHI9MDtyPGUubGVuZ3RoOyl0W24rK109ZVtyKytdO307fSxpLnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbihlKXtvLmlzU3RyaW5nKGUpJiYoZT1vLl9CdWZmZXJfZnJvbShlLCJiYXNlNjQiKSk7dmFyIHQ9ZS5sZW5ndGg+Pj4wO3JldHVybiB0aGlzLnVpbnQzMih0KSx0JiZ0aGlzLl9wdXNoKGkud3JpdGVCeXRlc0J1ZmZlcix0LGUpLHRoaXN9LGkucHJvdG90eXBlLnN0cmluZz1mdW5jdGlvbihlKXt2YXIgdD1vLkJ1ZmZlci5ieXRlTGVuZ3RoKGUpO3JldHVybiB0aGlzLnVpbnQzMih0KSx0JiZ0aGlzLl9wdXNoKHMsdCxlKSx0aGlzfSxpLl9jb25maWd1cmUoKTt9LDQxNTQ6ZT0+e2UuZXhwb3J0cz0nInVzZSBzdHJpY3QiO3ZhciBlPXt9LGE9Im9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiYib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMmJiJzdHJpbmciPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlO2lmKGEpe3ZhciByPXJlcXVpcmUoIndvcmtlcl90aHJlYWRzIiksdD1yLnBhcmVudFBvcnQ7dC5vbigibWVzc2FnZSIsKGU9Pm9ubWVzc2FnZSh7ZGF0YTplfSkpKTt2YXIgcz1yZXF1aXJlKCJmcyIpO09iamVjdC5hc3NpZ24oZ2xvYmFsLHtzZWxmOmdsb2JhbCxyZXF1aXJlOnJlcXVpcmUsTW9kdWxlOmUsbG9jYXRpb246e2hyZWY6X19maWxlbmFtZX0sV29ya2VyOnIuV29ya2VyLGltcG9ydFNjcmlwdHM6ZT0+KDAsZXZhbCkocy5yZWFkRmlsZVN5bmMoZSwidXRmOCIpKyIvLyMgc291cmNlVVJMPSIrZSkscG9zdE1lc3NhZ2U6ZT0+dC5wb3N0TWVzc2FnZShlKSxwZXJmb3JtYW5jZTpnbG9iYWwucGVyZm9ybWFuY2V8fHtub3c6RGF0ZS5ub3d9fSl9dmFyIG89ITEsZD1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiICIpO2E/cy53cml0ZVN5bmMoMixlKyJcXG4iKTpjb25zb2xlLmVycm9yKGUpfTtzZWxmLmFsZXJ0PWZ1bmN0aW9uKCl7dmFyIGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIgIik7cG9zdE1lc3NhZ2Uoe2NtZDoiYWxlcnQiLHRleHQ6YSx0aHJlYWRJZDplLl9wdGhyZWFkX3NlbGYoKX0pfSxlLmluc3RhbnRpYXRlV2FzbT0oYSxyKT0+e3ZhciB0PWUud2FzbU1vZHVsZTtyZXR1cm4gZS53YXNtTW9kdWxlPW51bGwscihuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UodCxhKSl9LHNlbGYub251bmhhbmRsZWRyZWplY3Rpb249ZT0+e3Rocm93IGUucmVhc29uPz9lfSxzZWxmLm9ubWVzc2FnZT1mdW5jdGlvbiBhKHIpe3RyeXtpZigibG9hZCI9PT1yLmRhdGEuY21kKXtsZXQgcz1bXTtzZWxmLm9ubWVzc2FnZT1lPT5zLnB1c2goZSksc2VsZi5zdGFydFdvcmtlcj1yPT57ZT1yLHBvc3RNZXNzYWdlKHtjbWQ6ImxvYWRlZCJ9KTtmb3IobGV0IGUgb2YgcylhKGUpO3NlbGYub25tZXNzYWdlPWF9LGUud2FzbU1vZHVsZT1yLmRhdGEud2FzbU1vZHVsZTtmb3IoY29uc3QgYSBvZiByLmRhdGEuaGFuZGxlcnMpZVthXT0oLi4uZSk9Pntwb3N0TWVzc2FnZSh7Y21kOiJjYWxsSGFuZGxlciIsaGFuZGxlcjphLGFyZ3M6ZX0pfTtpZihlLndhc21NZW1vcnk9ci5kYXRhLndhc21NZW1vcnksZS5idWZmZXI9ZS53YXNtTWVtb3J5LmJ1ZmZlcixlLkVOVklST05NRU5UX0lTX1BUSFJFQUQ9ITAsInN0cmluZyI9PXR5cGVvZiByLmRhdGEudXJsT3JCbG9iKWltcG9ydFNjcmlwdHMoci5kYXRhLnVybE9yQmxvYik7ZWxzZXt2YXIgdD1VUkwuY3JlYXRlT2JqZWN0VVJMKHIuZGF0YS51cmxPckJsb2IpO2ltcG9ydFNjcmlwdHModCksVVJMLnJldm9rZU9iamVjdFVSTCh0KX1vcnRXYXNtVGhyZWFkZWQoZSl9ZWxzZSBpZigicnVuIj09PXIuZGF0YS5jbWQpe2UuX19lbXNjcmlwdGVuX3RocmVhZF9pbml0KHIuZGF0YS5wdGhyZWFkX3B0ciwwLDAsMSksZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX21haWxib3hfYXdhaXQoci5kYXRhLnB0aHJlYWRfcHRyKSxlLmVzdGFibGlzaFN0YWNrU3BhY2UoKSxlLlBUaHJlYWQucmVjZWl2ZU9iamVjdFRyYW5zZmVyKHIuZGF0YSksZS5QVGhyZWFkLnRocmVhZEluaXRUTFMoKSxvfHwobz0hMCk7dHJ5e2UuaW52b2tlRW50cnlQb2ludChyLmRhdGEuc3RhcnRfcm91dGluZSxyLmRhdGEuYXJnKX1jYXRjaChlKXtpZigidW53aW5kIiE9ZSl0aHJvdyBlfX1lbHNlImNhbmNlbCI9PT1yLmRhdGEuY21kP2UuX3B0aHJlYWRfc2VsZigpJiZlLl9fZW1zY3JpcHRlbl90aHJlYWRfZXhpdCgtMSk6InNldGltbWVkaWF0ZSI9PT1yLmRhdGEudGFyZ2V0fHwoImNoZWNrTWFpbGJveCI9PT1yLmRhdGEuY21kP28mJmUuY2hlY2tNYWlsYm94KCk6ci5kYXRhLmNtZCYmKGQoIndvcmtlci5qcyByZWNlaXZlZCB1bmtub3duIGNvbW1hbmQgIityLmRhdGEuY21kKSxkKHIuZGF0YSkpKX1jYXRjaChhKXt0aHJvdyBlLl9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZCYmZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2NyYXNoZWQoKSxhfX07XG4nO30sNzA2NzooKT0+e30sMTI5NjooKT0+e30sNzYwOigpPT57fSwxMzg0OigpPT57fSwzOTkzOigpPT57fSw5MDg6KCk9Pnt9LDY5NTM6KCk9Pnt9LDk5MjU6KCk9Pnt9LDI4MDY6KCk9Pnt9LDY0NDk6KCk9Pnt9LDI4NTA6KCk9Pnt9LDUzODE6KCk9Pnt9LDY4NTooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnJlc29sdmVCYWNrZW5kPXQucmVnaXN0ZXJCYWNrZW5kPXZvaWQgMDtjb25zdCBuPXt9LHI9W107dC5yZWdpc3RlckJhY2tlbmQ9KGUsdCxvKT0+e2lmKCF0fHwiZnVuY3Rpb24iIT10eXBlb2YgdC5pbml0fHwiZnVuY3Rpb24iIT10eXBlb2YgdC5jcmVhdGVTZXNzaW9uSGFuZGxlcil0aHJvdyBuZXcgVHlwZUVycm9yKCJub3QgYSB2YWxpZCBiYWNrZW5kIik7e2NvbnN0IGk9bltlXTtpZih2b2lkIDA9PT1pKW5bZV09e2JhY2tlbmQ6dCxwcmlvcml0eTpvfTtlbHNlIHtpZihpLnByaW9yaXR5Pm8pcmV0dXJuO2lmKGkucHJpb3JpdHk9PT1vJiZpLmJhY2tlbmQhPT10KXRocm93IG5ldyBFcnJvcihgY2Fubm90IHJlZ2lzdGVyIGJhY2tlbmQgIiR7ZX0iIHVzaW5nIHByaW9yaXR5ICR7b31gKX1pZihvPj0wKXtjb25zdCB0PXIuaW5kZXhPZihlKTstMSE9PXQmJnIuc3BsaWNlKHQsMSk7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0KyspaWYobltyW3RdXS5wcmlvcml0eTw9bylyZXR1cm4gdm9pZCByLnNwbGljZSh0LDAsZSk7ci5wdXNoKGUpO319fSx0LnJlc29sdmVCYWNrZW5kPWFzeW5jIGU9Pntjb25zdCB0PTA9PT1lLmxlbmd0aD9yOmUsbz1bXTtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PW5bZV07aWYodCl7aWYodC5pbml0aWFsaXplZClyZXR1cm4gdC5iYWNrZW5kO2lmKHQuYWJvcnRlZCljb250aW51ZTtjb25zdCBuPSEhdC5pbml0UHJvbWlzZTt0cnl7cmV0dXJuIG58fCh0LmluaXRQcm9taXNlPXQuYmFja2VuZC5pbml0KCkpLGF3YWl0IHQuaW5pdFByb21pc2UsdC5pbml0aWFsaXplZD0hMCx0LmJhY2tlbmR9Y2F0Y2gocil7bnx8by5wdXNoKHtuYW1lOmUsZXJyOnJ9KSx0LmFib3J0ZWQ9ITA7fWZpbmFsbHl7ZGVsZXRlIHQuaW5pdFByb21pc2U7fX19dGhyb3cgbmV3IEVycm9yKGBubyBhdmFpbGFibGUgYmFja2VuZCBmb3VuZC4gRVJSOiAke28ubWFwKChlPT5gWyR7ZS5uYW1lfV0gJHtlLmVycn1gKSkuam9pbigiLCAiKX1gKX07fSw0Nzk4OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZWdpc3RlckJhY2tlbmQ9dm9pZCAwO3ZhciByPW4oNjg1KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicmVnaXN0ZXJCYWNrZW5kIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5yZWdpc3RlckJhY2tlbmR9fSk7fSwzMTIxOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5lbnY9dm9pZCAwO2NvbnN0IHI9big5MTA0KTtsZXQgbz0id2FybmluZyI7dC5lbnY9e3dhc206e30sd2ViZ2w6e30sd2ViZ3B1Ont9LHZlcnNpb25zOntjb21tb246ci52ZXJzaW9ufSxzZXQgbG9nTGV2ZWwoZSl7aWYodm9pZCAwIT09ZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlfHwtMT09PVsidmVyYm9zZSIsImluZm8iLCJ3YXJuaW5nIiwiZXJyb3IiLCJmYXRhbCJdLmluZGV4T2YoZSkpdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2dnaW5nIGxldmVsOiAke2V9YCk7bz1lO319LGdldCBsb2dMZXZlbCgpe3JldHVybiBvfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuZW52LCJsb2dMZXZlbCIse2VudW1lcmFibGU6ITB9KTt9LDI0NTc6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmVudj12b2lkIDA7Y29uc3Qgcj1uKDMxMjEpO3QuZW52PXIuZW52O30sMjIzNTpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyYmdGhpcy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pO3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtvJiYhKCJnZXQiaW4gbz8hdC5fX2VzTW9kdWxlOm8ud3JpdGFibGV8fG8uY29uZmlndXJhYmxlKXx8KG89e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixvKTt9OmZ1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pLGVbcl09dFtuXTt9KSxvPXRoaXMmJnRoaXMuX19leHBvcnRTdGFyfHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKSJkZWZhdWx0Ij09PW58fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pfHxyKHQsZSxuKTt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxvKG4oNDc5OCksdCksbyhuKDI0NTcpLHQpLG8obigzOTc0KSx0KSxvKG4oOTYzKSx0KSxvKG4oNzg1MiksdCk7fSw4MDM2OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5JbmZlcmVuY2VTZXNzaW9uPXZvaWQgMDtjb25zdCByPW4oNjg1KSxvPW4oOTYzKTtjbGFzcyBpe2NvbnN0cnVjdG9yKGUpe3RoaXMuaGFuZGxlcj1lO31hc3luYyBydW4oZSx0LG4pe2NvbnN0IHI9e307bGV0IGk9e307aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZXx8ZSBpbnN0YW5jZW9mIG8uVGVuc29yfHxBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIidmZWVkcycgbXVzdCBiZSBhbiBvYmplY3QgdGhhdCB1c2UgaW5wdXQgbmFtZXMgYXMga2V5cyBhbmQgT25ueFZhbHVlIGFzIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiIpO2xldCBzPSEwO2lmKCJvYmplY3QiPT10eXBlb2YgdCl7aWYobnVsbD09PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5leHBlY3RlZCBhcmd1bWVudFsxXTogY2Fubm90IGJlIG51bGwuIik7aWYodCBpbnN0YW5jZW9mIG8uVGVuc29yKXRocm93IG5ldyBUeXBlRXJyb3IoIidmZXRjaGVzJyBjYW5ub3QgYmUgYSBUZW5zb3IiKTtpZihBcnJheS5pc0FycmF5KHQpKXtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2ZldGNoZXMnIGNhbm5vdCBiZSBhbiBlbXB0eSBhcnJheS4iKTtzPSExO2Zvcihjb25zdCBlIG9mIHQpe2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCInZmV0Y2hlcycgbXVzdCBiZSBhIHN0cmluZyBhcnJheSBvciBhbiBvYmplY3QuIik7aWYoLTE9PT10aGlzLm91dHB1dE5hbWVzLmluZGV4T2YoZSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCdmZXRjaGVzJyBjb250YWlucyBpbnZhbGlkIG91dHB1dCBuYW1lOiAke2V9LmApO3JbZV09bnVsbDt9aWYoIm9iamVjdCI9PXR5cGVvZiBuJiZudWxsIT09bilpPW47ZWxzZSBpZih2b2lkIDAhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIHtsZXQgZT0hMTtjb25zdCBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpO2Zvcihjb25zdCBuIG9mIHRoaXMub3V0cHV0TmFtZXMpaWYoLTEhPT1hLmluZGV4T2Yobikpe2NvbnN0IGk9dFtuXTsobnVsbD09PWl8fGkgaW5zdGFuY2VvZiBvLlRlbnNvcikmJihlPSEwLHM9ITEscltuXT1pKTt9aWYoZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBuJiZudWxsIT09bilpPW47ZWxzZSBpZih2b2lkIDAhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIGk9dDt9fWVsc2UgaWYodm9pZCAwIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmV4cGVjdGVkIGFyZ3VtZW50WzFdOiBtdXN0IGJlICdmZXRjaGVzJyBvciAnb3B0aW9ucycuIik7Zm9yKGNvbnN0IHQgb2YgdGhpcy5pbnB1dE5hbWVzKWlmKHZvaWQgMD09PWVbdF0pdGhyb3cgbmV3IEVycm9yKGBpbnB1dCAnJHt0fScgaXMgbWlzc2luZyBpbiAnZmVlZHMnLmApO2lmKHMpZm9yKGNvbnN0IGUgb2YgdGhpcy5vdXRwdXROYW1lcylyW2VdPW51bGw7Y29uc3QgYT1hd2FpdCB0aGlzLmhhbmRsZXIucnVuKGUscixpKSx1PXt9O2Zvcihjb25zdCBlIGluIGEpT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYSxlKSYmKHVbZV09bmV3IG8uVGVuc29yKGFbZV0udHlwZSxhW2VdLmRhdGEsYVtlXS5kaW1zKSk7cmV0dXJuIHV9YXN5bmMgcmVsZWFzZSgpe3JldHVybiB0aGlzLmhhbmRsZXIuZGlzcG9zZSgpfXN0YXRpYyBhc3luYyBjcmVhdGUoZSx0LG4sbyl7bGV0IHMsYT17fTtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKHM9ZSwib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KWE9dDtlbHNlIGlmKHZvaWQgMCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ29wdGlvbnMnIG11c3QgYmUgYW4gb2JqZWN0LiIpfWVsc2UgaWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2lmKHM9ZSwib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KWE9dDtlbHNlIGlmKHZvaWQgMCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ29wdGlvbnMnIG11c3QgYmUgYW4gb2JqZWN0LiIpfWVsc2Uge2lmKCEoZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwidW5kZWZpbmVkIiE9dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVuZXhwZWN0ZWQgYXJndW1lbnRbMF06IG11c3QgYmUgJ3BhdGgnIG9yICdidWZmZXInLiIpO3tjb25zdCByPWU7bGV0IGk9MCx1PWUuYnl0ZUxlbmd0aDtpZigib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KWE9dDtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoaT10LCFOdW1iZXIuaXNTYWZlSW50ZWdlcihpKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2J5dGVPZmZzZXQnIG11c3QgYmUgYW4gaW50ZWdlci4iKTtpZihpPDB8fGk+PXIuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJ2J5dGVPZmZzZXQnIGlzIG91dCBvZiByYW5nZSBbMCwgJHtyLmJ5dGVMZW5ndGh9KS5gKTtpZih1PWUuYnl0ZUxlbmd0aC1pLCJudW1iZXIiPT10eXBlb2Ygbil7aWYodT1uLCFOdW1iZXIuaXNTYWZlSW50ZWdlcih1KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2J5dGVMZW5ndGgnIG11c3QgYmUgYW4gaW50ZWdlci4iKTtpZih1PD0wfHxpK3U+ci5ieXRlTGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKGAnYnl0ZUxlbmd0aCcgaXMgb3V0IG9mIHJhbmdlICgwLCAke3IuYnl0ZUxlbmd0aC1pfV0uYCk7aWYoIm9iamVjdCI9PXR5cGVvZiBvJiZudWxsIT09bylhPW87ZWxzZSBpZih2b2lkIDAhPT1vKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIGlmKHZvaWQgMCE9PW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2J5dGVMZW5ndGgnIG11c3QgYmUgYSBudW1iZXIuIil9ZWxzZSBpZih2b2lkIDAhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKTtzPW5ldyBVaW50OEFycmF5KHIsaSx1KTt9fWNvbnN0IHU9KGEuZXhlY3V0aW9uUHJvdmlkZXJzfHxbXSkubWFwKChlPT4ic3RyaW5nIj09dHlwZW9mIGU/ZTplLm5hbWUpKSxsPWF3YWl0KDAsIHIucmVzb2x2ZUJhY2tlbmQpKHUpLGM9YXdhaXQgbC5jcmVhdGVTZXNzaW9uSGFuZGxlcihzLGEpO3JldHVybiBuZXcgaShjKX1zdGFydFByb2ZpbGluZygpe3RoaXMuaGFuZGxlci5zdGFydFByb2ZpbGluZygpO31lbmRQcm9maWxpbmcoKXt0aGlzLmhhbmRsZXIuZW5kUHJvZmlsaW5nKCk7fWdldCBpbnB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuaGFuZGxlci5pbnB1dE5hbWVzfWdldCBvdXRwdXROYW1lcygpe3JldHVybiB0aGlzLmhhbmRsZXIub3V0cHV0TmFtZXN9fXQuSW5mZXJlbmNlU2Vzc2lvbj1pO30sMzk3NDooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuSW5mZXJlbmNlU2Vzc2lvbj12b2lkIDA7Y29uc3Qgcj1uKDgwMzYpO3QuSW5mZXJlbmNlU2Vzc2lvbj1yLkluZmVyZW5jZVNlc3Npb247fSw3ODUyOihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO30sMjM1MDooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnRlbnNvclRvSW1hZ2VEYXRhPXQudGVuc29yVG9EYXRhVVJMPXZvaWQgMCx0LnRlbnNvclRvRGF0YVVSTD0oZSx0KT0+e2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7bi53aWR0aD1lLmRpbXNbM10sbi5oZWlnaHQ9ZS5kaW1zWzJdO2NvbnN0IHI9bi5nZXRDb250ZXh0KCIyZCIpO2lmKG51bGwhPXIpe2xldCBvLGk7dm9pZCAwIT09dD8udGVuc29yTGF5b3V0JiYiTkhXQyI9PT10LnRlbnNvckxheW91dD8obz1lLmRpbXNbMl0saT1lLmRpbXNbM10pOihvPWUuZGltc1szXSxpPWUuZGltc1syXSk7Y29uc3Qgcz12b2lkIDAhPT10Py5mb3JtYXQ/dC5mb3JtYXQ6IlJHQiIsYT10Py5ub3JtO2xldCB1LGw7dm9pZCAwPT09YXx8dm9pZCAwPT09YS5tZWFuP3U9WzI1NSwyNTUsMjU1LDI1NV06Im51bWJlciI9PXR5cGVvZiBhLm1lYW4/dT1bYS5tZWFuLGEubWVhbixhLm1lYW4sYS5tZWFuXToodT1bYS5tZWFuWzBdLGEubWVhblsxXSxhLm1lYW5bMl0sMF0sdm9pZCAwIT09YS5tZWFuWzNdJiYodVszXT1hLm1lYW5bM10pKSx2b2lkIDA9PT1hfHx2b2lkIDA9PT1hLmJpYXM/bD1bMCwwLDAsMF06Im51bWJlciI9PXR5cGVvZiBhLmJpYXM/bD1bYS5iaWFzLGEuYmlhcyxhLmJpYXMsYS5iaWFzXToobD1bYS5iaWFzWzBdLGEuYmlhc1sxXSxhLmJpYXNbMl0sMF0sdm9pZCAwIT09YS5iaWFzWzNdJiYobFszXT1hLmJpYXNbM10pKTtjb25zdCBjPWkqbztsZXQgcD0wLGQ9YyxmPTIqYyxoPS0xOyJSR0JBIj09PXM/KHA9MCxkPWMsZj0yKmMsaD0zKmMpOiJSR0IiPT09cz8ocD0wLGQ9YyxmPTIqYyk6IlJCRyI9PT1zJiYocD0wLGY9YyxkPTIqYyk7Zm9yKGxldCB0PTA7dDxpO3QrKylmb3IobGV0IG49MDtuPG87bisrKXtjb25zdCBvPShlLmRhdGFbcCsrXS1sWzBdKSp1WzBdLGk9KGUuZGF0YVtkKytdLWxbMV0pKnVbMV0scz0oZS5kYXRhW2YrK10tbFsyXSkqdVsyXSxhPS0xPT09aD8yNTU6KGUuZGF0YVtoKytdLWxbM10pKnVbM107ci5maWxsU3R5bGU9InJnYmEoIitvKyIsIitpKyIsIitzKyIsIithKyIpIixyLmZpbGxSZWN0KG4sdCwxLDEpO31yZXR1cm4gbi50b0RhdGFVUkwoKX10aHJvdyBuZXcgRXJyb3IoIkNhbiBub3QgYWNjZXNzIGltYWdlIGRhdGEiKX0sdC50ZW5zb3JUb0ltYWdlRGF0YT0oZSx0KT0+e2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiKTtsZXQgcjtpZihudWxsPT1uKXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpO3tsZXQgbyxpLHM7dm9pZCAwIT09dD8udGVuc29yTGF5b3V0JiYiTkhXQyI9PT10LnRlbnNvckxheW91dD8obz1lLmRpbXNbMl0saT1lLmRpbXNbMV0scz1lLmRpbXNbM10pOihvPWUuZGltc1szXSxpPWUuZGltc1syXSxzPWUuZGltc1sxXSk7Y29uc3QgYT12b2lkIDAhPT10JiZ2b2lkIDAhPT10LmZvcm1hdD90LmZvcm1hdDoiUkdCIix1PXQ/Lm5vcm07bGV0IGwsYzt2b2lkIDA9PT11fHx2b2lkIDA9PT11Lm1lYW4/bD1bMjU1LDI1NSwyNTUsMjU1XToibnVtYmVyIj09dHlwZW9mIHUubWVhbj9sPVt1Lm1lYW4sdS5tZWFuLHUubWVhbix1Lm1lYW5dOihsPVt1Lm1lYW5bMF0sdS5tZWFuWzFdLHUubWVhblsyXSwyNTVdLHZvaWQgMCE9PXUubWVhblszXSYmKGxbM109dS5tZWFuWzNdKSksdm9pZCAwPT09dXx8dm9pZCAwPT09dS5iaWFzP2M9WzAsMCwwLDBdOiJudW1iZXIiPT10eXBlb2YgdS5iaWFzP2M9W3UuYmlhcyx1LmJpYXMsdS5iaWFzLHUuYmlhc106KGM9W3UuYmlhc1swXSx1LmJpYXNbMV0sdS5iaWFzWzJdLDBdLHZvaWQgMCE9PXUuYmlhc1szXSYmKGNbM109dS5iaWFzWzNdKSk7Y29uc3QgcD1pKm87aWYodm9pZCAwIT09dCYmKHZvaWQgMCE9PXQuZm9ybWF0JiY0PT09cyYmIlJHQkEiIT09dC5mb3JtYXR8fDM9PT1zJiYiUkdCIiE9PXQuZm9ybWF0JiYiQkdSIiE9PXQuZm9ybWF0KSl0aHJvdyBuZXcgRXJyb3IoIlRlbnNvciBmb3JtYXQgZG9lc24ndCBtYXRjaCBpbnB1dCB0ZW5zb3IgZGltcyIpO2NvbnN0IGQ9NDtsZXQgZj0wLGg9MSxnPTIsYj0zLG09MCx5PXAsdj0yKnAsXz0tMTsiUkdCQSI9PT1hPyhtPTAseT1wLHY9MipwLF89MypwKToiUkdCIj09PWE/KG09MCx5PXAsdj0yKnApOiJSQkciPT09YSYmKG09MCx2PXAseT0yKnApLHI9bi5jcmVhdGVJbWFnZURhdGEobyxpKTtmb3IobGV0IHQ9MDt0PGkqbztmKz1kLGgrPWQsZys9ZCxiKz1kLHQrKylyLmRhdGFbZl09KGUuZGF0YVttKytdLWNbMF0pKmxbMF0sci5kYXRhW2hdPShlLmRhdGFbeSsrXS1jWzFdKSpsWzFdLHIuZGF0YVtnXT0oZS5kYXRhW3YrK10tY1syXSkqbFsyXSxyLmRhdGFbYl09LTE9PT1fPzI1NTooZS5kYXRhW18rK10tY1szXSkqbFszXTt9cmV0dXJuIHJ9O30sNDg2NjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQudGVuc29yRnJvbUltYWdlPXQuYnVmZmVyVG9UZW5zb3I9dm9pZCAwO2NvbnN0IHI9big5NjMpO3QuYnVmZmVyVG9UZW5zb3I9KGUsdCk9PntpZih2b2lkIDA9PT1lKXRocm93IG5ldyBFcnJvcigiSW1hZ2UgYnVmZmVyIG11c3QgYmUgZGVmaW5lZCIpO2lmKHZvaWQgMD09PXQuaGVpZ2h0fHx2b2lkIDA9PT10LndpZHRoKXRocm93IG5ldyBFcnJvcigiSW1hZ2UgaGVpZ2h0IGFuZCB3aWR0aCBtdXN0IGJlIGRlZmluZWQiKTtpZigiTkhXQyI9PT10LnRlbnNvckxheW91dCl0aHJvdyBuZXcgRXJyb3IoIk5IV0MgVGVuc29yIGxheW91dCBpcyBub3Qgc3VwcG9ydGVkIHlldCIpO2NvbnN0e2hlaWdodDpuLHdpZHRoOm99PXQsaT10Lm5vcm0/P3ttZWFuOjI1NSxiaWFzOjB9O2xldCBzLGE7cz0ibnVtYmVyIj09dHlwZW9mIGkubWVhbj9baS5tZWFuLGkubWVhbixpLm1lYW4saS5tZWFuXTpbaS5tZWFuWzBdLGkubWVhblsxXSxpLm1lYW5bMl0saS5tZWFuWzNdPz8yNTVdLGE9Im51bWJlciI9PXR5cGVvZiBpLmJpYXM/W2kuYmlhcyxpLmJpYXMsaS5iaWFzLGkuYmlhc106W2kuYmlhc1swXSxpLmJpYXNbMV0saS5iaWFzWzJdLGkuYmlhc1szXT8/MF07Y29uc3QgdT12b2lkIDAhPT10LmZvcm1hdD90LmZvcm1hdDoiUkdCQSIsbD12b2lkIDAhPT10LnRlbnNvckZvcm1hdCYmdm9pZCAwIT09dC50ZW5zb3JGb3JtYXQ/dC50ZW5zb3JGb3JtYXQ6IlJHQiIsYz1uKm8scD0iUkdCQSI9PT1sP25ldyBGbG9hdDMyQXJyYXkoNCpjKTpuZXcgRmxvYXQzMkFycmF5KDMqYyk7bGV0IGQ9NCxmPTAsaD0xLGc9MixiPTMsbT0wLHk9Yyx2PTIqYyxfPS0xOyJSR0IiPT09dSYmKGQ9MyxmPTAsaD0xLGc9MixiPS0xKSwiUkdCQSI9PT1sP189MypjOiJSQkciPT09bD8obT0wLHY9Yyx5PTIqYyk6IkJHUiI9PT1sJiYodj0wLHk9YyxtPTIqYyk7Zm9yKGxldCB0PTA7dDxjO3QrKyxmKz1kLGcrPWQsaCs9ZCxiKz1kKXBbbSsrXT0oZVtmXSthWzBdKS9zWzBdLHBbeSsrXT0oZVtoXSthWzFdKS9zWzFdLHBbdisrXT0oZVtnXSthWzJdKS9zWzJdLC0xIT09XyYmLTEhPT1iJiYocFtfKytdPShlW2JdK2FbM10pL3NbM10pO3JldHVybiAiUkdCQSI9PT1sP25ldyByLlRlbnNvcigiZmxvYXQzMiIscCxbMSw0LG4sb10pOm5ldyByLlRlbnNvcigiZmxvYXQzMiIscCxbMSwzLG4sb10pfSx0LnRlbnNvckZyb21JbWFnZT1hc3luYyhlLG4pPT57Y29uc3Qgcj0idW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQmJmUgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50LG89InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZURhdGEmJmUgaW5zdGFuY2VvZiBJbWFnZURhdGEsaT0idW5kZWZpbmVkIiE9dHlwZW9mIEltYWdlQml0bWFwJiZlIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAscz0ic3RyaW5nIj09dHlwZW9mIGU7bGV0IGEsdT1uPz97fTtpZihyKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3Qud2lkdGg9ZS53aWR0aCx0LmhlaWdodD1lLmhlaWdodDtjb25zdCByPXQuZ2V0Q29udGV4dCgiMmQiKTtpZihudWxsPT1yKXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpO3tsZXQgdD1lLmhlaWdodCxvPWUud2lkdGg7aWYodm9pZCAwIT09biYmdm9pZCAwIT09bi5yZXNpemVkSGVpZ2h0JiZ2b2lkIDAhPT1uLnJlc2l6ZWRXaWR0aCYmKHQ9bi5yZXNpemVkSGVpZ2h0LG89bi5yZXNpemVkV2lkdGgpLHZvaWQgMCE9PW4pe2lmKHU9bix2b2lkIDAhPT1uLnRlbnNvckZvcm1hdCl0aHJvdyBuZXcgRXJyb3IoIkltYWdlIGlucHV0IGNvbmZpZyBmb3JtYXQgbXVzdCBiZSBSR0JBIGZvciBIVE1MSW1hZ2VFbGVtZW50Iik7dS50ZW5zb3JGb3JtYXQ9IlJHQkEiLHUuaGVpZ2h0PXQsdS53aWR0aD1vO31lbHNlIHUudGVuc29yRm9ybWF0PSJSR0JBIix1LmhlaWdodD10LHUud2lkdGg9bztyLmRyYXdJbWFnZShlLDAsMCksYT1yLmdldEltYWdlRGF0YSgwLDAsbyx0KS5kYXRhO319ZWxzZSB7aWYoIW8pe2lmKGkpe2lmKHZvaWQgMD09PW4pdGhyb3cgbmV3IEVycm9yKCJQbGVhc2UgcHJvdmlkZSBpbWFnZSBjb25maWcgd2l0aCBmb3JtYXQgZm9yIEltYWdlYml0bWFwIik7Y29uc3Qgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtyLndpZHRoPWUud2lkdGgsci5oZWlnaHQ9ZS5oZWlnaHQ7Y29uc3Qgbz1yLmdldENvbnRleHQoIjJkIik7aWYobnVsbCE9byl7Y29uc3Qgbj1lLmhlaWdodCxyPWUud2lkdGg7cmV0dXJuIG8uZHJhd0ltYWdlKGUsMCwwLHIsbiksYT1vLmdldEltYWdlRGF0YSgwLDAscixuKS5kYXRhLHUuaGVpZ2h0PW4sdS53aWR0aD1yLCgwLCB0LmJ1ZmZlclRvVGVuc29yKShhLHUpfXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpfWlmKHMpcmV0dXJuIG5ldyBQcm9taXNlKCgobixyKT0+e2NvbnN0IG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksaT1vLmdldENvbnRleHQoIjJkIik7aWYoIWV8fCFpKXJldHVybiByKCk7Y29uc3Qgcz1uZXcgSW1hZ2U7cy5jcm9zc09yaWdpbj0iQW5vbnltb3VzIixzLnNyYz1lLHMub25sb2FkPSgpPT57by53aWR0aD1zLndpZHRoLG8uaGVpZ2h0PXMuaGVpZ2h0LGkuZHJhd0ltYWdlKHMsMCwwLG8ud2lkdGgsby5oZWlnaHQpO2NvbnN0IGU9aS5nZXRJbWFnZURhdGEoMCwwLG8ud2lkdGgsby5oZWlnaHQpO3UuaGVpZ2h0PW8uaGVpZ2h0LHUud2lkdGg9by53aWR0aCxuKCgwLCB0LmJ1ZmZlclRvVGVuc29yKShlLmRhdGEsdSkpO307fSkpO3Rocm93IG5ldyBFcnJvcigiSW5wdXQgZGF0YSBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkIC0gYWJvcnRlZCB0ZW5zb3IgY3JlYXRpb24iKX17bGV0IHQscjtpZih2b2lkIDAhPT1uJiZ2b2lkIDAhPT1uLnJlc2l6ZWRXaWR0aCYmdm9pZCAwIT09bi5yZXNpemVkSGVpZ2h0Pyh0PW4ucmVzaXplZEhlaWdodCxyPW4ucmVzaXplZFdpZHRoKToodD1lLmhlaWdodCxyPWUud2lkdGgpLHZvaWQgMCE9PW4mJih1PW4pLHUuZm9ybWF0PSJSR0JBIix1LmhlaWdodD10LHUud2lkdGg9cix2b2lkIDAhPT1uKXtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO24ud2lkdGg9cixuLmhlaWdodD10O2NvbnN0IG89bi5nZXRDb250ZXh0KCIyZCIpO2lmKG51bGw9PW8pdGhyb3cgbmV3IEVycm9yKCJDYW4gbm90IGFjY2VzcyBpbWFnZSBkYXRhIik7by5wdXRJbWFnZURhdGEoZSwwLDApLGE9by5nZXRJbWFnZURhdGEoMCwwLHIsdCkuZGF0YTt9ZWxzZSBhPWUuZGF0YTt9fWlmKHZvaWQgMCE9PWEpcmV0dXJuICgwLCB0LmJ1ZmZlclRvVGVuc29yKShhLHUpO3Rocm93IG5ldyBFcnJvcigiSW5wdXQgZGF0YSBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkIC0gYWJvcnRlZCB0ZW5zb3IgY3JlYXRpb24iKX07fSw1OTU3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UZW5zb3I9dm9pZCAwO2NvbnN0IHI9bigyMzUwKSxvPW4oNDg2NiksaT1uKDEwNikscz1uZXcgTWFwKFtbImZsb2F0MzIiLEZsb2F0MzJBcnJheV0sWyJ1aW50OCIsVWludDhBcnJheV0sWyJpbnQ4IixJbnQ4QXJyYXldLFsidWludDE2IixVaW50MTZBcnJheV0sWyJmbG9hdDE2IixVaW50MTZBcnJheV0sWyJpbnQxNiIsSW50MTZBcnJheV0sWyJpbnQzMiIsSW50MzJBcnJheV0sWyJib29sIixVaW50OEFycmF5XSxbImZsb2F0NjQiLEZsb2F0NjRBcnJheV0sWyJ1aW50MzIiLFVpbnQzMkFycmF5XV0pLGE9bmV3IE1hcChbW0Zsb2F0MzJBcnJheSwiZmxvYXQzMiJdLFtVaW50OEFycmF5LCJ1aW50OCJdLFtJbnQ4QXJyYXksImludDgiXSxbVWludDE2QXJyYXksInVpbnQxNiJdLFtJbnQxNkFycmF5LCJpbnQxNiJdLFtJbnQzMkFycmF5LCJpbnQzMiJdLFtGbG9hdDY0QXJyYXksImZsb2F0NjQiXSxbVWludDMyQXJyYXksInVpbnQzMiJdXSk7bGV0IHU9ITE7dC5UZW5zb3I9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe2xldCByLG8sbDtpZigoKCk9PntpZighdSl7dT0hMDtjb25zdCBlPSJ1bmRlZmluZWQiIT10eXBlb2YgQmlnSW50NjRBcnJheSYmImZ1bmN0aW9uIj09dHlwZW9mIEJpZ0ludDY0QXJyYXkuZnJvbSx0PSJ1bmRlZmluZWQiIT10eXBlb2YgQmlnVWludDY0QXJyYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBCaWdVaW50NjRBcnJheS5mcm9tO2UmJihzLnNldCgiaW50NjQiLEJpZ0ludDY0QXJyYXkpLGEuc2V0KEJpZ0ludDY0QXJyYXksImludDY0IikpLHQmJihzLnNldCgidWludDY0IixCaWdVaW50NjRBcnJheSksYS5zZXQoQmlnVWludDY0QXJyYXksInVpbnQ2NCIpKTt9fSkoKSwic3RyaW5nIj09dHlwZW9mIGUpaWYocj1lLGw9biwic3RyaW5nIj09PWUpe2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkEgc3RyaW5nIHRlbnNvcidzIGRhdGEgbXVzdCBiZSBhIHN0cmluZyBhcnJheS4iKTtvPXQ7fWVsc2Uge2NvbnN0IG49cy5nZXQoZSk7aWYodm9pZCAwPT09bil0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCB0ZW5zb3IgdHlwZTogJHtlfS5gKTtpZihBcnJheS5pc0FycmF5KHQpKXtpZigiZmxvYXQxNiI9PT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIkNyZWF0aW5nIGEgZmxvYXQxNiB0ZW5zb3IgZnJvbSBudW1iZXIgYXJyYXkgaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSBVaW50MTZBcnJheSBhcyBkYXRhLiIpO289InVpbnQ2NCI9PT1lfHwiaW50NjQiPT09ZT9uLmZyb20odCxCaWdJbnQpOm4uZnJvbSh0KTt9ZWxzZSB7aWYoISh0IGluc3RhbmNlb2YgbikpdGhyb3cgbmV3IFR5cGVFcnJvcihgQSAke3J9IHRlbnNvcidzIGRhdGEgbXVzdCBiZSB0eXBlIG9mICR7bn1gKTtvPXQ7fX1lbHNlIGlmKGw9dCxBcnJheS5pc0FycmF5KGUpKXtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGVuc29yIHR5cGUgY2Fubm90IGJlIGluZmVycmVkIGZyb20gYW4gZW1wdHkgYXJyYXkuIik7Y29uc3QgdD10eXBlb2YgZVswXTtpZigic3RyaW5nIj09PXQpcj0ic3RyaW5nIixvPWU7ZWxzZSB7aWYoImJvb2xlYW4iIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZSBvZiBkYXRhIGFycmF5OiAke3R9LmApO3I9ImJvb2wiLG89VWludDhBcnJheS5mcm9tKGUpO319ZWxzZSB7Y29uc3QgdD1hLmdldChlLmNvbnN0cnVjdG9yKTtpZih2b2lkIDA9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGUgZm9yIHRlbnNvciBkYXRhOiAke2UuY29uc3RydWN0b3J9LmApO3I9dCxvPWU7fWlmKHZvaWQgMD09PWwpbD1bby5sZW5ndGhdO2Vsc2UgaWYoIUFycmF5LmlzQXJyYXkobCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQSB0ZW5zb3IncyBkaW1zIG11c3QgYmUgYSBudW1iZXIgYXJyYXkiKTtjb25zdCBjPSgwLCBpLmNhbGN1bGF0ZVNpemUpKGwpO2lmKGMhPT1vLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYFRlbnNvcidzIHNpemUoJHtjfSkgZG9lcyBub3QgbWF0Y2ggZGF0YSBsZW5ndGgoJHtvLmxlbmd0aH0pLmApO3RoaXMuZGltcz1sLHRoaXMudHlwZT1yLHRoaXMuZGF0YT1vLHRoaXMuc2l6ZT1jO31zdGF0aWMgYXN5bmMgZnJvbUltYWdlKGUsdCl7cmV0dXJuICgwLCBvLnRlbnNvckZyb21JbWFnZSkoZSx0KX10b0RhdGFVUkwoZSl7cmV0dXJuICgwLCByLnRlbnNvclRvRGF0YVVSTCkodGhpcyxlKX10b0ltYWdlRGF0YShlKXtyZXR1cm4gKDAsIHIudGVuc29yVG9JbWFnZURhdGEpKHRoaXMsZSl9cmVzaGFwZShlKXtyZXR1cm4gKDAsIGkudGVuc29yUmVzaGFwZSkodGhpcyxlKX19O30sMTA2OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC50ZW5zb3JSZXNoYXBlPXQuY2FsY3VsYXRlU2l6ZT12b2lkIDA7Y29uc3Qgcj1uKDk2Myk7dC5jYWxjdWxhdGVTaXplPWU9PntsZXQgdD0xO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdCByPWVbbl07aWYoIm51bWJlciIhPXR5cGVvZiByfHwhTnVtYmVyLmlzU2FmZUludGVnZXIocikpdGhyb3cgbmV3IFR5cGVFcnJvcihgZGltc1ske259XSBtdXN0IGJlIGFuIGludGVnZXIsIGdvdDogJHtyfWApO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgZGltc1ske259XSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIGdvdDogJHtyfWApO3QqPXI7fXJldHVybiB0fSx0LnRlbnNvclJlc2hhcGU9KGUsdCk9Pm5ldyByLlRlbnNvcihlLnR5cGUsZS5kYXRhLHQpO30sOTYzOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UZW5zb3I9dm9pZCAwO2NvbnN0IHI9big1OTU3KTt0LlRlbnNvcj1yLlRlbnNvcjt9LDkxMDQ6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC52ZXJzaW9uPXZvaWQgMCx0LnZlcnNpb249IjEuMTYuMyI7fSwxNTgzOihlLHQpPT57dmFyIG4scj1mdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXZvaWQgMDt2YXIgdD1udWxsO3RyeXt0PW5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDEzLDIsOTYsMCwxLDEyNyw5Niw0LDEyNywxMjcsMTI3LDEyNywxLDEyNywzLDcsNiwwLDEsMSwxLDEsMSw2LDYsMSwxMjcsMSw2NSwwLDExLDcsNTAsNiwzLDEwOSwxMTcsMTA4LDAsMSw1LDEwMCwxMDUsMTE4LDk1LDExNSwwLDIsNSwxMDAsMTA1LDExOCw5NSwxMTcsMCwzLDUsMTE0LDEwMSwxMDksOTUsMTE1LDAsNCw1LDExNCwxMDEsMTA5LDk1LDExNywwLDUsOCwxMDMsMTAxLDExNiw5NSwxMDQsMTA1LDEwMywxMDQsMCwwLDEwLDE5MSwxLDYsNCwwLDM1LDAsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI2LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEyNywzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMSwzNiwxLDEsMTI2LDMyLDAsMTczLDMyLDEsMTczLDY2LDMyLDEzNCwxMzIsMzIsMiwxNzMsMzIsMywxNzMsNjYsMzIsMTM0LDEzMiwxMjgsMzQsNCw2NiwzMiwxMzUsMTY3LDM2LDAsMzIsNCwxNjcsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI5LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEzMCwzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMV0pKSx7fSkuZXhwb3J0czt9Y2F0Y2goZSl7fWZ1bmN0aW9uIG4oZSx0LG4pe3RoaXMubG93PTB8ZSx0aGlzLmhpZ2g9MHx0LHRoaXMudW5zaWduZWQ9ISFuO31mdW5jdGlvbiByKGUpe3JldHVybiAhMD09PShlJiZlLl9faXNMb25nX18pfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9TWF0aC5jbHozMihlJi1lKTtyZXR1cm4gZT8zMS10OnR9bi5wcm90b3R5cGUuX19pc0xvbmdfXyxPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsIl9faXNMb25nX18iLHt2YWx1ZTohMH0pLG4uaXNMb25nPXI7dmFyIGk9e30scz17fTtmdW5jdGlvbiBhKGUsdCl7dmFyIG4scixvO3JldHVybiB0PyhvPTA8PShlPj4+PTApJiZlPDI1NikmJihyPXNbZV0pP3I6KG49bChlLDAsITApLG8mJihzW2VdPW4pLG4pOihvPS0xMjg8PShlfD0wKSYmZTwxMjgpJiYocj1pW2VdKT9yOihuPWwoZSxlPDA/LTE6MCwhMSksbyYmKGlbZV09biksbil9ZnVuY3Rpb24gdShlLHQpe2lmKGlzTmFOKGUpKXJldHVybiB0P3k6bTtpZih0KXtpZihlPDApcmV0dXJuIHk7aWYoZT49aClyZXR1cm4geH1lbHNlIHtpZihlPD0tZylyZXR1cm4gTztpZihlKzE+PWcpcmV0dXJuIFR9cmV0dXJuIGU8MD91KC1lLHQpLm5lZygpOmwoZSVmfDAsZS9mfDAsdCl9ZnVuY3Rpb24gbChlLHQscil7cmV0dXJuIG5ldyBuKGUsdCxyKX1uLmZyb21JbnQ9YSxuLmZyb21OdW1iZXI9dSxuLmZyb21CaXRzPWw7dmFyIGM9TWF0aC5wb3c7ZnVuY3Rpb24gcChlLHQsbil7aWYoMD09PWUubGVuZ3RoKXRocm93IEVycm9yKCJlbXB0eSBzdHJpbmciKTtpZigibnVtYmVyIj09dHlwZW9mIHQ/KG49dCx0PSExKTp0PSEhdCwiTmFOIj09PWV8fCJJbmZpbml0eSI9PT1lfHwiK0luZmluaXR5Ij09PWV8fCItSW5maW5pdHkiPT09ZSlyZXR1cm4gdD95Om07aWYoKG49bnx8MTApPDJ8fDM2PG4pdGhyb3cgUmFuZ2VFcnJvcigicmFkaXgiKTt2YXIgcjtpZigocj1lLmluZGV4T2YoIi0iKSk+MCl0aHJvdyBFcnJvcigiaW50ZXJpb3IgaHlwaGVuIik7aWYoMD09PXIpcmV0dXJuIHAoZS5zdWJzdHJpbmcoMSksdCxuKS5uZWcoKTtmb3IodmFyIG89dShjKG4sOCkpLGk9bSxzPTA7czxlLmxlbmd0aDtzKz04KXt2YXIgYT1NYXRoLm1pbig4LGUubGVuZ3RoLXMpLGw9cGFyc2VJbnQoZS5zdWJzdHJpbmcocyxzK2EpLG4pO2lmKGE8OCl7dmFyIGQ9dShjKG4sYSkpO2k9aS5tdWwoZCkuYWRkKHUobCkpO31lbHNlIGk9KGk9aS5tdWwobykpLmFkZCh1KGwpKTt9cmV0dXJuIGkudW5zaWduZWQ9dCxpfWZ1bmN0aW9uIGQoZSx0KXtyZXR1cm4gIm51bWJlciI9PXR5cGVvZiBlP3UoZSx0KToic3RyaW5nIj09dHlwZW9mIGU/cChlLHQpOmwoZS5sb3csZS5oaWdoLCJib29sZWFuIj09dHlwZW9mIHQ/dDplLnVuc2lnbmVkKX1uLmZyb21TdHJpbmc9cCxuLmZyb21WYWx1ZT1kO3ZhciBmPTQyOTQ5NjcyOTYsaD1mKmYsZz1oLzIsYj1hKDE8PDI0KSxtPWEoMCk7bi5aRVJPPW07dmFyIHk9YSgwLCEwKTtuLlVaRVJPPXk7dmFyIHY9YSgxKTtuLk9ORT12O3ZhciBfPWEoMSwhMCk7bi5VT05FPV87dmFyIHc9YSgtMSk7bi5ORUdfT05FPXc7dmFyIFQ9bCgtMSwyMTQ3NDgzNjQ3LCExKTtuLk1BWF9WQUxVRT1UO3ZhciB4PWwoLTEsLTEsITApO24uTUFYX1VOU0lHTkVEX1ZBTFVFPXg7dmFyIE89bCgwLC0yMTQ3NDgzNjQ4LCExKTtuLk1JTl9WQUxVRT1PO3ZhciBTPW4ucHJvdG90eXBlO1MudG9JbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnNpZ25lZD90aGlzLmxvdz4+PjA6dGhpcy5sb3d9LFMudG9OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnNpZ25lZD8odGhpcy5oaWdoPj4+MCkqZisodGhpcy5sb3c+Pj4wKTp0aGlzLmhpZ2gqZisodGhpcy5sb3c+Pj4wKX0sUy50b1N0cmluZz1mdW5jdGlvbihlKXtpZigoZT1lfHwxMCk8Mnx8MzY8ZSl0aHJvdyBSYW5nZUVycm9yKCJyYWRpeCIpO2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuICIwIjtpZih0aGlzLmlzTmVnYXRpdmUoKSl7aWYodGhpcy5lcShPKSl7dmFyIHQ9dShlKSxuPXRoaXMuZGl2KHQpLHI9bi5tdWwodCkuc3ViKHRoaXMpO3JldHVybiBuLnRvU3RyaW5nKGUpK3IudG9JbnQoKS50b1N0cmluZyhlKX1yZXR1cm4gIi0iK3RoaXMubmVnKCkudG9TdHJpbmcoZSl9Zm9yKHZhciBvPXUoYyhlLDYpLHRoaXMudW5zaWduZWQpLGk9dGhpcyxzPSIiOzspe3ZhciBhPWkuZGl2KG8pLGw9KGkuc3ViKGEubXVsKG8pKS50b0ludCgpPj4+MCkudG9TdHJpbmcoZSk7aWYoKGk9YSkuaXNaZXJvKCkpcmV0dXJuIGwrcztmb3IoO2wubGVuZ3RoPDY7KWw9IjAiK2w7cz0iIitsK3M7fX0sUy5nZXRIaWdoQml0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2h9LFMuZ2V0SGlnaEJpdHNVbnNpZ25lZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2g+Pj4wfSxTLmdldExvd0JpdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb3d9LFMuZ2V0TG93Qml0c1Vuc2lnbmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG93Pj4+MH0sUy5nZXROdW1CaXRzQWJzPWZ1bmN0aW9uKCl7aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMuZXEoTyk/NjQ6dGhpcy5uZWcoKS5nZXROdW1CaXRzQWJzKCk7Zm9yKHZhciBlPTAhPXRoaXMuaGlnaD90aGlzLmhpZ2g6dGhpcy5sb3csdD0zMTt0PjAmJjA9PShlJjE8PHQpO3QtLSk7cmV0dXJuIDAhPXRoaXMuaGlnaD90KzMzOnQrMX0sUy5pc1plcm89ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuaGlnaCYmMD09PXRoaXMubG93fSxTLmVxej1TLmlzWmVybyxTLmlzTmVnYXRpdmU9ZnVuY3Rpb24oKXtyZXR1cm4gIXRoaXMudW5zaWduZWQmJnRoaXMuaGlnaDwwfSxTLmlzUG9zaXRpdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnNpZ25lZHx8dGhpcy5oaWdoPj0wfSxTLmlzT2RkPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PSgxJnRoaXMubG93KX0sUy5pc0V2ZW49ZnVuY3Rpb24oKXtyZXR1cm4gMD09KDEmdGhpcy5sb3cpfSxTLmVxdWFscz1mdW5jdGlvbihlKXtyZXR1cm4gcihlKXx8KGU9ZChlKSksKHRoaXMudW5zaWduZWQ9PT1lLnVuc2lnbmVkfHx0aGlzLmhpZ2g+Pj4zMSE9MXx8ZS5oaWdoPj4+MzEhPTEpJiZ0aGlzLmhpZ2g9PT1lLmhpZ2gmJnRoaXMubG93PT09ZS5sb3d9LFMuZXE9Uy5lcXVhbHMsUy5ub3RFcXVhbHM9ZnVuY3Rpb24oZSl7cmV0dXJuICF0aGlzLmVxKGUpfSxTLm5lcT1TLm5vdEVxdWFscyxTLm5lPVMubm90RXF1YWxzLFMubGVzc1RoYW49ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29tcChlKTwwfSxTLmx0PVMubGVzc1RoYW4sUy5sZXNzVGhhbk9yRXF1YWw9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29tcChlKTw9MH0sUy5sdGU9Uy5sZXNzVGhhbk9yRXF1YWwsUy5sZT1TLmxlc3NUaGFuT3JFcXVhbCxTLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbXAoZSk+MH0sUy5ndD1TLmdyZWF0ZXJUaGFuLFMuZ3JlYXRlclRoYW5PckVxdWFsPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbXAoZSk+PTB9LFMuZ3RlPVMuZ3JlYXRlclRoYW5PckVxdWFsLFMuZ2U9Uy5ncmVhdGVyVGhhbk9yRXF1YWwsUy5jb21wYXJlPWZ1bmN0aW9uKGUpe2lmKHIoZSl8fChlPWQoZSkpLHRoaXMuZXEoZSkpcmV0dXJuIDA7dmFyIHQ9dGhpcy5pc05lZ2F0aXZlKCksbj1lLmlzTmVnYXRpdmUoKTtyZXR1cm4gdCYmIW4/LTE6IXQmJm4/MTp0aGlzLnVuc2lnbmVkP2UuaGlnaD4+PjA+dGhpcy5oaWdoPj4+MHx8ZS5oaWdoPT09dGhpcy5oaWdoJiZlLmxvdz4+PjA+dGhpcy5sb3c+Pj4wPy0xOjE6dGhpcy5zdWIoZSkuaXNOZWdhdGl2ZSgpPy0xOjF9LFMuY29tcD1TLmNvbXBhcmUsUy5uZWdhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gIXRoaXMudW5zaWduZWQmJnRoaXMuZXEoTyk/Tzp0aGlzLm5vdCgpLmFkZCh2KX0sUy5uZWc9Uy5uZWdhdGUsUy5hZGQ9ZnVuY3Rpb24oZSl7cihlKXx8KGU9ZChlKSk7dmFyIHQ9dGhpcy5oaWdoPj4+MTYsbj02NTUzNSZ0aGlzLmhpZ2gsbz10aGlzLmxvdz4+PjE2LGk9NjU1MzUmdGhpcy5sb3cscz1lLmhpZ2g+Pj4xNixhPTY1NTM1JmUuaGlnaCx1PWUubG93Pj4+MTYsYz0wLHA9MCxmPTAsaD0wO3JldHVybiBmKz0oaCs9aSsoNjU1MzUmZS5sb3cpKT4+PjE2LHArPShmKz1vK3UpPj4+MTYsYys9KHArPW4rYSk+Pj4xNixjKz10K3MsbCgoZiY9NjU1MzUpPDwxNnwoaCY9NjU1MzUpLChjJj02NTUzNSk8PDE2fChwJj02NTUzNSksdGhpcy51bnNpZ25lZCl9LFMuc3VidHJhY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSl8fChlPWQoZSkpLHRoaXMuYWRkKGUubmVnKCkpfSxTLnN1Yj1TLnN1YnRyYWN0LFMubXVsdGlwbHk9ZnVuY3Rpb24oZSl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gdGhpcztpZihyKGUpfHwoZT1kKGUpKSx0KXJldHVybiBsKHQubXVsKHRoaXMubG93LHRoaXMuaGlnaCxlLmxvdyxlLmhpZ2gpLHQuZ2V0X2hpZ2goKSx0aGlzLnVuc2lnbmVkKTtpZihlLmlzWmVybygpKXJldHVybiB0aGlzLnVuc2lnbmVkP3k6bTtpZih0aGlzLmVxKE8pKXJldHVybiBlLmlzT2RkKCk/TzptO2lmKGUuZXEoTykpcmV0dXJuIHRoaXMuaXNPZGQoKT9POm07aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIGUuaXNOZWdhdGl2ZSgpP3RoaXMubmVnKCkubXVsKGUubmVnKCkpOnRoaXMubmVnKCkubXVsKGUpLm5lZygpO2lmKGUuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLm11bChlLm5lZygpKS5uZWcoKTtpZih0aGlzLmx0KGIpJiZlLmx0KGIpKXJldHVybiB1KHRoaXMudG9OdW1iZXIoKSplLnRvTnVtYmVyKCksdGhpcy51bnNpZ25lZCk7dmFyIG49dGhpcy5oaWdoPj4+MTYsbz02NTUzNSZ0aGlzLmhpZ2gsaT10aGlzLmxvdz4+PjE2LHM9NjU1MzUmdGhpcy5sb3csYT1lLmhpZ2g+Pj4xNixjPTY1NTM1JmUuaGlnaCxwPWUubG93Pj4+MTYsZj02NTUzNSZlLmxvdyxoPTAsZz0wLHY9MCxfPTA7cmV0dXJuIHYrPShfKz1zKmYpPj4+MTYsZys9KHYrPWkqZik+Pj4xNix2Jj02NTUzNSxnKz0odis9cypwKT4+PjE2LGgrPShnKz1vKmYpPj4+MTYsZyY9NjU1MzUsaCs9KGcrPWkqcCk+Pj4xNixnJj02NTUzNSxoKz0oZys9cypjKT4+PjE2LGgrPW4qZitvKnAraSpjK3MqYSxsKCh2Jj02NTUzNSk8PDE2fChfJj02NTUzNSksKGgmPTY1NTM1KTw8MTZ8KGcmPTY1NTM1KSx0aGlzLnVuc2lnbmVkKX0sUy5tdWw9Uy5tdWx0aXBseSxTLmRpdmlkZT1mdW5jdGlvbihlKXtpZihyKGUpfHwoZT1kKGUpKSxlLmlzWmVybygpKXRocm93IEVycm9yKCJkaXZpc2lvbiBieSB6ZXJvIik7dmFyIG4sbyxpO2lmKHQpcmV0dXJuIHRoaXMudW5zaWduZWR8fC0yMTQ3NDgzNjQ4IT09dGhpcy5oaWdofHwtMSE9PWUubG93fHwtMSE9PWUuaGlnaD9sKCh0aGlzLnVuc2lnbmVkP3QuZGl2X3U6dC5kaXZfcykodGhpcy5sb3csdGhpcy5oaWdoLGUubG93LGUuaGlnaCksdC5nZXRfaGlnaCgpLHRoaXMudW5zaWduZWQpOnRoaXM7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gdGhpcy51bnNpZ25lZD95Om07aWYodGhpcy51bnNpZ25lZCl7aWYoZS51bnNpZ25lZHx8KGU9ZS50b1Vuc2lnbmVkKCkpLGUuZ3QodGhpcykpcmV0dXJuIHk7aWYoZS5ndCh0aGlzLnNocnUoMSkpKXJldHVybiBfO2k9eTt9ZWxzZSB7aWYodGhpcy5lcShPKSlyZXR1cm4gZS5lcSh2KXx8ZS5lcSh3KT9POmUuZXEoTyk/djoobj10aGlzLnNocigxKS5kaXYoZSkuc2hsKDEpKS5lcShtKT9lLmlzTmVnYXRpdmUoKT92Onc6KG89dGhpcy5zdWIoZS5tdWwobikpLGk9bi5hZGQoby5kaXYoZSkpKTtpZihlLmVxKE8pKXJldHVybiB0aGlzLnVuc2lnbmVkP3k6bTtpZih0aGlzLmlzTmVnYXRpdmUoKSlyZXR1cm4gZS5pc05lZ2F0aXZlKCk/dGhpcy5uZWcoKS5kaXYoZS5uZWcoKSk6dGhpcy5uZWcoKS5kaXYoZSkubmVnKCk7aWYoZS5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMuZGl2KGUubmVnKCkpLm5lZygpO2k9bTt9Zm9yKG89dGhpcztvLmd0ZShlKTspe249TWF0aC5tYXgoMSxNYXRoLmZsb29yKG8udG9OdW1iZXIoKS9lLnRvTnVtYmVyKCkpKTtmb3IodmFyIHM9TWF0aC5jZWlsKE1hdGgubG9nKG4pL01hdGguTE4yKSxhPXM8PTQ4PzE6YygyLHMtNDgpLHA9dShuKSxmPXAubXVsKGUpO2YuaXNOZWdhdGl2ZSgpfHxmLmd0KG8pOylmPShwPXUobi09YSx0aGlzLnVuc2lnbmVkKSkubXVsKGUpO3AuaXNaZXJvKCkmJihwPXYpLGk9aS5hZGQocCksbz1vLnN1YihmKTt9cmV0dXJuIGl9LFMuZGl2PVMuZGl2aWRlLFMubW9kdWxvPWZ1bmN0aW9uKGUpe3JldHVybiByKGUpfHwoZT1kKGUpKSx0P2woKHRoaXMudW5zaWduZWQ/dC5yZW1fdTp0LnJlbV9zKSh0aGlzLmxvdyx0aGlzLmhpZ2gsZS5sb3csZS5oaWdoKSx0LmdldF9oaWdoKCksdGhpcy51bnNpZ25lZCk6dGhpcy5zdWIodGhpcy5kaXYoZSkubXVsKGUpKX0sUy5tb2Q9Uy5tb2R1bG8sUy5yZW09Uy5tb2R1bG8sUy5ub3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbCh+dGhpcy5sb3csfnRoaXMuaGlnaCx0aGlzLnVuc2lnbmVkKX0sUy5jb3VudExlYWRpbmdaZXJvcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2g/TWF0aC5jbHozMih0aGlzLmhpZ2gpOk1hdGguY2x6MzIodGhpcy5sb3cpKzMyfSxTLmNsej1TLmNvdW50TGVhZGluZ1plcm9zLFMuY291bnRUcmFpbGluZ1plcm9zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG93P28odGhpcy5sb3cpOm8odGhpcy5oaWdoKSszMn0sUy5jdHo9Uy5jb3VudFRyYWlsaW5nWmVyb3MsUy5hbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSl8fChlPWQoZSkpLGwodGhpcy5sb3cmZS5sb3csdGhpcy5oaWdoJmUuaGlnaCx0aGlzLnVuc2lnbmVkKX0sUy5vcj1mdW5jdGlvbihlKXtyZXR1cm4gcihlKXx8KGU9ZChlKSksbCh0aGlzLmxvd3xlLmxvdyx0aGlzLmhpZ2h8ZS5oaWdoLHRoaXMudW5zaWduZWQpfSxTLnhvcj1mdW5jdGlvbihlKXtyZXR1cm4gcihlKXx8KGU9ZChlKSksbCh0aGlzLmxvd15lLmxvdyx0aGlzLmhpZ2heZS5oaWdoLHRoaXMudW5zaWduZWQpfSxTLnNoaWZ0TGVmdD1mdW5jdGlvbihlKXtyZXR1cm4gcihlKSYmKGU9ZS50b0ludCgpKSwwPT0oZSY9NjMpP3RoaXM6ZTwzMj9sKHRoaXMubG93PDxlLHRoaXMuaGlnaDw8ZXx0aGlzLmxvdz4+PjMyLWUsdGhpcy51bnNpZ25lZCk6bCgwLHRoaXMubG93PDxlLTMyLHRoaXMudW5zaWduZWQpfSxTLnNobD1TLnNoaWZ0TGVmdCxTLnNoaWZ0UmlnaHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSkmJihlPWUudG9JbnQoKSksMD09KGUmPTYzKT90aGlzOmU8MzI/bCh0aGlzLmxvdz4+PmV8dGhpcy5oaWdoPDwzMi1lLHRoaXMuaGlnaD4+ZSx0aGlzLnVuc2lnbmVkKTpsKHRoaXMuaGlnaD4+ZS0zMix0aGlzLmhpZ2g+PTA/MDotMSx0aGlzLnVuc2lnbmVkKX0sUy5zaHI9Uy5zaGlmdFJpZ2h0LFMuc2hpZnRSaWdodFVuc2lnbmVkPWZ1bmN0aW9uKGUpe3JldHVybiByKGUpJiYoZT1lLnRvSW50KCkpLDA9PShlJj02Myk/dGhpczplPDMyP2wodGhpcy5sb3c+Pj5lfHRoaXMuaGlnaDw8MzItZSx0aGlzLmhpZ2g+Pj5lLHRoaXMudW5zaWduZWQpOmwoMzI9PT1lP3RoaXMuaGlnaDp0aGlzLmhpZ2g+Pj5lLTMyLDAsdGhpcy51bnNpZ25lZCl9LFMuc2hydT1TLnNoaWZ0UmlnaHRVbnNpZ25lZCxTLnNocl91PVMuc2hpZnRSaWdodFVuc2lnbmVkLFMucm90YXRlTGVmdD1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gcihlKSYmKGU9ZS50b0ludCgpKSwwPT0oZSY9NjMpP3RoaXM6MzI9PT1lP2wodGhpcy5oaWdoLHRoaXMubG93LHRoaXMudW5zaWduZWQpOmU8MzI/KHQ9MzItZSxsKHRoaXMubG93PDxlfHRoaXMuaGlnaD4+PnQsdGhpcy5oaWdoPDxlfHRoaXMubG93Pj4+dCx0aGlzLnVuc2lnbmVkKSk6KHQ9MzItKGUtPTMyKSxsKHRoaXMuaGlnaDw8ZXx0aGlzLmxvdz4+PnQsdGhpcy5sb3c8PGV8dGhpcy5oaWdoPj4+dCx0aGlzLnVuc2lnbmVkKSl9LFMucm90bD1TLnJvdGF0ZUxlZnQsUy5yb3RhdGVSaWdodD1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gcihlKSYmKGU9ZS50b0ludCgpKSwwPT0oZSY9NjMpP3RoaXM6MzI9PT1lP2wodGhpcy5oaWdoLHRoaXMubG93LHRoaXMudW5zaWduZWQpOmU8MzI/KHQ9MzItZSxsKHRoaXMuaGlnaDw8dHx0aGlzLmxvdz4+PmUsdGhpcy5sb3c8PHR8dGhpcy5oaWdoPj4+ZSx0aGlzLnVuc2lnbmVkKSk6KHQ9MzItKGUtPTMyKSxsKHRoaXMubG93PDx0fHRoaXMuaGlnaD4+PmUsdGhpcy5oaWdoPDx0fHRoaXMubG93Pj4+ZSx0aGlzLnVuc2lnbmVkKSl9LFMucm90cj1TLnJvdGF0ZVJpZ2h0LFMudG9TaWduZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnNpZ25lZD9sKHRoaXMubG93LHRoaXMuaGlnaCwhMSk6dGhpc30sUy50b1Vuc2lnbmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5zaWduZWQ/dGhpczpsKHRoaXMubG93LHRoaXMuaGlnaCwhMCl9LFMudG9CeXRlcz1mdW5jdGlvbihlKXtyZXR1cm4gZT90aGlzLnRvQnl0ZXNMRSgpOnRoaXMudG9CeXRlc0JFKCl9LFMudG9CeXRlc0xFPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oaWdoLHQ9dGhpcy5sb3c7cmV0dXJuIFsyNTUmdCx0Pj4+OCYyNTUsdD4+PjE2JjI1NSx0Pj4+MjQsMjU1JmUsZT4+PjgmMjU1LGU+Pj4xNiYyNTUsZT4+PjI0XX0sUy50b0J5dGVzQkU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmhpZ2gsdD10aGlzLmxvdztyZXR1cm4gW2U+Pj4yNCxlPj4+MTYmMjU1LGU+Pj44JjI1NSwyNTUmZSx0Pj4+MjQsdD4+PjE2JjI1NSx0Pj4+OCYyNTUsMjU1JnRdfSxuLmZyb21CeXRlcz1mdW5jdGlvbihlLHQscil7cmV0dXJuIHI/bi5mcm9tQnl0ZXNMRShlLHQpOm4uZnJvbUJ5dGVzQkUoZSx0KX0sbi5mcm9tQnl0ZXNMRT1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgbihlWzBdfGVbMV08PDh8ZVsyXTw8MTZ8ZVszXTw8MjQsZVs0XXxlWzVdPDw4fGVbNl08PDE2fGVbN108PDI0LHQpfSxuLmZyb21CeXRlc0JFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBuKGVbNF08PDI0fGVbNV08PDE2fGVbNl08PDh8ZVs3XSxlWzBdPDwyNHxlWzFdPDwxNnxlWzJdPDw4fGVbM10sdCl9O3ZhciBBPW47cmV0dXJuIGUuZGVmYXVsdD1BLCJkZWZhdWx0ImluIGU/ZS5kZWZhdWx0OmV9KHt9KTt2b2lkIDA9PT0obj1mdW5jdGlvbigpe3JldHVybiByfS5hcHBseSh0LFtdKSl8fChlLmV4cG9ydHM9bik7fSw1Njg2OihlLHQsbik9PntuLnIodCksbi5kKHQse2ZsYXRidWZmZXJzOigpPT5yfSk7dmFyIHI9e307ci5PZmZzZXQsci5UYWJsZSxyLlNJWkVPRl9TSE9SVD0yLHIuU0laRU9GX0lOVD00LHIuRklMRV9JREVOVElGSUVSX0xFTkdUSD00LHIuU0laRV9QUkVGSVhfTEVOR1RIPTQsci5FbmNvZGluZz17VVRGOF9CWVRFUzoxLFVURjE2X1NUUklORzoyfSxyLmludDMyPW5ldyBJbnQzMkFycmF5KDIpLHIuZmxvYXQzMj1uZXcgRmxvYXQzMkFycmF5KHIuaW50MzIuYnVmZmVyKSxyLmZsb2F0NjQ9bmV3IEZsb2F0NjRBcnJheShyLmludDMyLmJ1ZmZlciksci5pc0xpdHRsZUVuZGlhbj0xPT09bmV3IFVpbnQxNkFycmF5KG5ldyBVaW50OEFycmF5KFsxLDBdKS5idWZmZXIpWzBdLHIuTG9uZz1mdW5jdGlvbihlLHQpe3RoaXMubG93PTB8ZSx0aGlzLmhpZ2g9MHx0O30sci5Mb25nLmNyZWF0ZT1mdW5jdGlvbihlLHQpe3JldHVybiAwPT1lJiYwPT10P3IuTG9uZy5aRVJPOm5ldyByLkxvbmcoZSx0KX0sci5Mb25nLnByb3RvdHlwZS50b0Zsb2F0NjQ9ZnVuY3Rpb24oKXtyZXR1cm4gKHRoaXMubG93Pj4+MCkrNDI5NDk2NzI5Nip0aGlzLmhpZ2h9LHIuTG9uZy5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxvdz09ZS5sb3cmJnRoaXMuaGlnaD09ZS5oaWdofSxyLkxvbmcuWkVSTz1uZXcgci5Mb25nKDAsMCksci5CdWlsZGVyPWZ1bmN0aW9uKGUpe2lmKGUpdD1lO2Vsc2UgdmFyIHQ9MTAyNDt0aGlzLmJiPXIuQnl0ZUJ1ZmZlci5hbGxvY2F0ZSh0KSx0aGlzLnNwYWNlPXQsdGhpcy5taW5hbGlnbj0xLHRoaXMudnRhYmxlPW51bGwsdGhpcy52dGFibGVfaW5fdXNlPTAsdGhpcy5pc05lc3RlZD0hMSx0aGlzLm9iamVjdF9zdGFydD0wLHRoaXMudnRhYmxlcz1bXSx0aGlzLnZlY3Rvcl9udW1fZWxlbXM9MCx0aGlzLmZvcmNlX2RlZmF1bHRzPSExO30sci5CdWlsZGVyLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuYmIuY2xlYXIoKSx0aGlzLnNwYWNlPXRoaXMuYmIuY2FwYWNpdHkoKSx0aGlzLm1pbmFsaWduPTEsdGhpcy52dGFibGU9bnVsbCx0aGlzLnZ0YWJsZV9pbl91c2U9MCx0aGlzLmlzTmVzdGVkPSExLHRoaXMub2JqZWN0X3N0YXJ0PTAsdGhpcy52dGFibGVzPVtdLHRoaXMudmVjdG9yX251bV9lbGVtcz0wLHRoaXMuZm9yY2VfZGVmYXVsdHM9ITE7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmZvcmNlRGVmYXVsdHM9ZnVuY3Rpb24oZSl7dGhpcy5mb3JjZV9kZWZhdWx0cz1lO30sci5CdWlsZGVyLnByb3RvdHlwZS5kYXRhQnVmZmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmJ9LHIuQnVpbGRlci5wcm90b3R5cGUuYXNVaW50OEFycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmIuYnl0ZXMoKS5zdWJhcnJheSh0aGlzLmJiLnBvc2l0aW9uKCksdGhpcy5iYi5wb3NpdGlvbigpK3RoaXMub2Zmc2V0KCkpfSxyLkJ1aWxkZXIucHJvdG90eXBlLnByZXA9ZnVuY3Rpb24oZSx0KXtlPnRoaXMubWluYWxpZ24mJih0aGlzLm1pbmFsaWduPWUpO2Zvcih2YXIgbj0xK34odGhpcy5iYi5jYXBhY2l0eSgpLXRoaXMuc3BhY2UrdCkmZS0xO3RoaXMuc3BhY2U8bitlK3Q7KXt2YXIgbz10aGlzLmJiLmNhcGFjaXR5KCk7dGhpcy5iYj1yLkJ1aWxkZXIuZ3Jvd0J5dGVCdWZmZXIodGhpcy5iYiksdGhpcy5zcGFjZSs9dGhpcy5iYi5jYXBhY2l0eSgpLW87fXRoaXMucGFkKG4pO30sci5CdWlsZGVyLnByb3RvdHlwZS5wYWQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlO3QrKyl0aGlzLmJiLndyaXRlSW50OCgtLXRoaXMuc3BhY2UsMCk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlKXt0aGlzLmJiLndyaXRlSW50OCh0aGlzLnNwYWNlLT0xLGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS53cml0ZUludDE2PWZ1bmN0aW9uKGUpe3RoaXMuYmIud3JpdGVJbnQxNih0aGlzLnNwYWNlLT0yLGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS53cml0ZUludDMyPWZ1bmN0aW9uKGUpe3RoaXMuYmIud3JpdGVJbnQzMih0aGlzLnNwYWNlLT00LGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS53cml0ZUludDY0PWZ1bmN0aW9uKGUpe3RoaXMuYmIud3JpdGVJbnQ2NCh0aGlzLnNwYWNlLT04LGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS53cml0ZUZsb2F0MzI9ZnVuY3Rpb24oZSl7dGhpcy5iYi53cml0ZUZsb2F0MzIodGhpcy5zcGFjZS09NCxlKTt9LHIuQnVpbGRlci5wcm90b3R5cGUud3JpdGVGbG9hdDY0PWZ1bmN0aW9uKGUpe3RoaXMuYmIud3JpdGVGbG9hdDY0KHRoaXMuc3BhY2UtPTgsZSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEludDg9ZnVuY3Rpb24oZSl7dGhpcy5wcmVwKDEsMCksdGhpcy53cml0ZUludDgoZSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEludDE2PWZ1bmN0aW9uKGUpe3RoaXMucHJlcCgyLDApLHRoaXMud3JpdGVJbnQxNihlKTt9LHIuQnVpbGRlci5wcm90b3R5cGUuYWRkSW50MzI9ZnVuY3Rpb24oZSl7dGhpcy5wcmVwKDQsMCksdGhpcy53cml0ZUludDMyKGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRJbnQ2ND1mdW5jdGlvbihlKXt0aGlzLnByZXAoOCwwKSx0aGlzLndyaXRlSW50NjQoZSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZsb2F0MzI9ZnVuY3Rpb24oZSl7dGhpcy5wcmVwKDQsMCksdGhpcy53cml0ZUZsb2F0MzIoZSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZsb2F0NjQ9ZnVuY3Rpb24oZSl7dGhpcy5wcmVwKDgsMCksdGhpcy53cml0ZUZsb2F0NjQoZSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZpZWxkSW50OD1mdW5jdGlvbihlLHQsbil7KHRoaXMuZm9yY2VfZGVmYXVsdHN8fHQhPW4pJiYodGhpcy5hZGRJbnQ4KHQpLHRoaXMuc2xvdChlKSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZpZWxkSW50MTY9ZnVuY3Rpb24oZSx0LG4peyh0aGlzLmZvcmNlX2RlZmF1bHRzfHx0IT1uKSYmKHRoaXMuYWRkSW50MTYodCksdGhpcy5zbG90KGUpKTt9LHIuQnVpbGRlci5wcm90b3R5cGUuYWRkRmllbGRJbnQzMj1mdW5jdGlvbihlLHQsbil7KHRoaXMuZm9yY2VfZGVmYXVsdHN8fHQhPW4pJiYodGhpcy5hZGRJbnQzMih0KSx0aGlzLnNsb3QoZSkpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZEludDY0PWZ1bmN0aW9uKGUsdCxuKXshdGhpcy5mb3JjZV9kZWZhdWx0cyYmdC5lcXVhbHMobil8fCh0aGlzLmFkZEludDY0KHQpLHRoaXMuc2xvdChlKSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZpZWxkRmxvYXQzMj1mdW5jdGlvbihlLHQsbil7KHRoaXMuZm9yY2VfZGVmYXVsdHN8fHQhPW4pJiYodGhpcy5hZGRGbG9hdDMyKHQpLHRoaXMuc2xvdChlKSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZpZWxkRmxvYXQ2ND1mdW5jdGlvbihlLHQsbil7KHRoaXMuZm9yY2VfZGVmYXVsdHN8fHQhPW4pJiYodGhpcy5hZGRGbG9hdDY0KHQpLHRoaXMuc2xvdChlKSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZpZWxkT2Zmc2V0PWZ1bmN0aW9uKGUsdCxuKXsodGhpcy5mb3JjZV9kZWZhdWx0c3x8dCE9bikmJih0aGlzLmFkZE9mZnNldCh0KSx0aGlzLnNsb3QoZSkpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZFN0cnVjdD1mdW5jdGlvbihlLHQsbil7dCE9biYmKHRoaXMubmVzdGVkKHQpLHRoaXMuc2xvdChlKSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLm5lc3RlZD1mdW5jdGlvbihlKXtpZihlIT10aGlzLm9mZnNldCgpKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IHN0cnVjdCBtdXN0IGJlIHNlcmlhbGl6ZWQgaW5saW5lLiIpfSxyLkJ1aWxkZXIucHJvdG90eXBlLm5vdE5lc3RlZD1mdW5jdGlvbigpe2lmKHRoaXMuaXNOZXN0ZWQpdGhyb3cgbmV3IEVycm9yKCJGbGF0QnVmZmVyczogb2JqZWN0IHNlcmlhbGl6YXRpb24gbXVzdCBub3QgYmUgbmVzdGVkLiIpfSxyLkJ1aWxkZXIucHJvdG90eXBlLnNsb3Q9ZnVuY3Rpb24oZSl7dGhpcy52dGFibGVbZV09dGhpcy5vZmZzZXQoKTt9LHIuQnVpbGRlci5wcm90b3R5cGUub2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmIuY2FwYWNpdHkoKS10aGlzLnNwYWNlfSxyLkJ1aWxkZXIuZ3Jvd0J5dGVCdWZmZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jYXBhY2l0eSgpO2lmKDMyMjEyMjU0NzImdCl0aHJvdyBuZXcgRXJyb3IoIkZsYXRCdWZmZXJzOiBjYW5ub3QgZ3JvdyBidWZmZXIgYmV5b25kIDIgZ2lnYWJ5dGVzLiIpO3ZhciBuPXQ8PDEsbz1yLkJ5dGVCdWZmZXIuYWxsb2NhdGUobik7cmV0dXJuIG8uc2V0UG9zaXRpb24obi10KSxvLmJ5dGVzKCkuc2V0KGUuYnl0ZXMoKSxuLXQpLG99LHIuQnVpbGRlci5wcm90b3R5cGUuYWRkT2Zmc2V0PWZ1bmN0aW9uKGUpe3RoaXMucHJlcChyLlNJWkVPRl9JTlQsMCksdGhpcy53cml0ZUludDMyKHRoaXMub2Zmc2V0KCktZStyLlNJWkVPRl9JTlQpO30sci5CdWlsZGVyLnByb3RvdHlwZS5zdGFydE9iamVjdD1mdW5jdGlvbihlKXt0aGlzLm5vdE5lc3RlZCgpLG51bGw9PXRoaXMudnRhYmxlJiYodGhpcy52dGFibGU9W10pLHRoaXMudnRhYmxlX2luX3VzZT1lO2Zvcih2YXIgdD0wO3Q8ZTt0KyspdGhpcy52dGFibGVbdF09MDt0aGlzLmlzTmVzdGVkPSEwLHRoaXMub2JqZWN0X3N0YXJ0PXRoaXMub2Zmc2V0KCk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmVuZE9iamVjdD1mdW5jdGlvbigpe2lmKG51bGw9PXRoaXMudnRhYmxlfHwhdGhpcy5pc05lc3RlZCl0aHJvdyBuZXcgRXJyb3IoIkZsYXRCdWZmZXJzOiBlbmRPYmplY3QgY2FsbGVkIHdpdGhvdXQgc3RhcnRPYmplY3QiKTt0aGlzLmFkZEludDMyKDApO2Zvcih2YXIgZT10aGlzLm9mZnNldCgpLHQ9dGhpcy52dGFibGVfaW5fdXNlLTE7dD49MCYmMD09dGhpcy52dGFibGVbdF07dC0tKTtmb3IodmFyIG49dCsxO3Q+PTA7dC0tKXRoaXMuYWRkSW50MTYoMCE9dGhpcy52dGFibGVbdF0/ZS10aGlzLnZ0YWJsZVt0XTowKTt0aGlzLmFkZEludDE2KGUtdGhpcy5vYmplY3Rfc3RhcnQpO3ZhciBvPShuKzIpKnIuU0laRU9GX1NIT1JUO3RoaXMuYWRkSW50MTYobyk7dmFyIGk9MCxzPXRoaXMuc3BhY2U7ZTpmb3IodD0wO3Q8dGhpcy52dGFibGVzLmxlbmd0aDt0Kyspe3ZhciBhPXRoaXMuYmIuY2FwYWNpdHkoKS10aGlzLnZ0YWJsZXNbdF07aWYobz09dGhpcy5iYi5yZWFkSW50MTYoYSkpe2Zvcih2YXIgdT1yLlNJWkVPRl9TSE9SVDt1PG87dSs9ci5TSVpFT0ZfU0hPUlQpaWYodGhpcy5iYi5yZWFkSW50MTYocyt1KSE9dGhpcy5iYi5yZWFkSW50MTYoYSt1KSljb250aW51ZSBlO2k9dGhpcy52dGFibGVzW3RdO2JyZWFrfX1yZXR1cm4gaT8odGhpcy5zcGFjZT10aGlzLmJiLmNhcGFjaXR5KCktZSx0aGlzLmJiLndyaXRlSW50MzIodGhpcy5zcGFjZSxpLWUpKToodGhpcy52dGFibGVzLnB1c2godGhpcy5vZmZzZXQoKSksdGhpcy5iYi53cml0ZUludDMyKHRoaXMuYmIuY2FwYWNpdHkoKS1lLHRoaXMub2Zmc2V0KCktZSkpLHRoaXMuaXNOZXN0ZWQ9ITEsZX0sci5CdWlsZGVyLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPW4/ci5TSVpFX1BSRUZJWF9MRU5HVEg6MDtpZih0KXt2YXIgaT10O2lmKHRoaXMucHJlcCh0aGlzLm1pbmFsaWduLHIuU0laRU9GX0lOVCtyLkZJTEVfSURFTlRJRklFUl9MRU5HVEgrbyksaS5sZW5ndGghPXIuRklMRV9JREVOVElGSUVSX0xFTkdUSCl0aHJvdyBuZXcgRXJyb3IoIkZsYXRCdWZmZXJzOiBmaWxlIGlkZW50aWZpZXIgbXVzdCBiZSBsZW5ndGggIityLkZJTEVfSURFTlRJRklFUl9MRU5HVEgpO2Zvcih2YXIgcz1yLkZJTEVfSURFTlRJRklFUl9MRU5HVEgtMTtzPj0wO3MtLSl0aGlzLndyaXRlSW50OChpLmNoYXJDb2RlQXQocykpO310aGlzLnByZXAodGhpcy5taW5hbGlnbixyLlNJWkVPRl9JTlQrbyksdGhpcy5hZGRPZmZzZXQoZSksbyYmdGhpcy5hZGRJbnQzMih0aGlzLmJiLmNhcGFjaXR5KCktdGhpcy5zcGFjZSksdGhpcy5iYi5zZXRQb3NpdGlvbih0aGlzLnNwYWNlKTt9LHIuQnVpbGRlci5wcm90b3R5cGUuZmluaXNoU2l6ZVByZWZpeGVkPWZ1bmN0aW9uKGUsdCl7dGhpcy5maW5pc2goZSx0LCEwKTt9LHIuQnVpbGRlci5wcm90b3R5cGUucmVxdWlyZWRGaWVsZD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYmIuY2FwYWNpdHkoKS1lLHI9bi10aGlzLmJiLnJlYWRJbnQzMihuKTtpZigwPT10aGlzLmJiLnJlYWRJbnQxNihyK3QpKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IGZpZWxkICIrdCsiIG11c3QgYmUgc2V0Iil9LHIuQnVpbGRlci5wcm90b3R5cGUuc3RhcnRWZWN0b3I9ZnVuY3Rpb24oZSx0LG4pe3RoaXMubm90TmVzdGVkKCksdGhpcy52ZWN0b3JfbnVtX2VsZW1zPXQsdGhpcy5wcmVwKHIuU0laRU9GX0lOVCxlKnQpLHRoaXMucHJlcChuLGUqdCk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmVuZFZlY3Rvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLndyaXRlSW50MzIodGhpcy52ZWN0b3JfbnVtX2VsZW1zKSx0aGlzLm9mZnNldCgpfSxyLkJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZVN0cmluZz1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheSl2YXIgdD1lO2Vsc2Uge3Q9W107Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDspe3ZhciByLG89ZS5jaGFyQ29kZUF0KG4rKyk7KHI9bzw1NTI5Nnx8bz49NTYzMjA/bzoobzw8MTApK2UuY2hhckNvZGVBdChuKyspKy01NjYxMzg4OCk8MTI4P3QucHVzaChyKToocjwyMDQ4P3QucHVzaChyPj42JjMxfDE5Mik6KHI8NjU1MzY/dC5wdXNoKHI+PjEyJjE1fDIyNCk6dC5wdXNoKHI+PjE4Jjd8MjQwLHI+PjEyJjYzfDEyOCksdC5wdXNoKHI+PjYmNjN8MTI4KSksdC5wdXNoKDYzJnJ8MTI4KSk7fX10aGlzLmFkZEludDgoMCksdGhpcy5zdGFydFZlY3RvcigxLHQubGVuZ3RoLDEpLHRoaXMuYmIuc2V0UG9zaXRpb24odGhpcy5zcGFjZS09dC5sZW5ndGgpLG49MDtmb3IodmFyIGk9dGhpcy5zcGFjZSxzPXRoaXMuYmIuYnl0ZXMoKTtuPHQubGVuZ3RoO24rKylzW2krK109dFtuXTtyZXR1cm4gdGhpcy5lbmRWZWN0b3IoKX0sci5CdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVMb25nPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuTG9uZy5jcmVhdGUoZSx0KX0sci5CeXRlQnVmZmVyPWZ1bmN0aW9uKGUpe3RoaXMuYnl0ZXNfPWUsdGhpcy5wb3NpdGlvbl89MDt9LHIuQnl0ZUJ1ZmZlci5hbGxvY2F0ZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHIuQnl0ZUJ1ZmZlcihuZXcgVWludDhBcnJheShlKSl9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnBvc2l0aW9uXz0wO30sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ5dGVzX30sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5wb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uX30sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5zZXRQb3NpdGlvbj1mdW5jdGlvbihlKXt0aGlzLnBvc2l0aW9uXz1lO30sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5jYXBhY2l0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ5dGVzXy5sZW5ndGh9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVhZFVpbnQ4KGUpPDwyND4+MjR9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQ4PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmJ5dGVzX1tlXX0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTY9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVhZFVpbnQxNihlKTw8MTY+PjE2fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MTY9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYnl0ZXNfW2VdfHRoaXMuYnl0ZXNfW2UrMV08PDh9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmJ5dGVzX1tlXXx0aGlzLmJ5dGVzX1tlKzFdPDw4fHRoaXMuYnl0ZXNfW2UrMl08PDE2fHRoaXMuYnl0ZXNfW2UrM108PDI0fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MzI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVhZEludDMyKGUpPj4+MH0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50NjQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyByLkxvbmcodGhpcy5yZWFkSW50MzIoZSksdGhpcy5yZWFkSW50MzIoZSs0KSl9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQ2ND1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHIuTG9uZyh0aGlzLnJlYWRVaW50MzIoZSksdGhpcy5yZWFkVWludDMyKGUrNCkpfSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdDMyPWZ1bmN0aW9uKGUpe3JldHVybiByLmludDMyWzBdPXRoaXMucmVhZEludDMyKGUpLHIuZmxvYXQzMlswXX0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXQ2ND1mdW5jdGlvbihlKXtyZXR1cm4gci5pbnQzMltyLmlzTGl0dGxlRW5kaWFuPzA6MV09dGhpcy5yZWFkSW50MzIoZSksci5pbnQzMltyLmlzTGl0dGxlRW5kaWFuPzE6MF09dGhpcy5yZWFkSW50MzIoZSs0KSxyLmZsb2F0NjRbMF19LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGUsdCl7dGhpcy5ieXRlc19bZV09dDt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50OD1mdW5jdGlvbihlLHQpe3RoaXMuYnl0ZXNfW2VdPXQ7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTY9ZnVuY3Rpb24oZSx0KXt0aGlzLmJ5dGVzX1tlXT10LHRoaXMuYnl0ZXNfW2UrMV09dD4+ODt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MTY9ZnVuY3Rpb24oZSx0KXt0aGlzLmJ5dGVzX1tlXT10LHRoaXMuYnl0ZXNfW2UrMV09dD4+ODt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMj1mdW5jdGlvbihlLHQpe3RoaXMuYnl0ZXNfW2VdPXQsdGhpcy5ieXRlc19bZSsxXT10Pj44LHRoaXMuYnl0ZXNfW2UrMl09dD4+MTYsdGhpcy5ieXRlc19bZSszXT10Pj4yNDt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MzI9ZnVuY3Rpb24oZSx0KXt0aGlzLmJ5dGVzX1tlXT10LHRoaXMuYnl0ZXNfW2UrMV09dD4+OCx0aGlzLmJ5dGVzX1tlKzJdPXQ+PjE2LHRoaXMuYnl0ZXNfW2UrM109dD4+MjQ7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlSW50NjQ9ZnVuY3Rpb24oZSx0KXt0aGlzLndyaXRlSW50MzIoZSx0LmxvdyksdGhpcy53cml0ZUludDMyKGUrNCx0LmhpZ2gpO30sci5CeXRlQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQ2ND1mdW5jdGlvbihlLHQpe3RoaXMud3JpdGVVaW50MzIoZSx0LmxvdyksdGhpcy53cml0ZVVpbnQzMihlKzQsdC5oaWdoKTt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdDMyPWZ1bmN0aW9uKGUsdCl7ci5mbG9hdDMyWzBdPXQsdGhpcy53cml0ZUludDMyKGUsci5pbnQzMlswXSk7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXQ2ND1mdW5jdGlvbihlLHQpe3IuZmxvYXQ2NFswXT10LHRoaXMud3JpdGVJbnQzMihlLHIuaW50MzJbci5pc0xpdHRsZUVuZGlhbj8wOjFdKSx0aGlzLndyaXRlSW50MzIoZSs0LHIuaW50MzJbci5pc0xpdHRsZUVuZGlhbj8xOjBdKTt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuZ2V0QnVmZmVySWRlbnRpZmllcj1mdW5jdGlvbigpe2lmKHRoaXMuYnl0ZXNfLmxlbmd0aDx0aGlzLnBvc2l0aW9uXytyLlNJWkVPRl9JTlQrci5GSUxFX0lERU5USUZJRVJfTEVOR1RIKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IEJ5dGVCdWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4gYW4gaWRlbnRpZmllci4iKTtmb3IodmFyIGU9IiIsdD0wO3Q8ci5GSUxFX0lERU5USUZJRVJfTEVOR1RIO3QrKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMucmVhZEludDgodGhpcy5wb3NpdGlvbl8rci5TSVpFT0ZfSU5UK3QpKTtyZXR1cm4gZX0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5fX29mZnNldD1mdW5jdGlvbihlLHQpe3ZhciBuPWUtdGhpcy5yZWFkSW50MzIoZSk7cmV0dXJuIHQ8dGhpcy5yZWFkSW50MTYobik/dGhpcy5yZWFkSW50MTYobit0KTowfSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLl9fdW5pb249ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5iYl9wb3M9dCt0aGlzLnJlYWRJbnQzMih0KSxlLmJiPXRoaXMsZX0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5fX3N0cmluZz1mdW5jdGlvbihlLHQpe2UrPXRoaXMucmVhZEludDMyKGUpO3ZhciBuPXRoaXMucmVhZEludDMyKGUpLG89IiIsaT0wO2lmKGUrPXIuU0laRU9GX0lOVCx0PT09ci5FbmNvZGluZy5VVEY4X0JZVEVTKXJldHVybiB0aGlzLmJ5dGVzXy5zdWJhcnJheShlLGUrbik7Zm9yKDtpPG47KXt2YXIgcyxhPXRoaXMucmVhZFVpbnQ4KGUraSsrKTtpZihhPDE5MilzPWE7ZWxzZSB7dmFyIHU9dGhpcy5yZWFkVWludDgoZStpKyspO2lmKGE8MjI0KXM9KDMxJmEpPDw2fDYzJnU7ZWxzZSB7dmFyIGw9dGhpcy5yZWFkVWludDgoZStpKyspO3M9YTwyNDA/KDE1JmEpPDwxMnwoNjMmdSk8PDZ8NjMmbDooNyZhKTw8MTh8KDYzJnUpPDwxMnwoNjMmbCk8PDZ8NjMmdGhpcy5yZWFkVWludDgoZStpKyspO319czw2NTUzNj9vKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpOihzLT02NTUzNixvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2KyhzPj4xMCksNTYzMjArKDEwMjMmcykpKTt9cmV0dXJuIG99LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX19pbmRpcmVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZSt0aGlzLnJlYWRJbnQzMihlKX0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5fX3ZlY3Rvcj1mdW5jdGlvbihlKXtyZXR1cm4gZSt0aGlzLnJlYWRJbnQzMihlKStyLlNJWkVPRl9JTlR9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX192ZWN0b3JfbGVuPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlYWRJbnQzMihlK3RoaXMucmVhZEludDMyKGUpKX0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5fX2hhc19pZGVudGlmaWVyPWZ1bmN0aW9uKGUpe2lmKGUubGVuZ3RoIT1yLkZJTEVfSURFTlRJRklFUl9MRU5HVEgpdGhyb3cgbmV3IEVycm9yKCJGbGF0QnVmZmVyczogZmlsZSBpZGVudGlmaWVyIG11c3QgYmUgbGVuZ3RoICIrci5GSUxFX0lERU5USUZJRVJfTEVOR1RIKTtmb3IodmFyIHQ9MDt0PHIuRklMRV9JREVOVElGSUVSX0xFTkdUSDt0KyspaWYoZS5jaGFyQ29kZUF0KHQpIT10aGlzLnJlYWRJbnQ4KHRoaXMucG9zaXRpb25fK3IuU0laRU9GX0lOVCt0KSlyZXR1cm4gITE7cmV0dXJuICEwfSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLmNyZWF0ZUxvbmc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci5Mb25nLmNyZWF0ZShlLHQpfTt9fSxfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX189e307ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhlKXt2YXIgdD1fX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bZV07aWYodm9pZCAwIT09dClyZXR1cm4gdC5leHBvcnRzO3ZhciBuPV9fd2VicGFja19tb2R1bGVfY2FjaGVfX1tlXT17ZXhwb3J0czp7fX07cmV0dXJuIF9fd2VicGFja19tb2R1bGVzX19bZV0uY2FsbChuLmV4cG9ydHMsbixuLmV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyksbi5leHBvcnRzfV9fd2VicGFja19yZXF1aXJlX18ubj1lPT57dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlPygpPT5lLmRlZmF1bHQ6KCk9PmU7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18uZCh0LHthOnR9KSx0fSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQ9KGUsdCk9Pntmb3IodmFyIG4gaW4gdClfX3dlYnBhY2tfcmVxdWlyZV9fLm8odCxuKSYmIV9fd2VicGFja19yZXF1aXJlX18ubyhlLG4pJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHtlbnVtZXJhYmxlOiEwLGdldDp0W25dfSk7fSxfX3dlYnBhY2tfcmVxdWlyZV9fLm89KGUsdCk9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpLF9fd2VicGFja19yZXF1aXJlX18ucj1lPT57InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt9O3ZhciBfX3dlYnBhY2tfZXhwb3J0c19fPV9fd2VicGFja19yZXF1aXJlX18oMTA1Nyk7cmV0dXJuIF9fd2VicGFja19leHBvcnRzX199KSgpLG1vZHVsZS5leHBvcnRzPXQoKTt9KShvcnRfbWluLG9ydF9taW4uZXhwb3J0cyk7dmFyIG9ydF9taW5FeHBvcnRzPW9ydF9taW4uZXhwb3J0cztnZXREZWZhdWx0RXhwb3J0RnJvbUNqcyhvcnRfbWluRXhwb3J0cyk7CgpjbGFzcyBXb3JrZXJOYXRpdmV7Y29uc3RydWN0b3IoKXt0aGlzLnJlYWR5PSExO29ydF9taW5FeHBvcnRzLmVudi53YXNtLndhc21QYXRocz0ie3tNRVRBX1VSTH19Iix0aGlzLmluZGV4ZWREQk1hbmFnZXI9bmV3IEluZGV4ZWREQk1hbmFnZXIoIm9uaXJpeC1zZGsiLCJmaWxlcyIpLHRoaXMuaW5kZXhlZERCTWFuYWdlci5nZXRGaWxlRnJvbUluZGV4ZWREQigiU0RLXzEuNi4xMSIpLnRoZW4oKGFzeW5jIHQ9PntsZXQgZT1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0XSx7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pKTtjb25zdHtkZWZhdWx0OmF9PWF3YWl0IGltcG9ydCgvKiB3ZWJwYWNrSWdub3JlOiB0cnVlLCB3ZWJwYWNrTW9kZTogImxhenkiICovZSksaT1hd2FpdCBhKCk7dGhpcy5uYXRpdmVTREs9aSx0aGlzLmNvYXJzZUZyYW1lPXRoaXMubmF0aXZlU0RLLl9tYWxsb2MoMzY4NjQwMCksdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmZyYW1lTGF5b3V0U3RydWN0PXRoaXMubmF0aXZlU0RLLl9tYWxsb2MoMjgpO2xldCBzPWF3YWl0IHRoaXMuaW5kZXhlZERCTWFuYWdlci5nZXRGcm9tQ2FjaGVPckZldGNoKCJjb2Fyc2Vsb2Mub25ueCIsImh0dHBzOi8vc2RrLm9uaXJpeC5jb20vY29tbW9uL2NvYXJzZWxvYy5vbm54Iik7Y29uc3Qgcj1hd2FpdCBvcnRfbWluRXhwb3J0cy5JbmZlcmVuY2VTZXNzaW9uLmNyZWF0ZShzLHtleGVjdXRpb25Qcm92aWRlcnM6WyJ3YXNtIl19KTt0aGlzLnNlc3Npb249cixhd2FpdCB0aGlzLnNlc3Npb24ucnVuKHtpbnB1dDpuZXcgb3J0X21pbkV4cG9ydHMuVGVuc29yKG5ldyBGbG9hdDMyQXJyYXkoQXJyYXkoOTIxNjAwKS5maWxsKDApKSxbMSwzLDY0MCw0ODBdKX0pLHRoaXMucmVhZHk9ITAscG9zdE1lc3NhZ2UoInJlYWR5Iik7fSkpO31zdGFydCgpe2FkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLChhc3luYyB0PT57aWYoIXRoaXMucmVhZHkpcmV0dXJuIHZvaWQgcG9zdE1lc3NhZ2UoITEpO3RoaXMucmVhZHk9ITE7Y29uc3QgZT10LmRhdGEsYT1lLndpZHRoKmUuaGVpZ2h0KjQ7MCE9dGhpcy5idWZmZXJMZW5ndGgmJnRoaXMuYnVmZmVyTGVuZ3RoPT1hfHwoMCE9dGhpcy5idWZmZXJMZW5ndGgmJnRoaXMubmF0aXZlU0RLLl9mcmVlKHRoaXMuYnVmZmVyKSx0aGlzLmJ1ZmZlckxlbmd0aD1hLHRoaXMuYnVmZmVyPXRoaXMubmF0aXZlU0RLLl9tYWxsb2ModGhpcy5idWZmZXJMZW5ndGgpKSx0aGlzLm5hdGl2ZVNESy5IRUFQVTguc2V0KGUuZGF0YSx0aGlzLmJ1ZmZlciksdGhpcy5uYXRpdmVTREsuSEVBUFUzMlt0aGlzLmZyYW1lTGF5b3V0U3RydWN0LzQrMF09ZS53aWR0aCx0aGlzLm5hdGl2ZVNESy5IRUFQVTMyW3RoaXMuZnJhbWVMYXlvdXRTdHJ1Y3QvNCsxXT1lLmhlaWdodCx0aGlzLm5hdGl2ZVNESy5IRUFQVTMyW3RoaXMuZnJhbWVMYXlvdXRTdHJ1Y3QvNCsyXT00KmUud2lkdGgsdGhpcy5uYXRpdmVTREsuSEVBUFUzMlt0aGlzLmZyYW1lTGF5b3V0U3RydWN0LzQrM109ITEsdGhpcy5uYXRpdmVTREsuSEVBUFUzMlt0aGlzLmZyYW1lTGF5b3V0U3RydWN0LzQrNF09ZS5jb2xvclNwYWNlLHRoaXMubmF0aXZlU0RLLkhFQVBVMzJbdGhpcy5mcmFtZUxheW91dFN0cnVjdC80KzVdPWUucm90YXRlLHRoaXMubmF0aXZlU0RLLkhFQVBVMzJbdGhpcy5mcmFtZUxheW91dFN0cnVjdC80KzZdPWUuZmxpcDtsZXQgaT10aGlzLm5hdGl2ZVNESy5fT1hfRXh0cmFjdCh0aGlzLmJ1ZmZlcix0aGlzLmNvYXJzZUZyYW1lLHRoaXMuZnJhbWVMYXlvdXRTdHJ1Y3QsZS5kdHlwZSkscz1bXTtmb3IobGV0IHQ9MDt0PDkyMTYwMDt0Kyspcy5wdXNoKHRoaXMubmF0aXZlU0RLLkhFQVBGMzJbdGhpcy5jb2Fyc2VGcmFtZS80K3RdKTtsZXQgcj1hd2FpdCB0aGlzLnNlc3Npb24ucnVuKHtpbnB1dDpuZXcgb3J0X21pbkV4cG9ydHMuVGVuc29yKG5ldyBGbG9hdDMyQXJyYXkocyksWzEsMyw2NDAsNDgwXSl9KTtwb3N0TWVzc2FnZSh7ZXh0cmFjdGlvbjpuZXcgRmxvYXQzMkFycmF5KHRoaXMucmVhZEV4dHJhY3Rpb25EYXRhKHRoaXMubmF0aXZlU0RLLkhFQVBGMzIsaS80KSksZGVzY3JpcHRvcjpyLm91dHB1dC5kYXRhfSksdGhpcy5yZWFkeT0hMDt9KSk7fXJlYWRFeHRyYWN0aW9uRGF0YSh0LGUpe2xldCBhPWUsaT1bXSxzPXRbYV07aS5wdXNoKHMpLGErKztmb3IobGV0IGU9MDtlPHM7ZSsrKWkucHVzaCh0W2FdKSxpLnB1c2godFthKzFdKSxhKz0yO2ZvcihsZXQgZT0wO2U8MTI4KnM7ZSsrKWkucHVzaCh0W2FdKSxhKys7cmV0dXJuIGl9fWNvbnN0IHdvcmtlcj1uZXcgV29ya2VyTmF0aXZlO3dvcmtlci5zdGFydCgpOwo=").replace("{{META_URL}}",new URL("./",import.meta.url)),d=new Blob([b],{type:"application/javascript"});this.workers[l]=new Worker(/* webpackIgnore: true, webpackMode: "lazy" */URL.createObjectURL(d),{type:"module"}),this.callbacks[l]=Z,this.workers[l].addEventListener("message",(Z=>{this.callbacks[l](Z.data);}));}}createMatchingWorker(l,Z){if(!this.workerExists(l)){let b=new Blob([atob("Y2xhc3MgSW5kZXhlZERCTWFuYWdlcntjb25zdHJ1Y3RvcihlLHIpe3RoaXMuZGJOYW1lPWUsdGhpcy5zdG9yZU5hbWU9cjt9YXN5bmMgZ2V0RnJvbUNhY2hlT3JGZXRjaChlLHIpe2xldCB0PW51bGw7dHJ5e3Q9YXdhaXQgdGhpcy5nZXRGaWxlRnJvbUluZGV4ZWREQihlKTt9Y2F0Y2goZSl7Y29uc29sZS5sb2coIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBnZXQgZWxlbWVudCBmcm9tIGluZGV4ZWREQi4iKTt9cmV0dXJuIHR8fCh0PWF3YWl0IHRoaXMuZmV0Y2hBbmRDYWNoZUZpbGUocixlKSksbmV3IFVpbnQ4QXJyYXkodCl9YXN5bmMgZ2V0RmlsZUZyb21JbmRleGVkREIoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCgocix0KT0+e2NvbnN0IG89aW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUpO28ub25lcnJvcj0oKT0+dChvLmVycm9yKSxvLm9uc3VjY2Vzcz0oKT0+e2NvbnN0IHM9by5yZXN1bHQudHJhbnNhY3Rpb24odGhpcy5zdG9yZU5hbWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLmdldChlKTtzLm9uc3VjY2Vzcz0oKT0+cihzLnJlc3VsdCkscy5vbmVycm9yPSgpPT50KHMuZXJyb3IpO30sby5vbnVwZ3JhZGVuZWVkZWQ9ZT0+e2UudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7fTt9KSl9YXN5bmMgc2F2ZUZpbGVUb0luZGV4ZWREQihlLHIpe3JldHVybiBuZXcgUHJvbWlzZSgoKHQsbyk9Pntjb25zdCBzPWluZGV4ZWREQi5vcGVuKHRoaXMuZGJOYW1lKTtzLm9uZXJyb3I9KCk9Pm8ocy5lcnJvcikscy5vbnVwZ3JhZGVuZWVkZWQ9ZT0+e2UudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7fSxzLm9uc3VjY2Vzcz0oKT0+e3RyeXtjb25zdCBuPXMucmVzdWx0LnRyYW5zYWN0aW9uKHRoaXMuc3RvcmVOYW1lLCJyZWFkd3JpdGUiKSxhPW4ub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLnB1dChyLGUpO2Eub25zdWNjZXNzPSgpPT50KGEucmVzdWx0KSxhLm9uZXJyb3I9KCk9Pm8oYS5lcnJvcik7fWNhdGNoKGUpe28oZSk7fX07fSkpfWFzeW5jIGZldGNoQW5kQ2FjaGVGaWxlKGUscil7Y29uc3QgdD1hd2FpdCBmZXRjaChlKSxvPWF3YWl0IHQuYXJyYXlCdWZmZXIoKTtyZXR1cm4gYXdhaXQgdGhpcy5zYXZlRmlsZVRvSW5kZXhlZERCKHIsbyksb319CgpjbGFzcyBXb3JrZXJOYXRpdmV7Y29uc3RydWN0b3IoKXt0aGlzLnJlYWR5PSExO3RoaXMuaW5kZXhlZERCTWFuYWdlcj1uZXcgSW5kZXhlZERCTWFuYWdlcigib25pcml4LXNkayIsImZpbGVzIiksdGhpcy5pbmRleGVkREJNYW5hZ2VyLmdldEZpbGVGcm9tSW5kZXhlZERCKCJTREtfMS42LjExIikudGhlbigoYXN5bmMgZT0+e2xldCB0PVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2VdLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSkpO2NvbnN0e2RlZmF1bHQ6YX09YXdhaXQgaW1wb3J0KC8qIHdlYnBhY2tJZ25vcmU6IHRydWUsIHdlYnBhY2tNb2RlOiAibGF6eSIgKi90KSxyPWF3YWl0IGEoKTt0aGlzLm5hdGl2ZVNESz1yLHRoaXMuZnJvbUJ1ZmZlcj10aGlzLm5hdGl2ZVNESy5fbWFsbG9jKDIyZTUpLHRoaXMudG9CdWZmZXI9dGhpcy5uYXRpdmVTREsuX21hbGxvYygyMmU1KSx0aGlzLnJlYWR5PSEwLHBvc3RNZXNzYWdlKCJyZWFkeSIpO30pKTt9c3RhcnQoKXthZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwoYXN5bmMgZT0+e2lmKCF0aGlzLnJlYWR5KXJldHVybjtjb25zdCB0PWUuZGF0YSxhPXQuZnJvbSxyPXQudG87dGhpcy5uYXRpdmVTREsuSEVBUEYzMi5zZXQoYSx0aGlzLmZyb21CdWZmZXIvNCksdGhpcy5uYXRpdmVTREsuSEVBUEYzMi5zZXQocix0aGlzLnRvQnVmZmVyLzQpO2xldCBzPXRoaXMubmF0aXZlU0RLLl9PWF9NYXRjaCh0aGlzLmZyb21CdWZmZXIsdGhpcy50b0J1ZmZlcix0LmR0eXBlKTtwb3N0TWVzc2FnZShuZXcgRmxvYXQzMkFycmF5KHRoaXMucmVhZE1hdGNoaW5nRGF0YSh0aGlzLm5hdGl2ZVNESy5IRUFQRjMyLHMvNCkpKTt9KSk7fXJlYWRNYXRjaGluZ0RhdGEoZSx0KXtsZXQgYT10LHI9W10scz1lW2FdO3IucHVzaChzKSxhKys7Zm9yKGxldCB0PTA7dDxzO3QrKylyLnB1c2goZVthXSksci5wdXNoKGVbYSsxXSksYSs9MjtyZXR1cm4gcn19Y29uc3Qgd29ya2VyPW5ldyBXb3JrZXJOYXRpdmU7d29ya2VyLnN0YXJ0KCk7Cg==")],{type:"application/javascript"});this.workers[l]=new Worker(/* webpackIgnore: true, webpackMode: "lazy" */URL.createObjectURL(b),{type:"module"}),this.callbacks[l]=Z,this.workers[l].addEventListener("message",(Z=>{this.callbacks[l](Z.data);}));}}replaceCallback(l,Z){this.workerExists(l)&&(this.callbacks[l]=Z);}sendDataToWorker(l,Z){this.workers[l].postMessage(Z);}async createWorkers(){return Promise.all([new Promise(((l,Z)=>{this.createExtractionWorker("extraction",(Z=>{"ready"===Z&&l();}));})),new Promise(((l,Z)=>{this.createMatchingWorker("matching",(Z=>{"ready"===Z&&l();}));}))])}}
49
+ class WorkerExtractionData{constructor(l,Z,b,d,G,m,c=5){this.data=l,this.width=Z,this.height=b,this.rotate=d,this.flip=G,this.colorSpace=c,this.dtype=m;}}class WorkerMatchingData{constructor(l,Z,b,d){this.idx=l,this.from=Z,this.to=b,this.dtype=d;}}class WorkerManager{constructor(){this.workers={},this.callbacks={};}workerExists(l){return void 0!==this.workers[l]&&void 0!==this.callbacks[l]}createExtractionWorker(l,Z){if(!this.workerExists(l)){let b=atob("Y2xhc3MgSW5kZXhlZERCTWFuYWdlcntjb25zdHJ1Y3RvcihlLHIpe3RoaXMuZGJOYW1lPWUsdGhpcy5zdG9yZU5hbWU9cjt9YXN5bmMgZ2V0RnJvbUNhY2hlT3JGZXRjaChlLHIpe2xldCB0PW51bGw7dHJ5e3Q9YXdhaXQgdGhpcy5nZXRGaWxlRnJvbUluZGV4ZWREQihlKTt9Y2F0Y2goZSl7Y29uc29sZS5sb2coIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBnZXQgZWxlbWVudCBmcm9tIGluZGV4ZWREQi4iKTt9cmV0dXJuIHR8fCh0PWF3YWl0IHRoaXMuZmV0Y2hBbmRDYWNoZUZpbGUocixlKSksbmV3IFVpbnQ4QXJyYXkodCl9YXN5bmMgZ2V0RmlsZUZyb21JbmRleGVkREIoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCgocix0KT0+e2NvbnN0IG89aW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUpO28ub25lcnJvcj0oKT0+dChvLmVycm9yKSxvLm9uc3VjY2Vzcz0oKT0+e2NvbnN0IHM9by5yZXN1bHQudHJhbnNhY3Rpb24odGhpcy5zdG9yZU5hbWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLmdldChlKTtzLm9uc3VjY2Vzcz0oKT0+cihzLnJlc3VsdCkscy5vbmVycm9yPSgpPT50KHMuZXJyb3IpO30sby5vbnVwZ3JhZGVuZWVkZWQ9ZT0+e2UudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7fTt9KSl9YXN5bmMgc2F2ZUZpbGVUb0luZGV4ZWREQihlLHIpe3JldHVybiBuZXcgUHJvbWlzZSgoKHQsbyk9Pntjb25zdCBzPWluZGV4ZWREQi5vcGVuKHRoaXMuZGJOYW1lKTtzLm9uZXJyb3I9KCk9Pm8ocy5lcnJvcikscy5vbnVwZ3JhZGVuZWVkZWQ9ZT0+e2UudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7fSxzLm9uc3VjY2Vzcz0oKT0+e3RyeXtjb25zdCBuPXMucmVzdWx0LnRyYW5zYWN0aW9uKHRoaXMuc3RvcmVOYW1lLCJyZWFkd3JpdGUiKSxhPW4ub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLnB1dChyLGUpO2Eub25zdWNjZXNzPSgpPT50KGEucmVzdWx0KSxhLm9uZXJyb3I9KCk9Pm8oYS5lcnJvcik7fWNhdGNoKGUpe28oZSk7fX07fSkpfWFzeW5jIGZldGNoQW5kQ2FjaGVGaWxlKGUscil7Y29uc3QgdD1hd2FpdCBmZXRjaChlKSxvPWF3YWl0IHQuYXJyYXlCdWZmZXIoKTtyZXR1cm4gYXdhaXQgdGhpcy5zYXZlRmlsZVRvSW5kZXhlZERCKHIsbyksb319Cgp2YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTsKCmZ1bmN0aW9uIGdldERlZmF1bHRFeHBvcnRGcm9tQ2pzICh4KSB7CglyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4Owp9Cgp2YXIgb3J0X21pbiA9IHtleHBvcnRzOiB7fX07CgpvcnRfbWluLmV4cG9ydHM7KGZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXt2YXIgdDt0PSgpPT4oKCk9Pnt2YXIgX193ZWJwYWNrX21vZHVsZXNfXz17NTcxNjooZSx0LG4pPT57dC5SPXZvaWQgMDtjb25zdCByPW4oNjAyNyksbz1uKDE3MjMpO3QuUj1uZXcgY2xhc3N7YXN5bmMgaW5pdCgpe31hc3luYyBjcmVhdGVTZXNzaW9uSGFuZGxlcihlLHQpe2NvbnN0IG49bmV3IHIuU2Vzc2lvbih0KTtyZXR1cm4gYXdhaXQgbi5sb2FkTW9kZWwoZSksbmV3IG8uT25ueGpzU2Vzc2lvbkhhbmRsZXIobil9fTt9LDI4MTg6KGUsdCxuKT0+e3QuYzg9dC5yWD12b2lkIDA7Y29uc3Qgcj1uKDIyMzUpLG89big1MzgxKSxpPW4oOTU0NCkscz1uKDY2NDApO3Quclg9KCk9PntpZigoIm51bWJlciIhPXR5cGVvZiByLmVudi53YXNtLmluaXRUaW1lb3V0fHxyLmVudi53YXNtLmluaXRUaW1lb3V0PDApJiYoci5lbnYud2FzbS5pbml0VGltZW91dD0wKSwiYm9vbGVhbiIhPXR5cGVvZiByLmVudi53YXNtLnNpbWQmJihyLmVudi53YXNtLnNpbWQ9ITApLCJib29sZWFuIiE9dHlwZW9mIHIuZW52Lndhc20ucHJveHkmJihyLmVudi53YXNtLnByb3h5PSExKSwibnVtYmVyIiE9dHlwZW9mIHIuZW52Lndhc20ubnVtVGhyZWFkc3x8IU51bWJlci5pc0ludGVnZXIoci5lbnYud2FzbS5udW1UaHJlYWRzKXx8ci5lbnYud2FzbS5udW1UaHJlYWRzPD0wKXtjb25zdCBlPSJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yPygwLCBvLmNwdXMpKCkubGVuZ3RoOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5O3IuZW52Lndhc20ubnVtVGhyZWFkcz1NYXRoLm1pbig0LE1hdGguY2VpbCgoZXx8MSkvMikpO319LHQuYzg9bmV3IGNsYXNze2FzeW5jIGluaXQoKXsoMCwgdC5yWCkoKSxhd2FpdCgwLCBpLmluaXRpYWxpemVXZWJBc3NlbWJseUluc3RhbmNlKSgpO31hc3luYyBjcmVhdGVTZXNzaW9uSGFuZGxlcihlLHQpe2NvbnN0IG49bmV3IHMuT25ueHJ1bnRpbWVXZWJBc3NlbWJseVNlc3Npb25IYW5kbGVyO3JldHVybiBhd2FpdCBuLmxvYWRNb2RlbChlLHQpLFByb21pc2UucmVzb2x2ZShuKX19O30sMTA1NzpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyYmdGhpcy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pO3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtvJiYhKCJnZXQiaW4gbz8hdC5fX2VzTW9kdWxlOm8ud3JpdGFibGV8fG8uY29uZmlndXJhYmxlKXx8KG89e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixvKTt9OmZ1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pLGVbcl09dFtuXTt9KSxvPXRoaXMmJnRoaXMuX19leHBvcnRTdGFyfHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKSJkZWZhdWx0Ij09PW58fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pfHxyKHQsZSxuKTt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxvKG4oMjIzNSksdCk7Y29uc3QgaT1uKDIyMzUpLHM9big4NDA4KTt7Y29uc3QgZT1uKDU3MTYpLlI7KDAsIGkucmVnaXN0ZXJCYWNrZW5kKSgid2ViZ2wiLGUsLTEwKTt9e2NvbnN0IGU9bigyODE4KS5jODsoMCwgaS5yZWdpc3RlckJhY2tlbmQpKCJjcHUiLGUsMTApLCgwLCBpLnJlZ2lzdGVyQmFja2VuZCkoIndhc20iLGUsMTApLCgwLCBpLnJlZ2lzdGVyQmFja2VuZCkoInhubnBhY2siLGUsOSksKDAsIGkucmVnaXN0ZXJCYWNrZW5kKSgid2Vibm4iLGUsOSk7fWkuZW52LnZlcnNpb25zLndlYj1zLnZlcnNpb247fSw0OTEwOihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5PXZvaWQgMDtjbGFzcyBue2NvbnN0cnVjdG9yKGUpe09iamVjdC5hc3NpZ24odGhpcyxlKTt9Z2V0IGNhY2hlS2V5KCl7cmV0dXJuIHRoaXMuX2NhY2hlS2V5fHwodGhpcy5fY2FjaGVLZXk9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykuc29ydCgpLm1hcCgoZT0+YCR7dGhpc1tlXX1gKSkuam9pbigiOyIpKSx0aGlzLl9jYWNoZUtleX19dC5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXk9ZT0+bmV3IG4oZSk7fSw2ODc0OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5BdHRyaWJ1dGU9dm9pZCAwO2NvbnN0IHI9big1MTI3KSxvPW4oMjQ0NiksaT1uKDkyNDApLHM9big3MjczKTt2YXIgYT1yLm9ubnhydW50aW1lLmV4cGVyaW1lbnRhbC5mYnM7Y2xhc3MgdXtjb25zdHJ1Y3RvcihlKXtpZih0aGlzLl9hdHRyaWJ1dGVzPW5ldyBNYXAsbnVsbCE9ZSl7Zm9yKGNvbnN0IHQgb2YgZSl0IGluc3RhbmNlb2Ygby5vbm54LkF0dHJpYnV0ZVByb3RvP3RoaXMuX2F0dHJpYnV0ZXMuc2V0KHQubmFtZSxbdS5nZXRWYWx1ZSh0KSx1LmdldFR5cGUodCldKTp0IGluc3RhbmNlb2YgYS5BdHRyaWJ1dGUmJnRoaXMuX2F0dHJpYnV0ZXMuc2V0KHQubmFtZSgpLFt1LmdldFZhbHVlKHQpLHUuZ2V0VHlwZSh0KV0pO2lmKHRoaXMuX2F0dHJpYnV0ZXMuc2l6ZTxlLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImR1cGxpY2F0ZWQgYXR0cmlidXRlIG5hbWVzIil9fXNldChlLHQsbil7dGhpcy5fYXR0cmlidXRlcy5zZXQoZSxbbix0XSk7fWRlbGV0ZShlKXt0aGlzLl9hdHRyaWJ1dGVzLmRlbGV0ZShlKTt9Z2V0RmxvYXQoZSx0KXtyZXR1cm4gdGhpcy5nZXQoZSwiZmxvYXQiLHQpfWdldEludChlLHQpe3JldHVybiB0aGlzLmdldChlLCJpbnQiLHQpfWdldFN0cmluZyhlLHQpe3JldHVybiB0aGlzLmdldChlLCJzdHJpbmciLHQpfWdldFRlbnNvcihlLHQpe3JldHVybiB0aGlzLmdldChlLCJ0ZW5zb3IiLHQpfWdldEZsb2F0cyhlLHQpe3JldHVybiB0aGlzLmdldChlLCJmbG9hdHMiLHQpfWdldEludHMoZSx0KXtyZXR1cm4gdGhpcy5nZXQoZSwiaW50cyIsdCl9Z2V0U3RyaW5ncyhlLHQpe3JldHVybiB0aGlzLmdldChlLCJzdHJpbmdzIix0KX1nZXRUZW5zb3JzKGUsdCl7cmV0dXJuIHRoaXMuZ2V0KGUsInRlbnNvcnMiLHQpfWdldChlLHQsbil7Y29uc3Qgcj10aGlzLl9hdHRyaWJ1dGVzLmdldChlKTtpZih2b2lkIDA9PT1yKXtpZih2b2lkIDAhPT1uKXJldHVybiBuO3Rocm93IG5ldyBFcnJvcihgcmVxdWlyZWQgYXR0cmlidXRlIG5vdCBmb3VuZDogJHtlfWApfWlmKHJbMV0hPT10KXRocm93IG5ldyBFcnJvcihgdHlwZSBtaXNtYXRjaDogZXhwZWN0ZWQgJHt0fSBidXQgZ290ICR7clsxXX1gKTtyZXR1cm4gclswXX1zdGF0aWMgZ2V0VHlwZShlKXtjb25zdCB0PWUgaW5zdGFuY2VvZiBvLm9ubnguQXR0cmlidXRlUHJvdG8/ZS50eXBlOmUudHlwZSgpO3N3aXRjaCh0KXtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkZMT0FUOnJldHVybiAiZmxvYXQiO2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuSU5UOnJldHVybiAiaW50IjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlNUUklORzpyZXR1cm4gInN0cmluZyI7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5URU5TT1I6cmV0dXJuICJ0ZW5zb3IiO2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuRkxPQVRTOnJldHVybiAiZmxvYXRzIjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLklOVFM6cmV0dXJuICJpbnRzIjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlNUUklOR1M6cmV0dXJuICJzdHJpbmdzIjtjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlRFTlNPUlM6cmV0dXJuICJ0ZW5zb3JzIjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgYXR0cmlidXRlIHR5cGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQ6ICR7by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGVbdF19YCl9fXN0YXRpYyBnZXRWYWx1ZShlKXtjb25zdCB0PWUgaW5zdGFuY2VvZiBvLm9ubnguQXR0cmlidXRlUHJvdG8/ZS50eXBlOmUudHlwZSgpO2lmKHQ9PT1vLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5HUkFQSHx8dD09PW8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkdSQVBIUyl0aHJvdyBuZXcgRXJyb3IoImdyYXBoIGF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIHlldCIpO2NvbnN0IG49dGhpcy5nZXRWYWx1ZU5vQ2hlY2soZSk7aWYodD09PW8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLklOVCYmcy5Mb25nVXRpbC5pc0xvbmcobikpcmV0dXJuIHMuTG9uZ1V0aWwubG9uZ1RvTnVtYmVyKG4pO2lmKHQ9PT1vLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5JTlRTKXtjb25zdCBlPW4sdD1uZXcgQXJyYXkoZS5sZW5ndGgpO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdCByPWVbbl07dFtuXT1zLkxvbmdVdGlsLmxvbmdUb051bWJlcihyKTt9cmV0dXJuIHR9aWYodD09PW8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlRFTlNPUilyZXR1cm4gZSBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bz9pLlRlbnNvci5mcm9tUHJvdG8obik6aS5UZW5zb3IuZnJvbU9ydFRlbnNvcihuKTtpZih0PT09by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuVEVOU09SUyl7aWYoZSBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bylyZXR1cm4gbi5tYXAoKGU9PmkuVGVuc29yLmZyb21Qcm90byhlKSkpO2lmKGUgaW5zdGFuY2VvZiBhLkF0dHJpYnV0ZSlyZXR1cm4gbi5tYXAoKGU9PmkuVGVuc29yLmZyb21PcnRUZW5zb3IoZSkpKX1pZih0PT09by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuU1RSSU5HJiZlIGluc3RhbmNlb2Ygby5vbm54LkF0dHJpYnV0ZVByb3RvKXtjb25zdCBlPW47cmV0dXJuICgwLCBzLmRlY29kZVV0ZjhTdHJpbmcpKGUpfXJldHVybiB0PT09by5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuU1RSSU5HUyYmZSBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bz9uLm1hcChzLmRlY29kZVV0ZjhTdHJpbmcpOm59c3RhdGljIGdldFZhbHVlTm9DaGVjayhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIG8ub25ueC5BdHRyaWJ1dGVQcm90bz90aGlzLmdldFZhbHVlTm9DaGVja0Zyb21Pbm54Rm9ybWF0KGUpOnRoaXMuZ2V0VmFsdWVOb0NoZWNrRnJvbU9ydEZvcm1hdChlKX1zdGF0aWMgZ2V0VmFsdWVOb0NoZWNrRnJvbU9ubnhGb3JtYXQoZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5GTE9BVDpyZXR1cm4gZS5mO2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuSU5UOnJldHVybiBlLmk7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5TVFJJTkc6cmV0dXJuIGUucztjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLlRFTlNPUjpyZXR1cm4gZS50O2Nhc2Ugby5vbm54LkF0dHJpYnV0ZVByb3RvLkF0dHJpYnV0ZVR5cGUuR1JBUEg6cmV0dXJuIGUuZztjYXNlIG8ub25ueC5BdHRyaWJ1dGVQcm90by5BdHRyaWJ1dGVUeXBlLkZMT0FUUzpyZXR1cm4gZS5mbG9hdHM7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5JTlRTOnJldHVybiBlLmludHM7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5TVFJJTkdTOnJldHVybiBlLnN0cmluZ3M7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5URU5TT1JTOnJldHVybiBlLnRlbnNvcnM7Y2FzZSBvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZS5HUkFQSFM6cmV0dXJuIGUuZ3JhcGhzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBhdHRyaWJ1dGUgdHlwZTogJHtvLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZVtlLnR5cGVdfWApfX1zdGF0aWMgZ2V0VmFsdWVOb0NoZWNrRnJvbU9ydEZvcm1hdChlKXtzd2l0Y2goZS50eXBlKCkpe2Nhc2UgYS5BdHRyaWJ1dGVUeXBlLkZMT0FUOnJldHVybiBlLmYoKTtjYXNlIGEuQXR0cmlidXRlVHlwZS5JTlQ6cmV0dXJuIGUuaSgpO2Nhc2UgYS5BdHRyaWJ1dGVUeXBlLlNUUklORzpyZXR1cm4gZS5zKCk7Y2FzZSBhLkF0dHJpYnV0ZVR5cGUuVEVOU09SOnJldHVybiBlLnQoKTtjYXNlIGEuQXR0cmlidXRlVHlwZS5HUkFQSDpyZXR1cm4gZS5nKCk7Y2FzZSBhLkF0dHJpYnV0ZVR5cGUuRkxPQVRTOnJldHVybiBlLmZsb2F0c0FycmF5KCk7Y2FzZSBhLkF0dHJpYnV0ZVR5cGUuSU5UUzp7Y29uc3QgdD1bXTtmb3IobGV0IG49MDtuPGUuaW50c0xlbmd0aCgpO24rKyl0LnB1c2goZS5pbnRzKG4pKTtyZXR1cm4gdH1jYXNlIGEuQXR0cmlidXRlVHlwZS5TVFJJTkdTOntjb25zdCB0PVtdO2ZvcihsZXQgbj0wO248ZS5zdHJpbmdzTGVuZ3RoKCk7bisrKXQucHVzaChlLnN0cmluZ3MobikpO3JldHVybiB0fWNhc2UgYS5BdHRyaWJ1dGVUeXBlLlRFTlNPUlM6e2NvbnN0IHQ9W107Zm9yKGxldCBuPTA7bjxlLnRlbnNvcnNMZW5ndGgoKTtuKyspdC5wdXNoKGUudGVuc29ycyhuKSk7cmV0dXJuIHR9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGF0dHJpYnV0ZSB0eXBlOiAke2EuQXR0cmlidXRlVHlwZVtlLnR5cGUoKV19YCl9fX10LkF0dHJpYnV0ZT11O30sMTk3NTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucmVzb2x2ZUJhY2tlbmQ9dC5iYWNrZW5kPXZvaWQgMDtjb25zdCByPW4oNDQxOCksbz1uZXcgTWFwO2FzeW5jIGZ1bmN0aW9uIGkoZSl7Y29uc3Qgbj10LmJhY2tlbmQ7aWYodm9pZCAwIT09bltlXSYmZnVuY3Rpb24oZSl7Y29uc3QgdD1lO3JldHVybiAiaW5pdGlhbGl6ZSJpbiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5pbml0aWFsaXplJiYiY3JlYXRlU2Vzc2lvbkhhbmRsZXIiaW4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY3JlYXRlU2Vzc2lvbkhhbmRsZXImJiJkaXNwb3NlImluIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmRpc3Bvc2V9KG5bZV0pKXtjb25zdCB0PW5bZV07bGV0IHI9dC5pbml0aWFsaXplKCk7aWYoIm9iamVjdCI9PXR5cGVvZiByJiYidGhlbiJpbiByJiYocj1hd2FpdCByKSxyKXJldHVybiBvLnNldChlLHQpLHR9fXQuYmFja2VuZD17d2ViZ2w6bmV3IHIuV2ViR0xCYWNrZW5kfSx0LnJlc29sdmVCYWNrZW5kPWFzeW5jIGZ1bmN0aW9uIGUodCl7aWYoIXQpcmV0dXJuIGUoWyJ3ZWJnbCJdKTt7Y29uc3QgZT0ic3RyaW5nIj09dHlwZW9mIHQ/W3RdOnQ7Zm9yKGNvbnN0IHQgb2YgZSl7Y29uc3QgZT1vLmdldCh0KTtpZihlKXJldHVybiBlO2NvbnN0IG49YXdhaXQgaSh0KTtpZihuKXJldHVybiBufX10aHJvdyBuZXcgRXJyb3IoIm5vIGF2YWlsYWJsZSBiYWNrZW5kIHRvIHVzZSIpfTt9LDQ0MTg6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LldlYkdMQmFja2VuZD12b2lkIDA7Y29uc3Qgcj1uKDIyMzUpLG89bigxMzE1KSxpPW4oMjE3MSkscz1uKDMzODkpO3QuV2ViR0xCYWNrZW5kPWNsYXNze2dldCBjb250ZXh0SWQoKXtyZXR1cm4gci5lbnYud2ViZ2wuY29udGV4dElkfXNldCBjb250ZXh0SWQoZSl7ci5lbnYud2ViZ2wuY29udGV4dElkPWU7fWdldCBtYXRtdWxNYXhCYXRjaFNpemUoKXtyZXR1cm4gci5lbnYud2ViZ2wubWF0bXVsTWF4QmF0Y2hTaXplfXNldCBtYXRtdWxNYXhCYXRjaFNpemUoZSl7ci5lbnYud2ViZ2wubWF0bXVsTWF4QmF0Y2hTaXplPWU7fWdldCB0ZXh0dXJlQ2FjaGVNb2RlKCl7cmV0dXJuIHIuZW52LndlYmdsLnRleHR1cmVDYWNoZU1vZGV9c2V0IHRleHR1cmVDYWNoZU1vZGUoZSl7ci5lbnYud2ViZ2wudGV4dHVyZUNhY2hlTW9kZT1lO31nZXQgcGFjaygpe3JldHVybiByLmVudi53ZWJnbC5wYWNrfXNldCBwYWNrKGUpe3IuZW52LndlYmdsLnBhY2s9ZTt9Z2V0IGFzeW5jKCl7cmV0dXJuIHIuZW52LndlYmdsLmFzeW5jfXNldCBhc3luYyhlKXtyLmVudi53ZWJnbC5hc3luYz1lO31pbml0aWFsaXplKCl7dHJ5e3JldHVybiB0aGlzLmdsQ29udGV4dD0oMCxzLmNyZWF0ZVdlYkdMQ29udGV4dCkodGhpcy5jb250ZXh0SWQpLCJudW1iZXIiIT10eXBlb2YgdGhpcy5tYXRtdWxNYXhCYXRjaFNpemUmJih0aGlzLm1hdG11bE1heEJhdGNoU2l6ZT0xNiksInN0cmluZyIhPXR5cGVvZiB0aGlzLnRleHR1cmVDYWNoZU1vZGUmJih0aGlzLnRleHR1cmVDYWNoZU1vZGU9ImZ1bGwiKSwiYm9vbGVhbiIhPXR5cGVvZiB0aGlzLnBhY2smJih0aGlzLnBhY2s9ITEpLCJib29sZWFuIiE9dHlwZW9mIHRoaXMuYXN5bmMmJih0aGlzLmFzeW5jPSExKSxvLkxvZ2dlci5zZXRXaXRoRW52KHIuZW52KSxvLkxvZ2dlci52ZXJib3NlKCJXZWJHTEJhY2tlbmQiLGBDcmVhdGVkIFdlYkdMQ29udGV4dDogJHt0eXBlb2YgdGhpcy5nbENvbnRleHR9IHdpdGggbWF0bXVsTWF4QmF0Y2hTaXplOiAke3RoaXMubWF0bXVsTWF4QmF0Y2hTaXplfTsgdGV4dHVyZUNhY2hlTW9kZTogJHt0aGlzLnRleHR1cmVDYWNoZU1vZGV9OyBwYWNrOiAke3RoaXMucGFja307IGFzeW5jOiAke3RoaXMuYXN5bmN9LmApLCEwfWNhdGNoKGUpe3JldHVybiBvLkxvZ2dlci53YXJuaW5nKCJXZWJHTEJhY2tlbmQiLGBVbmFibGUgdG8gaW5pdGlhbGl6ZSBXZWJHTEJhY2tlbmQuICR7ZX1gKSwhMX19Y3JlYXRlU2Vzc2lvbkhhbmRsZXIoZSl7cmV0dXJuIG5ldyBpLldlYkdMU2Vzc2lvbkhhbmRsZXIodGhpcyxlKX1kaXNwb3NlKCl7dGhpcy5nbENvbnRleHQuZGlzcG9zZSgpO319O30sNjg1OTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuQ29vcmRzR2xzbExpYj12b2lkIDA7Y29uc3Qgcj1uKDcyNzMpLG89bigxOTk3KSxpPW4oNjc1Nykscz1uKDc2MTgpLGE9big0MzIpO2NsYXNzIHUgZXh0ZW5kcyBvLkdsc2xMaWJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7fWdldEZ1bmN0aW9ucygpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMub2Zmc2V0VG9Db29yZHMoKSksdGhpcy5jb29yZHNUb09mZnNldCgpKSx0aGlzLnRvVmVjKCkpLHRoaXMudmFsdWVGcm9tKCkpLHRoaXMuZ2V0Q29tbW9uVXRpbEZ1bmNzKCkpLHRoaXMuZ2V0SW5wdXRzU2FtcGxpbmdTbmlwcGV0cygpKSx0aGlzLmdldE91dHB1dFNhbXBsaW5nU25pcHBldCgpKX1nZXRDdXN0b21UeXBlcygpe3JldHVybiB7fX1vZmZzZXRUb0Nvb3Jkcygpe3JldHVybiB7b2Zmc2V0VG9Db29yZHM6bmV3IG8uR2xzbExpYlJvdXRpbmUoIlxuICAgICAgdmVjMiBvZmZzZXRUb0Nvb3JkcyhpbnQgb2Zmc2V0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHtcbiAgICAgICAgaW50IHQgPSBvZmZzZXQgLyB3aWR0aDtcbiAgICAgICAgaW50IHMgPSBvZmZzZXQgLSB0KndpZHRoO1xuICAgICAgICB2ZWMyIGNvb3JkcyA9ICh2ZWMyKHMsdCkgKyB2ZWMyKDAuNSwwLjUpKSAvIHZlYzIod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHJldHVybiBjb29yZHM7XG4gICAgICB9XG4gICAgICAiKX19Y29vcmRzVG9PZmZzZXQoKXtyZXR1cm4ge2Nvb3Jkc1RvT2Zmc2V0Om5ldyBvLkdsc2xMaWJSb3V0aW5lKCJcbiAgICAgIGludCBjb29yZHNUb09mZnNldCh2ZWMyIGNvb3JkcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7XG4gICAgICAgIGZsb2F0IHMgPSBjb29yZHMucyAqIGZsb2F0KHdpZHRoKTtcbiAgICAgICAgZmxvYXQgdCA9IGNvb3Jkcy50ICogZmxvYXQoaGVpZ2h0KTtcbiAgICAgICAgaW50IG9mZnNldCA9IGludCh0KSAqIHdpZHRoICsgaW50KHMpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgICAgfVxuICAgICAgIil9fWdldE91dHB1dFNhbXBsaW5nU25pcHBldCgpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQ7cmV0dXJuIGUuaXNQYWNrZWQ/dGhpcy5nZXRQYWNrZWRPdXRwdXRTYW1wbGluZ1NuaXBwZXQoZSk6dGhpcy5nZXRVbnBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChlKX1nZXRQYWNrZWRPdXRwdXRTYW1wbGluZ1NuaXBwZXQoZSl7Y29uc3QgdD1lLnVucGFja2VkU2hhcGUsbj1bZS53aWR0aCxlLmhlaWdodF0scj17fSxzPSJnZXRPdXRwdXRDb29yZHMiO3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAwOnJbc109dGhpcy5nZXRPdXRwdXRTY2FsYXJDb29yZHMoKTticmVhaztjYXNlIDE6cltzXT10aGlzLmdldE91dHB1dFBhY2tlZDFEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSAyOnJbc109dGhpcy5nZXRPdXRwdXRQYWNrZWQyRENvb3Jkcyh0LG4pO2JyZWFrO2Nhc2UgMzpyW3NdPXRoaXMuZ2V0T3V0cHV0UGFja2VkM0RDb29yZHModCxuKTticmVhaztkZWZhdWx0OnJbc109dGhpcy5nZXRPdXRwdXRQYWNrZWRORENvb3Jkcyh0LG4pO31jb25zdCBhPWBcbiAgICAgIHZvaWQgc2V0T3V0cHV0KHZlYzQgdmFsKSB7XG4gICAgICAgICR7KDAsIGkuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKS5vdXRwdXR9ID0gdmFsO1xuICAgICAgfVxuICAgIGA7cmV0dXJuIHIuZmxvYXRUZXh0dXJlU2V0UkdCQT1uZXcgby5HbHNsTGliUm91dGluZShhKSxyfWdldFVucGFja2VkT3V0cHV0U2FtcGxpbmdTbmlwcGV0KGUpe2NvbnN0IHQ9ZS51bnBhY2tlZFNoYXBlLG49W2Uud2lkdGgsZS5oZWlnaHRdLHI9e30scz0iZ2V0T3V0cHV0Q29vcmRzIjtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMDpyW3NdPXRoaXMuZ2V0T3V0cHV0U2NhbGFyQ29vcmRzKCk7YnJlYWs7Y2FzZSAxOnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDFEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSAyOnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDJEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSAzOnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDNEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSA0OnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDREQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSA1OnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDVEQ29vcmRzKHQsbik7YnJlYWs7Y2FzZSA2OnJbc109dGhpcy5nZXRPdXRwdXRVbnBhY2tlZDZEQ29vcmRzKHQsbik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG91dHB1dCBkaW1lbnNpb25hbGl0eTogJHt0Lmxlbmd0aH1gKX1jb25zdCBhPWBcbiAgICAgICAgdm9pZCBzZXRPdXRwdXQoZmxvYXQgdmFsKSB7XG4gICAgICAgICAgJHsoMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLm91dHB1dH0gPSB2ZWM0KHZhbCwgMCwgMCwgMCk7XG4gICAgICAgIH1cbiAgICBgO3JldHVybiByLmZsb2F0VGV4dHVyZVNldFI9bmV3IG8uR2xzbExpYlJvdXRpbmUoYSkscn1nZXRPdXRwdXRTY2FsYXJDb29yZHMoKXtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUoIlxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgIil9Z2V0T3V0cHV0UGFja2VkMURDb29yZHMoZSx0KXtjb25zdCBuPXQ7bGV0IHI9IiI7cmV0dXJuIDE9PT1uWzBdPyhyPWBcbiAgICAgICAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICAgICAgcmV0dXJuIDIgKiBpbnQoVGV4Q29vcmRzLnkgKiAke25bMV19LjApO1xuICAgICAgICAgIH1cbiAgICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShyKSk6MT09PW5bMV0/KHI9YFxuICAgICAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgICByZXR1cm4gMiAqIGludChUZXhDb29yZHMueCAqICR7blswXX0uMCk7XG4gICAgICAgICAgfVxuICAgICAgICBgLG5ldyBvLkdsc2xMaWJSb3V0aW5lKHIpKToocj1gXG4gICAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke25bMF19LCAke25bMV19KSk7XG4gICAgICAgICAgcmV0dXJuIDIgKiAocmVzVGV4UkMueSAqICR7blswXX0gKyByZXNUZXhSQy54KTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShyKSl9Z2V0T3V0cHV0UGFja2VkMkRDb29yZHMoZSx0KXtsZXQgbj0iIjtpZihyLkFycmF5VXRpbC5hcnJheXNFcXVhbChlLHQpKXJldHVybiBuPWBcbiAgICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICAgIHJldHVybiAyICogaXZlYzIoVGV4Q29vcmRzLnh5ICogdmVjMigke3RbMF19LCAke3RbMV19KSk7XG4gICAgICAgIH1cbiAgICAgIGAsbmV3IG8uR2xzbExpYlJvdXRpbmUobik7Y29uc3QgaT10LHM9TWF0aC5jZWlsKGVbMV0vMik7cmV0dXJuIG49YFxuICAgICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7aVswXX0sICR7aVsxXX0pKTtcblxuICAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke2lbMF19ICsgcmVzVGV4UkMueDtcblxuICAgICAgICAgIC8vIHJldmVyc2UgciBhbmQgYyBvcmRlciBmb3IgcGFja2VkIHRleHR1cmVcbiAgICAgICAgICBpbnQgciA9IGltb2QoaW5kZXgsICR7c30pICogMjtcbiAgICAgICAgICBpbnQgYyA9IDIgKiAoaW5kZXggLyAke3N9KTtcblxuICAgICAgICAgIHJldHVybiBpdmVjMihyLCBjKTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShuKX1nZXRPdXRwdXRQYWNrZWQzRENvb3JkcyhlLHQpe2NvbnN0IG49W3RbMF0sdFsxXV0scj1NYXRoLmNlaWwoZVsyXS8yKSxpPXIqTWF0aC5jZWlsKGVbMV0vMikscz1gXG4gICAgICAgIGl2ZWMzIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtuWzBdfSwgJHtuWzFdfSkpO1xuICAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke25bMF19ICsgcmVzVGV4UkMueDtcblxuICAgICAgICAgIGludCBiID0gaW5kZXggLyAke2l9O1xuICAgICAgICAgIGluZGV4IC09IGIgKiAke2l9O1xuXG4gICAgICAgICAgLy8gcmV2ZXJzZSByIGFuZCBjIG9yZGVyIGZvciBwYWNrZWQgdGV4dHVyZVxuICAgICAgICAgIGludCByID0gaW1vZChpbmRleCwgJHtyfSkgKiAyO1xuICAgICAgICAgIGludCBjID0gMiAqIChpbmRleCAvICR7cn0pO1xuXG4gICAgICAgICAgcmV0dXJuIGl2ZWMzKGIsIHIsIGMpO1xuICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShzKX1nZXRPdXRwdXRQYWNrZWRORENvb3JkcyhlLHQpe2NvbnN0IG49W3RbMF0sdFsxXV0scj1NYXRoLmNlaWwoZVtlLmxlbmd0aC0xXS8yKSxpPXIqTWF0aC5jZWlsKGVbZS5sZW5ndGgtMl0vMik7bGV0IHM9aSxhPSIiLHU9ImIsIHIsIGMiO2ZvcihsZXQgdD0yO3Q8ZS5sZW5ndGgtMTt0Kyspcyo9ZVtlLmxlbmd0aC10LTFdLGE9YFxuICAgICAgaW50IGIke3R9ID0gaW5kZXggLyAke3N9O1xuICAgICAgaW5kZXggLT0gYiR7dH0gKiAke3N9O1xuICAgIGArYSx1PWBiJHt0fSwgYCt1O2NvbnN0IGw9YFxuICAgICAgaXZlYyR7ZS5sZW5ndGh9IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke25bMF19LCAke25bMV19KSk7XG4gICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke25bMF19ICsgcmVzVGV4UkMueDtcblxuICAgICAgICAke2F9XG5cbiAgICAgICAgaW50IGIgPSBpbmRleCAvICR7aX07XG4gICAgICAgIGluZGV4IC09IGIgKiAke2l9O1xuXG4gICAgICAgIC8vIHJldmVyc2UgciBhbmQgYyBvcmRlciBmb3IgcGFja2VkIHRleHR1cmVcbiAgICAgICAgaW50IHIgPSBpbW9kKGluZGV4LCAke3J9KSAqIDI7XG4gICAgICAgIGludCBjID0gMiAqIChpbmRleCAvICR7cn0pO1xuXG4gICAgICAgIHJldHVybiBpdmVjJHtlLmxlbmd0aH0oJHt1fSk7XG4gICAgICB9XG4gICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobCl9Z2V0T3V0cHV0VW5wYWNrZWQxRENvb3JkcyhlLHQpe2NvbnN0IG49YFxuICAgICAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RbMF19LCAke3RbMV19KSk7XG4gICAgICAgICAgcmV0dXJuIHJlc1RleFJDLnkgKiAke3RbMF19ICsgcmVzVGV4UkMueDtcbiAgICAgICAgfVxuICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobil9Z2V0T3V0cHV0VW5wYWNrZWQyRENvb3JkcyhlLHQpe2NvbnN0IG49YFxuICAgICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dFswXX0sICR7dFsxXX0pKTtcbiAgICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy55ICogJHt0WzBdfSArIHJlc1RleFJDLng7XG4gICAgICAgICAgaW50IHIgPSBpbmRleCAvICR7ZVsxXX07XG4gICAgICAgICAgaW50IGMgPSBpbmRleCAtIHIgKiAke2VbMV19O1xuICAgICAgICAgIHJldHVybiBpdmVjMihyLCBjKTtcbiAgICAgICAgfVxuICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobil9Z2V0T3V0cHV0VW5wYWNrZWQzRENvb3JkcyhlLHQpe2xldCBuPSIiO2NvbnN0IHI9ZS5sZW5ndGg7bGV0IGk9bnVsbDtyPDImJihpPVtdKSxpPW5ldyBBcnJheShyLTEpLGlbci0yXT1lW3ItMV07Zm9yKGxldCB0PXItMzt0Pj0wOy0tdClpW3RdPWlbdCsxXSplW3QrMV07Y29uc3Qgcz1bInIiLCJjIiwiZCJdLGE9aS5tYXAoKChlLHQpPT5gaW50ICR7c1t0XX0gPSBpbmRleCAvICR7ZX07ICR7dD09PWkubGVuZ3RoLTE/YGludCAke3NbdCsxXX0gPSBpbmRleCAtICR7c1t0XX0gKiAke2V9YDpgaW5kZXggLT0gJHtzW3RdfSAqICR7ZX1gfTtgKSkuam9pbigiIik7cmV0dXJuIG49YFxuICAgICAgICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihUZXhDb29yZHMueHkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dFswXX0sICR7dFsxXX0pKTtcbiAgICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy55ICogJHt0WzBdfSArIHJlc1RleFJDLng7XG4gICAgICAgICAgJHthfVxuICAgICAgICAgIHJldHVybiBpdmVjMyhyLCBjLCBkKTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShuKX1nZXRPdXRwdXRVbnBhY2tlZDREQ29vcmRzKGUsdCl7bGV0IG49IiI7Y29uc3Qgcj1lLmxlbmd0aDtsZXQgaT1udWxsO3I8MiYmKGk9W10pLGk9bmV3IEFycmF5KHItMSksaVtyLTJdPWVbci0xXTtmb3IobGV0IHQ9ci0zO3Q+PTA7LS10KWlbdF09aVt0KzFdKmVbdCsxXTtjb25zdCBzPVsiciIsImMiLCJkIiwiZDIiXSxhPWkubWFwKCgoZSx0KT0+YGludCAke3NbdF19ID0gaW5kZXggLyAke2V9OyAke3Q9PT1pLmxlbmd0aC0xP2BpbnQgJHtzW3QrMV19ID0gaW5kZXggLSAke3NbdF19ICogJHtlfWA6YGluZGV4IC09ICR7c1t0XX0gKiAke2V9YH07YCkpLmpvaW4oIiIpO3JldHVybiBuPWBcbiAgICAgIGl2ZWM0IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKFRleENvb3Jkcy54eSAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0WzBdfSwgJHt0WzFdfSkpO1xuICAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke3RbMF19ICsgcmVzVGV4UkMueDtcbiAgICAgICAgICAke2F9XG4gICAgICAgICAgcmV0dXJuIGl2ZWM0KHIsIGMsIGQsIGQyKTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShuKX1nZXRPdXRwdXRVbnBhY2tlZDVEQ29vcmRzKGUsdCl7bGV0IG49IiI7Y29uc3Qgcj1lLmxlbmd0aDtsZXQgaT1udWxsO3I8MiYmKGk9W10pLGk9bmV3IEFycmF5KHItMSksaVtyLTJdPWVbci0xXTtmb3IobGV0IHQ9ci0zO3Q+PTA7LS10KWlbdF09aVt0KzFdKmVbdCsxXTtjb25zdCBzPVsiciIsImMiLCJkIiwiZDIiLCJkMyJdLGE9aS5tYXAoKChlLHQpPT5gaW50ICR7c1t0XX0gPSBpbmRleCAvICR7ZX07ICR7dD09PWkubGVuZ3RoLTE/YGludCAke3NbdCsxXX0gPSBpbmRleCAtICR7c1t0XX0gKiAke2V9YDpgaW5kZXggLT0gJHtzW3RdfSAqICR7ZX1gfTtgKSkuam9pbigiIik7cmV0dXJuIG49YFxuICAgICAgaXZlYzUgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RbMF19LCAke3RbMV19KSk7XG4gICAgICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueSAqICR7dFswXX0gKyByZXNUZXhSQy54O1xuICAgICAgICAgICR7YX1cbiAgICAgICAgICByZXR1cm4gaXZlYzUociwgYywgZCwgZDIsIGQzKTtcbiAgICAgICAgfVxuICAgICAgYCxuZXcgby5HbHNsTGliUm91dGluZShuKX1nZXRPdXRwdXRVbnBhY2tlZDZEQ29vcmRzKGUsdCl7bGV0IG49IiI7Y29uc3Qgcj1lLmxlbmd0aDtsZXQgaT1udWxsO3I8MiYmKGk9W10pLGk9bmV3IEFycmF5KHItMSksaVtyLTJdPWVbci0xXTtmb3IobGV0IHQ9ci0zO3Q+PTA7LS10KWlbdF09aVt0KzFdKmVbdCsxXTtjb25zdCBzPVsiciIsImMiLCJkIiwiZDIiLCJkMyIsImQ0Il0sYT1pLm1hcCgoKGUsdCk9PmBpbnQgJHtzW3RdfSA9IGluZGV4IC8gJHtlfTsgJHt0PT09aS5sZW5ndGgtMT9gaW50ICR7c1t0KzFdfSA9IGluZGV4IC0gJHtzW3RdfSAqICR7ZX1gOmBpbmRleCAtPSAke3NbdF19ICogJHtlfWB9O2ApKS5qb2luKCIiKTtyZXR1cm4gbj1gXG4gICAgIGl2ZWM2IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIoVGV4Q29vcmRzLnh5ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7dFswXX0sICR7dFsxXX0pKTtcbiAgICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnkgKiAke3RbMF19ICsgcmVzVGV4UkMueDtcbiAgICAgICAgICR7YX1cbiAgICAgICAgIHJldHVybiBpdmVjNihyLCBjLCBkLCBkMiwgZDMsIGQ0KTtcbiAgICAgICB9XG4gICAgIGAsbmV3IG8uR2xzbExpYlJvdXRpbmUobil9Z2V0Q29tbW9uVXRpbEZ1bmNzKCl7Y29uc3QgZT17fTtsZXQgdD0idXZGcm9tRmxhdCI7ZVt0XT1uZXcgby5HbHNsTGliUm91dGluZSgiXG4gICAgdmVjMiB1dkZyb21GbGF0KGludCB0ZXhOdW1SLCBpbnQgdGV4TnVtQywgaW50IGluZGV4KSB7XG4gICAgICBpbnQgdGV4QyA9IGluZGV4IC8gdGV4TnVtUjtcbiAgICAgIGludCB0ZXhSID0gaW5kZXggLSB0ZXhDICogdGV4TnVtUjtcbiAgICAgIC8vIFRPRE86IHN3YXAgdGV4UiwgdGV4QyBvcmRlciBpbiBmb2xsb3dpbmcgZnVuY3Rpb24gc28gcm93IGlzIGNvcnJlc3BvbmRpbmcgdG8gdSBhbmQgY29sdW1uIGlzIGNvcnJlc3BvbmRpbmcgdG9cbiAgICAgIC8vICAgICAgIHYuXG4gICAgICByZXR1cm4gKHZlYzIodGV4UiwgdGV4QykgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1SLCB0ZXhOdW1DKTtcbiAgICB9XG4gICAgIiksdD0icGFja2VkVVZmcm9tMUQiLGVbdF09bmV3IG8uR2xzbExpYlJvdXRpbmUoIlxuICAgICAgdmVjMiBwYWNrZWRVVmZyb20xRChpbnQgdGV4TnVtUiwgaW50IHRleE51bUMsIGludCBpbmRleCkge1xuICAgICAgICBpbnQgdGV4ZWxJbmRleCA9IGluZGV4IC8gMjtcbiAgICAgICAgaW50IHRleFIgPSB0ZXhlbEluZGV4IC8gdGV4TnVtQztcbiAgICAgICAgaW50IHRleEMgPSB0ZXhlbEluZGV4IC0gdGV4UiAqIHRleE51bUM7XG4gICAgICAgIHJldHVybiAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKHRleE51bUMsIHRleE51bVIpO1xuICAgICAgfVxuICAgICAgIiksdD0icGFja2VkVVZmcm9tMkQiLGVbdF09bmV3IG8uR2xzbExpYlJvdXRpbmUoIlxuICAgICAgdmVjMiBwYWNrZWRVVmZyb20yRChpbnQgdGV4TnVtUiwgaW50IHRleE51bUMsIGludCB0ZXhlbHNJbkxvZ2ljYWxSb3csIGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgaW50IHRleGVsSW5kZXggPSAocm93IC8gMikgKiB0ZXhlbHNJbkxvZ2ljYWxSb3cgKyAoY29sIC8gMik7XG4gICAgICAgIGludCB0ZXhSID0gdGV4ZWxJbmRleCAvIHRleE51bUM7XG4gICAgICAgIGludCB0ZXhDID0gdGV4ZWxJbmRleCAtIHRleFIgKiB0ZXhOdW1DO1xuICAgICAgICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTtcbiAgICAgIH1cbiAgICAgICIpLHQ9InBhY2tlZFVWZnJvbTNEIixlW3RdPW5ldyBvLkdsc2xMaWJSb3V0aW5lKCJcbiAgICAgIHZlYzIgcGFja2VkVVZmcm9tM0QoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLFxuICAgICAgICAgIGludCB0ZXhlbHNJbkJhdGNoLCBpbnQgdGV4ZWxzSW5Mb2dpY2FsUm93LCBpbnQgYixcbiAgICAgICAgICBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIGludCBpbmRleCA9IGIgKiB0ZXhlbHNJbkJhdGNoICsgKHJvdyAvIDIpICogdGV4ZWxzSW5Mb2dpY2FsUm93ICsgKGNvbCAvIDIpO1xuICAgICAgICBpbnQgdGV4UiA9IGluZGV4IC8gdGV4TnVtQztcbiAgICAgICAgaW50IHRleEMgPSBpbmRleCAtIHRleFIgKiB0ZXhOdW1DO1xuICAgICAgICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTtcbiAgICAgIH1cbiAgICAgICIpLHQ9InNhbXBsZVRleHR1cmUiO2NvbnN0IG49KDAsIGkuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKTtyZXR1cm4gZVt0XT1uZXcgby5HbHNsTGliUm91dGluZShgXG4gICAgICAgIGZsb2F0IHNhbXBsZVRleHR1cmUoc2FtcGxlcjJEIHRleHR1cmVTYW1wbGVyLCB2ZWMyIHV2KSB7XG4gICAgICAgICAgICByZXR1cm4gJHtuLnRleHR1cmUyRH0odGV4dHVyZVNhbXBsZXIsIHV2KS5yO1xuICAgICAgICB9YCksZX1nZXRJbnB1dHNTYW1wbGluZ1NuaXBwZXRzKCl7Y29uc3QgZT17fSx0PXRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0O3JldHVybiB0aGlzLmNvbnRleHQucHJvZ3JhbUluZm8uaW5wdXROYW1lcy5mb3JFYWNoKCgobixyKT0+e2NvbnN0IG89dGhpcy5jb250ZXh0LmlucHV0VGV4dHVyZUxheW91dHNbcl0saT0oMCwgYS5nZW5lcmF0ZVNoYWRlckZ1bmNOYW1lRnJvbUlucHV0U2FtcGxlck5hbWUpKG4pO28uaXNQYWNrZWQ/ZVtpXT10aGlzLmdldFBhY2tlZFNhbXBsZXJGcm9tSW5wdXQoaSxuLG8pOmVbaV09dGhpcy5nZXRVbnBhY2tlZFNhbXBsZXJGcm9tSW5wdXQoaSxuLG8pO2NvbnN0IHM9KDAsIGEuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lQXRPdXRDb29yZHMpKG4pO28udW5wYWNrZWRTaGFwZS5sZW5ndGg8PXQudW5wYWNrZWRTaGFwZS5sZW5ndGgmJihvLmlzUGFja2VkP2Vbc109dGhpcy5nZXRQYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMocyxvLHQsbik6ZVtzXT10aGlzLmdldFVucGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKHMsbyx0LG4pKTt9KSksZX1nZXRQYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMoZSx0LG4saSl7Y29uc3Qgcz10LnVucGFja2VkU2hhcGUsdT1uLnVucGFja2VkU2hhcGUsbD1pLGM9KDAsIGEuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lKShsKSxwPXMubGVuZ3RoLGQ9dS5sZW5ndGgsZj1yLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyhzLHUpLGg9KDAsIGEuZ2V0Q29vcmRzRGF0YVR5cGUpKGQpLGc9ZC1wO2xldCBiO2NvbnN0IG09KDAsIGEuZ2V0R2xDaGFubmVscykoKTtiPTA9PT1wPyIiOmQ8MiYmZi5sZW5ndGg+PTE/ImNvb3JkcyA9IDA7IjpmLm1hcCgoZT0+YGNvb3Jkcy4ke21bZStnXX0gPSAwO2ApKS5qb2luKCJcbiIpO2xldCB5PSIiO3k9ZDwyJiZwPjA/ImNvb3JkcyI6cy5tYXAoKChlLHQpPT5gY29vcmRzLiR7bVt0K2ddfWApKS5qb2luKCIsICIpO2xldCB2PSJyZXR1cm4gb3V0cHV0VmFsdWU7Ijtjb25zdCBfPTE9PT1yLlNoYXBlVXRpbC5zaXplKHMpLHc9MT09PXIuU2hhcGVVdGlsLnNpemUodSk7aWYoMSE9PXB8fF98fHcpe2lmKF8mJiF3KXY9MT09PWQ/IlxuICAgICAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLngsIDAuLCAwLik7XG4gICAgICAgICI6IlxuICAgICAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngpO1xuICAgICAgICAiO2Vsc2UgaWYoZi5sZW5ndGgpe2NvbnN0IGU9cC0yLHQ9cC0xO2YuaW5kZXhPZihlKT4tMSYmZi5pbmRleE9mKHQpPi0xP3Y9InJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngpOyI6Zi5pbmRleE9mKGUpPi0xP3Y9InJldHVybiB2ZWM0KG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLnksIG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLnkpOyI6Zi5pbmRleE9mKHQpPi0xJiYodj0icmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueHgsIG91dHB1dFZhbHVlLnp6KTsiKTt9fWVsc2Ugdj0iXG4gICAgICAgIHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLnh5LCBvdXRwdXRWYWx1ZS54eSk7XG4gICAgICAiO2NvbnN0IFQ9YFxuICAgICAgdmVjNCAke2V9KCkge1xuICAgICAgICAke2h9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBcbiAgICAgICAgaW50IGxhc3REaW0gPSBjb29yZHMuJHttW2QtMV19O1xuICAgICAgICBjb29yZHMuJHttW2QtMV19ID0gY29vcmRzLiR7bVtkLTJdfTtcbiAgICAgICAgY29vcmRzLiR7bVtkLTJdfSA9IGxhc3REaW07XG4gICAgICBcbiAgICAgICAgJHtifVxuICAgICAgICB2ZWM0IG91dHB1dFZhbHVlID0gJHtjfSgke3l9KTtcbiAgICAgICAgJHt2fVxuICAgICAgfVxuICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKFQsWyJjb29yZGluYXRlcy5nZXRPdXRwdXRDb29yZHMiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMoZSx0LG4saSl7Y29uc3Qgcz1bbi53aWR0aCxuLmhlaWdodF0sdT1bdC53aWR0aCx0LmhlaWdodF0sbD10LnVucGFja2VkU2hhcGUubGVuZ3RoLGM9bi51bnBhY2tlZFNoYXBlLmxlbmd0aCxwPXQudW5wYWNrZWRTaGFwZSxkPW4udW5wYWNrZWRTaGFwZSxmPSgwLCBhLmdlbmVyYXRlU2hhZGVyRnVuY05hbWVGcm9tSW5wdXRTYW1wbGVyTmFtZSkoaSk7aWYobD09PWMmJnIuQXJyYXlVdGlsLmFycmF5c0VxdWFsKHUscykpe2NvbnN0IHQ9YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oKSB7XG4gICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke2l9LCBUZXhDb29yZHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUodCxbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9Y29uc3QgaD0oMCwgYS5nZXRDb29yZHNEYXRhVHlwZSkoYyksZz1yLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyhwLGQpLGI9Yy1sO2xldCBtO2NvbnN0IHk9KDAsIGEuZ2V0R2xDaGFubmVscykoKTttPTA9PT1sPyIiOmM8MiYmZy5sZW5ndGg+PTE/ImNvb3JkcyA9IDA7IjpnLm1hcCgoZT0+YGNvb3Jkcy4ke3lbZStiXX0gPSAwO2ApKS5qb2luKCJcbiIpO2xldCB2PSIiO3Y9YzwyJiZsPjA/ImNvb3JkcyI6dC51bnBhY2tlZFNoYXBlLm1hcCgoKGUsdCk9PmBjb29yZHMuJHt5W3QrYl19YCkpLmpvaW4oIiwgIik7Y29uc3QgXz1gXG4gICAgICAgIGZsb2F0ICR7ZX0oKSB7XG4gICAgICAgICAgJHtofSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICAke219XG4gICAgICAgICAgcmV0dXJuICR7Zn0oJHt2fSk7XG4gICAgICAgIH1cbiAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKF8sWyJjb29yZGluYXRlcy5nZXRPdXRwdXRDb29yZHMiXSl9Z2V0UGFja2VkU2FtcGxlckZyb21JbnB1dChlLHQsbil7c3dpdGNoKG4udW5wYWNrZWRTaGFwZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gdGhpcy5nZXRQYWNrZWRTYW1wbGVyU2NhbGFyKGUsdCk7Y2FzZSAxOnJldHVybiB0aGlzLmdldFBhY2tlZFNhbXBsZXIxRChlLHQsbik7Y2FzZSAyOnJldHVybiB0aGlzLmdldFBhY2tlZFNhbXBsZXIyRChlLHQsbik7Y2FzZSAzOnJldHVybiB0aGlzLmdldFBhY2tlZFNhbXBsZXIzRChlLHQsbik7ZGVmYXVsdDpyZXR1cm4gdGhpcy5nZXRQYWNrZWRTYW1wbGVyTkQoZSx0LG4pfX1nZXRVbnBhY2tlZFNhbXBsZXJGcm9tSW5wdXQoZSx0LG4pe2NvbnN0IHI9bi51bnBhY2tlZFNoYXBlO3N3aXRjaChyLmxlbmd0aCl7Y2FzZSAwOnJldHVybiB0aGlzLmdldFVucGFja2VkU2FtcGxlclNjYWxhcihlLHQsbik7Y2FzZSAxOnJldHVybiB0aGlzLmdldFVucGFja2VkU2FtcGxlcjFEKGUsdCxuKTtjYXNlIDI6cmV0dXJuIHRoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyMkQoZSx0LG4pO2Nhc2UgMzpyZXR1cm4gdGhpcy5nZXRVbnBhY2tlZFNhbXBsZXIzRChlLHQsbik7Y2FzZSA0OnJldHVybiB0aGlzLmdldFVucGFja2VkU2FtcGxlcjREKGUsdCxuKTtjYXNlIDU6cmV0dXJuIHRoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyNUQoZSx0LG4pO2Nhc2UgNjpyZXR1cm4gdGhpcy5nZXRVbnBhY2tlZFNhbXBsZXI2RChlLHQsbik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRpbWVuc2lvbiAke3IubGVuZ3RofS1EYCl9fWdldFBhY2tlZFNhbXBsZXJTY2FsYXIoZSx0KXtjb25zdCBuPWBcbiAgICAgICAgICB2ZWM0ICR7ZX0oKSB7XG4gICAgICAgICAgICByZXR1cm4gJHsoMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLnRleHR1cmUyRH0oJHt0fSwgaGFsZkNSKTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4pfWdldFBhY2tlZFNhbXBsZXIxRChlLHQsbil7Y29uc3Qgcj1bbi53aWR0aCxuLmhlaWdodF0scz1bclsxXSxyWzBdXSxhPSgwLCBpLmdldEdsc2wpKHRoaXMuY29udGV4dC5nbENvbnRleHQudmVyc2lvbiksdT1gdmVjNCAke2V9KGludCBpbmRleCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTFEKFxuICAgICAgJHtzWzBdfSwgJHtzWzFdfSwgaW5kZXgpO1xuICAgICAgcmV0dXJuICR7YS50ZXh0dXJlMkR9KCR7dH0sIHV2KTtcbiAgICB9YDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUodSxbImNvb3JkaW5hdGVzLnBhY2tlZFVWZnJvbTFEIl0pfWdldFBhY2tlZFNhbXBsZXIyRChlLHQsbil7Y29uc3Qgcz1uLnVucGFja2VkU2hhcGUsYT1bbi53aWR0aCxuLmhlaWdodF0sdT0oMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLGw9YVswXSxjPWFbMV07aWYobnVsbCE9YSYmci5BcnJheVV0aWwuYXJyYXlzRXF1YWwocyxhKSl7Y29uc3Qgbj1gdmVjNCAke2V9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKGNvbCwgcm93KSArIGhhbGZDUikgLyB2ZWMyKCR7Y30uMCwgJHtsfS4wKTtcbiAgICAgICAgcmV0dXJuICR7dS50ZXh0dXJlMkR9KCR7dH0sIHV2KTtcbiAgICAgIH1gO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShuKX1jb25zdCBwPWEsZD1NYXRoLmNlaWwoc1sxXS8yKSxmPWB2ZWM0ICR7ZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTJEKCR7cFsxXX0sICR7cFswXX0sICR7ZH0sIHJvdywgY29sKTtcbiAgICAgIHJldHVybiAke3UudGV4dHVyZTJEfSgke3R9LCB1dik7XG4gICAgfWA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKGYsWyJjb29yZGluYXRlcy5wYWNrZWRVVmZyb20yRCJdKX1nZXRQYWNrZWRTYW1wbGVyM0QoZSx0LG4pe2NvbnN0IHI9bi51bnBhY2tlZFNoYXBlLHM9W24ud2lkdGgsbi5oZWlnaHRdLHU9W3NbMF0sc1sxXV0sbD0oMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pO2lmKDE9PT1yWzBdKXtjb25zdCBpPXIuc2xpY2UoMSkscz1bMSwyXSx1PSgwLCBhLnNxdWVlemVJbnB1dFNoYXBlKShyLGkpLGw9WyJiIiwicm93IiwiY29sIl0sYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG4pKTtjLnVucGFja2VkU2hhcGU9dTtjb25zdCBwPXRoaXMuZ2V0UGFja2VkU2FtcGxlckZyb21JbnB1dChlLHQsYyksZD1gJHtwLnJvdXRpbmVCb2R5fVxuICAgICAgdmVjNCAke2V9KGludCBiLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIHJldHVybiAke2V9KCR7KDAsIGEuZ2V0U3F1ZWV6ZWRQYXJhbXMpKGwscyl9KTtcbiAgICAgIH0gYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUoZCxwLmRlcGVuZGVuY2llcyl9Y29uc3QgYz11WzBdLHA9dVsxXSxkPU1hdGguY2VpbChyWzJdLzIpLGY9YHZlYzQgJHtlfShpbnQgYiwgaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgdmVjMiB1diA9IHBhY2tlZFVWZnJvbTNEKFxuICAgICAgICAke3B9LCAke2N9LCAke2QqTWF0aC5jZWlsKHJbMV0vMil9LCAke2R9LCBiLCByb3csIGNvbCk7XG4gICAgICByZXR1cm4gJHtsLnRleHR1cmUyRH0oJHt0fSwgdXYpO31gO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShmLFsiY29vcmRpbmF0ZXMucGFja2VkVVZmcm9tM0QiXSl9Z2V0UGFja2VkU2FtcGxlck5EKGUsdCxuKXtjb25zdCByPW4udW5wYWNrZWRTaGFwZSxzPXIubGVuZ3RoLGE9W24ud2lkdGgsbi5oZWlnaHRdLHU9KDAsIGkuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKSxsPVthWzBdLGFbMV1dLGM9bFsxXSxwPWxbMF0sZD1NYXRoLmNlaWwocltzLTFdLzIpO2xldCBmPWQqTWF0aC5jZWlsKHJbcy0yXS8yKSxoPSJpbnQgYiwgaW50IHJvdywgaW50IGNvbCIsZz1gYiAqICR7Zn0gKyAocm93IC8gMikgKiAke2R9ICsgKGNvbCAvIDIpYDtmb3IobGV0IGU9MjtlPHMtMTtlKyspaD1gaW50IGIke2V9LCBgK2gsZio9cltzLWUtMV0sZz1gYiR7ZX0gKiAke2Z9ICsgYCtnO2NvbnN0IGI9YHZlYzQgJHtlfSgke2h9KSB7XG4gICAgICBpbnQgaW5kZXggPSAke2d9O1xuICAgICAgaW50IHRleFIgPSBpbmRleCAvICR7cH07XG4gICAgICBpbnQgdGV4QyA9IGluZGV4IC0gdGV4UiAqICR7cH07XG4gICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMigke3B9LCAke2N9KTtcbiAgICAgIHJldHVybiAke3UudGV4dHVyZTJEfSgke3R9LCB1dik7XG4gICAgfWA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKGIpfWdldFVucGFja2VkU2FtcGxlclNjYWxhcihlLHQsbil7Y29uc3RbcixpXT1bbi53aWR0aCxuLmhlaWdodF07aWYoMT09PXImJjE9PT1pKXtjb25zdCBuPWBcbiAgICAgICAgICBmbG9hdCAke2V9KCkge1xuICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgaGFsZkNSKTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4sWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIl0pfWNvbnN0IHM9YFxuICAgICAgICBmbG9hdCAke2V9KCkge1xuICAgICAgICAgIGludCBvZmZzZXRfJHt0fSA9IGNvb3Jkc1RvT2Zmc2V0KFRleENvb3JkcywgJHtyfSwgJHtpfSk7XG4gICAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHtyfSwgJHtpfSwgb2Zmc2V0XyR7dH0pO1xuICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgfVxuICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUocyxbImNvb3JkaW5hdGVzLnV2RnJvbUZsYXQiLCJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIiwiY29vcmRpbmF0ZXMuY29vcmRzVG9PZmZzZXQiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyMUQoZSx0LG4pe2NvbnN0IHI9bi53aWR0aCxpPW4uaGVpZ2h0O2lmKDE9PT1pJiYxPT09cil7Y29uc3Qgbj1gXG4gICAgICAgIGZsb2F0ICR7ZX0oaW50IGluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgaGFsZkNSKTtcbiAgICAgICAgfVxuICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobixbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9aWYoMT09PWkpe2NvbnN0IG49YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IGluZGV4KSB7XG4gICAgICAgICAgICB2ZWMyIHV2ID0gdmVjMigoZmxvYXQoaW5kZXgpICsgMC41KSAvICR7cn0uMCwgMC41KTtcbiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4sWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIl0pfWlmKDE9PT1yKXtjb25zdCBuPWBcbiAgICAgICAgICBmbG9hdCAke2V9KGludCBpbmRleCkge1xuICAgICAgICAgICAgdmVjMiB1diA9IHZlYzIoMC41LCAoZmxvYXQoaW5kZXgpICsgMC41KSAvICR7aX0uMCk7XG4gICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3R9LCB1dik7XG4gICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShuLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1jb25zdCBzPWBcbiAgICAgICAgZmxvYXQgJHtlfShpbnQgaW5kZXgpIHtcbiAgICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3J9LCAke2l9LCBpbmRleCk7XG4gICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgdXYpO1xuICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShzLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyMkQoZSx0LG4pe2NvbnN0IGk9bi51bnBhY2tlZFNoYXBlLHU9W24uaGVpZ2h0LG4ud2lkdGhdO2lmKG51bGwhPXUmJnIuQXJyYXlVdGlsLmFycmF5c0VxdWFsKGksdSkpe2NvbnN0IG49YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHJvdywgY29sKSArIGhhbGZDUikgLyB2ZWMyKCR7dVsxXX0uMCwgJHt1WzBdfS4wKTtcbiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4sWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIl0pfWNvbnN0e25ld1NoYXBlOmwsa2VwdERpbXM6Y309KDAsIHMuc3F1ZWV6ZVNoYXBlKShpKSxwPWw7aWYocC5sZW5ndGg8aS5sZW5ndGgpe2NvbnN0IHI9KDAsIGEuc3F1ZWV6ZUlucHV0U2hhcGUpKGkscCkscz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG4pKTtzLnVucGFja2VkU2hhcGU9cjtjb25zdCB1PVsiY29sIiwicm93Il0sbD1gXG4gICAgICAgICAgJHt0aGlzLmdldFVucGFja2VkU2FtcGxlckZyb21JbnB1dChlLHQscykucm91dGluZUJvZHl9XG4gICAgICAgICAgZmxvYXQgJHtlfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgICAgICByZXR1cm4gJHtlfSgkeygwLCBhLmdldFNxdWVlemVkUGFyYW1zKSh1LGMpfSk7XG4gICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShsLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1jb25zdCBkPXVbMV0sZj11WzBdO2lmKDE9PT1mKXtjb25zdCBuPWBcbiAgICAgICAgICBmbG9hdCAke2V9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgICAgIGludCBvZmZzZXRfJHt0fSA9IGNvb3Jkc1RvT2Zmc2V0KFRleENvb3JkcywgJHtkfSwgJHtmfSk7XG4gICAgICAgICAgICBmbG9hdCBpbmRleCA9IGRvdCh2ZWMzKHJvdywgY29sLCBvZmZzZXRfJHt0fSksIHZlYzMoJHtpWzFdfSwgMSwgMSkpO1xuICAgICAgICAgICAgdmVjMiB1diA9IHZlYzIoMC41LCAoaW5kZXggKyAwLjUpIC8gJHtkfS4wKTtcbiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKG4sWyJjb29yZGluYXRlcy5zYW1wbGVUZXh0dXJlIiwiY29vcmRpbmF0ZXMuY29vcmRzVG9PZmZzZXQiXSl9aWYoMT09PWQpe2NvbnN0IG49YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICAgICAgaW50IG9mZnNldF8ke3R9ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke2R9LCAke2Z9KTtcbiAgICAgICAgICAgIGZsb2F0IGluZGV4ID0gZG90KHZlYzMocm93LCBjb2wsIG9mZnNldF8ke3R9KSwgdmVjMygke2lbMV19LCAxLCAxKSk7XG4gICAgICAgICAgICB2ZWMyIHV2ID0gdmVjMigoaW5kZXggKyAwLjUpIC8gJHtmfS4wLCAwLjUpO1xuICAgICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgdXYpO1xuICAgICAgICAgIH1cbiAgICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobixbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX1jb25zdCBoPWBcbiAgICAgICAgZmxvYXQgJHtlfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgICAgaW50IGluZGV4ID0gY29sICogJHtpWzFdfSArIHJvdztcbiAgICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke2R9LCAke2Z9LCBpbmRleCk7XG4gICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgdXYpO1xuICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShoLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX1nZXRVbnBhY2tlZFNhbXBsZXIzRChlLHQsbil7Y29uc3Qgcj1uLnVucGFja2VkU2hhcGUsaT1yWzFdKnJbMl0sdT1yWzJdLHtuZXdTaGFwZTpsLGtlcHREaW1zOmN9PSgwLCBzLnNxdWVlemVTaGFwZSkocikscD1sO2lmKHAubGVuZ3RoPHIubGVuZ3RoKXtjb25zdCBpPSgwLCBhLnNxdWVlemVJbnB1dFNoYXBlKShyLHApLHM9WyJiYXRjaCIsImNvbCIsInJvdyJdLHU9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShuKSk7dS51bnBhY2tlZFNoYXBlPWk7Y29uc3QgbD10aGlzLmdldFVucGFja2VkU2FtcGxlckZyb21JbnB1dChlLHQsdSksZD1jLnJldmVyc2UoKSxmPWBcbiAgICAgICAgICAke2wucm91dGluZUJvZHl9XG4gICAgICAgICAgZmxvYXQgJHtlfShpbnQgYmF0Y2gsIGludCByb3csIGludCBjb2wpIHtcbiAgICAgICAgICAgIHJldHVybiAke2V9KCR7KDAsIGEuZ2V0U3F1ZWV6ZWRQYXJhbXMpKHMsZCl9KTtcbiAgICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKGYsbC5kZXBlbmRlbmNpZXMpfWNvbnN0IGQ9YFxuICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IGRlcHRoLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgICAgICAvLyBFeHBsaWNpdGx5IHVzZSBpbnRlZ2VyIG9wZXJhdGlvbnMgYXMgZG90KCkgb25seSB3b3JrcyBvbiBmbG9hdHMuXG4gICAgICAgICAgICBpbnQgaW5kZXggPSBkZXB0aCAqICR7aX0gKyBjb2wgKiAke3V9ICsgcm93O1xuICAgICAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHtuLndpZHRofSwgJHtuLmhlaWdodH0sIGluZGV4KTtcbiAgICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dH0sIHV2KTtcbiAgICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShkLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX1nZXRVbnBhY2tlZFNhbXBsZXI0RChlLHQsbil7Y29uc3Qgcj1uLnVucGFja2VkU2hhcGUsaT1yWzNdLHM9clsyXSppLGE9YFxuICAgICAgICBmbG9hdCAke2V9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikge1xuICAgICAgICAgIGludCBpbmRleCA9IHJvdyAqICR7clsxXSpzfSArIGNvbCAqICR7c30gK1xuICAgICAgICAgICAgICBkZXB0aDIgKiAke2l9ICsgZGVwdGg7XG4gICAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHtuLndpZHRofSwgJHtuLmhlaWdodH0sIGluZGV4KTtcbiAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3R9LCB1dik7XG4gICAgICAgIH1cbiAgICAgIGA7cmV0dXJuIG5ldyBvLkdsc2xMaWJSb3V0aW5lKGEsWyJjb29yZGluYXRlcy51dkZyb21GbGF0IiwiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSJdKX1nZXRVbnBhY2tlZFNhbXBsZXI1RChlLHQsbil7Y29uc3Qgcj1uLnVucGFja2VkU2hhcGUsaT1yWzRdLHU9clszXSppLGw9clsyXSp1LGM9clsxXSpsLHtuZXdTaGFwZTpwLGtlcHREaW1zOmR9PSgwLCBzLnNxdWVlemVTaGFwZSkocik7aWYocC5sZW5ndGg8ci5sZW5ndGgpe2NvbnN0IGk9KDAsIGEuc3F1ZWV6ZUlucHV0U2hhcGUpKHIscCkscz1bInJvdyIsImNvbCIsImRlcHRoIiwiZGVwdGgyIiwiZGVwdGgzIl0sdT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG4pKTt1LnVucGFja2VkU2hhcGU9aTtjb25zdCBsPWBcbiAgICAgICAgICAke3RoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyRnJvbUlucHV0KGUsdCx1KS5yb3V0aW5lQm9keX1cbiAgICAgICAgICBmbG9hdCAke2V9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xuICAgICAgICAgICAgcmV0dXJuICR7ZX0oJHsoMCwgYS5nZXRTcXVlZXplZFBhcmFtcykocyxkKX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgYDtyZXR1cm4gbmV3IG8uR2xzbExpYlJvdXRpbmUobCxbImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy51dkZyb21GbGF0Il0pfWNvbnN0IGY9YFxuICAgICAgICBmbG9hdCAke2V9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xuICAgICAgICAgIGludCBpbmRleCA9IHJvdyAqICR7Y30gKyBjb2wgKiAke2x9ICsgZGVwdGggKiAke3V9ICtcbiAgICAgICAgICBkZXB0aDMgKiAke2l9ICsgZGVwdGgyO1xuICAgICAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7bi53aWR0aH0sICR7bi5oZWlnaHR9LCBpbmRleCk7XG4gICAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0fSwgdXYpO1xuICAgICAgICB9XG4gICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShmLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSIsImNvb3JkaW5hdGVzLnV2RnJvbUZsYXQiXSl9Z2V0VW5wYWNrZWRTYW1wbGVyNkQoZSx0LG4pe2NvbnN0IHI9bi51bnBhY2tlZFNoYXBlLGk9cls1XSx1PXJbNF0qaSxsPXJbM10qdSxjPXJbMl0qbCxwPXJbMV0qYyx7bmV3U2hhcGU6ZCxrZXB0RGltczpmfT0oMCwgcy5zcXVlZXplU2hhcGUpKHIpO2lmKGQubGVuZ3RoPHIubGVuZ3RoKXtjb25zdCBpPSgwLCBhLnNxdWVlemVJbnB1dFNoYXBlKShyLGQpLHM9WyJyb3ciLCJjb2wiLCJkZXB0aCIsImRlcHRoMiIsImRlcHRoMyIsImRlcHRoNCJdLHU9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShuKSk7dS51bnBhY2tlZFNoYXBlPWk7Y29uc3QgbD1gXG4gICAgICAgICAgICAke3RoaXMuZ2V0VW5wYWNrZWRTYW1wbGVyRnJvbUlucHV0KGUsdCx1KS5yb3V0aW5lQm9keX1cbiAgICAgICAgICAgIGZsb2F0ICR7ZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XG4gICAgICAgICAgICAgIHJldHVybiAke2V9KCR7KDAsIGEuZ2V0U3F1ZWV6ZWRQYXJhbXMpKHMsZil9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShsLFsiY29vcmRpbmF0ZXMuc2FtcGxlVGV4dHVyZSIsImNvb3JkaW5hdGVzLnV2RnJvbUZsYXQiXSl9Y29uc3QgaD1gXG4gICAgICAgICAgZmxvYXQgJHtlfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsXG4gICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XG4gICAgICAgICAgICBpbnQgaW5kZXggPSByb3cgKiAke3B9ICsgY29sICogJHtjfSArIGRlcHRoICogJHtsfSArXG4gICAgICAgICAgICBkZXB0aDIgKiAke3V9ICsgZGVwdGgzICogJHtpfSArIGRlcHRoNDtcbiAgICAgICAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7bi53aWR0aH0sICR7bi5oZWlnaHR9LCBpbmRleCk7XG4gICAgICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3R9LCB1dik7XG4gICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBuZXcgby5HbHNsTGliUm91dGluZShoLFsiY29vcmRpbmF0ZXMudXZGcm9tRmxhdCIsImNvb3JkaW5hdGVzLnNhbXBsZVRleHR1cmUiLCJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX10b1ZlYygpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQsdD1lLnNoYXBlLmxlbmd0aCxuPWUuc3RyaWRlcyxyPWUud2lkdGgsaT1lLmhlaWdodCxzPVtdO2ZvcihsZXQgZT0wO2U8dC0xOysrZSlzLnB1c2goYFxuICAgICAgICBjWyR7ZX1dID0gb2Zmc2V0IC8gJHtuW2VdfTtgKSxzLnB1c2goYFxuICAgICAgICBvZmZzZXQgLT0gY1ske2V9XSAqICR7bltlXX07YCk7cy5wdXNoKGBcbiAgICAgICAgY1ske3QtMX1dID0gb2Zmc2V0O2ApO2NvbnN0IGE9YFxuICAgICAgdm9pZCB0b1ZlYyh2ZWMyIHRleENvb3Jkcywgb3V0IGludCBjWyR7dH1dKSB7XG4gICAgICAgIGludCBvZmZzZXQgPSBjb29yZHNUb09mZnNldCh0ZXhDb29yZHMsICR7cn0sICR7aX0pO1xuICAgICAgICAke3Muam9pbigiIil9XG4gICAgICB9XG4gICAgICB2b2lkIHRvVmVjKGludCBvZmZzZXQsIG91dCBpbnQgY1ske3R9XSkge1xuICAgICAgICAke3Muam9pbigiIil9XG4gICAgICB9XG4gICAgYDtyZXR1cm4ge3RvVmVjOm5ldyBvLkdsc2xMaWJSb3V0aW5lKGEsWyJjb29yZGluYXRlcy5jb29yZHNUb09mZnNldCJdKX19dmFsdWVGcm9tKCl7Y29uc3QgZT17fTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmlucHV0TmFtZXMuZm9yRWFjaCgoKHQsbik9Pntjb25zdCByPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW25dLGk9KHIudW5wYWNrZWRTaGFwZS5sZW5ndGg+MD9yLnVucGFja2VkU2hhcGU6ci5zaGFwZSkubGVuZ3RoO2xldCBzPWBfJHt0fWA7ZVtzXT1uZXcgby5HbHNsTGliUm91dGluZSh0aGlzLmdldFZhbHVlRnJvbVNpbmdsZSh0LGksci53aWR0aCxyLmhlaWdodCwhMSksW2BzaGFwZVV0aWxzLmluZGljZXNUb09mZnNldCR7c31gLCJjb29yZGluYXRlcy5vZmZzZXRUb0Nvb3JkcyIsImZyYWdjb2xvci5nZXRDb2xvckFzRmxvYXQiXSkscys9Il9UIixlW3NdPW5ldyBvLkdsc2xMaWJSb3V0aW5lKHRoaXMuZ2V0VmFsdWVGcm9tU2luZ2xlKHQsaSxyLndpZHRoLHIuaGVpZ2h0LCEwKSxbYHNoYXBlVXRpbHMuaW5kaWNlc1RvT2Zmc2V0JHtzfWAsImNvb3JkaW5hdGVzLm9mZnNldFRvQ29vcmRzIiwiZnJhZ2NvbG9yLmdldENvbG9yQXNGbG9hdCJdKTt9KSksZX1nZXRWYWx1ZUZyb21TaW5nbGUoZSx0LG4scixvKXtsZXQgcz1gXyR7ZX1gO3JldHVybiBvJiYocys9Il9UIiksYFxuICAgICAgICBmbG9hdCAke3N9KGludCBtWyR7dH1dKSB7XG4gICAgICAgICAgaW50IG9mZnNldCA9IGluZGljZXNUb09mZnNldCR7c30obSk7XG4gICAgICAgICAgdmVjMiBjb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhvZmZzZXQsICR7bn0sICR7cn0pO1xuICAgICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7KDAsIGkuZ2V0R2xzbCkodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uKS50ZXh0dXJlMkR9KCR7ZX0sIGNvb3JkcykpO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBgfWdldFBhY2tlZFZhbHVlRnJvbShlLHQsbixyLG8pe2xldCBzPWBfJHtlfV9QYWNrYDtyZXR1cm4gbyYmKHMrPSJfVCIpLGBcbiAgICAgICAgdmVjNCAke3N9KGludCBtWyR7dH1dKSB7XG4gICAgICAgICAgaW50IG9mZnNldCA9IGluZGljZXNUb09mZnNldF8ke2V9KG0pO1xuICAgICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke259LCAke3J9KTtcbiAgICAgICAgICByZXR1cm4gJHsoMCwgaS5nZXRHbHNsKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pLnRleHR1cmUyRH0oJHtlfSwgY29vcmRzKTtcbiAgICAgICAgfVxuICAgICAgICBgfX10LkNvb3Jkc0dsc2xMaWI9dTt9LDE5OTc6KGUsdCk9Pnt2YXIgbjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Ub3BvbG9naWNhbFNvcnRHbHNsUm91dGluZXM9dC5HbHNsTGliUm91dGluZU5vZGU9dC5HbHNsTGliUm91dGluZT10Lkdsc2xMaWI9dC5HbHNsQ29udGV4dD10LkZ1bmN0aW9uVHlwZT12b2lkIDAsKG49dC5GdW5jdGlvblR5cGV8fCh0LkZ1bmN0aW9uVHlwZT17fSkpW24uVmFsdWVCYXNlZD0wXT0iVmFsdWVCYXNlZCIsbltuLlBvc2l0aW9uYWw9MV09IlBvc2l0aW9uYWwiLHQuR2xzbENvbnRleHQ9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scil7dGhpcy5nbENvbnRleHQ9ZSx0aGlzLnByb2dyYW1JbmZvPXQsdGhpcy5pbnB1dFRleHR1cmVMYXlvdXRzPW4sdGhpcy5vdXRwdXRUZXh0dXJlTGF5b3V0PXI7fX0sdC5HbHNsTGliPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuY29udGV4dD1lO319LHQuR2xzbExpYlJvdXRpbmU9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLnJvdXRpbmVCb2R5PWUsdGhpcy5kZXBlbmRlbmNpZXM9dDt9fSx0Lkdsc2xMaWJSb3V0aW5lTm9kZT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5uYW1lPWUsdGhpcy5kZXBlbmRlbmNpZXM9bnx8W10sdCYmKHRoaXMucm91dGluZUJvZHk9dCk7fWFkZERlcGVuZGVuY3koZSl7ZSYmdGhpcy5kZXBlbmRlbmNpZXMucHVzaChlKTt9fSx0LlRvcG9sb2dpY2FsU29ydEdsc2xSb3V0aW5lcz1jbGFzc3tzdGF0aWMgcmV0dXJuT3JkZXJlZE5vZGVzKGUpe2lmKCFlfHwwPT09ZS5sZW5ndGgpcmV0dXJuIFtdO2lmKDE9PT1lLmxlbmd0aClyZXR1cm4gZTtjb25zdCB0PW5ldyBTZXQsbj1uZXcgU2V0LHI9bmV3IEFycmF5O3JldHVybiB0aGlzLmNyZWF0ZU9yZGVyZWROb2RlcyhlLHQsbixyKSxyfXN0YXRpYyBjcmVhdGVPcmRlcmVkTm9kZXMoZSx0LG4scil7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDsrK28pdGhpcy5kZnNUcmF2ZXJzZShlW29dLHQsbixyKTt9c3RhdGljIGRmc1RyYXZlcnNlKGUsdCxuLHIpe2lmKCFlfHxuLmhhcyhlLm5hbWUpKXJldHVybjtpZih0LmhhcyhlLm5hbWUpKXRocm93IG5ldyBFcnJvcigiQ3ljbGljIGRlcGVuZGVuY3kgZGV0ZWN0ZWQuIENhbid0IHRvcG9sb2dpY2FsbHkgc29ydCByb3V0aW5lcyBuZWVkZWQgZm9yIHNoYWRlci4iKTt0LmFkZChlLm5hbWUpO2NvbnN0IG89ZS5kZXBlbmRlbmNpZXM7aWYobyYmby5sZW5ndGg+MClmb3IobGV0IGU9MDtlPG8ubGVuZ3RoOysrZSl0aGlzLmRmc1RyYXZlcnNlKG9bZV0sdCxuLHIpO3IucHVzaChlKSxuLmFkZChlLm5hbWUpLHQuZGVsZXRlKGUubmFtZSk7fX07fSwxMzcxOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5FbmNvZGluZ0dsc2xMaWI9dm9pZCAwO2NvbnN0IHI9bigxOTk3KTtjbGFzcyBvIGV4dGVuZHMgci5HbHNsTGlie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO31nZXRGdW5jdGlvbnMoKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMuZW5jb2RlRmxvYXQzMigpKSx0aGlzLmRlY29kZUZsb2F0MzIoKSl9Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm4ge319ZW5jb2RlRmxvYXQzMigpe3JldHVybiB7ZW5jb2RlOm5ldyByLkdsc2xMaWJSb3V0aW5lKCJoaWdocCB2ZWM0IGVuY29kZShoaWdocCBmbG9hdCBmKSB7XG4gICAgICAgIHJldHVybiB2ZWM0KGYsIDAuMCwgMC4wLCAwLjApO1xuICAgICAgfVxuICAgICAgICAiKX19ZGVjb2RlRmxvYXQzMigpe3JldHVybiB7ZGVjb2RlOm5ldyByLkdsc2xMaWJSb3V0aW5lKCJoaWdocCBmbG9hdCBkZWNvZGUoaGlnaHAgdmVjNCByZ2JhKSB7XG4gICAgICAgIHJldHVybiByZ2JhLnI7XG4gICAgICB9XG4gICAgICAgICIpfX1lbmNvZGVVaW50OCgpe2NvbnN0IGU9by5pc0xpdHRsZUVuZGlhbigpPyJyZ2JhLnJnYmE9cmdiYS5hYmdyOyI6IiI7cmV0dXJuIHtlbmNvZGU6bmV3IHIuR2xzbExpYlJvdXRpbmUoYFxuICAgICAgaGlnaHAgdmVjNCBlbmNvZGUoaGlnaHAgZmxvYXQgZikge1xuICAgICAgICBoaWdocCBmbG9hdCBGID0gYWJzKGYpO1xuICAgICAgICBoaWdocCBmbG9hdCBTaWduID0gc3RlcCgwLjAsLWYpO1xuICAgICAgICBoaWdocCBmbG9hdCBFeHBvbmVudCA9IGZsb29yKGxvZzIoRikpO1xuICAgICAgICBoaWdocCBmbG9hdCBNYW50aXNzYSA9IChleHAyKC0gRXhwb25lbnQpICogRik7XG4gICAgICAgIEV4cG9uZW50ID0gZmxvb3IobG9nMihGKSArIDEyNy4wKSArIGZsb29yKGxvZzIoTWFudGlzc2EpKTtcbiAgICAgICAgaGlnaHAgdmVjNCByZ2JhO1xuICAgICAgICByZ2JhWzBdID0gMTI4LjAgKiBTaWduICArIGZsb29yKEV4cG9uZW50KmV4cDIoLTEuMCkpO1xuICAgICAgICByZ2JhWzFdID0gMTI4LjAgKiBtb2QoRXhwb25lbnQsMi4wKSArIG1vZChmbG9vcihNYW50aXNzYSoxMjguMCksMTI4LjApO1xuICAgICAgICByZ2JhWzJdID0gZmxvb3IobW9kKGZsb29yKE1hbnRpc3NhKmV4cDIoMjMuMCAtOC4wKSksZXhwMig4LjApKSk7XG4gICAgICAgIHJnYmFbM10gPSBmbG9vcihleHAyKDIzLjApKm1vZChNYW50aXNzYSxleHAyKC0xNS4wKSkpO1xuICAgICAgICAke2V9XG4gICAgICAgIHJnYmEgPSByZ2JhIC8gMjU1LjA7IC8vIHZhbHVlcyBuZWVkIHRvIGJlIG5vcm1hbGl6ZWQgdG8gWzAsMV1cbiAgICAgICAgcmV0dXJuIHJnYmE7XG4gICAgfVxuICAgICAgICBgKX19ZGVjb2RlVWludDgoKXtjb25zdCBlPW8uaXNMaXR0bGVFbmRpYW4oKT8icmdiYS5yZ2JhPXJnYmEuYWJncjsiOiIiO3JldHVybiB7ZGVjb2RlOm5ldyByLkdsc2xMaWJSb3V0aW5lKGBcbiAgICAgICAgaGlnaHAgZmxvYXQgZGVjb2RlKGhpZ2hwIHZlYzQgcmdiYSkge1xuICAgICAgICAgIHJnYmEgPSByZ2JhICogMjU1LjA7IC8vIHZhbHVlcyBuZWVkIHRvIGJlIGRlLW5vcm1hbGl6ZWQgZnJvbSBbMCwxXSB0byBbMCwyNTVdXG4gICAgICAgICAgJHtlfVxuICAgICAgICAgIGhpZ2hwIGZsb2F0IFNpZ24gPSAxLjAgLSBzdGVwKDEyOC4wLHJnYmFbMF0pKjIuMDtcbiAgICAgICAgICBoaWdocCBmbG9hdCBFeHBvbmVudCA9IDIuMCAqIG1vZChyZ2JhWzBdLDEyOC4wKSArIHN0ZXAoMTI4LjAscmdiYVsxXSkgLSAxMjcuMDtcbiAgICAgICAgICBoaWdocCBmbG9hdCBNYW50aXNzYSA9IG1vZChyZ2JhWzFdLDEyOC4wKSo2NTUzNi4wICsgcmdiYVsyXSoyNTYuMCArcmdiYVszXSArIGZsb2F0KDB4ODAwMDAwKTtcbiAgICAgICAgICBoaWdocCBmbG9hdCBSZXN1bHQgPSAgU2lnbiAqIGV4cDIoRXhwb25lbnQpICogKE1hbnRpc3NhICogZXhwMigtMjMuMCApKTtcbiAgICAgICAgICByZXR1cm4gUmVzdWx0O1xuICAgICAgfVxuICAgICAgICBgKX19c3RhdGljIGlzTGl0dGxlRW5kaWFuKCl7Y29uc3QgZT1uZXcgQXJyYXlCdWZmZXIoNCksdD1uZXcgVWludDMyQXJyYXkoZSksbj1uZXcgVWludDhBcnJheShlKTtpZih0WzBdPTM3MzU5Mjg1NTksMjM5PT09blswXSlyZXR1cm4gITA7aWYoMjIyPT09blswXSlyZXR1cm4gITE7dGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGVuZGlhbm5lc3MiKX19dC5FbmNvZGluZ0dsc2xMaWI9bzt9LDI2OTE6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkZyYWdDb2xvckdsc2xMaWI9dm9pZCAwO2NvbnN0IHI9bigxOTk3KSxvPW4oNjc1Nyk7Y2xhc3MgaSBleHRlbmRzIHIuR2xzbExpYntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt9Z2V0RnVuY3Rpb25zKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0aGlzLnNldEZyYWdDb2xvcigpKSx0aGlzLmdldENvbG9yQXNGbG9hdCgpKX1nZXRDdXN0b21UeXBlcygpe3JldHVybiB7fX1zZXRGcmFnQ29sb3IoKXtjb25zdCBlPSgwLCBvLmdldEdsc2wpKHRoaXMuY29udGV4dC5nbENvbnRleHQudmVyc2lvbik7cmV0dXJuIHtzZXRGcmFnQ29sb3I6bmV3IHIuR2xzbExpYlJvdXRpbmUoYFxuICAgICAgICB2b2lkIHNldEZyYWdDb2xvcihmbG9hdCB2YWx1ZSkge1xuICAgICAgICAgICAgJHtlLm91dHB1dH0gPSBlbmNvZGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGAsWyJlbmNvZGluZy5lbmNvZGUiXSl9fWdldENvbG9yQXNGbG9hdCgpe3JldHVybiB7Z2V0Q29sb3JBc0Zsb2F0Om5ldyByLkdsc2xMaWJSb3V0aW5lKCJcbiAgICAgICAgZmxvYXQgZ2V0Q29sb3JBc0Zsb2F0KHZlYzQgY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGUoY29sb3IpO1xuICAgICAgICB9XG4gICAgICAgICIsWyJlbmNvZGluZy5kZWNvZGUiXSl9fX10LkZyYWdDb2xvckdsc2xMaWI9aTt9LDM4Nzg6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZXBsYWNlSW5saW5lcz12b2lkIDA7Y29uc3Qgbj0vQGlubGluZVtcc1xuXHJdKyhcdyspW1xzXG5ccl0rKFswLTlhLXpBLVpfXSspXHMqXCgoW14pXSopXClccyp7KChbXn1dfFtcblxyXSkqKX0vZ207dC5yZXBsYWNlSW5saW5lcz1mdW5jdGlvbihlKXtjb25zdCB0PXt9O2xldCByO2Zvcig7bnVsbCE9PShyPW4uZXhlYyhlKSk7KXtjb25zdCBlPXJbM10uc3BsaXQoIiwiKS5tYXAoKGU9Pntjb25zdCB0PWUudHJpbSgpLnNwbGl0KCIgIik7cmV0dXJuIHQmJjI9PT10Lmxlbmd0aD97dHlwZTp0WzBdLG5hbWU6dFsxXX06bnVsbH0pKS5maWx0ZXIoKGU9Pm51bGwhPT1lKSk7dFtyWzJdXT17cGFyYW1zOmUsYm9keTpyWzRdfTt9Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3Qgbz0iKFxcdyspP1xccysoW18wLTlhLXpBLVpdKylcXHMrPVxccytfX0ZVTkNfX1xcKCguKilcXClcXHMqOyIucmVwbGFjZSgiX19GVU5DX18iLG4pLGk9bmV3IFJlZ0V4cChvLCJnbSIpO2Zvcig7bnVsbCE9PShyPWkuZXhlYyhlKSk7KXtjb25zdCBvPXJbMV0saT1yWzJdLHM9clszXS5zcGxpdCgiLCIpLGE9bz9gJHtvfSAke2l9O2A6IiI7bGV0IHU9dFtuXS5ib2R5LGw9IiI7dFtuXS5wYXJhbXMuZm9yRWFjaCgoKGUsdCk9PntlJiYobCs9YCR7ZS50eXBlfSAke2UubmFtZX0gPSAke3NbdF19O1xuYCk7fSkpLHU9YCR7bH1cbiAke3V9YCx1PXUucmVwbGFjZSgicmV0dXJuIixgJHtpfSA9IGApO2NvbnN0IGM9YFxuICAgICAgJHthfVxuICAgICAge1xuICAgICAgICAke3V9XG4gICAgICB9XG4gICAgICBgO2U9ZS5yZXBsYWNlKHJbMF0sYyk7fX1yZXR1cm4gZS5yZXBsYWNlKG4sIiIpfTt9LDg4OTc6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lkdsc2xQcmVwcm9jZXNzb3I9dm9pZCAwO2NvbnN0IHI9bigxOTk3KSxvPW4oMzg3OCksaT1uKDEyNDgpLHM9big2NzU3KTt0Lkdsc2xQcmVwcm9jZXNzb3I9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4sbyl7dGhpcy5saWJzPXt9LHRoaXMuZ2xzbExpYlJvdXRpbmVEZXBlbmRlbmN5R3JhcGg9e30sdGhpcy5jb250ZXh0PW5ldyByLkdsc2xDb250ZXh0KGUsdCxuLG8pLE9iamVjdC5rZXlzKGkuZ2xzbFJlZ2lzdHJ5KS5mb3JFYWNoKChlPT57Y29uc3QgdD1uZXcgaS5nbHNsUmVnaXN0cnlbZV0odGhpcy5jb250ZXh0KTt0aGlzLmxpYnNbZV09dDt9KSk7Y29uc3Qgcz10aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoO2Zvcihjb25zdCBlIGluIHRoaXMubGlicyl7Y29uc3QgdD10aGlzLmxpYnNbZV0uZ2V0RnVuY3Rpb25zKCk7Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3Qgbz1lKyIuIituO2xldCBpO3Nbb10/KGk9c1tvXSxpLnJvdXRpbmVCb2R5PXRbbl0ucm91dGluZUJvZHkpOihpPW5ldyByLkdsc2xMaWJSb3V0aW5lTm9kZShvLHRbbl0ucm91dGluZUJvZHkpLHNbb109aSk7Y29uc3QgYT10W25dLmRlcGVuZGVuY2llcztpZihhKWZvcihsZXQgZT0wO2U8YS5sZW5ndGg7KytlKWlmKHNbYVtlXV0paS5hZGREZXBlbmRlbmN5KHNbYVtlXV0pO2Vsc2Uge2NvbnN0IHQ9bmV3IHIuR2xzbExpYlJvdXRpbmVOb2RlKGFbZV0pO3NbYVtlXV09dCxpLmFkZERlcGVuZGVuY3kodCk7fX19fXByZXByb2Nlc3MoKXtjb25zdCBlPXRoaXMuY29udGV4dC5wcm9ncmFtSW5mbztsZXQgdD1lLnNoYWRlclNvdXJjZTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmhhc01haW58fCh0PWAke3R9XG4gICAgICAkeygwLCBzLmdldERlZmF1bHRGcmFnU2hhZGVyTWFpbikodGhpcy5jb250ZXh0LmdsQ29udGV4dC52ZXJzaW9uLHRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0LnNoYXBlLmxlbmd0aCl9YCksdD0oMCwgby5yZXBsYWNlSW5saW5lcykodCksYCR7KDAsIHMuZ2V0RnJhZ1NoYWRlclByZWFtYmxlKSh0aGlzLmNvbnRleHQuZ2xDb250ZXh0LnZlcnNpb24pfVxuICAgICR7dGhpcy5nZXRVbmlmb3JtcyhlLmlucHV0TmFtZXMsZS52YXJpYWJsZXMpfVxuICAgICR7dGhpcy5nZXRJbXBvcnRzKHQpfVxuICAgICR7dH1gfWdldEltcG9ydHMoZSl7Y29uc3QgdD10aGlzLnNlbGVjdEdsc2xMaWJSb3V0aW5lc1RvQmVJbmNsdWRlZChlKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuICIiO2xldCBuPSIiO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7KytlKXtpZighdFtlXS5yb3V0aW5lQm9keSl0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgYm9keSBmb3IgdGhlIEdsc2wgTGlicmFyeSByb3V0aW5lOiAke3RbZV0ubmFtZX1gKTtuKz10W2VdLnJvdXRpbmVCb2R5KyJcbiI7fXJldHVybiBufXNlbGVjdEdsc2xMaWJSb3V0aW5lc1RvQmVJbmNsdWRlZChlKXtjb25zdCB0PVtdO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoKS5mb3JFYWNoKChuPT57Y29uc3Qgcj1uLnNwbGl0KCIuIilbMV07LTEhPT1lLmluZGV4T2YocikmJnQucHVzaCh0aGlzLmdsc2xMaWJSb3V0aW5lRGVwZW5kZW5jeUdyYXBoW25dKTt9KSksci5Ub3BvbG9naWNhbFNvcnRHbHNsUm91dGluZXMucmV0dXJuT3JkZXJlZE5vZGVzKHQpfWdldFVuaWZvcm1zKGUsdCl7Y29uc3Qgbj1bXTtpZihlKWZvcihjb25zdCB0IG9mIGUpbi5wdXNoKGB1bmlmb3JtIHNhbXBsZXIyRCAke3R9O2ApO2lmKHQpZm9yKGNvbnN0IGUgb2YgdCluLnB1c2goYHVuaWZvcm0gJHtlLnR5cGV9ICR7ZS5uYW1lfSR7ZS5hcnJheUxlbmd0aD9gWyR7ZS5hcnJheUxlbmd0aH1dYDoiIn07YCk7cmV0dXJuIG4uam9pbigiXG4iKX19O30sMTI0ODooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2xzbFJlZ2lzdHJ5PXZvaWQgMDtjb25zdCByPW4oNjg1OSksbz1uKDEzNzEpLGk9bigyNjkxKSxzPW4oOTE4MyksYT1uKDkzMTQpO3QuZ2xzbFJlZ2lzdHJ5PXtlbmNvZGluZzpvLkVuY29kaW5nR2xzbExpYixmcmFnY29sb3I6aS5GcmFnQ29sb3JHbHNsTGliLHZlYzphLlZlY0dsc2xMaWIsc2hhcGVVdGlsczpzLlNoYXBlVXRpbHNHbHNsTGliLGNvb3JkaW5hdGVzOnIuQ29vcmRzR2xzbExpYn07fSw5MTgzOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5TaGFwZVV0aWxzR2xzbExpYj12b2lkIDA7Y29uc3Qgcj1uKDE5OTcpO2NsYXNzIG8gZXh0ZW5kcyByLkdsc2xMaWJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7fWdldEZ1bmN0aW9ucygpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5iY2FzdEluZGV4KCkpLHRoaXMuYmNhc3RNYXRtdWxJbmRleCgpKSx0aGlzLm9mZnNldFRvSW5kaWNlcygpKSx0aGlzLmluZGljZXNUb09mZnNldCgpKSx0aGlzLmluY3JlbWVudEluZGljZXMoKSl9Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm4ge319YmNhc3RJbmRleCgpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQuc2hhcGUubGVuZ3RoLHQ9e307cmV0dXJuIHRoaXMuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLmZvckVhY2goKChuLG8pPT57Y29uc3QgaT10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tvXS51bnBhY2tlZFNoYXBlO2lmKGkubGVuZ3RoPD1lKXtjb25zdCBvPWkubGVuZ3RoLHM9ZS1vLGE9YGJjYXN0SW5kaWNlc18ke259YDtsZXQgdT0iIjtmb3IobGV0IGU9MDtlPG87KytlKXUrPWBcbiAgICAgICAgICByZWFsSW5kaWNlc1ske2V9XSA9IGludCggbW9kKGZsb2F0KGJjYXN0ZWRJbmRpY2VzWyR7cytlfV0pLCAke2lbZV19LjApICk7XG4gICAgICAgICAgYDtjb25zdCBsPWBcbiAgICAgICAgdm9pZCAke2F9IChpbnQgYmNhc3RlZEluZGljZXNbJHtlfV0sIG91dCBpbnQgcmVhbEluZGljZXNbJHtvfV0pIHtcbiAgICAgICAgICAke3V9XG4gICAgICAgIH1cbiAgICAgICAgYDt0W2FdPW5ldyByLkdsc2xMaWJSb3V0aW5lKGwpO319KSksdH1iY2FzdE1hdG11bEluZGV4KCl7Y29uc3QgZT10aGlzLmNvbnRleHQub3V0cHV0VGV4dHVyZUxheW91dC5zaGFwZS5sZW5ndGgsdD17fTtyZXR1cm4gdGhpcy5jb250ZXh0LnByb2dyYW1JbmZvLmlucHV0TmFtZXMuZm9yRWFjaCgoKG4sbyk9Pntjb25zdCBpPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW29dLnNoYXBlO2lmKCEoaS5sZW5ndGg8Mnx8aS5sZW5ndGg+ZSkpe2NvbnN0IG89aS5sZW5ndGgscz1lLW8sYT1gYmNhc3RNYXRtdWxJbmRpY2VzXyR7bn1gO2xldCB1PSIiO2ZvcihsZXQgZT0wO2U8by0yOysrZSl1Kz1gXG4gICAgICAgICAgcmVhbEluZGljZXNbJHtlfV0gPSBpbnQoIG1vZChmbG9hdChiY2FzdGVkSW5kaWNlc1ske3MrZX1dKSwgJHtpW2VdfS4wKSApO1xuICAgICAgICAgIGA7Y29uc3QgbD1gXG4gICAgICAgIHZvaWQgJHthfShpbnQgYmNhc3RlZEluZGljZXNbJHtlfV0sIG91dCBpbnQgcmVhbEluZGljZXNbJHtvfV0pIHtcbiAgICAgICAgICAke3V9XG4gICAgICAgICAgcmVhbEluZGljZXNbJHtvLTF9XSA9IGJjYXN0ZWRJbmRpY2VzWyR7ZS0xfV07XG4gICAgICAgICAgcmVhbEluZGljZXNbJHtvLTJ9XSA9IGJjYXN0ZWRJbmRpY2VzWyR7ZS0yfV07XG4gICAgICAgIH1cbiAgICAgICAgYDt0W2FdPW5ldyByLkdsc2xMaWJSb3V0aW5lKGwpO319KSksdH1pbmRpY2VzVG9PZmZzZXQoKXtjb25zdCBlPXt9O3JldHVybiB0aGlzLmNvbnRleHQucHJvZ3JhbUluZm8uaW5wdXROYW1lcy5mb3JFYWNoKCgodCxuKT0+e2NvbnN0IGk9dGhpcy5jb250ZXh0LmlucHV0VGV4dHVyZUxheW91dHNbbl0uc2hhcGUscz10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tuXS5zdHJpZGVzLGE9aS5sZW5ndGg7bGV0IHU9YGluZGljZXNUb09mZnNldF8ke3R9YDtlW3VdPW5ldyByLkdsc2xMaWJSb3V0aW5lKG8uaW5kZXhUb09mZnNldFNpbmdsZSh1LGEscykpLHU9YGluZGljZXNUb09mZnNldF8ke3R9X1RgLGVbdV09bmV3IHIuR2xzbExpYlJvdXRpbmUoby5pbmRleFRvT2Zmc2V0U2luZ2xlKHUsYSxzLnNsaWNlKCkucmV2ZXJzZSgpKSk7fSkpLGV9c3RhdGljIGluZGV4VG9PZmZzZXRTaW5nbGUoZSx0LG4pe2xldCByPSIiO2ZvcihsZXQgZT10LTE7ZT49MDstLWUpcis9YFxuICAgICAgICBvZmZzZXQgKz0gaW5kaWNlc1ske2V9XSAqICR7bltlXX07XG4gICAgICAgIGA7cmV0dXJuIGBcbiAgICAgIGludCAke2V9KGludCBpbmRpY2VzWyR7dH1dKSB7XG4gICAgICAgIGludCBvZmZzZXQgPSAwO1xuICAgICAgICAke3J9XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgICB9XG4gICAgICBgfW9mZnNldFRvSW5kaWNlcygpe2NvbnN0IGU9e307cmV0dXJuIHRoaXMuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLmZvckVhY2goKCh0LG4pPT57Y29uc3QgaT10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tuXS5zaGFwZSxzPXRoaXMuY29udGV4dC5pbnB1dFRleHR1cmVMYXlvdXRzW25dLnN0cmlkZXMsYT1pLmxlbmd0aDtsZXQgdT1gb2Zmc2V0VG9JbmRpY2VzXyR7dH1gO2VbdV09bmV3IHIuR2xzbExpYlJvdXRpbmUoby5vZmZzZXRUb0luZGljZXNTaW5nbGUodSxhLHMpKSx1PWBvZmZzZXRUb0luZGljZXNfJHt0fV9UYCxlW3VdPW5ldyByLkdsc2xMaWJSb3V0aW5lKG8ub2Zmc2V0VG9JbmRpY2VzU2luZ2xlKHUsYSxzLnNsaWNlKCkucmV2ZXJzZSgpKSk7fSkpLGV9c3RhdGljIG9mZnNldFRvSW5kaWNlc1NpbmdsZShlLHQsbil7Y29uc3Qgcj1bXTtmb3IobGV0IGU9MDtlPHQtMTsrK2Upci5wdXNoKGBcbiAgICAgIGluZGljZXNbJHtlfV0gPSBvZmZzZXQgLyAke25bZV19O2ApLHIucHVzaChgXG4gICAgICAgIG9mZnNldCAtPSBpbmRpY2VzWyR7ZX1dICogJHtuW2VdfTtgKTtyZXR1cm4gci5wdXNoKGBcbiAgICAgIGluZGljZXNbJHt0LTF9XSA9IG9mZnNldDtgKSxgXG4gICAgICB2b2lkICR7ZX0oaW50IG9mZnNldCwgb3V0IGludCBpbmRpY2VzWyR7dH1dKSB7XG4gICAgICAgICR7ci5qb2luKCIiKX1cbiAgICAgIH1cbiAgICAgIGB9aW5jcmVtZW50SW5kaWNlcygpe2NvbnN0IGU9e307cmV0dXJuIHRoaXMuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLmZvckVhY2goKCh0LG4pPT57Y29uc3Qgbz10aGlzLmNvbnRleHQuaW5wdXRUZXh0dXJlTGF5b3V0c1tuXS5zaGFwZSxpPW8ubGVuZ3RoLHM9YGluY3JlbWVudEluZGljZXNfJHt0fWA7bGV0IGE9IiI7Zm9yKGxldCBlPTA7ZTxpOysrZSlhKz1gXG4gICAgICAgIHNoYXBlWyR7ZX1dID0gJHtvW2VdfTtgO2NvbnN0IHU9YFxuICAgICAgICB2b2lkICR7c30oaW50IGF4aXMsIG91dCBpbnQgaW5kaWNlc1ske2l9XSkge1xuICAgICAgICAgIGludCBzaGFwZVske2l9XTtcbiAgICAgICAgICAke2F9O1xuICAgICAgICAgIGZvcihpbnQgaSA9ICR7aX0gLTEgOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgaWYoaSA+IGF4aXMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaW5kaWNlc1tpXSArPSAxO1xuICAgICAgICAgICAgaWYoaW5kaWNlc1tpXSA8IHNoYXBlW2ldKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kaWNlc1tpXSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGA7ZVtzXT1uZXcgci5HbHNsTGliUm91dGluZSh1KTt9KSksZX19dC5TaGFwZVV0aWxzR2xzbExpYj1vO30sNjc1NzooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmdldERlZmF1bHRGcmFnU2hhZGVyTWFpbj10LmdldEZyYWdTaGFkZXJQcmVhbWJsZT10LmdldFZlcnRleFNoYWRlclNvdXJjZT10LmdldEdsc2w9dm9pZCAwO2NvbnN0IG49e3ZlcnNpb246IiIsYXR0cmlidXRlOiJhdHRyaWJ1dGUiLHZhcnlpbmdWZXJ0ZXg6InZhcnlpbmciLHZhcnlpbmdGcmFnOiJ2YXJ5aW5nIix0ZXh0dXJlMkQ6InRleHR1cmUyRCIsb3V0cHV0OiJnbF9GcmFnQ29sb3IiLG91dHB1dERlY2xhcmF0aW9uOiIifSxyPXt2ZXJzaW9uOiIjdmVyc2lvbiAzMDAgZXMiLGF0dHJpYnV0ZToiaW4iLHZhcnlpbmdWZXJ0ZXg6Im91dCIsdmFyeWluZ0ZyYWc6ImluIix0ZXh0dXJlMkQ6InRleHR1cmUiLG91dHB1dDoib3V0cHV0Q29sb3IiLG91dHB1dERlY2xhcmF0aW9uOiJvdXQgdmVjNCBvdXRwdXRDb2xvcjsifTtmdW5jdGlvbiBvKGUpe3JldHVybiAxPT09ZT9uOnJ9dC5nZXRHbHNsPW8sdC5nZXRWZXJ0ZXhTaGFkZXJTb3VyY2U9ZnVuY3Rpb24oZSl7Y29uc3QgdD1vKGUpO3JldHVybiBgJHt0LnZlcnNpb259XG4gICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4gICAgICAke3QuYXR0cmlidXRlfSB2ZWMzIHBvc2l0aW9uO1xuICAgICAgJHt0LmF0dHJpYnV0ZX0gdmVjMiB0ZXh0dXJlQ29vcmQ7XG5cbiAgICAgICR7dC52YXJ5aW5nVmVydGV4fSB2ZWMyIFRleENvb3JkcztcblxuICAgICAgdm9pZCBtYWluKClcbiAgICAgIHtcbiAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDEuMCk7XG4gICAgICAgICAgVGV4Q29vcmRzID0gdGV4dHVyZUNvb3JkO1xuICAgICAgfWB9LHQuZ2V0RnJhZ1NoYWRlclByZWFtYmxlPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9byhlKTtyZXR1cm4gYCR7dC52ZXJzaW9ufVxuICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiAgICBwcmVjaXNpb24gaGlnaHAgaW50O1xuICAgIHByZWNpc2lvbiBoaWdocCBzYW1wbGVyMkQ7XG4gICAgJHt0LnZhcnlpbmdGcmFnfSB2ZWMyIFRleENvb3JkcztcbiAgICAke3Qub3V0cHV0RGVjbGFyYXRpb259XG4gICAgY29uc3QgdmVjMiBoYWxmQ1IgPSB2ZWMyKDAuNSwgMC41KTtcblxuICAgIC8vIEN1c3RvbSB2ZWN0b3IgdHlwZXMgdG8gaGFuZGxlIGhpZ2hlciBkaW1lbmFsaXRpZXMuXG4gICAgc3RydWN0IGl2ZWM1XG4gICAge1xuICAgICAgaW50IHg7XG4gICAgICBpbnQgeTtcbiAgICAgIGludCB6O1xuICAgICAgaW50IHc7XG4gICAgICBpbnQgdTtcbiAgICB9O1xuXG4gICAgc3RydWN0IGl2ZWM2XG4gICAge1xuICAgICAgaW50IHg7XG4gICAgICBpbnQgeTtcbiAgICAgIGludCB6O1xuICAgICAgaW50IHc7XG4gICAgICBpbnQgdTtcbiAgICAgIGludCB2O1xuICAgIH07XG5cbiAgICBpbnQgaW1vZChpbnQgeCwgaW50IHkpIHtcbiAgICAgIHJldHVybiB4IC0geSAqICh4IC8geSk7XG4gICAgfVxuXG4gICAgYH0sdC5nZXREZWZhdWx0RnJhZ1NoYWRlck1haW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYFxuICB2b2lkIG1haW4oKSB7XG4gICAgaW50IGluZGljZXNbJHt0fV07XG4gICAgdG9WZWMoVGV4Q29vcmRzLCBpbmRpY2VzKTtcbiAgICB2ZWM0IHJlc3VsdCA9IHZlYzQocHJvY2VzcyhpbmRpY2VzKSk7XG4gICAgJHtvKGUpLm91dHB1dH0gPSByZXN1bHQ7XG4gIH1cbiAgYH07fSw5MzE0OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5WZWNHbHNsTGliPXZvaWQgMDtjb25zdCByPW4oMTk5Nyk7Y2xhc3MgbyBleHRlbmRzIHIuR2xzbExpYntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt9Z2V0Q3VzdG9tVHlwZXMoKXtyZXR1cm4ge319Z2V0RnVuY3Rpb25zKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5iaW5hcnlWZWNGdW5jdGlvbnMoKSksdGhpcy5jb3B5VmVjKCkpLHRoaXMuc2V0VmVjSXRlbSgpKSx0aGlzLmdldFZlY0l0ZW0oKSl9YmluYXJ5VmVjRnVuY3Rpb25zKCl7Y29uc3QgZT10aGlzLmNvbnRleHQub3V0cHV0VGV4dHVyZUxheW91dC5zaGFwZS5sZW5ndGgsdD17YWRkOiIrPSIsc3ViOiItPSIsbXVsOiIqPSIsZGl2OiIvPSJ9LG49e307Zm9yKGNvbnN0IG8gaW4gdCl7Y29uc3QgaT1gJHtvfVZlY2A7bGV0IHM9IiI7Zm9yKGxldCBuPTA7bjxlOysrbilzKz1gXG4gICAgICAgICAgZGVzdFske259XSAke3Rbb119IHNyY1ske259XTtcbiAgICAgICAgICBgO2NvbnN0IGE9YFxuICAgICAgICB2b2lkICR7aX0oaW50IHNyY1ske2V9XSwgb3V0IGludCBkZXN0WyR7ZX1dKSB7XG4gICAgICAgICAgJHtzfVxuICAgICAgICB9XG4gICAgICAgIGA7bltpXT1uZXcgci5HbHNsTGliUm91dGluZShhKTt9cmV0dXJuIG59Y29weVZlYygpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQuc2hhcGUubGVuZ3RoO2xldCB0PSIiO2ZvcihsZXQgbj0wO248ZTsrK24pdCs9YFxuICAgICAgICBkZXN0WyR7bn1dID0gc3JjWyR7bn1dO1xuICAgICAgICBgO2NvbnN0IG49YFxuICAgICAgdm9pZCBjb3B5VmVjKGludCBzcmNbJHtlfV0sIG91dCBpbnQgZGVzdFske2V9XSkge1xuICAgICAgICAke3R9XG4gICAgICB9XG4gICAgICBgO3JldHVybiB7Y29weVZlYzpuZXcgci5HbHNsTGliUm91dGluZShuKX19c2V0VmVjSXRlbSgpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm91dHB1dFRleHR1cmVMYXlvdXQuc2hhcGUubGVuZ3RoO2xldCB0PWBcbiAgICAgICAgaWYoaW5kZXggPCAwKVxuICAgICAgICAgICAgaW5kZXggPSR7ZX0gKyBpbmRleDtcbiAgICAgICAgaWYgKGluZGV4ID09IDApXG4gICAgICAgICAgICBtWzBdID0gdmFsdWU7XG4gICAgICAgIGA7Zm9yKGxldCBuPTE7bjxlLTE7KytuKXQrPWBcbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPT0gJHtufSlcbiAgICAgICAgICAgIG1bJHtufV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGA7dCs9YFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBtWyR7ZS0xfV0gPSB2YWx1ZTtcbiAgICAgICAgYDtjb25zdCBuPWBcbiAgICAgIHZvaWQgc2V0VmVjSXRlbShvdXQgaW50IG1bJHtlfV0sIGludCBpbmRleCwgaW50IHZhbHVlKSB7XG4gICAgICAgICR7dH1cbiAgICAgIH1cbiAgICAgICAgYDtyZXR1cm4ge3NldFZlY0l0ZW06bmV3IHIuR2xzbExpYlJvdXRpbmUobil9fWdldFZlY0l0ZW0oKXtjb25zdCBlPXRoaXMuY29udGV4dC5vdXRwdXRUZXh0dXJlTGF5b3V0LnNoYXBlLmxlbmd0aDtsZXQgdD1gXG4gICAgICAgIGlmKGluZGV4IDwgMClcbiAgICAgICAgICAgIGluZGV4ID0gJHtlfSArIGluZGV4O1xuICAgICAgICBpZiAoaW5kZXggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBtWzBdO1xuICAgICAgYDtmb3IobGV0IG49MTtuPGUtMTsrK24pdCs9YFxuICAgICAgICBlbHNlIGlmIChpbmRleCA9PSAke259KVxuICAgICAgICAgICAgcmV0dXJuIG1bJHtufV07XG4gICAgICBgO3QrPWBcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG1bJHtlLTF9XTtcbiAgICAgICAgYDtjb25zdCBuPWBcbiAgICAgIGludCBnZXRWZWNJdGVtKGludCBtWyR7ZX1dLCBpbnQgaW5kZXgpIHtcbiAgICAgICAgJHt0fVxuICAgICAgfVxuICAgIGA7cmV0dXJuIHtnZXRWZWNJdGVtOm5ldyByLkdsc2xMaWJSb3V0aW5lKG4pfX19dC5WZWNHbHNsTGliPW87fSw3ODYwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5XZWJHTEluZmVyZW5jZUhhbmRsZXI9dm9pZCAwO2NvbnN0IHI9bigxMzE1KSxvPW4oOTI0MCksaT1uKDcyNzMpLHM9big5KSxhPW4oNzM3OSksdT1uKDI0ODgpLGw9big1NDApLGM9bigzMzE0KSxwPW4oNTYzOSk7dC5XZWJHTEluZmVyZW5jZUhhbmRsZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5zZXNzaW9uPWUsdGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlPW5ldyBNYXAsdGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcDt9Y2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KGUsdCl7cmV0dXJuICgwLCBjLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodCkodGhpcy5zZXNzaW9uLmxheW91dFN0cmF0ZWd5LGUsdCl9ZXhlY3V0ZVByb2dyYW0oZSx0KXtpZih0Lmxlbmd0aDxlLmlucHV0TmFtZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgSW5wdXQgc2l6ZSBtdXN0bid0IGJlIGxlc3MgdGhhbiAke2UuaW5wdXROYW1lcy5sZW5ndGh9LmApO2lmKGUuaW5wdXROYW1lcy5sZW5ndGghPT1lLmlucHV0VHlwZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiaW5wdXQgbmFtZXMgc2l6ZSBkb2VzIG5vdCBtYXRjaCBpbnB1dCB0eXBlcyIpO2NvbnN0IG49W107Zm9yKGxldCByPTA7cjxlLmlucHV0TmFtZXMubGVuZ3RoOysrciluW3JdPXRoaXMuZ2V0T3JDcmVhdGVUZXh0dXJlRGF0YSh0W3JdLGUuaW5wdXRUeXBlc1tyXSk7Y29uc3Qgcj0oKGUsdCk9Pntjb25zdCBuPXQubWFwKChlPT5gJHtlLnVucGFja2VkU2hhcGUuam9pbigiLCIpfTske2Uud2lkdGh9eCR7ZS5oZWlnaHR9YCkpLmpvaW4oIl8iKTtsZXQgcj1lLm5hbWU7cmV0dXJuIGUuY2FjaGVIaW50JiYocis9IlsiK2UuY2FjaGVIaW50KyJdIikscis9IjoiK24scn0pKGUsbik7bGV0IG89dGhpcy5zZXNzaW9uLnByb2dyYW1NYW5hZ2VyLmdldEFydGlmYWN0KHIpO2NvbnN0IGk9bz9vLnByb2dyYW1JbmZvOiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldD9lLmdldCgpOmUscz0oMCwgYy5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVRleHR1cmVUeXBlKSh0aGlzLnNlc3Npb24ubGF5b3V0U3RyYXRlZ3ksaS5vdXRwdXQuZGltcyxpLm91dHB1dC50ZXh0dXJlVHlwZSksYT10aGlzLmNyZWF0ZVRleHR1cmVEYXRhKHMsaS5vdXRwdXQudHlwZSk7cmV0dXJuIG98fChvPXRoaXMuc2Vzc2lvbi5wcm9ncmFtTWFuYWdlci5idWlsZChpLG4sYSksdGhpcy5zZXNzaW9uLnByb2dyYW1NYW5hZ2VyLnNldEFydGlmYWN0KHIsbykpLHRoaXMucnVuUHJvZ3JhbShvLG4sYSksYX1ydW4oZSx0KXtyZXR1cm4gdGhpcy5leGVjdXRlUHJvZ3JhbShlLHQpLnRlbnNvcn1ydW5Qcm9ncmFtKGUsdCxuKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoOysrbilpZighIXRbbl0uaXNQYWNrZWQhPShlLnByb2dyYW1JbmZvLmlucHV0VHlwZXNbbl09PT1wLlRleHR1cmVUeXBlLnBhY2tlZCkpdGhyb3cgbmV3IEVycm9yKGBpbnB1dFske259XSBwcm9wZXJ0eSBwYWNrZWQgaW5jb25zaXN0ZW50YCk7aWYoISFuLmlzUGFja2VkIT0oZS5wcm9ncmFtSW5mby5vdXRwdXQudGV4dHVyZVR5cGU9PT1wLlRleHR1cmVUeXBlLnBhY2tlZCkpdGhyb3cgbmV3IEVycm9yKCJvdXRwdXQgcHJvcGVydHkgcGFja2VkIGluY29uc2lzdGVudCIpO3RoaXMuc2Vzc2lvbi5wcm9ncmFtTWFuYWdlci5ydW4oZSx0LG4pO31nZXRPckNyZWF0ZVRleHR1cmVEYXRhKGUsdCl7bGV0IG49dGhpcy5nZXRUZXh0dXJlRGF0YShlLmRhdGFJZCx0PT09cC5UZXh0dXJlVHlwZS5wYWNrZWQpO2lmKCFuJiYobj10aGlzLmdldFRleHR1cmVEYXRhKGUuZGF0YUlkLHQhPT1wLlRleHR1cmVUeXBlLnBhY2tlZCksbikpcmV0dXJuIHQ9PT1wLlRleHR1cmVUeXBlLnBhY2tlZD90aGlzLnBhY2sobik6dGhpcy51bnBhY2sobik7aWYoIW4pe2NvbnN0IHI9KDAsIGMuY3JlYXRlVGV4dHVyZUxheW91dEZyb21UZXh0dXJlVHlwZSkodGhpcy5zZXNzaW9uLmxheW91dFN0cmF0ZWd5LGUuZGltcyx0KTtpZih0PT09cC5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKXtjb25zdCBuPTEscj00LG89ZS5kaW1zO2lmKDQ9PT1vLmxlbmd0aCl7Y29uc3QgaT1bb1swXSxNYXRoLmNlaWwob1sxXSpvWzJdKm9bM10vcildLHM9KDAsIGMuY3JlYXRlVGV4dHVyZUxheW91dEZyb21UZXh0dXJlVHlwZSkodGhpcy5zZXNzaW9uLmxheW91dFN0cmF0ZWd5LGksdCk7bGV0IGE9ZS5udW1iZXJEYXRhO2lmKG9bMV0qb1syXSpvWzNdJXIhPTApe2NvbnN0IHQ9b1swXSxpPW9bMV0qb1syXSpvWzNdLHM9TWF0aC5jZWlsKGkqbi9yKSpyO2E9bmV3IEZsb2F0MzJBcnJheSh0KnMpO2ZvcihsZXQgcj0wO3I8dDsrK3Ipe2NvbnN0IHQ9cippLG89cipzK3IlbippO2Euc2V0KGUubnVtYmVyRGF0YS5zdWJhcnJheSh0LHQraSksbyk7fX1yZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlRGF0YShzLGUudHlwZSxhLGUsMSl9fWlmKHQ9PT1wLlRleHR1cmVUeXBlLnBhY2tlZCl7Y29uc3QgdD0oMCwgYy5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVNoYXBlKSh0aGlzLnNlc3Npb24ubGF5b3V0U3RyYXRlZ3ksZS5kaW1zLDEsW10se3JldmVyc2VXSDohMH0pLHI9dGhpcy5jcmVhdGVUZXh0dXJlRGF0YSh0LGUudHlwZSxlLm51bWJlckRhdGEsZSwxKTtuPXRoaXMucGFjayhyKTt9ZWxzZSBuPXRoaXMuY3JlYXRlVGV4dHVyZURhdGEocixlLnR5cGUsZS5udW1iZXJEYXRhLGUsMSk7fXJldHVybiBufWNyZWF0ZVRleHR1cmVEYXRhRnJvbUxheW91dEJpbmRUZW5zb3IoZSx0LG4scil7cmV0dXJuIHRoaXMuY3JlYXRlVGV4dHVyZURhdGEoZSx0LG4sciwxKX1jcmVhdGVUZXh0dXJlRGF0YShlLHQsbixvLGkpe3IuTG9nZ2VyLnZlcmJvc2UoIkluZmVyZW5jZUhhbmRsZXIiLGBDcmVhdGluZyBUZXh0dXJlRGF0YTogbGF5b3V0Olske0pTT04uc3RyaW5naWZ5KGUpfV1gKTtjb25zdCBzPXRoaXMuc2Vzc2lvbi50ZXh0dXJlTWFuYWdlci5jcmVhdGVUZXh0dXJlRnJvbUxheW91dCh0LGUsbixpKTtyZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlRGF0YUZyb21UZXh0dXJlKGUsdCxzLG8pfXJlc2hhcGVVbnBhY2tlZChlLHQpe2NvbnN0IG49dGhpcy5nZXRPckNyZWF0ZVRleHR1cmVEYXRhKGUscC5UZXh0dXJlVHlwZS51bnBhY2tlZCkscj17Y2hhbm5lbHM6bi5jaGFubmVscyxoZWlnaHQ6bi5oZWlnaHQsd2lkdGg6bi53aWR0aCxzaGFwZTowIT09dC5sZW5ndGg/dDpbMV0sc3RyaWRlczppLlNoYXBlVXRpbC5jb21wdXRlU3RyaWRlcyh0KSx1bnBhY2tlZFNoYXBlOnR9O3JldHVybiB0aGlzLmNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUocixlLnR5cGUsbi50ZXh0dXJlKS50ZW5zb3J9cmVzaGFwZVBhY2tlZChlLHQpe2NvbnN0IG49dGhpcy5nZXRPckNyZWF0ZVRleHR1cmVEYXRhKGUscC5UZXh0dXJlVHlwZS5wYWNrZWQpO2lmKCgwLCBhLmlzUmVzaGFwZUNoZWFwKShlLmRpbXMsdCkpe2NvbnN0IHI9e2NoYW5uZWxzOm4uY2hhbm5lbHMsaGVpZ2h0Om4uaGVpZ2h0LHdpZHRoOm4ud2lkdGgsc2hhcGU6MCE9PXQubGVuZ3RoP3Q6WzFdLHN0cmlkZXM6aS5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXModCksdW5wYWNrZWRTaGFwZTp0LGlzUGFja2VkOiEwfTtyZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlRGF0YUZyb21UZXh0dXJlKHIsZS50eXBlLG4udGV4dHVyZSkudGVuc29yfWNvbnN0IHI9KDAsIGEucHJvY2Vzc0RpbXMzRCkoZS5kaW1zKSxvPSgwLCBhLnByb2Nlc3NEaW1zM0QpKHQpLHM9dGhpcy5yZXNoYXBlUGFja2VkKGUsciksdT10aGlzLnJ1bigoMCwgYS5jcmVhdGVQYWNrZWRSZXNoYXBlM0RQcm9ncmFtSW5mb0xvYWRlcikodGhpcyxzLG8pLFtzXSk7cmV0dXJuIHRoaXMucmVzaGFwZVBhY2tlZCh1LHQpfWNhc3QoZSx0KXtjb25zdCBuPXRoaXMuZ2V0T3JDcmVhdGVUZXh0dXJlRGF0YShlLHAuVGV4dHVyZVR5cGUudW5wYWNrZWQpO3JldHVybiB0aGlzLmNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUobix0LG4udGV4dHVyZSkudGVuc29yfWNyZWF0ZVRleHR1cmVEYXRhRnJvbVRleHR1cmUoZSx0LG4scixpKXtjb25zdCBzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7dGVuc29yOnJ8fG5ldyBvLlRlbnNvcihlLnVucGFja2VkU2hhcGUsdCwoZT0+dGhpcy5yZWFkVGV4dHVyZShzKSksKGFzeW5jIGU9PnRoaXMucmVhZFRleHR1cmVBc3luYyhzKSksdm9pZCAwLGkpLHRleHR1cmU6bn0pO3JldHVybiB0aGlzLnNldFRleHR1cmVEYXRhKHMudGVuc29yLmRhdGFJZCxzLGUuaXNQYWNrZWQpLHN9Z2V0VGV4dHVyZURhdGEoZSx0PSExKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIoZSk/dGhpcy5zZXNzaW9uLmdldFRleHR1cmVEYXRhKGUsdCk6dD90aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUuZ2V0KGUpOnRoaXMudW5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmdldChlKX1zZXRUZXh0dXJlRGF0YShlLHQsbj0hMSl7dGhpcy5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIoZSk/dGhpcy5zZXNzaW9uLnNldFRleHR1cmVEYXRhKGUsdCxuKToobj90aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU6dGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGUpLnNldChlLHQpO31pc1RleHR1cmVMYXlvdXRDYWNoZWQoZSx0PSExKXtyZXR1cm4gISF0aGlzLmdldFRleHR1cmVEYXRhKGUuZGF0YUlkLHQpfWRpc3Bvc2UoKXt0aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIuY2xlYXJBY3RpdmVUZXh0dXJlcygpLHRoaXMucGFja2VkVGV4dHVyZURhdGFDYWNoZS5mb3JFYWNoKChlPT50aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVsZWFzZVRleHR1cmUoZSkpKSx0aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcCx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZS5mb3JFYWNoKChlPT50aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVsZWFzZVRleHR1cmUoZSkpKSx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZT1uZXcgTWFwO31yZWFkVGV4dHVyZShlKXtyZXR1cm4gZS5pc1BhY2tlZD90aGlzLnJlYWRUZXh0dXJlKHRoaXMudW5wYWNrKGUpKTp0aGlzLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQuaXNGbG9hdDMyRG93bmxvYWRTdXBwb3J0ZWQ/dGhpcy5zZXNzaW9uLnRleHR1cmVNYW5hZ2VyLnJlYWRUZXh0dXJlKGUsZS50ZW5zb3IudHlwZSxlLmNoYW5uZWxzKTp0aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVhZFVpbnQ4VGV4dHVyZUFzRmxvYXQoKDAsIHUuZW5jb2RlQXNVaW50OCkodGhpcyxlKSl9YXN5bmMgcmVhZFRleHR1cmVBc3luYyhlKXtyZXR1cm4gZS5pc1BhY2tlZD90aGlzLnJlYWRUZXh0dXJlQXN5bmModGhpcy51bnBhY2soZSkpOnRoaXMuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC5pc0Zsb2F0MzJEb3dubG9hZFN1cHBvcnRlZD90aGlzLnNlc3Npb24udGV4dHVyZU1hbmFnZXIucmVhZFRleHR1cmVBc3luYyhlLGUudGVuc29yLnR5cGUsZS5jaGFubmVscyk6dGhpcy5zZXNzaW9uLnRleHR1cmVNYW5hZ2VyLnJlYWRVaW50OFRleHR1cmVBc0Zsb2F0KCgwLCB1LmVuY29kZUFzVWludDgpKHRoaXMsZSkpfXBhY2soZSl7cmV0dXJuIHRoaXMuZXhlY3V0ZVByb2dyYW0oKDAsIHMuY3JlYXRlUGFja1Byb2dyYW1JbmZvTG9hZGVyKSh0aGlzLGUudGVuc29yKSxbZS50ZW5zb3JdKX11bnBhY2soZSl7cmV0dXJuIHRoaXMuZXhlY3V0ZVByb2dyYW0oKDAsIGwuY3JlYXRlVW5wYWNrUHJvZ3JhbUluZm9Mb2FkZXIpKHRoaXMsZS50ZW5zb3IpLFtlLnRlbnNvcl0pfX07fSw0MTEwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzJiZ0aGlzLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9bik7dmFyIG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pO28mJiEoImdldCJpbiBvPyF0Ll9fZXNNb2R1bGU6by53cml0YWJsZXx8by5jb25maWd1cmFibGUpfHwobz17ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtuXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLG8pO306ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9biksZVtyXT10W25dO30pLG89dGhpcyYmdGhpcy5fX3NldE1vZHVsZURlZmF1bHR8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KTt9OmZ1bmN0aW9uKGUsdCl7ZS5kZWZhdWx0PXQ7fSksaT10aGlzJiZ0aGlzLl9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24oZSl7aWYoZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciB0PXt9O2lmKG51bGwhPWUpZm9yKHZhciBuIGluIGUpImRlZmF1bHQiIT09biYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJnIodCxlLG4pO3JldHVybiBvKHQsZSksdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuV0VCR0xfT1BfUkVTT0xWRV9SVUxFUz12b2lkIDA7Y29uc3Qgcz1uKDg4MTcpLGE9aShuKDUxOTQpKSx1PW4oNDc1MiksbD1uKDY2NjgpLGM9big5NzU0KSxwPW4oNTA0MiksZD1uKDY3NDIpLGY9big0MTI1KSxoPW4oNjE0OSksZz1uKDUzNzgpLGI9big2OTgxKSxtPW4oNzQxMykseT1uKDcwMDYpLHY9big4Mjc2KSxfPW4oNTU2NSksdz1uKDI4MzQpLFQ9bigxMDEwKSx4PW4oODEyNiksTz1uKDI4MDEpLFM9big1NjUpLEE9bigyNDQ0KSxQPW4oODE1KSxJPW4oNTY0KSxFPW4oNTQxNiksRD1uKDEyNDApLCQ9big1OTQ0KSxrPW4oNTcwNyksRj1pKG4oOTA4NykpLE49big3ODYyKSxqPW4oMzk4MCk7dC5XRUJHTF9PUF9SRVNPTFZFX1JVTEVTPVtbIkFicyIsIiIsIjYrIixGLmFic10sWyJBY29zIiwiIiwiNysiLEYuYWNvc10sWyJBZGQiLCIiLCI3KyIsYS5hZGRdLFsiQW5kIiwiIiwiNysiLGEuYW5kXSxbIkFzaW4iLCIiLCI3KyIsRi5hc2luXSxbIkF0YW4iLCIiLCI3KyIsRi5hdGFuXSxbIkF2ZXJhZ2VQb29sIiwiIiwiNysiLHcuYXZlcmFnZVBvb2wsdy5wYXJzZUF2ZXJhZ2VQb29sQXR0cmlidXRlc10sWyJCYXRjaE5vcm1hbGl6YXRpb24iLCIiLCI3KyIscy5iYXRjaE5vcm1hbGl6YXRpb24scy5wYXJzZUJhdGNoTm9ybWFsaXphdGlvbkF0dHJpYnV0ZXNdLFsiQ2FzdCIsIiIsIjYrIix1LmNhc3QsdS5wYXJzZUNhc3RBdHRyaWJ1dGVzXSxbIkNlaWwiLCIiLCI2KyIsRi5jZWlsXSxbIkNsaXAiLCIiLCI2LTEwIixGLmNsaXAsRi5wYXJzZUNsaXBBdHRyaWJ1dGVzXSxbIkNsaXAiLCIiLCIxMSsiLEYuY2xpcFYxMV0sWyJDb25jYXQiLCIiLCI0KyIsbC5jb25jYXQsbC5wYXJzZUNvbmNhdEF0dHJpYnV0ZXNdLFsiQ29udiIsIiIsIjErIixjLmNvbnYsYy5wYXJzZUNvbnZBdHRyaWJ1dGVzXSxbIkNvbnZUcmFuc3Bvc2UiLCIiLCIxKyIscC5jb252VHJhbnNwb3NlLHAucGFyc2VDb252VHJhbnNwb3NlQXR0cmlidXRlc10sWyJDb3MiLCIiLCI3KyIsRi5jb3NdLFsiRGl2IiwiIiwiNysiLGEuZGl2XSxbIkRyb3BvdXQiLCIiLCI3KyIsRi5pZGVudGl0eV0sWyJEZXB0aFRvU3BhY2UiLCIiLCIxKyIsZC5kZXB0aFRvU3BhY2UsZC5wYXJzZURlcHRoVG9TcGFjZUF0dHJpYnV0ZXNdLFsiRXF1YWwiLCIiLCI3KyIsYS5lcXVhbF0sWyJFbHUiLCIiLCI2KyIsRi5lbHUsRi5wYXJzZUVsdUF0dHJpYnV0ZXNdLFsiRXhwIiwiIiwiNisiLEYuZXhwXSxbIkZsYXR0ZW4iLCIiLCIxKyIsZi5mbGF0dGVuLGYucGFyc2VGbGF0dGVuQXR0cmlidXRlc10sWyJGbG9vciIsIiIsIjYrIixGLmZsb29yXSxbIkZ1c2VkQ29udiIsImNvbS5taWNyb3NvZnQiLCIxKyIsYy5jb252LGMucGFyc2VDb252QXR0cmlidXRlc10sWyJHYXRoZXIiLCIiLCIxKyIsaC5nYXRoZXIsaC5wYXJzZUdhdGhlckF0dHJpYnV0ZXNdLFsiR2VtbSIsIiIsIjctMTAiLGcuZ2VtbSxnLnBhcnNlR2VtbUF0dHJpYnV0ZXNWN10sWyJHZW1tIiwiIiwiMTErIixnLmdlbW0sZy5wYXJzZUdlbW1BdHRyaWJ1dGVzVjExXSxbIkdsb2JhbEF2ZXJhZ2VQb29sIiwiIiwiMSsiLHcuZ2xvYmFsQXZlcmFnZVBvb2wsdy5wYXJzZUdsb2JhbEF2ZXJhZ2VQb29sQXR0cmlidXRlc10sWyJHbG9iYWxNYXhQb29sIiwiIiwiMSsiLHcuZ2xvYmFsTWF4UG9vbF0sWyJHcmVhdGVyIiwiIiwiNysiLGEuZ3JlYXRlcl0sWyJJZGVudGl0eSIsIiIsIjErIixGLmlkZW50aXR5XSxbIkltYWdlU2NhbGVyIiwiIiwiMSsiLGIuaW1hZ2VTY2FsZXIsYi5wYXJzZUltYWdlU2NhbGVyQXR0cmlidXRlc10sWyJJbnN0YW5jZU5vcm1hbGl6YXRpb24iLCIiLCI2KyIsbS5pbnN0YW5jZU5vcm1hbGl6YXRpb24sbS5wYXJzZUluc3RhbmNlTm9ybWFsaXphdGlvbkF0dHJpYnV0ZXNdLFsiTGVha3lSZWx1IiwiIiwiNisiLEYubGVha3lSZWx1LEYucGFyc2VMZWFreVJlbHVBdHRyaWJ1dGVzXSxbIkxlc3MiLCIiLCI3KyIsYS5sZXNzXSxbIkxSTiIsIiIsIjErIix5Lmxybix5LnBhcnNlTHJuQXR0cmlidXRlc10sWyJMb2ciLCIiLCI2KyIsRi5sb2ddLFsiTWF0TXVsIiwiIiwiMSsiLHYubWF0TXVsLHYucGFyc2VNYXRNdWxBdHRyaWJ1dGVzXSxbIk1heFBvb2wiLCIiLCIxKyIsdy5tYXhQb29sLHcucGFyc2VNYXhQb29sQXR0cmlidXRlc10sWyJNdWwiLCIiLCI3KyIsYS5tdWxdLFsiTmVnIiwiIiwiNisiLEYubmVnXSxbIk5vdCIsIiIsIjErIixGLm5vdF0sWyJPciIsIiIsIjcrIixhLm9yXSxbIlBhZCIsIiIsIjItMTAiLF8ucGFkVjIsXy5wYXJzZVBhZEF0dHJpYnV0ZXNWMl0sWyJQYWQiLCIiLCIxMSsiLF8ucGFkVjExLF8ucGFyc2VQYWRBdHRyaWJ1dGVzVjExXSxbIlBvdyIsIiIsIjcrIixhLnBvd10sWyJQUmVsdSIsIiIsIjcrIixhLnBSZWx1XSxbIlJlZHVjZUxvZ1N1bSIsIiIsIjErIixULnJlZHVjZUxvZ1N1bSxULnBhcnNlUmVkdWNlQXR0cmlidXRlc10sWyJSZWR1Y2VNYXgiLCIiLCIxKyIsVC5yZWR1Y2VNYXgsVC5wYXJzZVJlZHVjZUF0dHJpYnV0ZXNdLFsiUmVkdWNlTWVhbiIsIiIsIjErIixULnJlZHVjZU1lYW4sVC5wYXJzZVJlZHVjZUF0dHJpYnV0ZXNdLFsiUmVkdWNlTWluIiwiIiwiMSsiLFQucmVkdWNlTWluLFQucGFyc2VSZWR1Y2VBdHRyaWJ1dGVzXSxbIlJlZHVjZVByb2QiLCIiLCIxKyIsVC5yZWR1Y2VQcm9kLFQucGFyc2VSZWR1Y2VBdHRyaWJ1dGVzXSxbIlJlZHVjZVN1bSIsIiIsIjEtMTIiLFQucmVkdWNlU3VtLFQucGFyc2VSZWR1Y2VBdHRyaWJ1dGVzXSxbIlJlZHVjZVN1bVNxdWFyZSIsIiIsIjErIixULnJlZHVjZUxvZ1N1bVNxdWFyZSxULnBhcnNlUmVkdWNlQXR0cmlidXRlc10sWyJSZWx1IiwiIiwiNisiLEYucmVsdV0sWyJSZXNoYXBlIiwiIiwiNSsiLHgucmVzaGFwZV0sWyJSZXNpemUiLCIiLCIxMCIsTy5yZXNpemUsTy5wYXJzZVJlc2l6ZUF0dHJpYnV0ZXNWMTBdLFsiUmVzaXplIiwiIiwiMTErIixPLnJlc2l6ZSxPLnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMV0sWyJTaGFwZSIsIiIsIjErIixTLnNoYXBlXSxbIlNpZ21vaWQiLCIiLCI2KyIsRi5zaWdtb2lkXSxbIlNpbiIsIiIsIjcrIixGLnNpbl0sWyJTbGljZSIsIiIsIjEwKyIsQS5zbGljZVYxMF0sWyJTbGljZSIsIiIsIjEtOSIsQS5zbGljZSxBLnBhcnNlU2xpY2VBdHRyaWJ1dGVzXSxbIlNvZnRtYXgiLCIiLCIxLTEyIixQLnNvZnRtYXgsUC5wYXJzZVNvZnRtYXhBdHRyaWJ1dGVzXSxbIlNvZnRtYXgiLCIiLCIxMysiLFAuc29mdG1heFYxMyxQLnBhcnNlU29mdG1heEF0dHJpYnV0ZXNWMTNdLFsiU3BsaXQiLCIiLCIyLTEyIixJLnNwbGl0LEkucGFyc2VTcGxpdEF0dHJpYnV0ZXNdLFsiU3FydCIsIiIsIjYrIixGLnNxcnRdLFsiU3F1ZWV6ZSIsIiIsIjEtMTIiLEUuc3F1ZWV6ZSxFLnBhcnNlU3F1ZWV6ZUF0dHJpYnV0ZXNdLFsiU3F1ZWV6ZSIsIiIsIjEzKyIsRS5zcXVlZXplVjEzXSxbIlN1YiIsIiIsIjcrIixhLnN1Yl0sWyJTdW0iLCIiLCI2KyIsRC5zdW1dLFsiVGFuIiwiIiwiNysiLEYudGFuXSxbIlRhbmgiLCIiLCI2KyIsRi50YW5oXSxbIlRpbGUiLCIiLCI2KyIsJC50aWxlXSxbIlRyYW5zcG9zZSIsIiIsIjErIixrLnRyYW5zcG9zZSxrLnBhcnNlVHJhbnNwb3NlQXR0cmlidXRlc10sWyJVcHNhbXBsZSIsIiIsIjctOCIsai51cHNhbXBsZSxqLnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzVjddLFsiVXBzYW1wbGUiLCIiLCI5IixqLnVwc2FtcGxlLGoucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXNWOV0sWyJVbnNxdWVlemUiLCIiLCIxLTEyIixOLnVuc3F1ZWV6ZSxOLnBhcnNlVW5zcXVlZXplQXR0cmlidXRlc10sWyJVbnNxdWVlemUiLCIiLCIxMysiLE4udW5zcXVlZXplVjEzXSxbIlhvciIsIiIsIjcrIixhLnhvcl1dO30sODgxNzooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VCYXRjaE5vcm1hbGl6YXRpb25BdHRyaWJ1dGVzPXQuYmF0Y2hOb3JtYWxpemF0aW9uPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDY3NTcpLGk9big1NjM5KSxzPXtuYW1lOiJCYXRjaE5vcm1hbGl6YXRpb24iLGlucHV0TmFtZXM6WyJBIiwiU2NhbGUiLCJCIiwiTWVhbiIsIlZhcmlhbmNlIl0saW5wdXRUeXBlczpbaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkLGkuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXX07dC5iYXRjaE5vcm1hbGl6YXRpb249KGUsdCxuKT0+KHUodCksW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXksZ2V0OigpPT5hKGUsdCxuKX0pLHQpXSksdC5wYXJzZUJhdGNoTm9ybWFsaXphdGlvbkF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJlcHNpbG9uIiwxZS01KSxuPWUuYXR0cmlidXRlcy5nZXRGbG9hdCgibW9tZW50dW0iLC45KSxvPWUuYXR0cmlidXRlcy5nZXRJbnQoInNwYXRpYWwiLDEpO3JldHVybiAoMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtlcHNpbG9uOnQsbW9tZW50dW06bixzcGF0aWFsOm99KX07Y29uc3QgYT0oZSx0LG4pPT57Y29uc3Qgcj0oMCwgby5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksYT10WzBdLmRpbXMubGVuZ3RoLFt1LGxdPWUuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KHRbMV0uZGltcyxpLlRleHR1cmVUeXBlLnVucGFja2VkKSxjPWBcbiAgZmxvYXQgcHJvY2VzcyhpbnRbJHthfV0gaW5kaWNlcykge1xuICAgIHZlYzIgcG9zaXRpb24gPSBvZmZzZXRUb0Nvb3JkcyhpbmRpY2VzWzFdLCAke3V9LCAke2x9KTtcbiAgICBmbG9hdCBzY2FsZSA9IGdldENvbG9yQXNGbG9hdCgke3IudGV4dHVyZTJEfShTY2FsZSwgcG9zaXRpb24pKTtcbiAgICBmbG9hdCBtZWFuID0gZ2V0Q29sb3JBc0Zsb2F0KCR7ci50ZXh0dXJlMkR9KE1lYW4sIHBvc2l0aW9uKSk7XG4gICAgZmxvYXQgdmFyaWFuY2UgPSBnZXRDb2xvckFzRmxvYXQoJHtyLnRleHR1cmUyRH0oVmFyaWFuY2UsIHBvc2l0aW9uKSk7XG4gICAgZmxvYXQgYiA9IGdldENvbG9yQXNGbG9hdCgke3IudGV4dHVyZTJEfShCLCBwb3NpdGlvbikpO1xuXG4gICAgcmV0dXJuIHNjYWxlICogKCAoX0EoaW5kaWNlcykgLSBtZWFuKSAvIHNxcnQodmFyaWFuY2UgKyBmbG9hdCgke24uZXBzaWxvbn0pKSApICsgYjtcbiAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7b3V0cHV0OntkaW1zOnRbMF0uZGltcyx0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6Y30pfSx1PWU9PntpZighZXx8NSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQmF0Y2hOb3JtYWxpemF0aW9uIHJlcXVpcmVzIDUgaW5wdXRzLiIpO2NvbnN0IHQ9ZVswXSxuPWVbMV0scj1lWzJdLG89ZVszXSxpPWVbNF07aWYodC5kaW1zLmxlbmd0aDwzfHwxIT09bi5kaW1zLmxlbmd0aHx8MSE9PXIuZGltcy5sZW5ndGh8fDEhPT1vLmRpbXMubGVuZ3RofHwxIT09aS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgaW5wdXQgc2hhcGUuIik7aWYobi5kaW1zWzBdIT09dC5kaW1zWzFdfHxyLmRpbXNbMF0hPT10LmRpbXNbMV18fG8uZGltc1swXSE9PXQuZGltc1sxXXx8aS5kaW1zWzBdIT09dC5kaW1zWzFdKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZigiZmxvYXQzMiIhPT10LnR5cGUmJiJmbG9hdDY0IiE9PXQudHlwZXx8ImZsb2F0MzIiIT09bi50eXBlJiYiZmxvYXQ2NCIhPT1uLnR5cGV8fCJmbG9hdDMyIiE9PXIudHlwZSYmImZsb2F0NjQiIT09ci50eXBlfHwiZmxvYXQzMiIhPT1vLnR5cGUmJiJmbG9hdDY0IiE9PW8udHlwZXx8ImZsb2F0MzIiIT09aS50eXBlJiYiZmxvYXQ2NCIhPT1pLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGlucHV0IHRlbnNvciB0eXBlcy4iKX07fSw1MTk0OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC54b3I9dC5zdWI9dC5wUmVsdT10LnBvdz10Lm9yPXQubXVsPXQubGVzcz10LmdyZWF0ZXI9dC5lcXVhbD10LmRpdj10LmFuZD10LmFkZD10Lmdsc2xQUmVsdT10Lmdsc2xQb3c9dC5nbHNsWG9yPXQuZ2xzbE9yPXQuZ2xzbEFuZD10Lmdsc2xMZXNzPXQuZ2xzbEdyZWF0ZXI9dC5nbHNsRXF1YWw9dC5nbHNsU3ViPXQuZ2xzbE11bD10Lmdsc2xEaXY9dC5nbHNsQWRkPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDE5OTcpLGk9big2NzU3KSxzPW4oNTYzOSk7ZnVuY3Rpb24gYSgpe2NvbnN0IGU9ImFkZF8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBhICsgYjtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2MSArIHYyO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gdSgpe2NvbnN0IGU9ImRpdl8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBhIC8gYjtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2MSAvIHYyO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gbCgpe2NvbnN0IGU9Im11bF8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBhICogYjtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2MSAqIHYyO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gYygpe2NvbnN0IGU9InN1Yl8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBhIC0gYjtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2MSAtIHYyO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gcCgpe2NvbnN0IGU9ImVxdWFsXyI7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfShmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgcmV0dXJuIGZsb2F0KGEgPT0gYik7XG4gIH1cbiAgdmVjNCAke2V9KHZlYzQgdjEsIHZlYzQgdjIpIHtcbiAgICByZXR1cm4gdmVjNChlcXVhbCh2MSwgdjIpKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOm8uRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGQoKXtjb25zdCBlPSJncmVhdGVyXyI7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfShmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgcmV0dXJuIGZsb2F0KGEgPiBiKTtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2ZWM0KCB2MS5yID4gdjIuciAsXG4gICAgICB2MS5nID4gdjIuZyxcbiAgICAgIHYxLmIgPiB2Mi5iLFxuICAgICAgdjEuYSA+IHYyLmEgKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOm8uRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGYoKXtjb25zdCBlPSJsZXNzXyI7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfShmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgcmV0dXJuIGZsb2F0KGEgPCBiKTtcbiAgfVxuICB2ZWM0ICR7ZX0odmVjNCB2MSwgdmVjNCB2Mikge1xuICAgIHJldHVybiB2ZWM0KCB2MS5yIDwgdjIuciAsXG4gICAgICAgICAgICAgICAgdjEuZyA8IHYyLmcsXG4gICAgICAgICAgICAgICAgdjEuYiA8IHYyLmIsXG4gICAgICAgICAgICAgICAgdjEuYSA8IHYyLmEgKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOm8uRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGgoKXtjb25zdCBlPSJhbmRfIjtyZXR1cm4ge2JvZHk6YFxuICBmbG9hdCAke2V9KGZsb2F0IGEsIGZsb2F0IGIpIHtcbiAgICByZXR1cm4gZmxvYXQoIGJvb2woYSkgJiYgYm9vbChiKSApO1xuICB9XG4gIHZlYzQgJHtlfSh2ZWM0IHYxLCB2ZWM0IHYyKSB7XG4gICAgYnZlYzQgYjEgPSBidmVjNCh2MSk7XG4gICAgYnZlYzQgYjIgPSBidmVjNCh2Mik7XG4gICAgcmV0dXJuIHZlYzQoIGIxLnIgJiYgYjIuciAsXG4gICAgICAgICAgICAgICAgYjEuZyAmJiBiMi5nLFxuICAgICAgICAgICAgICAgIGIxLmIgJiYgYjIuYixcbiAgICAgICAgICAgICAgICBiMS5hICYmIGIyLmEgKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOm8uRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIGcoKXtjb25zdCBlPSJvcl8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBmbG9hdCggYm9vbChhKSB8fCBib29sKGIpICk7XG4gIH1cbiAgdmVjNCAke2V9KHZlYzQgdjEsIHZlYzQgdjIpIHtcbiAgICBidmVjNCBiMSA9IGJ2ZWM0KHYxKTtcbiAgICBidmVjNCBiMiA9IGJ2ZWM0KHYyKTtcbiAgICByZXR1cm4gdmVjNCggYjEuciB8fCBiMi5yICxcbiAgICAgICAgICAgICAgICBiMS5nIHx8IGIyLmcsXG4gICAgICAgICAgICAgICAgYjEuYiB8fCBiMi5iLFxuICAgICAgICAgICAgICAgIGIxLmEgfHwgYjIuYSApO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gYigpe2NvbnN0IGU9Inhvcl8iO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX0oZmxvYXQgYSwgZmxvYXQgYikge1xuICAgIHJldHVybiBmbG9hdCggYm9vbChhKSBeXiBib29sKGIpICk7XG4gIH1cbiAgdmVjNCAke2V9KHZlYzQgdjEsIHZlYzQgdjIpIHtcbiAgICBidmVjNCBiMSA9IGJ2ZWM0KHYxKTtcbiAgICBidmVjNCBiMiA9IGJ2ZWM0KHYyKTtcbiAgICByZXR1cm4gdmVjNCggYjEuciBeXiBiMi5yICxcbiAgICAgICAgICAgICAgICBiMS5nIF5eIGIyLmcsXG4gICAgICAgICAgICAgICAgYjEuYiBeXiBiMi5iLFxuICAgICAgICAgICAgICAgIGIxLmEgXl4gYjIuYSApO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gbSgpe3JldHVybiBmdW5jdGlvbihlKXtjb25zdCB0PWAke2V9X2A7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHt0fShmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgcmV0dXJuICR7ZX0oYSwgYik7XG4gIH1cbiAgdmVjNCAke3R9KHZlYzQgdjEsIHZlYzQgdjIpIHtcbiAgICByZXR1cm4gJHtlfSh2MSwgdjIpO1xuICB9XG4gIGAsbmFtZTp0LHR5cGU6by5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19KCJwb3ciKX1mdW5jdGlvbiB5KCl7Y29uc3QgZT0icHJlbHVfIjtyZXR1cm4ge2JvZHk6YFxuICBmbG9hdCAke2V9KGZsb2F0IGEsIGZsb2F0IGIpIHtcbiAgICByZXR1cm4gYSA8IDAuMCA/IGEgKiBiOiBhO1xuICB9XG4gIHZlYzQgJHtlfSh2ZWM0IHYxLCB2ZWM0IHYyKSB7XG4gICAgcmV0dXJuIHZlYzQoXG4gICAgICB2MS5yIDwgMC4wID8gdjEuciAqIHYyLnI6IHYxLnIsXG4gICAgICB2MS5nIDwgMC4wID8gdjEuZyAqIHYyLmc6IHYxLmcsXG4gICAgICB2MS5iIDwgMC4wID8gdjEuYiAqIHYyLmI6IHYxLmIsXG4gICAgICB2MS5hIDwgMC4wID8gdjEuYSAqIHYyLmE6IHYxLmFcbiAgICAgICk7XG4gIH1cbiAgYCxuYW1lOmUsdHlwZTpvLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX10Lmdsc2xBZGQ9YSx0Lmdsc2xEaXY9dSx0Lmdsc2xNdWw9bCx0Lmdsc2xTdWI9Yyx0Lmdsc2xFcXVhbD1wLHQuZ2xzbEdyZWF0ZXI9ZCx0Lmdsc2xMZXNzPWYsdC5nbHNsQW5kPWgsdC5nbHNsT3I9Zyx0Lmdsc2xYb3I9Yix0Lmdsc2xQb3c9bSx0Lmdsc2xQUmVsdT15O2NvbnN0IHY9KGUsdCxuLHI9dFswXS50eXBlLG8pPT57Y29uc3QgaT1lLnNlc3Npb24ucGFjaz9zLlRleHR1cmVUeXBlLnBhY2tlZDpzLlRleHR1cmVUeXBlLnVucGFja2VkO3JldHVybiB7bmFtZTpuLm5hbWUsaW5wdXROYW1lczpbIkEiLCJCIl0saW5wdXRUeXBlczpbaSxpXSxjYWNoZUhpbnQ6byxnZXQ6KCk9Pl8oZSx0LG4scil9fSxfPShlLHQsbixvPXRbMF0udHlwZSk9Pntjb25zdCBhPWUuc2Vzc2lvbi5wYWNrP3MuVGV4dHVyZVR5cGUucGFja2VkOnMuVGV4dHVyZVR5cGUudW5wYWNrZWQsdT0hci5TaGFwZVV0aWwuYXJlRXF1YWwodFswXS5kaW1zLHRbMV0uZGltcyk7bGV0IGw9dFswXS5kaW1zO2NvbnN0IGM9ZS5zZXNzaW9uLnBhY2s7aWYodSl7Y29uc3Qgcz1yLkJyb2FkY2FzdFV0aWwuY2FsY1NoYXBlKHRbMF0uZGltcyx0WzFdLmRpbXMsITEpO2lmKCFzKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgcGVyZm9ybSBiaW5hcnkgb3Agb24gdGhlIGdpdmVuIHRlbnNvcnMiKTtsPXM7Y29uc3QgdT1sLmxlbmd0aCxwPTAhPT10WzBdLmRpbXMubGVuZ3RoP3RbMF0uZGltcy5sZW5ndGg6MSxkPTAhPT10WzFdLmRpbXMubGVuZ3RoP3RbMV0uZGltcy5sZW5ndGg6MSxmPTAhPT10WzBdLmRpbXMubGVuZ3RoPyJiY2FzdEluZGljZXNfQShpbmRpY2VzLCBhaW5kaWNlcyk7IjoiYWluZGljZXNbMF0gPSAwOyIsaD0wIT09dFsxXS5kaW1zLmxlbmd0aD8iYmNhc3RJbmRpY2VzX0IoaW5kaWNlcywgYmluZGljZXMpOyI6ImJpbmRpY2VzWzBdID0gMDsiLGc9KDAsIGkuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLGI9Yz9gXG4gICAgICAke24uYm9keX1cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgdmVjNCBhID0gZ2V0QUF0T3V0Q29vcmRzKCk7XG4gICAgICAgIHZlYzQgYiA9IGdldEJBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHJlc3VsdCA9ICR7bi5uYW1lfShhLCBiKTtcbiAgICAgICAgJHtnLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9YDpgXG4gICAgICAke24uYm9keX1cbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHt1fV0pIHtcbiAgICAgICAgaW50IGFpbmRpY2VzWyR7cH1dO1xuICAgICAgICBpbnQgYmluZGljZXNbJHtkfV07XG4gICAgICAgICR7Zn1cbiAgICAgICAgJHtofVxuICAgICAgICByZXR1cm4gJHtuLm5hbWV9KF9BKGFpbmRpY2VzKSwgX0IoYmluZGljZXMpKTtcbiAgICAgIH1gO3JldHVybiB7bmFtZTpuLm5hbWUsaW5wdXROYW1lczpbIkEiLCJCIl0saW5wdXRUeXBlczpbYSxhXSxvdXRwdXQ6e2RpbXM6bCx0eXBlOm8sdGV4dHVyZVR5cGU6YX0sc2hhZGVyU291cmNlOmIsaGFzTWFpbjpjfX1jb25zdCBwPSgwLCBpLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSxkPWBcbiAgICAke24uYm9keX1cbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICB2ZWM0IHYxID0gJHtwLnRleHR1cmUyRH0oQSwgVGV4Q29vcmRzKTtcbiAgICAgIHZlYzQgdjIgPSAke3AudGV4dHVyZTJEfShCLCBUZXhDb29yZHMpO1xuICAgICAgdmVjNCByZXN1bHQgPSAke24ubmFtZX0odjEsIHYyKTtcbiAgICAgICR7cC5vdXRwdXR9ID0gcmVzdWx0O1xuICAgIH1cbiAgICBgO3JldHVybiB7bmFtZTpuLm5hbWUsaW5wdXROYW1lczpbIkEiLCJCIl0saW5wdXRUeXBlczpbYSxhXSxvdXRwdXQ6e2RpbXM6dFswXS5kaW1zLHR5cGU6byx0ZXh0dXJlVHlwZTphfSxzaGFkZXJTb3VyY2U6ZCxoYXNNYWluOiEwfX07dC5hZGQ9KGUsdCk9PltlLnJ1bih2KGUsdCxhKCkpLHQpXSx0LmFuZD0oZSx0KT0+W2UucnVuKHYoZSx0LGgoKSwiYm9vbCIpLHQpXSx0LmRpdj0oZSx0KT0+W2UucnVuKHYoZSx0LHUoKSksdCldLHQuZXF1YWw9KGUsdCk9PltlLnJ1bih2KGUsdCxwKCksImJvb2wiKSx0KV0sdC5ncmVhdGVyPShlLHQpPT5bZS5ydW4odihlLHQsZCgpLCJib29sIiksdCldLHQubGVzcz0oZSx0KT0+W2UucnVuKHYoZSx0LGYoKSwiYm9vbCIpLHQpXSx0Lm11bD0oZSx0KT0+W2UucnVuKHYoZSx0LGwoKSksdCldLHQub3I9KGUsdCk9PltlLnJ1bih2KGUsdCxnKCksImJvb2wiKSx0KV0sdC5wb3c9KGUsdCk9PltlLnJ1bih2KGUsdCxtKCkpLHQpXSx0LnBSZWx1PShlLHQpPT5bZS5ydW4odihlLHQseSgpKSx0KV0sdC5zdWI9KGUsdCk9PltlLnJ1bih2KGUsdCxjKCkpLHQpXSx0Lnhvcj0oZSx0KT0+W2UucnVuKHYoZSx0LGIoKSwiYm9vbCIpLHQpXTt9LDQ3NTI6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlQ2FzdEF0dHJpYnV0ZXM9dC5jYXN0PXZvaWQgMDtjb25zdCByPW4oNzI3Myk7dC5jYXN0PShlLHQsbik9PihvKHQpLFtlLmNhc3QodFswXSxuKV0pLHQucGFyc2VDYXN0QXR0cmlidXRlcz1lPT5yLlByb3RvVXRpbC50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byhlLmF0dHJpYnV0ZXMuZ2V0SW50KCJ0byIpKTtjb25zdCBvPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ2FzdCByZXF1aXJlcyAxIGlucHV0LiIpO2lmKCJzdHJpbmciPT09ZVswXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDQ1OTU6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZVBhY2tlZENvbmNhdFByb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCByPW4oNjc1Nyksbz1uKDU2MzkpLGk9big0MzIpLHM9big1NjE0KTt0LmNyZWF0ZVBhY2tlZENvbmNhdFByb2dyYW1JbmZvTG9hZGVyPShlLHQsbik9Pntjb25zdCB1PShsPXQubGVuZ3RoLGM9bi5jYWNoZUtleSx7bmFtZToiQ29uY2F0IChwYWNrZWQpIixpbnB1dE5hbWVzOkFycmF5LmZyb20oe2xlbmd0aDpsfSwoKGUsdCk9PmBYJHt0fWApKSxpbnB1dFR5cGVzOkFycmF5KGwpLmZpbGwoby5UZXh0dXJlVHlwZS5wYWNrZWQpLGNhY2hlSGludDpjfSk7dmFyIGwsYztyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHUpLHtnZXQ6KCk9PigoZSx0LG4sdSk9Pntjb25zdCBsPW5bMF0uZGltcy5zbGljZSgpO2lmKHU+PWwubGVuZ3RofHx1PC0xKmwubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiYXhpcyBzcGVjaWZpZWQgZm9yIGNvbmNhdCBkb2Vzbid0IG1hdGNoIGlucHV0IGRpbWVuc2lvbmFsaXR5Iik7dTwwJiYodT1sLmxlbmd0aCt1KTtjb25zdCBjPWwuc2xpY2UoMCk7Zm9yKGxldCBlPTE7ZTxuLmxlbmd0aDtlKyspe2NvbnN0IHQ9bltlXS5kaW1zLnNsaWNlKCk7Zm9yKGxldCBlPTA7ZTxsLmxlbmd0aDtlKyspaWYoZT09PXUpY1t1XSs9dFtlXTtlbHNlIGlmKGxbZV0hPT10W2VdKXRocm93IG5ldyBFcnJvcigibm9uIGNvbmNhdCBkaW1lbnNpb25zIG11c3QgbWF0Y2giKX1jb25zdCBwPWMubGVuZ3RoLGQ9KDAsIHMuZ2V0Q2hhbm5lbHMpKCJjb29yZHMiLHApLGY9KDAsIGkuZ2V0Q29vcmRzRGF0YVR5cGUpKHApLGg9KDAsIHMudW5wYWNrRnJvbUNoYW5uZWwpKCksZz1uLm1hcCgoZT0+ZS5kaW1zKSksYj0oMCwgaS5nZXRHbENoYW5uZWxzKShwKSxtPW5ldyBBcnJheShnLmxlbmd0aC0xKTttWzBdPWdbMF1bdV07Zm9yKGxldCBlPTE7ZTxtLmxlbmd0aDtlKyspbVtlXT1tW2UtMV0rZ1tlXVt1XTtjb25zdCB5PWJbdV0sdj1iLnNsaWNlKC0yKSxfPWIuam9pbigpO2xldCB3PWBpZiAoJHt5fSA8ICR7bVswXX0pIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoXG4gICAgICAgICAgICBnZXRYMCgke199KSwgdmVjMigke3Yuam9pbigpfSkpO1xuICAgICAgICB9YDtmb3IobGV0IGU9MTtlPG0ubGVuZ3RoO2UrKyl7Y29uc3QgdD1tW2UtMV07dys9YFxuICAgICAgICAgICAgaWYgKCR7eX0gPCAke21bZV19ICAmJiAke3l9ID49ICR7bVtlLTFdfSkge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChcbiAgICAgICAgICAgICAgICBnZXRYJHtlfSgke2EoYix5LHQpfSksXG4gICAgICAgICAgICAgICAgdmVjMigke2Eodix5LHQpfSkpO1xuICAgICAgICAgICAgfWA7fWNvbnN0IFQ9bS5sZW5ndGgseD1tW20ubGVuZ3RoLTFdO3crPWBcbiAgICAgICAgICAgIHJldHVybiBnZXRDaGFubmVsKFxuICAgICAgICAgICAgICBnZXRYJHtUfSgke2EoYix5LHgpfSksXG4gICAgICAgICAgICAgIHZlYzIoJHthKHYseSx4KX0pKTtgO2NvbnN0IE89KDAsIHIuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFM9YFxuICAgICAgICAgICR7aH1cbiAgICAgICAgICBmbG9hdCBnZXRWYWx1ZSgke2IubWFwKChlPT4iaW50ICIrZSkpfSkge1xuICAgICAgICAgICAgJHt3fVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAgICR7Zn0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgICBpbnQgbGFzdERpbSA9IGNvb3Jkcy4ke2JbcC0xXX07XG4gICAgICAgICAgICBjb29yZHMuJHtiW3AtMV19ID0gY29vcmRzLiR7YltwLTJdfTtcbiAgICAgICAgICAgIGNvb3Jkcy4ke2JbcC0yXX0gPSBsYXN0RGltO1xuXG4gICAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoZ2V0VmFsdWUoJHtkfSksIDAuLCAwLiwgMC4pO1xuXG4gICAgICAgICAgICAke2RbcC0xXX0gPSAke2RbcC0xXX0gKyAxO1xuICAgICAgICAgICAgaWYgKCR7ZFtwLTFdfSA8ICR7Y1twLTFdfSkge1xuICAgICAgICAgICAgICByZXN1bHQuZyA9IGdldFZhbHVlKCR7ZH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAke2RbcC0yXX0gPSAke2RbcC0yXX0gKyAxO1xuICAgICAgICAgICAgaWYgKCR7ZFtwLTJdfSA8ICR7Y1twLTJdfSkge1xuICAgICAgICAgICAgICByZXN1bHQuYSA9IGdldFZhbHVlKCR7ZH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAke2RbcC0xXX0gPSAke2RbcC0xXX0gLSAxO1xuICAgICAgICAgICAgaWYgKCR7ZFtwLTJdfSA8ICR7Y1twLTJdfSAmJlxuICAgICAgICAgICAgICAgICR7ZFtwLTFdfSA8ICR7Y1twLTFdfSkge1xuICAgICAgICAgICAgICByZXN1bHQuYiA9IGdldFZhbHVlKCR7ZH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJHtPLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse291dHB1dDp7ZGltczpjLHR5cGU6blswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUucGFja2VkfSxzaGFkZXJTb3VyY2U6UyxoYXNNYWluOiEwfSl9KShlLHUsdCxuLmF4aXMpfSl9O2NvbnN0IGE9KGUsdCxuKT0+e2NvbnN0IHI9ZS5pbmRleE9mKHQpO3JldHVybiBlLm1hcCgoKGUsdCk9PnQ9PT1yP2Ake2V9IC0gJHtufWA6ZSkpLmpvaW4oKX07fSw2NjY4OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZUNvbmNhdEF0dHJpYnV0ZXM9dC5jb25jYXQ9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNTYzOSksaT1uKDQ1OTUpO3QuY29uY2F0PShlLHQsbik9PihwKHQpLGUuc2Vzc2lvbi5wYWNrJiZ0WzBdLmRpbXMubGVuZ3RoPjE/W2UucnVuKCgwLCBpLmNyZWF0ZVBhY2tlZENvbmNhdFByb2dyYW1JbmZvTG9hZGVyKShlLHQsbiksdCldOltlLnJ1bihzKGUsdCxuKSx0KV0pO2NvbnN0IHM9KGUsdCxuKT0+e2NvbnN0IHI9KGk9dC5sZW5ndGgscz1uLmNhY2hlS2V5LHtuYW1lOiJDb25jYXQiLGlucHV0TmFtZXM6QXJyYXkuZnJvbSh7bGVuZ3RoOml9LCgoZSx0KT0+YFgke3R9YCkpLGlucHV0VHlwZXM6QXJyYXkoaSkuZmlsbChvLlRleHR1cmVUeXBlLnVucGFja2VkKSxjYWNoZUhpbnQ6c30pO3ZhciBpLHM7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSx7Z2V0OigpPT4oKGUsdCxuLHIpPT57Y29uc3QgaT1uWzBdLmRpbXMuc2xpY2UoKTtpZihyPj1pLmxlbmd0aHx8cjwtMSppLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImF4aXMgc3BlY2lmaWVkIGZvciBjb25jYXQgZG9lc24ndCBtYXRjaCBpbnB1dCBkaW1lbnNpb25hbGl0eSIpO3I8MCYmKHI9aS5sZW5ndGgrcik7Y29uc3Qgcz1pLnNsaWNlKDApO2ZvcihsZXQgZT0xO2U8bi5sZW5ndGg7ZSsrKXtjb25zdCB0PW5bZV0uZGltcy5zbGljZSgpO2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKWlmKGU9PT1yKXNbcl0rPXRbZV07ZWxzZSBpZihpW2VdIT09dFtlXSl0aHJvdyBuZXcgRXJyb3IoIm5vbiBjb25jYXQgZGltZW5zaW9ucyBtdXN0IG1hdGNoIil9Y29uc3QgcD1zLmxlbmd0aCxkPW5ldyBBcnJheShuLmxlbmd0aCk7bGV0IGY9MDtmb3IobGV0IGU9MDtlPGQubGVuZ3RoOysrZSlmKz1uW2VdLmRpbXNbcl0sZFtlXT1mO2xldCBoPSIiO2g9bi5sZW5ndGg8NT9hKGQpOnUoZCk7Y29uc3QgZz1gXG4gICAgICAgICR7bChuLmxlbmd0aCxwKX1cbiAgICAgICAgJHtjKGQpfVxuICAgICAgICAke2h9XG4gICAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtwfV0pIHtcbiAgICAgICAgICBpbnQgdGV4dHVyZUluZGV4ID0gZ2V0VGV4dHVyZVdoZXJlRGF0YVJlc2lkZXMgKGluZGljZXNbJHtyfV0pO1xuXG4gICAgICAgICAgaWYodGV4dHVyZUluZGV4ICE9IDApIHtcbiAgICAgICAgICAgIGluZGljZXNbJHtyfV0gPSBpbmRpY2VzWyR7cn1dIC0gaW50KGdldFNpemVJbkNvbmNhdEF4aXNWYWx1ZUZyb21JbmRleCh0ZXh0dXJlSW5kZXgtaW50KDEpKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZldGNoRGF0YUZyb21Db3JyZWN0VGV4dHVyZSh0ZXh0dXJlSW5kZXgsIGluZGljZXMpO1xuICAgICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvdXRwdXQ6e2RpbXM6cyx0eXBlOm5bMF0udHlwZSx0ZXh0dXJlVHlwZTpvLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6Z30pfSkoMCxyLHQsbi5heGlzKX0pfSxhPWU9PmBpbnQgZ2V0VGV4dHVyZVdoZXJlRGF0YVJlc2lkZXMoaW50IGluZGV4KSB7XG4gICAgICAke2UubWFwKCgoZSx0KT0+YGlmKGluZGV4PCR7ZX0pIHtyZXR1cm4gJHt0fTt9XG5gKSkuam9pbigiIil9XG4gICAgfWAsdT1lPT5hKGUpLGw9KGUsdCk9Pntjb25zdCBuPVtgZmxvYXQgZmV0Y2hEYXRhRnJvbUNvcnJlY3RUZXh0dXJlKGludCB0ZXh0dXJlSW5kZXgsIGludCBpbmRpY2VzWyR7dH1dKSB7YF07Zm9yKGxldCB0PTA7dDxlOysrdCkwPT09dD9uLnB1c2goYFx0aWYgKHRleHR1cmVJbmRleCA9PSAke3R9KSB7IHJldHVybiBfWCR7dH0oaW5kaWNlcyk7IH1gKTp0PT09ZS0xP24ucHVzaChgXHRlbHNlIHsgcmV0dXJuIF9YJHt0fShpbmRpY2VzKTsgfWApOm4ucHVzaChgXHRlbHNlIGlmICh0ZXh0dXJlSW5kZXggPT0gJHt0fSkgeyByZXR1cm4gX1gke3R9KGluZGljZXMpOyB9YCk7cmV0dXJuIG4ucHVzaCgiXHR9Iiksbi5qb2luKCJcbiIpfSxjPWU9Pntjb25zdCB0PVsiaW50IGdldFNpemVJbkNvbmNhdEF4aXNWYWx1ZUZyb21JbmRleChpbnQgaW5kZXgpIHsiXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoOysrbikwPT09bj90LnB1c2goYFx0aWYgKGluZGV4ID09ICR7bn0pIHsgcmV0dXJuICR7ZVtuXX07IH1gKTpuPT09ZS5sZW5ndGgtMT90LnB1c2goYFx0ZWxzZSB7IHJldHVybiAke2Vbbl19OyB9YCk6dC5wdXNoKGBcdGVsc2UgaWYgKGluZGV4ID09ICR7bn0pIHsgcmV0dXJuICR7ZVtuXX07IH1gKTtyZXR1cm4gdC5wdXNoKCJcdH0iKSx0LmpvaW4oIlxuIil9O3QucGFyc2VDb25jYXRBdHRyaWJ1dGVzPWU9PigwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4aXM6ZS5hdHRyaWJ1dGVzLmdldEludCgiYXhpcyIpfSk7Y29uc3QgcD1lPT57aWYoIWV8fGUubGVuZ3RoPDEpdGhyb3cgbmV3IEVycm9yKCJ0b28gZmV3IGlucHV0cyIpO2NvbnN0IHQ9ZVswXS50eXBlLG49ZVswXS5kaW1zLmxlbmd0aDtpZigic3RyaW5nIj09PXQpdGhyb3cgbmV3IEVycm9yKCJzdHJpbmcgdGVuc29yIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Iik7Zm9yKGNvbnN0IHIgb2YgZSl7aWYoci50eXBlIT09dCl0aHJvdyBuZXcgRXJyb3IoImlucHV0IHRlbnNvcnMgc2hvdWxkIGJlIG9uZSB0eXBlIik7aWYoci5kaW1zLmxlbmd0aCE9PW4pdGhyb3cgbmV3IEVycm9yKCJpbnB1dCB0ZW5zb3JzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHNoYXBlIil9fTt9LDc4MjU6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZVVucGFja2VkR3JvdXBlZENvbnZQcm9ncmFtSW5mb0xvYWRlcj12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpLG89big2NzU3KSxpPW4oNTYzOSkscz1uKDk3NTQpLGE9bigyMTUwKTt0LmNyZWF0ZVVucGFja2VkR3JvdXBlZENvbnZQcm9ncmFtSW5mb0xvYWRlcj0oZSx0LG4pPT57Y29uc3QgdT0obD10Lmxlbmd0aD4yLGM9bi5jYWNoZUtleSx7bmFtZToiR3JvdXBlZENvbnYiLGlucHV0TmFtZXM6bD9bIlgiLCJXIiwiQmlhcyJdOlsiWCIsIlciXSxpbnB1dFR5cGVzOmw/W2kuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXTpbaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6Y30pO3ZhciBsLGM7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx1KSx7Z2V0OigpPT4oKGUsdCxuLHUpPT57Y29uc3QgbD10Lmxlbmd0aD4yPyJ2YWx1ZSArPSBnZXRCaWFzKG91dHB1dF9jaGFubmVsKTsiOiIiLGM9dFswXS5kaW1zLnNsaWNlKCkscD10WzFdLmRpbXMuc2xpY2UoKSxkPXBbMF0vdS5ncm91cDtyLkxvZ2dlci52ZXJib3NlKCJHcm91cGVkQ29udiIsYGF1dHBQYWQ6JHt1LmF1dG9QYWR9LCBkaWxhdGlvbnM6JHt1LmRpbGF0aW9uc30sIGdyb3VwOiR7dS5ncm91cH0sIGtlcm5lbFNoYXBlOiR7dS5rZXJuZWxTaGFwZX0sIHBhZHM6JHt1LnBhZHN9LCBzdHJpZGVzOiR7dS5zdHJpZGVzfWApO2NvbnN0IGY9KDAsIHMuY2FsY3VsYXRlT3V0cHV0U2hhcGUpKGMscCx1LmRpbGF0aW9ucyx1LnBhZHMsdS5zdHJpZGVzKSxoPSgwLCBvLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSx7YWN0aXZhdGlvbkZ1bmN0aW9uOmcsYXBwbHlBY3RpdmF0aW9uOmJ9PSgwLCBhLmdldEFjdGl2YXRpb25TbmlwcGV0KSh1KSxtPWBcbiAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7dS5zdHJpZGVzWzBdfSwgJHt1LnN0cmlkZXNbMV19KTtcbiAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7dS5wYWRzWzBdfSwgJHt1LnBhZHNbMV19KTtcbiAgJHtnfVxuICB2b2lkIG1haW4oKSB7XG4gICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgaW50IG91dHB1dF9jaGFubmVsID0gY29vcmRzLnk7XG4gICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnp3ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgaW50IGdyb3VwX2lkID0gb3V0cHV0X2NoYW5uZWwgLyAke2R9O1xuXG4gICAgZmxvYXQgdmFsdWUgPSAwLjA7XG4gICAgZm9yIChpbnQgd0luQ2hhbm5lbCA9IDA7IHdJbkNoYW5uZWwgPCAke3BbMV19OyB3SW5DaGFubmVsKyspIHtcbiAgICAgIGludCBpbnB1dF9jaGFubmVsID0gZ3JvdXBfaWQgKiAke3BbMV19ICsgd0luQ2hhbm5lbDtcbiAgICAgIGZvciAoaW50IHdIZWlnaHQgPSAwOyB3SGVpZ2h0IDwgJHtwWzJdfTsgd0hlaWdodCsrKSB7XG4gICAgICAgIGludCB4SGVpZ2h0ID0geFJDQ29ybmVyLnggKyB3SGVpZ2h0ICogJHt1LmRpbGF0aW9uc1swXX07XG5cbiAgICAgICAgaWYgKHhIZWlnaHQgPCAwIHx8IHhIZWlnaHQgPj0gJHtjWzJdfSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpbnQgd1dpZHRoID0gMDsgd1dpZHRoIDwgJHtwWzNdfTsgd1dpZHRoKyspIHtcbiAgICAgICAgICBpbnQgeFdpZHRoID0geFJDQ29ybmVyLnkgKyB3V2lkdGggKiAke3UuZGlsYXRpb25zWzFdfTtcbiAgICAgICAgICBpZiAoeFdpZHRoIDwgMCB8fCB4V2lkdGggPj0gJHtjWzNdfSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmxvYXQgeFZhbCA9IGdldFgoYmF0Y2gsIGlucHV0X2NoYW5uZWwsIHhXaWR0aCwgeEhlaWdodCk7XG4gICAgICAgICAgZmxvYXQgd1ZhbCA9IGdldFcob3V0cHV0X2NoYW5uZWwsIHdJbkNoYW5uZWwsIHdXaWR0aCwgd0hlaWdodCk7XG4gICAgICAgICAgdmFsdWUgKz0geFZhbCp3VmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgICR7bH1cbiAgICAke2J9XG4gICAgJHtoLm91dHB1dH0gPSB2ZWM0KHZhbHVlLCAuMCwgLjAsIC4wKTtcbiAgfVxuYDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4pLHtvdXRwdXQ6e2RpbXM6Zix0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6bSxoYXNNYWluOiEwfSl9KShlLHQsdSxuKX0pfTt9LDc3MDg6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNvbnYyRFBhY2tlZD10LmNvbnYyRFBhY2tlZFBvaW50d2lzZT12b2lkIDA7Y29uc3Qgcj1uKDk3NTQpLG89big1OTUwKSxpPW4oNTYzMik7dC5jb252MkRQYWNrZWRQb2ludHdpc2U9KGUsdCxuKT0+e2NvbnN0IG89dFswXS5kaW1zLHM9dFsxXS5kaW1zLGE9KDAsIHIuY2FsY3VsYXRlT3V0cHV0U2hhcGUpKG8scyxuLmRpbGF0aW9ucyxuLnBhZHMsbi5zdHJpZGVzKSx1PWUucmVzaGFwZVBhY2tlZCh0WzBdLFtvWzFdLG9bMl0qb1szXV0pLGw9ZS5yZXNoYXBlUGFja2VkKHRbMV0sW3NbMF0sc1sxXV0pLGM9dC5sZW5ndGg+Mj9bbCx1LHRbMl1dOltsLHVdLHA9ZS5ydW4oKDAsIGkuY3JlYXRlUGFja2VkTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXIpKGUsYyxuKSxjKTtyZXR1cm4gZS5yZXNoYXBlUGFja2VkKHAsYSl9LHQuY29udjJEUGFja2VkPShlLHQsbik9Pntjb25zdCBzPXRbMF0uZGltcyxhPXRbMV0uZGltcyx1PSgwLCByLmNhbGN1bGF0ZU91dHB1dFNoYXBlKShzLGEsbi5kaWxhdGlvbnMsbi5wYWRzLG4uc3RyaWRlcyksbD1lLnJ1bigoMCwgby5jcmVhdGVQYWNrZWRJbTJDb2xQcm9ncmFtSW5mb0xvYWRlcikoZSx0WzBdLHRbMV0sdSxuKSxbdFswXV0pLGM9ZS5yZXNoYXBlUGFja2VkKHRbMV0sW2FbMF0sYVsxXSphWzJdKmFbM11dKSxwPTM9PT10Lmxlbmd0aD9bYyxsLHRbMl1dOltjLGxdLGQ9ZS5ydW4oKDAsIGkuY3JlYXRlUGFja2VkTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXIpKGUscCxuKSxwKTtyZXR1cm4gZS5yZXNoYXBlUGFja2VkKGQsdSl9O30sNTA0MjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VDb252VHJhbnNwb3NlQXR0cmlidXRlcz10LmNvbnZUcmFuc3Bvc2U9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNjc1NyksaT1uKDU2MzkpLHM9bigyMTUwKSxhPShlLHQsbixyLG8saSk9PihlLTEpKnQrbisoci0xKSpvKzEtaSx1PShlLHQsbixyLG8pPT57Y29uc3QgaT1NYXRoLmZsb29yKGUvMik7IlNBTUVfVVBQRVIiPT09dD8obltyXT1pLG5bb109ZS1pKToiU0FNRV9MT1dFUiI9PT10JiYobltyXT1lLWksbltvXT1pKTt9O3QuY29udlRyYW5zcG9zZT0oZSx0LG4pPT4oZCh0LG4pLGwoZSx0LG4pKTtjb25zdCBsPShlLHQsbik9Pntjb25zdCByPXAobix0KTtyZXR1cm4gW2MoZSx0LHIpXX0sYz0oZSx0LG4pPT5lLnJ1bigoKGUsdCxuKT0+e2NvbnN0IHI9KGE9dC5sZW5ndGg+Mix1PW4uY2FjaGVLZXkse25hbWU6IkNvbnZUcmFuc3Bvc2UiLGlucHV0TmFtZXM6YT9bIlgiLCJXIiwiQiJdOlsiWCIsIlciXSxpbnB1dFR5cGVzOmE/W2kuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXTpbaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6dX0pO3ZhciBhLHU7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSx7Z2V0OigpPT4oKGUsdCxuLHIpPT57Y29uc3QgYT10Lmxlbmd0aD4yPyJnZXRCKG91dHB1dF9jaGFubmVsKSI6IjAuMCIsdT10WzBdLmRpbXMsbD10WzFdLmRpbXMsYz1sWzFdLHA9bFswXS9yLmdyb3VwLGQ9W3RbMF0uZGltc1swXSx0WzFdLmRpbXNbMV0qci5ncm91cCwuLi5yLm91dHB1dFNoYXBlXSxmPSgwLCBvLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSx7YWN0aXZhdGlvbkZ1bmN0aW9uOmgsYXBwbHlBY3RpdmF0aW9uOmd9PSgwLCBzLmdldEFjdGl2YXRpb25TbmlwcGV0KShyKSxiPWBcbiAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7ci5zdHJpZGVzWzBdfSwgJHtyLnN0cmlkZXNbMV19KTtcbiAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7ci5wYWRzWzBdfSwgJHtyLnBhZHNbMV19KTtcbiAgJHtofVxuICB2b2lkIG1haW4oKSB7XG4gICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgaW50IG91dHB1dF9jaGFubmVsID0gY29vcmRzLnk7XG5cbiAgICBpdmVjMiBsb2MgPSBjb29yZHMuencgKyBwYWRzO1xuXG4gICAgaW50IGdyb3VwX2lkID0gb3V0cHV0X2NoYW5uZWwgLyAke2N9O1xuICAgIGludCB3T3V0Q2hhbm5lbCA9IG91dHB1dF9jaGFubmVsIC0gZ3JvdXBfaWQgKiAke2N9O1xuXG4gICAgZmxvYXQgdmFsdWUgPSAke2F9O1xuICAgIGZvciAoaW50IGluQ2hhbm5lbE9mZnNldCA9IDA7IGluQ2hhbm5lbE9mZnNldCA8ICR7cH07IGluQ2hhbm5lbE9mZnNldCsrKSB7XG4gICAgICBpbnQgaW5wdXRfY2hhbm5lbCA9IGdyb3VwX2lkICogJHtwfSArIGluQ2hhbm5lbE9mZnNldDtcbiAgICAgIGZvciAoaW50IHdXT2ZmID0gMDsgd1dPZmYgPCAke2xbMl19OyB3V09mZisrKSB7XG4gICAgICAgIGZvciAoaW50IHdIT2ZmID0gMDsgd0hPZmYgPCAke2xbM119OyB3SE9mZisrKSB7XG4gICAgICAgICAgaXZlYzIgd09mZiA9IGl2ZWMyKHdXT2ZmICogJHtyLmRpbGF0aW9uc1swXX0sIHdIT2ZmICogJHtyLmRpbGF0aW9uc1sxXX0pO1xuICAgICAgICAgIGl2ZWMyIHdMb2MgPSBsb2MgLSB3T2ZmO1xuICAgICAgICAgIGl2ZWMyIHdMb2NJbiA9IHdMb2MgLyBzdHJpZGVzO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHdMb2NJbiAqIHN0cmlkZXMgPT0gd0xvYyAmJlxuICAgICAgICAgICAgd0xvY0luLnggPj0gMCAmJiB3TG9jSW4ueCA8ICR7dVsyXX0gJiZcbiAgICAgICAgICAgIHdMb2NJbi55ID49IDAgJiYgd0xvY0luLnkgPCAke3VbM119XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmbG9hdCB4VmFsID0gZ2V0WChiYXRjaCwgaW5wdXRfY2hhbm5lbCwgd0xvY0luLnksIHdMb2NJbi54KTtcbiAgICAgICAgICAgIGZsb2F0IHdWYWwgPSBnZXRXKGlucHV0X2NoYW5uZWwsIHdPdXRDaGFubmVsLCB3SE9mZiwgd1dPZmYpO1xuICAgICAgICAgICAgdmFsdWUgKz0geFZhbCAqIHdWYWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgICR7Z31cbiAgICAke2Yub3V0cHV0fSA9IHZlYzQodmFsdWUsIC4wLCAuMCwgLjApO1xuICB9XG5gO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbikse291dHB1dDp7ZGltczpkLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOmkuVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpiLGhhc01haW46ITB9KX0pKGUsdCxyLG4pfSl9KShlLHQsbiksdCkscD0oZSx0KT0+e2NvbnN0IG49ZS5rZXJuZWxTaGFwZS5zbGljZSgpO2lmKDA9PT1lLmtlcm5lbFNoYXBlLmxlbmd0aClmb3IobGV0IGU9MjtlPHRbMV0uZGltcy5sZW5ndGg7KytlKW4ucHVzaCh0WzFdLmRpbXNbZV0pO2NvbnN0IHI9ZS5wYWRzLnNsaWNlKCksbz1lLm91dHB1dFNoYXBlLnNsaWNlKCk7KChlLHQsbixyLG8saSxzLGwpPT57Y29uc3QgYz1lLmxlbmd0aC0yLHA9MD09PWwubGVuZ3RoO2ZvcihsZXQgZD0wO2Q8YzsrK2Qpe2NvbnN0IGY9cD9lW2QrMl0qaVtkXTpsW2RdLGg9YShlW2QrMl0saVtkXSxvW2RdLHRbZF0sbltkXSxmKTt1KGgscixvLGQsZCtjKSxwJiZsLnB1c2goaVtkXSooZVtkKzJdLTEpK3NbZF0rKHRbZF0tMSkqbltkXSsxLW9bZF0tb1tkK2NdKTt9fSkodFswXS5kaW1zLG4sZS5kaWxhdGlvbnMsZS5hdXRvUGFkLHIsZS5zdHJpZGVzLGUub3V0cHV0UGFkZGluZyxvKTtjb25zdCBpPU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oaSx7a2VybmVsU2hhcGU6bixwYWRzOnIsb3V0cHV0U2hhcGU6byxjYWNoZUtleTplLmNhY2hlS2V5fSksaX07dC5wYXJzZUNvbnZUcmFuc3Bvc2VBdHRyaWJ1dGVzPWU9Pntjb25zdCB0PWUuYXR0cmlidXRlcyxuPSgwLCBzLnBhcnNlSW50ZXJuYWxBY3RpdmF0aW9uQXR0cmlidXRlcykodCksbz10LmdldFN0cmluZygiYXV0b19wYWQiLCJOT1RTRVQiKSxpPXQuZ2V0SW50cygiZGlsYXRpb25zIixbMSwxXSksYT10LmdldEludCgiZ3JvdXAiLDEpLHU9dC5nZXRJbnRzKCJrZXJuZWxfc2hhcGUiLFtdKSxsPXQuZ2V0SW50cygib3V0cHV0X3BhZGRpbmciLFswLDBdKSxjPXQuZ2V0SW50cygib3V0cHV0X3NoYXBlIixbXSkscD10LmdldEludHMoInBhZHMiLFswLDAsMCwwXSksZD10LmdldEludHMoInN0cmlkZXMiLFsxLDFdKTtyZXR1cm4gKDAsIHIuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KShPYmplY3QuYXNzaWduKHthdXRvUGFkOm8sZGlsYXRpb25zOmksZ3JvdXA6YSxrZXJuZWxTaGFwZTp1LG91dHB1dFBhZGRpbmc6bCxvdXRwdXRTaGFwZTpjLHBhZHM6cCxzdHJpZGVzOmR9LG4pKX07Y29uc3QgZD0oZSx0KT0+e2lmKCFlfHwyIT09ZS5sZW5ndGgmJjMhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkNvbnYgcmVxdWlyZXMgMiBvciAzIGlucHV0cyIpO2lmKDQhPT1lWzBdLmRpbXMubGVuZ3RofHw0IT09ZVsxXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImN1cnJlbnRseSBvbmx5IHN1cHBvcnQgMi1kaW1lbnNpb25hbCBjb252Iik7aWYoZVswXS5kaW1zWzFdIT09ZVsxXS5kaW1zWzBdKXRocm93IG5ldyBFcnJvcigiRklMVEVSX0lOX0NIQU5ORUwgc2hvdWxkIGJlIGVxdWFsIHRvIERBVEFfQ0hBTk5FTCIpO2NvbnN0IG49ZVsxXS5kaW1zWzFdKnQuZ3JvdXA7aWYoMz09PWUubGVuZ3RoJiYoMSE9PWVbMl0uZGltcy5sZW5ndGh8fGVbMl0uZGltc1swXSE9PW4pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBiaWFzIik7Y29uc3Qgcj1lWzBdLmRpbXMubGVuZ3RoLTI7aWYodC5kaWxhdGlvbnMubGVuZ3RoIT09cil0aHJvdyBuZXcgRXJyb3IoYGRpbGF0aW9ucyBzaG91bGQgYmUgJHtyfURgKTtpZih0LnN0cmlkZXMubGVuZ3RoIT09cil0aHJvdyBuZXcgRXJyb3IoYHN0cmlkZXMgc2hvdWxkIGJlICR7cn1EYCk7aWYodC5wYWRzLmxlbmd0aCE9PTIqcil0aHJvdyBuZXcgRXJyb3IoYHBhZHMgc2hvdWxkIGJlICR7MipyfURgKTtpZih0Lm91dHB1dFBhZGRpbmcubGVuZ3RoIT09cil0aHJvdyBuZXcgRXJyb3IoYG91dHB1dF9wYWRkaW5nIHNob3VsZCBiZSAke3J9RGApO2lmKDAhPT10Lmtlcm5lbFNoYXBlLmxlbmd0aCYmdC5rZXJuZWxTaGFwZS5sZW5ndGghPT1lWzFdLmRpbXMubGVuZ3RoLTIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGtlcm5lbCBzaGFwZSIpO2lmKDAhPT10Lm91dHB1dFNoYXBlLmxlbmd0aCYmdC5vdXRwdXRTaGFwZS5sZW5ndGghPT1lWzBdLmRpbXMubGVuZ3RoLTIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG91dHB1dCBzaGFwZSIpO2lmKCJmbG9hdDMyIiE9PWVbMF0udHlwZXx8ImZsb2F0MzIiIT09ZVsxXS50eXBlKXRocm93IG5ldyBFcnJvcigiQ29udlRyYW5zcG9zZSBpbnB1dChYLFcpIHNob3VsZCBiZSBmbG9hdCB0ZW5zb3IiKTtpZigzPT09ZS5sZW5ndGgmJiJmbG9hdDMyIiE9PWVbMl0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkNvbnZUcmFuc3Bvc2UgaW5wdXQoYmlhcykgc2hvdWxkIGJlIGZsb2F0IHRlbnNvciIpfTt9LDk3NTQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlQ29udkF0dHJpYnV0ZXM9dC5jb252PXQuY2FsY3VsYXRlT3V0cHV0U2hhcGU9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNzI3MyksaT1uKDc4MjUpLHM9big3NzA4KSxhPW4oMzI4MSksdT1uKDIxNTApLGw9bigxNjI1KSxjPW4oODI3Nik7dC5jYWxjdWxhdGVPdXRwdXRTaGFwZT0oZSx0LG4scixvKT0+e2NvbnN0IGk9ZVswXSxzPWUuc2xpY2UoMiksYT1zLmxlbmd0aCx1PXRbMF0sbD10LnNsaWNlKDIpLm1hcCgoKGUsdCk9PmUrKGUtMSkqKG5bdF0tMSkpKSxjPXMubWFwKCgoZSx0KT0+ZStyW3RdK3JbdCthXSkpLm1hcCgoKGUsdCk9Pk1hdGguZmxvb3IoKGUtbFt0XStvW3RdKS9vW3RdKSkpO3JldHVybiBbaSx1XS5jb25jYXQoLi4uYyl9LHQuY29udj0oZSx0LG4pPT4oZyh0LG4pLHAoZSx0LG4pKTtjb25zdCBwPShlLHQsbik9Pntjb25zdCByPWgobix0KSxvPWUuc2Vzc2lvbi5wYWNrLGE9MT09PXIua2VybmVsU2hhcGVbMF0mJjE9PT1yLmtlcm5lbFNoYXBlWzFdO3JldHVybiByLmdyb3VwPjE/W2UucnVuKCgwLCBpLmNyZWF0ZVVucGFja2VkR3JvdXBlZENvbnZQcm9ncmFtSW5mb0xvYWRlcikoZSx0LHIpLHQpXTphJiZvP1tkKGUsdCxyKV06byYmND09PXRbMF0uZGltcy5sZW5ndGgmJjE9PT10WzBdLmRpbXNbMF0mJiFhP1soMCwgcy5jb252MkRQYWNrZWQpKGUsdCxyKV06W2YoZSx0LHIpXX0sZD0oZSxuLHIpPT57Y29uc3Qgbz1uWzBdLmRpbXMsaT1uWzFdLmRpbXMscz0oMCwgdC5jYWxjdWxhdGVPdXRwdXRTaGFwZSkobyxpLHIuZGlsYXRpb25zLHIucGFkcyxyLnN0cmlkZXMpLGE9ZS5yZXNoYXBlVW5wYWNrZWQoblswXSxbb1sxXSxvWzJdKm9bM11dKSx1PWUucmVzaGFwZVVucGFja2VkKG5bMV0sW2lbMF0saVsxXV0pLGw9bi5sZW5ndGg+Mj9bdSxhLG5bMl1dOlt1LGFdLHA9ZS5ydW4oKDAsIGMuY3JlYXRlTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXIpKGwsciksbCk7cmV0dXJuIGUucmVzaGFwZVVucGFja2VkKHAscyl9LGY9KGUsbixyKT0+e2NvbnN0IG89blswXS5kaW1zLGk9blsxXS5kaW1zLHM9KDAsIHQuY2FsY3VsYXRlT3V0cHV0U2hhcGUpKG8saSxyLmRpbGF0aW9ucyxyLnBhZHMsci5zdHJpZGVzKSx1PWUucnVuKCgwLCBsLmNyZWF0ZUltMkNvbFByb2dyYW1JbmZvTG9hZGVyKShlLG5bMF0sblsxXSxzLHIpLFtuWzBdXSksYz0zPT09bi5sZW5ndGg/W3UsblsxXSxuWzJdXTpbdSxuWzFdXTtyZXR1cm4gZS5ydW4oKDAsIGEuY3JlYXRlRG90UHJvZHVjdFByb2dyYW1JbmZvTG9hZGVyKShlLG4scyxyKSxjKX0saD0oZSx0KT0+e2NvbnN0IG49ZS5rZXJuZWxTaGFwZS5zbGljZSgpO2lmKDA9PT1lLmtlcm5lbFNoYXBlLmxlbmd0aClmb3IobGV0IGU9MjtlPHRbMV0uZGltcy5sZW5ndGg7KytlKW4ucHVzaCh0WzFdLmRpbXNbZV0pO2NvbnN0IHI9ZS5wYWRzLnNsaWNlKCk7by5Qb29sQ29udlV0aWwuYWRqdXN0UGFkc0Jhc2VkT25BdXRvUGFkKHRbMF0uZGltcyxlLnN0cmlkZXMsZS5kaWxhdGlvbnMsbixyLGUuYXV0b1BhZCk7Y29uc3QgaT1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiBPYmplY3QuYXNzaWduKGkse2tlcm5lbFNoYXBlOm4scGFkczpyLGNhY2hlS2V5OmUuY2FjaGVLZXl9KSxpfTt0LnBhcnNlQ29udkF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLG49KDAsIHUucGFyc2VJbnRlcm5hbEFjdGl2YXRpb25BdHRyaWJ1dGVzKSh0KSxvPXQuZ2V0U3RyaW5nKCJhdXRvX3BhZCIsIk5PVFNFVCIpLGk9dC5nZXRJbnRzKCJkaWxhdGlvbnMiLFsxLDFdKSxzPXQuZ2V0SW50KCJncm91cCIsMSksYT10LmdldEludHMoImtlcm5lbF9zaGFwZSIsW10pLGw9dC5nZXRJbnRzKCJwYWRzIixbMCwwLDAsMF0pLGM9dC5nZXRJbnRzKCJzdHJpZGVzIixbMSwxXSk7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoT2JqZWN0LmFzc2lnbih7YXV0b1BhZDpvLGRpbGF0aW9uczppLGdyb3VwOnMsa2VybmVsU2hhcGU6YSxwYWRzOmwsc3RyaWRlczpjfSxuKSl9O2NvbnN0IGc9KGUsdCk9PntpZighZXx8MiE9PWUubGVuZ3RoJiYzIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJDb252IHJlcXVpcmVzIDIgb3IgMyBpbnB1dHMiKTtpZig0IT09ZVswXS5kaW1zLmxlbmd0aHx8NCE9PWVbMV0uZGltcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJjdXJyZW50bHkgb25seSBzdXBwb3J0IDItZGltZW5zaW9uYWwgY29udiIpO2lmKGVbMF0uZGltc1sxXSE9PWVbMV0uZGltc1sxXSp0Lmdyb3VwKXRocm93IG5ldyBFcnJvcigiRklMVEVSX0lOX0NIQU5ORUwgc2hvdWxkIGJlIGVxdWFsIHRvIERBVEFfQ0hBTk5FTCIpO2lmKDM9PT1lLmxlbmd0aCYmKDEhPT1lWzJdLmRpbXMubGVuZ3RofHxlWzFdLmRpbXNbMF0hPT1lWzJdLmRpbXNbMF0pKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBiaWFzIik7Y29uc3Qgbj1lWzBdLmRpbXMubGVuZ3RoLTI7aWYodC5kaWxhdGlvbnMubGVuZ3RoIT09bil0aHJvdyBuZXcgRXJyb3IoYGRpbGF0aW9ucyBzaG91bGQgYmUgJHtufURgKTtpZih0LnN0cmlkZXMubGVuZ3RoIT09bil0aHJvdyBuZXcgRXJyb3IoYHN0cmlkZXMgc2hvdWxkIGJlICR7bn1EYCk7aWYodC5wYWRzLmxlbmd0aCE9PTIqbil0aHJvdyBuZXcgRXJyb3IoYHBhZHMgc2hvdWxkIGJlICR7MipufURgKTtpZigwIT09dC5rZXJuZWxTaGFwZS5sZW5ndGgmJnQua2VybmVsU2hhcGUubGVuZ3RoIT09ZVsxXS5kaW1zLmxlbmd0aC0yKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBrZXJuZWwgc2hhcGUiKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGV8fCJmbG9hdDMyIiE9PWVbMV0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkNvbnYgaW5wdXQoWCxXKSBzaG91bGQgYmUgZmxvYXQgdGVuc29yIik7aWYoMz09PWUubGVuZ3RoJiYiZmxvYXQzMiIhPT1lWzJdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJDb252IGlucHV0KGJpYXMpIHNob3VsZCBiZSBmbG9hdCB0ZW5zb3IiKX07fSw2NzQyOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZURlcHRoVG9TcGFjZUF0dHJpYnV0ZXM9dC5kZXB0aFRvU3BhY2U9dm9pZCAwO2NvbnN0IHI9big1NzA3KTt0LmRlcHRoVG9TcGFjZT0oZSx0LG4pPT57byh0KTtjb25zdCBpPW4uYmxvY2tzaXplLHM9aSppLGE9IkRDUiI9PT1uLm1vZGU/WzAsMyw0LDEsNSwyXTpbMCwxLDQsMiw1LDNdLHU9IkRDUiI9PT1uLm1vZGU/W3RbMF0uZGltc1swXSxpLGksdFswXS5kaW1zWzFdL3MsdFswXS5kaW1zWzJdLHRbMF0uZGltc1szXV06W3RbMF0uZGltc1swXSx0WzBdLmRpbXNbMV0vcyxpLGksdFswXS5kaW1zWzJdLHRbMF0uZGltc1szXV0sbD1lLnJlc2hhcGVVbnBhY2tlZCh0WzBdLHUpLGM9e3Blcm06YSxjYWNoZUtleTpgJHthfWB9LFtwXT0oMCwgci50cmFuc3Bvc2UpKGUsW2xdLGMpLGQ9W3RbMF0uZGltc1swXSx0WzBdLmRpbXNbMV0vcyx0WzBdLmRpbXNbMl0qaSx0WzBdLmRpbXNbM10qaV07cmV0dXJuIFtlLnJlc2hhcGVVbnBhY2tlZChwLGQpXX0sdC5wYXJzZURlcHRoVG9TcGFjZUF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEludCgiYmxvY2tzaXplIik7aWYodDwxKXRocm93IG5ldyBFcnJvcihgYmxvY2tzaXplIG11c3QgYmUgPj0gMSwgYnV0IGdvdCA6ICR7dH0gZm9yIERlcHRoVG9TcGFjZWApO2NvbnN0IG49ZS5hdHRyaWJ1dGVzLmdldFN0cmluZygibW9kZSIsIkRDUiIpO2lmKCJEQ1IiIT09biYmIkNSRCIhPT1uKXRocm93IG5ldyBFcnJvcihgdW5yZWNvZ25pemVkIG1vZGU6ICR7bn0gZm9yIERlcHRoVG9TcGFjZWApO3JldHVybiB7bW9kZTpuLGJsb2Nrc2l6ZTp0fX07Y29uc3Qgbz1lPT57aWYoMSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgRGVwdGhUb1NwYWNlIGV4cGVjdCAxIGlucHV0cywgYnV0IGdvdCAke2UubGVuZ3RofWApO2lmKCJzdHJpbmciPT09ZVswXS50eXBlfHw0IT09ZVswXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXB0aFRvU3BhY2UgaW5wdXQgc2hvdWxkIGJlIGEgNC1EIG51bWVyaWMgdGVuc29yIil9O30sMzI4MTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlRG90UHJvZHVjdFByb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDY3NTcpLGk9big1NjM5KSxzPW4oMjE1MCksYT1uKDE2MjUpO3QuY3JlYXRlRG90UHJvZHVjdFByb2dyYW1JbmZvTG9hZGVyPShlLHQsbix1KT0+e2NvbnN0IGw9KChlLHQpPT4oe25hbWU6IkNvbnZEb3RQcm9kdWN0IixpbnB1dE5hbWVzOmU/WyJJbTJDb2wiLCJLIiwiQiJdOlsiSW0yQ29sIiwiSyJdLGlucHV0VHlwZXM6ZT9baS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnBhY2tlZExhc3REaW1lbnNpb24saS5UZXh0dXJlVHlwZS51bnBhY2tlZF06W2kuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uXSxjYWNoZUtleTp0LmFjdGl2YXRpb25DYWNoZUtleX0pKSh0Lmxlbmd0aD4yLHUpO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbCkse2dldDooKT0+KChlLHQsbix1LGwpPT57Y29uc3QgYz1uWzBdLmRpbXMscD1uWzFdLmRpbXMsZD1bcFswXSxNYXRoLmNlaWwoY1sxXSpwWzJdKnBbM10vNCldLGY9KDAsIGEuY2FsY3VsYXRlSW0yQ29sRGltcykoYyxwLHUpLFtoLGddPWUuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KGQsaS5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKSxiPXIuU2hhcGVVdGlsLmNvbXB1dGVTdHJpZGVzKGYpLFttLHldPWUuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KGYsaS5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKSx2PXUubGVuZ3RoLF89bi5sZW5ndGg8Mz8iMC4wIjoiX0IoYikiLHc9TWF0aC5jZWlsKGNbMV0qcFsyXSpwWzNdLzQpLHthY3RpdmF0aW9uRnVuY3Rpb246VCxhcHBseUFjdGl2YXRpb246eH09KDAsIHMuZ2V0QWN0aXZhdGlvblNuaXBwZXQpKGwpLE89KDAsIG8uZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFM9YFxuJHtUfVxuZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske3Z9XSkge1xuICBpbnQgYlsxXTtcbiAgYlswXSA9IGluZGljZXNbMV07XG4gIGludCBpbTJjb2xbNF07XG4gIGltMmNvbFswXSA9IGluZGljZXNbMF07XG4gIGltMmNvbFsxXSA9IGluZGljZXNbMl07XG4gIGltMmNvbFsyXSA9IGluZGljZXNbM107XG4gIGludCBpbTJjb2xPZmZzZXQgPSBpbTJjb2xbMF0gKiAke2JbMF19ICsgaW0yY29sWzFdICogJHtiWzFdfSArIGltMmNvbFsyXSAqICR7YlsyXX07XG4gIGludCBrZXJuZWxPZmZzZXQgPSBpbmRpY2VzWzFdICogJHtkWzFdfTtcbiAgZmxvYXQgdmFsdWUgPSAke199O1xuICBmb3IgKGludCBpID0gMDsgaSA8ICR7d307ICsraSkge1xuICAgIHZlYzIgaW0yY29sQ29vcmRzID0gb2Zmc2V0VG9Db29yZHMoaW0yY29sT2Zmc2V0LCAke219LCAke3l9KTtcbiAgICB2ZWMyIGtlcm5lbENvb3JkcyA9IG9mZnNldFRvQ29vcmRzKGtlcm5lbE9mZnNldCwgJHtofSwgJHtnfSk7XG4gICAgdmFsdWUgKz0gZG90KCR7Ty50ZXh0dXJlMkR9KEltMkNvbCwgaW0yY29sQ29vcmRzKSwgJHtPLnRleHR1cmUyRH0oSywga2VybmVsQ29vcmRzKSk7XG4gICAgKytpbTJjb2xPZmZzZXQ7XG4gICAgKytrZXJuZWxPZmZzZXQ7XG4gIH1cbiAgJHt4fVxuICByZXR1cm4gdmFsdWU7XG59YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvdXRwdXQ6e2RpbXM6dSx0eXBlOm5bMF0udHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6U30pfSkoZSxsLHQsbix1KX0pfTt9LDQxMjU6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlRmxhdHRlbkF0dHJpYnV0ZXM9dC5mbGF0dGVuPXZvaWQgMDtjb25zdCByPW4oNzI3Myk7dC5mbGF0dGVuPShlLHQsbik9PntvKHQsbik7Y29uc3QgaT1yLlNoYXBlVXRpbC5mbGF0dGVuU2hhcGUodFswXS5kaW1zLG4pO3JldHVybiBbZS5yZXNoYXBlVW5wYWNrZWQodFswXSxpKV19LHQucGFyc2VGbGF0dGVuQXR0cmlidXRlcz1lPT5lLmF0dHJpYnV0ZXMuZ2V0SW50KCJheGlzIiwxKTtjb25zdCBvPShlLHQpPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkZsYXR0ZW4gcmVxdWlyZXMgMSBpbnB1dC4iKTtjb25zdCBuPWVbMF0uZGltcy5sZW5ndGg7aWYoMD09PW4pdGhyb3cgbmV3IEVycm9yKCJzY2FsYXIgdGVuc29yIGlzIG5vdCBzdXBwb3J0ZWQuIik7aWYodDwtbnx8dD5uKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBheGlzIik7aWYoInN0cmluZyI9PT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJzdHJpbmcgdGVuc29yIGlzIG5vdCBzdXBwb3J0ZWQuIil9O30sMjE1MDooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VJbnRlcm5hbEFjdGl2YXRpb25BdHRyaWJ1dGVzPXQuZ2V0QWN0aXZhdGlvblNuaXBwZXQ9dm9pZCAwO2NvbnN0IHI9big3MjczKSxvPW4oOTA4Nyk7dC5nZXRBY3RpdmF0aW9uU25pcHBldD1mdW5jdGlvbihlKXtsZXQgdDtzd2l0Y2goZS5hY3RpdmF0aW9uKXtjYXNlIlJlbHUiOnQ9KDAsIG8uZ2xzbFJlbHUpKCk7YnJlYWs7Y2FzZSJTaWdtb2lkIjp0PSgwLCBvLmdsc2xTaWdtb2lkKSgpO2JyZWFrO2Nhc2UiQ2xpcCI6dD0oMCwgby5nbHNsQ2xpcCkoZS5jbGlwTWluLGUuY2xpcE1heCk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4ge2FjdGl2YXRpb25GdW5jdGlvbjoiIixhcHBseUFjdGl2YXRpb246IiJ9fWNvbnN0IG49dC5uYW1lO3JldHVybiB7YWN0aXZhdGlvbkZ1bmN0aW9uOnQuYm9keSxhcHBseUFjdGl2YXRpb246YHZhbHVlID0gJHtufV8odmFsdWUpO2B9fSx0LnBhcnNlSW50ZXJuYWxBY3RpdmF0aW9uQXR0cmlidXRlcz1lPT57Y29uc3QgdD1lLmdldFN0cmluZygiYWN0aXZhdGlvbiIsIiIpO2lmKCJDbGlwIj09PXQpe2NvbnN0W24sb109ZS5nZXRGbG9hdHMoImFjdGl2YXRpb25fcGFyYW1zIixbci5NSU5fQ0xJUCxyLk1BWF9DTElQXSk7cmV0dXJuIHthY3RpdmF0aW9uOnQsY2xpcE1heDpvLGNsaXBNaW46bixhY3RpdmF0aW9uQ2FjaGVLZXk6YCR7dH06JHtufSwke299YH19cmV0dXJuIHthY3RpdmF0aW9uOnQsYWN0aXZhdGlvbkNhY2hlS2V5OnR9fTt9LDYxNDk6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlR2F0aGVyQXR0cmlidXRlcz10LmdhdGhlcj12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big2MTQ1KSxpPW4oNzI3Mykscz1uKDU2MzkpO3QuZ2F0aGVyPShlLHQsbik9PihsKHQsbi5heGlzKSxbZS5ydW4odShlLHQsbiksdCldKSx0LnBhcnNlR2F0aGVyQXR0cmlidXRlcz1lPT4oMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtheGlzOmUuYXR0cmlidXRlcy5nZXRJbnQoImF4aXMiLDApfSk7Y29uc3QgYT17bmFtZToiR2F0aGVyIixpbnB1dE5hbWVzOlsiQSIsIkIiXSxpbnB1dFR5cGVzOltzLlRleHR1cmVUeXBlLnVucGFja2VkLHMuVGV4dHVyZVR5cGUudW5wYWNrZWRdfSx1PShlLHQsbik9Pntjb25zdCByPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXl9KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHIpLHtnZXQ6KCk9PigoZSx0LG4scik9Pntjb25zdCBvPW5bMF0uZGltcy5zbGljZSgpLGE9blsxXS5kaW1zLnNsaWNlKCksdT1uZXcgQXJyYXkoby5sZW5ndGgrYS5sZW5ndGgtMSk7cj1pLlNoYXBlVXRpbC5ub3JtYWxpemVBeGlzKHIsby5sZW5ndGgpO2NvbnN0IGw9W107Zm9yKGxldCBlPTA7ZTx1Lmxlbmd0aDtlKyspZTxyPyh1W2VdPW9bZV0sbC5wdXNoKGBpbnB1dElkeFske2V9XSA9IG91dHB1dElkeFske2V9XTtgKSk6ZTxyK2EubGVuZ3RoPyh1W2VdPWFbZS1yXSxsLnB1c2goYGluZGV4RGF0YUlkeFske2Utcn1dID0gb3V0cHV0SWR4WyR7ZX1dO2ApKToodVtlXT1vW2UtYS5sZW5ndGgrMV0sbC5wdXNoKGBpbnB1dElkeFske2UtYS5sZW5ndGgrMX1dID0gb3V0cHV0SWR4WyR7ZX1dO2ApKTtjb25zdCBjPWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IG91dHB1dElkeFske3UubGVuZ3RofHwxfV0pIHtcbiAgICAgICAgaW50IGlucHV0SWR4WyR7by5sZW5ndGh9XTtcbiAgICAgICAgaW50IGluZGV4RGF0YUlkeFske2EubGVuZ3RofHwxfV07XG4gICAgICAgIGluZGV4RGF0YUlkeFswXSA9IDA7XG4gICAgICAgICR7bC5qb2luKCJcbiAgICAgICAgIil9XG4gICAgICAgIGludCBpZHggPSBpbnQoX0IoaW5kZXhEYXRhSWR4KSk7XG4gICAgICAgIGlucHV0SWR4WyR7cn1dID0gaWR4IDwgMCA/IGlkeCArICR7b1tyXX0gOiBpZHg7XG4gICAgICAgIHJldHVybiBfQShpbnB1dElkeCk7XG4gICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvdXRwdXQ6e2RpbXM6dSx0eXBlOm5bMF0udHlwZSx0ZXh0dXJlVHlwZTpzLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6Y30pfSkoMCxyLHQsbi5heGlzKX0pfSxsPShlLHQpPT57aWYoIWV8fDIhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkdhdGhlciByZXF1aXJlcyAyIGlucHV0cy4iKTtjb25zdCBuPWVbMF0uZGltcy5sZW5ndGg7aWYobjwxKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZih0PC1ufHx0Pm4tMSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYXhpcy4iKTtpZigtMT09PW8uTlVNQkVSX1RZUEVTLmluZGV4T2YoZVswXS50eXBlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFpZCBpbnB1dCB0eXBlLiIpO2lmKCJpbnQzMiIhPT1lWzFdLnR5cGUmJiJpbnQxNiIhPT1lWzFdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhaWQgaW5wdXQgdHlwZS4iKX07fSw1Mzc4OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZUdlbW1BdHRyaWJ1dGVzVjExPXQucGFyc2VHZW1tQXR0cmlidXRlc1Y3PXQuZ2VtbT12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big3MjczKSxpPW4oNTYzOSk7dC5nZW1tPShlLHQsbik9PihsKHQsbiksW2UucnVuKGEodCxuKSx0KV0pO2NvbnN0IHM9KGUsdCk9Pntjb25zdCBuPTAhPT1lLmF0dHJpYnV0ZXMuZ2V0SW50KCJ0cmFuc0EiLDApLG89MCE9PWUuYXR0cmlidXRlcy5nZXRJbnQoInRyYW5zQiIsMCksaT1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImFscGhhIiwxKSxzPWUuYXR0cmlidXRlcy5nZXRGbG9hdCgiYmV0YSIsMSk7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe3RyYW5zQTpuLHRyYW5zQjpvLGFscGhhOmksYmV0YTpzLGlzT3B0aW9uYWxDOnR9KX07dC5wYXJzZUdlbW1BdHRyaWJ1dGVzVjc9ZT0+cyhlLCExKSx0LnBhcnNlR2VtbUF0dHJpYnV0ZXNWMTE9ZT0+cyhlLCEwKTtjb25zdCBhPShlLHQpPT57Y29uc3Qgbj17bmFtZToiR2VtbSIsaW5wdXROYW1lczozPT09ZS5sZW5ndGg/WyJBIiwiQiIsIkMiXTpbIkEiLCJCIl0saW5wdXRUeXBlczozPT09ZS5sZW5ndGg/W2kuVGV4dHVyZVR5cGUudW5wYWNrZWQsaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXTpbaS5UZXh0dXJlVHlwZS51bnBhY2tlZCxpLlRleHR1cmVUeXBlLnVucGFja2VkXSxrZXk6dC5jYWNoZUtleX07cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7Z2V0OigpPT51KG4sZSx0KX0pfSx1PShlLHQsbik9Pntjb25zdCByPXRbMF0uZGltcy5zbGljZSgpLHM9dFsxXS5kaW1zLnNsaWNlKCksW2EsdV09by5HZW1tVXRpbC5nZXRTaGFwZU9mR2VtbVJlc3VsdChyLG4udHJhbnNBLHMsbi50cmFuc0IsMz09PXQubGVuZ3RoP3RbMl0uZGltczp2b2lkIDApLGw9W2EsdV07aWYoIWwpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCB1c2UgZ2VtbSBvbiB0aGUgZ2l2ZW4gdGVuc29ycyIpO2xldCBjPXJbci5sZW5ndGgtMV0scD0iIjtuLnRyYW5zQSYmKGM9clswXSksbi50cmFuc0EmJm4udHJhbnNCP3A9InZhbHVlICs9IF9BX1QoYSkgKiBfQl9UKGIpOyI6bi50cmFuc0EmJiFuLnRyYW5zQj9wPSJ2YWx1ZSArPSBfQV9UKGEpICogX0IoYik7Ijohbi50cmFuc0EmJm4udHJhbnNCP3A9InZhbHVlICs9IF9BKGEpICogX0JfVChiKTsiOm4udHJhbnNBfHxuLnRyYW5zQnx8KHA9InZhbHVlICs9IF9BKGEpICogX0IoYik7Iik7Y29uc3QgZD1sLmxlbmd0aCxmPWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtkfV0pIHtcbiAgICAgICAgICBpbnQgYVske2R9XTtcbiAgICAgICAgICBpbnQgYlske2R9XTtcbiAgICAgICAgICAkezM9PT10Lmxlbmd0aD9gaW50IGNbJHt0WzJdLmRpbXMubGVuZ3RofV07YDoiIn1cblxuICAgICAgICAgIGNvcHlWZWMoaW5kaWNlcywgYSk7XG4gICAgICAgICAgY29weVZlYyhpbmRpY2VzLCBiKTtcbiAgICAgICAgICAkezM9PT10Lmxlbmd0aD8iYmNhc3RJbmRpY2VzX0MoaW5kaWNlcywgYyk7IjoiIn1cblxuICAgICAgICAgIGZsb2F0IHZhbHVlID0gMC4wO1xuICAgICAgICAgIGZvciAoaW50IGs9MDsgazwke2N9OyArK2spIHtcbiAgICAgICAgICAgICAgYVske2QtMX1dID0gaztcbiAgICAgICAgICAgICAgYlske2QtMn1dID0gaztcbiAgICAgICAgICAgICAgJHtwfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiBhbHBoYTtcbiAgICAgICAgICAkezM9PT10Lmxlbmd0aD8idmFsdWUgKz0gYmV0YSAqIF9DKGMpOyI6IiJ9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7b3V0cHV0OntkaW1zOmwsdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sdmFyaWFibGVzOlt7bmFtZToiYWxwaGEiLHR5cGU6ImZsb2F0IixkYXRhOm4uYWxwaGF9LHtuYW1lOiJiZXRhIix0eXBlOiJmbG9hdCIsZGF0YTpuLmJldGF9XSxzaGFkZXJTb3VyY2U6Zn0pfSxsPShlLHQpPT57aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBpcyBtaXNzaW5nIik7aWYodC5pc09wdGlvbmFsQyYmKGUubGVuZ3RoPDJ8fGUubGVuZ3RoPjMpKXRocm93IG5ldyBFcnJvcigiSW52YWlkIGlucHV0IHNoYXBlLiIpO2lmKCF0LmlzT3B0aW9uYWxDJiYzIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJHZW1tIHJlcXVpcmVzIDMgaW5wdXRzIik7aWYoMz09PWUubGVuZ3RoJiYxIT09ZVsyXS5kaW1zLmxlbmd0aCYmMiE9PWVbMl0uZGltcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHNoYXBlIG9mIEMiKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZXx8ImZsb2F0MzIiIT09ZVsxXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzFdLnR5cGV8fDM9PT1lLmxlbmd0aCYmImZsb2F0MzIiIT09ZVsyXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzJdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIik7aWYoZVswXS50eXBlIT09ZVsxXS50eXBlfHwzPT09ZS5sZW5ndGgmJmVbMF0udHlwZSE9PWVbMl0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHR5cGVzIGFyZSBtaXNtYXRjaGVkIil9O30sNTk1MDooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlUGFja2VkSW0yQ29sUHJvZ3JhbUluZm9Mb2FkZXI9dm9pZCAwO2NvbnN0IHI9big2NzU3KSxvPW4oNTYzOSksaT1uKDU2MTQpO3QuY3JlYXRlUGFja2VkSW0yQ29sUHJvZ3JhbUluZm9Mb2FkZXI9KGUsdCxuLHMsYSk9Pntjb25zdCB1PShsPWEuY2FjaGVLZXkse25hbWU6IkltMkNvbCAocGFja2VkKSIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOltvLlRleHR1cmVUeXBlLnBhY2tlZF0sY2FjaGVIaW50Omx9KTt2YXIgbDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHUpLHtnZXQ6KCk9PigoZSx0LG4scyxhLHUpPT57Y29uc3QgbD1uLmRpbXMsYz1zLmRpbXMscD1hLmxlbmd0aCxkPVtjWzFdKmNbMl0qY1szXSxhWzJdKmFbM11dLGY9Y1syXSpjWzNdLGg9KDAsIGkudW5wYWNrRnJvbUNoYW5uZWwpKCksZz0oMCwgci5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbik7bGV0IGI9IiI7Zm9yKGxldCBlPTA7ZTw9MTtlKyspZm9yKGxldCB0PTA7dDw9MTt0KyspYis9YFxuICAgICAgICAgICAgYmxvY2tJbmRleCA9IHJjLnggKyAke3R9O1xuICAgICAgICAgICAgcG9zID0gcmMueSArICR7ZX07XG5cbiAgICAgICAgICAgIGlmKGJsb2NrSW5kZXggPCAke2RbMV19ICYmIHBvcyA8ICR7ZFswXX0pIHtcbiAgICAgICAgICAgICAgb2Zmc2V0WSA9IGludChibG9ja0luZGV4IC8gKCR7YVtwLTFdfSkpICogJHt1LnN0cmlkZXNbMF19IC1cbiAgICAgICAgICAgICAgICAke3UucGFkc1swXX07XG4gICAgICAgICAgICAgIGQwID0gb2Zmc2V0WSArICR7dS5kaWxhdGlvbnNbMF19ICogKGltb2QocG9zLCAke2Z9KSAvICR7Y1syXX0pO1xuXG4gICAgICAgICAgICAgIGlmKGQwIDwgJHtsWzJdfSAmJiBkMCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0WCA9IGltb2QoYmxvY2tJbmRleCwgJHthW3AtMV19KSAqICR7dS5zdHJpZGVzWzFdfSAtXG4gICAgICAgICAgICAgICAgICAke3UucGFkc1sxXX07XG4gICAgICAgICAgICAgICAgZDEgPSBvZmZzZXRYICsgJHt1LmRpbGF0aW9uc1sxXX0gKiBpbW9kKGltb2QocG9zLCAke2Z9KSwgJHtjWzJdfSk7XG5cbiAgICAgICAgICAgICAgICBpZihkMSA8ICR7bFszXX0gJiYgZDEgPj0gMCkge1xuXG4gICAgICAgICAgICAgICAgICBjaCA9IGludChmbG9hdChwb3MpLyAke2Z9Lik7XG4gICAgICAgICAgICAgICAgICAgIGlubmVyRGltcyA9IHZlYzIoZDAsIGQxKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0WyR7MiplK3R9XSA9IGdldENoYW5uZWwoXG4gICAgICAgICAgICAgICAgICAgICAgZ2V0QSgwLCBjaCwgaW50KGlubmVyRGltcy54KSxcbiAgICAgICAgICAgICAgICAgICAgICBpbnQoaW5uZXJEaW1zLnkpKSwgaW5uZXJEaW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGA7Y29uc3QgbT1gXG4gICAgICAke2h9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzIgcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4wKTtcbiAgICAgICAgICBpbnQgYmxvY2tJbmRleCwgcG9zLCBvZmZzZXRZLCBkMCwgb2Zmc2V0WCwgZDEsIGNoO1xuICAgICAgICAgIHZlYzIgaW5uZXJEaW1zO1xuICAgICAgICAgICR7Yn1cbiAgICAgICAgICAke2cub3V0cHV0fSA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgICAgICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7b3V0cHV0OntkaW1zOmQsdHlwZTpuLnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS5wYWNrZWR9LHNoYWRlclNvdXJjZTptLGhhc01haW46ITB9KX0pKGUsdSx0LG4scyxhKX0pfTt9LDE2MjU6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNhbGN1bGF0ZUltMkNvbERpbXM9dC5jcmVhdGVJbTJDb2xQcm9ncmFtSW5mb0xvYWRlcj12b2lkIDA7Y29uc3Qgcj1uKDU2MzkpO3QuY3JlYXRlSW0yQ29sUHJvZ3JhbUluZm9Mb2FkZXI9KGUsbixvLGkscyk9Pntjb25zdCBhPSh1PXMuY2FjaGVLZXkse25hbWU6IkltMkNvbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltyLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6dX0pO3ZhciB1O3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2dldDooKT0+KChlLG4sbyxpLHMsYSk9Pntjb25zdCB1PW8uZGltcyxsPWkuZGltcyxjPXMubGVuZ3RoLHA9KDAsIHQuY2FsY3VsYXRlSW0yQ29sRGltcykodSxsLHMsNCksZD1gXG4gICAgICAgIGNvbnN0IGludCBYQyA9ICR7dVsxXX07XG4gICAgICAgIGNvbnN0IGludCBYSCA9ICR7dVsyXX07XG4gICAgICAgIGNvbnN0IGludCBYVyA9ICR7dVszXX07XG4gICAgICAgIGNvbnN0IGludCBLSCA9ICR7YS5rZXJuZWxTaGFwZVswXX07XG4gICAgICAgIGNvbnN0IGludCBLVyA9ICR7YS5rZXJuZWxTaGFwZVsxXX07XG4gICAgICAgIGNvbnN0IGludCBkaWxhdGlvbkggPSAke2EuZGlsYXRpb25zWzBdfTtcbiAgICAgICAgY29uc3QgaW50IGRpbGF0aW9uVyA9ICR7YS5kaWxhdGlvbnNbMV19O1xuICAgICAgICBjb25zdCBpbnQgc3RyaWRlSCA9ICR7YS5zdHJpZGVzWzBdfTtcbiAgICAgICAgY29uc3QgaW50IHN0cmlkZVcgPSAke2Euc3RyaWRlc1sxXX07XG4gICAgICAgIGNvbnN0IGludCBwYWRIID0gJHthLnBhZHNbMF19O1xuICAgICAgICBjb25zdCBpbnQgcGFkVyA9ICR7YS5wYWRzWzFdfTtcbiAgICAgICAgY29uc3QgaW50IEtIS1cgPSBLSCpLVztcbiAgICAgICAgY29uc3QgaW50IFhDS0hLVyA9IFhDICogS0hLVztcbiAgICAgICAgY29uc3QgaW50IG91dHB1dENoYW5uZWxzID0gNDtcbiAgICAgICAgdmVjNCBwcm9jZXNzKGludCBpbmRpY2VzWyR7Y31dKSB7XG4gICAgICAgICAgaW50IGIgID0gaW5kaWNlc1swXTsgLy8gYmF0Y2ggc2l6ZVxuICAgICAgICAgIGludCBvaCA9IGluZGljZXNbMV0gKiBzdHJpZGVIIC0gcGFkSDsgLy9vdXRwdXQgaGVpZ2h0XG4gICAgICAgICAgaW50IG93ID0gaW5kaWNlc1syXSAqIHN0cmlkZVcgLSBwYWRXOyAvL291dHB1dCB3aWR0aFxuICAgICAgICAgIGludCBwID0gaW5kaWNlc1szXSAqIG91dHB1dENoYW5uZWxzOyAvL3BhdGNoXG4gICAgICAgICAgdmVjNCB2YWx1ZSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICBmb3IoaW50IGk9MDsgaSA8IG91dHB1dENoYW5uZWxzOyArK2kpIHtcbiAgICAgICAgICAgIGlmKHAgPCBYQ0tIS1cpIHtcbiAgICAgICAgICAgICAgaW50IHBhdGNoQyA9IHAgLyBLSEtXO1xuICAgICAgICAgICAgICBpbnQgcGF0Y2hIID0gKHAgLSBwYXRjaEMqS0hLVykgLyBLVztcbiAgICAgICAgICAgICAgaW50IHBhdGNoVyA9IChwIC0gcGF0Y2hDKktIS1cpIC0gcGF0Y2hIICogS1c7XG4gICAgICAgICAgICAgIGludCB4aDIgPSBvaCArIHBhdGNoSCAqIGRpbGF0aW9uSDtcbiAgICAgICAgICAgICAgaW50IHh3MiA9IG93ICsgcGF0Y2hXICogZGlsYXRpb25XO1xuICAgICAgICAgICAgICBpbnQgeFske3UubGVuZ3RofV07XG4gICAgICAgICAgICAgIHhbMF0gPSBiO1xuICAgICAgICAgICAgICB4WzFdID0gcGF0Y2hDO1xuICAgICAgICAgICAgICB4WzJdID0geGgyO1xuICAgICAgICAgICAgICB4WzNdID0geHcyO1xuICAgICAgICAgICAgICBpZih4aDIgPj0gMCAmJlxuICAgICAgICAgICAgICAgICAgeGgyIDwgWEggJiZcbiAgICAgICAgICAgICAgICAgIHh3MiA+PSAwICYmXG4gICAgICAgICAgICAgICAgICB4dzIgPCBYVykge1xuICAgICAgICAgICAgICAgIHZhbHVlW2ldID0gX1goeCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICsrcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7b3V0cHV0OntkaW1zOnAsdHlwZTpvLnR5cGUsdGV4dHVyZVR5cGU6ci5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9ufSxzaGFkZXJTb3VyY2U6ZH0pfSkoMCxhLG4sbyxpLHMpfSl9LHQuY2FsY3VsYXRlSW0yQ29sRGltcz0oZSx0LG4scj00KT0+W25bMF0sblsyXSxuWzNdLE1hdGguY2VpbChlWzFdKnRbMl0qdFszXS9yKV07fSw2OTgxOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZUltYWdlU2NhbGVyQXR0cmlidXRlcz10LmltYWdlU2NhbGVyPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDU2MzkpO3QuaW1hZ2VTY2FsZXI9KGUsdCxuKT0+KHUodCksW2UucnVuKHMoZSx0LG4pLHQpXSksdC5wYXJzZUltYWdlU2NhbGVyQXR0cmlidXRlcz1lPT57Y29uc3QgdD1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoInNjYWxlIiksbj1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXRzKCJiaWFzIik7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe3NjYWxlOnQsYmlhczpufSl9O2NvbnN0IGk9e25hbWU6IkltYWdlU2NhbGVyIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWRdfSxzPShlLHQsbik9Pntjb25zdCByPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXl9KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHIpLHtnZXQ6KCk9PigoZSx0LG4scik9Pntjb25zdCBpPW5bMF0uZGltcy5zbGljZSgpLHM9aS5sZW5ndGgsdT1gXG4gICAgICAke2Eoci5iaWFzLmxlbmd0aCl9XG4gICAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7c31dKSB7XG4gICAgICAgIHJldHVybiBfWChpbmRpY2VzKSAqIHNjYWxlICsgZ2V0QmlhcyhiaWFzLCBpbmRpY2VzWzFdKTtcbiAgICAgIH1gO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse291dHB1dDp7ZGltczppLHR5cGU6blswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LHZhcmlhYmxlczpbe25hbWU6ImJpYXMiLHR5cGU6ImZsb2F0IixhcnJheUxlbmd0aDpyLmJpYXMubGVuZ3RoLGRhdGE6ci5iaWFzfSx7bmFtZToic2NhbGUiLHR5cGU6ImZsb2F0IixkYXRhOnIuc2NhbGV9XSxzaGFkZXJTb3VyY2U6dX0pfSkoMCxyLHQsbil9KX0sYT1lPT57Y29uc3QgdD1bYGZsb2F0IGdldEJpYXMoZmxvYXQgYmlhc1ske2V9XSwgaW50IGNoYW5uZWwpIHtgXTtmb3IobGV0IG49MDtuPGU7KytuKTA9PT1uP3QucHVzaChgXHRpZiAoY2hhbm5lbCA9PSAke259KSB7IHJldHVybiBiaWFzWyR7bn1dOyB9YCk6bj09PWUtMT90LnB1c2goYFx0ZWxzZSB7IHJldHVybiBiaWFzWyR7bn1dOyB9YCk6dC5wdXNoKGBcdGVsc2UgaWYgKGNoYW5uZWwgPT0gJHtufSkgeyByZXR1cm4gYmlhc1ske259XTsgfWApO3JldHVybiB0LnB1c2goIlx0fSIpLHQuam9pbigiXG4iKX0sdT1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkltYWdlU2NhbGVyIHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoNCE9PWVbMF0uZGltcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHNoYXBlLiIpO2lmKCJmbG9hdDMyIiE9PWVbMF0udHlwZSYmImZsb2F0NjQiIT09ZVswXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDc0MTM6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlSW5zdGFuY2VOb3JtYWxpemF0aW9uQXR0cmlidXRlcz10Lmluc3RhbmNlTm9ybWFsaXphdGlvbj12b2lkIDA7Y29uc3Qgcj1uKDY3NTcpLG89big1NjM5KTt0Lmluc3RhbmNlTm9ybWFsaXphdGlvbj0oZSx0LG4pPT57bCh0KTtjb25zdCByPWUucnVuKHModFswXSksdCk7cmV0dXJuIFtlLnJ1bih1KGUsdFswXSxuLHIuZGltcyksW3RbMF0scix0WzFdLHRbMl1dKV19LHQucGFyc2VJbnN0YW5jZU5vcm1hbGl6YXRpb25BdHRyaWJ1dGVzPWU9PmUuYXR0cmlidXRlcy5nZXRGbG9hdCgiZXBzaWxvbiIsMWUtNSk7Y29uc3QgaT17bmFtZToiSW5zdGFuY2VOb3JtYWxpemF0aW9uX01lYW5BbmRWYXJpYW5jZSIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltvLlRleHR1cmVUeXBlLnVucGFja2VkXX0scz1lPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSkse2dldDooKT0+KChlLHQpPT57Y29uc3Qgbj10LmRpbXMuc2xpY2UoKSxyPW5bMV0saT1uWzJdKm5bM10scz1bblswXSxyXSxhPWBcbiAgICAgIHZlYzQgcHJvY2VzcyhpbnRbMl0gaW5kaWNlcykge1xuICAgICAgICB2ZWM0IHYgPSB2ZWM0KDAuMCk7XG4gICAgICAgIGludCBhWzRdO1xuICAgICAgICBhWzBdID0gaW5kaWNlc1swXTtcbiAgICAgICAgYVsxXSA9IGluZGljZXNbMV07XG4gICAgICAgIGZsb2F0IHRlbXAgPSAwLjA7XG4gICAgICAgIGZvcihpbnQgYTI9MDsgYTI8JHtuWzJdfTsgYTIrKykge1xuICAgICAgICAgIGFbMl0gPSBhMjtcbiAgICAgICAgICBmb3IoaW50IGEzPTA7IGEzPCR7blszXX07IGEzKyspIHtcbiAgICAgICAgICAgIGFbM10gPSBhMztcbiAgICAgICAgICAgIGZsb2F0IHggPSBfWChhKTtcbiAgICAgICAgICAgIHRlbXAgKz0geDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmxvYXQgbWVhbiA9IHRlbXAgLyBmbG9hdCgke2l9KTtcbiAgICAgICAgdGVtcCA9IDAuMDtcbiAgICAgICAgZm9yKGludCBhMj0wOyBhMjwke25bMl19OyBhMisrKSB7XG4gICAgICAgICAgYVsyXSA9IGEyO1xuICAgICAgICAgIGZvcihpbnQgYTM9MDsgYTM8JHtuWzNdfTsgYTMrKykge1xuICAgICAgICAgICAgYVszXSA9IGEzO1xuICAgICAgICAgICAgZmxvYXQgeCA9IF9YKGEpO1xuICAgICAgICAgICAgdGVtcCArPSAoeCAtIG1lYW4pICogKHggLSBtZWFuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdi5yID0gbWVhbjtcbiAgICAgICAgdi5nID0gdGVtcCAvIGZsb2F0KCR7aX0pO1xuXG4gICAgICAgIHJldHVybiB2O1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7b3V0cHV0OntkaW1zOnMsdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9ufSxzaGFkZXJTb3VyY2U6YX0pfSkoaSxlKX0pLGE9e25hbWU6Ikluc3RhbmNlTm9ybWFsaXphdGlvbl9Db21wdXRlT3V0cHV0IixpbnB1dE5hbWVzOlsiWCIsIk1lYW5BbmRWYXJpYW5jZSIsIlNjYWxlIiwiQiJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWQsby5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uLG8uVGV4dHVyZVR5cGUudW5wYWNrZWQsby5UZXh0dXJlVHlwZS51bnBhY2tlZF19LHU9KGUsdCxuLGkpPT57Y29uc3Qgcz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpgJHtufWB9KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtnZXQ6KCk9PigoZSx0LG4saSxzKT0+e2NvbnN0IGE9KDAsIHIuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFt1LGxdPWUuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0KHMsby5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uKSxbYyxwXT1bdS80LGxdLGQ9YFxuICAgICAgdmVjNCBnZXRfTWVhbkFuZFZhcmlhbmNlKGludFsyXSBtdikge1xuICAgICAgICBpbnQgb2Zmc2V0ID0gaW5kaWNlc1RvT2Zmc2V0X01lYW5BbmRWYXJpYW5jZShtdik7XG4gICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke2N9LCAke3B9KTtcbiAgICAgICAgcmV0dXJuICR7YS50ZXh0dXJlMkR9KE1lYW5BbmRWYXJpYW5jZSwgY29vcmRzKTtcbiAgICAgIH1cblxuICAgICAgZmxvYXQgcHJvY2VzcyhpbnRbNF0gaW5kaWNlcykge1xuICAgICAgICBpbnQgbXZbMl07XG4gICAgICAgIG12WzBdID0gaW5kaWNlc1swXTtcbiAgICAgICAgbXZbMV0gPSBpbmRpY2VzWzFdO1xuICAgICAgICB2ZWM0IG1lYW5fYW5kX3ZhcmlhbmNlID0gZ2V0X01lYW5BbmRWYXJpYW5jZShtdik7XG4gICAgICAgIGZsb2F0IG1lYW4gPSBtZWFuX2FuZF92YXJpYW5jZS5yO1xuICAgICAgICBmbG9hdCB2YXJpYW5jZSA9IG1lYW5fYW5kX3ZhcmlhbmNlLmc7XG5cbiAgICAgICAgaW50IHNiWzFdO1xuICAgICAgICBzYlswXSA9IGluZGljZXNbMV07XG4gICAgICAgIGZsb2F0IHNjYWxlID0gX1NjYWxlKHNiKTtcbiAgICAgICAgZmxvYXQgYiA9IF9CKHNiKTtcblxuICAgICAgICByZXR1cm4gc2NhbGUgKiAoX1goaW5kaWNlcykgLSBtZWFuKSAvIHNxcnQodmFyaWFuY2UgKyBlcHNpbG9uKSArIGI7XG4gICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvdXRwdXQ6e2RpbXM6bi5kaW1zLHR5cGU6bi50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LHZhcmlhYmxlczpbe25hbWU6ImVwc2lsb24iLHR5cGU6ImZsb2F0IixkYXRhOml9XSxzaGFkZXJTb3VyY2U6ZH0pfSkoZSxzLHQsbixpKX0pfSxsPWU9PntpZighZXx8MyE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW5zdGFuY2VOb3JtYWxpemF0aW9uIHJlcXVpcmVzIDMgaW5wdXRzLiIpO2NvbnN0IHQ9ZVswXSxuPWVbMV0scj1lWzJdO2lmKHQuZGltcy5sZW5ndGg8M3x8MSE9PW4uZGltcy5sZW5ndGh8fDEhPT1yLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZihuLmRpbXNbMF0hPT10LmRpbXNbMV18fHIuZGltc1swXSE9PXQuZGltc1sxXSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHNoYXBlcyBhcmUgbWlzbWF0Y2hlZC4iKTtpZigiZmxvYXQzMiIhPT10LnR5cGUmJiJmbG9hdDY0IiE9PXQudHlwZXx8ImZsb2F0MzIiIT09bi50eXBlJiYiZmxvYXQ2NCIhPT1uLnR5cGV8fCJmbG9hdDMyIiE9PXIudHlwZSYmImZsb2F0NjQiIT09ci50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKDQhPT1lWzBdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiT25seSBzdXBwb3J0IDQtRCBpbnB1dCBzaGFwZS4iKX07fSw3MDA2OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jcmVhdGVMcm5Qcm9ncmFtSW5mb0xvYWRlcj10LnBhcnNlTHJuQXR0cmlidXRlcz10Lmxybj12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big1NjM5KTt0Lmxybj0oZSx0LG4pPT4oYSh0KSxbZS5ydW4ocyh0LG4pLHQpXSksdC5wYXJzZUxybkF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEZsb2F0KCJhbHBoYSIsMWUtNCksbj1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImJldGEiLC43NSksbz1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImJpYXMiLDEpLGk9ZS5hdHRyaWJ1dGVzLmdldEludCgic2l6ZSIpO3JldHVybiAoMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHthbHBoYTp0LGJldGE6bixiaWFzOm8sc2l6ZTppfSl9O2NvbnN0IGk9e25hbWU6IkxSTiIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltvLlRleHR1cmVUeXBlLnVucGFja2VkXX07ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSkse2NhY2hlSGludDp0LmNhY2hlS2V5LGdldDooKT0+ZnVuY3Rpb24oZSx0KXtjb25zdCBuPWVbMF0uZGltc1sxXSxyPWVbMF0uZGltcy5sZW5ndGgscz0tTWF0aC5mbG9vcigodC5zaXplLTEpLzIpLGE9TWF0aC5jZWlsKCh0LnNpemUtMSkvMiksdT1gZmxvYXQoJHt0LmFscGhhfSkgLyBmbG9hdCgke3Quc2l6ZX0pYCxsPWBcbiAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7cn1dKSB7XG4gICAgICAgIGludCBjID0gaW5kaWNlc1sxXTtcbiAgICAgICAgZmxvYXQgeCA9IF9YKGluZGljZXMpO1xuICAgICAgICBmbG9hdCBzcXVhcmVfc3VtID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAke3N9OyBpIDw9ICR7YX07IGkrKykge1xuICAgICAgICAgIGludCBpZHggPSBjICsgaTtcbiAgICAgICAgICBpZiAoYyA+PSAwICYmIGMgPCAke259KSB7XG4gICAgICAgICAgICBpbmRpY2VzWzFdID0gaWR4O1xuICAgICAgICAgICAgZmxvYXQgaiA9IF9YKGluZGljZXMpO1xuICAgICAgICAgICAgc3F1YXJlX3N1bSArPSBqICogajtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggLyBwb3coZmxvYXQoJHt0LmJpYXN9KSArICR7dX0gKiBzcXVhcmVfc3VtLCBmbG9hdCgke3QuYmV0YX0pKTtcbiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGkpLHtjYWNoZUhpbnQ6dC5jYWNoZUtleSxvdXRwdXQ6e2RpbXM6ZVswXS5kaW1zLHR5cGU6ZVswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpsfSl9KGUsdCl9KX10LmNyZWF0ZUxyblByb2dyYW1JbmZvTG9hZGVyPXM7Y29uc3QgYT1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkxSTiByZXF1aXJlcyAxIGlucHV0LiIpO2lmKDQhPT1lWzBdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcignY3VycmVudGx5IG9ubHkgc3VwcG9ydCBMUk4gZm9yIGlucHV0IHdpdGggIk5DSFciIGZvcm1hdCcpO2lmKCJmbG9hdDMyIiE9PWVbMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoImlucHV0IHNob3VsZCBiZSBmbG9hdCB0eXBlIil9O30sNTYzMjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlUGFja2VkTWF0bXVsUHJvZ3JhbUluZm9Mb2FkZXI9dm9pZCAwO2NvbnN0IHI9big3MjczKSxvPW4oNjc1NyksaT1uKDU2MzkpLHM9big0MzIpLGE9bigyMTUwKSx1PW4oODI3Nik7dC5jcmVhdGVQYWNrZWRNYXRtdWxQcm9ncmFtSW5mb0xvYWRlcj0oZSx0LG4pPT57Y29uc3QgbD0oYz10Lmxlbmd0aD4yLHA9bi5hY3RpdmF0aW9uQ2FjaGVLZXkse25hbWU6Ik1hdE11bCAocGFja2VkKSIsaW5wdXROYW1lczpjP1siQSIsIkIiLCJCaWFzIl06WyJBIiwiQiJdLGlucHV0VHlwZXM6Yz9baS5UZXh0dXJlVHlwZS5wYWNrZWQsaS5UZXh0dXJlVHlwZS5wYWNrZWQsaS5UZXh0dXJlVHlwZS5wYWNrZWRdOltpLlRleHR1cmVUeXBlLnBhY2tlZCxpLlRleHR1cmVUeXBlLnBhY2tlZF0sY2FjaGVIaW50OnB9KTt2YXIgYyxwO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbCkse2dldDooKT0+KChlLHQsbixsKT0+e2NvbnN0IGM9bi5sZW5ndGg+MixwPWM/InZhbHVlICs9IGdldEJpYXNGb3JNYXRtdWwoKTsiOiIiLGQ9blswXS5kaW1zLGY9blsxXS5kaW1zLGg9ci5Ccm9hZGNhc3RVdGlsLmNhbGNTaGFwZShkLGYsITApLGc9IXIuU2hhcGVVdGlsLmFyZUVxdWFsKG5bMF0uZGltcyxuWzFdLmRpbXMpO2lmKCFoKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgdXNlIG1hdG11bCBvbiB0aGUgZ2l2ZW4gdGVuc29ycyIpO2NvbnN0IGI9ZFtkLmxlbmd0aC0xXSxtPU1hdGguY2VpbChiLzIpLHk9ZC5sZW5ndGgsdj1mLmxlbmd0aCxfPSgwLCBvLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKSx3PSgwLCBzLmdldENvb3Jkc0RhdGFUeXBlKShoLmxlbmd0aCksVD1oLmxlbmd0aCx4PSgwLCBzLmdldEdsQ2hhbm5lbHMpKCkse2FjdGl2YXRpb25GdW5jdGlvbjpPLGFwcGx5QWN0aXZhdGlvbjpTfT0oMCwgYS5nZXRBY3RpdmF0aW9uU25pcHBldCkobCksQT1jP2AkeygwLCB1LmdldEJpYXNGb3JNYXRtdWwpKHcseCxuWzJdLmRpbXMsaCwhMCl9YDoiIixQPWc/YCR7ZnVuY3Rpb24oZSx0LG4sbyl7bGV0IGk9W10scz1bXTtjb25zdCBhPW5bMF0uZGltcyx1PW5bMV0uZGltcyxsPWEubGVuZ3RoLGM9dS5sZW5ndGgscD1vLmxlbmd0aCxkPXAtbCxmPXAtYztpPWEubWFwKCgoZSxuKT0+YGNvb3Jkcy4ke3RbbitkXX1gKSksaVtsLTFdPSJpKjIiLGkuam9pbigiLCAiKSxzPXUubWFwKCgoZSxuKT0+YGNvb3Jkcy4ke3RbbitmXX1gKSksc1tjLTJdPSJpKjIiLHMuam9pbigiLCAiKTtjb25zdCBoPXIuQnJvYWRjYXN0VXRpbC5nZXRCcm9hZGNhc3REaW1zKGEsbyksZz1yLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyh1LG8pLGI9aC5tYXAoKGU9PmBjb29yZHMuJHt0W2UrZF19ID0gMDtgKSkuam9pbigiXG4iKSxtPWcubWFwKChlPT5gY29vcmRzLiR7dFtlK2ZdfSA9IDA7YCkpLmpvaW4oIlxuIikseT1gaW50IGxhc3REaW0gPSBjb29yZHMuJHt0W3AtMV19O1xuICBjb29yZHMuJHt0W3AtMV19ID0gY29vcmRzLiR7dFtwLTJdfTtcbiAgY29vcmRzLiR7dFtwLTJdfSA9IGxhc3REaW07YDtyZXR1cm4gYFxudmVjNCBnZXRBQXRPdXRDb29yZHNNYXRtdWwoaW50IGkpIHtcbiAgJHtlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgJHt5fVxuICAke2J9XG4gIHZlYzQgb3V0cHV0VmFsdWUgPSBnZXRBKCR7aX0pO1xuICByZXR1cm4gb3V0cHV0VmFsdWU7XG59XG5cbnZlYzQgZ2V0QkF0T3V0Q29vcmRzTWF0bXVsKGludCBpKSB7XG4gICR7ZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICR7eX1cbiAgJHttfVxuICB2ZWM0IG91dHB1dFZhbHVlID0gZ2V0Qigke3N9KTtcbiAgcmV0dXJuIG91dHB1dFZhbHVlO1xufWB9KHcseCxuLGgpfWA6IiIsST1nPyJnZXRBQXRPdXRDb29yZHNNYXRtdWwoaSkiOmBnZXRBKCR7ZnVuY3Rpb24oZSx0KXtsZXQgbj0iIjtmb3IobGV0IHI9MDtyPHQtMjtyKyspbis9YHJjLiR7ZVtyXX0sIGA7cmV0dXJuIG4rPWByYy4ke2VbdC0yXX0sIGkqMmAsbn0oeCx5KX0pYCxFPWc/ImdldEJBdE91dENvb3Jkc01hdG11bChpKSI6YGdldEIoJHtmdW5jdGlvbihlLHQpe2xldCBuPSIiO2ZvcihsZXQgcj0wO3I8dC0yO3IrKyluKz1gcmMuJHtlW3JdfSwgYDtyZXR1cm4gbis9YGkqMiwgcmMuJHtlW3QtMV19YCxufSh4LHYpfSlgLEQ9YFxuICAgICAgICAgICAgJHtQfVxuICAgICAgICAgICAgJHtBfVxuICAgICAgICAgICAgJHtPfVxuICAgICAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICAgICAke2c/IiI6YCR7d30gcmMgPVxuICAgICAgICAgIGdldE91dHB1dENvb3JkcygpOyBpbnQgbGFzdERpbSA9IHJjLiR7eFtULTFdfTsgcmMuJHt4W1QtMV19ID1cbiAgICAgICAgICByYy4ke3hbVC0yXX07IHJjLiR7eFtULTJdfSA9IGxhc3REaW07XG4gICAgICBgfVxuXG4gICAgICAgICAgICAgIHZlYzQgdmFsdWUgPSB2ZWM0KDApO1xuICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7bX07IGkrKykge1xuICAgICAgICAgICAgICAgIHZlYzQgYSA9ICR7SX07XG4gICAgICAgICAgICAgICAgdmVjNCBiID0gJHtFfTtcblxuICAgICAgICAgICAgICAgIHZhbHVlICs9IChhLnJyYmIgKiBiLnJncmcpO1xuICAgICAgICAgICAgICAgIHZhbHVlICs9IChhLmdnYWEgKiBiLmJhYmEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICR7cH1cbiAgICAgICAgICAgICAgJHtTfVxuICAgICAgICAgICAgICAke18ub3V0cHV0fSA9IHZhbHVlO1xuICAgICAgICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7b3V0cHV0OntkaW1zOmgsdHlwZTpuWzBdLnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS5wYWNrZWR9LHNoYWRlclNvdXJjZTpELGhhc01haW46ITB9KX0pKGUsbCx0LG4pfSl9O30sODI3NjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0Qmlhc0Zvck1hdG11bD10LmNyZWF0ZU1hdG11bFByb2dyYW1JbmZvTG9hZGVyPXQucGFyc2VNYXRNdWxBdHRyaWJ1dGVzPXQubWF0TXVsPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDU2MzkpLGk9big0MzIpLHM9bigyMTUwKSxhPW4oNTYzMik7dC5tYXRNdWw9KGUsdCxuKT0+KGModCksZS5zZXNzaW9uLnBhY2s/W2UucnVuKCgwLCBhLmNyZWF0ZVBhY2tlZE1hdG11bFByb2dyYW1JbmZvTG9hZGVyKShlLHQsbiksdCldOltlLnJ1bihsKHQsbiksdCldKSx0LnBhcnNlTWF0TXVsQXR0cmlidXRlcz1lPT4oMCwgcy5wYXJzZUludGVybmFsQWN0aXZhdGlvbkF0dHJpYnV0ZXMpKGUuYXR0cmlidXRlcyk7Y29uc3QgdT0oZSx0KT0+KHtuYW1lOiJNYXRNdWwiLGlucHV0TmFtZXM6ZT9bIkEiLCJCIiwiQmlhcyJdOlsiQSIsIkIiXSxpbnB1dFR5cGVzOmU/W28uVGV4dHVyZVR5cGUudW5wYWNrZWQsby5UZXh0dXJlVHlwZS51bnBhY2tlZCxvLlRleHR1cmVUeXBlLnVucGFja2VkXTpbby5UZXh0dXJlVHlwZS51bnBhY2tlZCxvLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6dH0pO2Z1bmN0aW9uIGwoZSx0KXtjb25zdCBuPXUoZS5sZW5ndGg+Mix0LmFjdGl2YXRpb25DYWNoZUtleSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7Z2V0OigpPT5mdW5jdGlvbihlLHQsbil7Y29uc3QgYT10WzBdLmRpbXMsdT10WzFdLmRpbXMsbD1yLkJyb2FkY2FzdFV0aWwuY2FsY1NoYXBlKGEsdSwhMCk7aWYoIWwpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCB1c2UgbWF0bXVsIG9uIHRoZSBnaXZlbiB0ZW5zb3JzIik7Y29uc3QgYz0oMCwgaS5nZXRDb29yZHNEYXRhVHlwZSkobC5sZW5ndGgpLGQ9KDAsIGkuZ2V0R2xDaGFubmVscykoKSx7YWN0aXZhdGlvbkZ1bmN0aW9uOmYsYXBwbHlBY3RpdmF0aW9uOmh9PSgwLCBzLmdldEFjdGl2YXRpb25TbmlwcGV0KShuKSxnPXQubGVuZ3RoPjIsYj1nPyJ2YWx1ZSArPSBnZXRCaWFzRm9yTWF0bXVsKCk7IjoiIixtPWc/YCR7cChjLGQsdFsyXS5kaW1zLGwsITEpfWA6IiIseT1sLmxlbmd0aCx2PWEubGVuZ3RoLF89dS5sZW5ndGgsdz1gXG4gICAgJHtmfVxuICAgICR7bX1cbiAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7eX1dKSB7XG4gICAgICAgIGludCBhWyR7dn1dO1xuICAgICAgICBpbnQgYlske199XTtcbiAgICAgICAgYmNhc3RNYXRtdWxJbmRpY2VzX0EoaW5kaWNlcywgYSk7XG4gICAgICAgIGJjYXN0TWF0bXVsSW5kaWNlc19CKGluZGljZXMsIGIpO1xuXG4gICAgICAgIGZsb2F0IHZhbHVlO1xuICAgICAgICBmb3IgKGludCBrPTA7IGs8JHthW2EubGVuZ3RoLTFdfTsgKytrKSB7XG4gICAgICAgICAgICBhWyR7di0xfV0gPSBrO1xuICAgICAgICAgICAgYlske18tMn1dID0gaztcbiAgICAgICAgICAgIHZhbHVlICs9IF9BKGEpICogX0IoYik7XG4gICAgICAgIH1cbiAgICAgICAgJHtifVxuICAgICAgICAke2h9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHtvdXRwdXQ6e2RpbXM6bCx0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTpvLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6d30pfShuLGUsdCl9KX10LmNyZWF0ZU1hdG11bFByb2dyYW1JbmZvTG9hZGVyPWw7Y29uc3QgYz1lPT57aWYoIWV8fDIhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk1hdE11bCByZXF1aXJlcyAyIGlucHV0cy4iKTtpZihlWzBdLmRpbXNbZVswXS5kaW1zLmxlbmd0aC0xXSE9PWVbMV0uZGltc1tlWzFdLmRpbXMubGVuZ3RoLTJdKXRocm93IG5ldyBFcnJvcigic2hhcmVkIGRpbWVuc2lvbiBkb2VzIG5vdCBtYXRjaC4iKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZXx8ImZsb2F0MzIiIT09ZVsxXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzFdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnB1dHMgc2hvdWxkIGJlIGZsb2F0IHR5cGUiKTtpZihlWzBdLnR5cGUhPT1lWzFdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnB1dHMgdHlwZXMgc2hvdWxkIG1hdGNoIil9O2Z1bmN0aW9uIHAoZSx0LG4sbyxpKXtsZXQgcz0iIjtjb25zdCBhPW4ubGVuZ3RoLHU9by5sZW5ndGgsbD11LWE7cz11PDImJmE+MD8iY29vcmRzIjpuLm1hcCgoKGUsbik9PmBjb29yZHMuJHt0W24rbF19YCkpLmpvaW4oIiwgIik7Y29uc3QgYz1yLkJyb2FkY2FzdFV0aWwuZ2V0QnJvYWRjYXN0RGltcyhuLG8pLm1hcCgoZT0+YGNvb3Jkcy4ke3RbZStsXX0gPSAwO2ApKS5qb2luKCJcbiIpO2xldCBwPSJ2ZWM0KG91dHB1dFZhbHVlLnh4LCBvdXRwdXRWYWx1ZS55eSkiO3JldHVybiAxPT09ci5TaGFwZVV0aWwuc2l6ZShuKSYmKHA9InZlYzQob3V0cHV0VmFsdWUueCkiKSxpP2BcbnZlYzQgZ2V0Qmlhc0Zvck1hdG11bCgpIHtcbiAgJHtlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgJHtjfVxuICB2ZWM0IG91dHB1dFZhbHVlID0gZ2V0Qmlhcygke3N9KTtcbiAgcmV0dXJuICR7cH07XG59YDpgXG5mbG9hdCBnZXRCaWFzRm9yTWF0bXVsKCkge1xuICAke2V9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAke2N9XG4gIHJldHVybiBnZXRCaWFzKGNvb3Jkcy54KTtcbn1gfXQuZ2V0Qmlhc0Zvck1hdG11bD1wO30sOTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuY3JlYXRlUGFja1Byb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCByPW4oNjc1Nyksbz1uKDU2MzkpLGk9big0MzIpLHM9big1NjE0KSxhPXtuYW1lOiJwYWNrIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWRSZXZlcnNlZF19O3QuY3JlYXRlUGFja1Byb2dyYW1JbmZvTG9hZGVyPShlLHQpPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2dldDooKT0+KChlLHQpPT57Y29uc3Qgbj0oMCwgci5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksdT10LmRpbXMsbD11Lmxlbmd0aCxjPXQuZGltcy5sZW5ndGgscD0oMCwgaS5nZXRDb29yZHNEYXRhVHlwZSkoYyksZD0oMCwgcy5nZXRDaGFubmVscykoInJjIixjKSxmPShoPWMsZz1kLGI9dVt1Lmxlbmd0aC0yXSxtPXVbdS5sZW5ndGgtMV0sMD09PWh8fDE9PT1oPyIiOmBcbiAgICBpbnQgciA9ICR7Z1toLTJdfTtcbiAgICBpbnQgYyA9ICR7Z1toLTFdfTtcbiAgICBpbnQgcnAxID0gJHtnW2gtMl19ICsgMTtcbiAgICBpbnQgY3AxID0gJHtnW2gtMV19ICsgMTtcbiAgICBib29sIHJFZGdlID0gcnAxID49ICR7bX07XG4gICAgYm9vbCBjRWRnZSA9IGNwMSA+PSAke2J9O1xuICAgIGApO3ZhciBoLGcsYixtO2xldCB5O3k9MD09PWw/WzEsMV06MT09PWw/W3VbMF0sMV06W3VbYy0xXSx1W2MtMl1dO2NvbnN0IHY9ZnVuY3Rpb24oZSx0LG4pe2lmKDA9PT1lKXJldHVybiAiZmFsc2UiO2lmKDE9PT1lKXJldHVybiBgcmMgPiAke3RbMF19YDtsZXQgcj0iIjtmb3IobGV0IG89ZS0yO288ZTtvKyspcis9YCR7bltvXX0gPj0gJHt0W28tZSsyXX1gLG88ZS0xJiYocis9Inx8Iik7cmV0dXJuIHJ9KGMseSxkKSxfPWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1lLmxlbmd0aDtpZigwPT09bilyZXR1cm4gImdldEEoKSwgMCwgMCwgMCI7aWYoMT09PW4pcmV0dXJuIGBnZXRBKHJjKSxcbiAgICAgICAgICAgIHJjICsgMSA+PSAke2VbMF19ID8gMC4gOiBnZXRBKHJjICsgMSksXG4gICAgICAgICAgICAwLCAwYDtsZXQgcj0iIjtpZihuPjIpZm9yKGxldCBlPTA7ZTxuLTI7KytlKXIrPWAke3RbZV19LGA7cmV0dXJuIGBnZXRBKCR7cn1yLCBjKSxcbiAgICAgICAgICByRWRnZSA/IDAuIDogZ2V0QSgke3J9cnAxLCBjKSxcbiAgICAgICAgICBjRWRnZSA/IDAuIDogZ2V0QSgke3J9ciwgY3AxKSxcbiAgICAgICAgICByRWRnZSB8fCBjRWRnZSA/IDAuIDogZ2V0QSgke3J9cnAxLCBjcDEpYH0odSxkKSx3PWBcbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICR7cH0gcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgICAgIGlmKCR7dn0pIHtcbiAgICAgICAgICAgICR7bi5vdXRwdXR9ID0gdmVjNCgwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHtmfVxuXG4gICAgICAgICAgICAke24ub3V0cHV0fSA9IHZlYzQoJHtffSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2hhc01haW46ITAsb3V0cHV0OntkaW1zOnQuZGltcyx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTpvLlRleHR1cmVUeXBlLnBhY2tlZH0sc2hhZGVyU291cmNlOnd9KX0pKGUsdCl9KTt9LDU2MTQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnVucGFja0Zyb21DaGFubmVsPXQuZ2V0Q2hhbm5lbHM9dC5nZXRWZWNDaGFubmVscz12b2lkIDA7Y29uc3Qgcj1uKDQzMik7ZnVuY3Rpb24gbyhlLHQpe3JldHVybiAoMCwgci5nZXRHbENoYW5uZWxzKSh0KS5tYXAoKHQ9PmAke2V9LiR7dH1gKSl9dC5nZXRWZWNDaGFubmVscz1vLHQuZ2V0Q2hhbm5lbHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMT09PXQ/W2VdOm8oZSx0KX0sdC51bnBhY2tGcm9tQ2hhbm5lbD1mdW5jdGlvbigpe3JldHVybiAiXG4gICAgZmxvYXQgZ2V0Q2hhbm5lbCh2ZWM0IGZyYWcsIGludCBkaW0pIHtcbiAgICAgIGludCBtb2RDb29yZCA9IGltb2QoZGltLCAyKTtcbiAgICAgIHJldHVybiBtb2RDb29yZCA9PSAwID8gZnJhZy5yIDogZnJhZy5nO1xuICAgIH1cblxuICAgIGZsb2F0IGdldENoYW5uZWwodmVjNCBmcmFnLCB2ZWMyIGlubmVyRGltcykge1xuICAgICAgdmVjMiBtb2RDb29yZCA9IG1vZChpbm5lckRpbXMsIDIuKTtcbiAgICAgIHJldHVybiBtb2RDb29yZC54ID09IDAuID9cbiAgICAgICAgKG1vZENvb3JkLnkgPT0gMC4gPyBmcmFnLnIgOiBmcmFnLmcpIDpcbiAgICAgICAgKG1vZENvb3JkLnkgPT0gMC4gPyBmcmFnLmIgOiBmcmFnLmEpO1xuICAgIH1cbiAgIn07fSw1NTY1OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZVBhZEF0dHJpYnV0ZXNWMTE9dC5wYWRWMTE9dC5wYXJzZVBhZEF0dHJpYnV0ZXNWMj10LnBhZFYyPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDcyNzMpLGk9big2NzU3KSxzPW4oNTYzOSksYT17bmFtZToiUGFkIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W3MuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnBhZFYyPShlLHQsbik9PihjKHQpLFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+bChlLHRbMF0sbil9KSx0KV0pLHQucGFyc2VQYWRBdHRyaWJ1dGVzVjI9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldFN0cmluZygibW9kZSIsImNvbnN0YW50Iiksbj1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoInZhbHVlIiwwKSxvPWUuYXR0cmlidXRlcy5nZXRJbnRzKCJwYWRzIik7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe21vZGU6dCx2YWx1ZTpuLHBhZHM6b30pfSx0LnBhZFYxMT0oZSxuLHIpPT57cChuKTtjb25zdCBvPXUoZSxuLHIpO3JldHVybiAoMCwgdC5wYWRWMikoZSxbblswXV0sbyl9LHQucGFyc2VQYWRBdHRyaWJ1dGVzVjExPWU9PmUuYXR0cmlidXRlcy5nZXRTdHJpbmcoIm1vZGUiLCJjb25zdGFudCIpO2NvbnN0IHU9KGUsdCxuKT0+e2lmKCFlLnNlc3Npb24uaXNJbml0aWFsaXplcih0WzFdLmRhdGFJZCl8fHQubGVuZ3RoPj0zJiYhZS5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIodFsyXS5kYXRhSWQpKXRocm93IG5ldyBFcnJvcigiZHluYW1pYyBwYWQgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQiKTtjb25zdCBvPUFycmF5LmZyb20odFsxXS5pbnRlZ2VyRGF0YSksaT10Lmxlbmd0aD49Mz90WzJdLmZsb2F0RGF0YVswXTowO3JldHVybiAoMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHttb2RlOm4scGFkczpvLHZhbHVlOml9KX0sbD0oZSx0LG4pPT57Y29uc3Qgcj1vLlNoYXBlVXRpbC5wYWRTaGFwZSh0LmRpbXMuc2xpY2UoKSxuLnBhZHMpLGk9ci5sZW5ndGgsYT1gXG4gICAgICAke2QoZSx0LG4pfVxuICAgICAgZmxvYXQgcHJvY2VzcyhpbnRbJHtpfV0gaW5kaWNlcykge1xuICAgICAgICAgIHJldHVybiBwYWRBKGluZGljZXMpO1xuICAgICAgfWA7cmV0dXJuIHtuYW1lOiJQYWQiLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbcy5UZXh0dXJlVHlwZS51bnBhY2tlZF0sb3V0cHV0OntkaW1zOnIsdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6cy5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmF9fSxjPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiUGFkIHJlcXVpcmVzIDEgaW5wdXQiKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX0scD1lPT57aWYoIWV8fDIhPT1lLmxlbmd0aCYmMyE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiUGFkIHJlcXVpcmVzIDIgb3IgMyBpbnB1dHMiKTtpZigiaW50MzIiIT09ZVsxXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKGUubGVuZ3RoPj0zJiYic3RyaW5nIj09PWVbMl0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX0sZD0oZSx0LG4pPT57Y29uc3Qgcj0oMCwgaS5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksW2EsdV09ZS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQodC5kaW1zLHMuVGV4dHVyZVR5cGUudW5wYWNrZWQpLGw9by5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXModC5kaW1zKTtzd2l0Y2gobi5tb2RlKXtjYXNlImNvbnN0YW50IjpyZXR1cm4gZihyLHQuZGltcyxsLGEsdSxuLnBhZHMsbi52YWx1ZSk7Y2FzZSJyZWZsZWN0IjpyZXR1cm4gaChyLHQuZGltcyxsLGEsdSxuLnBhZHMpO2Nhc2UiZWRnZSI6cmV0dXJuIGcocix0LmRpbXMsbCxhLHUsbi5wYWRzKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBtb2RlIil9fSxmPShlLHQsbixyLG8saSxzKT0+e2NvbnN0IGE9dC5sZW5ndGg7bGV0IHU9IiI7Zm9yKGxldCBlPWEtMTtlPj0wOy0tZSl1Kz1gXG4gICAgICAgIGsgPSBtWyR7ZX1dIC0gJHtpW2VdfTtcbiAgICAgICAgaWYgKGsgPCAwKSAgcmV0dXJuIGNvbnN0YW50O1xuICAgICAgICBpZiAoayA+PSAke3RbZV19KSByZXR1cm4gY29uc3RhbnQ7XG4gICAgICAgIG9mZnNldCArPSBrICogJHtuW2VdfTtcbiAgICAgICAgYDtyZXR1cm4gYFxuICAgICAgZmxvYXQgcGFkQShpbnQgbVske2F9XSkge1xuICAgICAgICBjb25zdCBmbG9hdCBjb25zdGFudCA9IGZsb2F0KCR7c30pO1xuICAgICAgICBpbnQgb2Zmc2V0ID0gMDtcbiAgICAgICAgaW50IGsgPSAwO1xuICAgICAgICAke3V9XG4gICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke3J9LCAke299KTtcbiAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRDb2xvckFzRmxvYXQoJHtlLnRleHR1cmUyRH0oQSwgY29vcmRzKSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGB9LGg9KGUsdCxuLHIsbyxpKT0+e2NvbnN0IHM9dC5sZW5ndGg7bGV0IGE9IiI7Zm9yKGxldCBlPXMtMTtlPj0wOy0tZSlhKz1gXG4gICAgICAgIGsgPSBtWyR7ZX1dIC0gJHtpW2VdfTtcbiAgICAgICAgaWYgKGsgPCAwKSB7IGsgPSAtazsgfVxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgaW50IF8ybl8xID0gJHsyKih0W2VdLTEpfTtcbiAgICAgICAgICBrID0gaW50KCBtb2QoIGZsb2F0KGspLCBmbG9hdChfMm5fMSkgKSApIDtcbiAgICAgICAgICBpZihrID49ICR7dFtlXX0pIHsgayA9IF8ybl8xIC0gazsgfVxuICAgICAgICB9XG4gICAgICAgIG9mZnNldCArPSBrICogJHtuW2VdfTtcbiAgICAgICAgYDtyZXR1cm4gYFxuICAgICAgZmxvYXQgcGFkQShpbnQgbVske3N9XSkge1xuICAgICAgICBpbnQgb2Zmc2V0ID0gMDtcbiAgICAgICAgaW50IGsgPSAwO1xuICAgICAgICAke2F9XG4gICAgICAgIHZlYzIgY29vcmRzID0gb2Zmc2V0VG9Db29yZHMob2Zmc2V0LCAke3J9LCAke299KTtcbiAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRDb2xvckFzRmxvYXQoJHtlLnRleHR1cmUyRH0oQSwgY29vcmRzKSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGB9LGc9KGUsdCxuLHIsbyxpKT0+e2NvbnN0IHM9dC5sZW5ndGg7bGV0IGE9IiI7Zm9yKGxldCBlPXMtMTtlPj0wOy0tZSlhKz1gXG4gICAgICAgIGsgPSBtWyR7ZX1dIC0gJHtpW2VdfTtcbiAgICAgICAgaWYgKGsgPCAwKSAgayA9IDA7XG4gICAgICAgIGlmIChrID49ICR7dFtlXX0pIGsgPSAke3RbZV0tMX07XG4gICAgICAgIG9mZnNldCArPSBrICogJHtuW2VdfTtcbiAgICAgIGA7cmV0dXJuIGBcbiAgICAgIGZsb2F0IHBhZEEoaW50IG1bJHtzfV0pIHtcbiAgICAgICAgaW50IG9mZnNldCA9IDA7XG4gICAgICAgIGludCBrID0gMDtcbiAgICAgICAgJHthfVxuICAgICAgICB2ZWMyIGNvb3JkcyA9IG9mZnNldFRvQ29vcmRzKG9mZnNldCwgJHtyfSwgJHtvfSk7XG4gICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7ZS50ZXh0dXJlMkR9KEEsIGNvb3JkcykpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBgfTt9LDI4MzQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lmdsb2JhbE1heFBvb2w9dC5wYXJzZU1heFBvb2xBdHRyaWJ1dGVzPXQubWF4UG9vbD10LnBhcnNlR2xvYmFsQXZlcmFnZVBvb2xBdHRyaWJ1dGVzPXQuZ2xvYmFsQXZlcmFnZVBvb2w9dC5wYXJzZUF2ZXJhZ2VQb29sQXR0cmlidXRlcz10LmF2ZXJhZ2VQb29sPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDcyNzMpLGk9big1NjM5KTt0LmF2ZXJhZ2VQb29sPShlLHQsbik9PntwKHQpO2NvbnN0IHI9e25hbWU6IkF2ZXJhZ2VQb29sIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W2kuVGV4dHVyZVR5cGUudW5wYWNrZWRdLGNhY2hlSGludDpuLmNhY2hlS2V5fTtyZXR1cm4gW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSx7Z2V0OigpPT5zKHQsciwhMSxuKX0pLHQpXX0sdC5wYXJzZUF2ZXJhZ2VQb29sQXR0cmlidXRlcz1lPT57Y29uc3QgdD1lLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJhdXRvX3BhZCIsIk5PVFNFVCIpLG49ZS5hdHRyaWJ1dGVzLmdldEludCgiY2VpbF9tb2RlIiwwKSxvPTAhPT1lLmF0dHJpYnV0ZXMuZ2V0SW50KCJjb3VudF9pbmNsdWRlX3BhZCIsMCksaT1lLmF0dHJpYnV0ZXMuZ2V0SW50cygia2VybmVsX3NoYXBlIikscz1lLmF0dHJpYnV0ZXMuZ2V0SW50cygic3RyaWRlcyIsW10pLGE9ZS5hdHRyaWJ1dGVzLmdldEludHMoInBhZHMiLFtdKTtpZigwIT09bil0aHJvdyBuZXcgRXJyb3IoInVzaW5nIGNlaWwoKSBpbiBzaGFwZSBjb21wdXRhdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgQXZlcmFnZVBvb2wiKTtyZXR1cm4gKDAsIHIuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7YXV0b1BhZDp0LGNlaWxNb2RlOm4sY291bnRJbmNsdWRlUGFkOm8sa2VybmVsU2hhcGU6aSxzdHJpZGVzOnMscGFkczphfSl9O2NvbnN0IHM9KGUsdCxuLHIpPT57Y29uc3RbcyxhXT11KGUscixuKSxsPW8uU2hhcGVVdGlsLnNpemUocy5rZXJuZWxTaGFwZSk7bGV0IGM9IiI7cy5jb3VudEluY2x1ZGVQYWQ/Yys9YHZhbHVlIC89IGZsb2F0KCR7bH0pO2A6Yys9YHZhbHVlIC89IGZsb2F0KCR7bH0gLSBwYWQpO2A7Y29uc3QgcD1gXG4gICAgICAgICR7ZChlWzBdLmRpbXMscywidmFsdWUgKz0gX1goeCk7IixjLCIwLjAiKX1cbiAgICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7b3V0cHV0OntkaW1zOmEsdHlwZTplWzBdLnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnB9KX07dC5nbG9iYWxBdmVyYWdlUG9vbD0oZSx0LG4pPT57cCh0KTtjb25zdCByPXtuYW1lOiJHbG9iYWxBdmVyYWdlUG9vbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6YCR7bi5jb3VudEluY2x1ZGVQYWR9YH07cmV0dXJuIFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scikse2dldDooKT0+cyh0LHIsITAsbil9KSx0KV19LHQucGFyc2VHbG9iYWxBdmVyYWdlUG9vbEF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9MCE9PWUuYXR0cmlidXRlcy5nZXRJbnQoImNvdW50X2luY2x1ZGVfcGFkIiwwKTtyZXR1cm4gKDAsIHIuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7YXV0b1BhZDoiIixjZWlsTW9kZTowLGNvdW50SW5jbHVkZVBhZDp0LGtlcm5lbFNoYXBlOltdLHN0cmlkZXM6W10scGFkczpbXX0pfSx0Lm1heFBvb2w9KGUsdCxuKT0+e3AodCk7Y29uc3Qgcj17bmFtZToiTWF4UG9vbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnVucGFja2VkXSxjYWNoZUhpbnQ6bi5jYWNoZUtleX07cmV0dXJuIFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scikse2dldDooKT0+YSh0LHIsITEsbil9KSx0KV19LHQucGFyc2VNYXhQb29sQXR0cmlidXRlcz1lPT57Y29uc3QgdD1lLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJhdXRvX3BhZCIsIk5PVFNFVCIpLG49ZS5hdHRyaWJ1dGVzLmdldEludCgiY2VpbF9tb2RlIiwwKSxvPWUuYXR0cmlidXRlcy5nZXRJbnRzKCJrZXJuZWxfc2hhcGUiKSxpPWUuYXR0cmlidXRlcy5nZXRJbnRzKCJzdHJpZGVzIixbXSkscz1lLmF0dHJpYnV0ZXMuZ2V0SW50cygicGFkcyIsW10pLGE9ZS5hdHRyaWJ1dGVzLmdldEludCgic3RvcmFnZV9vcmRlciIsMCksdT1lLmF0dHJpYnV0ZXMuZ2V0SW50cygiZGlsYXRpb25zIixbXSk7aWYoMCE9PWEpdGhyb3cgbmV3IEVycm9yKCJjb2x1bW4gbWFqb3Igc3RvcmFnZSBvcmRlciBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgTWF4UG9vbCIpO2lmKDAhPT1uKXRocm93IG5ldyBFcnJvcigidXNpbmcgY2VpbCgpIGluIHNoYXBlIGNvbXB1dGF0aW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBNYXhQb29sIik7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F1dG9QYWQ6dCxjZWlsTW9kZTpuLGNvdW50SW5jbHVkZVBhZDohMSxrZXJuZWxTaGFwZTpvLHN0cmlkZXM6aSxwYWRzOnMsc3RvcmFnZU9yZGVyOmEsZGlsYXRpb25zOnV9KX07Y29uc3QgYT0oZSx0LG4scik9Pntjb25zdFtvLHNdPXUoZSxyLG4pLGE9YFxuICAgICAgJHtkKGVbMF0uZGltcyxvLCJcbiAgICAgIHZhbHVlID0gbWF4KF9YKHgpLCB2YWx1ZSk7XG4gICAgIiwiIiwiLTFlNSIpfVxuICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7b3V0cHV0OntkaW1zOnMsdHlwZTplWzBdLnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmF9KX0sdT0oZSx0LG4pPT57Y29uc3Qgcj1lWzBdLmRpbXMuc2xpY2UoKSxpPU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsImRpbGF0aW9ucyIpLHM9dC5rZXJuZWxTaGFwZS5zbGljZSgpLGE9dC5zdHJpZGVzLnNsaWNlKCksdT1pP3QuZGlsYXRpb25zLnNsaWNlKCk6W10sbD10LnBhZHMuc2xpY2UoKTtvLlBvb2xDb252VXRpbC5hZGp1c3RQb29sQXR0cmlidXRlcyhuLHIscyxhLHUsbCk7Y29uc3QgYz1vLlBvb2xDb252VXRpbC5jb21wdXRlUG9vbE91dHB1dFNoYXBlKG4scixhLHUscyxsLHQuYXV0b1BhZCkscD1PYmplY3QuYXNzaWduKHt9LHQpO3JldHVybiBpP09iamVjdC5hc3NpZ24ocCx7a2VybmVsU2hhcGU6cyxzdHJpZGVzOmEscGFkczpsLGRpbGF0aW9uczp1LGNhY2hlS2V5OnQuY2FjaGVLZXl9KTpPYmplY3QuYXNzaWduKHAse2tlcm5lbFNoYXBlOnMsc3RyaWRlczphLHBhZHM6bCxjYWNoZUtleTp0LmNhY2hlS2V5fSksW3AsY119LGw9e2F1dG9QYWQ6IiIsY2VpbE1vZGU6MCxjb3VudEluY2x1ZGVQYWQ6ITEsa2VybmVsU2hhcGU6W10sc3RyaWRlczpbXSxwYWRzOltdLHN0b3JhZ2VPcmRlcjowLGRpbGF0aW9uczpbXSxjYWNoZUtleToiIn0sYz17bmFtZToiR2xvYmFsTWF4UG9vbCIsaW5wdXROYW1lczpbIlgiXSxpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnVucGFja2VkXX07dC5nbG9iYWxNYXhQb29sPShlLHQpPT4ocCh0KSxbZS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGMpLHtnZXQ6KCk9PmEodCxjLCEwLGwpfSksdCldKTtjb25zdCBwPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiUG9vbCBvcHMgcmVxdWlyZXMgMSBpbnB1dC4iKTtpZigiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX0sZD0oZSx0LG4scixpKT0+e2NvbnN0IHM9ZS5sZW5ndGg7aWYodC5rZXJuZWxTaGFwZS5sZW5ndGg8PTIpe2NvbnN0IG89dC5rZXJuZWxTaGFwZVt0Lmtlcm5lbFNoYXBlLmxlbmd0aC0xXSxhPXQuc3RyaWRlc1t0LnN0cmlkZXMubGVuZ3RoLTFdLHU9dC5wYWRzW3QucGFkcy5sZW5ndGgvMi0xXSxsPXQucGFkc1t0LnBhZHMubGVuZ3RoLTFdLGM9ZVtzLTFdO2xldCBwPSIiLGQ9IiIsZj0iIjtpZihwPXUrbCE9PTA/YFxuICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtvfTsgaSsrKSB7XG4gICAgICAgICAgICB4WyR7c30gLSAxXSA9IGluZGljZXNbJHtzfSAtIDFdICogJHthfSAtICR7dX0gKyBpO1xuICAgICAgICAgICAgaWYgKHhbJHtzfSAtIDFdIDwgMCB8fCB4WyR7c30gLSAxXSA+PSAke2N9KSB7XG4gICAgICAgICAgICAgIHBhZCsrO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICR7bn1cbiAgICAgICAgICB9YDpgXG4gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke299OyBpKyspIHtcbiAgICAgICAgICAgIHhbJHtzfSAtIDFdID0gaW5kaWNlc1ske3N9IC0gMV0gKiAke2F9IC0gJHt1fSArIGk7XG4gICAgICAgICAgICAke259XG4gICAgICAgICAgfWAsMj09PXQua2VybmVsU2hhcGUubGVuZ3RoKXtjb25zdCBuPXQua2VybmVsU2hhcGVbdC5rZXJuZWxTaGFwZS5sZW5ndGgtMl0scj10LnN0cmlkZXNbdC5zdHJpZGVzLmxlbmd0aC0yXSxpPXQucGFkc1t0LnBhZHMubGVuZ3RoLzItMl0sYT10LnBhZHNbdC5wYWRzLmxlbmd0aC0yXSx1PWVbcy0yXTtkPWkrYSE9PTA/YFxuICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAke259OyBqKyspIHtcbiAgICAgICAgICAgICAgeFske3N9IC0gMl0gPSBpbmRpY2VzWyR7c30gLSAyXSAqICR7cn0gLSAke2l9ICsgajtcbiAgICAgICAgICAgICAgaWYgKHhbJHtzfSAtIDJdIDwgMCB8fCB4WyR7c30gLSAyXSA+PSAke3V9KSB7XG4gICAgICAgICAgICAgICAgcGFkKz0gJHtvfTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIGA6YFxuICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAke259OyBqKyspIHtcbiAgICAgICAgICAgICAgeFske3N9IC0gMl0gPSBpbmRpY2VzWyR7c30gLSAyXSAqICR7cn0gLSAke2l9ICsgajtcbiAgICAgICAgICAgIGAsZj0iXG4gICAgICAgICAgfVxuICAgICAgICAiO31yZXR1cm4gYFxuICAgICAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7c31dKSB7XG4gICAgICAgICAgaW50IHhbJHtzfV07XG4gICAgICAgICAgY29weVZlYyhpbmRpY2VzLCB4KTtcblxuICAgICAgICAgIGZsb2F0IHZhbHVlID0gJHtpfTtcbiAgICAgICAgICBpbnQgcGFkID0gMDtcbiAgICAgICAgICAke2R9XG4gICAgICAgICAgJHtwfVxuICAgICAgICAgICR7Zn1cbiAgICAgICAgICAke3J9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICBgfXtjb25zdCBhPW8uU2hhcGVVdGlsLnNpemUodC5rZXJuZWxTaGFwZSksdT1vLlNoYXBlVXRpbC5jb21wdXRlU3RyaWRlcyh0Lmtlcm5lbFNoYXBlKSxsPXUubGVuZ3RoLGM9dC5wYWRzLmxlbmd0aCxwPWgobCksZD1mKGUsImlucHV0RGltcyIpLGc9Zih0LnBhZHMsInBhZHMiKSxiPWYodSwia2VybmVsU3RyaWRlcyIpLG09Zih0LnN0cmlkZXMsInN0cmlkZXMiKTtsZXQgeT0iIjtyZXR1cm4geT10LnBhZHMucmVkdWNlKCgoZSx0KT0+ZSt0KSk/YFxuICAgICAgICAgICAgaWYgKHhbal0gPj0gaW5wdXREaW1zW2pdIHx8IHhbal0gPCAwKSB7XG4gICAgICAgICAgICAgIHBhZCsrO1xuICAgICAgICAgICAgICBpc1BhZCA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWlzUGFkKSB7XG4gICAgICAgICAgICAke259XG4gICAgICAgICAgfWA6YFxuICAgICAgICAgIH1cbiAgICAgICAgICAke259XG4gICAgICAgIGAsYFxuICAgICAgICAke3B9XG4gICAgICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbJHtzfV0pIHtcbiAgICAgICAgICBpbnQgeFske3N9XTtcbiAgICAgICAgICBjb3B5VmVjKGluZGljZXMsIHgpO1xuICAgICAgICAgIGludCBvZmZzZXRbJHtsfV07XG4gICAgICAgICAgaW50IHBhZHNbJHtjfV07XG4gICAgICAgICAgaW50IGlucHV0RGltc1ske3N9XTtcbiAgICAgICAgICBpbnQga2VybmVsU3RyaWRlc1ske2x9XTtcbiAgICAgICAgICBpbnQgc3RyaWRlc1ske2x9XTtcbiAgICAgICAgICAke2d9XG4gICAgICAgICAgJHtkfVxuICAgICAgICAgICR7bX1cbiAgICAgICAgICAke2J9XG5cbiAgICAgICAgICBmbG9hdCB2YWx1ZSA9ICR7aX07XG4gICAgICAgICAgaW50IHBhZCA9IDA7XG4gICAgICAgICAgYm9vbCBpc1BhZCA9IGZhbHNlO1xuICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHthfTsgaSsrKSB7XG4gICAgICAgICAgICBvZmZzZXRUb0luZGljZXMoaSwga2VybmVsU3RyaWRlcywgb2Zmc2V0KTtcbiAgICAgICAgICAgIGlzUGFkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGludCBqID0gJHtzfSAtICR7bH07IGogPCAke3N9OyBqKyspIHtcbiAgICAgICAgICAgICAgeFtqXSA9IGluZGljZXNbal0gKiBzdHJpZGVzW2ogLSAke3N9ICsgJHtsfV1cbiAgICAgICAgICAgICAgICArIG9mZnNldFtqIC0gJHtzfSArICR7bH1dIC0gcGFkc1tqIC0gMl07XG4gICAgICAgICAgICAgICR7eX1cbiAgICAgICAgICB9XG4gICAgICAgICAgJHtyfVxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICBgfX0sZj0oZSx0KT0+e2xldCBuPSIiO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKW4rPWBcbiAgICAgICR7dH1bJHtyfV0gPSAke2Vbcl19O1xuICAgIGA7cmV0dXJuIG59LGg9ZT0+YFxuICB2b2lkIG9mZnNldFRvSW5kaWNlcyhpbnQgb2Zmc2V0LCBpbnRbJHtlfV0gc3RyaWRlcywgb3V0IGludFske2V9XSBpbmRpY2VzKSB7XG4gICAgaWYgKCR7ZX0gPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7ZX0gLSAxOyArK2kpIHtcbiAgICAgIGluZGljZXNbaV0gPSBvZmZzZXQgLyBzdHJpZGVzW2ldO1xuICAgICAgb2Zmc2V0IC09IGluZGljZXNbaV0gKiBzdHJpZGVzW2ldO1xuICAgIH1cbiAgICBpbmRpY2VzWyR7ZX0gLSAxXSA9IG9mZnNldDtcbiAgfWA7fSwxMDEwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZWR1Y2VMb2dTdW1TcXVhcmU9dC5yZWR1Y2VMb2dTdW09dC5yZWR1Y2VQcm9kPXQucmVkdWNlTWluPXQucmVkdWNlTWF4PXQucmVkdWNlTWVhbj10LnJlZHVjZVN1bT10LnBhcnNlUmVkdWNlQXR0cmlidXRlcz12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big2MTQ1KSxpPW4oNzI3Mykscz1uKDU2MzkpLGE9KGUsdCxuLHIsbyk9PntsKHQpO2NvbnN0IGk9e25hbWU6cixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W3MuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTtyZXR1cm4gW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXksZ2V0OigpPT51KGUsdCxuLHIsbyxpKX0pLHQpXX07dC5wYXJzZVJlZHVjZUF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEludHMoImF4ZXMiLFtdKSxuPTE9PT1lLmF0dHJpYnV0ZXMuZ2V0SW50KCJrZWVwZGltcyIsMSk7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4ZXM6dCxrZWVwRGltczpufSl9O2NvbnN0IHU9KGUsdCxuLHIsbyxhKT0+e2NvbnN0IHU9W10sbD10WzBdLmRpbXMubGVuZ3RofHwxLGM9W10scD1pLlNoYXBlVXRpbC5ub3JtYWxpemVBeGVzKG4uYXhlcyx0WzBdLmRpbXMubGVuZ3RoKSxkPW8odCxwKTtsZXQgZj1kWzFdO2ZvcihsZXQgZT0wO2U8dFswXS5kaW1zLmxlbmd0aDtlKyspcC5pbmRleE9mKGUpPj0wfHwwPT09cC5sZW5ndGg/KG4ua2VlcERpbXMmJnUucHVzaCgxKSxmPWBcbiAgICAgICAgICBmb3IoaW50IGoke2V9ID0gMDsgaiR7ZX0gPCAke3RbMF0uZGltc1tlXX07IGoke2V9KyspIHtcbiAgICAgICAgICAgIGlucHV0SWR4WyR7ZX1dID0gaiR7ZX07XG4gICAgICAgICAgICAke2Z9XG4gICAgICAgICAgfWApOihjLnB1c2goYGlucHV0SWR4WyR7ZX1dID0gb3V0cHV0SWR4WyR7dS5sZW5ndGh9XTtgKSx1LnB1c2godFswXS5kaW1zW2VdKSk7Y29uc3QgaD1gXG4gICAgICBmbG9hdCBwcm9jZXNzKGludCBvdXRwdXRJZHhbJHt1Lmxlbmd0aHx8MX1dKSB7XG4gICAgICAgIGZsb2F0IHZhbHVlOyAgICAgICAgICAgICAgICAgLy8gZmluYWwgcmVzdWx0XG4gICAgICAgIGludCBpbnB1dElkeFske2x9XTsgICAgICAvLyBhZGRyZXNzaW5nIGlucHV0IGRhdGFcbiAgICAgICAgJHtjLmpvaW4oIlxuIil9XG4gICAgICAgICR7ZFswXX0gICAgICAgLy8gaW5pdCBvcHMgZm9yIHJlZHVjZSBtYXgvbWluXG4gICAgICAgICR7Zn1cbiAgICAgICAgJHtkWzJdfSAgICAgICAvLyBmaW5hbCBjb21wdXRhdGlvbiBmb3IgcmVkdWNlIG1lYW5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7b3V0cHV0OntkaW1zOnUsdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6cy5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmh9KX0sbD1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlJlZHVjZSBvcCByZXF1aXJlcyAxIGlucHV0LiIpO2lmKC0xPT09by5OVU1CRVJfVFlQRVMuaW5kZXhPZihlWzBdLnR5cGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt0LnJlZHVjZVN1bT0oZSx0LG4pPT5hKGUsdCxuLCJSZWR1Y2VTdW0iLCgoKT0+WyJ2YWx1ZSA9IDAuMDsiLCJ2YWx1ZSArPSBfQShpbnB1dElkeCk7IiwiIl0pKSx0LnJlZHVjZU1lYW49KGUsdCxuKT0+YShlLHQsbiwiUmVkdWNlTWVhbiIsKChlLHQpPT57bGV0IG49MTtmb3IobGV0IHI9MDtyPGVbMF0uZGltcy5sZW5ndGg7cisrKSh0LmluZGV4T2Yocik+PTB8fDA9PT10Lmxlbmd0aCkmJihuKj1lWzBdLmRpbXNbcl0pO3JldHVybiBbInZhbHVlID0gMC4wOyIsInZhbHVlICs9IF9BKGlucHV0SWR4KTsiLGB2YWx1ZSAvPSAke259LjtgXX0pKSx0LnJlZHVjZU1heD0oZSx0LG4pPT5hKGUsdCxuLCJSZWR1Y2VNYXgiLCgoZSx0KT0+e2NvbnN0IG49W107Zm9yKGxldCByPTA7cjxlWzBdLmRpbXMubGVuZ3RoO3IrKykodC5pbmRleE9mKHIpPj0wfHwwPT09dC5sZW5ndGgpJiZuLnB1c2goYGlucHV0SWR4WyR7cn1dID0gMDtgKTtyZXR1cm4gW2Ake24uam9pbigiXG4iKX1cbnZhbHVlID0gX0EoaW5wdXRJZHgpO2AsInZhbHVlID0gbWF4KHZhbHVlLCBfQShpbnB1dElkeCkpOyIsIiJdfSkpLHQucmVkdWNlTWluPShlLHQsbik9PmEoZSx0LG4sIlJlZHVjZU1pbiIsKChlLHQpPT57Y29uc3Qgbj1bXTtmb3IobGV0IHI9MDtyPGVbMF0uZGltcy5sZW5ndGg7cisrKSh0LmluZGV4T2Yocik+PTB8fDA9PT10Lmxlbmd0aCkmJm4ucHVzaChgaW5wdXRJZHhbJHtyfV0gPSAwO2ApO3JldHVybiBbYCR7bi5qb2luKCJcbiIpfVxudmFsdWUgPSBfQShpbnB1dElkeCk7YCwidmFsdWUgPSBtaW4odmFsdWUsIF9BKGlucHV0SWR4KSk7IiwiIl19KSksdC5yZWR1Y2VQcm9kPShlLHQsbik9PmEoZSx0LG4sIlJlZHVjZVByb2QiLCgoKT0+WyJ2YWx1ZSA9IDEuMDsiLCJ2YWx1ZSAqPSBfQShpbnB1dElkeCk7IiwiIl0pKSx0LnJlZHVjZUxvZ1N1bT0oZSx0LG4pPT5hKGUsdCxuLCJSZWR1Y2VMb2dTdW0iLCgoKT0+WyJ2YWx1ZSA9IDAuMDsiLCJ2YWx1ZSArPSBfQShpbnB1dElkeCk7IiwidmFsdWUgPSBsb2codmFsdWUpOyJdKSksdC5yZWR1Y2VMb2dTdW1TcXVhcmU9KGUsdCxuKT0+YShlLHQsbiwiUmVkdWNlTG9nU3VtU3F1YXJlIiwoKCk9PlsiZmxvYXQgdDsgdmFsdWUgPSAwLjA7IiwidCA9IF9BKGlucHV0SWR4KTsgdmFsdWUgKz0gdCAqIHQ7IiwiIl0pKTt9LDczNzk6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmlzUmVzaGFwZUNoZWFwPXQucHJvY2Vzc0RpbXMzRD10LmNyZWF0ZVBhY2tlZFJlc2hhcGUzRFByb2dyYW1JbmZvTG9hZGVyPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDY3NTcpLGk9big1NjM5KSxzPW4oNTYxNCk7dC5jcmVhdGVQYWNrZWRSZXNoYXBlM0RQcm9ncmFtSW5mb0xvYWRlcj0oZSx0LG4pPT57Y29uc3QgYT0oZT0+KHtuYW1lOiJSZXNoYXBlIChwYWNrZWQpIixpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnBhY2tlZF0saW5wdXROYW1lczpbIkEiXSxjYWNoZUhpbnQ6YCR7ZX1gfSkpKG4pO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2dldDooKT0+KChlLHQsbixhKT0+e2NvbnN0IHU9dC5kaW1zLGw9YTtsZXQgYz0iIjtmb3IobGV0IGU9MDtlPDQ7ZSsrKXtsZXQgdD0iIjtzd2l0Y2goZSl7Y2FzZSAwOnQ9Im91dHB1dENvb3JkcyA9IHJjOyI7YnJlYWs7Y2FzZSAxOnQ9Im91dHB1dENvb3JkcyA9IGl2ZWMzKHJjLngsIHJjLnkrMSwgcmMueik7IjticmVhaztjYXNlIDI6dD0ib3V0cHV0Q29vcmRzID0gaXZlYzMocmMueCwgcmMueSwgcmMueisxKTsiO2JyZWFrO2Nhc2UgMzp0PSJvdXRwdXRDb29yZHMgPSBpdmVjMyhyYy54LCByYy55KzEsIHJjLnorMSk7IjticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcn1jKz1gXG4gICAgICAgICR7dH1cbiAgICAgICAgJHtlPjA/ImlmKG91dHB1dENvb3Jkcy55IDwgcm93cyAmJiBvdXRwdXRDb29yZHMueiA8IGNvbHMpeyI6IiJ9XG4gICAgICAgICAgaW50IGZsYXR0ZW5lZEluZGV4ID0gZ2V0RmxhdHRlbmVkSW5kZXgob3V0cHV0Q29vcmRzKTtcblxuICAgICAgICAgIGl2ZWMzIGlucHV0UkMgPSBpbnB1dENvb3Jkc0Zyb21SZXNoYXBlZE91dENvb3JkcyhmbGF0dGVuZWRJbmRleCk7XG4gICAgICAgICAgdmVjMiBpbm5lckRpbXMgPSB2ZWMyKGZsb2F0KGlucHV0UkMueSksZmxvYXQoaW5wdXRSQy56KSk7XG5cbiAgICAgICAgICByZXN1bHRbJHtlfV0gPSBnZXRDaGFubmVsKGdldEEoaW5wdXRSQy54LCBpbnB1dFJDLnksIGlucHV0UkMueiksIGlubmVyRGltcyk7XG5cbiAgICAgICAgJHtlPjA/In0iOiIifVxuICAgICAgYDt9Y29uc3QgcD0oMCwgby5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksZD1gXG4gICAgICAke2Z1bmN0aW9uKGUpe2NvbnN0IHQ9ci5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXMoZSksbj1bImIiLCJyIiwiYyJdLG89ImluZGV4IjtyZXR1cm4gYFxuICAgIGl2ZWMzIGlucHV0Q29vcmRzRnJvbVJlc2hhcGVkT3V0Q29vcmRzKGludCBpbmRleCkge1xuICAgICAgJHt0Lm1hcCgoKGUscik9PmBpbnQgJHtuW3JdfSA9ICR7b30gLyAke2V9OyAke3I9PT10Lmxlbmd0aC0xP2BpbnQgJHtuW3IrMV19ID0gJHtvfSAtICR7bltyXX0gKiAke2V9YDpgaW5kZXggLT0gJHtuW3JdfSAqICR7ZX1gfTtgKSkuam9pbigiIil9XG4gICAgICByZXR1cm4gaXZlYzMoYiwgciwgYyk7XG4gICAgfVxuICBgfSh1KX1cbiAgICAgICR7ZnVuY3Rpb24oZSl7Y29uc3QgdD1yLlNoYXBlVXRpbC5jb21wdXRlU3RyaWRlcyhlKTtyZXR1cm4gYFxuICBpbnQgZ2V0RmxhdHRlbmVkSW5kZXgoaXZlYzMgY29vcmRzKSB7XG4gICAgLy8gcmV2ZXJzZSB5LCB6IG9yZGVyXG4gICAgcmV0dXJuIGNvb3Jkcy54ICogJHt0WzBdfSArIGNvb3Jkcy56ICogJHt0WzFdfSArIGNvb3Jkcy55O1xuICB9XG5gfShsKX1cbiAgICAgICR7KDAsIHMudW5wYWNrRnJvbUNoYW5uZWwpKCl9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzMgcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4wKTtcblxuICAgICAgICBpdmVjMyBvdXRwdXRDb29yZHM7XG4gICAgICAgIGludCByb3dzID0gJHtsWzJdfTtcbiAgICAgICAgaW50IGNvbHMgPSAke2xbMV19O1xuXG4gICAgICAgICR7Y31cbiAgICAgICAgJHtwLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgYDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4pLHtvdXRwdXQ6e2RpbXM6bCx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnBhY2tlZH0sc2hhZGVyU291cmNlOmQsaGFzTWFpbjohMH0pfSkoZSx0LGEsbil9KX0sdC5wcm9jZXNzRGltczNEPWZ1bmN0aW9uKGUpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gWzEsMSwxXTtsZXQgdD0xO2ZvcihsZXQgbj0wO248ZS5sZW5ndGgtMjsrK24pdCo9ZVtuXTtyZXR1cm4gW3QsZS5sZW5ndGg+MT9lW2UubGVuZ3RoLTJdOjEsZVtlLmxlbmd0aC0xXV19LHQuaXNSZXNoYXBlQ2hlYXA9ZnVuY3Rpb24oZSx0KXtsZXQgbj0hMTtyZXR1cm4gbj0wPT09ZS5sZW5ndGh8fDA9PT10Lmxlbmd0aHx8KGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDI/ZVtlLmxlbmd0aC0xXT09PXRbdC5sZW5ndGgtMV06ZVtlLmxlbmd0aC0xXT09PXRbdC5sZW5ndGgtMV0mJmVbZS5sZW5ndGgtMl09PT10W3QubGVuZ3RoLTJdKSxufTt9LDgxMjY6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnJlc2hhcGU9dm9pZCAwO2NvbnN0IHI9big3MjczKTt0LnJlc2hhcGU9KGUsdCk9Pntjb25zdCBuPXIuU2hhcGVVdGlsLmNhbGN1bGF0ZVJlc2hhcGVkRGltcyh0WzBdLmRpbXMsdFsxXS5pbnRlZ2VyRGF0YSk7cmV0dXJuIGUuc2Vzc2lvbi5wYWNrP1tlLnJlc2hhcGVQYWNrZWQodFswXSxuKV06W2UucmVzaGFwZVVucGFja2VkKHRbMF0sbildfTt9LDI4MDE6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMT10LnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMD10LnJlc2l6ZT12b2lkIDA7Y29uc3Qgcj1uKDY3NTcpLG89big1NjM5KSxpPW4oNDMyKSxzPW4oNTYxNCksYT1uKDM5ODApLHU9e25hbWU6IlJlc2l6ZSIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOltvLlRleHR1cmVUeXBlLnBhY2tlZF19O3QucmVzaXplPShlLHQsbik9PigoMCwgYS52YWxpZGF0ZUlucHV0cykodCxuKSxbZS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHUpLHtjYWNoZUhpbnQ6bi5jYWNoZUtleSxnZXQ6KCk9PmwoZSx0LG4pfSksdCldKSx0LnBhcnNlUmVzaXplQXR0cmlidXRlc1YxMD1lPT4oMCwgYS5wYXJzZVVwc2FtcGxlQXR0cmlidXRlcykoZSwxMCksdC5wYXJzZVJlc2l6ZUF0dHJpYnV0ZXNWMTE9ZT0+KDAsIGEucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXMpKGUsMTEpO2NvbnN0IGw9KGUsdCxuKT0+e2NvbnN0IGE9KDAsIHIuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLFtsLHBdPWModCxuKTtpZihsLmV2ZXJ5KChlPT4xPT09ZSkpJiYidGZfY3JvcF9hbmRfcmVzaXplIiE9PW4uY29vcmRpbmF0ZVRyYW5zZm9ybU1vZGUpcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx1KSx7b3V0cHV0OntkaW1zOnAsdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS5wYWNrZWR9LGhhc01haW46ITAsc2hhZGVyU291cmNlOmB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgICAgICAgICAgIHZlYzQgdiA9ICR7YS50ZXh0dXJlMkR9KFgsIFRleENvb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgICR7YS5vdXRwdXR9ID0gdjtcbiAgICAgICAgICAgICAgICB9YH0pO2NvbnN0IGQ9cC5sZW5ndGg7aWYoZDwyKXRocm93IG5ldyBFcnJvcihgb3V0cHV0IGRpbWVuc2lvbiBzaG91bGQgYmUgYXQgbGVhc3QgMiwgYnV0IGdvdCAke2R9YCk7Y29uc3QgZj1wW2QtMl0saD1wW2QtMV0sZz10WzBdLmRpbXM7aWYoZCE9PWcubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgb3V0cHV0IGRpbWVuc2lvbiBzaG91bGQgbWF0Y2ggaW5wdXQgJHtnLmxlbmd0aH0sIGJ1dCBnb3QgJHtkfWApO2NvbnN0IGI9Z1tkLTJdLG09Z1tkLTFdLHk9bFtkLTJdLHY9bFtkLTFdO2xldCBfPSIiO2lmKCJsaW5lYXIiIT09bi5tb2RlKXRocm93IG5ldyBFcnJvcihgcmVzaXplIChwYWNrZWQpIGRvZXMgbm90IHN1cHBvcnQgbW9kZTogJyR7bi5tb2RlfSdgKTtzd2l0Y2gobi5jb29yZGluYXRlVHJhbnNmb3JtTW9kZSl7Y2FzZSJhc3ltbWV0cmljIjpfPSJcbiAgICAgICAgICAgICAgICAgICAgdmVjNCBnZXRTb3VyY2VGcmFjSW5kZXgoaXZlYzQgY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVjNChjb29yZHMpIC8gc2NhbGVXSFdIO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIjticmVhaztjYXNlImhhbGZfcGl4ZWwiOl89IlxuICAgICAgICAgICAgICAgICAgICB2ZWM0IGdldFNvdXJjZUZyYWNJbmRleChpdmVjNCBjb29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodmVjNChjb29yZHMpICsgMC41KSAvIHNjYWxlV0hXSCAtIDAuNTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICI7YnJlYWs7Y2FzZSJweXRvcmNoX2hhbGZfcGl4ZWwiOl89YFxuICAgICAgICAgICAgICAgICAgICB2ZWM0IGdldFNvdXJjZUZyYWNJbmRleChpdmVjNCBjb29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgZmNvb3JkcyA9IHZlYzQoY29vcmRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZWM0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7aH0uMCA+IDEuMCA/IChmY29vcmRzLnggKyAwLjUpIC8gc2NhbGVXSFdILnggLSAwLjUgOiAwLjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtmfS4wID4gMS4wID8gKGZjb29yZHMueSArIDAuNSkgLyBzY2FsZVdIV0gueSAtIDAuNSA6IDAuMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2h9LjAgPiAxLjAgPyAoZmNvb3Jkcy56ICsgMC41KSAvIHNjYWxlV0hXSC56IC0gMC41IDogMC4wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Zn0uMCA+IDEuMCA/IChmY29vcmRzLncgKyAwLjUpIC8gc2NhbGVXSFdILncgLSAwLjUgOiAwLjBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGA7YnJlYWs7Y2FzZSJhbGlnbl9jb3JuZXJzIjpfPWBcbiAgICAgICAgICAgICAgICAgICAgdmVjNCBnZXRTb3VyY2VGcmFjSW5kZXgoaXZlYzQgY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZWM0IHJlc2l6ZWQgPSB2ZWM0KCR7aH0uMCAtIDEuMCwgJHtmfS4wIC0gMS4wLCAke2h9LjAgLSAxLjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtmfS4wIC0gMS4wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgb3JpZ2luYWwgPSB2ZWM0KCR7bX0uMCAtIDEuMCwgJHtifS4wIC0gMS4wLCAke219LjAgLSAxLjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtifS4wIC0gMS4wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzQgbmV3X3NjYWxlID0gb3JpZ2luYWwgLyByZXNpemVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlYzQoY29vcmRzKSAqIG5ld19zY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHJlc2l6ZSAocGFja2VkKSBkb2VzIG5vdCBzdXBwb3J0IGNvb3JkaW5hdGVUcmFuc2Zvcm1Nb2RlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcke24uY29vcmRpbmF0ZVRyYW5zZm9ybU1vZGV9J2ApfWNvbnN0IHc9KDAsIGkuZ2V0Q29vcmRzRGF0YVR5cGUpKGQpLFQ9YFxuICAgICAgICAgICAgY29uc3QgdmVjMiBpbnB1dFdIID0gdmVjMigke2J9LjAsICR7bX0uMCk7XG4gICAgICAgICAgICBjb25zdCB2ZWM0IHNjYWxlV0hXSCA9IHZlYzQoZmxvYXQoJHt5fSksIGZsb2F0KCR7dn0pLCBmbG9hdCgke3l9KSwgZmxvYXQoJHt2fSkpO1xuICAgICAgICAgICAgJHsoMCwgcy51bnBhY2tGcm9tQ2hhbm5lbCkoKX1cbiAgICAgICAgICAgICR7X31cbiAgICAgICAgICAgIGZsb2F0IGdldEFWYWx1ZShpbnQgeDEwLCBpbnQgciwgaW50IGMsIGludCBkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QSh4MTAsIHIsIGMsIGQpLCB2ZWMyKGMsIGQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAgICAgICAke3d9IHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgICAgICAgICBpbnQgYmF0Y2ggPSByY1swXTtcbiAgICAgICAgICAgICAgICBpbnQgZGVwdGggPSByY1sxXTtcblxuICAgICAgICAgICAgICAgIC8vIHJldHJpZXZlIHRoZSA0IGNvb3JkaW5hdGVzIHRoYXQgaXMgdXNlZCBpbiB0aGUgNCBwYWNrZWQgb3V0cHV0IHZhbHVlcy5cbiAgICAgICAgICAgICAgICBpdmVjNCBjb29yZHMgPSBpdmVjNChyYy53eiwgcmMudyArIDEsIHJjLnogKyAxKTtcblxuICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgc291cmNlIGluZGV4IGluIGZyYWN0aW9uXG4gICAgICAgICAgICAgICAgdmVjNCBzb3VyY2VGcmFjID0gZ2V0U291cmNlRnJhY0luZGV4KGNvb3Jkcyk7XG5cbiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCBvZiB0aGUgNCB2YWx1ZXMgdGhhdCB3aWxsIGJlIHBhY2tlZCBpbnRvIG9uZSB0ZXhlbC5cbiAgICAgICAgICAgICAgICBpdmVjNCB4MDAgPSBpdmVjNChtYXgoc291cmNlRnJhYy54eSwgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy54eSkpKTtcbiAgICAgICAgICAgICAgICBpdmVjNCB4MDEgPSBpdmVjNChtYXgoc291cmNlRnJhYy54dywgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy54dykpKTtcbiAgICAgICAgICAgICAgICBpdmVjNCB4MTAgPSBpdmVjNChtYXgoc291cmNlRnJhYy56eSwgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy56eSkpKTtcbiAgICAgICAgICAgICAgICBpdmVjNCB4MTEgPSBpdmVjNChtYXgoc291cmNlRnJhYy56dywgdmVjMigwLjApKSwgbWluKGlucHV0V0ggLSAxLjAsIGNlaWwoc291cmNlRnJhYy56dykpKTtcblxuICAgICAgICAgICAgICAgIGJvb2wgaGFzTmV4dFJvdyA9IHJjLncgPCAke2YtMX07XG4gICAgICAgICAgICAgICAgYm9vbCBoYXNOZXh0Q29sID0gcmMueiA8ICR7aC0xfTtcblxuICAgICAgICAgICAgICAgIC8vIHBhY2sgeDAwLCB4MDEsIHgxMCwgeDExJ3MgdG9wLWxlZnQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgdmVjNCB0b3BMZWZ0ID0gdmVjNChcbiAgICAgICAgICAgICAgICAgICAgZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDAwLngsIHgwMC55KSxcbiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMS54LCB4MDEueSkgOiAwLjAsXG4gICAgICAgICAgICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTAueCwgeDEwLnkpIDogMC4wLFxuICAgICAgICAgICAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgxMS54LCB4MTEueSkgOiAwLjApO1xuXG4gICAgICAgICAgICAgICAgLy8gcGFjayB4MDAsIHgwMSwgeDEwLCB4MTEncyB0b3AtcmlnaHQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgdmVjNCB0b3BSaWdodCA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICAgIGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMC54LCB4MDAudyksXG4gICAgICAgICAgICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MDEueCwgeDAxLncpIDogMC4wLFxuICAgICAgICAgICAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDEwLngsIHgxMC53KSA6IDAuMCxcbiAgICAgICAgICAgICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTEueCwgeDExLncpIDogMC4wKTtcblxuICAgICAgICAgICAgICAgIC8vIHBhY2sgeDAwLCB4MDEsIHgxMCwgeDExJ3MgYm90dG9tLWxlZnQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgdmVjNCBib3R0b21MZWZ0ID0gdmVjNChcbiAgICAgICAgICAgICAgICAgICAgZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDAwLnosIHgwMC55KSxcbiAgICAgICAgICAgICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMS56LCB4MDEueSkgOiAwLjAsXG4gICAgICAgICAgICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTAueiwgeDEwLnkpIDogMC4wLFxuICAgICAgICAgICAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/IGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgxMS56LCB4MTEueSkgOiAwLjApO1xuXG4gICAgICAgICAgICAgICAgLy8gcGFjayB4MDAsIHgwMSwgeDEwLCB4MTEncyBib3R0b20tcmlnaHQgY29ybmVyIGludG8gb25lIHZlYzQgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgdmVjNCBib3R0b21SaWdodCA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICAgIGdldEFWYWx1ZShiYXRjaCwgZGVwdGgsIHgwMC56LCB4MDAudyksXG4gICAgICAgICAgICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MDEueiwgeDAxLncpIDogMC4wLFxuICAgICAgICAgICAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGJhdGNoLCBkZXB0aCwgeDEwLnosIHgxMC53KSA6IDAuMCxcbiAgICAgICAgICAgICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgPyBnZXRBVmFsdWUoYmF0Y2gsIGRlcHRoLCB4MTEueiwgeDExLncpIDogMC4wKTtcblxuICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgaW50ZXJwb2xhdGlvbiBmcmFjdGlvbiBvbiB1IGFuZCB2IGRpcmVjdGlvblxuICAgICAgICAgICAgICAgIHZlYzQgZnJhYyA9IHZlYzQoc291cmNlRnJhYykgLSBmbG9vcihzb3VyY2VGcmFjKTtcbiAgICAgICAgICAgICAgICB2ZWM0IGNsYW1wRnJhYyA9IGNsYW1wKGZyYWMsIHZlYzQoMC4wKSwgdmVjNCgxLjApKTtcblxuICAgICAgICAgICAgICAgIHZlYzQgdG9wID0gbWl4KHRvcExlZnQsIHRvcFJpZ2h0LCBjbGFtcEZyYWMueXd5dyk7XG4gICAgICAgICAgICAgICAgdmVjNCBib3R0b20gPSBtaXgoYm90dG9tTGVmdCwgYm90dG9tUmlnaHQsIGNsYW1wRnJhYy55d3l3KTtcbiAgICAgICAgICAgICAgICB2ZWM0IG5ld1ZhbHVlID0gbWl4KHRvcCwgYm90dG9tLCBjbGFtcEZyYWMueHh6eik7XG5cbiAgICAgICAgICAgICAgICAke2Eub3V0cHV0fSA9IHZlYzQobmV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdSkse291dHB1dDp7ZGltczpwLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUucGFja2VkfSxoYXNNYWluOiEwLHNoYWRlclNvdXJjZTpUfSl9LGM9KGUsdCk9Pntjb25zdCBuPWVbMF0uZGltcztsZXQgcixvPXQuc2NhbGVzO2lmKDA9PT1vLmxlbmd0aCl7Y29uc3QgaT1lW3Quc2NhbGVzSW5wdXRJZHhdO2lmKGkmJjAhPT1pLnNpemUpe2lmKGVbdC5zaXplc0lucHV0SWR4XSl0aHJvdyBuZXcgRXJyb3IoIk9ubHkgb25lIG9mIHNjYWxlcyBvciBzaXplcyBtdXN0IGJlIHByb3ZpZGVkIGFzIGlucHV0LiIpO289cChpLHQubW9kZSx0LmlzUmVzaXplKTt9ZWxzZSB7Y29uc3QgaT1lW3Quc2l6ZXNJbnB1dElkeF07aWYoIWl8fDA9PT1pLnNpemUpdGhyb3cgbmV3IEVycm9yKCJFaXRoZXIgc2NhbGVzIG9yIHNpemVzIE1VU1QgYmUgcHJvdmlkZWQgYXMgaW5wdXQuIik7cj1BcnJheS5mcm9tKGkuaW50ZWdlckRhdGEpLG89ZChyLG4sdC5tb2RlLHQuaXNSZXNpemUpO319ZWxzZSBpZihlW3Quc2l6ZXNJbnB1dElkeF0pdGhyb3cgbmV3IEVycm9yKCJPbmx5IG9uZSBvZiBzY2FsZXMgb3Igc2l6ZXMgbXVzdCBiZSBwcm92aWRlZCBhcyBpbnB1dC4iKTtjb25zdCBpPXJ8fG4ubWFwKCgoZSx0KT0+TWF0aC5mbG9vcihlKm9bdF0pKSk7cmV0dXJuIFtvLGldfSxwPShlLHQsbik9Pntjb25zdCByPUFycmF5LmZyb20oZS5mbG9hdERhdGEpO3JldHVybiAoMCwgYS5zY2FsZXNWYWxpZGF0aW9uKShyLHQsbikscn0sZD0oZSx0LG4scik9Pntjb25zdCBvPXQubGVuZ3RoLGk9bmV3IEFycmF5KG8pO2ZvcihsZXQgbj0wLHI9bztuPHI7bisrKWlmKDA9PT10W25dKXtpZigwIT09ZVtuXSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IGRpbSBpcyB6ZXJvIGJ1dCByZXF1aXJlZCBvdXRwdXQgZGltIGlzIG5vbi16ZXJvLiIpO2lbbl09MTt9ZWxzZSBpW25dPWVbbl0vdFtuXTtyZXR1cm4gKDAsIGEuc2NhbGVzVmFsaWRhdGlvbikoaSxuLHIpLGl9O30sNTY1OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5zaGFwZT12b2lkIDA7Y29uc3Qgcj1uKDkyNDApO3Quc2hhcGU9KGUsdCk9PihvKHQpLFtuZXcgci5UZW5zb3IoW3RbMF0uZGltcy5sZW5ndGhdLCJpbnQzMiIsdm9pZCAwLHZvaWQgMCxuZXcgSW50MzJBcnJheSh0WzBdLmRpbXMpKV0pO2NvbnN0IG89ZT0+e2lmKCFlfHwxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJTaGFwZSByZXF1aXJlcyAxIGlucHV0LiIpfTt9LDI0NDQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnNsaWNlVjEwPXQucGFyc2VTbGljZUF0dHJpYnV0ZXM9dC5zbGljZT12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big2MTQ1KSxpPW4oNzI3Mykscz1uKDU2MzkpLGE9e25hbWU6IlNsaWNlIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W3MuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnNsaWNlPShlLHQsbik9PihsKHQpLFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+dShlLHRbMF0sbil9KSx0KV0pLHQucGFyc2VTbGljZUF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEludHMoInN0YXJ0cyIpLG49ZS5hdHRyaWJ1dGVzLmdldEludHMoImVuZHMiKSxvPWUuYXR0cmlidXRlcy5nZXRJbnRzKCJheGVzIixbXSk7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe3N0YXJ0czp0LGVuZHM6bixheGVzOm99KX07Y29uc3QgdT0oZSx0LG4pPT57Y29uc3Qgcj0wPT09bi5heGVzLmxlbmd0aD90LmRpbXMuc2xpY2UoMCkubWFwKCgoZSx0KT0+dCkpOm4uYXhlcyxvPWkuU2hhcGVVdGlsLm5vcm1hbGl6ZUF4ZXMocix0LmRpbXMubGVuZ3RoKSx1PW4uc3RhcnRzLm1hcCgoKGUsbik9PmU+dC5kaW1zW29bbl1dLTE/dC5kaW1zW29bbl1dOmkuU2hhcGVVdGlsLm5vcm1hbGl6ZUF4aXMoZSx0LmRpbXNbb1tuXV0pKSksbD1uLmVuZHMubWFwKCgoZSxuKT0+ZT50LmRpbXNbb1tuXV0tMT90LmRpbXNbb1tuXV06aS5TaGFwZVV0aWwubm9ybWFsaXplQXhpcyhlLHQuZGltc1tvW25dXSkpKSxjPXQuZGltcy5zbGljZSgpLHA9W107Zm9yKGxldCBlPTA7ZTxvLmxlbmd0aDtlKyspY1tvW2VdXT1sW2VdLXVbZV0sdVtlXT4wJiZwLnB1c2goYG91dHB1dElkeFske29bZV19XSArPSAke3VbZV19O2ApO2NvbnN0IGQ9YFxuICAgICAgZmxvYXQgcHJvY2VzcyhpbnQgb3V0cHV0SWR4WyR7Yy5sZW5ndGh9XSkge1xuICAgICAgICAke3Auam9pbigiXG4gICAgICAiKX1cbiAgICAgICAgcmV0dXJuIF9BKG91dHB1dElkeCk7XG4gICAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtvdXRwdXQ6e2RpbXM6Yyx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTpzLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6ZH0pfSxsPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU2xpY2UgcmVxdWlyZXMgMSBpbnB1dC4iKTtpZigtMT09PW8uTlVNQkVSX1RZUEVTLmluZGV4T2YoZVswXS50eXBlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX07dC5zbGljZVYxMD0oZSx0KT0+e3AodCk7Y29uc3Qgbj1jKGUsdCk7cmV0dXJuIFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+dShlLHRbMF0sbil9KSxbdFswXV0pXX07Y29uc3QgYz0oZSx0KT0+e2lmKCFlLnNlc3Npb24uaXNJbml0aWFsaXplcih0WzFdLmRhdGFJZCl8fCFlLnNlc3Npb24uaXNJbml0aWFsaXplcih0WzJdLmRhdGFJZCl8fHQubGVuZ3RoPj00JiYhZS5zZXNzaW9uLmlzSW5pdGlhbGl6ZXIodFszXS5kYXRhSWQpfHx0Lmxlbmd0aD49NSYmIWUuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbNF0uZGF0YUlkKSl0aHJvdyBuZXcgRXJyb3IoImR5bmFtaWMgc2xpY2UgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQiKTtpZih0Lmxlbmd0aD49NSYmdFs0XS5pbnRlZ2VyRGF0YS5zb21lKChlPT4xIT09ZSkpKXRocm93IG5ldyBFcnJvcigiY3VycmVudGx5IG5vbi0xIHN0ZXBzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFNsaWNlIik7Y29uc3Qgbj1BcnJheS5mcm9tKHRbMV0uaW50ZWdlckRhdGEpLHI9QXJyYXkuZnJvbSh0WzJdLmludGVnZXJEYXRhKSxvPXQubGVuZ3RoPj00P0FycmF5LmZyb20odFszXS5pbnRlZ2VyRGF0YSk6W107cmV0dXJuIHtzdGFydHM6bixlbmRzOnIsYXhlczpvLGNhY2hlS2V5OmAke299OyR7bn07JHtyfWB9fSxwPWU9PntpZighZXx8ZS5sZW5ndGg8M3x8ZS5sZW5ndGg+NSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgbnVtYmVyLiIpO2lmKCJpbnQzMiIhPT1lWzFdLnR5cGV8fDEhPT1lWzFdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKCJpbnQzMiIhPT1lWzJdLnR5cGV8fDEhPT1lWzJdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKGUubGVuZ3RoPj00JiYoImludDMyIiE9PWVbM10udHlwZXx8MSE9PWVbM10uZGltcy5sZW5ndGgpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpO2lmKGUubGVuZ3RoPj01JiYoImludDMyIiE9PWVbNF0udHlwZXx8MSE9PWVbNF0uZGltcy5sZW5ndGgpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDgxNTooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuc29mdG1heFYxMz10LnBhcnNlU29mdG1heEF0dHJpYnV0ZXNWMTM9dC5wYXJzZVNvZnRtYXhBdHRyaWJ1dGVzPXQuc29mdG1heD12b2lkIDA7Y29uc3Qgcj1uKDQ5MTApLG89big3MjczKSxpPW4oNjc1Nykscz1uKDU2MzkpLGE9big1NzA3KSx1PXtuYW1lOiJTb2Z0bWF4Q29tcHV0ZU1heCIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOltzLlRleHR1cmVUeXBlLnVucGFja2VkXX0sbD17bmFtZToiU29mdG1heENvbXB1dGVTY2FsZSIsaW5wdXROYW1lczpbIkEiLCJNYXgiXSxpbnB1dFR5cGVzOltzLlRleHR1cmVUeXBlLnVucGFja2VkLHMuVGV4dHVyZVR5cGUudW5wYWNrZWRdfSxjPXtuYW1lOiJTb2Z0TWF4IixpbnB1dE5hbWVzOlsiQSIsIk1heCIsIk5vcm0iXSxpbnB1dFR5cGVzOltzLlRleHR1cmVUeXBlLnVucGFja2VkLHMuVGV4dHVyZVR5cGUudW5wYWNrZWQscy5UZXh0dXJlVHlwZS51bnBhY2tlZF19O3Quc29mdG1heD0oZSx0LG4pPT57Zyh0KTtjb25zdCByPXRbMF0uZGltcy5zbGljZSgpLGk9by5TaGFwZVV0aWwubm9ybWFsaXplQXhpcyhuLmF4aXMsci5sZW5ndGgpLHM9by5TaGFwZVV0aWwuc2l6ZVRvRGltZW5zaW9uKHIsaSksYT1vLlNoYXBlVXRpbC5zaXplRnJvbURpbWVuc2lvbihyLGkpO3JldHVybiBwKGUsdCxuLHMsYSl9LHQucGFyc2VTb2Z0bWF4QXR0cmlidXRlcz1lPT4oMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtheGlzOmUuYXR0cmlidXRlcy5nZXRJbnQoImF4aXMiLDEpfSksdC5wYXJzZVNvZnRtYXhBdHRyaWJ1dGVzVjEzPWU9PigwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4aXM6ZS5hdHRyaWJ1dGVzLmdldEludCgiYXhpcyIsLTEpfSksdC5zb2Z0bWF4VjEzPShlLHQsbik9PntnKHQpO2NvbnN0IGk9dFswXS5kaW1zLnNsaWNlKCkscz1vLlNoYXBlVXRpbC5ub3JtYWxpemVBeGlzKG4uYXhpcyxpLmxlbmd0aCksdT1pLmxlbmd0aCxsPXMhPT11LTEsYz1bXTtsZXQgZCxmPVtdLGg9W107bCYmKGY9QXJyYXkuZnJvbSh7bGVuZ3RoOnV9KS5tYXAoKChlLHQpPT50KSksZltzXT11LTEsZlt1LTFdPXMsZi5tYXAoKGU9PmMucHVzaChpW2VdKSkpLGQ9KDAsIHIuY3JlYXRlQXR0cmlidXRlV2l0aENhY2hlS2V5KSh7cGVybTpmfSksaD0oMCwgYS50cmFuc3Bvc2UpKGUsdCxkKSk7Y29uc3QgYj1sP28uU2hhcGVVdGlsLnNpemVUb0RpbWVuc2lvbihjLHUtMSk6by5TaGFwZVV0aWwuc2l6ZVRvRGltZW5zaW9uKGksdS0xKSxtPWw/by5TaGFwZVV0aWwuc2l6ZUZyb21EaW1lbnNpb24oYyx1LTEpOm8uU2hhcGVVdGlsLnNpemVGcm9tRGltZW5zaW9uKGksdS0xKSx5PXAoZSxsP2g6dCxuLGIsbSk7cmV0dXJuIGw/KDAsIGEudHJhbnNwb3NlKShlLHksZCk6eX07Y29uc3QgcD0oZSx0LG4scixvKT0+e2NvbnN0IGk9ZChlLHRbMF0scixvLFtyXSkscz1lLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdSkse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+aX0pLHQpLGE9ZihlLHRbMF0scixvLGkub3V0cHV0LmRpbXMsW3JdKSxwPWUucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxsKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXksZ2V0OigpPT5hfSksW3RbMF0sc10pLGc9aChlLHRbMF0scixvLGkub3V0cHV0LmRpbXMsYS5vdXRwdXQuZGltcyk7cmV0dXJuIFtlLnJ1bihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYykse2NhY2hlSGludDpuLmNhY2hlS2V5LGdldDooKT0+Z30pLFt0WzBdLHMscF0pXX0sZD0oZSx0LG4scixvKT0+e2NvbnN0W2EsbF09ZS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQodC5kaW1zLHMuVGV4dHVyZVR5cGUudW5wYWNrZWQpLGM9by5sZW5ndGg7aWYobjwxfHxyPDEpdGhyb3cgbmV3IEVycm9yKCJMb2dpY2FsIHJvdyBjb3VudCBOIGFuZCBmZWF0dXJlIGNvdW50IEQgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSIpO2lmKDEhPT1vLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkRpbWVuc2lvbmFsaXR5IG9mIHRoZSBvdXRwdXQgc2hvdWxkIGJlIDEiKTtpZihvWzBdIT09bil0aHJvdyBuZXcgRXJyb3IoIlNoYXBlIG9mIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGVxdWFsIHRvIGxvZ2ljYWwgcm93IGNvdW50Iik7Y29uc3QgcD0oMCwgaS5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksZD1gXG4gICAgICBmbG9hdCBwcm9jZXNzKGludFske2N9XSBpbmRpY2VzKSB7XG4gICAgICAgIGludCBsb2dpY2FsX3Jvd19zdGFydF9vZmZzZXQgPSBpbmRpY2VzWzBdICogJHtyfTtcblxuICAgICAgICBmbG9hdCBtYXggPSBnZXRDb2xvckFzRmxvYXQoJHtwLnRleHR1cmUyRH0oQSwgb2Zmc2V0VG9Db29yZHMobG9naWNhbF9yb3dfc3RhcnRfb2Zmc2V0LCAke2F9LFxuICAgICAgICAke2x9ICkpKTtcbiAgICAgICAgZm9yKGludCBpPTE7IGk8JHtyfTsgKytpKVxuICAgICAgICB7XG4gICAgICAgICAgZmxvYXQgY3VycmVudCA9IGdldENvbG9yQXNGbG9hdCgke3AudGV4dHVyZTJEfShBLCBvZmZzZXRUb0Nvb3Jkcyhsb2dpY2FsX3Jvd19zdGFydF9vZmZzZXQgKyBpLFxuICAgICAgICAgICAgJHthfSwgJHtsfSkpKTtcbiAgICAgICAgICBpZihjdXJyZW50ID4gbWF4KVxuICAgICAgICAgIG1heCA9IGN1cnJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWF4O1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx1KSx7b3V0cHV0OntkaW1zOm8sdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6cy5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmR9KX0sZj0oZSx0LG4scixvLGEpPT57Y29uc3RbdSxjXT1lLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodCh0LmRpbXMscy5UZXh0dXJlVHlwZS51bnBhY2tlZCkscD1hLmxlbmd0aDtpZihuPDF8fHI8MSl0aHJvdyBuZXcgRXJyb3IoIkxvZ2ljYWwgcm93IGNvdW50IE4gYW5kIGZlYXR1cmUgY291bnQgRCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIik7aWYoMSE9PWEubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiRGltZW5zaW9uYWxpdHkgb2YgdGhlIG91dHB1dCBzaG91bGQgYmUgMSIpO2lmKGFbMF0hPT1uKXRocm93IG5ldyBFcnJvcigiU2hhcGUgb2YgdGhlIG91dHB1dCBzaG91bGQgYmUgZXF1YWwgdG8gbG9naWNhbCByb3cgY291bnQiKTtpZigxIT09by5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJEaW1lbnNpb25hbGl0eSBvZiB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgc2hvdWxkIGJlIDEiKTtpZihvWzBdIT09bil0aHJvdyBuZXcgRXJyb3IoIlNoYXBlIG9mIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBzaG91bGQgYmUgZXF1YWwgdG8gbG9naWNhbCByb3cgY291bnQiKTtjb25zdCBkPWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50WyR7cH1dIGluZGljZXMpIHtcbiAgICAgICAgaW50IGxvZ2ljYWxfcm93X3N0YXJ0X29mZnNldCA9IGluZGljZXNbMF0gKiAke3J9O1xuXG4gICAgICAgIGZsb2F0IG5vcm1fZmFjdG9yID0gMC4wO1xuICAgICAgICBmbG9hdCBtYXggPSBfTWF4KGluZGljZXMpO1xuICAgICAgICBmb3IoaW50IGk9MDsgaTwke3J9OyArK2kpXG4gICAgICAgIHtcbiAgICAgICAgICBub3JtX2ZhY3RvciArPSBleHAoZ2V0Q29sb3JBc0Zsb2F0KCR7KDAsIGkuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pLnRleHR1cmUyRH0oQSwgb2Zmc2V0VG9Db29yZHMobG9naWNhbF9yb3dfc3RhcnRfb2Zmc2V0ICsgaSxcbiAgICAgICAgICAgICR7dX0sICR7Y30pKSkgLSBtYXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vcm1fZmFjdG9yO1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxsKSx7b3V0cHV0OntkaW1zOmEsdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6cy5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOmR9KX0saD0oZSx0LG4scixvLGkpPT57Y29uc3RbYSx1XT1lLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodCh0LmRpbXMscy5UZXh0dXJlVHlwZS51bnBhY2tlZCksbD10LmRpbXMubGVuZ3RoO2lmKG48MXx8cjwxKXRocm93IG5ldyBFcnJvcigiTG9naWNhbCByb3cgY291bnQgTiBhbmQgZmVhdHVyZSBjb3VudCBEIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEiKTtpZigxIT09by5sZW5ndGh8fDEhPT1pLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkRpbWVuc2lvbmFsaXR5IG9mIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBzaG91bGQgYmUgMSIpO2lmKG9bMF0hPT1ufHxpWzBdIT09bil0aHJvdyBuZXcgRXJyb3IoIlNoYXBlIG9mIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBzaG91bGQgYmUgZXF1YWwgdG8gbG9naWNhbCByb3cgY291bnQiKTtjb25zdCBwPWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50WyR7bH1dIGluZGljZXMpIHtcblxuICAgICAgLy8gZ2V0IG9mZnNldCBvZiBjdXJyZW50IGxvZ2ljYWwgdGVuc29yIGluZGV4IGZyb20gdGhlIDItRCB0ZXh0dXJlIGNvb3JkaW5hdGVzIChUZXhDb29yZHMpXG4gICAgICBpbnQgb2Zmc2V0ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke2F9LCAke3V9KTtcblxuICAgICAgLy9kZXRlcm1pbmUgdGhlIGxvZ2ljYWwgcm93IGZvciB0aGlzIGluZGV4XG4gICAgICBpbnQgbG9naWNhbF9yb3dfaW5kZXhbMV07XG4gICAgICBsb2dpY2FsX3Jvd19pbmRleFswXSA9IG9mZnNldCAvICR7cn07XG5cbiAgICAgIGZsb2F0IG5vcm1fZmFjdG9yID0gX05vcm0obG9naWNhbF9yb3dfaW5kZXgpO1xuXG4gICAgICAvLyBhdm9pZCBwb3NzaWJsZSBkaXZpc2lvbiBieSAwXG4gICAgICAvLyBpZiBub3JtX2ZhY29yIGlzIDAsIGFsbCBlbGVtZW50cyBhcmUgemVyb1xuICAgICAgLy8gaWYgc28sIHJldHVybiAwXG4gICAgICBpZihub3JtX2ZhY3RvciA9PSAwLjApXG4gICAgICAgIHJldHVybiAwLjA7XG5cbiAgICAgIHJldHVybiBleHAoX0EoaW5kaWNlcykgLSBfTWF4KGxvZ2ljYWxfcm93X2luZGV4KSkgLyBub3JtX2ZhY3RvcjtcbiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGMpLHtvdXRwdXQ6e2RpbXM6dC5kaW1zLHR5cGU6dC50eXBlLHRleHR1cmVUeXBlOnMuVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpwfSl9LGc9ZT0+e2lmKCFlfHwxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJTb2Z0bWF4IHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoImZsb2F0MzIiIT09ZVswXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUiKX07fSw1NjQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlU3BsaXRBdHRyaWJ1dGVzPXQuc3BsaXQ9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNzI3MyksaT1uKDU2MzkpLHM9e25hbWU6IlNwbGl0IixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W2kuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnNwbGl0PShlLHQsbik9PntsKHQpO2NvbnN0IHI9by5TaGFwZVV0aWwubm9ybWFsaXplQXhpcyhuLmF4aXMsdFswXS5kaW1zLmxlbmd0aCksaT1hKGUsdCxyLG4pLGM9W107Zm9yKGxldCBvPTA7bzxpOysrbyljLnB1c2goZS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtjYWNoZUhpbnQ6YCR7bi5jYWNoZUtleX07JHtvfWAsZ2V0OigpPT51KGUsdFswXSxuLHIsbyl9KSx0KSk7cmV0dXJuIGN9LHQucGFyc2VTcGxpdEF0dHJpYnV0ZXM9ZT0+e2NvbnN0IHQ9ZS5hdHRyaWJ1dGVzLmdldEludCgiYXhpcyIsMCksbj1lLmF0dHJpYnV0ZXMuZ2V0SW50cygic3BsaXQiLFtdKSxvPWUub3V0cHV0cy5sZW5ndGg7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2F4aXM6dCxzcGxpdDpuLG51bU91dHB1dHM6b30pfTtjb25zdCBhPShlLHQsbixyKT0+e2NvbnN0WyxpXT1vLlNwbGl0VXRpbC5zcGxpdFNoYXBlKHRbMF0uZGltcyxuLHIuc3BsaXQsci5udW1PdXRwdXRzKTtyZXR1cm4gaS5sZW5ndGh9LHU9KGUsdCxuLHIsYSk9Pntjb25zdFt1LGxdPW8uU3BsaXRVdGlsLnNwbGl0U2hhcGUodC5kaW1zLHIsbi5zcGxpdCxuLm51bU91dHB1dHMpLGM9bFthXSxwPXVbYV0sZD1gXG4gICAgICBmbG9hdCBwcm9jZXNzKGludCBpbmRpY2VzWyR7cC5sZW5ndGh9XSkge1xuICAgICAgICBpbmRpY2VzWyR7cn1dICs9ICR7Y307XG4gICAgICAgIHJldHVybiBfQShpbmRpY2VzKTtcbiAgICAgIH1cbiAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scykse2NhY2hlSGludDpgJHtuLmNhY2hlS2V5fToke2F9YCxvdXRwdXQ6e2RpbXM6cCx0eXBlOnQudHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6ZH0pfSxsPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU3BsaXQgcmVxdWlyZXMgb25lIGlucHV0LiIpO2lmKCJpbnQ4IiE9PWVbMF0udHlwZSYmInVpbnQ4IiE9PWVbMF0udHlwZSYmImludDE2IiE9PWVbMF0udHlwZSYmInVpbnQxNiIhPT1lWzBdLnR5cGUmJiJpbnQzMiIhPT1lWzBdLnR5cGUmJiJ1aW50MzIiIT09ZVswXS50eXBlJiYiZmxvYXQzMiIhPT1lWzBdLnR5cGUmJiJmbG9hdDY0IiE9PWVbMF0udHlwZSYmImJvb2wiIT09ZVswXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDU0MTY6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnBhcnNlU3F1ZWV6ZUF0dHJpYnV0ZXM9dC5zcXVlZXplVjEzPXQuc3F1ZWV6ZT12b2lkIDA7Y29uc3Qgcj1uKDcyNzMpO3Quc3F1ZWV6ZT0oZSx0LG4pPT57byh0KTtjb25zdCBpPXIuU2hhcGVVdGlsLnNxdWVlemVTaGFwZSh0WzBdLmRpbXMsbik7cmV0dXJuIFtlLnJlc2hhcGVVbnBhY2tlZCh0WzBdLGkpXX0sdC5zcXVlZXplVjEzPShlLG4pPT4oaShuKSwoMCwgdC5zcXVlZXplKShlLFtuWzBdXSxBcnJheS5mcm9tKG5bMV0uaW50ZWdlckRhdGEpKSksdC5wYXJzZVNxdWVlemVBdHRyaWJ1dGVzPWU9PmUuYXR0cmlidXRlcy5nZXRJbnRzKCJheGVzIik7Y29uc3Qgbz1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlNxdWVlemUgcmVxdWlyZXMgMSBpbnB1dC4iKTtpZigic3RyaW5nIj09PWVbMF0udHlwZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgaW5wdXQgdGVuc29yIHR5cGVzLiIpfSxpPWU9PntpZighZXx8MiE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU3F1ZWV6ZSByZXF1aXJlcyAyIGlucHV0cy4iKTtpZigiaW50MzIiIT09ZVsxXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0eXBlLiIpfTt9LDEyNDA6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnN1bT12b2lkIDA7Y29uc3Qgcj1uKDY3NTcpLG89big1NjM5KTt0LnN1bT0oZSx0KT0+e3ModCk7Y29uc3Qgbj17bmFtZToiU3VtIixpbnB1dE5hbWVzOnQubWFwKCgoZSx0KT0+YFgke3R9YCkpLGlucHV0VHlwZXM6bmV3IEFycmF5KHQubGVuZ3RoKS5maWxsKG8uVGV4dHVyZVR5cGUudW5wYWNrZWQpfTtyZXR1cm4gW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7Z2V0OigpPT5pKGUsdCxuKX0pLHQpXX07Y29uc3QgaT0oZSx0LG4pPT57Y29uc3QgaT0oMCwgci5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbikscz10WzBdLmRpbXMuc2xpY2UoKSxhPWBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgdmVjNCByZXN1bHQgPSAke3QubWFwKCgoZSx0KT0+YCR7aS50ZXh0dXJlMkR9KFgke3R9LFRleENvb3JkcylgKSkuam9pbigiICsgIil9O1xuICAgICAgICAke2kub3V0cHV0fSA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICBgO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbikse291dHB1dDp7ZGltczpzLHR5cGU6dFswXS50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LGhhc01haW46ITAsc2hhZGVyU291cmNlOmF9KX0scz1lPT57aWYoIWV8fDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlN1bSByZXF1aXJlcyBpbnB1dHMuIik7Y29uc3QgdD1lWzBdLmRpbXMubGVuZ3RoO2ZvcihsZXQgbj0xO248ZS5sZW5ndGg7bisrKXtpZih0IT09ZVtuXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHNoYXBlcyBhcmUgbWlzbWF0Y2hlZC4iKTtmb3IobGV0IHI9MDtyPHQ7cisrKWlmKGVbMF0uZGltc1tyXSE9PWVbbl0uZGltc1tyXSl0aHJvdyBuZXcgRXJyb3IoIklucHV0IHNoYXBlcyBhcmUgbm90IG1hdGNoZWQuIil9aWYoImZsb2F0MzIiIT09ZVswXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHR5cGUuIik7Zm9yKGxldCB0PTE7dDxlLmxlbmd0aDt0KyspaWYoZVswXS50eXBlIT09ZVt0XS50eXBlKXRocm93IG5ldyBFcnJvcigiSW5wdXQgdHlwZXMgYXJlIG5vdCBtYXRjaGVkLiIpfTt9LDU5NDQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnRpbGU9dm9pZCAwO2NvbnN0IHI9big2MTQ1KSxvPW4oNTYzOSk7dC50aWxlPShlLHQpPT57cyh0KTtjb25zdCBuPXtuYW1lOiJUaWxlIixpbnB1dE5hbWVzOlsiQSJdLGlucHV0VHlwZXM6W28uVGV4dHVyZVR5cGUudW5wYWNrZWRdfTtyZXR1cm4gW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7Z2V0OigpPT5pKGUsdCxuKX0pLHQpXX07Y29uc3QgaT0oZSx0LG4pPT57Y29uc3Qgcj10WzBdLmRpbXMuc2xpY2UoKSxpPW5ldyBBcnJheShyLmxlbmd0aCkscz1bXTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrKylpW2VdPXJbZV0qdFsxXS5udW1iZXJEYXRhW2VdLHMucHVzaChgaW5wdXRJZHhbJHtlfV0gPSBpbnQobW9kKGZsb2F0KG91dHB1dElkeFske2V9XSksICR7cltlXX0uKSk7YCk7Y29uc3QgYT1pLmxlbmd0aCx1PWBcbiAgICAgIGZsb2F0IHByb2Nlc3MoaW50IG91dHB1dElkeFske2F9XSkge1xuICAgICAgICBpbnQgaW5wdXRJZHhbJHthfV07XG4gICAgICAgICR7cy5qb2luKCJcbiIpfVxuICAgICAgICByZXR1cm4gX0EoaW5wdXRJZHgpO1xuICAgICAgfVxuICAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7b3V0cHV0OntkaW1zOmksdHlwZTp0WzBdLnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnV9KX0scz1lPT57aWYoIWV8fDIhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRpbGUgcmVxdWlyZXMgMiBpbnB1dC4iKTtpZigxIT09ZVsxXS5kaW1zLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBzZWNvbmQgaW5wdXQgc2hhcGUgbXVzdCAxIGRpbWVuc2lvbi4iKTtpZihlWzFdLmRpbXNbMF0hPT1lWzBdLmRpbXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCBzaGFwZS4iKTtpZigtMT09PXIuTlVNQkVSX1RZUEVTLmluZGV4T2YoZVswXS50eXBlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKTtpZigiaW50MzIiIT09ZVsxXS50eXBlJiYiaW50MTYiIT09ZVsxXS50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCByZXBlYXQgdHlwZS4iKX07fSw1NzA3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5wYXJzZVRyYW5zcG9zZUF0dHJpYnV0ZXM9dC50cmFuc3Bvc2U9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNzI3MyksaT1uKDU2MzkpLHM9e25hbWU6IlRyYW5zcG9zZSIsaW5wdXROYW1lczpbIkEiXSxpbnB1dFR5cGVzOltpLlRleHR1cmVUeXBlLnVucGFja2VkXX07dC50cmFuc3Bvc2U9KGUsdCxuKT0+KHAodCksW2UucnVuKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7Y2FjaGVIaW50Om4uY2FjaGVLZXksZ2V0OigpPT5hKGUsdFswXSxuLnBlcm0pfSksdCldKSx0LnBhcnNlVHJhbnNwb3NlQXR0cmlidXRlcz1lPT4oMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtwZXJtOmUuYXR0cmlidXRlcy5nZXRJbnRzKCJwZXJtIixbXSl9KTtjb25zdCBhPShlLHQsbik9Pntjb25zdCByPXQuZGltcztuPXUocixuKTtjb25zdCBvPWwocixuKSxhPXIubGVuZ3RoLHA9YFxuICAgICAgJHtjKCJwZXJtIixuLGEpfVxuICAgICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske2F9XSkge1xuICAgICAgICBpbnQgYVske2F9XTtcbiAgICAgICAgcGVybShhLCBpbmRpY2VzKTtcbiAgICAgICAgcmV0dXJuIF9BKGEpO1xuICAgICAgfWA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7b3V0cHV0OntkaW1zOm8sdHlwZTp0LnR5cGUsdGV4dHVyZVR5cGU6aS5UZXh0dXJlVHlwZS51bnBhY2tlZH0sc2hhZGVyU291cmNlOnB9KX0sdT0oZSx0KT0+KHQmJnQubGVuZ3RoIT09ZS5sZW5ndGgmJih0PVsuLi5lLmtleXMoKV0ucmV2ZXJzZSgpKSx0KSxsPShlLHQpPT4odD11KGUsdCksby5TaGFwZVV0aWwuc29ydEJhc2VkT25QZXJtKGUsdCkpLGM9KGUsdCxuKT0+e2NvbnN0IHI9W107ci5wdXNoKGB2b2lkICR7ZX0ob3V0IGludCBhWyR7bn1dLCBpbnQgc3JjWyR7bn1dKSB7YCk7Zm9yKGxldCBlPTA7ZTxuOysrZSlyLnB1c2goYFx0YVske3RbZV19XT1zcmNbJHtlfV07YCk7cmV0dXJuIHIucHVzaCgiXHR9Iiksci5qb2luKCJcbiIpfSxwPWU9PntpZighZXx8MSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVHJhbnNwb3NlIHJlcXVpcmVzIDEgaW5wdXQuIik7aWYoImZsb2F0MzIiIT09ZVswXS50eXBlJiYiZmxvYXQ2NCIhPT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJpbnB1dCBzaG91bGQgYmUgZmxvYXQgdGVuc29yIil9O30sMjQ4ODooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZW5jb2RlQXNVaW50OD12b2lkIDA7Y29uc3Qgcj1uKDY3NTcpLG89big1NjM5KTt0LmVuY29kZUFzVWludDg9KGUsdCk9Pntjb25zdCBuPXQuc2hhcGUsaT0oMCwgci5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbikscz1gXG4gICAgY29uc3QgZmxvYXQgRkxPQVRfTUFYID0gMS43MDE0MTE4NGUzODtcbiAgICBjb25zdCBmbG9hdCBGTE9BVF9NSU4gPSAxLjE3NTQ5NDM1ZS0zODtcblxuICAgIGJvb2wgaXNOYU4oZmxvYXQgdmFsKSB7XG4gICAgICByZXR1cm4gKHZhbCA8IDEuMCB8fCAwLjAgPCB2YWwgfHwgdmFsID09IDAuMCkgPyBmYWxzZSA6IHRydWU7XG4gICAgfVxuXG4gICAgaGlnaHAgdmVjNCBlbmNvZGVBc1VpbnQ4KGhpZ2hwIGZsb2F0IHYpIHtcbiAgICAgIGlmIChpc05hTih2KSkge1xuICAgICAgICByZXR1cm4gdmVjNCgyNTUsIDI1NSwgMjU1LCAyNTUpO1xuICAgICAgfVxuXG4gICAgICBoaWdocCBmbG9hdCBhdiA9IGFicyh2KTtcblxuICAgICAgaWYoYXYgPCBGTE9BVF9NSU4pIHtcbiAgICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsIDAuMCwgMC4wKTtcbiAgICAgIH0gZWxzZSBpZih2ID4gRkxPQVRfTUFYKSB7XG4gICAgICAgIHJldHVybiB2ZWM0KDAuMCwgMC4wLCAxMjguMCwgMTI3LjApIC8gMjU1LjA7XG4gICAgICB9IGVsc2UgaWYodiA8IC1GTE9BVF9NQVgpIHtcbiAgICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsICAxMjguMCwgMjU1LjApIC8gMjU1LjA7XG4gICAgICB9XG5cbiAgICAgIGhpZ2hwIHZlYzQgYyA9IHZlYzQoMCwwLDAsMCk7XG5cbiAgICAgIGhpZ2hwIGZsb2F0IGUgPSBmbG9vcihsb2cyKGF2KSk7XG4gICAgICBoaWdocCBmbG9hdCBtID0gZXhwMihmcmFjdChsb2cyKGF2KSkpIC0gMS4wO1xuXG4gICAgICBjWzJdID0gZmxvb3IoMTI4LjAgKiBtKTtcbiAgICAgIG0gLT0gY1syXSAvIDEyOC4wO1xuICAgICAgY1sxXSA9IGZsb29yKDMyNzY4LjAgKiBtKTtcbiAgICAgIG0gLT0gY1sxXSAvIDMyNzY4LjA7XG4gICAgICBjWzBdID0gZmxvb3IoODM4ODYwOC4wICogbSk7XG5cbiAgICAgIGhpZ2hwIGZsb2F0IGViaWFzID0gZSArIDEyNy4wO1xuICAgICAgY1szXSA9IGZsb29yKGViaWFzIC8gMi4wKTtcbiAgICAgIGViaWFzIC09IGNbM10gKiAyLjA7XG4gICAgICBjWzJdICs9IGZsb29yKGViaWFzKSAqIDEyOC4wO1xuXG4gICAgICBjWzNdICs9IDEyOC4wICogc3RlcCgwLjAsIC12KTtcblxuICAgICAgcmV0dXJuIGMgLyAyNTUuMDtcbiAgICB9XG5cbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICBmbG9hdCB2YWx1ZSA9ICR7aS50ZXh0dXJlMkR9KFgsVGV4Q29vcmRzKS5yO1xuICAgICAgJHtpLm91dHB1dH0gPSBlbmNvZGVBc1VpbnQ4KHZhbHVlKTtcbiAgICB9YCxhPXtuYW1lOiJVaW50OEVuY29kZSIsaW5wdXRUeXBlczpbby5UZXh0dXJlVHlwZS51bnBhY2tlZF0saW5wdXROYW1lczpbIlgiXSxvdXRwdXQ6e2RpbXM6bix0eXBlOnQudGVuc29yLnR5cGUsdGV4dHVyZVR5cGU6by5UZXh0dXJlVHlwZS5kb3dubG9hZFVpbnQ4QXNGbG9hdH0sc2hhZGVyU291cmNlOnMsaGFzTWFpbjohMH07cmV0dXJuIGUuZXhlY3V0ZVByb2dyYW0oYSxbdC50ZW5zb3JdKX07fSw5MDg3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC50YW5oPXQudGFuPXQuc3FydD10LnNpbj10LnNpZ21vaWQ9dC5yZWx1PXQubm90PXQubmVnPXQubG9nPXQucGFyc2VMZWFreVJlbHVBdHRyaWJ1dGVzPXQubGVha3lSZWx1PXQuaWRlbnRpdHk9dC5mbG9vcj10LmV4cD10LnBhcnNlRWx1QXR0cmlidXRlcz10LmVsdT10LmNvcz10LmNlaWw9dC5jbGlwVjExPXQucGFyc2VDbGlwQXR0cmlidXRlcz10LmNsaXA9dC5hdGFuPXQuYXNpbj10LmFjb3M9dC5hYnM9dC5nbHNsVGFuaD10Lmdsc2xUYW49dC5nbHNsU3FydD10Lmdsc2xTaWdtb2lkPXQuZ2xzbFJlbHU9dC5nbHNsU2luPXQuZ2xzbE5vdD10Lmdsc2xOZWc9dC5nbHNsTG9nPXQuZ2xzbExlYWt5UmVsdT10Lmdsc2xJZGVudGl0eT10Lmdsc2xDbGlwPXQuZ2xzbEZsb29yPXQuZ2xzbEV4cD10Lmdsc2xFbHU9dC5nbHNsQ29zPXQuZ2xzbENlaWw9dC5nbHNsQXRhbj10Lmdsc2xBc2luPXQuZ2xzbEFjb3M9dC5nbHNsQWJzPXZvaWQgMDtjb25zdCByPW4oNDkxMCksbz1uKDcyNzMpLGk9bigxOTk3KSxzPW4oNjc1NyksYT1uKDU2MzkpO2Z1bmN0aW9uIHUoKXtyZXR1cm4gRSgiYWJzIil9ZnVuY3Rpb24gbCgpe3JldHVybiBFKCJhY29zIil9ZnVuY3Rpb24gYygpe3JldHVybiBFKCJhc2luIil9ZnVuY3Rpb24gcCgpe3JldHVybiBFKCJhdGFuIil9ZnVuY3Rpb24gZCgpe3JldHVybiBFKCJjZWlsIil9ZnVuY3Rpb24gZigpe3JldHVybiBFKCJjb3MiKX1mdW5jdGlvbiBoKGUpe2NvbnN0IHQ9ImVsdSI7cmV0dXJuIHtib2R5OmBcbiAgY29uc3QgZmxvYXQgYWxwaGEgPSBmbG9hdCgke2V9KTtcblxuICBmbG9hdCAke3R9XyhmbG9hdCBhKSB7XG4gICAgcmV0dXJuIGEgPj0gMC4wID8gYTogKGV4cChhKSAtIDEuMCkgKiBhbHBoYTtcbiAgfVxuICB2ZWM0ICR7dH1fKHZlYzQgdikge1xuICAgIHJldHVybiB2ZWM0KCR7dH1fKHYueCksICR7dH1fKHYueSksICR7dH1fKHYueiksICR7dH1fKHYudykpO1xuICB9XG4gIGAsbmFtZTp0LHR5cGU6aS5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gZygpe3JldHVybiBFKCJleHAiKX1mdW5jdGlvbiBiKCl7cmV0dXJuIEUoImZsb29yIil9ZnVuY3Rpb24gbShlLHQpe2NvbnN0IG49ImNsaXAiO3JldHVybiB7Ym9keTpgXG4gIGNvbnN0IGZsb2F0IG1pbiA9IGZsb2F0KCR7ZX0pO1xuICBjb25zdCBmbG9hdCBtYXggPSBmbG9hdCgke3R9KTtcblxuICBmbG9hdCAke259XyhmbG9hdCBhKSB7XG4gICAgcmV0dXJuIGNsYW1wKGEsIG1pbiwgbWF4KTtcbiAgfVxuICB2ZWM0ICR7bn1fKHZlYzQgdikge1xuICAgIHJldHVybiBjbGFtcCh2LCBtaW4sIG1heCk7XG4gIH1cbiAgYCxuYW1lOm4sdHlwZTppLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX1mdW5jdGlvbiB5KCl7Y29uc3QgZT0iaW5kZW50aXR5IjtyZXR1cm4ge2JvZHk6YFxuICBmbG9hdCAke2V9XyhmbG9hdCBhKSB7XG4gICAgcmV0dXJuIGE7XG4gIH1cbiAgdmVjNCAke2V9Xyh2ZWM0IHYpIHtcbiAgICByZXR1cm4gdjtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIHYoZSl7Y29uc3QgdD0ibGVha3lSZWx1IjtyZXR1cm4ge2JvZHk6YFxuICBjb25zdCBmbG9hdCBhbHBoYSA9IGZsb2F0KCR7ZX0pO1xuXG4gIGZsb2F0ICR7dH1fKGZsb2F0IGEpIHtcbiAgICByZXR1cm4gYSA8IDAuMCA/IGEgKiBhbHBoYSA6IGE7XG4gIH1cbiAgdmVjNCAke3R9Xyh2ZWM0IHYpIHtcbiAgICByZXR1cm4gdmVjNCgke3R9Xyh2LngpLCAke3R9Xyh2LnkpLCAke3R9Xyh2LnopLCAke3R9Xyh2LncpKTtcbiAgfVxuICBgLG5hbWU6dCx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIF8oKXtyZXR1cm4gRSgibG9nIil9ZnVuY3Rpb24gdygpe2NvbnN0IGU9Im5lZyI7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfV8oZmxvYXQgYSkge1xuICAgIHJldHVybiAtYTtcbiAgfVxuICB2ZWM0ICR7ZX1fKHZlYzQgdikge1xuICAgIHJldHVybiAtdjtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIFQoKXtjb25zdCBlPSJub3QiO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX1fKGZsb2F0IGEpIHtcbiAgICByZXR1cm4gZmxvYXQoICEgYm9vbChhKSApO1xuICB9XG4gIGJvb2wgJHtlfV8oYm9vbCBhKSB7XG4gICAgcmV0dXJuICFhO1xuICB9XG4gIHZlYzQgJHtlfV8odmVjNCB2KSB7XG4gICAgcmV0dXJuIHZlYzQoIWJvb2wodi54KSwgIWJvb2wodi55KSwgIWJvb2wodi56KSwgIWJvb2wodi53KSk7XG4gIH1cbiAgYnZlYzQgJHtlfV8oYnZlYzQgdikge1xuICAgIHJldHVybiBidmVjNCghdi54LCAhdi55LCAhdi56LCAhdi53KTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIHgoKXtyZXR1cm4gRSgic2luIil9ZnVuY3Rpb24gTygpe2NvbnN0IGU9InJlbHUiO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX1fKGZsb2F0IGEpIHtcbiAgICByZXR1cm4gbWF4KCBhLCAwLjAgKTtcbiAgfVxuICB2ZWM0ICR7ZX1fKHZlYzQgdikge1xuICAgIHJldHVybiBtYXgoIHYsIDAuMCApO1xuICB9XG4gIGAsbmFtZTplLHR5cGU6aS5GdW5jdGlvblR5cGUuVmFsdWVCYXNlZH19ZnVuY3Rpb24gUygpe2NvbnN0IGU9InNpZ21vaWQiO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX1fKGZsb2F0IGEpIHtcbiAgICByZXR1cm4gMS4wIC8gKDEuMCArIGV4cCgtYSkpO1xuICB9XG4gIHZlYzQgJHtlfV8odmVjNCB2KSB7XG4gICAgcmV0dXJuIDEuMCAvICgxLjAgKyBleHAoLXYpKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIEEoKXtyZXR1cm4gRSgic3FydCIpfWZ1bmN0aW9uIFAoKXtyZXR1cm4gRSgidGFuIil9ZnVuY3Rpb24gSSgpe2NvbnN0IGU9InRhbmgiO3JldHVybiB7Ym9keTpgXG4gIGZsb2F0ICR7ZX1fKGZsb2F0IGEpIHtcbiAgICBhID0gY2xhbXAoYSwgLTEwLiwgMTAuKTtcbiAgICBhID0gZXhwKDIuKmEpO1xuICAgIHJldHVybiAoYSAtIDEuKSAvIChhICsgMS4pO1xuICB9XG4gIHZlYzQgJHtlfV8odmVjNCB2KSB7XG4gICAgdiA9IGNsYW1wKHYsIC0xMC4sIDEwLik7XG4gICAgdiA9IGV4cCgyLip2KTtcbiAgICByZXR1cm4gKHYgLSAxLikgLyAodiArIDEuKTtcbiAgfVxuICBgLG5hbWU6ZSx0eXBlOmkuRnVuY3Rpb25UeXBlLlZhbHVlQmFzZWR9fWZ1bmN0aW9uIEUoZSl7cmV0dXJuIHtib2R5OmBcbiAgZmxvYXQgJHtlfV8oZmxvYXQgYSkge1xuICAgIHJldHVybiAke2V9KGEpO1xuICB9XG4gIHZlYzQgJHtlfV8odmVjNCB2KSB7XG4gICAgcmV0dXJuICR7ZX0odik7XG4gIH1cbiAgYCxuYW1lOmUsdHlwZTppLkZ1bmN0aW9uVHlwZS5WYWx1ZUJhc2VkfX10Lmdsc2xBYnM9dSx0Lmdsc2xBY29zPWwsdC5nbHNsQXNpbj1jLHQuZ2xzbEF0YW49cCx0Lmdsc2xDZWlsPWQsdC5nbHNsQ29zPWYsdC5nbHNsRWx1PWgsdC5nbHNsRXhwPWcsdC5nbHNsRmxvb3I9Yix0Lmdsc2xDbGlwPW0sdC5nbHNsSWRlbnRpdHk9eSx0Lmdsc2xMZWFreVJlbHU9dix0Lmdsc2xMb2c9Xyx0Lmdsc2xOZWc9dyx0Lmdsc2xOb3Q9VCx0Lmdsc2xTaW49eCx0Lmdsc2xSZWx1PU8sdC5nbHNsU2lnbW9pZD1TLHQuZ2xzbFNxcnQ9QSx0Lmdsc2xUYW49UCx0Lmdsc2xUYW5oPUk7Y29uc3QgRD0oZSx0LG4scik9Pntjb25zdCBvPWUuc2Vzc2lvbi5wYWNrP2EuVGV4dHVyZVR5cGUucGFja2VkOmEuVGV4dHVyZVR5cGUudW5wYWNrZWQsaT17bmFtZTpuLm5hbWUsaW5wdXRUeXBlczpbb10saW5wdXROYW1lczpbIkEiXSxjYWNoZUhpbnQ6cn07cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx7Z2V0OigpPT4oKGUsdCxuLHIpPT57Y29uc3Qgbz1lLnNlc3Npb24ucGFjaz9hLlRleHR1cmVUeXBlLnBhY2tlZDphLlRleHR1cmVUeXBlLnVucGFja2VkLGk9KDAsIHMuZ2V0R2xzbCkoZS5zZXNzaW9uLmJhY2tlbmQuZ2xDb250ZXh0LnZlcnNpb24pO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse291dHB1dDp7ZGltczpuLmRpbXMsdHlwZTpuLnR5cGUsdGV4dHVyZVR5cGU6b30sc2hhZGVyU291cmNlOmBcbiAgICAgJHtyLmJvZHl9XG4gICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICB2ZWM0IHYgPSAke2kudGV4dHVyZTJEfShBLCBUZXhDb29yZHMpO1xuICAgICAgIHYgPSAke3IubmFtZX1fKHYpO1xuICAgICAgICR7aS5vdXRwdXR9ID0gdjtcbiAgICAgfVxuICAgICBgLGhhc01haW46ITB9KX0pKGUsaSx0LG4pfSl9O3QuYWJzPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sdSgpKSx0KV0sdC5hY29zPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sbCgpKSx0KV0sdC5hc2luPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sYygpKSx0KV0sdC5hdGFuPShlLHQpPT5bZS5ydW4oRChlLHRbMF0scCgpKSx0KV0sdC5jbGlwPShlLHQsbik9PltlLnJ1bihEKGUsdFswXSxtKG4ubWluLG4ubWF4KSxuLmNhY2hlS2V5KSx0KV0sdC5wYXJzZUNsaXBBdHRyaWJ1dGVzPWU9PigwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe21pbjplLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoIm1pbiIsby5NSU5fQ0xJUCksbWF4OmUuYXR0cmlidXRlcy5nZXRGbG9hdCgibWF4IixvLk1BWF9DTElQKX0pLHQuY2xpcFYxMT0oZSxuKT0+e2NvbnN0IHI9JChlLG4pO3JldHVybiAoMCwgdC5jbGlwKShlLFtuWzBdXSxyKX07Y29uc3QgJD0oZSx0KT0+e2lmKHQubGVuZ3RoPj0zJiYoIWUuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbMV0uZGF0YUlkKXx8IWUuc2Vzc2lvbi5pc0luaXRpYWxpemVyKHRbMl0uZGF0YUlkKSkpdGhyb3cgbmV3IEVycm9yKCJkeW5hbWljIGNsaXAgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQiKTtjb25zdCBuPXQubGVuZ3RoPj0zP3RbMV0ubnVtYmVyRGF0YVswXTpvLk1JTl9DTElQLGk9dC5sZW5ndGg+PTM/dFsyXS5udW1iZXJEYXRhWzBdOm8uTUFYX0NMSVA7cmV0dXJuICgwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe21pbjpuLG1heDppfSl9O3QuY2VpbD0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLGQoKSksdCldLHQuY29zPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sZigpKSx0KV0sdC5lbHU9KGUsdCxuKT0+W2UucnVuKEQoZSx0WzBdLGgobi5hbHBoYSksbi5jYWNoZUtleSksdCldLHQucGFyc2VFbHVBdHRyaWJ1dGVzPWU9PigwLCByLmNyZWF0ZUF0dHJpYnV0ZVdpdGhDYWNoZUtleSkoe2FscGhhOmUuYXR0cmlidXRlcy5nZXRGbG9hdCgiYWxwaGEiLDEpfSksdC5leHA9KGUsdCk9PltlLnJ1bihEKGUsdFswXSxnKCkpLHQpXSx0LmZsb29yPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sYigpKSx0KV0sdC5pZGVudGl0eT0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLHkoKSksdCldLHQubGVha3lSZWx1PShlLHQsbik9PltlLnJ1bihEKGUsdFswXSx2KG4uYWxwaGEpLG4uY2FjaGVLZXkpLHQpXSx0LnBhcnNlTGVha3lSZWx1QXR0cmlidXRlcz1lPT4oMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHthbHBoYTplLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImFscGhhIiwuMDEpfSksdC5sb2c9KGUsdCk9PltlLnJ1bihEKGUsdFswXSxfKCkpLHQpXSx0Lm5lZz0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLHcoKSksdCldLHQubm90PShlLHQpPT5bZS5ydW4oRChlLHRbMF0sVCgpKSx0KV0sdC5yZWx1PShlLHQpPT5bZS5ydW4oRChlLHRbMF0sTygpKSx0KV0sdC5zaWdtb2lkPShlLHQpPT5bZS5ydW4oRChlLHRbMF0sUygpKSx0KV0sdC5zaW49KGUsdCk9PltlLnJ1bihEKGUsdFswXSx4KCkpLHQpXSx0LnNxcnQ9KGUsdCk9PltlLnJ1bihEKGUsdFswXSxBKCkpLHQpXSx0LnRhbj0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLFAoKSksdCldLHQudGFuaD0oZSx0KT0+W2UucnVuKEQoZSx0WzBdLEkoKSksdCldO30sNTQwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jcmVhdGVVbnBhY2tQcm9ncmFtSW5mb0xvYWRlcj10LmNyZWF0ZVVucGFja1Byb2dyYW1JbmZvPXZvaWQgMDtjb25zdCByPW4oNjc1Nyksbz1uKDU2MzkpLGk9big0MzIpLHM9big1NjE0KSxhPXtuYW1lOiJ1bnBhY2siLGlucHV0TmFtZXM6WyJBIl0saW5wdXRUeXBlczpbby5UZXh0dXJlVHlwZS5wYWNrZWRdfTt0LmNyZWF0ZVVucGFja1Byb2dyYW1JbmZvPShlLHQpPT57Y29uc3Qgbj10LmRpbXMubGVuZ3RoLHU9KDAsIHMuZ2V0Q2hhbm5lbHMpKCJyYyIsbiksbD11LnNsaWNlKC0yKSxjPSgwLCBpLmdldENvb3Jkc0RhdGFUeXBlKShuKSxwPSgwLCBzLnVucGFja0Zyb21DaGFubmVsKSgpLGQ9MD09PXQuZGltcy5sZW5ndGg/IiI6ZnVuY3Rpb24oZSx0KXtpZigxPT09ZSlyZXR1cm4gInJjIjtsZXQgbj0iIjtmb3IobGV0IHI9MDtyPGU7cisrKW4rPXRbcl0scjxlLTEmJihuKz0iLCIpO3JldHVybiBufShuLHUpLGY9bjw9MT8icmMiOmB2ZWMyKCR7bC5qb2luKCIsIil9KWAsaD1gXG4gICAgJHtwfVxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICR7Y30gcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgIC8vIFNhbXBsZSB0aGUgdGV4dHVyZSB3aXRoIHRoZSBjb29yZHMgdG8gZ2V0IHRoZSByZ2JhIGNoYW5uZWwgdmFsdWUuXG4gICAgICAgdmVjNCBwYWNrZWRJbnB1dCA9IGdldEEoJHtkfSk7XG5cbiAgICAgICAkeygwLCByLmdldEdsc2wpKGUuc2Vzc2lvbi5iYWNrZW5kLmdsQ29udGV4dC52ZXJzaW9uKS5vdXRwdXR9ID0gdmVjNChnZXRDaGFubmVsKHBhY2tlZElucHV0LCAke2Z9KSwgMCwgMCwgMCk7XG4gICAgIH1cbiAgIGA7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7aGFzTWFpbjohMCxvdXRwdXQ6e2RpbXM6dC5kaW1zLHR5cGU6dC50eXBlLHRleHR1cmVUeXBlOm8uVGV4dHVyZVR5cGUudW5wYWNrZWR9LHNoYWRlclNvdXJjZTpofSl9LHQuY3JlYXRlVW5wYWNrUHJvZ3JhbUluZm9Mb2FkZXI9KGUsbik9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7Z2V0OigpPT4oMCwgdC5jcmVhdGVVbnBhY2tQcm9ncmFtSW5mbykoZSxuKX0pO30sNzg2MjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQucGFyc2VVbnNxdWVlemVBdHRyaWJ1dGVzPXQudW5zcXVlZXplVjEzPXQudW5zcXVlZXplPXZvaWQgMDtjb25zdCByPW4oNzI3Myk7dC51bnNxdWVlemU9KGUsdCxuKT0+e28odCk7Y29uc3QgaT1yLlNoYXBlVXRpbC51bnNxdWVlemVTaGFwZSh0WzBdLmRpbXMsbik7cmV0dXJuIFtlLnJlc2hhcGVVbnBhY2tlZCh0WzBdLGkpXX0sdC51bnNxdWVlemVWMTM9KGUsbik9PihpKG4pLCgwLCB0LnVuc3F1ZWV6ZSkoZSxbblswXV0sQXJyYXkuZnJvbShuWzFdLmludGVnZXJEYXRhKSkpLHQucGFyc2VVbnNxdWVlemVBdHRyaWJ1dGVzPWU9PmUuYXR0cmlidXRlcy5nZXRJbnRzKCJheGVzIik7Y29uc3Qgbz1lPT57aWYoIWV8fDEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlVuc3F1ZWV6ZSByZXF1aXJlcyAxIGlucHV0LiIpO2lmKCJzdHJpbmciPT09ZVswXS50eXBlKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBpbnB1dCB0ZW5zb3IgdHlwZXMuIil9LGk9ZT0+e2lmKCFlfHwyIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJVbnNxdWVlemUgcmVxdWlyZXMgMiBpbnB1dHMuIik7aWYoImludDMyIiE9PWVbMV0udHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdHlwZS4iKX07fSwzOTgwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5zY2FsZXNWYWxpZGF0aW9uPXQudmFsaWRhdGVJbnB1dHM9dC5wYXJzZVVwc2FtcGxlQXR0cmlidXRlcz10LnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzVjk9dC5wYXJzZVVwc2FtcGxlQXR0cmlidXRlc1Y3PXQudXBzYW1wbGU9dm9pZCAwO2NvbnN0IHI9big0OTEwKSxvPW4oNjc1NyksaT1uKDU2MzkpLHM9e25hbWU6IlVwc2FtcGxlIixpbnB1dE5hbWVzOlsiWCJdLGlucHV0VHlwZXM6W2kuVGV4dHVyZVR5cGUudW5wYWNrZWRdfTt0LnVwc2FtcGxlPShlLG4scik9PigoMCwgdC52YWxpZGF0ZUlucHV0cykobixyKSxbZS5ydW4oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtjYWNoZUhpbnQ6ci5jYWNoZUtleSxnZXQ6KCk9PmEoZSxuLHIpfSksbildKSx0LnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzVjc9ZT0+KDAsIHQucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXMpKGUsNyksdC5wYXJzZVVwc2FtcGxlQXR0cmlidXRlc1Y5PWU9PigwLCB0LnBhcnNlVXBzYW1wbGVBdHRyaWJ1dGVzKShlLDkpLHQucGFyc2VVcHNhbXBsZUF0dHJpYnV0ZXM9KGUsbik9Pntjb25zdCBvPW4+PTEwLGk9ZS5hdHRyaWJ1dGVzLmdldFN0cmluZygibW9kZSIsIm5lYXJlc3QiKTtpZigibmVhcmVzdCIhPT1pJiYibGluZWFyIiE9PWkmJihuPDExfHwiY3ViaWMiIT09aSkpdGhyb3cgbmV3IEVycm9yKGB1bnJlY29nbml6ZWQgbW9kZTogJHtpfWApO2xldCBzPVtdO248OSYmKHM9ZS5hdHRyaWJ1dGVzLmdldEZsb2F0cygic2NhbGVzIiksKDAsIHQuc2NhbGVzVmFsaWRhdGlvbikocyxpLG8pKTtjb25zdCBhPWUuYXR0cmlidXRlcy5nZXRGbG9hdCgiZXh0cmFwb2xhdGlvbl92YWx1ZSIsMCksdT1uPjEwP2UuYXR0cmlidXRlcy5nZXRTdHJpbmcoImNvb3JkaW5hdGVfdHJhbnNmb3JtYXRpb25fbW9kZSIsImhhbGZfcGl4ZWwiKToiYXN5bW1ldHJpYyI7aWYoLTE9PT1bImFzeW1tZXRyaWMiLCJweXRvcmNoX2hhbGZfcGl4ZWwiLCJ0Zl9oYWxmX3BpeGVsX2Zvcl9ubiIsImFsaWduX2Nvcm5lcnMiLCJ0Zl9jcm9wX2FuZF9yZXNpemUiLCJoYWxmX3BpeGVsIl0uaW5kZXhPZih1KSl0aHJvdyBuZXcgRXJyb3IoYGNvb3JkaW5hdGVfdHJhbnNmb3JtX21vZGUgJyR7dX0nIGlzIG5vdCBzdXBwb3J0ZWRgKTtjb25zdCBsPSJ0Zl9jcm9wX2FuZF9yZXNpemUiPT09dSxjPWwscD0ibmVhcmVzdCI9PT1pJiZuPj0xMT9lLmF0dHJpYnV0ZXMuZ2V0U3RyaW5nKCJuZWFyZXN0X21vZGUiLCJyb3VuZF9wcmVmZXJfZmxvb3IiKToiIjtpZigtMT09PVsicm91bmRfcHJlZmVyX2Zsb29yIiwicm91bmRfcHJlZmVyX2NlaWwiLCJmbG9vciIsImNlaWwiLCIiXS5pbmRleE9mKHApKXRocm93IG5ldyBFcnJvcihgbmVhcmVzdF9tb2RlICcke3B9JyBpcyBub3Qgc3VwcG9ydGVkYCk7Y29uc3QgZD1lLmF0dHJpYnV0ZXMuZ2V0RmxvYXQoImN1YmljX2NvZWZmX2EiLC0uNzUpLGY9MCE9PWUuYXR0cmlidXRlcy5nZXRJbnQoImV4Y2x1ZGVfb3V0c2lkZSIsMCk7aWYoZiYmImN1YmljIiE9PWkpdGhyb3cgbmV3IEVycm9yKCJleGNsdWRlX291dHNpZGUgY2FuIGJlIHNldCB0byAxIG9ubHkgd2hlbiBtb2RlIGlzIENVQklDLiIpO2NvbnN0IGg9bjwxMXx8Im5lYXJlc3QiPT09aSYmImFzeW1tZXRyaWMiPT09dSYmImZsb29yIj09PXA7bGV0IGc9MCxiPTAsbT0wO3JldHVybiBuPjEwP2UuaW5wdXRzLmxlbmd0aD4yPyhnPTEsYj0yLG09Myk6KGI9MSxtPTIpOjk9PT1uJiYoYj0xKSwoMCwgci5jcmVhdGVBdHRyaWJ1dGVXaXRoQ2FjaGVLZXkpKHtvcHNldDpuLGlzUmVzaXplOm8sbW9kZTppLHNjYWxlczpzLGV4dHJhcG9sYXRpb25WYWx1ZTphLGNvb3JkaW5hdGVUcmFuc2Zvcm1Nb2RlOnUsdXNlRXh0cmFwb2xhdGlvbjpjLG5lZWRSb2lJbnB1dDpsLG5lYXJlc3RNb2RlOnAsY3ViaWNDb2VmZmljaWVudEE6ZCxleGNsdWRlT3V0c2lkZTpmLHVzZU5lYXJlc3QyeE9wdGltaXphdGlvbjpoLHJvaUlucHV0SWR4Omcsc2NhbGVzSW5wdXRJZHg6YixzaXplc0lucHV0SWR4Om19KX07Y29uc3QgYT0oZSx0LG4pPT57Y29uc3Qgcj0oMCwgby5nZXRHbHNsKShlLnNlc3Npb24uYmFja2VuZC5nbENvbnRleHQudmVyc2lvbiksW2EsdV09ZS5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQodFswXS5kaW1zLGkuVGV4dHVyZVR5cGUudW5wYWNrZWQpLGw9dFswXS5kaW1zLm1hcCgoKGUsdCk9Pk1hdGguZmxvb3IoZSpuLnNjYWxlc1t0XSkpKSxbYyxwXT1lLmNhbGN1bGF0ZVRleHR1cmVXaWR0aEFuZEhlaWdodChsLGkuVGV4dHVyZVR5cGUudW5wYWNrZWQpLGQ9bC5sZW5ndGgsZj1uZXcgQXJyYXkoZCksaD1uZXcgQXJyYXkoZCk7bGV0IGc9YFxuICAgICAgaW50IG91dHB1dF9waXRjaGVzWyR7ZH1dO1xuICAgICAgaW50IGlucHV0X3BpdGNoZXNbJHtkfV07XG4gICAgICBgO2ZvcihsZXQgZT1kLTE7ZT49MDtlLS0pZltlXT1lPT09ZC0xPzE6ZltlKzFdKmxbZSsxXSxoW2VdPWU9PT1kLTE/MTpoW2UrMV0qdFswXS5kaW1zW2UrMV0sZys9YFxuICAgICAgICBvdXRwdXRfcGl0Y2hlc1ske2V9XSA9ICR7ZltlXX07XG4gICAgICAgIGlucHV0X3BpdGNoZXNbJHtlfV0gPSAke2hbZV19O1xuICAgICAgICBgO2NvbnN0IGI9YFxuICAgICAgZmxvYXQgZ2V0SW5wdXRGbG9hdChpbnQgaW5kZXgpIHtcbiAgICAgICAgdmVjMiBjb29yZHMgPSBvZmZzZXRUb0Nvb3JkcyhpbmRleCwgJHthfSwgJHt1fSk7XG4gICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0Q29sb3JBc0Zsb2F0KCR7ci50ZXh0dXJlMkR9KFgsIGNvb3JkcykpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBgLG09Im5lYXJlc3QiPT09bi5tb2RlP2BcbiAgICAke2J9XG4gICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1ske2R9XSkge1xuICAgICAgaW50IGlucHV0X2luZGV4ID0gMDtcbiAgICAgIGludCBvdXRwdXRfaW5kZXggPSBjb29yZHNUb09mZnNldChUZXhDb29yZHMsICR7Y30sICR7cH0pO1xuXG4gICAgICAke2d9XG5cbiAgICAgIGludCBkLCBtO1xuICAgICAgZm9yIChpbnQgZGltID0gMDsgZGltIDwgJHtkfTsgKytkaW0pIHtcbiAgICAgICAgZCA9IG91dHB1dF9pbmRleCAvIG91dHB1dF9waXRjaGVzW2RpbV07XG4gICAgICAgIG0gPSBvdXRwdXRfaW5kZXggLSBkICogb3V0cHV0X3BpdGNoZXNbZGltXTtcbiAgICAgICAgb3V0cHV0X2luZGV4ID0gbTtcblxuICAgICAgICBpZiAoc2NhbGVzW2RpbV0gIT0gMSAmJiBkID4gMCkge1xuICAgICAgICAgIGludCBkMiA9IGQgLyBzY2FsZXNbZGltXTtcbiAgICAgICAgICBtID0gZCAtIGQyICogc2NhbGVzW2RpbV07XG4gICAgICAgICAgZCA9IGQyO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0X2luZGV4ICs9IGlucHV0X3BpdGNoZXNbZGltXSAqIGQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4KTtcbiAgICB9YDo0PT09ZD9gXG4gICAgJHtifVxuICAgIGZsb2F0IHByb2Nlc3MoaW50IGluZGljZXNbNF0pIHtcbiAgICAgIGludCBpbnB1dF9pbmRleCA9IDA7XG4gICAgICBpbnQgb3V0cHV0X2luZGV4ID0gY29vcmRzVG9PZmZzZXQoVGV4Q29vcmRzLCAke2N9LCAke3B9KTtcblxuICAgICAgJHtnfVxuXG4gICAgICBpbnQgbTtcbiAgICAgIGludCBpbmRleF9vZl9kaW0wLCBpbmRleF9vZl9kaW0xLCBpbmRleF9vZl9kaW0yLCBpbmRleF9vZl9kaW0zO1xuICAgICAgaW5kZXhfb2ZfZGltMCA9IG91dHB1dF9pbmRleCAvIG91dHB1dF9waXRjaGVzWzBdO1xuICAgICAgbSA9IG91dHB1dF9pbmRleCAtIGluZGV4X29mX2RpbTAgKiBvdXRwdXRfcGl0Y2hlc1swXTtcbiAgICAgIGluZGV4X29mX2RpbTEgPSBtIC8gb3V0cHV0X3BpdGNoZXNbMV07XG4gICAgICBtID0gbSAtIGluZGV4X29mX2RpbTEgKiBvdXRwdXRfcGl0Y2hlc1sxXTtcbiAgICAgIGluZGV4X29mX2RpbTIgPSBtIC8gb3V0cHV0X3BpdGNoZXNbMl07XG4gICAgICBtID0gbSAtIGluZGV4X29mX2RpbTIgKiBvdXRwdXRfcGl0Y2hlc1syXTtcbiAgICAgIGluZGV4X29mX2RpbTMgPSBtO1xuXG4gICAgICBpbnQgaW5kZXhfb2ZfaW5wdXRfZGltMiwgaW5kZXhfb2ZfaW5wdXRfZGltMywgeF9vZmZzZXQsIHlfb2Zmc2V0O1xuICAgICAgaW5kZXhfb2ZfaW5wdXRfZGltMiA9IGluZGV4X29mX2RpbTIgLyBzY2FsZXNbMl07XG4gICAgICB5X29mZnNldCA9IGluZGV4X29mX2RpbTIgLSBpbmRleF9vZl9pbnB1dF9kaW0yICogc2NhbGVzWzJdO1xuICAgICAgaW5kZXhfb2ZfaW5wdXRfZGltMyA9IGluZGV4X29mX2RpbTMgLyBzY2FsZXNbM107XG4gICAgICB4X29mZnNldCA9IGluZGV4X29mX2RpbTMgLSBpbmRleF9vZl9pbnB1dF9kaW0zICogc2NhbGVzWzNdO1xuXG4gICAgICBpbnB1dF9pbmRleCA9IGluZGV4X29mX2RpbTAgKiBpbnB1dF9waXRjaGVzWzBdICtcbiAgICAgICAgICAgIGluZGV4X29mX2RpbTEgKiBpbnB1dF9waXRjaGVzWzFdICtcbiAgICAgICAgICAgIGluZGV4X29mX2lucHV0X2RpbTIgKiBpbnB1dF9waXRjaGVzWzJdICtcbiAgICAgICAgICAgIGluZGV4X29mX2lucHV0X2RpbTM7XG5cbiAgICAgIGZsb2F0IHgwMCA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXgpO1xuICAgICAgZmxvYXQgeDEwLCB4MDEsIHgxMTtcblxuICAgICAgYm9vbCBlbmRfb2ZfZGltMiA9IGZhbHNlO1xuICAgICAgaWYgKGluZGV4X29mX2lucHV0X2RpbTIgPT0gKCR7dFswXS5kaW1zWzJdfSAtIDEpKSB7XG4gICAgICAgIC8vIEl0J3MgdGhlIGVuZCBpbiBkaW1lbnNpb24gMlxuICAgICAgICB4MDEgPSB4MDA7XG4gICAgICAgIGVuZF9vZl9kaW0yID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHgwMSA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXggKyBpbnB1dF9waXRjaGVzWzJdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluZGV4X29mX2lucHV0X2RpbTMgPT0gKGlucHV0X3BpdGNoZXNbMl0gLSAxKSkge1xuICAgICAgICAvLyBJdCdzIHRoZSBlbmQgaW4gZGltZW5zaW9uIDNcbiAgICAgICAgeDEwID0geDAwO1xuICAgICAgICB4MTEgPSB4MDE7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgeDEwID0gZ2V0SW5wdXRGbG9hdChpbnB1dF9pbmRleCArIDEpO1xuICAgICAgICB4MTEgPSBlbmRfb2ZfZGltMiA/IHgxMCA6IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXggKyBpbnB1dF9waXRjaGVzWzJdICsgMSk7XG4gICAgICB9XG5cbiAgICAgIGZsb2F0IHkwID0geDAwICsgZmxvYXQoeV9vZmZzZXQpICogKHgwMSAtIHgwMCkgLyBmbG9hdChzY2FsZXNbMl0pO1xuICAgICAgZmxvYXQgeTEgPSB4MTAgKyBmbG9hdCh5X29mZnNldCkgKiAoeDExIC0geDEwKSAvIGZsb2F0KHNjYWxlc1syXSk7XG4gICAgICByZXR1cm4geTAgKyBmbG9hdCh4X29mZnNldCkgKiAoeTEgLSB5MCkgLyBmbG9hdChzY2FsZXNbM10pO1xuICAgIH1gOmBcbiAgICAke2J9XG4gICAgZmxvYXQgcHJvY2VzcyhpbnQgaW5kaWNlc1syXSkge1xuICAgICAgaW50IGlucHV0X2luZGV4ID0gMDtcbiAgICAgIGludCBvdXRwdXRfaW5kZXggPSBjb29yZHNUb09mZnNldChUZXhDb29yZHMsICR7Y30sICR7cH0pO1xuXG4gICAgICAke2d9XG5cbiAgICAgIGludCBtO1xuICAgICAgaW50IGluZGV4X29mX2RpbTAsIGluZGV4X29mX2RpbTE7XG4gICAgICBpbmRleF9vZl9kaW0wID0gb3V0cHV0X2luZGV4IC8gb3V0cHV0X3BpdGNoZXNbMF07XG4gICAgICBtID0gb3V0cHV0X2luZGV4IC0gaW5kZXhfb2ZfZGltMCAqIG91dHB1dF9waXRjaGVzWzBdO1xuICAgICAgaW5kZXhfb2ZfZGltMSA9IG07XG5cbiAgICAgIGludCBpbmRleF9vZl9pbnB1dF9kaW0wLCBpbmRleF9vZl9pbnB1dF9kaW0xLCB4X29mZnNldCwgeV9vZmZzZXQ7XG4gICAgICBpbmRleF9vZl9pbnB1dF9kaW0wID0gaW5kZXhfb2ZfZGltMCAvIHNjYWxlc1swXTtcbiAgICAgIHlfb2Zmc2V0ID0gaW5kZXhfb2ZfZGltMCAtIGluZGV4X29mX2lucHV0X2RpbTAgKiBzY2FsZXNbMF07XG4gICAgICBpbmRleF9vZl9pbnB1dF9kaW0xID0gaW5kZXhfb2ZfZGltMSAvIHNjYWxlc1sxXTtcbiAgICAgIHhfb2Zmc2V0ID0gaW5kZXhfb2ZfZGltMSAtIGluZGV4X29mX2lucHV0X2RpbTEgKiBzY2FsZXNbMV07XG5cbiAgICAgIGlucHV0X2luZGV4ID0gaW5kZXhfb2ZfaW5wdXRfZGltMCAqIGlucHV0X3BpdGNoZXNbMF0gKyBpbmRleF9vZl9pbnB1dF9kaW0xO1xuXG4gICAgICBmbG9hdCB4MDAgPSBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4KTtcbiAgICAgIGZsb2F0IHgxMCwgeDAxLCB4MTE7XG5cbiAgICAgIGJvb2wgZW5kX29mX2RpbTAgPSBmYWxzZTtcbiAgICAgIGlmIChpbmRleF9vZl9pbnB1dF9kaW0wID09ICgke3RbMF0uZGltc1swXX0gLSAxKSkge1xuICAgICAgICAvLyBJdCdzIHRoZSBlbmQgaW4gZGltZW5zaW9uIDBcbiAgICAgICAgeDAxID0geDAwO1xuICAgICAgICBlbmRfb2ZfZGltMCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4MDEgPSBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4ICsgaW5wdXRfcGl0Y2hlc1swXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbmRleF9vZl9pbnB1dF9kaW0xID09IChpbnB1dF9waXRjaGVzWzBdIC0gMSkpIHtcbiAgICAgICAgLy8gSXQncyB0aGUgZW5kIGluIGRpbWVuc2lvbiAxXG4gICAgICAgIHgxMCA9IHgwMDtcbiAgICAgICAgeDExID0geDAxO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHgxMCA9IGdldElucHV0RmxvYXQoaW5wdXRfaW5kZXggKyAxKTtcbiAgICAgICAgeDExID0gZW5kX29mX2RpbTAgPyB4MTAgOiBnZXRJbnB1dEZsb2F0KGlucHV0X2luZGV4ICsgaW5wdXRfcGl0Y2hlc1swXSArIDEpO1xuICAgICAgfVxuXG4gICAgICBmbG9hdCB5MCA9IHgwMCArIGZsb2F0KHlfb2Zmc2V0KSAqICh4MDEgLSB4MDApIC8gZmxvYXQoc2NhbGVzWzBdKTtcbiAgICAgIGZsb2F0IHkxID0geDEwICsgZmxvYXQoeV9vZmZzZXQpICogKHgxMSAtIHgxMCkgLyBmbG9hdChzY2FsZXNbMF0pO1xuICAgICAgcmV0dXJuIHkwICsgZmxvYXQoeF9vZmZzZXQpICogKHkxIC0geTApIC8gZmxvYXQoc2NhbGVzWzFdKTtcbiAgICB9YDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtvdXRwdXQ6e2RpbXM6bCx0eXBlOnRbMF0udHlwZSx0ZXh0dXJlVHlwZTppLlRleHR1cmVUeXBlLnVucGFja2VkfSxzaGFkZXJTb3VyY2U6bSx2YXJpYWJsZXM6W3tuYW1lOiJzY2FsZXMiLHR5cGU6ImludCIsYXJyYXlMZW5ndGg6bi5zY2FsZXMubGVuZ3RoLGRhdGE6bi5zY2FsZXMubWFwKChlPT5NYXRoLmNlaWwoZSkpKX1dfSl9O3QudmFsaWRhdGVJbnB1dHM9KGUsdCk9PntpZighZXx8dC5vcHNldDw5JiYxIT09ZS5sZW5ndGh8fHQub3BzZXQ+PTkmJnQub3BzZXQ8MTEmJjIhPT1lLmxlbmd0aHx8dC5vcHNldD49MTEmJmUubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGlucHV0cy4iKTtpZih0LnNjYWxlcy5sZW5ndGg+MCYmZVswXS5kaW1zLmxlbmd0aCE9PXQuc2NhbGVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgc2hhcGUuIik7aWYoInN0cmluZyI9PT1lWzBdLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRlbnNvciB0eXBlcy4iKX0sdC5zY2FsZXNWYWxpZGF0aW9uPShlLHQsbik9PntpZihuKXtmb3IoY29uc3QgdCBvZiBlKWlmKHQ8PTApdGhyb3cgbmV3IEVycm9yKCJTY2FsZSB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAuIil9ZWxzZSBmb3IoY29uc3QgdCBvZiBlKWlmKHQ8MSl0aHJvdyBuZXcgRXJyb3IoIlNjYWxlIHZhbHVlIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4iKTtpZighKCJsaW5lYXIiIT09dCYmImN1YmljIiE9PXR8fDI9PT1lLmxlbmd0aHx8ND09PWUubGVuZ3RoJiYxPT09ZVswXSYmMT09PWVbMV0pKXRocm93IG5ldyBFcnJvcihgJ0xpbmVhcicgbW9kZSBhbmQgJ0N1YmljJyBtb2RlIG9ubHkgc3VwcG9ydCAyLUQgaW5wdXRzICgnQmlsaW5lYXInLCAnQmljdWJpYycpICAgICAgICAgb3IgNC1EIGlucHV0cyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG91dGVybW9zdCAyIHNjYWxlIHZhbHVlcyBiZWluZyAxICAgICAgICAgaW4gdGhlICR7bj8iUmVzaXplIjoiVXBzYW1wbGUifSBvcGVhcnRvci5gKX07fSwyNzU3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Qcm9ncmFtTWFuYWdlcj12b2lkIDA7Y29uc3Qgcj1uKDIyMzUpLG89bigxMzE1KSxpPW4oODg5Nykscz1uKDY3NTcpO3QuUHJvZ3JhbU1hbmFnZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMucHJvZmlsZXI9ZSx0aGlzLmdsQ29udGV4dD10LHRoaXMudGV4dHVyZUxheW91dFN0cmF0ZWd5PW4sdGhpcy5yZXBvPW5ldyBNYXAsdGhpcy5hdHRyaWJ1dGVzQm91bmQ9ITE7fWdldEFydGlmYWN0KGUpe3JldHVybiB0aGlzLnJlcG8uZ2V0KGUpfXNldEFydGlmYWN0KGUsdCl7dGhpcy5yZXBvLnNldChlLHQpO31ydW4oZSx0LG4pe3ZhciByO3RoaXMucHJvZmlsZXIuZXZlbnQoIm9wIixgUHJvZ3JhbU1hbmFnZXIucnVuICR7bnVsbCE9PShyPWUucHJvZ3JhbUluZm8ubmFtZSkmJnZvaWQgMCE9PXI/cjoidW5rbm93biBrZXJuZWwifWAsKCgpPT57dmFyIHI7Y29uc3QgaT10aGlzLmdsQ29udGV4dC5nbCxzPWUucHJvZ3JhbTtpLnVzZVByb2dyYW0ocyk7dHJ5e3RoaXMuYmluZE91dHB1dChuKSx0aGlzLmF0dHJpYnV0ZXNCb3VuZHx8dGhpcy5iaW5kQXR0cmlidXRlcyhlLmF0dHJpYkxvY2F0aW9ucyksdGhpcy5iaW5kVW5pZm9ybXMoZS51bmlmb3JtTG9jYXRpb25zLG51bGwhPT0ocj1lLnByb2dyYW1JbmZvLnZhcmlhYmxlcykmJnZvaWQgMCE9PXI/cjpbXSx0KTt9Y2F0Y2godCl7dGhyb3cgby5Mb2dnZXIuZXJyb3IoIlByb2dyYW1NYW5hZ2VyIixlLnByb2dyYW1JbmZvLnNoYWRlclNvdXJjZSksdH10aGlzLnByb2ZpbGVyLmV2ZW50KCJiYWNrZW5kIiwiR2xDb250ZXh0LmRyYXcoKSIsKCgpPT57dGhpcy5nbENvbnRleHQuZHJhdygpO30pKTt9KSx0aGlzLmdsQ29udGV4dCk7fWRpc3Bvc2UoKXt0aGlzLnZlcnRleFNoYWRlciYmdGhpcy5nbENvbnRleHQuZGVsZXRlU2hhZGVyKHRoaXMudmVydGV4U2hhZGVyKSx0aGlzLnJlcG8uZm9yRWFjaCgoZT0+dGhpcy5nbENvbnRleHQuZGVsZXRlUHJvZ3JhbShlLnByb2dyYW0pKSk7fWJ1aWxkKGUsdCxuKXtyZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgiYmFja2VuZCIsIlByb2dyYW1NYW5hZ2VyLmJ1aWxkIiwoKCk9Pntjb25zdCByPW5ldyBpLkdsc2xQcmVwcm9jZXNzb3IodGhpcy5nbENvbnRleHQsZSx0LG4pLG89ci5wcmVwcm9jZXNzKCkscz10aGlzLmNvbXBpbGUobyk7cmV0dXJuIHtwcm9ncmFtSW5mbzplLHByb2dyYW06cyx1bmlmb3JtTG9jYXRpb25zOnRoaXMuZ2V0VW5pZm9ybUxvY2F0aW9ucyhzLHIuY29udGV4dC5wcm9ncmFtSW5mby5pbnB1dE5hbWVzLHIuY29udGV4dC5wcm9ncmFtSW5mby52YXJpYWJsZXMpLGF0dHJpYkxvY2F0aW9uczp0aGlzLmdldEF0dHJpYkxvY2F0aW9ucyhzKX19KSl9Y29tcGlsZShlKXtpZighdGhpcy52ZXJ0ZXhTaGFkZXIpe28uTG9nZ2VyLnZlcmJvc2UoIlByb3JncmFtTWFuYWdlciIsIkNvbXBpbGluZyBhbmQgY2FjaGluZyBWZXJ0ZXggc2hhZGVyIGZvciB0aGUgZmlyc3QgdGltZSIpO2NvbnN0IGU9KDAsIHMuZ2V0VmVydGV4U2hhZGVyU291cmNlKSh0aGlzLmdsQ29udGV4dC52ZXJzaW9uKTt0aGlzLnZlcnRleFNoYWRlcj10aGlzLmdsQ29udGV4dC5jb21waWxlU2hhZGVyKGUsdGhpcy5nbENvbnRleHQuZ2wuVkVSVEVYX1NIQURFUik7fXIuZW52LmRlYnVnJiZvLkxvZ2dlci52ZXJib3NlKCJQcm9yZ3JhbU1hbmFnZXIiLGBGcmFnU2hhZGVyOlxuJHtlfVxuYCk7Y29uc3QgdD10aGlzLmdsQ29udGV4dC5jb21waWxlU2hhZGVyKGUsdGhpcy5nbENvbnRleHQuZ2wuRlJBR01FTlRfU0hBREVSKSxuPXRoaXMuZ2xDb250ZXh0LmNyZWF0ZVByb2dyYW0odGhpcy52ZXJ0ZXhTaGFkZXIsdCk7cmV0dXJuIHRoaXMuZ2xDb250ZXh0LmRlbGV0ZVNoYWRlcih0KSxufWJpbmRPdXRwdXQoZSl7Y29uc3QgdD1lLndpZHRoLG49ZS5oZWlnaHQ7by5Mb2dnZXIudmVyYm9zZSgiUHJvcmdyYW1NYW5hZ2VyIixgQmluZGluZyBvdXRwdXQgdGV4dHVyZSB0byBGcmFtZWJ1ZmZlcjogdy9oPSR7dH0vJHtufSwgc2hhcGU9JHtlLnNoYXBlfSwgdHlwZT0ke2UudGVuc29yLnR5cGV9YCksdGhpcy5nbENvbnRleHQuYXR0YWNoRnJhbWVidWZmZXIoZS50ZXh0dXJlLHQsbik7fWJpbmRBdHRyaWJ1dGVzKGUpe2NvbnN0IHQ9ZS5wb3NpdGlvbixuPWUudGV4dHVyZUNvb3JkO3RoaXMuZ2xDb250ZXh0LnNldFZlcnRleEF0dHJpYnV0ZXModCxuKSx0aGlzLmF0dHJpYnV0ZXNCb3VuZD0hMDt9YmluZFVuaWZvcm1zKGUsdCxuKXt2YXIgcjtjb25zdCBvPXRoaXMuZ2xDb250ZXh0LmdsO2xldCBpPTA7Zm9yKGNvbnN0e25hbWU6cyx0eXBlOmEsbG9jYXRpb246dSxhcnJheUxlbmd0aDpsfW9mIGUpe2NvbnN0IGU9bnVsbD09PShyPXQuZmluZCgoZT0+ZS5uYW1lPT09cykpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5kYXRhO2lmKCJzYW1wbGVyMkQiIT09YSYmIWUpdGhyb3cgbmV3IEVycm9yKGB2YXJpYWJsZSAnJHtzfScgZG9lcyBub3QgaGF2ZSBkYXRhIGRlZmluZWQgaW4gcHJvZ3JhbSBpbmZvYCk7c3dpdGNoKGEpe2Nhc2Uic2FtcGxlcjJEIjp0aGlzLmJpbmRUZXh0dXJlKG5baV0sdSxpKSxpKys7YnJlYWs7Y2FzZSJmbG9hdCI6bD9vLnVuaWZvcm0xZnYodSxlKTpvLnVuaWZvcm0xZih1LGUpO2JyZWFrO2Nhc2UiaW50IjpsP28udW5pZm9ybTFpdih1LGUpOm8udW5pZm9ybTFpKHUsZSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuaWZvcm0gbm90IGltcGxlbWVudGVkOiAke2F9YCl9fX1iaW5kVGV4dHVyZShlLHQsbil7dGhpcy5nbENvbnRleHQuYmluZFRleHR1cmVUb1VuaWZvcm0oZS50ZXh0dXJlLG4sdCk7fWdldEF0dHJpYkxvY2F0aW9ucyhlKXtyZXR1cm4ge3Bvc2l0aW9uOnRoaXMuZ2V0QXR0cmliTG9jYXRpb24oZSwicG9zaXRpb24iKSx0ZXh0dXJlQ29vcmQ6dGhpcy5nZXRBdHRyaWJMb2NhdGlvbihlLCJ0ZXh0dXJlQ29vcmQiKX19Z2V0VW5pZm9ybUxvY2F0aW9ucyhlLHQsbil7Y29uc3Qgcj1bXTtpZih0KWZvcihjb25zdCBuIG9mIHQpci5wdXNoKHtuYW1lOm4sdHlwZToic2FtcGxlcjJEIixsb2NhdGlvbjp0aGlzLmdldFVuaWZvcm1Mb2NhdGlvbihlLG4pfSk7aWYobilmb3IoY29uc3QgdCBvZiBuKXIucHVzaChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2xvY2F0aW9uOnRoaXMuZ2V0VW5pZm9ybUxvY2F0aW9uKGUsdC5uYW1lKX0pKTtyZXR1cm4gcn1nZXRVbmlmb3JtTG9jYXRpb24oZSx0KXtjb25zdCBuPXRoaXMuZ2xDb250ZXh0LmdsLmdldFVuaWZvcm1Mb2NhdGlvbihlLHQpO2lmKG51bGw9PT1uKXRocm93IG5ldyBFcnJvcihgVW5pZm9ybSAke3R9IG5vdCBmb3VuZC5gKTtyZXR1cm4gbn1nZXRBdHRyaWJMb2NhdGlvbihlLHQpe3JldHVybiB0aGlzLmdsQ29udGV4dC5nbC5nZXRBdHRyaWJMb2NhdGlvbihlLHQpfX07fSwyMTcxOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5XZWJHTFNlc3Npb25IYW5kbGVyPXZvaWQgMDtjb25zdCByPW4oMTMxNSksbz1uKDU4ODEpLGk9big3ODYwKSxzPW4oNDExMCksYT1uKDI3NTcpLHU9big3NjE4KSxsPW4oNTI0Myk7dC5XZWJHTFNlc3Npb25IYW5kbGVyPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5iYWNrZW5kPWUsdGhpcy5jb250ZXh0PXQsdGhpcy5sYXlvdXRTdHJhdGVneT1uZXcgdS5QcmVmZXJMb2dpY2FsU3RyYXRlZ3koZS5nbENvbnRleHQubWF4VGV4dHVyZVNpemUpLHRoaXMucHJvZ3JhbU1hbmFnZXI9bmV3IGEuUHJvZ3JhbU1hbmFnZXIodGhpcy5jb250ZXh0LnByb2ZpbGVyLGUuZ2xDb250ZXh0LHRoaXMubGF5b3V0U3RyYXRlZ3kpLHRoaXMudGV4dHVyZU1hbmFnZXI9bmV3IGwuVGV4dHVyZU1hbmFnZXIoZS5nbENvbnRleHQsdGhpcy5sYXlvdXRTdHJhdGVneSx0aGlzLmNvbnRleHQucHJvZmlsZXIse3JldXNlVGV4dHVyZXM6ImZ1bGwiPT09ZS50ZXh0dXJlQ2FjaGVNb2RlfSksdGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlPW5ldyBNYXAsdGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcCx0aGlzLnBhY2s9ZS5wYWNrLHRoaXMucGFjazJ1bnBhY2tNYXA9bmV3IE1hcCx0aGlzLnVucGFjazJwYWNrTWFwPW5ldyBNYXA7fWNyZWF0ZUluZmVyZW5jZUhhbmRsZXIoKXtyZXR1cm4gbmV3IGkuV2ViR0xJbmZlcmVuY2VIYW5kbGVyKHRoaXMpfW9uR3JhcGhJbml0aWFsaXplZChlKXtjb25zdCB0PWUuZ2V0VmFsdWVzKCkuZmlsdGVyKChlPT4tMT09PWUuZnJvbSYmZS50ZW5zb3IpKS5tYXAoKGU9PmUudGVuc29yLmRhdGFJZCkpO3RoaXMuaW5pdGlhbGl6ZXJzPW5ldyBTZXQodCk7fWlzSW5pdGlhbGl6ZXIoZSl7cmV0dXJuICEhdGhpcy5pbml0aWFsaXplcnMmJnRoaXMuaW5pdGlhbGl6ZXJzLmhhcyhlKX1hZGRJbml0aWFsaXplcihlKXt0aGlzLmluaXRpYWxpemVycy5hZGQoZSk7fWdldFRleHR1cmVEYXRhKGUsdCl7cmV0dXJuIHQ/dGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmdldChlKTp0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZS5nZXQoZSl9c2V0VGV4dHVyZURhdGEoZSx0LG49ITEpe3IuTG9nZ2VyLnZlcmJvc2UoIldlYkdMU2Vzc2lvbkhhbmRsZXIiLCJTdG9yaW5nIFRleHR1cmUgZGF0YSBpbiBjYWNoZSIpLG4/dGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLnNldChlLHQpOnRoaXMudW5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLnNldChlLHQpO31kaXNwb3NlKCl7dGhpcy5wcm9ncmFtTWFuYWdlci5kaXNwb3NlKCksdGhpcy50ZXh0dXJlTWFuYWdlci5jbGVhckFjdGl2ZVRleHR1cmVzKCksdGhpcy5wYWNrZWRUZXh0dXJlRGF0YUNhY2hlLmZvckVhY2goKGU9PnRoaXMudGV4dHVyZU1hbmFnZXIucmVsZWFzZVRleHR1cmUoZSwhMCkpKSx0aGlzLnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcCx0aGlzLnVucGFja2VkVGV4dHVyZURhdGFDYWNoZS5mb3JFYWNoKChlPT50aGlzLnRleHR1cmVNYW5hZ2VyLnJlbGVhc2VUZXh0dXJlKGUsITApKSksdGhpcy51bnBhY2tlZFRleHR1cmVEYXRhQ2FjaGU9bmV3IE1hcDt9cmVzb2x2ZShlLHQsbil7Y29uc3Qgcj0oMCwgby5yZXNvbHZlT3BlcmF0b3IpKGUsdCxzLldFQkdMX09QX1JFU09MVkVfUlVMRVMpO3JldHVybiB7aW1wbDpyLm9wSW1wbCxjb250ZXh0OnIub3BJbml0P3Iub3BJbml0KGUsbik6ZX19fTt9LDk2MjI6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlVpbnQ4RGF0YUVuY29kZXI9dC5SR0JBRmxvYXREYXRhRW5jb2Rlcj10LlJlZEZsb2F0MzJEYXRhRW5jb2Rlcj12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpO3QuUmVkRmxvYXQzMkRhdGFFbmNvZGVyPWNsYXNze2NvbnN0cnVjdG9yKGUsdD0xKXtpZigxPT09dCl0aGlzLmludGVybmFsRm9ybWF0PWUuUjMyRix0aGlzLmZvcm1hdD1lLlJFRCx0aGlzLnRleHR1cmVUeXBlPWUuRkxPQVQsdGhpcy5jaGFubmVsU2l6ZT10O2Vsc2Uge2lmKDQhPT10KXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHM6ICR7dH1gKTt0aGlzLmludGVybmFsRm9ybWF0PWUuUkdCQTMyRix0aGlzLmZvcm1hdD1lLlJHQkEsdGhpcy50ZXh0dXJlVHlwZT1lLkZMT0FULHRoaXMuY2hhbm5lbFNpemU9dDt9fWVuY29kZShlLHQpe2xldCBuLG87cmV0dXJuIGUuY29uc3RydWN0b3IhPT1GbG9hdDMyQXJyYXkmJihyLkxvZ2dlci53YXJuaW5nKCJFbmNvZGVyIiwiZGF0YSB3YXMgbm90IG9mIHR5cGUgRmxvYXQzMjsgY3JlYXRpbmcgbmV3IEZsb2F0MzJBcnJheSIpLG89bmV3IEZsb2F0MzJBcnJheShlKSksdCp0aGlzLmNoYW5uZWxTaXplPmUubGVuZ3RoPyhyLkxvZ2dlci53YXJuaW5nKCJFbmNvZGVyIiwiU291cmNlIGRhdGEgdG9vIHNtYWxsLiBBbGxvY2F0aW5nIGxhcmdlciBhcnJheSIpLG89ZSxuPXRoaXMuYWxsb2NhdGUodCp0aGlzLmNoYW5uZWxTaXplKSxvLmZvckVhY2goKChlLHQpPT5uW3RdPWUpKSk6KG89ZSxuPW8pLG59YWxsb2NhdGUoZSl7cmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoNCplKX1kZWNvZGUoZSx0KXtyZXR1cm4gMT09PXRoaXMuY2hhbm5lbFNpemU/ZS5maWx0ZXIoKChlLHQpPT50JTQ9PTApKS5zdWJhcnJheSgwLHQpOmUuc3ViYXJyYXkoMCx0KX19LHQuUkdCQUZsb2F0RGF0YUVuY29kZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0PTEsbil7aWYoMSE9PXQmJjQhPT10KXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHM6ICR7dH1gKTt0aGlzLmludGVybmFsRm9ybWF0PWUuUkdCQSx0aGlzLmZvcm1hdD1lLlJHQkEsdGhpcy5jaGFubmVsU2l6ZT10LHRoaXMudGV4dHVyZVR5cGU9bnx8ZS5GTE9BVDt9ZW5jb2RlKGUsdCl7bGV0IG49ZTtyZXR1cm4gMT09PXRoaXMuY2hhbm5lbFNpemUmJihyLkxvZ2dlci52ZXJib3NlKCJFbmNvZGVyIiwiRXhwbG9kaW5nIGludG8gYSBsYXJnZXIgYXJyYXkiKSxuPXRoaXMuYWxsb2NhdGUodCksZS5mb3JFYWNoKCgoZSx0KT0+bls0KnRdPWUpKSksbn1hbGxvY2F0ZShlKXtyZXR1cm4gbmV3IEZsb2F0MzJBcnJheSg0KmUpfWRlY29kZShlLHQpe3JldHVybiAxPT09dGhpcy5jaGFubmVsU2l6ZT9lLmZpbHRlcigoKGUsdCk9PnQlND09MCkpLnN1YmFycmF5KDAsdCk6ZS5zdWJhcnJheSgwLHQpfX0sdC5VaW50OERhdGFFbmNvZGVyPWNsYXNze2NvbnN0cnVjdG9yKGUsdD0xKXtpZih0aGlzLmNoYW5uZWxTaXplPTQsMT09PXQpdGhpcy5pbnRlcm5hbEZvcm1hdD1lLkFMUEhBLHRoaXMuZm9ybWF0PWUuQUxQSEEsdGhpcy50ZXh0dXJlVHlwZT1lLlVOU0lHTkVEX0JZVEUsdGhpcy5jaGFubmVsU2l6ZT10O2Vsc2Uge2lmKDQhPT10KXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHM6ICR7dH1gKTt0aGlzLmludGVybmFsRm9ybWF0PWUuUkdCQSx0aGlzLmZvcm1hdD1lLlJHQkEsdGhpcy50ZXh0dXJlVHlwZT1lLlVOU0lHTkVEX0JZVEUsdGhpcy5jaGFubmVsU2l6ZT10O319ZW5jb2RlKGUsdCl7cmV0dXJuIG5ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpfWFsbG9jYXRlKGUpe3JldHVybiBuZXcgVWludDhBcnJheShlKnRoaXMuY2hhbm5lbFNpemUpfWRlY29kZShlLHQpe2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBlLnN1YmFycmF5KDAsdCk7dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFycmF5IHR5cGU6ICR7ZS5jb25zdHJ1Y3Rvcn1gKX19O30sNzYxODooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0QmF0Y2hEaW09dC5zaXplVG9TcXVhcmlzaFNoYXBlPXQuZ2V0Um93c0NvbHM9dC5zaXplRnJvbVNoYXBlPXQuaXNJbnQ9dC5wYXJzZUF4aXNQYXJhbT10LnNxdWVlemVTaGFwZT10LlByZWZlckxvZ2ljYWxTdHJhdGVneT10LkFsd2F5c0tlZXBPcmlnaW5hbFNpemVTdHJhdGVneT12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpLG89big3MjczKTtmdW5jdGlvbiBpKGUsdCl7Y29uc3Qgbj1bXSxyPVtdLG89bnVsbCE9dCYmQXJyYXkuaXNBcnJheSh0KSYmMD09PXQubGVuZ3RoLGk9bnVsbD09dHx8bz9udWxsOnModCxlKS5zb3J0KCk7bGV0IGE9MDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdCl7aWYobnVsbCE9aSl7aWYoaVthXT09PXQmJjEhPT1lW3RdKXRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc3F1ZWV6ZSBheGlzICR7dH0gc2luY2UgaXRzIGRpbSAnJHtlW3RdfScgaXMgbm90IDFgKTsobnVsbD09aVthXXx8aVthXT50KSYmMT09PWVbdF0mJihuLnB1c2goZVt0XSksci5wdXNoKHQpKSxpW2FdPD10JiZhKys7fTEhPT1lW3RdJiYobi5wdXNoKGVbdF0pLHIucHVzaCh0KSk7fXJldHVybiB7bmV3U2hhcGU6bixrZXB0RGltczpyfX1mdW5jdGlvbiBzKGUsdCl7Y29uc3Qgbj10Lmxlbmd0aDtyZXR1cm4gZT1udWxsPT1lP3QubWFwKCgoZSx0KT0+dCkpOltdLmNvbmNhdChlKSwoMCwgby5hc3NlcnQpKGUuZXZlcnkoKGU9PmU+PS1uJiZlPG4pKSwoKCk9PmBBbGwgdmFsdWVzIGluIGF4aXMgcGFyYW0gbXVzdCBiZSBpbiByYW5nZSBbLSR7bn0sICR7bn0pIGJ1dCBnb3QgYXhpcyAke2V9YCkpLCgwLCBvLmFzc2VydCkoZS5ldmVyeShhKSwoKCk9PmBBbGwgdmFsdWVzIGluIGF4aXMgcGFyYW0gbXVzdCBiZSBpbnRlZ2VycyBidXQgZ290IGF4aXMgJHtlfWApKSxlLm1hcCgoZT0+ZTwwP24rZTplKSl9ZnVuY3Rpb24gYShlKXtyZXR1cm4gZSUxPT0wfWZ1bmN0aW9uIHUoZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybiAxO2xldCB0PWVbMF07Zm9yKGxldCBuPTE7bjxlLmxlbmd0aDtuKyspdCo9ZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBsKGUpe2NvbnN0IHQ9TWF0aC5jZWlsKE1hdGguc3FydChlKSk7cmV0dXJuIFt0LE1hdGguY2VpbChlL3QpXX10LkFsd2F5c0tlZXBPcmlnaW5hbFNpemVTdHJhdGVneT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm1heFRleHR1cmVTaXplPWU7fWNvbXB1dGVUZXh0dXJlV0goZSx0KXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIFsxLDFdO2NvbnN0IG49dGhpcy5tYXhUZXh0dXJlU2l6ZTtpZih0JiZ2b2lkIDAhPT10LmJyZWFrQXhpcyl7Y29uc3Qgbz10LmJyZWFrQXhpcz49ZS5sZW5ndGg/MTplLnNsaWNlKHQuYnJlYWtBeGlzKS5yZWR1Y2UoKChlLHQpPT5lKnQpKSxpPXQuYnJlYWtBeGlzPD0wPzE6ZS5zbGljZSgwLHQuYnJlYWtBeGlzKS5yZWR1Y2UoKChlLHQpPT5lKnQpKTtpZighKG8+bnx8aT5uKSlyZXR1cm4gW28saV07ci5Mb2dnZXIudmVyYm9zZSgiVGV4dHVyZUxheW91dCIsYEdpdmVuIHdpZHRoL2hlaWdodCBwcmVmZXJlbmNlcyB3ZXJlIHVuYXR0YWluYWJsZTogc2hhcGU6JHtlfSwgYnJlYWtBeGlzOiR7dC5icmVha0F4aXN9YCk7fWNvbnN0IG89ZS5yZWR1Y2UoKChlLHQpPT5lKnQpKTtsZXQgaT1NYXRoLmZsb29yKE1hdGguc3FydChvKSk7Zm9yKDtpPG4mJmk8byYmbyVpIT0wO2krKyk7aWYoaT49bnx8byVpIT0wKXRocm93IG5ldyBFcnJvcihgVGhlIGdpdmVuIGRpbWVuc2lvbnMgYXJlIG91dHNpZGUgdGhpcyBHUFUncyBib3VuZGFyaWVzOiAke2V9YCk7cmV0dXJuIFtpLG8vaV19fSx0LlByZWZlckxvZ2ljYWxTdHJhdGVneT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm1heFRleHR1cmVTaXplPWU7fWNvbXB1dGVUZXh0dXJlV0goZSx0KXtjb25zdCBuPXRoaXMuY29tcHV0ZVRleHR1cmUoZSx0KTtyZXR1cm4gdCYmdC5pc1BhY2tlZCYmKG5bMF0vPTIsblsxXS89MiksdCYmdC5yZXZlcnNlV0g/W25bMV0sblswXV06bn1jb21wdXRlVGV4dHVyZShlLHQpe2NvbnN0IG49dCYmdC5pc1BhY2tlZDtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIG4/WzIsMl06WzEsMV07bGV0IG89dGhpcy5tYXhUZXh0dXJlU2l6ZTtpZih0JiZ2b2lkIDAhPT10LmJyZWFrQXhpcyl7Y29uc3Qgbj10LmJyZWFrQXhpcz49ZS5sZW5ndGg/MTplLnNsaWNlKHQuYnJlYWtBeGlzKS5yZWR1Y2UoKChlLHQpPT5lKnQpKSxpPXQuYnJlYWtBeGlzPD0wPzE6ZS5zbGljZSgwLHQuYnJlYWtBeGlzKS5yZWR1Y2UoKChlLHQpPT5lKnQpKTtpZighKG4+b3x8aT5vKSlyZXR1cm4gW24saV07ci5Mb2dnZXIudmVyYm9zZSgiVGV4dHVyZUxheW91dCIsYEdpdmVuIHdpZHRoL2hlaWdodCBwcmVmZXJlbmNlcyB3ZXJlIHVuYXR0YWluYWJsZTogc2hhcGU6JHtlfSwgYnJlYWtBeGlzOiR7dC5icmVha0F4aXN9YCk7fWxldCBzPWUuc2xpY2UoMCk7aWYobiYmKG8qPTIscz1zLm1hcCgoKGUsdCk9PnQ+PXMubGVuZ3RoLTI/c1t0XSUyPT0wP3NbdF06c1t0XSsxOnNbdF0pKSwxPT09cy5sZW5ndGgmJihzPVsyLHNbMF1dKSksMiE9PXMubGVuZ3RoKXtjb25zdCBlPWkocyk7cz1lLm5ld1NoYXBlO31jb25zdCBhPXUocyk7cmV0dXJuIHMubGVuZ3RoPD0xJiZhPD1vP1sxLGFdOjI9PT1zLmxlbmd0aCYmc1swXTw9byYmc1sxXTw9bz9zOjM9PT1zLmxlbmd0aCYmc1swXSpzWzFdPD1vJiZzWzJdPD1vP1tzWzBdKnNbMV0sc1syXV06Mz09PXMubGVuZ3RoJiZzWzBdPD1vJiZzWzFdKnNbMl08PW8/W3NbMF0sc1sxXSpzWzJdXTo0PT09cy5sZW5ndGgmJnNbMF0qc1sxXSpzWzJdPD1vJiZzWzNdPD1vP1tzWzBdKnNbMV0qc1syXSxzWzNdXTo0PT09cy5sZW5ndGgmJnNbMF08PW8mJnNbMV0qc1syXSpzWzNdPD1vP1tzWzBdLHNbMV0qc1syXSpzWzNdXTpuP2woYS80KS5tYXAoKGU9PjIqZSkpOmwoYSl9fSx0LnNxdWVlemVTaGFwZT1pLHQucGFyc2VBeGlzUGFyYW09cyx0LmlzSW50PWEsdC5zaXplRnJvbVNoYXBlPXUsdC5nZXRSb3dzQ29scz1mdW5jdGlvbihlKXtpZigwPT09ZS5sZW5ndGgpdGhyb3cgRXJyb3IoIkNhbm5vdCBnZXQgcm93cyBhbmQgY29sdW1ucyBvZiBhbiBlbXB0eSBzaGFwZSBhcnJheS4iKTtyZXR1cm4gW2UubGVuZ3RoPjE/ZVtlLmxlbmd0aC0yXToxLGVbZS5sZW5ndGgtMV1dfSx0LnNpemVUb1NxdWFyaXNoU2hhcGU9bCx0LmdldEJhdGNoRGltPWZ1bmN0aW9uKGUsdD0yKXtyZXR1cm4gdShlLnNsaWNlKDAsZS5sZW5ndGgtdCkpfTt9LDMzMTQ6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZVRleHR1cmVMYXlvdXRGcm9tU2hhcGU9dC5jYWxjdWxhdGVUZXh0dXJlV2lkdGhBbmRIZWlnaHQ9dC5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVRleHR1cmVUeXBlPXZvaWQgMDtjb25zdCByPW4oNzI3Myksbz1uKDU2MzkpO3QuY3JlYXRlVGV4dHVyZUxheW91dEZyb21UZXh0dXJlVHlwZT0oZSxuLHIpPT57Y29uc3QgaT1yPT09by5UZXh0dXJlVHlwZS51bnBhY2tlZHx8cj09PW8uVGV4dHVyZVR5cGUudW5wYWNrZWRSZXZlcnNlZD8xOjQscz1yPT09by5UZXh0dXJlVHlwZS5wYWNrZWQsYT1yPT09by5UZXh0dXJlVHlwZS51bnBhY2tlZFJldmVyc2VkfHxyPT09by5UZXh0dXJlVHlwZS5wYWNrZWQsdT1yPT09by5UZXh0dXJlVHlwZS5wYWNrZWRMYXN0RGltZW5zaW9uP24ubGVuZ3RoLTE6dm9pZCAwLGw9cj09PW8uVGV4dHVyZVR5cGUucGFja2VkTGFzdERpbWVuc2lvbj9uLm1hcCgoKGUsdCk9PnQ9PT1uLmxlbmd0aC0xPzQqZTplKSk6dm9pZCAwO3JldHVybiAoMCwgdC5jcmVhdGVUZXh0dXJlTGF5b3V0RnJvbVNoYXBlKShlLG4saSxsLHtpc1BhY2tlZDpzLHJldmVyc2VXSDphLGJyZWFrQXhpczp1fSl9LHQuY2FsY3VsYXRlVGV4dHVyZVdpZHRoQW5kSGVpZ2h0PShlLG4scik9Pntjb25zdCBvPSgwLCB0LmNyZWF0ZVRleHR1cmVMYXlvdXRGcm9tVGV4dHVyZVR5cGUpKGUsbixyKTtyZXR1cm4gW28ud2lkdGgsby5oZWlnaHRdfSx0LmNyZWF0ZVRleHR1cmVMYXlvdXRGcm9tU2hhcGU9KGUsdCxuPTEsbyxpKT0+e2NvbnN0IHM9ISghaXx8IWkuaXNQYWNrZWQpLFthLHVdPWUuY29tcHV0ZVRleHR1cmVXSChzJiZvfHx0LGkpLGw9dC5sZW5ndGg7bGV0IGM9dC5zbGljZSgwKTtpZigwPT09bCYmKGM9WzFdKSwxPT09bilvPXQ7ZWxzZSBpZihzKXtpZig0IT09bil0aHJvdyBuZXcgRXJyb3IoImEgcGFja2VkIHRleHR1cmUgbXVzdCBiZSA0LWNoYW5uZWwiKTtvPXQsbD4wJiYoY1tsLTFdPU1hdGguY2VpbChjW2wtMV0vMikpLGw+MSYmKGNbbC0yXT1NYXRoLmNlaWwoY1tsLTJdLzIpKTt9ZWxzZSBpZighbyl0aHJvdyBuZXcgRXJyb3IoIlVucGFja2VkIHNoYXBlIGlzIG5lZWRlZCB3aGVuIHVzaW5nIGNoYW5uZWxzID4gMSIpO3JldHVybiB7d2lkdGg6YSxoZWlnaHQ6dSxjaGFubmVsczpuLGlzUGFja2VkOnMsc2hhcGU6YyxzdHJpZGVzOnIuU2hhcGVVdGlsLmNvbXB1dGVTdHJpZGVzKGMpLHVucGFja2VkU2hhcGU6byxyZXZlcnNlZFdIOmkmJmkucmV2ZXJzZVdIfX07fSw1MjQzOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UZXh0dXJlTWFuYWdlcj12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpO3QuVGV4dHVyZU1hbmFnZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4scil7dGhpcy5nbENvbnRleHQ9ZSx0aGlzLmxheW91dFN0cmF0ZWd5PXQsdGhpcy5wcm9maWxlcj1uLHRoaXMuY29uZmlnPXIsdGhpcy5wZW5kaW5nUmVhZD1uZXcgTWFwLHIucmV1c2VUZXh0dXJlcyYmKHRoaXMuaW5Vc2VUZXh0dXJlcz1uZXcgTWFwLHRoaXMuaWRsZVRleHR1cmVzPW5ldyBNYXAsdGhpcy50ZXh0dXJlTG9va3VwPW5ldyBNYXApO31jcmVhdGVUZXh0dXJlRnJvbUxheW91dChlLHQsbixvKXtjb25zdCBpPXRoaXMudG9FbmNvZGVyVHlwZShlKSxzPXRoaXMuZ2xDb250ZXh0LmdldEVuY29kZXIoaSx0LmNoYW5uZWxzfHwxLG8pO2lmKHQuaXNQYWNrZWQmJjE9PT1vKXRocm93IG5ldyBFcnJvcigibm90IGltcGxlbWVudGVkIik7Y29uc3QgYT10LndpZHRoLHU9dC5oZWlnaHQ7bGV0IGwsYztpZih0aGlzLmNvbmZpZy5yZXVzZVRleHR1cmVzKXtsPWAke2F9eCR7dX1fJHtzLmZvcm1hdH1fJHtzLmludGVybmFsRm9ybWF0fV8ke3MudGV4dHVyZVR5cGV9YCxjPXRoaXMuaW5Vc2VUZXh0dXJlcy5nZXQobCksY3x8KGM9W10sdGhpcy5pblVzZVRleHR1cmVzLnNldChsLGMpKTtjb25zdCB0PXRoaXMuaWRsZVRleHR1cmVzLmdldChsKTtpZih0JiZ0Lmxlbmd0aD4wKXtjb25zdCByPXQucG9wKCk7cmV0dXJuIGMucHVzaChyKSwxPT09byYmdGhpcy5nbENvbnRleHQudXBkYXRlVGV4dHVyZShyLGEsdSxzLHRoaXMudG9UZXh0dXJlRGF0YShlLG4pKSxyfX1yLkxvZ2dlci52ZXJib3NlKCJUZXh0dXJlTWFuYWdlciIsYENyZWF0aW5nIG5ldyB0ZXh0dXJlIG9mIHNpemUgJHt0LndpZHRofXgke3QuaGVpZ2h0fWApO2NvbnN0IHA9dGhpcy5nbENvbnRleHQuYWxsb2NhdGVUZXh0dXJlKGEsdSxzLHRoaXMudG9UZXh0dXJlRGF0YShlLG4pKTtyZXR1cm4gdGhpcy5jb25maWcucmV1c2VUZXh0dXJlcyYmKGMucHVzaChwKSx0aGlzLnRleHR1cmVMb29rdXAuc2V0KHAsbCkpLHB9cmVhZFRleHR1cmUoZSx0LG4pe3JldHVybiBufHwobj0xKSx0aGlzLnByb2ZpbGVyLmV2ZW50KCJiYWNrZW5kIiwiVGV4dHVyZU1hbmFnZXIucmVhZFRleHR1cmUiLCgoKT0+e2NvbnN0IHI9ZS5zaGFwZS5yZWR1Y2UoKChlLHQpPT5lKnQpKSpuLG89dGhpcy5nbENvbnRleHQucmVhZFRleHR1cmUoZS50ZXh0dXJlLGUud2lkdGgsZS5oZWlnaHQscix0aGlzLnRvRW5jb2RlclR5cGUodCksbik7cmV0dXJuIHRoaXMudG9UZW5zb3JEYXRhKHQsbyl9KSl9YXN5bmMgcmVhZFRleHR1cmVBc3luYyhlLHQsbil7Y29uc3Qgcj1lLnRlbnNvci5kYXRhSWQ7aWYobnx8KG49MSksdGhpcy5wZW5kaW5nUmVhZC5oYXMocikpe2NvbnN0IGU9dGhpcy5wZW5kaW5nUmVhZC5nZXQocik7cmV0dXJuIG5ldyBQcm9taXNlKCh0PT5udWxsPT1lP3ZvaWQgMDplLnB1c2godCkpKX1yZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgiYmFja2VuZCIsIlRleHR1cmVNYW5hZ2VyLnJlYWRUZXh0dXJlQXN5bmMiLChhc3luYygpPT57dGhpcy5wZW5kaW5nUmVhZC5zZXQocixbXSk7Y29uc3Qgbz1lLnNoYXBlLnJlZHVjZSgoKGUsdCk9PmUqdCkpKm47YXdhaXQgdGhpcy5nbENvbnRleHQuY3JlYXRlQW5kV2FpdEZvckZlbmNlKCk7Y29uc3QgaT10aGlzLmdsQ29udGV4dC5yZWFkVGV4dHVyZShlLnRleHR1cmUsZS53aWR0aCxlLmhlaWdodCxvLHRoaXMudG9FbmNvZGVyVHlwZSh0KSxuKSxzPXRoaXMudG9UZW5zb3JEYXRhKHQsaSksYT10aGlzLnBlbmRpbmdSZWFkLmdldChyKTtyZXR1cm4gdGhpcy5wZW5kaW5nUmVhZC5kZWxldGUociksbnVsbD09YXx8YS5mb3JFYWNoKChlPT5lKHMpKSksc30pKX1yZWFkVWludDhUZXh0dXJlQXNGbG9hdChlKXtyZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgiYmFja2VuZCIsIlRleHR1cmVNYW5hZ2VyLnJlYWRVaW50OFRleHR1cmVBc0Zsb2F0IiwoKCk9Pntjb25zdCB0PWUuc2hhcGUucmVkdWNlKCgoZSx0KT0+ZSp0KSksbj10aGlzLmdsQ29udGV4dC5yZWFkVGV4dHVyZShlLnRleHR1cmUsZS53aWR0aCxlLmhlaWdodCw0KnQsImJ5dGUiLDQpO3JldHVybiBuZXcgRmxvYXQzMkFycmF5KG4uYnVmZmVyLG4uYnl0ZU9mZnNldCx0KX0pKX1yZWxlYXNlVGV4dHVyZShlLHQpe2xldCBuO2lmKHRoaXMuY29uZmlnLnJldXNlVGV4dHVyZXMmJihuPXRoaXMudGV4dHVyZUxvb2t1cC5nZXQoZS50ZXh0dXJlKSxuKSl7dCYmdGhpcy50ZXh0dXJlTG9va3VwLmRlbGV0ZShuKTtjb25zdCByPXRoaXMuaW5Vc2VUZXh0dXJlcy5nZXQobik7aWYocil7Y29uc3QgdD1yLmluZGV4T2YoZS50ZXh0dXJlKTtpZigtMSE9PXQpe3Iuc3BsaWNlKHQsMSk7bGV0IG89dGhpcy5pZGxlVGV4dHVyZXMuZ2V0KG4pO298fChvPVtdLHRoaXMuaWRsZVRleHR1cmVzLnNldChuLG8pKSxvLnB1c2goZS50ZXh0dXJlKTt9fX1uJiYhdHx8KHIuTG9nZ2VyLnZlcmJvc2UoIlRleHR1cmVNYW5hZ2VyIixgRGVsZXRpbmcgdGV4dHVyZSBvZiBzaXplICR7ZS53aWR0aH14JHtlLmhlaWdodH1gKSx0aGlzLmdsQ29udGV4dC5kZWxldGVUZXh0dXJlKGUudGV4dHVyZSkpO310b1RlbnNvckRhdGEoZSx0KXtzd2l0Y2goZSl7Y2FzZSJpbnQxNiI6cmV0dXJuIHQgaW5zdGFuY2VvZiBJbnQxNkFycmF5P3Q6SW50MTZBcnJheS5mcm9tKHQpO2Nhc2UiaW50MzIiOnJldHVybiB0IGluc3RhbmNlb2YgSW50MzJBcnJheT90OkludDMyQXJyYXkuZnJvbSh0KTtjYXNlImludDgiOnJldHVybiB0IGluc3RhbmNlb2YgSW50OEFycmF5P3Q6SW50OEFycmF5LmZyb20odCk7Y2FzZSJ1aW50MTYiOnJldHVybiB0IGluc3RhbmNlb2YgVWludDE2QXJyYXk/dDpVaW50MTZBcnJheS5mcm9tKHQpO2Nhc2UidWludDMyIjpyZXR1cm4gdCBpbnN0YW5jZW9mIFVpbnQzMkFycmF5P3Q6VWludDMyQXJyYXkuZnJvbSh0KTtjYXNlInVpbnQ4IjpjYXNlImJvb2wiOnJldHVybiB0IGluc3RhbmNlb2YgVWludDhBcnJheT90OlVpbnQ4QXJyYXkuZnJvbSh0KTtjYXNlImZsb2F0MzIiOnJldHVybiB0IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5P3Q6RmxvYXQzMkFycmF5LmZyb20odCk7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gdCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheT90OkZsb2F0NjRBcnJheS5mcm9tKHQpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBUZW5zb3JEYXRhIHR5cGUgJHtlfSBpcyBub3Qgc3VwcG9ydGVkYCl9fXRvVGV4dHVyZURhdGEoZSx0KXtpZih0KXJldHVybiB0IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5P3Q6bmV3IEZsb2F0MzJBcnJheSh0KX10b0VuY29kZXJUeXBlKGUpe3JldHVybiAiZmxvYXQifWNsZWFyQWN0aXZlVGV4dHVyZXMoKXt0aGlzLmdsQ29udGV4dC5jbGVhckFjdGl2ZVRleHR1cmVzKCk7fX07fSw1NjM5OihlLHQpPT57dmFyIG47T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuVGV4dHVyZVR5cGU9dm9pZCAwLChuPXQuVGV4dHVyZVR5cGV8fCh0LlRleHR1cmVUeXBlPXt9KSlbbi51bnBhY2tlZD0wXT0idW5wYWNrZWQiLG5bbi51bnBhY2tlZFJldmVyc2VkPTFdPSJ1bnBhY2tlZFJldmVyc2VkIixuW24ucGFja2VkPTJdPSJwYWNrZWQiLG5bbi5kb3dubG9hZFVpbnQ4QXNGbG9hdD0zXT0iZG93bmxvYWRVaW50OEFzRmxvYXQiLG5bbi5wYWNrZWRMYXN0RGltZW5zaW9uPTRdPSJwYWNrZWRMYXN0RGltZW5zaW9uIjt9LDQzMjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0R2xDaGFubmVscz10LmdldENvb3Jkc0RhdGFUeXBlPXQuZ2V0U3F1ZWV6ZWRQYXJhbXM9dC5zcXVlZXplSW5wdXRTaGFwZT10LmdlbmVyYXRlU2hhZGVyRnVuY05hbWVGcm9tSW5wdXRTYW1wbGVyTmFtZUF0T3V0Q29vcmRzPXQuZ2VuZXJhdGVTaGFkZXJGdW5jTmFtZUZyb21JbnB1dFNhbXBsZXJOYW1lPXQucmVwZWF0ZWRUcnk9dC5nZXRQYWNrZWRTaGFwZT12b2lkIDA7Y29uc3Qgcj1uKDcyNzMpO3QuZ2V0UGFja2VkU2hhcGU9ZnVuY3Rpb24oZSl7Y29uc3QgdD1lLmxlbmd0aDtyZXR1cm4gZS5zbGljZSgwLHQtMSkuY29uY2F0KGVbdC0xXS80KX0sdC5yZXBlYXRlZFRyeT1hc3luYyBmdW5jdGlvbihlLHQ9KGU9PjApLG4pe3JldHVybiBuZXcgUHJvbWlzZSgoKHIsbyk9PntsZXQgaT0wO2NvbnN0IHM9KCk9PntpZihlKCkpcmV0dXJuIHZvaWQgcigpO2krKztjb25zdCBhPXQoaSk7bnVsbCE9biYmaT49bj9vKCk6c2V0VGltZW91dChzLGEpO307cygpO30pKX0sdC5nZW5lcmF0ZVNoYWRlckZ1bmNOYW1lRnJvbUlucHV0U2FtcGxlck5hbWU9ZnVuY3Rpb24oZSl7cmV0dXJuICgwLCByLmFzc2VydCkodm9pZCAwIT09ZSYmMCE9PWUubGVuZ3RoLCgoKT0+ImVtcHR5IHN0cmluZyBmb3VuZCBmb3Igc2FtcGxlciBuYW1lIikpLCJnZXQiK2UuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0sdC5nZW5lcmF0ZVNoYWRlckZ1bmNOYW1lRnJvbUlucHV0U2FtcGxlck5hbWVBdE91dENvb3Jkcz1mdW5jdGlvbihlKXtyZXR1cm4gKDAsIHIuYXNzZXJ0KSh2b2lkIDAhPT1lJiYwIT09ZS5sZW5ndGgsKCgpPT4iZW1wdHkgc3RyaW5nIGZvdW5kIGZvciBzYW1wbGVyIG5hbWUiKSksImdldCIrZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpKyJBdE91dENvb3JkcyJ9LHQuc3F1ZWV6ZUlucHV0U2hhcGU9ZnVuY3Rpb24oZSx0KXtsZXQgbj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKTtyZXR1cm4gbj10LG59LHQuZ2V0U3F1ZWV6ZWRQYXJhbXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5tYXAoKHQ9PmVbdF0pKS5qb2luKCIsICIpfSx0LmdldENvb3Jkc0RhdGFUeXBlPWZ1bmN0aW9uKGUpe2lmKGU8PTEpcmV0dXJuICJpbnQiO2lmKDI9PT1lKXJldHVybiAiaXZlYzIiO2lmKDM9PT1lKXJldHVybiAiaXZlYzMiO2lmKDQ9PT1lKXJldHVybiAiaXZlYzQiO2lmKDU9PT1lKXJldHVybiAiaXZlYzUiO2lmKDY9PT1lKXJldHVybiAiaXZlYzYiO3Rocm93IEVycm9yKGBHUFUgZm9yIHJhbmsgJHtlfSBpcyBub3QgeWV0IHN1cHBvcnRlZGApfSx0LmdldEdsQ2hhbm5lbHM9ZnVuY3Rpb24oZT02KXtyZXR1cm4gWyJ4IiwieSIsInoiLCJ3IiwidSIsInYiXS5zbGljZSgwLGUpfTt9LDMzODk6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZU5ld1dlYkdMQ29udGV4dD10LmNyZWF0ZVdlYkdMQ29udGV4dD12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpLG89bigzNTI0KSxpPXt9O2Z1bmN0aW9uIHMoZSx0KXtsZXQgbjtjb25zdCBpPXthbHBoYTohMSxkZXB0aDohMSxhbnRpYWxpYXM6ITEsc3RlbmNpbDohMSxwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6ITEscHJlbXVsdGlwbGllZEFscGhhOiExLGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6ITF9O2lmKCghdHx8IndlYmdsMiI9PT10KSYmKG49ZS5nZXRDb250ZXh0KCJ3ZWJnbDIiLGkpLG4pKXRyeXtyZXR1cm4gbmV3IG8uV2ViR0xDb250ZXh0KG4sMil9Y2F0Y2goZSl7ci5Mb2dnZXIud2FybmluZygiR2xDb250ZXh0RmFjdG9yeSIsYGZhaWxlZCB0byBjcmVhdGUgV2ViR0xDb250ZXh0IHVzaW5nIGNvbnRleHRJZCAnd2ViZ2wyJy4gRXJyb3I6ICR7ZX1gKTt9aWYoKCF0fHwid2ViZ2wiPT09dCkmJihuPWUuZ2V0Q29udGV4dCgid2ViZ2wiLGkpfHxlLmdldENvbnRleHQoImV4cGVyaW1lbnRhbC13ZWJnbCIsaSksbikpdHJ5e3JldHVybiBuZXcgby5XZWJHTENvbnRleHQobiwxKX1jYXRjaChlKXtyLkxvZ2dlci53YXJuaW5nKCJHbENvbnRleHRGYWN0b3J5IixgZmFpbGVkIHRvIGNyZWF0ZSBXZWJHTENvbnRleHQgdXNpbmcgY29udGV4dElkICd3ZWJnbCcgb3IgJ2V4cGVyaW1lbnRhbC13ZWJnbCcuIEVycm9yOiAke2V9YCk7fXRocm93IG5ldyBFcnJvcigiV2ViR0wgaXMgbm90IHN1cHBvcnRlZCIpfXQuY3JlYXRlV2ViR0xDb250ZXh0PWZ1bmN0aW9uIGUodCl7bGV0IG47aWYodCYmIndlYmdsMiIhPT10fHwhKCJ3ZWJnbDIiaW4gaSk/dCYmIndlYmdsIiE9PXR8fCEoIndlYmdsImluIGkpfHwobj1pLndlYmdsKTpuPWkud2ViZ2wyLCFuKXRyeXtuPXMoZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIE9mZnNjcmVlbkNhbnZhcyl0aHJvdyBuZXcgVHlwZUVycm9yKCJmYWlsZWQgdG8gY3JlYXRlIG9mZnNjcmVlbiBjYW52YXM6IE9mZnNjcmVlbkNhbnZhcyBpcyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuIG5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKX0oKSx0KTt9Y2F0Y2goZSl7bj1zKGZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBkb2N1bWVudCl0aHJvdyBuZXcgVHlwZUVycm9yKCJmYWlsZWQgdG8gY3JlYXRlIGNhbnZhczogZG9jdW1lbnQgaXMgbm90IHN1cHBvcnRlZCIpO2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7cmV0dXJuIGUud2lkdGg9MSxlLmhlaWdodD0xLGV9KCksdCk7fXQ9dHx8MT09PW4udmVyc2lvbj8id2ViZ2wiOiJ3ZWJnbDIiO2NvbnN0IHI9bi5nbDtyZXR1cm4gaVt0XT1uLHIuaXNDb250ZXh0TG9zdCgpPyhkZWxldGUgaVt0XSxlKHQpKTooci5kaXNhYmxlKHIuREVQVEhfVEVTVCksci5kaXNhYmxlKHIuU1RFTkNJTF9URVNUKSxyLmRpc2FibGUoci5CTEVORCksci5kaXNhYmxlKHIuRElUSEVSKSxyLmRpc2FibGUoci5QT0xZR09OX09GRlNFVF9GSUxMKSxyLmRpc2FibGUoci5TQU1QTEVfQ09WRVJBR0UpLHIuZW5hYmxlKHIuU0NJU1NPUl9URVNUKSxyLmVuYWJsZShyLkNVTExfRkFDRSksci5jdWxsRmFjZShyLkJBQ0spLG4pfSx0LmNyZWF0ZU5ld1dlYkdMQ29udGV4dD1zO30sMzUyNDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyYmdGhpcy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pO3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtvJiYhKCJnZXQiaW4gbz8hdC5fX2VzTW9kdWxlOm8ud3JpdGFibGV8fG8uY29uZmlndXJhYmxlKXx8KG89e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixvKTt9OmZ1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pLGVbcl09dFtuXTt9KSxvPXRoaXMmJnRoaXMuX19zZXRNb2R1bGVEZWZhdWx0fHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihlLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSk7fTpmdW5jdGlvbihlLHQpe2UuZGVmYXVsdD10O30pLGk9dGhpcyYmdGhpcy5fX2ltcG9ydFN0YXJ8fGZ1bmN0aW9uKGUpe2lmKGUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgdD17fTtpZihudWxsIT1lKWZvcih2YXIgbiBpbiBlKSJkZWZhdWx0IiE9PW4mJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZyKHQsZSxuKTtyZXR1cm4gbyh0LGUpLHR9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LldlYkdMQ29udGV4dD10LmxpbmVhclNlYXJjaExhc3RUcnVlPXZvaWQgMDtjb25zdCBzPW4oMjIzNSksYT1pKG4oOTYyMikpLHU9big0MzIpO2Z1bmN0aW9uIGwoZSl7bGV0IHQ9MDtmb3IoO3Q8ZS5sZW5ndGgmJmVbdF0oKTsrK3QpO3JldHVybiB0LTF9dC5saW5lYXJTZWFyY2hMYXN0VHJ1ZT1sLHQuV2ViR0xDb250ZXh0PWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5mcmFtZUJ1ZmZlckJvdW5kPSExLHRoaXMuaXRlbXNUb1BvbGw9W10sdGhpcy5nbD1lLHRoaXMudmVyc2lvbj10LHRoaXMuZ2V0RXh0ZW5zaW9ucygpLHRoaXMudmVydGV4YnVmZmVyPXRoaXMuY3JlYXRlVmVydGV4YnVmZmVyKCksdGhpcy5mcmFtZWJ1ZmZlcj10aGlzLmNyZWF0ZUZyYW1lYnVmZmVyKCksdGhpcy5xdWVyeVZpdGFsUGFyYW1ldGVycygpO31hbGxvY2F0ZVRleHR1cmUoZSx0LG4scil7Y29uc3Qgbz10aGlzLmdsLGk9by5jcmVhdGVUZXh0dXJlKCk7by5iaW5kVGV4dHVyZShvLlRFWFRVUkVfMkQsaSksby50ZXhQYXJhbWV0ZXJpKG8uVEVYVFVSRV8yRCxvLlRFWFRVUkVfTUlOX0ZJTFRFUixvLk5FQVJFU1QpLG8udGV4UGFyYW1ldGVyaShvLlRFWFRVUkVfMkQsby5URVhUVVJFX01BR19GSUxURVIsby5ORUFSRVNUKSxvLnRleFBhcmFtZXRlcmkoby5URVhUVVJFXzJELG8uVEVYVFVSRV9XUkFQX1Msby5DTEFNUF9UT19FREdFKSxvLnRleFBhcmFtZXRlcmkoby5URVhUVVJFXzJELG8uVEVYVFVSRV9XUkFQX1Qsby5DTEFNUF9UT19FREdFKTtjb25zdCBzPXI/bi5lbmNvZGUocixlKnQpOm51bGw7cmV0dXJuIG8udGV4SW1hZ2UyRChvLlRFWFRVUkVfMkQsMCxuLmludGVybmFsRm9ybWF0LGUsdCwwLG4uZm9ybWF0LG4udGV4dHVyZVR5cGUscyksdGhpcy5jaGVja0Vycm9yKCksaX11cGRhdGVUZXh0dXJlKGUsdCxuLHIsbyl7Y29uc3QgaT10aGlzLmdsO2kuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELGUpO2NvbnN0IHM9ci5lbmNvZGUobyx0Km4pO2kudGV4U3ViSW1hZ2UyRChpLlRFWFRVUkVfMkQsMCwwLDAsdCxuLHIuZm9ybWF0LHIudGV4dHVyZVR5cGUscyksdGhpcy5jaGVja0Vycm9yKCk7fWF0dGFjaEZyYW1lYnVmZmVyKGUsdCxuKXtjb25zdCByPXRoaXMuZ2w7ci5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsZSksci5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUix0aGlzLmZyYW1lYnVmZmVyKSxyLmZyYW1lYnVmZmVyVGV4dHVyZTJEKHIuRlJBTUVCVUZGRVIsci5DT0xPUl9BVFRBQ0hNRU5UMCxyLlRFWFRVUkVfMkQsZSwwKSx0aGlzLmNoZWNrRXJyb3IoKSxyLnZpZXdwb3J0KDAsMCx0LG4pLHIuc2Npc3NvcigwLDAsdCxuKTt9cmVhZFRleHR1cmUoZSx0LG4scixvLGkpe2NvbnN0IHM9dGhpcy5nbDtpfHwoaT0xKSx0aGlzLmZyYW1lQnVmZmVyQm91bmR8fHRoaXMuYXR0YWNoRnJhbWVidWZmZXIoZSx0LG4pO2NvbnN0IGE9dGhpcy5nZXRFbmNvZGVyKG8saSksdT1hLmFsbG9jYXRlKHQqbik7cmV0dXJuIHMuYmluZFRleHR1cmUocy5URVhUVVJFXzJELGUpLHMuZnJhbWVidWZmZXJUZXh0dXJlMkQocy5GUkFNRUJVRkZFUixzLkNPTE9SX0FUVEFDSE1FTlQwLHMuVEVYVFVSRV8yRCxlLDApLHMucmVhZFBpeGVscygwLDAsdCxuLHMuUkdCQSxhLnRleHR1cmVUeXBlLHUpLHRoaXMuY2hlY2tFcnJvcigpLGEuZGVjb2RlKHUscil9aXNGcmFtZWJ1ZmZlclJlYWR5KCl7cmV0dXJuICEwfWdldEFjdGl2ZVRleHR1cmUoKXtjb25zdCBlPXRoaXMuZ2w7cmV0dXJuICJURVhUVVJFIisoZS5nZXRQYXJhbWV0ZXIodGhpcy5nbC5BQ1RJVkVfVEVYVFVSRSktZS5URVhUVVJFMCl9Z2V0VGV4dHVyZUJpbmRpbmcoKXtyZXR1cm4gdGhpcy5nbC5nZXRQYXJhbWV0ZXIodGhpcy5nbC5URVhUVVJFX0JJTkRJTkdfMkQpfWdldEZyYW1lYnVmZmVyQmluZGluZygpe3JldHVybiB0aGlzLmdsLmdldFBhcmFtZXRlcih0aGlzLmdsLkZSQU1FQlVGRkVSX0JJTkRJTkcpfXNldFZlcnRleEF0dHJpYnV0ZXMoZSx0KXtjb25zdCBuPXRoaXMuZ2w7bi52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUsMyxuLkZMT0FULCExLDIwLDApLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZSksLTEhPT10JiYobi52ZXJ0ZXhBdHRyaWJQb2ludGVyKHQsMixuLkZMT0FULCExLDIwLDEyKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHQpKSx0aGlzLmNoZWNrRXJyb3IoKTt9Y3JlYXRlUHJvZ3JhbShlLHQpe2NvbnN0IG49dGhpcy5nbCxyPW4uY3JlYXRlUHJvZ3JhbSgpO3JldHVybiBuLmF0dGFjaFNoYWRlcihyLGUpLG4uYXR0YWNoU2hhZGVyKHIsdCksbi5saW5rUHJvZ3JhbShyKSxyfWNvbXBpbGVTaGFkZXIoZSx0KXtjb25zdCBuPXRoaXMuZ2wscj1uLmNyZWF0ZVNoYWRlcih0KTtpZighcil0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZVNoYWRlcigpIHJldHVybmVkIG51bGwgd2l0aCB0eXBlICR7dH1gKTtpZihuLnNoYWRlclNvdXJjZShyLGUpLG4uY29tcGlsZVNoYWRlcihyKSwhMT09PW4uZ2V0U2hhZGVyUGFyYW1ldGVyKHIsbi5DT01QSUxFX1NUQVRVUykpdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY29tcGlsZSBzaGFkZXI6ICR7bi5nZXRTaGFkZXJJbmZvTG9nKHIpfVxuU2hhZGVyIHNvdXJjZTpcbiR7ZX1gKTtyZXR1cm4gcn1kZWxldGVTaGFkZXIoZSl7dGhpcy5nbC5kZWxldGVTaGFkZXIoZSk7fWJpbmRUZXh0dXJlVG9Vbmlmb3JtKGUsdCxuKXtjb25zdCByPXRoaXMuZ2w7ci5hY3RpdmVUZXh0dXJlKHIuVEVYVFVSRTArdCksdGhpcy5jaGVja0Vycm9yKCksci5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsZSksdGhpcy5jaGVja0Vycm9yKCksci51bmlmb3JtMWkobix0KSx0aGlzLmNoZWNrRXJyb3IoKTt9ZHJhdygpe3RoaXMuZ2wuZHJhd0FycmF5cyh0aGlzLmdsLlRSSUFOR0xFX1NUUklQLDAsNCksdGhpcy5jaGVja0Vycm9yKCk7fWNoZWNrRXJyb3IoKXtpZihzLmVudi5kZWJ1Zyl7Y29uc3QgZT10aGlzLmdsLHQ9ZS5nZXRFcnJvcigpO2xldCBuPSIiO3N3aXRjaCh0KXtjYXNlIGUuTk9fRVJST1I6cmV0dXJuO2Nhc2UgZS5JTlZBTElEX0VOVU06bj0iSU5WQUxJRF9FTlVNIjticmVhaztjYXNlIGUuSU5WQUxJRF9WQUxVRTpuPSJJTlZBTElEX1ZBTFVFIjticmVhaztjYXNlIGUuSU5WQUxJRF9PUEVSQVRJT046bj0iSU5WQUxJRF9PUEVSQVRJT04iO2JyZWFrO2Nhc2UgZS5JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTjpuPSJJTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTiI7YnJlYWs7Y2FzZSBlLk9VVF9PRl9NRU1PUlk6bj0iT1VUX09GX01FTU9SWSI7YnJlYWs7Y2FzZSBlLkNPTlRFWFRfTE9TVF9XRUJHTDpuPSJDT05URVhUX0xPU1RfV0VCR0wiO2JyZWFrO2RlZmF1bHQ6bj1gVW5rbm93biBXZWJHTCBFcnJvcjogJHt0LnRvU3RyaW5nKDE2KX1gO310aHJvdyBuZXcgRXJyb3Iobil9fWRlbGV0ZVRleHR1cmUoZSl7dGhpcy5nbC5kZWxldGVUZXh0dXJlKGUpO31kZWxldGVQcm9ncmFtKGUpe3RoaXMuZ2wuZGVsZXRlUHJvZ3JhbShlKTt9Z2V0RW5jb2RlcihlLHQsbj0wKXtpZigyPT09dGhpcy52ZXJzaW9uKXJldHVybiBuZXcgYS5SZWRGbG9hdDMyRGF0YUVuY29kZXIodGhpcy5nbCx0KTtzd2l0Y2goZSl7Y2FzZSJmbG9hdCI6cmV0dXJuIDE9PT1ufHx0aGlzLmlzUmVuZGVyRmxvYXQzMlN1cHBvcnRlZD9uZXcgYS5SR0JBRmxvYXREYXRhRW5jb2Rlcih0aGlzLmdsLHQpOm5ldyBhLlJHQkFGbG9hdERhdGFFbmNvZGVyKHRoaXMuZ2wsdCx0aGlzLnRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24uSEFMRl9GTE9BVF9PRVMpO2Nhc2UiaW50Ijp0aHJvdyBuZXcgRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpO2Nhc2UiYnl0ZSI6cmV0dXJuIG5ldyBhLlVpbnQ4RGF0YUVuY29kZXIodGhpcy5nbCx0KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkYXRhVHlwZTogJHtlfWApfX1jbGVhckFjdGl2ZVRleHR1cmVzKCl7Y29uc3QgZT10aGlzLmdsO2ZvcihsZXQgdD0wO3Q8dGhpcy5tYXhUZXh0dXJlSW1hZ2VVbml0czsrK3QpZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTArdCksZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsbnVsbCk7fWRpc3Bvc2UoKXtpZih0aGlzLmRpc3Bvc2VkKXJldHVybjtjb25zdCBlPXRoaXMuZ2w7ZS5iaW5kRnJhbWVidWZmZXIoZS5GUkFNRUJVRkZFUixudWxsKSxlLmRlbGV0ZUZyYW1lYnVmZmVyKHRoaXMuZnJhbWVidWZmZXIpLGUuYmluZEJ1ZmZlcihlLkFSUkFZX0JVRkZFUixudWxsKSxlLmRlbGV0ZUJ1ZmZlcih0aGlzLnZlcnRleGJ1ZmZlciksZS5iaW5kQnVmZmVyKGUuRUxFTUVOVF9BUlJBWV9CVUZGRVIsbnVsbCksZS5maW5pc2goKSx0aGlzLmRpc3Bvc2VkPSEwO31jcmVhdGVEZWZhdWx0R2VvbWV0cnkoKXtyZXR1cm4gbmV3IEZsb2F0MzJBcnJheShbLTEsMSwwLDAsMSwtMSwtMSwwLDAsMCwxLDEsMCwxLDEsMSwtMSwwLDEsMF0pfWNyZWF0ZVZlcnRleGJ1ZmZlcigpe2NvbnN0IGU9dGhpcy5nbCx0PWUuY3JlYXRlQnVmZmVyKCk7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjcmVhdGVCdWZmZXIoKSByZXR1cm5lZCBudWxsIik7Y29uc3Qgbj10aGlzLmNyZWF0ZURlZmF1bHRHZW9tZXRyeSgpO3JldHVybiBlLmJpbmRCdWZmZXIoZS5BUlJBWV9CVUZGRVIsdCksZS5idWZmZXJEYXRhKGUuQVJSQVlfQlVGRkVSLG4sZS5TVEFUSUNfRFJBVyksdGhpcy5jaGVja0Vycm9yKCksdH1jcmVhdGVGcmFtZWJ1ZmZlcigpe2NvbnN0IGU9dGhpcy5nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO2lmKCFlKXRocm93IG5ldyBFcnJvcigiY3JlYXRlRnJhbWVidWZmZXIgcmV0dXJuZWQgbnVsbCIpO3JldHVybiBlfXF1ZXJ5Vml0YWxQYXJhbWV0ZXJzKCl7Y29uc3QgZT10aGlzLmdsO2lmKHRoaXMuaXNGbG9hdFRleHR1cmVBdHRhY2hhYmxlVG9GcmFtZUJ1ZmZlcj10aGlzLmNoZWNrRmxvYXRUZXh0dXJlQXR0YWNoYWJsZVRvRnJhbWVCdWZmZXIoKSx0aGlzLmlzUmVuZGVyRmxvYXQzMlN1cHBvcnRlZD10aGlzLmNoZWNrUmVuZGVyRmxvYXQzMigpLHRoaXMuaXNGbG9hdDMyRG93bmxvYWRTdXBwb3J0ZWQ9dGhpcy5jaGVja0Zsb2F0MzJEb3dubG9hZCgpLDE9PT10aGlzLnZlcnNpb24mJiF0aGlzLnRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb24mJiF0aGlzLmlzUmVuZGVyRmxvYXQzMlN1cHBvcnRlZCl0aHJvdyBuZXcgRXJyb3IoImJvdGggZmxvYXQzMiBhbmQgZmxvYXQxNiBUZXh0dXJlVHlwZSBhcmUgbm90IHN1cHBvcnRlZCIpO3RoaXMuaXNCbGVuZFN1cHBvcnRlZD0hdGhpcy5pc1JlbmRlckZsb2F0MzJTdXBwb3J0ZWR8fHRoaXMuY2hlY2tGbG9hdDMyQmxlbmQoKSx0aGlzLm1heFRleHR1cmVTaXplPWUuZ2V0UGFyYW1ldGVyKGUuTUFYX1RFWFRVUkVfU0laRSksdGhpcy5tYXhUZXh0dXJlSW1hZ2VVbml0cz1lLmdldFBhcmFtZXRlcihlLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKSx0aGlzLnZlcnNpb247fWdldEV4dGVuc2lvbnMoKXsyPT09dGhpcy52ZXJzaW9uPyh0aGlzLmNvbG9yQnVmZmVyRmxvYXRFeHRlbnNpb249dGhpcy5nbC5nZXRFeHRlbnNpb24oIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKSx0aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbj10aGlzLmdsLmdldEV4dGVuc2lvbigiRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5X3dlYmdsMiIpKToodGhpcy50ZXh0dXJlRmxvYXRFeHRlbnNpb249dGhpcy5nbC5nZXRFeHRlbnNpb24oIk9FU190ZXh0dXJlX2Zsb2F0IiksdGhpcy50ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uPXRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IikpO31jaGVja0Zsb2F0VGV4dHVyZUF0dGFjaGFibGVUb0ZyYW1lQnVmZmVyKCl7Y29uc3QgZT10aGlzLmdsLHQ9ZS5jcmVhdGVUZXh0dXJlKCk7ZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsdCk7Y29uc3Qgbj0yPT09dGhpcy52ZXJzaW9uP2UuUkdCQTMyRjplLlJHQkE7ZS50ZXhJbWFnZTJEKGUuVEVYVFVSRV8yRCwwLG4sMSwxLDAsZS5SR0JBLGUuRkxPQVQsbnVsbCk7Y29uc3Qgcj1lLmNyZWF0ZUZyYW1lYnVmZmVyKCk7ZS5iaW5kRnJhbWVidWZmZXIoZS5GUkFNRUJVRkZFUixyKSxlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGUuRlJBTUVCVUZGRVIsZS5DT0xPUl9BVFRBQ0hNRU5UMCxlLlRFWFRVUkVfMkQsdCwwKTtjb25zdCBvPWUuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhlLkZSQU1FQlVGRkVSKT09PWUuRlJBTUVCVUZGRVJfQ09NUExFVEU7cmV0dXJuIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELG51bGwpLGUuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsbnVsbCksZS5kZWxldGVUZXh0dXJlKHQpLGUuZGVsZXRlRnJhbWVidWZmZXIociksb31jaGVja1JlbmRlckZsb2F0MzIoKXtpZigyPT09dGhpcy52ZXJzaW9uKXtpZighdGhpcy5jb2xvckJ1ZmZlckZsb2F0RXh0ZW5zaW9uKXJldHVybiAhMX1lbHNlIGlmKCF0aGlzLnRleHR1cmVGbG9hdEV4dGVuc2lvbilyZXR1cm4gITE7cmV0dXJuIHRoaXMuaXNGbG9hdFRleHR1cmVBdHRhY2hhYmxlVG9GcmFtZUJ1ZmZlcn1jaGVja0Zsb2F0MzJEb3dubG9hZCgpe2lmKDI9PT10aGlzLnZlcnNpb24pe2lmKCF0aGlzLmNvbG9yQnVmZmVyRmxvYXRFeHRlbnNpb24pcmV0dXJuICExfWVsc2Uge2lmKCF0aGlzLnRleHR1cmVGbG9hdEV4dGVuc2lvbilyZXR1cm4gITE7aWYoIXRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9jb2xvcl9idWZmZXJfZmxvYXQiKSlyZXR1cm4gITF9cmV0dXJuIHRoaXMuaXNGbG9hdFRleHR1cmVBdHRhY2hhYmxlVG9GcmFtZUJ1ZmZlcn1jaGVja0Zsb2F0MzJCbGVuZCgpe2NvbnN0IGU9dGhpcy5nbDtsZXQgdCxuLHIsbyxpO3RyeXt0PWUuY3JlYXRlVGV4dHVyZSgpLG49ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpLGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELHQpO2NvbnN0IHM9Mj09PXRoaXMudmVyc2lvbj9lLlJHQkEzMkY6ZS5SR0JBO3JldHVybiBlLnRleEltYWdlMkQoZS5URVhUVVJFXzJELDAscywxLDEsMCxlLlJHQkEsZS5GTE9BVCxudWxsKSxlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLG4pLGUuZnJhbWVidWZmZXJUZXh0dXJlMkQoZS5GUkFNRUJVRkZFUixlLkNPTE9SX0FUVEFDSE1FTlQwLGUuVEVYVFVSRV8yRCx0LDApLGUuZW5hYmxlKGUuQkxFTkQpLHI9ZS5jcmVhdGVTaGFkZXIoZS5WRVJURVhfU0hBREVSKSwhIXImJihlLnNoYWRlclNvdXJjZShyLCJ2b2lkIG1haW4oKXt9IiksZS5jb21waWxlU2hhZGVyKHIpLG89ZS5jcmVhdGVTaGFkZXIoZS5GUkFHTUVOVF9TSEFERVIpLCEhbyYmKGUuc2hhZGVyU291cmNlKG8sInByZWNpc2lvbiBoaWdocCBmbG9hdDt2b2lkIG1haW4oKXtnbF9GcmFnQ29sb3I9dmVjNCgwLjUpO30iKSxlLmNvbXBpbGVTaGFkZXIobyksaT1lLmNyZWF0ZVByb2dyYW0oKSwhIWkmJihlLmF0dGFjaFNoYWRlcihpLHIpLGUuYXR0YWNoU2hhZGVyKGksbyksZS5saW5rUHJvZ3JhbShpKSxlLnVzZVByb2dyYW0oaSksZS5kcmF3QXJyYXlzKGUuUE9JTlRTLDAsMSksZS5nZXRFcnJvcigpPT09ZS5OT19FUlJPUikpKX1maW5hbGx5e2UuZGlzYWJsZShlLkJMRU5EKSxpJiZlLmRlbGV0ZVByb2dyYW0oaSksciYmZS5kZWxldGVTaGFkZXIociksbyYmZS5kZWxldGVTaGFkZXIobyksbiYmKGUuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsbnVsbCksZS5kZWxldGVGcmFtZWJ1ZmZlcihuKSksdCYmKGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELG51bGwpLGUuZGVsZXRlVGV4dHVyZSh0KSk7fX1iZWdpblRpbWVyKCl7aWYoMj09PXRoaXMudmVyc2lvbiYmdGhpcy5kaXNqb2ludFRpbWVyUXVlcnlXZWJnbDJFeHRlbnNpb24pe2NvbnN0IGU9dGhpcy5nbCx0PXRoaXMuZGlzam9pbnRUaW1lclF1ZXJ5V2ViZ2wyRXh0ZW5zaW9uLG49ZS5jcmVhdGVRdWVyeSgpO3JldHVybiBlLmJlZ2luUXVlcnkodC5USU1FX0VMQVBTRURfRVhULG4pLG59dGhyb3cgbmV3IEVycm9yKCJXZWJHTDEgcHJvZmlsaW5nIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLiIpfWVuZFRpbWVyKCl7aWYoMiE9PXRoaXMudmVyc2lvbnx8IXRoaXMuZGlzam9pbnRUaW1lclF1ZXJ5V2ViZ2wyRXh0ZW5zaW9uKXRocm93IG5ldyBFcnJvcigiV2ViR0wxIHByb2ZpbGluZyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCIpO3tjb25zdCBlPXRoaXMuZ2wsdD10aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbjtlLmVuZFF1ZXJ5KHQuVElNRV9FTEFQU0VEX0VYVCk7fX1pc1RpbWVyUmVzdWx0QXZhaWxhYmxlKGUpe2xldCB0PSExLG49ITE7aWYoMiE9PXRoaXMudmVyc2lvbnx8IXRoaXMuZGlzam9pbnRUaW1lclF1ZXJ5V2ViZ2wyRXh0ZW5zaW9uKXRocm93IG5ldyBFcnJvcigiV2ViR0wxIHByb2ZpbGluZyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCIpO3tjb25zdCByPXRoaXMuZ2wsbz10aGlzLmRpc2pvaW50VGltZXJRdWVyeVdlYmdsMkV4dGVuc2lvbjt0PXIuZ2V0UXVlcnlQYXJhbWV0ZXIoZSxyLlFVRVJZX1JFU1VMVF9BVkFJTEFCTEUpLG49ci5nZXRQYXJhbWV0ZXIoby5HUFVfRElTSk9JTlRfRVhUKTt9cmV0dXJuIHQmJiFufWdldFRpbWVyUmVzdWx0KGUpe2xldCB0PTA7aWYoMiE9PXRoaXMudmVyc2lvbil0aHJvdyBuZXcgRXJyb3IoIldlYkdMMSBwcm9maWxpbmcgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQiKTt7Y29uc3Qgbj10aGlzLmdsO3Q9bi5nZXRRdWVyeVBhcmFtZXRlcihlLG4uUVVFUllfUkVTVUxUKSxuLmRlbGV0ZVF1ZXJ5KGUpO31yZXR1cm4gdC8xZTZ9YXN5bmMgd2FpdEZvclF1ZXJ5QW5kR2V0VGltZShlKXtyZXR1cm4gYXdhaXQoMCwgdS5yZXBlYXRlZFRyeSkoKCgpPT50aGlzLmlzVGltZXJSZXN1bHRBdmFpbGFibGUoZSkpKSx0aGlzLmdldFRpbWVyUmVzdWx0KGUpfWFzeW5jIGNyZWF0ZUFuZFdhaXRGb3JGZW5jZSgpe2NvbnN0IGU9dGhpcy5jcmVhdGVGZW5jZSh0aGlzLmdsKTtyZXR1cm4gdGhpcy5wb2xsRmVuY2UoZSl9Y3JlYXRlRmVuY2UoZSl7bGV0IHQ7Y29uc3Qgbj1lLHI9bi5mZW5jZVN5bmMobi5TWU5DX0dQVV9DT01NQU5EU19DT01QTEVURSwwKTtyZXR1cm4gZS5mbHVzaCgpLHQ9bnVsbD09PXI/KCk9PiEwOigpPT57Y29uc3QgZT1uLmNsaWVudFdhaXRTeW5jKHIsMCwwKTtyZXR1cm4gZT09PW4uQUxSRUFEWV9TSUdOQUxFRHx8ZT09PW4uQ09ORElUSU9OX1NBVElTRklFRH0se3F1ZXJ5OnIsaXNGZW5jZVBhc3NlZDp0fX1hc3luYyBwb2xsRmVuY2UoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0PT57dGhpcy5hZGRJdGVtVG9Qb2xsKCgoKT0+ZS5pc0ZlbmNlUGFzc2VkKCkpLCgoKT0+dCgpKSk7fSkpfXBvbGxJdGVtcygpe2NvbnN0IGU9bCh0aGlzLml0ZW1zVG9Qb2xsLm1hcCgoZT0+ZS5pc0RvbmVGbikpKTtmb3IobGV0IHQ9MDt0PD1lOysrdCl7Y29uc3R7cmVzb2x2ZUZuOmV9PXRoaXMuaXRlbXNUb1BvbGxbdF07ZSgpO310aGlzLml0ZW1zVG9Qb2xsPXRoaXMuaXRlbXNUb1BvbGwuc2xpY2UoZSsxKTt9YXN5bmMgYWRkSXRlbVRvUG9sbChlLHQpe3RoaXMuaXRlbXNUb1BvbGwucHVzaCh7aXNEb25lRm46ZSxyZXNvbHZlRm46dH0pLHRoaXMuaXRlbXNUb1BvbGwubGVuZ3RoPjF8fGF3YWl0KDAsIHUucmVwZWF0ZWRUcnkpKCgoKT0+KHRoaXMucG9sbEl0ZW1zKCksMD09PXRoaXMuaXRlbXNUb1BvbGwubGVuZ3RoKSkpO319O30sNjQ5NjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuRXhlY3V0aW9uUGxhbj12b2lkIDA7Y29uc3Qgcj1uKDEzMTUpO2NsYXNzIG97Y29uc3RydWN0b3IoZSx0KXt0aGlzLm9wPWUsdGhpcy5ub2RlPXQ7fX10LkV4ZWN1dGlvblBsYW49Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuZ3JhcGg9ZSx0aGlzLnByb2ZpbGVyPW4sdGhpcy5pbml0aWFsaXplKHQpO31pbml0aWFsaXplKGUpe3RoaXMucHJvZmlsZXIuZXZlbnQoInNlc3Npb24iLCJFeGVjdXRpb25QbGFuLmluaXRpYWxpemUiLCgoKT0+e2NvbnN0IHQ9dGhpcy5ncmFwaC5nZXROb2RlcygpO2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgc2l6ZSBvZiBub2RlcyBhbmQgT1BzIGRvIG5vdCBtYXRjaC4iKTt0aGlzLl9vcHM9ZS5tYXAoKChlLG4pPT5uZXcgbyhlLHRbbl0pKSksdGhpcy5yZXNldCgpLHRoaXMuX3N0YXJ0ZXI9W10sdGhpcy5fb3BzLmZvckVhY2goKChlLHQpPT57bGV0IG49ITA7Zm9yKGNvbnN0IHQgb2YgZS5ub2RlLmlucHV0cylpZighdGhpcy5fdmFsdWVzW3RdJiYtMT09PXRoaXMuZ3JhcGguZ2V0SW5wdXRJbmRpY2VzKCkuaW5kZXhPZih0KSl7bj0hMTticmVha31uJiZ0aGlzLl9zdGFydGVyLnB1c2godCk7fSkpO30pKTt9cmVzZXQoKXt0aGlzLl92YWx1ZXM9dGhpcy5ncmFwaC5nZXRWYWx1ZXMoKS5tYXAoKGU9PmUudGVuc29yKSk7fWFzeW5jIGV4ZWN1dGUoZSx0KXtyZXR1cm4gdGhpcy5wcm9maWxlci5ldmVudCgic2Vzc2lvbiIsIkV4ZWN1dGlvblBsYW4uZXhlY3V0ZSIsKGFzeW5jKCk9Pnt0aGlzLnJlc2V0KCk7Y29uc3Qgbj1lLmNyZWF0ZUluZmVyZW5jZUhhbmRsZXIoKSxvPXRoaXMuZ3JhcGguZ2V0SW5wdXRJbmRpY2VzKCk7aWYodC5sZW5ndGghPT1vLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYG51bWJlciBvZiBpbnB1dCB0ZW5zb3JzIGRvbid0IG1hdGNoIHRoZSBudW1iZXIgb2YgaW5wdXRzIHRvIHRoZSBtb2RlbDogYWN0dWFsOiAke3QubGVuZ3RofSBleHBlY3RlZDogJHtvLmxlbmd0aH1gKTt0LmZvckVhY2goKChlLHQpPT57Y29uc3Qgbj1vW3RdO3RoaXMuX3ZhbHVlc1tuXT1lO30pKTtjb25zdCBpPXRoaXMuX3N0YXJ0ZXIuc2xpY2UoMCkscz10aGlzLmdyYXBoLmdldFZhbHVlcygpLGE9dGhpcy5ncmFwaC5nZXROb2RlcygpO2xldCB1PTA7Zm9yKDt1PGkubGVuZ3RoOyl7Y29uc3QgZT1pW3UrK10sdD10aGlzLl9vcHNbZV0sbz10Lm5vZGUuaW5wdXRzLm1hcCgoZT0+dGhpcy5fdmFsdWVzW2VdKSk7aWYoLTEhPT1vLmluZGV4T2Yodm9pZCAwKSl0aHJvdyBuZXcgRXJyb3IoYHVucmVzb2x2ZWQgaW5wdXQgZGV0ZWN0ZWQ6IG9wOiAke3Qubm9kZX1gKTtjb25zdCBsPW87ci5Mb2dnZXIudmVyYm9zZSgiRXhlY1BsYW4iLGBSdW5pbmcgb3A6JHt0Lm5vZGUubmFtZX0gKCR7bC5tYXAoKChlLG4pPT5gJyR7dC5ub2RlLmlucHV0c1tuXX0nOiAke2UudHlwZX1bJHtlLmRpbXMuam9pbigiLCIpfV1gKSkuam9pbigiLCAiKX0pYCk7Y29uc3QgYz1hd2FpdCB0aGlzLnByb2ZpbGVyLmV2ZW50KCJub2RlIix0Lm5vZGUubmFtZSwoYXN5bmMoKT0+dC5vcC5pbXBsKG4sbCx0Lm9wLmNvbnRleHQpKSk7aWYoYy5sZW5ndGghPT10Lm5vZGUub3V0cHV0cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0aGUgc2l6ZSBvZiBvdXRwdXQgZG9lcyBub3QgbWF0Y2ggbW9kZWwgZGVmaW5pdGlvbi4iKTtjLmZvckVhY2goKChlLG4pPT57Y29uc3Qgcj10Lm5vZGUub3V0cHV0c1tuXTtpZih0aGlzLl92YWx1ZXNbcl0pdGhyb3cgbmV3IEVycm9yKGBvdXRwdXQgWyR7cn1dIGFscmVhZHkgaGFzIHZhbHVlOiBvcDoke3Qubm9kZS5uYW1lfWApO3RoaXMuX3ZhbHVlc1tyXT1lO30pKTtjb25zdCBwPW5ldyBTZXQ7Yy5mb3JFYWNoKCgoZSxuKT0+e2NvbnN0IHI9dC5ub2RlLm91dHB1dHNbbl07Zm9yKGNvbnN0IGUgb2Ygc1tyXS50byl7Y29uc3QgdD1hW2VdO2xldCBuPSEwO2Zvcihjb25zdCBlIG9mIHQuaW5wdXRzKWlmKCF0aGlzLl92YWx1ZXNbZV0pe249ITE7YnJlYWt9biYmcC5hZGQoZSk7fX0pKSxpLnB1c2goLi4ucCk7fWNvbnN0IGw9W107Zm9yKGxldCBlPTA7ZTx0aGlzLmdyYXBoLmdldE91dHB1dEluZGljZXMoKS5sZW5ndGg7ZSsrKXtjb25zdCB0PXRoaXMuZ3JhcGguZ2V0T3V0cHV0SW5kaWNlcygpW2VdLG49dGhpcy5fdmFsdWVzW3RdO2lmKHZvaWQgMD09PW4pdGhyb3cgbmV3IEVycm9yKGByZXF1aXJlZCBvdXRwdXQgWyR7dH1dIGRvZXMgbm90IGhhdmUgdmFsdWVgKTswPT09dD9hd2FpdCBuLmdldERhdGEoKTpuLmRhdGEsbC5wdXNoKG4pO31yZXR1cm4gci5Mb2dnZXIudmVyYm9zZSgiRXhlY1BsYW4iLCJkaXNwb3Npbmcgb2YgaW5mZXJlbmNlSGFuZGxlciIpLG4uZGlzcG9zZSgpLGx9KSl9fTt9LDQ2NjI6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkdyYXBoPXZvaWQgMDtjb25zdCByPW4oNjg3NCksbz1uKDUxMjcpLGk9bigyNDQ2KSxzPW4oOTI0MCksYT1uKDcyNzMpO3ZhciB1PW8ub25ueHJ1bnRpbWUuZXhwZXJpbWVudGFsLmZiczt0LkdyYXBoPXtmcm9tOihlLHQpPT5uZXcgcChlLHQpfTtjbGFzcyBse2NvbnN0cnVjdG9yKGUpe3RoaXMuX2Zyb209dm9pZCAwLHRoaXMuX3RvPVtdLHRoaXMudGVuc29yPXZvaWQgMCx0aGlzLnR5cGU9dm9pZCAwLGUmJih0aGlzLnR5cGU9YS5Qcm90b1V0aWwudGVuc29yVmFsdWVUeXBlRnJvbVByb3RvKGUudHlwZS50ZW5zb3JUeXBlKSk7fWdldCBmcm9tKCl7cmV0dXJuIHRoaXMuX2Zyb219Z2V0IHRvKCl7cmV0dXJuIHRoaXMuX3RvfX1jbGFzcyBje2NvbnN0cnVjdG9yKGUsdCl7ZSBpbnN0YW5jZW9mIGkub25ueC5Ob2RlUHJvdG8/KHRoaXMubmFtZT1lLm5hbWUsdGhpcy5vcFR5cGU9ZS5vcFR5cGUsdGhpcy5hdHRyaWJ1dGVzPW5ldyByLkF0dHJpYnV0ZShlLmF0dHJpYnV0ZSkpOmUgaW5zdGFuY2VvZiB1Lk5vZGUmJih0aGlzLm5hbWU9bnVsbCE9dD90OmUubmFtZSgpLHRoaXMub3BUeXBlPWUub3BUeXBlKCksdGhpcy5hdHRyaWJ1dGVzPW5ldyByLkF0dHJpYnV0ZShhLlByb3RvVXRpbC50ZW5zb3JBdHRyaWJ1dGVzRnJvbU9SVEZvcm1hdChlKSkpLHRoaXMuaW5wdXRzPVtdLHRoaXMub3V0cHV0cz1bXSx0aGlzLmV4ZWN1dGVOb2RlPSEwO319Y2xhc3MgcHtjb25zdHJ1Y3RvcihlLHQpe2lmKCFlKXRocm93IG5ldyBUeXBlRXJyb3IoImdyYXBoIGlzIGVtcHR5Iik7dGhpcy5idWlsZEdyYXBoKGUpLHRoaXMudHJhbnNmb3JtR3JhcGgodCksdGhpcy5jaGVja0lzQWN5Y2xpYygpO31nZXRJbnB1dEluZGljZXMoKXtyZXR1cm4gdGhpcy5fYWxsSW5wdXRJbmRpY2VzfWdldElucHV0TmFtZXMoKXtyZXR1cm4gdGhpcy5fYWxsSW5wdXROYW1lc31nZXRPdXRwdXRJbmRpY2VzKCl7cmV0dXJuIHRoaXMuX2FsbE91dHB1dEluZGljZXN9Z2V0T3V0cHV0TmFtZXMoKXtyZXR1cm4gdGhpcy5fYWxsT3V0cHV0TmFtZXN9Z2V0VmFsdWVzKCl7cmV0dXJuIHRoaXMuX2FsbERhdGF9Z2V0Tm9kZXMoKXtyZXR1cm4gdGhpcy5fbm9kZXN9YnVpbGRHcmFwaChlKXtpZihlIGluc3RhbmNlb2YgaS5vbm54LkdyYXBoUHJvdG8pdGhpcy5idWlsZEdyYXBoRnJvbU9ubnhGb3JtYXQoZSk7ZWxzZSB7aWYoIShlIGluc3RhbmNlb2YgdS5HcmFwaCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiR3JhcGggdHlwZSBpcyBub3Qgc3VwcG9ydGVkLiIpO3RoaXMuYnVpbGRHcmFwaEZyb21PcnRGb3JtYXQoZSk7fX1idWlsZEdyYXBoRnJvbU9ubnhGb3JtYXQoZSl7Y29uc3QgdD1uZXcgTWFwO3RoaXMuX2FsbERhdGE9W10sdGhpcy5fYWxsSW5wdXRJbmRpY2VzPVtdLHRoaXMuX2FsbElucHV0TmFtZXM9W10sdGhpcy5fYWxsT3V0cHV0SW5kaWNlcz1bXSx0aGlzLl9hbGxPdXRwdXROYW1lcz1bXSx0aGlzLl9ub2Rlcz1bXTtjb25zdCBuPW5ldyBNYXA7aWYoIWUuaW5wdXQpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIGluZm9ybWF0aW9uIGluIGdyYXBoOiBpbnB1dCIpO2NvbnN0IHI9W107Zm9yKGNvbnN0IG4gb2YgZS5pbnB1dCl7aWYodC5oYXMobi5uYW1lKSl0aHJvdyBuZXcgRXJyb3IoYGR1cGxpY2F0ZWQgaW5wdXQgbmFtZTogJHtuLm5hbWV9YCk7Y29uc3QgZT10aGlzLl9hbGxEYXRhLnB1c2gobmV3IGwobikpLTE7dC5zZXQobi5uYW1lLGUpLHIucHVzaChuLm5hbWUpO31pZighZS5pbml0aWFsaXplcil0aHJvdyBuZXcgRXJyb3IoIm1pc3NpbmcgaW5mb3JtYXRpb24gaW4gZ3JhcGg6IGluaXRpYWxpemVyIik7Zm9yKGNvbnN0IG4gb2YgZS5pbml0aWFsaXplcil7bGV0IGU9dC5nZXQobi5uYW1lKTtpZih2b2lkIDA9PT1lKXtjb25zdCByPW5ldyBsO3IudHlwZT17c2hhcGU6e2RpbXM6YS5Qcm90b1V0aWwudGVuc29yRGltc0Zyb21Qcm90byhuLmRpbXMpfSx0ZW5zb3JUeXBlOmEuUHJvdG9VdGlsLnRlbnNvckRhdGFUeXBlRnJvbVByb3RvKG4uZGF0YVR5cGUpfSxlPXRoaXMuX2FsbERhdGEucHVzaChyKS0xLHQuc2V0KG4ubmFtZSxlKTt9dGhpcy5fYWxsRGF0YVtlXS5fZnJvbT0tMSx0aGlzLl9hbGxEYXRhW2VdLnRlbnNvcj1zLlRlbnNvci5mcm9tUHJvdG8obik7fWZvcihsZXQgZT0wO2U8dGhpcy5fYWxsRGF0YS5sZW5ndGg7ZSsrKXRoaXMuX2FsbERhdGFbZV0udGVuc29yfHwodGhpcy5fYWxsSW5wdXRJbmRpY2VzLnB1c2goZSksdGhpcy5fYWxsSW5wdXROYW1lcy5wdXNoKHJbZV0pKTtpZighZS5vdXRwdXQpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIGluZm9ybWF0aW9uIGluIGdyYXBoOiBvdXRwdXQiKTtmb3IoY29uc3QgbiBvZiBlLm91dHB1dCl7aWYodC5oYXMobi5uYW1lKSl0aHJvdyBuZXcgRXJyb3IoYGR1cGxpY2F0ZWQgb3V0cHV0IG5hbWU6ICR7bi5uYW1lfWApO2NvbnN0IGU9dGhpcy5fYWxsRGF0YS5wdXNoKG5ldyBsKG4pKS0xO3Quc2V0KG4ubmFtZSxlKSx0aGlzLl9hbGxPdXRwdXRJbmRpY2VzLnB1c2goZSksdGhpcy5fYWxsT3V0cHV0TmFtZXMucHVzaChuLm5hbWUpO31pZighZS5ub2RlKXRocm93IG5ldyBFcnJvcigibWlzc2luZyBpbmZvcm1hdGlvbiBpbiBncmFwaDogbm9kZSIpO2Zvcihjb25zdCB0IG9mIGUubm9kZSl7aWYoIXQubmFtZSlmb3IobGV0IGU9MDs7ZSsrKXtjb25zdCByPWB1bm5hbWVkXyR7dC5vcFR5cGV9XyR7ZX1gO2lmKCFuLmhhcyhyKSl7dC5uYW1lPXI7YnJlYWt9fWlmKG4uaGFzKHQubmFtZSkpdGhyb3cgbmV3IEVycm9yKGBkdXBsaWNhdGVkIG5vZGUgbmFtZTogJHt0Lm5hbWV9YCk7Y29uc3QgZT10aGlzLl9ub2Rlcy5wdXNoKG5ldyBjKHQpKS0xO24uc2V0KHQubmFtZSxlKTt9Zm9yKGxldCBuPTA7bjx0aGlzLl9ub2Rlcy5sZW5ndGg7bisrKXtjb25zdCByPXRoaXMuX25vZGVzW25dLG89ZS5ub2RlW25dO2lmKCFvLm91dHB1dCl0aHJvdyBuZXcgRXJyb3IoYG1pc3Npbmcgb3V0cHV0IGZvciBub2RlOiAke28ubmFtZX1gKTtmb3IoY29uc3QgZSBvZiBvLm91dHB1dCl7bGV0IGk9dC5nZXQoZSk7aWYodm9pZCAwPT09aSYmKGk9dGhpcy5fYWxsRGF0YS5wdXNoKG5ldyBsKS0xLHQuc2V0KGUsaSkpLHIub3V0cHV0cy5wdXNoKGkpLHZvaWQgMCE9PXRoaXMuX2FsbERhdGFbaV0uX2Zyb20pdGhyb3cgbmV3IEVycm9yKGBtdWx0aXBsZSBub2RlcyBvdXRwdXQgdG8gb25lIGRhdGEgdmFsdWU6ICR7aX1gKTtpZih0aGlzLl9hbGxEYXRhW2ldLl9mcm9tPW4sIkNvbnN0YW50Ij09PW8ub3BUeXBlKXtpZighby5hdHRyaWJ1dGV8fDEhPT1vLmF0dHJpYnV0ZS5sZW5ndGh8fCFvLmF0dHJpYnV0ZVswXS50KXRocm93IG5ldyBFcnJvcigibWlzc2luZyBhdHRyaWJ1dGVzIG9yIG1pc3NpbmcgdGVuc29yIHZhbHVlIGluIGF0dHJpYnV0ZXMgZm9yIHRoaXMgQ29uc3RhbnQgb3BlcmF0b3IiKTtpZighby5vdXRwdXR8fDEhPT1vLm91dHB1dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIG91dHB1dCBvciBpbmNvcnJlY3QgbnVtYmVyIG9mIG91dHB1dHMgZm9yIHRoaXMgQ29uc3RhbnQgb3BlcmF0b3IiKTtyLm91dHB1dHMucG9wKCksci5leGVjdXRlTm9kZT0hMSx0aGlzLl9hbGxEYXRhW2ldLl9mcm9tPS0xLHRoaXMuX2FsbERhdGFbaV0udGVuc29yPXMuVGVuc29yLmZyb21Qcm90byhvLmF0dHJpYnV0ZVswXS50KTt9fX1mb3IobGV0IG49MDtuPHRoaXMuX25vZGVzLmxlbmd0aDtuKyspe2NvbnN0IHI9dGhpcy5fbm9kZXNbbl0sbz1lLm5vZGVbbl07aWYoIW8uaW5wdXQpdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIGlucHV0IGZvciBub2RlOiAke28ubmFtZX1gKTtmb3IoY29uc3QgZSBvZiBvLmlucHV0KXtjb25zdCBpPXQuZ2V0KGUpO2lmKHZvaWQgMD09PWkpe2lmKCIiPT09ZSYmKDM9PT1vLmlucHV0Lmxlbmd0aHx8ND09PW8uaW5wdXQubGVuZ3RoKSYmIlJlc2l6ZSI9PT1vLm9wVHlwZSljb250aW51ZTt0aHJvdyBuZXcgRXJyb3IoYHVucmVjb2duaXplZCBpbnB1dCAnJHtlfScgZm9yIG5vZGU6ICR7by5uYW1lfWApfXIuaW5wdXRzLnB1c2goaSksdGhpcy5fYWxsRGF0YVtpXS5fdG8ucHVzaChuKTt9fXJldHVybiAhMH1idWlsZEdyYXBoRnJvbU9ydEZvcm1hdChlKXt2YXIgdCxuLHI7Y29uc3Qgbz1uZXcgTWFwO3RoaXMuX2FsbERhdGE9W10sdGhpcy5fYWxsSW5wdXRJbmRpY2VzPVtdLHRoaXMuX2FsbElucHV0TmFtZXM9W10sdGhpcy5fYWxsT3V0cHV0SW5kaWNlcz1bXSx0aGlzLl9hbGxPdXRwdXROYW1lcz1bXSx0aGlzLl9ub2Rlcz1bXTtjb25zdCBpPW5ldyBNYXAscD1bXTtmb3IobGV0IGk9MDtpPGUuaW5wdXRzTGVuZ3RoKCk7aSsrKXtjb25zdCBzPWUuaW5wdXRzKGkpO2lmKG8uaGFzKHMpKXRocm93IG5ldyBFcnJvcihgZHVwbGljYXRlZCBpbnB1dCBuYW1lOiAke3N9YCk7Zm9yKGxldCBpPTA7aTxlLm5vZGVBcmdzTGVuZ3RoKCk7aSsrKWlmKChudWxsPT09KHQ9ZS5ub2RlQXJncyhpKSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQubmFtZSgpKT09PXMpe2NvbnN0IHQ9bmV3IGw7aWYoKG51bGw9PT0ocj1udWxsPT09KG49ZS5ub2RlQXJncyhpKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4udHlwZSgpKXx8dm9pZCAwPT09cj92b2lkIDA6ci52YWx1ZVR5cGUoKSkhPT11LlR5cGVJbmZvVmFsdWUudGVuc29yX3R5cGUpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHZhbHVlIHR5cGUgZm9yIHRoZSBub2RlQXJnLiIpO2NvbnN0IGM9ZS5ub2RlQXJncyhpKS50eXBlKCkudmFsdWUobmV3IHUuVGVuc29yVHlwZUFuZFNoYXBlKSxkPWEuUHJvdG9VdGlsLnRlbnNvckRhdGFUeXBlRnJvbVByb3RvKGMuZWxlbVR5cGUoKSksZj1jLnNoYXBlKCksaD1bXTtmb3IobGV0IGU9MDtlPGYuZGltTGVuZ3RoKCk7ZSsrKWgucHVzaChhLkxvbmdVdGlsLmxvbmdUb051bWJlcihmLmRpbShlKS52YWx1ZSgpLmRpbVZhbHVlKCkpKTt0LnR5cGU9e3NoYXBlOntkaW1zOmh9LHRlbnNvclR5cGU6ZH07Y29uc3QgZz10aGlzLl9hbGxEYXRhLnB1c2godCktMTtvLnNldChzLGcpLHAucHVzaChzKTt9fWZvcihsZXQgdD0wO3Q8ZS5pbml0aWFsaXplcnNMZW5ndGgoKTt0Kyspe2NvbnN0IG49ZS5pbml0aWFsaXplcnModCk7bGV0IHI9by5nZXQobi5uYW1lKCkpO2lmKHZvaWQgMD09PXIpe2NvbnN0IGU9bmV3IGwsdD1hLlByb3RvVXRpbC50ZW5zb3JEaW1zRnJvbU9SVEZvcm1hdChuKSxpPWEuUHJvdG9VdGlsLnRlbnNvckRhdGFUeXBlRnJvbVByb3RvKG4uZGF0YVR5cGUoKSk7ZS50eXBlPXtzaGFwZTp7ZGltczp0fSx0ZW5zb3JUeXBlOml9LHI9dGhpcy5fYWxsRGF0YS5wdXNoKGUpLTEsby5zZXQobi5uYW1lKCkscik7fXRoaXMuX2FsbERhdGFbcl0uX2Zyb209LTEsdGhpcy5fYWxsRGF0YVtyXS50ZW5zb3I9cy5UZW5zb3IuZnJvbU9ydFRlbnNvcihuKTt9Zm9yKGxldCBlPTA7ZTx0aGlzLl9hbGxEYXRhLmxlbmd0aDtlKyspdGhpcy5fYWxsRGF0YVtlXS50ZW5zb3J8fCh0aGlzLl9hbGxJbnB1dEluZGljZXMucHVzaChlKSx0aGlzLl9hbGxJbnB1dE5hbWVzLnB1c2gocFtlXSkpO2ZvcihsZXQgdD0wO3Q8ZS5vdXRwdXRzTGVuZ3RoKCk7dCsrKXtjb25zdCBuPWUub3V0cHV0cyh0KTtpZihvLmhhcyhuKSl0aHJvdyBuZXcgRXJyb3IoYGR1cGxpY2F0ZWQgb3V0cHV0IG5hbWU6ICR7bn1gKTtjb25zdCByPXRoaXMuX2FsbERhdGEucHVzaChuZXcgbCktMTtvLnNldChuLHIpLHRoaXMuX2FsbE91dHB1dEluZGljZXMucHVzaChyKSx0aGlzLl9hbGxPdXRwdXROYW1lcy5wdXNoKG4pO31pZighZS5ub2Rlcyl0aHJvdyBuZXcgRXJyb3IoIm1pc3NpbmcgaW5mb3JtYXRpb24gaW4gZ3JhcGg6IG5vZGUiKTtmb3IobGV0IHQ9MDt0PGUubm9kZXNMZW5ndGgoKTt0Kyspe2NvbnN0IG49ZS5ub2Rlcyh0KTtsZXQgcj1uLm5hbWUoKTtpZighcilmb3IobGV0IGU9MDtyPWB1bm5hbWVkXyR7bi5vcFR5cGUoKX1fJHtlfWAsaS5oYXMocik7ZSsrKTtpZihpLmhhcyhyKSl0aHJvdyBuZXcgRXJyb3IoYGR1cGxpY2F0ZWQgbm9kZSBuYW1lOiAke3J9YCk7Y29uc3Qgbz10aGlzLl9ub2Rlcy5wdXNoKG5ldyBjKG4scikpLTE7aS5zZXQocixvKTt9Zm9yKGxldCB0PTA7dDx0aGlzLl9ub2Rlcy5sZW5ndGg7dCsrKXtjb25zdCBuPXRoaXMuX25vZGVzW3RdLHI9ZS5ub2Rlcyh0KTtpZihudWxsPT1yKXRocm93IG5ldyBFcnJvcihgTm8gbm9kZSBleGlzdHMgYXQgaW5kZXggJHt0fWApO2lmKDA9PT0obnVsbD09cj92b2lkIDA6ci5vdXRwdXRzTGVuZ3RoKCkpKXRocm93IG5ldyBFcnJvcihgbWlzc2luZyBvdXRwdXQgZm9yIG5vZGU6ICR7ci5uYW1lfWApO2ZvcihsZXQgZT0wO2U8KG51bGw9PXI/dm9pZCAwOnIub3V0cHV0c0xlbmd0aCgpKTtlKyspe2NvbnN0IGk9bnVsbD09cj92b2lkIDA6ci5vdXRwdXRzKGUpO2xldCBhPW8uZ2V0KGkpO2lmKHZvaWQgMD09PWEmJihhPXRoaXMuX2FsbERhdGEucHVzaChuZXcgbCktMSxvLnNldChpLGEpKSxuLm91dHB1dHMucHVzaChhKSx2b2lkIDAhPT10aGlzLl9hbGxEYXRhW2FdLl9mcm9tKXRocm93IG5ldyBFcnJvcihgbXVsdGlwbGUgbm9kZXMgb3V0cHV0IHRvIG9uZSBkYXRhIHZhbHVlOiAke2F9YCk7aWYodGhpcy5fYWxsRGF0YVthXS5fZnJvbT10LCJDb25zdGFudCI9PT1yLm9wVHlwZSgpKXtpZigxIT09ci5hdHRyaWJ1dGVzTGVuZ3RoKCl8fCFyLmF0dHJpYnV0ZXMoMCkudCgpKXRocm93IG5ldyBFcnJvcigibWlzc2luZyBhdHRyaWJ1dGVzIG9yIG1pc3NpbmcgdGVuc29yIHZhbHVlIGluIGF0dHJpYnV0ZXMgZm9yIHRoaXMgQ29uc3RhbnQgb3BlcmF0b3IiKTtpZigxIT09ci5vdXRwdXRzTGVuZ3RoKCkpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nIG91dHB1dCBvciBpbmNvcnJlY3QgbnVtYmVyIG9mIG91dHB1dHMgZm9yIHRoaXMgQ29uc3RhbnQgb3BlcmF0b3IiKTtuLm91dHB1dHMucG9wKCksbi5leGVjdXRlTm9kZT0hMSx0aGlzLl9hbGxEYXRhW2FdLl9mcm9tPS0xLHRoaXMuX2FsbERhdGFbYV0udGVuc29yPXMuVGVuc29yLmZyb21PcnRUZW5zb3Ioci5hdHRyaWJ1dGVzKDApLnQoKSk7fX19Zm9yKGxldCB0PTA7dDx0aGlzLl9ub2Rlcy5sZW5ndGg7dCsrKXtjb25zdCBuPXRoaXMuX25vZGVzW3RdLHI9ZS5ub2Rlcyh0KTtpZigwPT09ci5pbnB1dHNMZW5ndGgoKSl0aHJvdyBuZXcgRXJyb3IoYG1pc3NpbmcgaW5wdXQgZm9yIG5vZGU6ICR7ci5uYW1lfWApO2ZvcihsZXQgZT0wO2U8ci5pbnB1dHNMZW5ndGgoKTtlKyspe2NvbnN0IGk9ci5pbnB1dHMoZSkscz1vLmdldChpKTtpZih2b2lkIDA9PT1zKXRocm93IG5ldyBFcnJvcihgdW5yZWNvZ25pemVkIGlucHV0ICcke2l9JyBmb3Igbm9kZTogJHtyLm5hbWUoKX1gKTtuLmlucHV0cy5wdXNoKHMpLHRoaXMuX2FsbERhdGFbc10uX3RvLnB1c2godCk7fX19Y2hlY2tJc0FjeWNsaWMoKXtjb25zdCBlPW5ldyBTZXQ7dGhpcy5fYWxsSW5wdXRJbmRpY2VzLmZvckVhY2goKHQ9Pnt0aGlzLl9hbGxEYXRhW3RdLl90by5mb3JFYWNoKCh0PT57ZS5hZGQodCk7fSkpO30pKTtjb25zdCB0PUFycmF5LmZyb20oZSksbj1uZXcgQXJyYXkodGhpcy5fbm9kZXMubGVuZ3RoKS5maWxsKCJ3aGl0ZSIpO2Zvcig7dC5sZW5ndGg+MDspe2NvbnN0IGU9dC5wb3AoKTsiZ3JheSI9PT1uW2VdP25bZV09ImJsYWNrIjoodC5wdXNoKGUpLG5bZV09ImdyYXkiLHRoaXMuX25vZGVzW2VdLm91dHB1dHMuZm9yRWFjaCgocj0+e2NvbnN0IG89dGhpcy5fYWxsRGF0YVtyXTtpZih2b2lkIDAhPT1vLnRlbnNvcil0aHJvdyBuZXcgRXJyb3IoIm5vZGUgb3V0cHV0cyBzaG91bGQgbm90IGJlIGluaXRpYWxpemVkIik7aWYoby5fZnJvbSE9PWUpdGhyb3cgbmV3IEVycm9yKCJmcm9tIHByb3BlcnR5IG9mIHRoZSBWYWx1ZSBvYmplY3QgZG9lc24ndCBtYXRjaCBpbmRleCBvZiBOb2RlIGJlaW5nIHByb2Nlc3NlZCIpO28uX3RvLmZvckVhY2goKGU9PntpZigiZ3JheSI9PT1uW2VdKXRocm93IG5ldyBFcnJvcigibW9kZWwgZ3JhcGggaXMgY3ljbGljIik7IndoaXRlIj09PW5bZV0mJnQucHVzaChlKTt9KSk7fSkpKTt9fXRyYW5zZm9ybUdyYXBoKGUpe3RoaXMucmVtb3ZlQWxsSWRlbnRpdHlOb2RlcygpLHRoaXMucmVtb3ZlQWxsRHJvcG91dE5vZGVzKCksdGhpcy5mdXNlQ29udkFjdGl2YXRpb25Ob2RlcygpLGUmJmUudHJhbnNmb3JtR3JhcGgodGhpcyksdGhpcy5maW5hbGl6ZUdyYXBoKCk7fWZpbmFsaXplR3JhcGgoKXtsZXQgZT0wO2NvbnN0IHQ9bmV3IEFycmF5KHRoaXMuX25vZGVzLmxlbmd0aCwwKTtsZXQgbj0wO2ZvcihsZXQgZT0wO2U8dGhpcy5fbm9kZXMubGVuZ3RoO2UrKyl0W2VdPW4sdGhpcy5fbm9kZXNbZV0uZXhlY3V0ZU5vZGU/KG4hPT1lJiYodGhpcy5fbm9kZXNbbl09dGhpcy5fbm9kZXNbZV0pLG4rKyk6dGhpcy5fbm9kZXNbZV0ub3V0cHV0cy5mb3JFYWNoKChlPT57dGhpcy5fYWxsRGF0YVtlXS5fZnJvbT0tMjt9KSk7dGhpcy5fbm9kZXMuc3BsaWNlKG4sdGhpcy5fbm9kZXMubGVuZ3RoLW4pO2ZvcihsZXQgZT0wO2U8dGhpcy5fYWxsRGF0YS5sZW5ndGg7ZSsrKXtjb25zdCBuPXRoaXMuX2FsbERhdGFbZV07dm9pZCAwIT09bi5fZnJvbSYmLTEhPT1uLl9mcm9tJiYtMiE9PW4uX2Zyb20mJihuLl9mcm9tPXRbbi5fZnJvbV0pO2ZvcihsZXQgZT0wO2U8bi5fdG8ubGVuZ3RoO2UrKyl7aWYoIShuLl90b1tlXT49MCkpdGhyb3cgbmV3IEVycm9yKCJUcnlpbmcgdG8gdXBkYXRlIGEgcmVtb3ZlZCBub2RlIik7bi5fdG9bZV09dFtuLl90b1tlXV07fX1lPTA7Zm9yKGxldCB0PTA7dDx0aGlzLl9hbGxEYXRhLmxlbmd0aDt0KyspaWYoLTIhPT10aGlzLl9hbGxEYXRhW3RdLmZyb218fC0xIT09dGhpcy5fYWxsT3V0cHV0SW5kaWNlcy5pbmRleE9mKHQrZSkpe2lmKGU+MCl7bGV0IG49LTE7dm9pZCAwIT09dGhpcy5fYWxsRGF0YVt0XS5mcm9tJiYtMSE9PXRoaXMuX2FsbERhdGFbdF0uZnJvbT8obj10aGlzLl9ub2Rlc1t0aGlzLl9hbGxEYXRhW3RdLmZyb21dLm91dHB1dHMuaW5kZXhPZih0K2UpLC0xIT09biYmKHRoaXMuX25vZGVzW3RoaXMuX2FsbERhdGFbdF0uZnJvbV0ub3V0cHV0c1tuXT10KSk6KG49dGhpcy5fYWxsSW5wdXRJbmRpY2VzLmluZGV4T2YodCtlKSwtMSE9PW4mJih0aGlzLl9hbGxJbnB1dEluZGljZXNbbl09dCkpLHRoaXMuX2FsbERhdGFbdF0udG8uZm9yRWFjaCgocj0+e249dGhpcy5fbm9kZXNbcl0uaW5wdXRzLmluZGV4T2YodCtlKSwtMSE9PW4mJih0aGlzLl9ub2Rlc1tyXS5pbnB1dHNbbl09dCk7fSkpLDA9PT10aGlzLl9hbGxEYXRhW3RdLnRvLmxlbmd0aCYmKG49dGhpcy5fYWxsT3V0cHV0SW5kaWNlcy5pbmRleE9mKHQrZSksLTEhPT1uJiYodGhpcy5fYWxsT3V0cHV0SW5kaWNlc1tuXT10KSk7fX1lbHNlIGUrKyx0aGlzLl9hbGxEYXRhLnNwbGljZSh0LDEpLHQtLTt9ZGVsZXRlTm9kZShlKXtjb25zdCB0PXRoaXMuX25vZGVzW2VdO2lmKHQub3V0cHV0cy5sZW5ndGg+MSlmb3IobGV0IGU9MTtlPHQub3V0cHV0cy5sZW5ndGg7ZSsrKWlmKHRoaXMuX2FsbERhdGFbdC5vdXRwdXRzW2VdXS50by5sZW5ndGg+MCl0aHJvdyBuZXcgRXJyb3IoIk5vZGUgZGVsZXRpb24gd2l0aCBtb3JlIHRoYW4gb25lIG91dHB1dCBjb25uZWN0ZWQgdG8gb3RoZXIgbm9kZXMgaXMgbm90IHN1cHBvcnRlZC4gIik7dC5leGVjdXRlTm9kZT0hMTtjb25zdCBuPXQuaW5wdXRzWzBdLHI9dC5vdXRwdXRzWzBdLG89dGhpcy5fYWxsRGF0YVtyXS50bztmb3IobGV0IG49MDtuPHQuaW5wdXRzLmxlbmd0aDtuKyspe2NvbnN0IHI9dGhpcy5fYWxsRGF0YVt0LmlucHV0c1tuXV0udG8uaW5kZXhPZihlKTtpZigtMT09PXIpdGhyb3cgbmV3IEVycm9yKCJUaGUgVmFsdWUgb2JqZWN0IGRvZXNuJ3QgaGF2ZSB0aGUgY3VycmVudCBOb2RlIGluIGl0J3MgJ3RvJyBwcm9wZXJ0eSAiKTt0aGlzLl9hbGxEYXRhW3QuaW5wdXRzW25dXS50by5zcGxpY2UociwxKTt9dGhpcy5fYWxsRGF0YVtyXS5fdG89W107Y29uc3QgaT10aGlzLl9hbGxPdXRwdXRJbmRpY2VzLmluZGV4T2Yocik7aWYoLTEhPT1pJiYodGhpcy5fYWxsT3V0cHV0SW5kaWNlc1tpXT1uKSxvJiZvLmxlbmd0aD4wKWZvcihjb25zdCBlIG9mIG8pe2NvbnN0IHQ9dGhpcy5fbm9kZXNbZV0uaW5wdXRzLmluZGV4T2Yocik7aWYoLTE9PT10KXRocm93IG5ldyBFcnJvcigiVGhlIE5vZGUgb2JqZWN0IGRvZXNuJ3QgaGF2ZSB0aGUgb3V0cHV0IFZhbHVlIGluIGl0J3MgJ2lucHV0cycgcHJvcGVydHkgIik7dGhpcy5fbm9kZXNbZV0uaW5wdXRzW3RdPW4sdGhpcy5fYWxsRGF0YVtuXS50by5wdXNoKGUpO319cmVtb3ZlQWxsRHJvcG91dE5vZGVzKCl7bGV0IGU9MDtmb3IoY29uc3QgdCBvZiB0aGlzLl9ub2Rlcyl7aWYoIkRyb3BvdXQiPT09dC5vcFR5cGUpe2lmKDEhPT10LmlucHV0cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJEcm9wb3V0IG5vZGVzIHNob3VsZCBvbmx5IGNvbnRhaW4gb25lIGlucHV0LiAiKTtpZigxIT09dC5vdXRwdXRzLmxlbmd0aCYmMiE9PXQub3V0cHV0cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJEcm9wb3V0IG5vZGVzIHNob3VsZCBjb250YWluIGVpdGhlciAxIG9yIDIgb3V0cHV0KHMpIik7aWYoMj09PXQub3V0cHV0cy5sZW5ndGgmJjAhPT10aGlzLl9hbGxEYXRhW3Qub3V0cHV0c1sxXV0uX3RvLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkRyb3BvdXQgbm9kZXMncyBzZWNvbmQgb3V0cHV0IHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBieSBvdGhlciBub2RlcyIpO3RoaXMuZGVsZXRlTm9kZShlKTt9ZSsrO319cmVtb3ZlQWxsSWRlbnRpdHlOb2Rlcygpe2xldCBlPTA7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fbm9kZXMpIklkZW50aXR5Ij09PXQub3BUeXBlJiZ0aGlzLmRlbGV0ZU5vZGUoZSksZSsrO31pc0FjdGl2YXRpb24oZSl7c3dpdGNoKGUub3BUeXBlKXtjYXNlIlJlbHUiOmNhc2UiU2lnbW9pZCI6Y2FzZSJDbGlwIjpyZXR1cm4gITA7ZGVmYXVsdDpyZXR1cm4gITF9fWZ1c2VDb252QWN0aXZhdGlvbk5vZGVzKCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5fbm9kZXMpaWYoIkNvbnYiPT09ZS5vcFR5cGUpe2NvbnN0IHQ9dGhpcy5fYWxsRGF0YVtlLm91dHB1dHNbMF1dLl90bztpZigxPT09dC5sZW5ndGgmJnRoaXMuaXNBY3RpdmF0aW9uKHRoaXMuX25vZGVzW3RbMF1dKSl7Y29uc3Qgbj10aGlzLl9ub2Rlc1t0WzBdXTtpZigiQ2xpcCI9PT1uLm9wVHlwZSlpZigxPT09bi5pbnB1dHMubGVuZ3RoKXRyeXtlLmF0dHJpYnV0ZXMuc2V0KCJhY3RpdmF0aW9uX3BhcmFtcyIsImZsb2F0cyIsW24uYXR0cmlidXRlcy5nZXRGbG9hdCgibWluIiksbi5hdHRyaWJ1dGVzLmdldEZsb2F0KCJtYXgiKV0pO31jYXRjaCh0KXtlLmF0dHJpYnV0ZXMuc2V0KCJhY3RpdmF0aW9uX3BhcmFtcyIsImZsb2F0cyIsW2EuTUlOX0NMSVAsYS5NQVhfQ0xJUF0pO31lbHNlIHtpZighKG4uaW5wdXRzLmxlbmd0aD49MyYmdm9pZCAwIT09dGhpcy5fYWxsRGF0YVtuLmlucHV0c1sxXV0udGVuc29yJiZ2b2lkIDAhPT10aGlzLl9hbGxEYXRhW24uaW5wdXRzWzJdXS50ZW5zb3IpKWNvbnRpbnVlO2UuYXR0cmlidXRlcy5zZXQoImFjdGl2YXRpb25fcGFyYW1zIiwiZmxvYXRzIixbdGhpcy5fYWxsRGF0YVtuLmlucHV0c1sxXV0udGVuc29yLmZsb2F0RGF0YVswXSx0aGlzLl9hbGxEYXRhW24uaW5wdXRzWzJdXS50ZW5zb3IuZmxvYXREYXRhWzBdXSk7fWUuYXR0cmlidXRlcy5zZXQoImFjdGl2YXRpb24iLCJzdHJpbmciLG4ub3BUeXBlKSx0aGlzLmRlbGV0ZU5vZGUodFswXSk7fX19fX0sMTMxNTooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lm5vdz10LlByb2ZpbGVyPXQuTG9nZ2VyPXZvaWQgMDtjb25zdCBuPXt2ZXJib3NlOjFlMyxpbmZvOjJlMyx3YXJuaW5nOjRlMyxlcnJvcjo1ZTMsZmF0YWw6NmUzfSxyPXtub25lOm5ldyBjbGFzc3tsb2coZSx0LG4pe319LGNvbnNvbGU6bmV3IGNsYXNze2xvZyhlLHQsbil7Y29uc29sZS5sb2coYCR7dGhpcy5jb2xvcihlKX0gJHtuPyIbWzM1bSIrbisiG1swbSAiOiIifSR7dH1gKTt9Y29sb3IoZSl7c3dpdGNoKGUpe2Nhc2UidmVyYm9zZSI6cmV0dXJuICIbWzM0OzQwbXYbWzBtIjtjYXNlImluZm8iOnJldHVybiAiG1szMm1pG1swbSI7Y2FzZSJ3YXJuaW5nIjpyZXR1cm4gIhtbMzA7NDNtdxtbMG0iO2Nhc2UiZXJyb3IiOnJldHVybiAiG1szMTs0MG1lG1swbSI7Y2FzZSJmYXRhbCI6cmV0dXJuICIbWzEwMW1mG1swbSI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHNldmVyaXR5OiAke2V9YCl9fX19LG89e3Byb3ZpZGVyOiJjb25zb2xlIixtaW5pbWFsU2V2ZXJpdHk6Indhcm5pbmciLGxvZ0RhdGVUaW1lOiEwLGxvZ1NvdXJjZUxvY2F0aW9uOiExfTtsZXQgaT17IiI6b307ZnVuY3Rpb24gcyhlLHQsbixyKXtpZih2b2lkIDA9PT10KXJldHVybiBvPWUse3ZlcmJvc2U6cy52ZXJib3NlLmJpbmQobnVsbCxvKSxpbmZvOnMuaW5mby5iaW5kKG51bGwsbyksd2FybmluZzpzLndhcm5pbmcuYmluZChudWxsLG8pLGVycm9yOnMuZXJyb3IuYmluZChudWxsLG8pLGZhdGFsOnMuZmF0YWwuYmluZChudWxsLG8pfTtpZih2b2lkIDA9PT1uKWEoZSx0KTtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgbiYmdm9pZCAwPT09cilhKGUsdCk7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIG4mJnZvaWQgMD09PXIpYShlLG4sMCx0KTtlbHNlIHtpZigic3RyaW5nIiE9dHlwZW9mIG58fCJudW1iZXIiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBpcyB2YWxpZCIpO2EoZSxuLDAsdCk7fXZhciBvO31mdW5jdGlvbiBhKGUsdCxvLHMpe2NvbnN0IGE9aVtzfHwiIl18fGlbIiJdO25bZV08blthLm1pbmltYWxTZXZlcml0eV18fChhLmxvZ0RhdGVUaW1lJiYodD1gJHsobmV3IERhdGUpLnRvSVNPU3RyaW5nKCl9fCR7dH1gKSxhLmxvZ1NvdXJjZUxvY2F0aW9uLHJbYS5wcm92aWRlcl0ubG9nKGUsdCxzKSk7fSFmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe2k9e30sbigiIixlfHx7fSk7fWZ1bmN0aW9uIG4oZSxuKXtpZigiKiI9PT1lKXQobik7ZWxzZSB7Y29uc3QgdD1pW2VdfHxvO2lbZV09e3Byb3ZpZGVyOm4ucHJvdmlkZXJ8fHQucHJvdmlkZXIsbWluaW1hbFNldmVyaXR5Om4ubWluaW1hbFNldmVyaXR5fHx0Lm1pbmltYWxTZXZlcml0eSxsb2dEYXRlVGltZTp2b2lkIDA9PT1uLmxvZ0RhdGVUaW1lP3QubG9nRGF0ZVRpbWU6bi5sb2dEYXRlVGltZSxsb2dTb3VyY2VMb2NhdGlvbjp2b2lkIDA9PT1uLmxvZ1NvdXJjZUxvY2F0aW9uP3QubG9nU291cmNlTG9jYXRpb246bi5sb2dTb3VyY2VMb2NhdGlvbn07fX1lLnZlcmJvc2U9ZnVuY3Rpb24odCxuKXtlKCJ2ZXJib3NlIix0LG4pO30sZS5pbmZvPWZ1bmN0aW9uKHQsbil7ZSgiaW5mbyIsdCxuKTt9LGUud2FybmluZz1mdW5jdGlvbih0LG4pe2UoIndhcm5pbmciLHQsbik7fSxlLmVycm9yPWZ1bmN0aW9uKHQsbil7ZSgiZXJyb3IiLHQsbik7fSxlLmZhdGFsPWZ1bmN0aW9uKHQsbil7ZSgiZmF0YWwiLHQsbik7fSxlLnJlc2V0PXQsZS5zZXQ9bixlLnNldFdpdGhFbnY9ZnVuY3Rpb24oZSl7Y29uc3QgdD17fTtlLmxvZ0xldmVsJiYodC5taW5pbWFsU2V2ZXJpdHk9ZS5sb2dMZXZlbCksbigiIix0KTt9O30oc3x8KHM9e30pKSx0LkxvZ2dlcj1zO2NsYXNzIHV7Y29uc3RydWN0b3IoZSx0LG4scixvLGkpe3RoaXMuY2F0ZWdvcnk9ZSx0aGlzLm5hbWU9dCx0aGlzLnN0YXJ0VGltZT1uLHRoaXMuZW5kQ2FsbGJhY2s9cix0aGlzLnRpbWVyPW8sdGhpcy5jdHg9aTt9YXN5bmMgZW5kKCl7cmV0dXJuIHRoaXMuZW5kQ2FsbGJhY2sodGhpcyl9YXN5bmMgY2hlY2tUaW1lcigpe2lmKHZvaWQgMD09PXRoaXMuY3R4fHx2b2lkIDA9PT10aGlzLnRpbWVyKXRocm93IG5ldyBFcnJvcigiTm8gd2ViZ2wgdGltZXIgZm91bmQiKTtyZXR1cm4gdGhpcy5jdHguZW5kVGltZXIoKSx0aGlzLmN0eC53YWl0Rm9yUXVlcnlBbmRHZXRUaW1lKHRoaXMudGltZXIpfX1jbGFzcyBse2NvbnN0cnVjdG9yKGUsdCxuLHIpe3RoaXMuY2F0ZWdvcnk9ZSx0aGlzLm5hbWU9dCx0aGlzLnN0YXJ0VGltZT1uLHRoaXMuZW5kVGltZT1yO319dC5Qcm9maWxlcj1jbGFzc3tzdGF0aWMgY3JlYXRlKGUpe3JldHVybiB2b2lkIDA9PT1lP25ldyB0aGlzOm5ldyB0aGlzKGUubWF4TnVtYmVyRXZlbnRzLGUuZmx1c2hCYXRjaFNpemUsZS5mbHVzaEludGVydmFsSW5NaWxsaXNlY29uZHMpfWNvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLl9zdGFydGVkPSExLHRoaXMuX2ZsdXNoUG9pbnRlcj0wLHRoaXMuX3N0YXJ0ZWQ9ITEsdGhpcy5fbWF4TnVtYmVyRXZlbnRzPXZvaWQgMD09PWU/MWU0OmUsdGhpcy5fZmx1c2hCYXRjaFNpemU9dm9pZCAwPT09dD8xMDp0LHRoaXMuX2ZsdXNoSW50ZXJ2YWxJbk1pbGxpc2Vjb25kcz12b2lkIDA9PT1uPzVlMzpuO31zdGFydCgpe3RoaXMuX3N0YXJ0ZWQ9ITAsdGhpcy5fdGltaW5nRXZlbnRzPVtdLHRoaXMuX2ZsdXNoVGltZT0oMCwgdC5ub3cpKCksdGhpcy5fZmx1c2hQb2ludGVyPTA7fXN0b3AoKXtmb3IodGhpcy5fc3RhcnRlZD0hMTt0aGlzLl9mbHVzaFBvaW50ZXI8dGhpcy5fdGltaW5nRXZlbnRzLmxlbmd0aDt0aGlzLl9mbHVzaFBvaW50ZXIrKyl0aGlzLmxvZ09uZUV2ZW50KHRoaXMuX3RpbWluZ0V2ZW50c1t0aGlzLl9mbHVzaFBvaW50ZXJdKTt9ZXZlbnQoZSx0LG4scil7Y29uc3Qgbz10aGlzLl9zdGFydGVkP3RoaXMuYmVnaW4oZSx0LHIpOnZvaWQgMDtsZXQgaT0hMTtjb25zdCBzPW4oKTtpZihzJiYiZnVuY3Rpb24iPT10eXBlb2Ygcy50aGVuKXJldHVybiBpPSEwLG5ldyBQcm9taXNlKCgoZSx0KT0+e3MudGhlbigoYXN5bmMgdD0+e28mJmF3YWl0IG8uZW5kKCksZSh0KTt9KSwoYXN5bmMgZT0+e28mJmF3YWl0IG8uZW5kKCksdChlKTt9KSk7fSkpO2lmKCFpJiZvKXtjb25zdCBlPW8uZW5kKCk7aWYoZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbilyZXR1cm4gbmV3IFByb21pc2UoKCh0LG4pPT57ZS50aGVuKCgoKT0+e3Qocyk7fSksKGU9PntuKGUpO30pKTt9KSl9cmV0dXJuIHN9YmVnaW4oZSxuLHIpe2lmKCF0aGlzLl9zdGFydGVkKXRocm93IG5ldyBFcnJvcigicHJvZmlsZXIgaXMgbm90IHN0YXJ0ZWQgeWV0Iik7aWYodm9pZCAwPT09cil7Y29uc3Qgcj0oMCwgdC5ub3cpKCk7cmV0dXJuIHRoaXMuZmx1c2gociksbmV3IHUoZSxuLHIsKGU9PnRoaXMuZW5kU3luYyhlKSkpfXtjb25zdCB0PXIuYmVnaW5UaW1lcigpO3JldHVybiBuZXcgdShlLG4sMCwoYXN5bmMgZT0+dGhpcy5lbmQoZSkpLHQscil9fWFzeW5jIGVuZChlKXtjb25zdCB0PWF3YWl0IGUuY2hlY2tUaW1lcigpO3RoaXMuX3RpbWluZ0V2ZW50cy5sZW5ndGg8dGhpcy5fbWF4TnVtYmVyRXZlbnRzJiYodGhpcy5fdGltaW5nRXZlbnRzLnB1c2gobmV3IGwoZS5jYXRlZ29yeSxlLm5hbWUsZS5zdGFydFRpbWUsdCkpLHRoaXMuZmx1c2godCkpO31lbmRTeW5jKGUpe2NvbnN0IG49KDAsIHQubm93KSgpO3RoaXMuX3RpbWluZ0V2ZW50cy5sZW5ndGg8dGhpcy5fbWF4TnVtYmVyRXZlbnRzJiYodGhpcy5fdGltaW5nRXZlbnRzLnB1c2gobmV3IGwoZS5jYXRlZ29yeSxlLm5hbWUsZS5zdGFydFRpbWUsbikpLHRoaXMuZmx1c2gobikpO31sb2dPbmVFdmVudChlKXt0LkxvZ2dlci52ZXJib3NlKGBQcm9maWxlci4ke2UuY2F0ZWdvcnl9YCxgJHsoZS5lbmRUaW1lLWUuc3RhcnRUaW1lKS50b0ZpeGVkKDIpfW1zIG9uIGV2ZW50ICcke2UubmFtZX0nIGF0ICR7ZS5lbmRUaW1lLnRvRml4ZWQoMil9YCk7fWZsdXNoKGUpe2lmKHRoaXMuX3RpbWluZ0V2ZW50cy5sZW5ndGgtdGhpcy5fZmx1c2hQb2ludGVyPj10aGlzLl9mbHVzaEJhdGNoU2l6ZXx8ZS10aGlzLl9mbHVzaFRpbWU+PXRoaXMuX2ZsdXNoSW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyl7Zm9yKGNvbnN0IGU9dGhpcy5fZmx1c2hQb2ludGVyO3RoaXMuX2ZsdXNoUG9pbnRlcjxlK3RoaXMuX2ZsdXNoQmF0Y2hTaXplJiZ0aGlzLl9mbHVzaFBvaW50ZXI8dGhpcy5fdGltaW5nRXZlbnRzLmxlbmd0aDt0aGlzLl9mbHVzaFBvaW50ZXIrKyl0aGlzLmxvZ09uZUV2ZW50KHRoaXMuX3RpbWluZ0V2ZW50c1t0aGlzLl9mbHVzaFBvaW50ZXJdKTt0aGlzLl9mbHVzaFRpbWU9KDAsIHQubm93KSgpO319Z2V0IHN0YXJ0ZWQoKXtyZXR1cm4gdGhpcy5fc3RhcnRlZH19LHQubm93PSJ1bmRlZmluZWQiIT10eXBlb2YgcGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz8oKT0+cGVyZm9ybWFuY2Uubm93KCk6RGF0ZS5ub3c7fSwxNzQ1OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Nb2RlbD12b2lkIDA7Y29uc3Qgcj1uKDU2ODYpLG89big0NjYyKSxpPW4oNTEyNykscz1uKDI0NDYpLGE9big3MjczKTt2YXIgdT1pLm9ubnhydW50aW1lLmV4cGVyaW1lbnRhbC5mYnM7dC5Nb2RlbD1jbGFzc3tjb25zdHJ1Y3Rvcigpe31sb2FkKGUsdCxuKXtpZighbil0cnl7cmV0dXJuIHZvaWQgdGhpcy5sb2FkRnJvbU9ubnhGb3JtYXQoZSx0KX1jYXRjaChlKXtpZih2b2lkIDAhPT1uKXRocm93IGV9dGhpcy5sb2FkRnJvbU9ydEZvcm1hdChlLHQpO31sb2FkRnJvbU9ubnhGb3JtYXQoZSx0KXtjb25zdCBuPXMub25ueC5Nb2RlbFByb3RvLmRlY29kZShlKTtpZihhLkxvbmdVdGlsLmxvbmdUb051bWJlcihuLmlyVmVyc2lvbik8Myl0aHJvdyBuZXcgRXJyb3IoIm9ubHkgc3VwcG9ydCBPTk5YIG1vZGVsIHdpdGggSVJfVkVSU0lPTj49MyIpO3RoaXMuX29wc2V0cz1uLm9wc2V0SW1wb3J0Lm1hcCgoZT0+KHtkb21haW46ZS5kb21haW4sdmVyc2lvbjphLkxvbmdVdGlsLmxvbmdUb051bWJlcihlLnZlcnNpb24pfSkpKSx0aGlzLl9ncmFwaD1vLkdyYXBoLmZyb20obi5ncmFwaCx0KTt9bG9hZEZyb21PcnRGb3JtYXQoZSx0KXtjb25zdCBuPW5ldyByLmZsYXRidWZmZXJzLkJ5dGVCdWZmZXIoZSksaT11LkluZmVyZW5jZVNlc3Npb24uZ2V0Um9vdEFzSW5mZXJlbmNlU2Vzc2lvbihuKS5tb2RlbCgpO2lmKGEuTG9uZ1V0aWwubG9uZ1RvTnVtYmVyKGkuaXJWZXJzaW9uKCkpPDMpdGhyb3cgbmV3IEVycm9yKCJvbmx5IHN1cHBvcnQgT05OWCBtb2RlbCB3aXRoIElSX1ZFUlNJT04+PTMiKTt0aGlzLl9vcHNldHM9W107Zm9yKGxldCBlPTA7ZTxpLm9wc2V0SW1wb3J0TGVuZ3RoKCk7ZSsrKXtjb25zdCB0PWkub3BzZXRJbXBvcnQoZSk7dGhpcy5fb3BzZXRzLnB1c2goe2RvbWFpbjpudWxsPT10P3ZvaWQgMDp0LmRvbWFpbigpLHZlcnNpb246YS5Mb25nVXRpbC5sb25nVG9OdW1iZXIodC52ZXJzaW9uKCkpfSk7fXRoaXMuX2dyYXBoPW8uR3JhcGguZnJvbShpLmdyYXBoKCksdCk7fWdldCBncmFwaCgpe3JldHVybiB0aGlzLl9ncmFwaH1nZXQgb3BzZXRzKCl7cmV0dXJuIHRoaXMuX29wc2V0c319O30sNjE0NTooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkZMT0FUX1RZUEVTPXQuSU5UX1RZUEVTPXQuTlVNQkVSX1RZUEVTPXZvaWQgMCx0Lk5VTUJFUl9UWVBFUz1bImZsb2F0MzIiLCJmbG9hdDY0IiwiaW50MzIiLCJpbnQxNiIsImludDgiLCJ1aW50MTYiLCJ1aW50MzIiLCJ1aW50OCJdLHQuSU5UX1RZUEVTPVsiaW50MzIiLCJpbnQxNiIsImludDgiLCJ1aW50MTYiLCJ1aW50MzIiLCJ1aW50OCJdLHQuRkxPQVRfVFlQRVM9WyJmbG9hdDMyIiwiZmxvYXQ2NCJdO30sNTg4MTooZSx0KT0+e2Z1bmN0aW9uIG4oZSx0KXtpZih0LmVuZHNXaXRoKCIrIikpe2NvbnN0IG49TnVtYmVyLnBhcnNlSW50KHQuc3Vic3RyaW5nKDAsdC5sZW5ndGgtMSksMTApO3JldHVybiAhaXNOYU4obikmJm48PWV9aWYoMj09PXQuc3BsaXQoIi0iKS5sZW5ndGgpe2NvbnN0IG49dC5zcGxpdCgiLSIpLHI9TnVtYmVyLnBhcnNlSW50KG5bMF0sMTApLG89TnVtYmVyLnBhcnNlSW50KG5bMV0sMTApO3JldHVybiAhaXNOYU4ocikmJiFpc05hTihvKSYmcjw9ZSYmZTw9b31yZXR1cm4gTnVtYmVyLnBhcnNlSW50KHQsMTApPT09ZX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZXNvbHZlT3BlcmF0b3I9dm9pZCAwLHQucmVzb2x2ZU9wZXJhdG9yPWZ1bmN0aW9uKGUsdCxyKXtmb3IoY29uc3QgbyBvZiByKXtjb25zdCByPW9bMF0saT1vWzFdLHM9b1syXSxhPW9bM10sdT1vWzRdO2lmKGUub3BUeXBlPT09cilmb3IoY29uc3QgZSBvZiB0KWlmKChlLmRvbWFpbj09PWl8fCJhaS5vbm54Ij09PWUuZG9tYWluJiYiIj09PWkpJiZuKGUudmVyc2lvbixzKSlyZXR1cm4ge29wSW1wbDphLG9wSW5pdDp1fX10aHJvdyBuZXcgVHlwZUVycm9yKGBjYW5ub3QgcmVzb2x2ZSBvcGVyYXRvciAnJHtlLm9wVHlwZX0nIHdpdGggb3BzZXRzOiAke3QubWFwKChlPT5gJHtlLmRvbWFpbnx8ImFpLm9ubngifSB2JHtlLnZlcnNpb259YCkpLmpvaW4oIiwgIil9YCl9O30sNTEyNzooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQub25ueHJ1bnRpbWU9dm9pZCAwO2NvbnN0IHI9big1Njg2KTt2YXIgbyxpOygoZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpe2VbZS5VTkRFRklORUQ9MF09IlVOREVGSU5FRCIsZVtlLkZMT0FUPTFdPSJGTE9BVCIsZVtlLklOVD0yXT0iSU5UIixlW2UuU1RSSU5HPTNdPSJTVFJJTkciLGVbZS5URU5TT1I9NF09IlRFTlNPUiIsZVtlLkdSQVBIPTVdPSJHUkFQSCIsZVtlLkZMT0FUUz02XT0iRkxPQVRTIixlW2UuSU5UUz03XT0iSU5UUyIsZVtlLlNUUklOR1M9OF09IlNUUklOR1MiLGVbZS5URU5TT1JTPTldPSJURU5TT1JTIixlW2UuR1JBUEhTPTEwXT0iR1JBUEhTIixlW2UuU1BBUlNFX1RFTlNPUj0xMV09IlNQQVJTRV9URU5TT1IiLGVbZS5TUEFSU0VfVEVOU09SUz0xMl09IlNQQVJTRV9URU5TT1JTIjt9KGUuQXR0cmlidXRlVHlwZXx8KGUuQXR0cmlidXRlVHlwZT17fSkpO30pKSgoaT0obz10Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLmV4cGVyaW1lbnRhbHx8KG8uZXhwZXJpbWVudGFsPXt9KSkuZmJzfHwoaS5mYnM9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXtlW2UuVU5LTk9XTj0wXT0iVU5LTk9XTiIsZVtlLlZBTFVFPTFdPSJWQUxVRSIsZVtlLlBBUkFNPTJdPSJQQVJBTSI7fShlLkRpbWVuc2lvblZhbHVlVHlwZXx8KGUuRGltZW5zaW9uVmFsdWVUeXBlPXt9KSk7fShlLmZic3x8KGUuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpe2VbZS5VTkRFRklORUQ9MF09IlVOREVGSU5FRCIsZVtlLkZMT0FUPTFdPSJGTE9BVCIsZVtlLlVJTlQ4PTJdPSJVSU5UOCIsZVtlLklOVDg9M109IklOVDgiLGVbZS5VSU5UMTY9NF09IlVJTlQxNiIsZVtlLklOVDE2PTVdPSJJTlQxNiIsZVtlLklOVDMyPTZdPSJJTlQzMiIsZVtlLklOVDY0PTddPSJJTlQ2NCIsZVtlLlNUUklORz04XT0iU1RSSU5HIixlW2UuQk9PTD05XT0iQk9PTCIsZVtlLkZMT0FUMTY9MTBdPSJGTE9BVDE2IixlW2UuRE9VQkxFPTExXT0iRE9VQkxFIixlW2UuVUlOVDMyPTEyXT0iVUlOVDMyIixlW2UuVUlOVDY0PTEzXT0iVUlOVDY0IixlW2UuQ09NUExFWDY0PTE0XT0iQ09NUExFWDY0IixlW2UuQ09NUExFWDEyOD0xNV09IkNPTVBMRVgxMjgiLGVbZS5CRkxPQVQxNj0xNl09IkJGTE9BVDE2IixlW2UuRkxPQVQ4RTRNM0ZOPTE3XT0iRkxPQVQ4RTRNM0ZOIixlW2UuRkxPQVQ4RTRNM0ZOVVo9MThdPSJGTE9BVDhFNE0zRk5VWiIsZVtlLkZMT0FUOEU1TTI9MTldPSJGTE9BVDhFNU0yIixlW2UuRkxPQVQ4RTVNMkZOVVo9MjBdPSJGTE9BVDhFNU0yRk5VWiI7fShlLlRlbnNvckRhdGFUeXBlfHwoZS5UZW5zb3JEYXRhVHlwZT17fSkpO30oZS5mYnN8fChlLmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXtlW2UuUHJpbWl0aXZlPTBdPSJQcmltaXRpdmUiLGVbZS5GdXNlZD0xXT0iRnVzZWQiO30oZS5Ob2RlVHlwZXx8KGUuTm9kZVR5cGU9e30pKTt9KGUuZmJzfHwoZS5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7ZVtlLk5PTkU9MF09Ik5PTkUiLGVbZS50ZW5zb3JfdHlwZT0xXT0idGVuc29yX3R5cGUiLGVbZS5zZXF1ZW5jZV90eXBlPTJdPSJzZXF1ZW5jZV90eXBlIixlW2UubWFwX3R5cGU9M109Im1hcF90eXBlIjt9KGUuVHlwZUluZm9WYWx1ZXx8KGUuVHlwZUluZm9WYWx1ZT17fSkpO30oZS5mYnN8fChlLmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc1NoYXBlKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNTaGFwZShlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9ZGltKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gcj8obnx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5EaW1lbnNpb24pLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSs0KnQpLHRoaXMuYmIpOm51bGx9ZGltTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXN0YXRpYyBzdGFydFNoYXBlKGUpe2Uuc3RhcnRPYmplY3QoMSk7fXN0YXRpYyBhZGREaW0oZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGNyZWF0ZURpbVZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnREaW1WZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGVuZFNoYXBlKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVTaGFwZShlLHQpe3JldHVybiBuLnN0YXJ0U2hhcGUoZSksbi5hZGREaW0oZSx0KSxuLmVuZFNoYXBlKGUpfX10LlNoYXBlPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzRGltZW5zaW9uKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNEaW1lbnNpb24oZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXZhbHVlKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuRGltZW5zaW9uVmFsdWUpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrbiksdGhpcy5iYik6bnVsbH1kZW5vdGF0aW9uKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9c3RhdGljIHN0YXJ0RGltZW5zaW9uKGUpe2Uuc3RhcnRPYmplY3QoMik7fXN0YXRpYyBhZGRWYWx1ZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkRGVub3RhdGlvbihlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgZW5kRGltZW5zaW9uKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVEaW1lbnNpb24oZSx0LHIpe3JldHVybiBuLnN0YXJ0RGltZW5zaW9uKGUpLG4uYWRkVmFsdWUoZSx0KSxuLmFkZERlbm90YXRpb24oZSxyKSxuLmVuZERpbWVuc2lvbihlKX19dC5EaW1lbnNpb249bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNEaW1lbnNpb25WYWx1ZShlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzRGltZW5zaW9uVmFsdWUoZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfWRpbVR5cGUoKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIucmVhZEludDgodGhpcy5iYl9wb3MrdCk6ZS5leHBlcmltZW50YWwuZmJzLkRpbWVuc2lvblZhbHVlVHlwZS5VTktOT1dOfWRpbVZhbHVlKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gZT90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcytlKTp0aGlzLmJiLmNyZWF0ZUxvbmcoMCwwKX1kaW1QYXJhbShlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXN0YXRpYyBzdGFydERpbWVuc2lvblZhbHVlKGUpe2Uuc3RhcnRPYmplY3QoMyk7fXN0YXRpYyBhZGREaW1UeXBlKHQsbil7dC5hZGRGaWVsZEludDgoMCxuLGUuZXhwZXJpbWVudGFsLmZicy5EaW1lbnNpb25WYWx1ZVR5cGUuVU5LTk9XTik7fXN0YXRpYyBhZGREaW1WYWx1ZShlLHQpe2UuYWRkRmllbGRJbnQ2NCgxLHQsZS5jcmVhdGVMb25nKDAsMCkpO31zdGF0aWMgYWRkRGltUGFyYW0oZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDIsdCwwKTt9c3RhdGljIGVuZERpbWVuc2lvblZhbHVlKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVEaW1lbnNpb25WYWx1ZShlLHQscixvKXtyZXR1cm4gbi5zdGFydERpbWVuc2lvblZhbHVlKGUpLG4uYWRkRGltVHlwZShlLHQpLG4uYWRkRGltVmFsdWUoZSxyKSxuLmFkZERpbVBhcmFtKGUsbyksbi5lbmREaW1lbnNpb25WYWx1ZShlKX19dC5EaW1lbnNpb25WYWx1ZT1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc1RlbnNvclR5cGVBbmRTaGFwZShlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVGVuc29yVHlwZUFuZFNoYXBlKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1lbGVtVHlwZSgpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHQ/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MrdCk6ZS5leHBlcmltZW50YWwuZmJzLlRlbnNvckRhdGFUeXBlLlVOREVGSU5FRH1zaGFwZSh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlNoYXBlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0VGVuc29yVHlwZUFuZFNoYXBlKGUpe2Uuc3RhcnRPYmplY3QoMik7fXN0YXRpYyBhZGRFbGVtVHlwZSh0LG4pe3QuYWRkRmllbGRJbnQzMigwLG4sZS5leHBlcmltZW50YWwuZmJzLlRlbnNvckRhdGFUeXBlLlVOREVGSU5FRCk7fXN0YXRpYyBhZGRTaGFwZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgZW5kVGVuc29yVHlwZUFuZFNoYXBlKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVUZW5zb3JUeXBlQW5kU2hhcGUoZSx0LHIpe3JldHVybiBuLnN0YXJ0VGVuc29yVHlwZUFuZFNoYXBlKGUpLG4uYWRkRWxlbVR5cGUoZSx0KSxuLmFkZFNoYXBlKGUsciksbi5lbmRUZW5zb3JUeXBlQW5kU2hhcGUoZSl9fXQuVGVuc29yVHlwZUFuZFNoYXBlPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzTWFwVHlwZShlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzTWFwVHlwZShlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9a2V5VHlwZSgpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHQ/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MrdCk6ZS5leHBlcmltZW50YWwuZmJzLlRlbnNvckRhdGFUeXBlLlVOREVGSU5FRH12YWx1ZVR5cGUodCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gbj8odHx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5UeXBlSW5mbykuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfXN0YXRpYyBzdGFydE1hcFR5cGUoZSl7ZS5zdGFydE9iamVjdCgyKTt9c3RhdGljIGFkZEtleVR5cGUodCxuKXt0LmFkZEZpZWxkSW50MzIoMCxuLGUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3JEYXRhVHlwZS5VTkRFRklORUQpO31zdGF0aWMgYWRkVmFsdWVUeXBlKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBlbmRNYXBUeXBlKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVNYXBUeXBlKGUsdCxyKXtyZXR1cm4gbi5zdGFydE1hcFR5cGUoZSksbi5hZGRLZXlUeXBlKGUsdCksbi5hZGRWYWx1ZVR5cGUoZSxyKSxuLmVuZE1hcFR5cGUoZSl9fXQuTWFwVHlwZT1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc1NlcXVlbmNlVHlwZShlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU2VxdWVuY2VUeXBlKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1lbGVtVHlwZSh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlR5cGVJbmZvKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0U2VxdWVuY2VUeXBlKGUpe2Uuc3RhcnRPYmplY3QoMSk7fXN0YXRpYyBhZGRFbGVtVHlwZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgZW5kU2VxdWVuY2VUeXBlKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVTZXF1ZW5jZVR5cGUoZSx0KXtyZXR1cm4gbi5zdGFydFNlcXVlbmNlVHlwZShlKSxuLmFkZEVsZW1UeXBlKGUsdCksbi5lbmRTZXF1ZW5jZVR5cGUoZSl9fXQuU2VxdWVuY2VUeXBlPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXsoZS5mYnN8fChlLmZicz17fSkpLkVkZ2VFbmQ9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9bm9kZUluZGV4KCl7cmV0dXJuIHRoaXMuYmIucmVhZFVpbnQzMih0aGlzLmJiX3Bvcyl9c3JjQXJnSW5kZXgoKXtyZXR1cm4gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MrNCl9ZHN0QXJnSW5kZXgoKXtyZXR1cm4gdGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MrOCl9c3RhdGljIGNyZWF0ZUVkZ2VFbmQoZSx0LG4scil7cmV0dXJuIGUucHJlcCg0LDEyKSxlLndyaXRlSW50MzIociksZS53cml0ZUludDMyKG4pLGUud3JpdGVJbnQzMih0KSxlLm9mZnNldCgpfX07fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzTm9kZUVkZ2UoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc05vZGVFZGdlKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1ub2RlSW5kZXgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBlP3RoaXMuYmIucmVhZFVpbnQzMih0aGlzLmJiX3BvcytlKTowfWlucHV0RWRnZXModCxuKXtsZXQgcj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiByPyhufHxuZXcgZS5leHBlcmltZW50YWwuZmJzLkVkZ2VFbmQpLl9faW5pdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3IpKzEyKnQsdGhpcy5iYik6bnVsbH1pbnB1dEVkZ2VzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfW91dHB1dEVkZ2VzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gcj8obnx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5FZGdlRW5kKS5fX2luaXQodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSsxMip0LHRoaXMuYmIpOm51bGx9b3V0cHV0RWRnZXNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9c3RhdGljIHN0YXJ0Tm9kZUVkZ2UoZSl7ZS5zdGFydE9iamVjdCgzKTt9c3RhdGljIGFkZE5vZGVJbmRleChlLHQpe2UuYWRkRmllbGRJbnQzMigwLHQsMCk7fXN0YXRpYyBhZGRJbnB1dEVkZ2VzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBzdGFydElucHV0RWRnZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDEyLHQsNCk7fXN0YXRpYyBhZGRPdXRwdXRFZGdlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMix0LDApO31zdGF0aWMgc3RhcnRPdXRwdXRFZGdlc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoMTIsdCw0KTt9c3RhdGljIGVuZE5vZGVFZGdlKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVOb2RlRWRnZShlLHQscixvKXtyZXR1cm4gbi5zdGFydE5vZGVFZGdlKGUpLG4uYWRkTm9kZUluZGV4KGUsdCksbi5hZGRJbnB1dEVkZ2VzKGUsciksbi5hZGRPdXRwdXRFZGdlcyhlLG8pLG4uZW5kTm9kZUVkZ2UoZSl9fXQuTm9kZUVkZ2U9bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNOb2RlKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNOb2RlKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1uYW1lKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9ZG9jU3RyaW5nKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9ZG9tYWluKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9c2luY2VWZXJzaW9uKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMCk7cmV0dXJuIGU/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MrZSk6MH1pbmRleCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTIpO3JldHVybiBlP3RoaXMuYmIucmVhZFVpbnQzMih0aGlzLmJiX3BvcytlKTowfW9wVHlwZShlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH10eXBlKCl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNik7cmV0dXJuIHQ/dGhpcy5iYi5yZWFkSW50MzIodGhpcy5iYl9wb3MrdCk6ZS5leHBlcmltZW50YWwuZmJzLk5vZGVUeXBlLlByaW1pdGl2ZX1leGVjdXRpb25Qcm92aWRlclR5cGUoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxOCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9aW5wdXRzKGUsdCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMCk7cmV0dXJuIG4/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK24pKzQqZSx0KTpudWxsfWlucHV0c0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjApO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9b3V0cHV0cyhlLHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjIpO3JldHVybiBuP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytuKSs0KmUsdCk6bnVsbH1vdXRwdXRzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1hdHRyaWJ1dGVzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNCk7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuQXR0cmlidXRlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrcikrNCp0KSx0aGlzLmJiKTpudWxsfWF0dHJpYnV0ZXNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI0KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfWlucHV0QXJnQ291bnRzKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjYpO3JldHVybiB0P3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrdCkrNCplKTowfWlucHV0QXJnQ291bnRzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1pbnB1dEFyZ0NvdW50c0FycmF5KCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNik7cmV0dXJuIGU/bmV3IEludDMyQXJyYXkodGhpcy5iYi5ieXRlcygpLmJ1ZmZlcix0aGlzLmJiLmJ5dGVzKCkuYnl0ZU9mZnNldCt0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2UpLHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpKTpudWxsfWltcGxpY2l0SW5wdXRzKGUsdCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyOCk7cmV0dXJuIG4/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK24pKzQqZSx0KTpudWxsfWltcGxpY2l0SW5wdXRzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyOCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1zdGF0aWMgc3RhcnROb2RlKGUpe2Uuc3RhcnRPYmplY3QoMTMpO31zdGF0aWMgYWRkTmFtZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkRG9jU3RyaW5nKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBhZGREb21haW4oZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDIsdCwwKTt9c3RhdGljIGFkZFNpbmNlVmVyc2lvbihlLHQpe2UuYWRkRmllbGRJbnQzMigzLHQsMCk7fXN0YXRpYyBhZGRJbmRleChlLHQpe2UuYWRkRmllbGRJbnQzMig0LHQsMCk7fXN0YXRpYyBhZGRPcFR5cGUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDUsdCwwKTt9c3RhdGljIGFkZFR5cGUodCxuKXt0LmFkZEZpZWxkSW50MzIoNixuLGUuZXhwZXJpbWVudGFsLmZicy5Ob2RlVHlwZS5QcmltaXRpdmUpO31zdGF0aWMgYWRkRXhlY3V0aW9uUHJvdmlkZXJUeXBlKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg3LHQsMCk7fXN0YXRpYyBhZGRJbnB1dHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDgsdCwwKTt9c3RhdGljIGNyZWF0ZUlucHV0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRJbnB1dHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZE91dHB1dHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDksdCwwKTt9c3RhdGljIGNyZWF0ZU91dHB1dHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0T3V0cHV0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkQXR0cmlidXRlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMTAsdCwwKTt9c3RhdGljIGNyZWF0ZUF0dHJpYnV0ZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0QXR0cmlidXRlc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkSW5wdXRBcmdDb3VudHMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDExLHQsMCk7fXN0YXRpYyBjcmVhdGVJbnB1dEFyZ0NvdW50c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZEludDMyKHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydElucHV0QXJnQ291bnRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGRJbXBsaWNpdElucHV0cyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMTIsdCwwKTt9c3RhdGljIGNyZWF0ZUltcGxpY2l0SW5wdXRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEltcGxpY2l0SW5wdXRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBlbmROb2RlKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVOb2RlKGUsdCxyLG8saSxzLGEsdSxsLGMscCxkLGYsaCl7cmV0dXJuIG4uc3RhcnROb2RlKGUpLG4uYWRkTmFtZShlLHQpLG4uYWRkRG9jU3RyaW5nKGUsciksbi5hZGREb21haW4oZSxvKSxuLmFkZFNpbmNlVmVyc2lvbihlLGkpLG4uYWRkSW5kZXgoZSxzKSxuLmFkZE9wVHlwZShlLGEpLG4uYWRkVHlwZShlLHUpLG4uYWRkRXhlY3V0aW9uUHJvdmlkZXJUeXBlKGUsbCksbi5hZGRJbnB1dHMoZSxjKSxuLmFkZE91dHB1dHMoZSxwKSxuLmFkZEF0dHJpYnV0ZXMoZSxkKSxuLmFkZElucHV0QXJnQ291bnRzKGUsZiksbi5hZGRJbXBsaWNpdElucHV0cyhlLGgpLG4uZW5kTm9kZShlKX19dC5Ob2RlPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzVmFsdWVJbmZvKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNWYWx1ZUluZm8oZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfW5hbWUoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1kb2NTdHJpbmcoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH10eXBlKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuVHlwZUluZm8pLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrbiksdGhpcy5iYik6bnVsbH1zdGF0aWMgc3RhcnRWYWx1ZUluZm8oZSl7ZS5zdGFydE9iamVjdCgzKTt9c3RhdGljIGFkZE5hbWUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGFkZERvY1N0cmluZyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgYWRkVHlwZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMix0LDApO31zdGF0aWMgZW5kVmFsdWVJbmZvKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVWYWx1ZUluZm8oZSx0LHIsbyl7cmV0dXJuIG4uc3RhcnRWYWx1ZUluZm8oZSksbi5hZGROYW1lKGUsdCksbi5hZGREb2NTdHJpbmcoZSxyKSxuLmFkZFR5cGUoZSxvKSxuLmVuZFZhbHVlSW5mbyhlKX19dC5WYWx1ZUluZm89bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNUeXBlSW5mbyhlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzVHlwZUluZm8oZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfWRlbm90YXRpb24oZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH12YWx1ZVR5cGUoKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB0P3RoaXMuYmIucmVhZFVpbnQ4KHRoaXMuYmJfcG9zK3QpOmUuZXhwZXJpbWVudGFsLmZicy5UeXBlSW5mb1ZhbHVlLk5PTkV9dmFsdWUoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gdD90aGlzLmJiLl9fdW5pb24oZSx0aGlzLmJiX3Bvcyt0KTpudWxsfXN0YXRpYyBzdGFydFR5cGVJbmZvKGUpe2Uuc3RhcnRPYmplY3QoMyk7fXN0YXRpYyBhZGREZW5vdGF0aW9uKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgwLHQsMCk7fXN0YXRpYyBhZGRWYWx1ZVR5cGUodCxuKXt0LmFkZEZpZWxkSW50OCgxLG4sZS5leHBlcmltZW50YWwuZmJzLlR5cGVJbmZvVmFsdWUuTk9ORSk7fXN0YXRpYyBhZGRWYWx1ZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMix0LDApO31zdGF0aWMgZW5kVHlwZUluZm8oZSl7cmV0dXJuIGUuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZVR5cGVJbmZvKGUsdCxyLG8pe3JldHVybiBuLnN0YXJ0VHlwZUluZm8oZSksbi5hZGREZW5vdGF0aW9uKGUsdCksbi5hZGRWYWx1ZVR5cGUoZSxyKSxuLmFkZFZhbHVlKGUsbyksbi5lbmRUeXBlSW5mbyhlKX19dC5UeXBlSW5mbz1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpe2NsYXNzIHR7Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc09wZXJhdG9yU2V0SWQoZSxuKXtyZXR1cm4gKG58fG5ldyB0KS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc09wZXJhdG9yU2V0SWQoZSxuKXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLChufHxuZXcgdCkuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfWRvbWFpbihlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXZlcnNpb24oKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiBlP3RoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zK2UpOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfXN0YXRpYyBzdGFydE9wZXJhdG9yU2V0SWQoZSl7ZS5zdGFydE9iamVjdCgyKTt9c3RhdGljIGFkZERvbWFpbihlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkVmVyc2lvbihlLHQpe2UuYWRkRmllbGRJbnQ2NCgxLHQsZS5jcmVhdGVMb25nKDAsMCkpO31zdGF0aWMgZW5kT3BlcmF0b3JTZXRJZChlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlT3BlcmF0b3JTZXRJZChlLG4scil7cmV0dXJuIHQuc3RhcnRPcGVyYXRvclNldElkKGUpLHQuYWRkRG9tYWluKGUsbiksdC5hZGRWZXJzaW9uKGUsciksdC5lbmRPcGVyYXRvclNldElkKGUpfX1lLk9wZXJhdG9yU2V0SWQ9dDt9KGUuZmJzfHwoZS5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNUZW5zb3IoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1RlbnNvcihlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9bmFtZShlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfWRvY1N0cmluZyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfWRpbXMoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gdD90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3QpKzgqZSk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9ZGltc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1kYXRhVHlwZSgpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTApO3JldHVybiB0P3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zK3QpOmUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3JEYXRhVHlwZS5VTkRFRklORUR9cmF3RGF0YShlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gdD90aGlzLmJiLnJlYWRVaW50OCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3QpK2UpOjB9cmF3RGF0YUxlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTIpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9cmF3RGF0YUFycmF5KCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIGU/bmV3IFVpbnQ4QXJyYXkodGhpcy5iYi5ieXRlcygpLmJ1ZmZlcix0aGlzLmJiLmJ5dGVzKCkuYnl0ZU9mZnNldCt0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2UpLHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpKTpudWxsfXN0cmluZ0RhdGEoZSx0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gbj90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbikrNCplLHQpOm51bGx9c3RyaW5nRGF0YUxlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTQpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9c3RhdGljIHN0YXJ0VGVuc29yKGUpe2Uuc3RhcnRPYmplY3QoNik7fXN0YXRpYyBhZGROYW1lKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgwLHQsMCk7fXN0YXRpYyBhZGREb2NTdHJpbmcoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGFkZERpbXMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDIsdCwwKTt9c3RhdGljIGNyZWF0ZURpbXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDgsdC5sZW5ndGgsOCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRJbnQ2NCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnREaW1zVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig4LHQsOCk7fXN0YXRpYyBhZGREYXRhVHlwZSh0LG4pe3QuYWRkRmllbGRJbnQzMigzLG4sZS5leHBlcmltZW50YWwuZmJzLlRlbnNvckRhdGFUeXBlLlVOREVGSU5FRCk7fXN0YXRpYyBhZGRSYXdEYXRhKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg0LHQsMCk7fXN0YXRpYyBjcmVhdGVSYXdEYXRhVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3RvcigxLHQubGVuZ3RoLDEpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkSW50OCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRSYXdEYXRhVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3RvcigxLHQsMSk7fXN0YXRpYyBhZGRTdHJpbmdEYXRhKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg1LHQsMCk7fXN0YXRpYyBjcmVhdGVTdHJpbmdEYXRhVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydFN0cmluZ0RhdGFWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGVuZFRlbnNvcihlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlVGVuc29yKGUsdCxyLG8saSxzLGEpe3JldHVybiBuLnN0YXJ0VGVuc29yKGUpLG4uYWRkTmFtZShlLHQpLG4uYWRkRG9jU3RyaW5nKGUsciksbi5hZGREaW1zKGUsbyksbi5hZGREYXRhVHlwZShlLGkpLG4uYWRkUmF3RGF0YShlLHMpLG4uYWRkU3RyaW5nRGF0YShlLGEpLG4uZW5kVGVuc29yKGUpfX10LlRlbnNvcj1uO30odC5mYnN8fCh0LmZicz17fSkpO30oZS5leHBlcmltZW50YWx8fChlLmV4cGVyaW1lbnRhbD17fSkpO30odC5vbm54cnVudGltZXx8KHQub25ueHJ1bnRpbWU9e30pKSxmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQpe2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLmJiPW51bGwsdGhpcy5iYl9wb3M9MDt9X19pbml0KGUsdCl7cmV0dXJuIHRoaXMuYmJfcG9zPWUsdGhpcy5iYj10LHRoaXN9c3RhdGljIGdldFJvb3RBc1NwYXJzZVRlbnNvcihlLHQpe3JldHVybiAodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgZ2V0U2l6ZVByZWZpeGVkUm9vdEFzU3BhcnNlVGVuc29yKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX12YWx1ZXModCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gbj8odHx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3IpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrbiksdGhpcy5iYik6bnVsbH1pbmRpY2VzKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9ZGltcyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiB0P3RoaXMuYmIucmVhZEludDY0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrdCkrOCplKTp0aGlzLmJiLmNyZWF0ZUxvbmcoMCwwKX1kaW1zTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXN0YXRpYyBzdGFydFNwYXJzZVRlbnNvcihlKXtlLnN0YXJ0T2JqZWN0KDMpO31zdGF0aWMgYWRkVmFsdWVzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgwLHQsMCk7fXN0YXRpYyBhZGRJbmRpY2VzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBhZGREaW1zKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgyLHQsMCk7fXN0YXRpYyBjcmVhdGVEaW1zVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig4LHQubGVuZ3RoLDgpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkSW50NjQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0RGltc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoOCx0LDgpO31zdGF0aWMgZW5kU3BhcnNlVGVuc29yKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVTcGFyc2VUZW5zb3IoZSx0LHIsbyl7cmV0dXJuIG4uc3RhcnRTcGFyc2VUZW5zb3IoZSksbi5hZGRWYWx1ZXMoZSx0KSxuLmFkZEluZGljZXMoZSxyKSxuLmFkZERpbXMoZSxvKSxuLmVuZFNwYXJzZVRlbnNvcihlKX19dC5TcGFyc2VUZW5zb3I9bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNBdHRyaWJ1dGUoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0F0dHJpYnV0ZShlLHQpe3JldHVybiBlLnNldFBvc2l0aW9uKGUucG9zaXRpb24oKStyLmZsYXRidWZmZXJzLlNJWkVfUFJFRklYX0xFTkdUSCksKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9bmFtZShlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfWRvY1N0cmluZyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXR5cGUoKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiB0P3RoaXMuYmIucmVhZEludDMyKHRoaXMuYmJfcG9zK3QpOmUuZXhwZXJpbWVudGFsLmZicy5BdHRyaWJ1dGVUeXBlLlVOREVGSU5FRH1mKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMCk7cmV0dXJuIGU/dGhpcy5iYi5yZWFkRmxvYXQzMih0aGlzLmJiX3BvcytlKTowfWkoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gZT90aGlzLmJiLnJlYWRJbnQ2NCh0aGlzLmJiX3BvcytlKTp0aGlzLmJiLmNyZWF0ZUxvbmcoMCwwKX1zKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTQpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXQodCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNik7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuVGVuc29yKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9Zyh0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE4KTtyZXR1cm4gbj8odHx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5HcmFwaCkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfWZsb2F0cyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIwKTtyZXR1cm4gdD90aGlzLmJiLnJlYWRGbG9hdDMyKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrdCkrNCplKTowfWZsb2F0c0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjApO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9ZmxvYXRzQXJyYXkoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDIwKTtyZXR1cm4gZT9uZXcgRmxvYXQzMkFycmF5KHRoaXMuYmIuYnl0ZXMoKS5idWZmZXIsdGhpcy5iYi5ieXRlcygpLmJ5dGVPZmZzZXQrdGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytlKSx0aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKSk6bnVsbH1pbnRzKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjIpO3JldHVybiB0P3RoaXMuYmIucmVhZEludDY0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrdCkrOCplKTp0aGlzLmJiLmNyZWF0ZUxvbmcoMCwwKX1pbnRzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1zdHJpbmdzKGUsdCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyNCk7cmV0dXJuIG4/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK24pKzQqZSx0KTpudWxsfXN0cmluZ3NMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI0KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXRlbnNvcnModCxuKXtsZXQgcj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDI2KTtyZXR1cm4gcj8obnx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5UZW5zb3IpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSs0KnQpLHRoaXMuYmIpOm51bGx9dGVuc29yc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMjYpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9Z3JhcGhzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyOCk7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuR3JhcGgpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSs0KnQpLHRoaXMuYmIpOm51bGx9Z3JhcGhzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyOCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1zdGF0aWMgc3RhcnRBdHRyaWJ1dGUoZSl7ZS5zdGFydE9iamVjdCgxMyk7fXN0YXRpYyBhZGROYW1lKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgwLHQsMCk7fXN0YXRpYyBhZGREb2NTdHJpbmcoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGFkZFR5cGUodCxuKXt0LmFkZEZpZWxkSW50MzIoMixuLGUuZXhwZXJpbWVudGFsLmZicy5BdHRyaWJ1dGVUeXBlLlVOREVGSU5FRCk7fXN0YXRpYyBhZGRGKGUsdCl7ZS5hZGRGaWVsZEZsb2F0MzIoMyx0LDApO31zdGF0aWMgYWRkSShlLHQpe2UuYWRkRmllbGRJbnQ2NCg0LHQsZS5jcmVhdGVMb25nKDAsMCkpO31zdGF0aWMgYWRkUyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoNSx0LDApO31zdGF0aWMgYWRkVChlLHQpe2UuYWRkRmllbGRPZmZzZXQoNix0LDApO31zdGF0aWMgYWRkRyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoNyx0LDApO31zdGF0aWMgYWRkRmxvYXRzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg4LHQsMCk7fXN0YXRpYyBjcmVhdGVGbG9hdHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRGbG9hdDMyKHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEZsb2F0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkSW50cyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoOSx0LDApO31zdGF0aWMgY3JlYXRlSW50c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoOCx0Lmxlbmd0aCw4KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZEludDY0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEludHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDgsdCw4KTt9c3RhdGljIGFkZFN0cmluZ3MoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEwLHQsMCk7fXN0YXRpYyBjcmVhdGVTdHJpbmdzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydFN0cmluZ3NWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZFRlbnNvcnMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDExLHQsMCk7fXN0YXRpYyBjcmVhdGVUZW5zb3JzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydFRlbnNvcnNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZEdyYXBocyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMTIsdCwwKTt9c3RhdGljIGNyZWF0ZUdyYXBoc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRHcmFwaHNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGVuZEF0dHJpYnV0ZShlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlQXR0cmlidXRlKGUsdCxyLG8saSxzLGEsdSxsLGMscCxkLGYsaCl7cmV0dXJuIG4uc3RhcnRBdHRyaWJ1dGUoZSksbi5hZGROYW1lKGUsdCksbi5hZGREb2NTdHJpbmcoZSxyKSxuLmFkZFR5cGUoZSxvKSxuLmFkZEYoZSxpKSxuLmFkZEkoZSxzKSxuLmFkZFMoZSxhKSxuLmFkZFQoZSx1KSxuLmFkZEcoZSxsKSxuLmFkZEZsb2F0cyhlLGMpLG4uYWRkSW50cyhlLHApLG4uYWRkU3RyaW5ncyhlLGQpLG4uYWRkVGVuc29ycyhlLGYpLG4uYWRkR3JhcGhzKGUsaCksbi5lbmRBdHRyaWJ1dGUoZSl9fXQuQXR0cmlidXRlPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzR3JhcGgoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0dyYXBoKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1pbml0aWFsaXplcnModCxuKXtsZXQgcj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiByPyhufHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlRlbnNvcikuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3IpKzQqdCksdGhpcy5iYik6bnVsbH1pbml0aWFsaXplcnNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9bm9kZUFyZ3ModCxuKXtsZXQgcj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiByPyhufHxuZXcgZS5leHBlcmltZW50YWwuZmJzLlZhbHVlSW5mbykuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3IpKzQqdCksdGhpcy5iYik6bnVsbH1ub2RlQXJnc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1ub2Rlcyh0LG4pe2xldCByPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuTm9kZSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3IpKzQqdCksdGhpcy5iYik6bnVsbH1ub2Rlc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsOCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1tYXhOb2RlSW5kZXgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEwKTtyZXR1cm4gZT90aGlzLmJiLnJlYWRVaW50MzIodGhpcy5iYl9wb3MrZSk6MH1ub2RlRWRnZXModCxuKXtsZXQgcj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gcj8obnx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5Ob2RlRWRnZSkuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3IpKzQqdCksdGhpcy5iYik6bnVsbH1ub2RlRWRnZXNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEyKTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfWlucHV0cyhlLHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTQpO3JldHVybiBuP3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytuKSs0KmUsdCk6bnVsbH1pbnB1dHNMZW5ndGgoKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE0KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfW91dHB1dHMoZSx0KXtsZXQgbj10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDE2KTtyZXR1cm4gbj90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrbikrNCplLHQpOm51bGx9b3V0cHV0c0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTYpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9c3BhcnNlSW5pdGlhbGl6ZXJzKHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxOCk7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuU3BhcnNlVGVuc29yKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrcikrNCp0KSx0aGlzLmJiKTpudWxsfXNwYXJzZUluaXRpYWxpemVyc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTgpO3JldHVybiBlP3RoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpOjB9c3RhdGljIHN0YXJ0R3JhcGgoZSl7ZS5zdGFydE9iamVjdCg4KTt9c3RhdGljIGFkZEluaXRpYWxpemVycyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgY3JlYXRlSW5pdGlhbGl6ZXJzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydEluaXRpYWxpemVyc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkTm9kZUFyZ3MoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGNyZWF0ZU5vZGVBcmdzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydE5vZGVBcmdzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGROb2RlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMix0LDApO31zdGF0aWMgY3JlYXRlTm9kZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0Tm9kZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZE1heE5vZGVJbmRleChlLHQpe2UuYWRkRmllbGRJbnQzMigzLHQsMCk7fXN0YXRpYyBhZGROb2RlRWRnZXMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDQsdCwwKTt9c3RhdGljIGNyZWF0ZU5vZGVFZGdlc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnROb2RlRWRnZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGFkZElucHV0cyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoNSx0LDApO31zdGF0aWMgY3JlYXRlSW5wdXRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydElucHV0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkT3V0cHV0cyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoNix0LDApO31zdGF0aWMgY3JlYXRlT3V0cHV0c1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRPdXRwdXRzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGRTcGFyc2VJbml0aWFsaXplcnMoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDcsdCwwKTt9c3RhdGljIGNyZWF0ZVNwYXJzZUluaXRpYWxpemVyc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0Lmxlbmd0aCw0KTtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSllLmFkZE9mZnNldCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRTcGFyc2VJbml0aWFsaXplcnNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdCw0KTt9c3RhdGljIGVuZEdyYXBoKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVHcmFwaChlLHQscixvLGkscyxhLHUsbCl7cmV0dXJuIG4uc3RhcnRHcmFwaChlKSxuLmFkZEluaXRpYWxpemVycyhlLHQpLG4uYWRkTm9kZUFyZ3MoZSxyKSxuLmFkZE5vZGVzKGUsbyksbi5hZGRNYXhOb2RlSW5kZXgoZSxpKSxuLmFkZE5vZGVFZGdlcyhlLHMpLG4uYWRkSW5wdXRzKGUsYSksbi5hZGRPdXRwdXRzKGUsdSksbi5hZGRTcGFyc2VJbml0aWFsaXplcnMoZSxsKSxuLmVuZEdyYXBoKGUpfX10LkdyYXBoPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzTW9kZWwoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc01vZGVsKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1pclZlcnNpb24oKXtsZXQgZT10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiBlP3RoaXMuYmIucmVhZEludDY0KHRoaXMuYmJfcG9zK2UpOnRoaXMuYmIuY3JlYXRlTG9uZygwLDApfW9wc2V0SW1wb3J0KHQsbil7bGV0IHI9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gcj8obnx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5PcGVyYXRvclNldElkKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmIuX192ZWN0b3IodGhpcy5iYl9wb3MrcikrNCp0KSx0aGlzLmJiKTpudWxsfW9wc2V0SW1wb3J0TGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXByb2R1Y2VyTmFtZShlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDgpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfXByb2R1Y2VyVmVyc2lvbihlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDEwKTtyZXR1cm4gdD90aGlzLmJiLl9fc3RyaW5nKHRoaXMuYmJfcG9zK3QsZSk6bnVsbH1kb21haW4oZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxMik7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9bW9kZWxWZXJzaW9uKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywxNCk7cmV0dXJuIGU/dGhpcy5iYi5yZWFkSW50NjQodGhpcy5iYl9wb3MrZSk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9ZG9jU3RyaW5nKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTYpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfWdyYXBoKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsMTgpO3JldHVybiBuPyh0fHxuZXcgZS5leHBlcmltZW50YWwuZmJzLkdyYXBoKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9Z3JhcGhEb2NTdHJpbmcoZSl7bGV0IHQ9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3BvcywyMCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9c3RhdGljIHN0YXJ0TW9kZWwoZSl7ZS5zdGFydE9iamVjdCg5KTt9c3RhdGljIGFkZElyVmVyc2lvbihlLHQpe2UuYWRkRmllbGRJbnQ2NCgwLHQsZS5jcmVhdGVMb25nKDAsMCkpO31zdGF0aWMgYWRkT3BzZXRJbXBvcnQoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDEsdCwwKTt9c3RhdGljIGNyZWF0ZU9wc2V0SW1wb3J0VmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQubGVuZ3RoLDQpO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKWUuYWRkT2Zmc2V0KHRbbl0pO3JldHVybiBlLmVuZFZlY3RvcigpfXN0YXRpYyBzdGFydE9wc2V0SW1wb3J0VmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBhZGRQcm9kdWNlck5hbWUoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDIsdCwwKTt9c3RhdGljIGFkZFByb2R1Y2VyVmVyc2lvbihlLHQpe2UuYWRkRmllbGRPZmZzZXQoMyx0LDApO31zdGF0aWMgYWRkRG9tYWluKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg0LHQsMCk7fXN0YXRpYyBhZGRNb2RlbFZlcnNpb24oZSx0KXtlLmFkZEZpZWxkSW50NjQoNSx0LGUuY3JlYXRlTG9uZygwLDApKTt9c3RhdGljIGFkZERvY1N0cmluZyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoNix0LDApO31zdGF0aWMgYWRkR3JhcGgoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDcsdCwwKTt9c3RhdGljIGFkZEdyYXBoRG9jU3RyaW5nKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCg4LHQsMCk7fXN0YXRpYyBlbmRNb2RlbChlKXtyZXR1cm4gZS5lbmRPYmplY3QoKX1zdGF0aWMgY3JlYXRlTW9kZWwoZSx0LHIsbyxpLHMsYSx1LGwsYyl7cmV0dXJuIG4uc3RhcnRNb2RlbChlKSxuLmFkZElyVmVyc2lvbihlLHQpLG4uYWRkT3BzZXRJbXBvcnQoZSxyKSxuLmFkZFByb2R1Y2VyTmFtZShlLG8pLG4uYWRkUHJvZHVjZXJWZXJzaW9uKGUsaSksbi5hZGREb21haW4oZSxzKSxuLmFkZE1vZGVsVmVyc2lvbihlLGEpLG4uYWRkRG9jU3RyaW5nKGUsdSksbi5hZGRHcmFwaChlLGwpLG4uYWRkR3JhcGhEb2NTdHJpbmcoZSxjKSxuLmVuZE1vZGVsKGUpfX10Lk1vZGVsPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7Y2xhc3MgdHtjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzS2VybmVsQ3JlYXRlSW5mb3MoZSxuKXtyZXR1cm4gKG58fG5ldyB0KS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc0tlcm5lbENyZWF0ZUluZm9zKGUsbil7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwobnx8bmV3IHQpLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1ub2RlSW5kaWNlcyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIucmVhZFVpbnQzMih0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3QpKzQqZSk6MH1ub2RlSW5kaWNlc0xlbmd0aCgpe2xldCBlPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIGU/dGhpcy5iYi5fX3ZlY3Rvcl9sZW4odGhpcy5iYl9wb3MrZSk6MH1ub2RlSW5kaWNlc0FycmF5KCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gZT9uZXcgVWludDMyQXJyYXkodGhpcy5iYi5ieXRlcygpLmJ1ZmZlcix0aGlzLmJiLmJ5dGVzKCkuYnl0ZU9mZnNldCt0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK2UpLHRoaXMuYmIuX192ZWN0b3JfbGVuKHRoaXMuYmJfcG9zK2UpKTpudWxsfWtlcm5lbERlZkhhc2hlcyhlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDYpO3JldHVybiB0P3RoaXMuYmIucmVhZFVpbnQ2NCh0aGlzLmJiLl9fdmVjdG9yKHRoaXMuYmJfcG9zK3QpKzgqZSk6dGhpcy5iYi5jcmVhdGVMb25nKDAsMCl9a2VybmVsRGVmSGFzaGVzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXN0YXRpYyBzdGFydEtlcm5lbENyZWF0ZUluZm9zKGUpe2Uuc3RhcnRPYmplY3QoMik7fXN0YXRpYyBhZGROb2RlSW5kaWNlcyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgY3JlYXRlTm9kZUluZGljZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRJbnQzMih0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnROb2RlSW5kaWNlc1ZlY3RvcihlLHQpe2Uuc3RhcnRWZWN0b3IoNCx0LDQpO31zdGF0aWMgYWRkS2VybmVsRGVmSGFzaGVzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBjcmVhdGVLZXJuZWxEZWZIYXNoZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDgsdC5sZW5ndGgsOCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRJbnQ2NCh0W25dKTtyZXR1cm4gZS5lbmRWZWN0b3IoKX1zdGF0aWMgc3RhcnRLZXJuZWxEZWZIYXNoZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDgsdCw4KTt9c3RhdGljIGVuZEtlcm5lbENyZWF0ZUluZm9zKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBjcmVhdGVLZXJuZWxDcmVhdGVJbmZvcyhlLG4scil7cmV0dXJuIHQuc3RhcnRLZXJuZWxDcmVhdGVJbmZvcyhlKSx0LmFkZE5vZGVJbmRpY2VzKGUsbiksdC5hZGRLZXJuZWxEZWZIYXNoZXMoZSxyKSx0LmVuZEtlcm5lbENyZWF0ZUluZm9zKGUpfX1lLktlcm5lbENyZWF0ZUluZm9zPXQ7fShlLmZic3x8KGUuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzU3ViR3JhcGhTZXNzaW9uU3RhdGUoZSx0KXtyZXR1cm4gKHR8fG5ldyBuKS5fX2luaXQoZS5yZWFkSW50MzIoZS5wb3NpdGlvbigpKStlLnBvc2l0aW9uKCksZSl9c3RhdGljIGdldFNpemVQcmVmaXhlZFJvb3RBc1N1YkdyYXBoU2Vzc2lvblN0YXRlKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1ncmFwaElkKGUpe2xldCB0PXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNCk7cmV0dXJuIHQ/dGhpcy5iYi5fX3N0cmluZyh0aGlzLmJiX3Bvcyt0LGUpOm51bGx9c2Vzc2lvblN0YXRlKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuU2Vzc2lvblN0YXRlKS5fX2luaXQodGhpcy5iYi5fX2luZGlyZWN0KHRoaXMuYmJfcG9zK24pLHRoaXMuYmIpOm51bGx9c3RhdGljIHN0YXJ0U3ViR3JhcGhTZXNzaW9uU3RhdGUoZSl7ZS5zdGFydE9iamVjdCgyKTt9c3RhdGljIGFkZEdyYXBoSWQoZSx0KXtlLmFkZEZpZWxkT2Zmc2V0KDAsdCwwKTt9c3RhdGljIGFkZFNlc3Npb25TdGF0ZShlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgZW5kU3ViR3JhcGhTZXNzaW9uU3RhdGUoZSl7bGV0IHQ9ZS5lbmRPYmplY3QoKTtyZXR1cm4gZS5yZXF1aXJlZEZpZWxkKHQsNCksdH1zdGF0aWMgY3JlYXRlU3ViR3JhcGhTZXNzaW9uU3RhdGUoZSx0LHIpe3JldHVybiBuLnN0YXJ0U3ViR3JhcGhTZXNzaW9uU3RhdGUoZSksbi5hZGRHcmFwaElkKGUsdCksbi5hZGRTZXNzaW9uU3RhdGUoZSxyKSxuLmVuZFN1YkdyYXBoU2Vzc2lvblN0YXRlKGUpfX10LlN1YkdyYXBoU2Vzc2lvblN0YXRlPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpLGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0KXshZnVuY3Rpb24odCl7Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMuYmI9bnVsbCx0aGlzLmJiX3Bvcz0wO31fX2luaXQoZSx0KXtyZXR1cm4gdGhpcy5iYl9wb3M9ZSx0aGlzLmJiPXQsdGhpc31zdGF0aWMgZ2V0Um9vdEFzU2Vzc2lvblN0YXRlKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNTZXNzaW9uU3RhdGUoZSx0KXtyZXR1cm4gZS5zZXRQb3NpdGlvbihlLnBvc2l0aW9uKCkrci5mbGF0YnVmZmVycy5TSVpFX1BSRUZJWF9MRU5HVEgpLCh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfWtlcm5lbHModCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw0KTtyZXR1cm4gbj8odHx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5LZXJuZWxDcmVhdGVJbmZvcykuX19pbml0KHRoaXMuYmIuX19pbmRpcmVjdCh0aGlzLmJiX3BvcytuKSx0aGlzLmJiKTpudWxsfXN1YkdyYXBoU2Vzc2lvblN0YXRlcyh0LG4pe2xldCByPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIHI/KG58fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuU3ViR3JhcGhTZXNzaW9uU3RhdGUpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYi5fX3ZlY3Rvcih0aGlzLmJiX3BvcytyKSs0KnQpLHRoaXMuYmIpOm51bGx9c3ViR3JhcGhTZXNzaW9uU3RhdGVzTGVuZ3RoKCl7bGV0IGU9dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw2KTtyZXR1cm4gZT90aGlzLmJiLl9fdmVjdG9yX2xlbih0aGlzLmJiX3BvcytlKTowfXN0YXRpYyBzdGFydFNlc3Npb25TdGF0ZShlKXtlLnN0YXJ0T2JqZWN0KDIpO31zdGF0aWMgYWRkS2VybmVscyhlLHQpe2UuYWRkRmllbGRPZmZzZXQoMCx0LDApO31zdGF0aWMgYWRkU3ViR3JhcGhTZXNzaW9uU3RhdGVzKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgxLHQsMCk7fXN0YXRpYyBjcmVhdGVTdWJHcmFwaFNlc3Npb25TdGF0ZXNWZWN0b3IoZSx0KXtlLnN0YXJ0VmVjdG9yKDQsdC5sZW5ndGgsNCk7Zm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pZS5hZGRPZmZzZXQodFtuXSk7cmV0dXJuIGUuZW5kVmVjdG9yKCl9c3RhdGljIHN0YXJ0U3ViR3JhcGhTZXNzaW9uU3RhdGVzVmVjdG9yKGUsdCl7ZS5zdGFydFZlY3Rvcig0LHQsNCk7fXN0YXRpYyBlbmRTZXNzaW9uU3RhdGUoZSl7cmV0dXJuIGUuZW5kT2JqZWN0KCl9c3RhdGljIGNyZWF0ZVNlc3Npb25TdGF0ZShlLHQscil7cmV0dXJuIG4uc3RhcnRTZXNzaW9uU3RhdGUoZSksbi5hZGRLZXJuZWxzKGUsdCksbi5hZGRTdWJHcmFwaFNlc3Npb25TdGF0ZXMoZSxyKSxuLmVuZFNlc3Npb25TdGF0ZShlKX19dC5TZXNzaW9uU3RhdGU9bjt9KHQuZmJzfHwodC5mYnM9e30pKTt9KGUuZXhwZXJpbWVudGFsfHwoZS5leHBlcmltZW50YWw9e30pKTt9KHQub25ueHJ1bnRpbWV8fCh0Lm9ubnhydW50aW1lPXt9KSksZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXtjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5iYj1udWxsLHRoaXMuYmJfcG9zPTA7fV9faW5pdChlLHQpe3JldHVybiB0aGlzLmJiX3Bvcz1lLHRoaXMuYmI9dCx0aGlzfXN0YXRpYyBnZXRSb290QXNJbmZlcmVuY2VTZXNzaW9uKGUsdCl7cmV0dXJuICh0fHxuZXcgbikuX19pbml0KGUucmVhZEludDMyKGUucG9zaXRpb24oKSkrZS5wb3NpdGlvbigpLGUpfXN0YXRpYyBnZXRTaXplUHJlZml4ZWRSb290QXNJbmZlcmVuY2VTZXNzaW9uKGUsdCl7cmV0dXJuIGUuc2V0UG9zaXRpb24oZS5wb3NpdGlvbigpK3IuZmxhdGJ1ZmZlcnMuU0laRV9QUkVGSVhfTEVOR1RIKSwodHx8bmV3IG4pLl9faW5pdChlLnJlYWRJbnQzMihlLnBvc2l0aW9uKCkpK2UucG9zaXRpb24oKSxlKX1zdGF0aWMgYnVmZmVySGFzSWRlbnRpZmllcihlKXtyZXR1cm4gZS5fX2hhc19pZGVudGlmaWVyKCJPUlRNIil9b3J0VmVyc2lvbihlKXtsZXQgdD10aGlzLmJiLl9fb2Zmc2V0KHRoaXMuYmJfcG9zLDQpO3JldHVybiB0P3RoaXMuYmIuX19zdHJpbmcodGhpcy5iYl9wb3MrdCxlKTpudWxsfW1vZGVsKHQpe2xldCBuPXRoaXMuYmIuX19vZmZzZXQodGhpcy5iYl9wb3MsNik7cmV0dXJuIG4/KHR8fG5ldyBlLmV4cGVyaW1lbnRhbC5mYnMuTW9kZWwpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrbiksdGhpcy5iYik6bnVsbH1zZXNzaW9uU3RhdGUodCl7bGV0IG49dGhpcy5iYi5fX29mZnNldCh0aGlzLmJiX3Bvcyw4KTtyZXR1cm4gbj8odHx8bmV3IGUuZXhwZXJpbWVudGFsLmZicy5TZXNzaW9uU3RhdGUpLl9faW5pdCh0aGlzLmJiLl9faW5kaXJlY3QodGhpcy5iYl9wb3MrbiksdGhpcy5iYik6bnVsbH1zdGF0aWMgc3RhcnRJbmZlcmVuY2VTZXNzaW9uKGUpe2Uuc3RhcnRPYmplY3QoMyk7fXN0YXRpYyBhZGRPcnRWZXJzaW9uKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgwLHQsMCk7fXN0YXRpYyBhZGRNb2RlbChlLHQpe2UuYWRkRmllbGRPZmZzZXQoMSx0LDApO31zdGF0aWMgYWRkU2Vzc2lvblN0YXRlKGUsdCl7ZS5hZGRGaWVsZE9mZnNldCgyLHQsMCk7fXN0YXRpYyBlbmRJbmZlcmVuY2VTZXNzaW9uKGUpe3JldHVybiBlLmVuZE9iamVjdCgpfXN0YXRpYyBmaW5pc2hJbmZlcmVuY2VTZXNzaW9uQnVmZmVyKGUsdCl7ZS5maW5pc2godCwiT1JUTSIpO31zdGF0aWMgZmluaXNoU2l6ZVByZWZpeGVkSW5mZXJlbmNlU2Vzc2lvbkJ1ZmZlcihlLHQpe2UuZmluaXNoKHQsIk9SVE0iLCEwKTt9c3RhdGljIGNyZWF0ZUluZmVyZW5jZVNlc3Npb24oZSx0LHIsbyl7cmV0dXJuIG4uc3RhcnRJbmZlcmVuY2VTZXNzaW9uKGUpLG4uYWRkT3J0VmVyc2lvbihlLHQpLG4uYWRkTW9kZWwoZSxyKSxuLmFkZFNlc3Npb25TdGF0ZShlLG8pLG4uZW5kSW5mZXJlbmNlU2Vzc2lvbihlKX19dC5JbmZlcmVuY2VTZXNzaW9uPW47fSh0LmZic3x8KHQuZmJzPXt9KSk7fShlLmV4cGVyaW1lbnRhbHx8KGUuZXhwZXJpbWVudGFsPXt9KSk7fSh0Lm9ubnhydW50aW1lfHwodC5vbm54cnVudGltZT17fSkpO30sMTcyMzooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuT25ueGpzU2Vzc2lvbkhhbmRsZXI9dm9pZCAwO2NvbnN0IHI9bigyMjM1KSxvPW4oOTI0MCk7dC5Pbm54anNTZXNzaW9uSGFuZGxlcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLnNlc3Npb249ZSx0aGlzLmlucHV0TmFtZXM9dGhpcy5zZXNzaW9uLmlucHV0TmFtZXMsdGhpcy5vdXRwdXROYW1lcz10aGlzLnNlc3Npb24ub3V0cHV0TmFtZXM7fWFzeW5jIGRpc3Bvc2UoKXt9YXN5bmMgcnVuKGUsdCxuKXtjb25zdCBpPW5ldyBNYXA7Zm9yKGNvbnN0IHQgaW4gZSlpZihPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpKXtjb25zdCBuPWVbdF07aS5zZXQodCxuZXcgby5UZW5zb3Iobi5kaW1zLG4udHlwZSx2b2lkIDAsdm9pZCAwLG4uZGF0YSkpO31jb25zdCBzPWF3YWl0IHRoaXMuc2Vzc2lvbi5ydW4oaSksYT17fTtyZXR1cm4gcy5mb3JFYWNoKCgoZSx0KT0+e2FbdF09bmV3IHIuVGVuc29yKGUudHlwZSxlLmRhdGEsZS5kaW1zKTt9KSksYX1zdGFydFByb2ZpbGluZygpe3RoaXMuc2Vzc2lvbi5zdGFydFByb2ZpbGluZygpO31lbmRQcm9maWxpbmcoKXt0aGlzLnNlc3Npb24uZW5kUHJvZmlsaW5nKCk7fX07fSw2MDI3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5TZXNzaW9uPXZvaWQgMDtjb25zdCByPW4oNzA2Nyksbz1uKDEyOTYpLGk9bigxOTc1KSxzPW4oNjQ5NiksYT1uKDEzMTUpLHU9bigxNzQ1KTt0LlNlc3Npb249Y2xhc3N7Y29uc3RydWN0b3IoZT17fSl7dGhpcy5faW5pdGlhbGl6ZWQ9ITEsdGhpcy5iYWNrZW5kSGludD1lLmJhY2tlbmRIaW50LHRoaXMucHJvZmlsZXI9YS5Qcm9maWxlci5jcmVhdGUoZS5wcm9maWxlciksdGhpcy5jb250ZXh0PXtwcm9maWxlcjp0aGlzLnByb2ZpbGVyLGdyYXBoSW5wdXRUeXBlczpbXSxncmFwaElucHV0RGltczpbXX07fWdldCBpbnB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuX21vZGVsLmdyYXBoLmdldElucHV0TmFtZXMoKX1nZXQgb3V0cHV0TmFtZXMoKXtyZXR1cm4gdGhpcy5fbW9kZWwuZ3JhcGguZ2V0T3V0cHV0TmFtZXMoKX1zdGFydFByb2ZpbGluZygpe3RoaXMucHJvZmlsZXIuc3RhcnQoKTt9ZW5kUHJvZmlsaW5nKCl7dGhpcy5wcm9maWxlci5zdG9wKCk7fWFzeW5jIGxvYWRNb2RlbChlLHQsbil7YXdhaXQgdGhpcy5wcm9maWxlci5ldmVudCgic2Vzc2lvbiIsIlNlc3Npb24ubG9hZE1vZGVsIiwoYXN5bmMoKT0+e2NvbnN0IHM9YXdhaXQoMCwgaS5yZXNvbHZlQmFja2VuZCkodGhpcy5iYWNrZW5kSGludCk7aWYodGhpcy5zZXNzaW9uSGFuZGxlcj1zLmNyZWF0ZVNlc3Npb25IYW5kbGVyKHRoaXMuY29udGV4dCksdGhpcy5fbW9kZWw9bmV3IHUuTW9kZWwsInN0cmluZyI9PXR5cGVvZiBlKXtjb25zdCB0PWUuZW5kc1dpdGgoIi5vcnQiKTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJnByb2Nlc3MudmVyc2lvbnMmJnByb2Nlc3MudmVyc2lvbnMubm9kZSl7Y29uc3Qgbj1hd2FpdCgwLCBvLnByb21pc2lmeSkoci5yZWFkRmlsZSkoZSk7dGhpcy5pbml0aWFsaXplKG4sdCk7fWVsc2Uge2NvbnN0IG49YXdhaXQgZmV0Y2goZSkscj1hd2FpdCBuLmFycmF5QnVmZmVyKCk7dGhpcy5pbml0aWFsaXplKG5ldyBVaW50OEFycmF5KHIpLHQpO319ZWxzZSBpZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpdGhpcy5pbml0aWFsaXplKGUpO2Vsc2Uge2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkoZSx0fHwwLG58fGUuYnl0ZUxlbmd0aCk7dGhpcy5pbml0aWFsaXplKHIpO319KSk7fWluaXRpYWxpemUoZSx0KXtpZih0aGlzLl9pbml0aWFsaXplZCl0aHJvdyBuZXcgRXJyb3IoImFscmVhZHkgaW5pdGlhbGl6ZWQiKTt0aGlzLnByb2ZpbGVyLmV2ZW50KCJzZXNzaW9uIiwiU2Vzc2lvbi5pbml0aWFsaXplIiwoKCk9Pntjb25zdCBuPXRoaXMuc2Vzc2lvbkhhbmRsZXIudHJhbnNmb3JtR3JhcGg/dGhpcy5zZXNzaW9uSGFuZGxlcjp2b2lkIDA7dGhpcy5fbW9kZWwubG9hZChlLG4sdCksdGhpcy5zZXNzaW9uSGFuZGxlci5vbkdyYXBoSW5pdGlhbGl6ZWQmJnRoaXMuc2Vzc2lvbkhhbmRsZXIub25HcmFwaEluaXRpYWxpemVkKHRoaXMuX21vZGVsLmdyYXBoKSx0aGlzLmluaXRpYWxpemVPcHModGhpcy5fbW9kZWwuZ3JhcGgpLHRoaXMuX2V4ZWN1dGlvblBsYW49bmV3IHMuRXhlY3V0aW9uUGxhbih0aGlzLl9tb2RlbC5ncmFwaCx0aGlzLl9vcHMsdGhpcy5wcm9maWxlcik7fSkpLHRoaXMuX2luaXRpYWxpemVkPSEwO31hc3luYyBydW4oZSl7aWYoIXRoaXMuX2luaXRpYWxpemVkKXRocm93IG5ldyBFcnJvcigic2Vzc2lvbiBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7cmV0dXJuIHRoaXMucHJvZmlsZXIuZXZlbnQoInNlc3Npb24iLCJTZXNzaW9uLnJ1biIsKGFzeW5jKCk9Pntjb25zdCB0PXRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVJbnB1dHMoZSksbj1hd2FpdCB0aGlzLl9leGVjdXRpb25QbGFuLmV4ZWN1dGUodGhpcy5zZXNzaW9uSGFuZGxlcix0KTtyZXR1cm4gdGhpcy5jcmVhdGVPdXRwdXQobil9KSl9bm9ybWFsaXplQW5kVmFsaWRhdGVJbnB1dHMoZSl7Y29uc3QgdD10aGlzLl9tb2RlbC5ncmFwaC5nZXRJbnB1dE5hbWVzKCk7aWYoQXJyYXkuaXNBcnJheShlKSl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYGluY29ycmVjdCBpbnB1dCBhcnJheSBsZW5ndGg6IGV4cGVjdGVkICR7dC5sZW5ndGh9IGJ1dCBnb3QgJHtlLmxlbmd0aH1gKX1lbHNlIHtpZihlLnNpemUhPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYGluY29ycmVjdCBpbnB1dCBtYXAgc2l6ZTogZXhwZWN0ZWQgJHt0Lmxlbmd0aH0gYnV0IGdvdCAke2Uuc2l6ZX1gKTtjb25zdCBuPW5ldyBBcnJheShlLnNpemUpO2xldCByPTA7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDsrK28pe2NvbnN0IGk9ZS5nZXQodFtvXSk7aWYoIWkpdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIGlucHV0IHRlbnNvciBmb3I6ICcke25hbWV9J2ApO25bcisrXT1pO31lPW47fWlmKHRoaXMuY29udGV4dC5ncmFwaElucHV0VHlwZXMmJjAhPT10aGlzLmNvbnRleHQuZ3JhcGhJbnB1dFR5cGVzLmxlbmd0aCYmdGhpcy5jb250ZXh0LmdyYXBoSW5wdXREaW1zJiYwIT09dGhpcy5jb250ZXh0LmdyYXBoSW5wdXREaW1zLmxlbmd0aCl0aGlzLnZhbGlkYXRlSW5wdXRUZW5zb3JEaW1zKHRoaXMuY29udGV4dC5ncmFwaElucHV0RGltcyxlLCExKTtlbHNlIHtjb25zdCB0PXRoaXMuX21vZGVsLmdyYXBoLmdldElucHV0SW5kaWNlcygpLG49dGhpcy5fbW9kZWwuZ3JhcGguZ2V0VmFsdWVzKCkscj1uZXcgQXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7KytvKXtjb25zdCBpPW5bdFtvXV07cltvXT1pLnR5cGUuc2hhcGUuZGltcyx0aGlzLmNvbnRleHQuZ3JhcGhJbnB1dFR5cGVzLnB1c2goaS50eXBlLnRlbnNvclR5cGUpLHRoaXMuY29udGV4dC5ncmFwaElucHV0RGltcy5wdXNoKGVbb10uZGltcyk7fXRoaXMudmFsaWRhdGVJbnB1dFRlbnNvckRpbXMocixlLCEwKTt9cmV0dXJuIHRoaXMudmFsaWRhdGVJbnB1dFRlbnNvclR5cGVzKHRoaXMuY29udGV4dC5ncmFwaElucHV0VHlwZXMsZSksZX12YWxpZGF0ZUlucHV0VGVuc29yVHlwZXMoZSx0KXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgcj1lW25dLG89dFtuXS50eXBlO2lmKHIhPT1vKXRocm93IG5ldyBFcnJvcihgaW5wdXQgdGVuc29yWyR7bn1dIGNoZWNrIGZhaWxlZDogZXhwZWN0ZWQgdHlwZSAnJHtyfScgYnV0IGdvdCAke299YCl9fXZhbGlkYXRlSW5wdXRUZW5zb3JEaW1zKGUsdCxuKXtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7Y29uc3Qgbz1lW3JdLGk9dFtyXS5kaW1zO2lmKCF0aGlzLmNvbXBhcmVUZW5zb3JEaW1zKG8saSxuKSl0aHJvdyBuZXcgRXJyb3IoYGlucHV0IHRlbnNvclske3J9XSBjaGVjayBmYWlsZWQ6IGV4cGVjdGVkIHNoYXBlICdbJHtvLmpvaW4oIiwiKX1dJyBidXQgZ290IFske2kuam9pbigiLCIpfV1gKX19Y29tcGFyZVRlbnNvckRpbXMoZSx0LG4pe2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuICExO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7KytyKWlmKGVbcl0hPT10W3JdJiYoIW58fDAhPT1lW3JdKSlyZXR1cm4gITE7cmV0dXJuICEwfWNyZWF0ZU91dHB1dChlKXtjb25zdCB0PXRoaXMuX21vZGVsLmdyYXBoLmdldE91dHB1dE5hbWVzKCk7aWYoZS5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImV4cGVjdGVkIG51bWJlciBvZiBvdXRwdXRzIGRvIG5vdCBtYXRjaCBudW1iZXIgb2YgZ2VuZXJhdGVkIG91dHB1dHMiKTtjb25zdCBuPW5ldyBNYXA7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDsrK3Ipbi5zZXQodFtyXSxlW3JdKTtyZXR1cm4gbn1pbml0aWFsaXplT3BzKGUpe2NvbnN0IHQ9ZS5nZXROb2RlcygpO3RoaXMuX29wcz1uZXcgQXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXRoaXMuX29wc1tuXT10aGlzLnNlc3Npb25IYW5kbGVyLnJlc29sdmUodFtuXSx0aGlzLl9tb2RlbC5vcHNldHMsZSk7fX07fSw5MjQwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UZW5zb3I9dm9pZCAwO2NvbnN0IG89bigzNDQyKSxpPXIobigxNTgzKSkscz1uKDUxMjcpLGE9bigyNDQ2KSx1PW4oNzI3Myk7dmFyIGw9cy5vbm54cnVudGltZS5leHBlcmltZW50YWwuZmJzO2NsYXNzIGN7Z2V0IGRhdGEoKXtpZih2b2lkIDA9PT10aGlzLmNhY2hlKXtjb25zdCBlPXRoaXMuZGF0YVByb3ZpZGVyKHRoaXMuZGF0YUlkKTtpZihlLmxlbmd0aCE9PXRoaXMuc2l6ZSl0aHJvdyBuZXcgRXJyb3IoIkxlbmd0aCBvZiBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBEYXRhIFByb3ZpZGVyIGlzIGluY29uc2lzdGVudCB3aXRoIHRoZSBkaW1zIG9mIHRoaXMgVGVuc29yLiIpO3RoaXMuY2FjaGU9ZTt9cmV0dXJuIHRoaXMuY2FjaGV9Z2V0IHN0cmluZ0RhdGEoKXtpZigic3RyaW5nIiE9PXRoaXMudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJkYXRhIHR5cGUgaXMgbm90IHN0cmluZyIpO3JldHVybiB0aGlzLmRhdGF9Z2V0IGludGVnZXJEYXRhKCl7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSJ1aW50OCI6Y2FzZSJpbnQ4IjpjYXNlInVpbnQxNiI6Y2FzZSJpbnQxNiI6Y2FzZSJpbnQzMiI6Y2FzZSJ1aW50MzIiOmNhc2UiYm9vbCI6cmV0dXJuIHRoaXMuZGF0YTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoImRhdGEgdHlwZSBpcyBub3QgaW50ZWdlciAodWludDgsIGludDgsIHVpbnQxNiwgaW50MTYsIGludDMyLCB1aW50MzIsIGJvb2wpIil9fWdldCBmbG9hdERhdGEoKXtzd2l0Y2godGhpcy50eXBlKXtjYXNlImZsb2F0MzIiOmNhc2UiZmxvYXQ2NCI6cmV0dXJuIHRoaXMuZGF0YTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoImRhdGEgdHlwZSBpcyBub3QgZmxvYXQgKGZsb2F0MzIsIGZsb2F0NjQpIil9fWdldCBudW1iZXJEYXRhKCl7aWYoInN0cmluZyIhPT10aGlzLnR5cGUpcmV0dXJuIHRoaXMuZGF0YTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlIGNhbm5vdCBiZSBub24tbnVtYmVyIChzdHJpbmcpIil9Z2V0KGUpe3JldHVybiB0aGlzLmRhdGFbdS5TaGFwZVV0aWwuaW5kaWNlc1RvT2Zmc2V0KGUsdGhpcy5zdHJpZGVzKV19c2V0KGUsdCl7dGhpcy5kYXRhW3UuU2hhcGVVdGlsLmluZGljZXNUb09mZnNldChlLHRoaXMuc3RyaWRlcyldPXQ7fWFzeW5jIGdldERhdGEoKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5jYWNoZSYmKHRoaXMuY2FjaGU9YXdhaXQgdGhpcy5hc3luY0RhdGFQcm92aWRlcih0aGlzLmRhdGFJZCkpLHRoaXMuY2FjaGV9Z2V0IHN0cmlkZXMoKXtyZXR1cm4gdGhpcy5fc3RyaWRlc3x8KHRoaXMuX3N0cmlkZXM9dS5TaGFwZVV0aWwuY29tcHV0ZVN0cmlkZXModGhpcy5kaW1zKSksdGhpcy5fc3RyaWRlc31jb25zdHJ1Y3RvcihlLHQsbixyLGkscz1vLkd1aWQuY3JlYXRlKCkpe3RoaXMuZGltcz1lLHRoaXMudHlwZT10LHRoaXMuZGF0YVByb3ZpZGVyPW4sdGhpcy5hc3luY0RhdGFQcm92aWRlcj1yLHRoaXMuY2FjaGU9aSx0aGlzLmRhdGFJZD1zLHRoaXMuc2l6ZT11LlNoYXBlVXRpbC52YWxpZGF0ZURpbXNBbmRDYWxjU2l6ZShlKTtjb25zdCBhPXRoaXMuc2l6ZSxsPXZvaWQgMD09PW4mJnZvaWQgMD09PXImJnZvaWQgMD09PWk7aWYodm9pZCAwIT09aSYmaS5sZW5ndGghPT1hKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnB1dCBkaW1zIGRvZXNuJ3QgbWF0Y2ggZGF0YSBsZW5ndGguIik7aWYoInN0cmluZyI9PT10KXtpZighKHZvaWQgMD09PWl8fEFycmF5LmlzQXJyYXkoaSkmJmkuZXZlcnkoKGU9PiJzdHJpbmciPT10eXBlb2YgZSkpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWNoZSBzaG91bGQgYmUgYSBzdHJpbmcgYXJyYXkiKTtsJiYodGhpcy5jYWNoZT1uZXcgQXJyYXkoYSkpO31lbHNlIHtpZih2b2lkIDAhPT1pKXtjb25zdCBlPWQodCk7aWYoIShpIGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihgY2FjaGUgc2hvdWxkIGJlIHR5cGUgJHtlLm5hbWV9YCl9aWYobCl7Y29uc3QgZT1uZXcgQXJyYXlCdWZmZXIoYSpmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSJib29sIjpjYXNlImludDgiOmNhc2UidWludDgiOnJldHVybiAxO2Nhc2UiaW50MTYiOmNhc2UidWludDE2IjpyZXR1cm4gMjtjYXNlImludDMyIjpjYXNlInVpbnQzMiI6Y2FzZSJmbG9hdDMyIjpyZXR1cm4gNDtjYXNlImZsb2F0NjQiOnJldHVybiA4O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgY2FsY3VsYXRlIHNpemVvZigpIG9uIHR5cGUgJHtlfWApfX0odCkpO3RoaXMuY2FjaGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3KGQodCkpKGUpfShlLHQpO319fXN0YXRpYyBmcm9tUHJvdG8oZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJjYW5ub3QgY29uc3RydWN0IFZhbHVlIGZyb20gYW4gZW1wdHkgdGVuc29yIik7Y29uc3QgdD11LlByb3RvVXRpbC50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byhlLmRhdGFUeXBlKSxuPXUuUHJvdG9VdGlsLnRlbnNvckRpbXNGcm9tUHJvdG8oZS5kaW1zKSxyPW5ldyBjKG4sdCk7aWYoInN0cmluZyI9PT10KWUuc3RyaW5nRGF0YS5mb3JFYWNoKCgoZSx0KT0+e3IuZGF0YVt0XT0oMCwgdS5kZWNvZGVVdGY4U3RyaW5nKShlKTt9KSk7ZWxzZSBpZihlLnJhd0RhdGEmJiJudW1iZXIiPT10eXBlb2YgZS5yYXdEYXRhLmJ5dGVMZW5ndGgmJmUucmF3RGF0YS5ieXRlTGVuZ3RoPjApe2NvbnN0IHQ9ci5kYXRhLG49bmV3IERhdGFWaWV3KGUucmF3RGF0YS5idWZmZXIsZS5yYXdEYXRhLmJ5dGVPZmZzZXQsZS5yYXdEYXRhLmJ5dGVMZW5ndGgpLG89cChlLmRhdGFUeXBlKSxpPWUucmF3RGF0YS5ieXRlTGVuZ3RoL287aWYoZS5yYXdEYXRhLmJ5dGVMZW5ndGglbyE9MCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYnVmZmVyIGxlbmd0aCIpO2lmKHQubGVuZ3RoIT09aSl0aHJvdyBuZXcgRXJyb3IoImJ1ZmZlciBsZW5ndGggbWlzbWF0Y2giKTtmb3IobGV0IHI9MDtyPGk7cisrKXtjb25zdCBpPWgobixlLmRhdGFUeXBlLHIqbyk7dFtyXT1pO319ZWxzZSB7bGV0IHQ7c3dpdGNoKGUuZGF0YVR5cGUpe2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkZMT0FUOnQ9ZS5mbG9hdERhdGE7YnJlYWs7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMzI6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMTY6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDE2OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDg6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDg6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuQk9PTDp0PWUuaW50MzJEYXRhO2JyZWFrO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDY0OnQ9ZS5pbnQ2NERhdGE7YnJlYWs7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuRE9VQkxFOnQ9ZS5kb3VibGVEYXRhO2JyZWFrO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQzMjpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UNjQ6dD1lLnVpbnQ2NERhdGE7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoInVuc3BlY2lmaWMgZXJyb3IiKX1pZihudWxsPT10KXRocm93IG5ldyBFcnJvcigiZmFpbGVkIHRvIHBvcHVsYXRlIGRhdGEgZnJvbSBhIHRlbnNvcnByb3RvIHZhbHVlIik7Y29uc3Qgbj1yLmRhdGE7aWYobi5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImFycmF5IGxlbmd0aCBtaXNtYXRjaCIpO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKXtjb25zdCBvPXRbcl07aS5kZWZhdWx0LmlzTG9uZyhvKT9uW3JdPWYobyxlLmRhdGFUeXBlKTpuW3JdPW87fX1yZXR1cm4gcn1zdGF0aWMgZnJvbURhdGEoZSx0LG4pe3JldHVybiBuZXcgYyh0LG4sdm9pZCAwLHZvaWQgMCxlKX1zdGF0aWMgZnJvbU9ydFRlbnNvcihlKXtpZighZSl0aHJvdyBuZXcgRXJyb3IoImNhbm5vdCBjb25zdHJ1Y3QgVmFsdWUgZnJvbSBhbiBlbXB0eSB0ZW5zb3IiKTtjb25zdCB0PXUuUHJvdG9VdGlsLnRlbnNvckRpbXNGcm9tT1JURm9ybWF0KGUpLG49dS5Qcm90b1V0aWwudGVuc29yRGF0YVR5cGVGcm9tUHJvdG8oZS5kYXRhVHlwZSgpKSxyPW5ldyBjKHQsbik7aWYoInN0cmluZyI9PT1uKWZvcihsZXQgdD0wO3Q8ZS5zdHJpbmdEYXRhTGVuZ3RoKCk7dCsrKXIuZGF0YVt0XT1lLnN0cmluZ0RhdGEodCk7ZWxzZSBpZihlLnJhd0RhdGFBcnJheSgpJiYibnVtYmVyIj09dHlwZW9mIGUucmF3RGF0YUxlbmd0aCgpJiZlLnJhd0RhdGFMZW5ndGgoKT4wKXtjb25zdCB0PXIuZGF0YSxuPW5ldyBEYXRhVmlldyhlLnJhd0RhdGFBcnJheSgpLmJ1ZmZlcixlLnJhd0RhdGFBcnJheSgpLmJ5dGVPZmZzZXQsZS5yYXdEYXRhTGVuZ3RoKCkpLG89cChlLmRhdGFUeXBlKCkpLGk9ZS5yYXdEYXRhTGVuZ3RoKCkvbztpZihlLnJhd0RhdGFMZW5ndGgoKSVvIT0wKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBidWZmZXIgbGVuZ3RoIik7aWYodC5sZW5ndGghPT1pKXRocm93IG5ldyBFcnJvcigiYnVmZmVyIGxlbmd0aCBtaXNtYXRjaCIpO2ZvcihsZXQgcj0wO3I8aTtyKyspe2NvbnN0IGk9aChuLGUuZGF0YVR5cGUoKSxyKm8pO3Rbcl09aTt9fXJldHVybiByfX1mdW5jdGlvbiBwKGUpe3N3aXRjaChlKXtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UODpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ4OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkJPT0w6cmV0dXJuIDE7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDE2OmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDE2OnJldHVybiAyO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkZMT0FUOmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDMyOmNhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQzMjpyZXR1cm4gNDtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ2NDpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5ET1VCTEU6Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDY0OnJldHVybiA4O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgY2FsY3VsYXRlIHNpemVvZigpIG9uIHR5cGUgJHthLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGVbZV19YCl9fWZ1bmN0aW9uIGQoZSl7c3dpdGNoKGUpe2Nhc2UiYm9vbCI6Y2FzZSJ1aW50OCI6cmV0dXJuIFVpbnQ4QXJyYXk7Y2FzZSJpbnQ4IjpyZXR1cm4gSW50OEFycmF5O2Nhc2UiaW50MTYiOnJldHVybiBJbnQxNkFycmF5O2Nhc2UidWludDE2IjpyZXR1cm4gVWludDE2QXJyYXk7Y2FzZSJpbnQzMiI6cmV0dXJuIEludDMyQXJyYXk7Y2FzZSJ1aW50MzIiOnJldHVybiBVaW50MzJBcnJheTtjYXNlImludDY0IjpyZXR1cm4gQmlnSW50NjRBcnJheTtjYXNlImZsb2F0MzIiOnJldHVybiBGbG9hdDMyQXJyYXk7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gRmxvYXQ2NEFycmF5O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ1bnNwZWNpZmllZCBlcnJvciIpfX1mdW5jdGlvbiBmKGUsdCl7aWYodD09PWEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ2NHx8dD09PWwuVGVuc29yRGF0YVR5cGUuSU5UNjQpe2lmKGUuZ3JlYXRlclRoYW5PckVxdWFsKDIxNDc0ODM2NDgpfHxlLmxlc3NUaGFuKC0yMTQ3NDgzNjQ4KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnQ2NCBpcyBub3Qgc3VwcG9ydGVkIil9ZWxzZSB7aWYodCE9PWEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMzImJnQhPT1sLlRlbnNvckRhdGFUeXBlLlVJTlQzMiYmdCE9PWEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UNjQmJnQhPT1sLlRlbnNvckRhdGFUeXBlLlVJTlQ2NCl0aHJvdyBuZXcgVHlwZUVycm9yKGBub3QgYSBMT05HIHR5cGU6ICR7YS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlW3RdfWApO2lmKGUuZ3JlYXRlclRoYW5PckVxdWFsKDQyOTQ5NjcyOTYpfHxlLmxlc3NUaGFuKDApKXRocm93IG5ldyBUeXBlRXJyb3IoInVpbnQ2NCBpcyBub3Qgc3VwcG9ydGVkIil9cmV0dXJuIGUudG9OdW1iZXIoKX1mdW5jdGlvbiBoKGUsdCxuKXtzd2l0Y2godCl7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuQk9PTDpjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UODpyZXR1cm4gZS5nZXRVaW50OChuKTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ4OnJldHVybiBlLmdldEludDgobik7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDE2OnJldHVybiBlLmdldFVpbnQxNihuLCEwKTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQxNjpyZXR1cm4gZS5nZXRJbnQxNihuLCEwKTtjYXNlIGEub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5GTE9BVDpyZXR1cm4gZS5nZXRGbG9hdDMyKG4sITApO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDMyOnJldHVybiBlLmdldEludDMyKG4sITApO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQzMjpyZXR1cm4gZS5nZXRVaW50MzIobiwhMCk7Y2FzZSBhLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UNjQ6cmV0dXJuIGYoaS5kZWZhdWx0LmZyb21CaXRzKGUuZ2V0VWludDMyKG4sITApLGUuZ2V0VWludDMyKG4rNCwhMCksITEpLHQpO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkRPVUJMRTpyZXR1cm4gZS5nZXRGbG9hdDY0KG4sITApO2Nhc2UgYS5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLlVJTlQ2NDpyZXR1cm4gZihpLmRlZmF1bHQuZnJvbUJpdHMoZS5nZXRVaW50MzIobiwhMCksZS5nZXRVaW50MzIobis0LCEwKSwhMCksdCk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCByZWFkIGZyb20gRGF0YVZpZXcgZm9yIHR5cGUgJHthLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGVbdF19YCl9fXQuVGVuc29yPWM7fSw3MjczOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzJiZ0aGlzLl9faW1wb3J0RGVmYXVsdHx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5kZWNvZGVVdGY4U3RyaW5nPXQuTUFYX0NMSVA9dC5NSU5fQ0xJUD10LlBvb2xDb252VXRpbD10LlJlZHVjZVV0aWw9dC5TcGxpdFV0aWw9dC5NYXRoVXRpbD10LlNoYXBlVXRpbD10LkxvbmdVdGlsPXQuUHJvdG9VdGlsPXQuR2VtbVV0aWw9dC5hcnJheUNvcHlIZWxwZXI9dC5Ccm9hZGNhc3RVdGlsPXQuTWF0TXVsVXRpbD10LkFycmF5VXRpbD10LmFzc2VydD10LmNoZWNrSW5wdXRzU2hhcGU9dm9pZCAwO2NvbnN0IG89big1Njg2KSxpPXIobigxNTgzKSkscz1uKDI0NDYpLGE9big5MjQwKTt0LmNoZWNrSW5wdXRzU2hhcGU9ZnVuY3Rpb24oZSwuLi50KXtpZighZXx8ZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4gITE7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYoIWVbbl0uZGltc3x8ZVtuXS5kaW1zLmxlbmd0aCE9PXRbbl0pcmV0dXJuICExO3JldHVybiAhMH0sdC5hc3NlcnQ9ZnVuY3Rpb24oZSx0KXtpZighZSl0aHJvdyBuZXcgRXJyb3IoInN0cmluZyI9PXR5cGVvZiB0P3Q6dCgpKX0sdC5BcnJheVV0aWw9Y2xhc3N7c3RhdGljIGFycmF5c0VxdWFsKGUsdCl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4gITE7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYoZVtuXSE9PXRbbl0pcmV0dXJuICExO3JldHVybiAhMH19O2NsYXNzIHV7c3RhdGljIHByZXByb2Nlc3NJbnB1dFNoYXBlcyhlLHQpe3JldHVybiBbMT09PWUubGVuZ3RoP1sxLGVbMF1dOmUsMT09PXQubGVuZ3RoP1t0WzBdLDFdOnRdfXN0YXRpYyBwb3N0cHJvY2Vzc091dHB1dFNoYXBlKGUsdCxuKXsxPT09dCYmZS5zcGxpY2UoZS5sZW5ndGgtMiwxKSwxPT09biYmZS5wb3AoKTt9c3RhdGljIGNhbGNNYXRNdWxTaGFwZShlLHQpe3JldHVybiBlWzFdIT09dFswXT92b2lkIDA6W2VbMF0sdFsxXV19fXQuTWF0TXVsVXRpbD11O2NsYXNzIGx7c3RhdGljIGNhbGNTaGFwZShlLHQsbj0hMSl7Y29uc3Qgcj1lLmxlbmd0aCxvPXQubGVuZ3RoO2lmKDA9PT1yKXJldHVybiB0O2lmKDA9PT1vKXJldHVybiBlO2NvbnN0IGk9TWF0aC5tYXgoZS5sZW5ndGgsdC5sZW5ndGgpLHM9bmV3IEFycmF5KGkpO2lmKG4pe2lmKHI8Mnx8bzwyKXJldHVybjtjb25zdCBuPXUuY2FsY01hdE11bFNoYXBlKFtlW3ItMl0sZVtyLTFdXSxbdFtvLTJdLHRbby0xXV0pO2lmKHZvaWQgMD09PW4pcmV0dXJuO1tzW2ktMl0sc1tpLTFdXT1uO31mb3IobGV0IGE9bj8zOjE7YTw9aTthKyspe2NvbnN0IG49ci1hPDA/MTplW3ItYV0sdT1vLWE8MD8xOnRbby1hXTtpZihuIT09dSYmbj4xJiZ1PjEpcmV0dXJuO3NbaS1hXT1NYXRoLm1heChuLHUpO31yZXR1cm4gc31zdGF0aWMgaW5kZXgoZSx0KXtjb25zdCBuPW5ldyBBcnJheSh0Lmxlbmd0aCk7cmV0dXJuIGwuZmlsbEluZGV4KGUsdCxuKSxufXN0YXRpYyBmaWxsSW5kZXgoZSx0LG4pe2NvbnN0IHI9ZS5sZW5ndGgtdC5sZW5ndGg7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspbltvXT1lW3Irb10ldFtvXTt9c3RhdGljIGNhbGMoZSx0LG4scixvKXtjb25zdCBpPWwuY2FsY1NoYXBlKGUuZGltcyx0LmRpbXMpO2lmKGkpe2lmKHImJiFkLmFyZUVxdWFsKGksZS5kaW1zKSlyZXR1cm47Y29uc3Qgcz1kLnNpemUoaSksdT1yP2U6bmV3IGEuVGVuc29yKGksb3x8ZS50eXBlKTtpZigwPT09aS5sZW5ndGgpdS5zZXQoW10sbihlLmdldChbXSksdC5nZXQoW10pKSk7ZWxzZSB7Y29uc3Qgcj1uZXcgQXJyYXkoaS5sZW5ndGgpLG89bmV3IEFycmF5KGUuZGltcy5sZW5ndGgpLGE9bmV3IEFycmF5KHQuZGltcy5sZW5ndGgpO2xldCBjLHA9MCxkPTAsZj0hMSxoPSExOzA9PT1lLmRpbXMubGVuZ3RoJiYocD1lLmdldChbXSksZj0hMCksMD09PXQuZGltcy5sZW5ndGgmJihkPXQuZ2V0KFtdKSxoPSEwKTtmb3IobGV0IGc9MDtnPHM7ZysrKXtjPWc7Zm9yKGxldCBlPWkubGVuZ3RoLTE7ZT49MDtlLS0pcltlXT1jJWlbZV0sYz1NYXRoLmZsb29yKGMvaVtlXSk7Znx8KGwuZmlsbEluZGV4KHIsZS5kaW1zLG8pLHA9ZS5nZXQobykpLGh8fChsLmZpbGxJbmRleChyLHQuZGltcyxhKSxkPXQuZ2V0KGEpKSx1LnNldChyLG4ocCxkKSk7fX1yZXR1cm4gdX19c3RhdGljIGlzVmFsaWRCcm9hZGNhc3QoZSx0KXtjb25zdCBuPWUubGVuZ3RoLHI9dC5sZW5ndGg7aWYobj5yKXJldHVybiAhMTtmb3IobGV0IG89MTtvPD1uO28rKylpZigxIT09ZVtuLW9dJiZlW24tb10hPT10W3Itb10pcmV0dXJuICExO3JldHVybiAhMH1zdGF0aWMgZ2V0QnJvYWRjYXN0RGltcyhlLHQpe2NvbnN0IG49ZS5sZW5ndGgscj1bXTtmb3IobGV0IG89MDtvPG47bysrKXtjb25zdCBpPW4tMS1vLHM9ZVtpXXx8MTsodFt0Lmxlbmd0aC0xLW9dfHwxKT4xJiYxPT09cyYmci51bnNoaWZ0KGkpO31yZXR1cm4gcn19dC5Ccm9hZGNhc3RVdGlsPWwsdC5hcnJheUNvcHlIZWxwZXI9ZnVuY3Rpb24oZSx0LG4scixvKXtpZihyPDB8fHI+PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic291cmNlSW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKG48MHx8bj49ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXRJbmRleCBvdXQgb2YgYm91bmRzIik7aWYocitvPnQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic291cmNlIGluZGljZXMgdG8gYmUgY29waWVkIGFyZSBvdXRzaWRlIGJvdW5kcyIpO2lmKG4rbz5lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRhcmdldCBhcnJheSBpcyB0b28gc21hbGwgdG8gaG9sZCByZXN1bHQiKTtmb3IobGV0IGk9MDtpPG87aSsrKWVbbitpXT10W3IraV07fSx0LkdlbW1VdGlsPWNsYXNze3N0YXRpYyBnZXRTaGFwZU9mR2VtbVJlc3VsdChlLHQsbixyLG8pe2lmKDIhPT1lLmxlbmd0aHx8MiE9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic2hhcGUgbmVlZCB0byBiZSBvZiBzaXplIDIiKTtsZXQgaSxzLGE7dD8oaT1lWzFdLHM9ZVswXSk6KGk9ZVswXSxzPWVbMV0pO2xldCB1PS0xO2lmKHI/KGE9blswXSx1PTEpOihhPW5bMV0sdT0wKSxuW3VdIT09cyl0aHJvdyBuZXcgRXJyb3IoImRpbWVuc2lvbiBtaXNtYXRjaCIpO2lmKGk8PTB8fGE8PTB8fHM8PTApdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNoYXBlIHNwZWNpZmllZCIpO2lmKG8mJiFsLmlzVmFsaWRCcm9hZGNhc3QobyxbaSxhXSkpdGhyb3cgbmV3IEVycm9yKCJnZW1tOiBpbnZhbGlkIGJpYXMgc2hhcGUgZm9yIGJyb2FkY2FzdCIpO3JldHVybiBbaSxhLHNdfX07Y2xhc3MgY3tzdGF0aWMgdGVuc29yRGF0YVR5cGVGcm9tUHJvdG8oZSl7c3dpdGNoKGUpe2Nhc2Ugcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLklOVDg6cmV0dXJuICJpbnQ4IjtjYXNlIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UODpyZXR1cm4gInVpbnQ4IjtjYXNlIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5CT09MOnJldHVybiAiYm9vbCI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UMTY6cmV0dXJuICJpbnQxNiI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDE2OnJldHVybiAidWludDE2IjtjYXNlIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQzMjpyZXR1cm4gImludDMyIjtjYXNlIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMzI6cmV0dXJuICJ1aW50MzIiO2Nhc2Ugcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkZMT0FUOnJldHVybiAiZmxvYXQzMiI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuRE9VQkxFOnJldHVybiAiZmxvYXQ2NCI7Y2FzZSBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuU1RSSU5HOnJldHVybiAic3RyaW5nIjtjYXNlIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ2NDpyZXR1cm4gImludDMyIjtjYXNlIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UNjQ6cmV0dXJuICJ1aW50MzIiO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7cy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlW2VdfWApfX1zdGF0aWMgdGVuc29yRGF0YVR5cGVTdHJpbmdUb0VudW0oZSl7c3dpdGNoKGUpe2Nhc2UiaW50OCI6cmV0dXJuIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQ4O2Nhc2UidWludDgiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDg7Y2FzZSJib29sIjpyZXR1cm4gcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkJPT0w7Y2FzZSJpbnQxNiI6cmV0dXJuIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQxNjtjYXNlInVpbnQxNiI6cmV0dXJuIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMTY7Y2FzZSJpbnQzMiI6cmV0dXJuIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5JTlQzMjtjYXNlInVpbnQzMiI6cmV0dXJuIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5VSU5UMzI7Y2FzZSJmbG9hdDMyIjpyZXR1cm4gcy5vbm54LlRlbnNvclByb3RvLkRhdGFUeXBlLkZMT0FUO2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIHMub25ueC5UZW5zb3JQcm90by5EYXRhVHlwZS5ET1VCTEU7Y2FzZSJzdHJpbmciOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuU1RSSU5HO2Nhc2UiaW50NjQiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuSU5UNjQ7Y2FzZSJ1aW50NjQiOnJldHVybiBzLm9ubnguVGVuc29yUHJvdG8uRGF0YVR5cGUuVUlOVDY0O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7ZX1gKX19c3RhdGljIHRlbnNvckRpbXNGcm9tUHJvdG8oZSl7cmV0dXJuIGUubWFwKChlPT5pLmRlZmF1bHQuaXNMb25nKGUpP2UudG9OdW1iZXIoKTplKSl9c3RhdGljIHRlbnNvclZhbHVlVHlwZUZyb21Qcm90byhlKXtyZXR1cm4ge3RlbnNvclR5cGU6Yy50ZW5zb3JEYXRhVHlwZUZyb21Qcm90byhlLmVsZW1UeXBlKSxzaGFwZTp7ZGltczpjLnRlbnNvckRpbXNGcm9tUHJvdG8oZS5zaGFwZS5kaW0ubWFwKChlPT5lLmRpbVZhbHVlKSkpfX19c3RhdGljIHRlbnNvckRpbXNGcm9tT1JURm9ybWF0KGUpe2NvbnN0IHQ9W107Zm9yKGxldCBuPTA7bjxlLmRpbXNMZW5ndGgoKTtuKyspdC5wdXNoKHAubG9uZ1RvTnVtYmVyKGUuZGltcyhuKSkpO3JldHVybiB0fXN0YXRpYyB0ZW5zb3JBdHRyaWJ1dGVzRnJvbU9SVEZvcm1hdChlKXtjb25zdCB0PVtdO2ZvcihsZXQgbj0wO248ZS5hdHRyaWJ1dGVzTGVuZ3RoKCk7bisrKXQucHVzaChlLmF0dHJpYnV0ZXMobikpO3JldHVybiB0fX10LlByb3RvVXRpbD1jO2NsYXNzIHB7c3RhdGljIGxvbmdUb051bWJlcihlLHQpe3JldHVybiBpLmRlZmF1bHQuaXNMb25nKGUpP2UudG9OdW1iZXIoKTplIGluc3RhbmNlb2Ygby5mbGF0YnVmZmVycy5Mb25nP2kuZGVmYXVsdC5mcm9tVmFsdWUoe2xvdzplLmxvdyxoaWdoOmUuaGlnaCx1bnNpZ25lZDpudWxsIT10JiZ0fSkudG9OdW1iZXIoKTplfXN0YXRpYyBpc0xvbmcoZSl7cmV0dXJuIGkuZGVmYXVsdC5pc0xvbmcoZSl8fGUgaW5zdGFuY2VvZiBvLmZsYXRidWZmZXJzLkxvbmd9fXQuTG9uZ1V0aWw9cDtjbGFzcyBke3N0YXRpYyBzaXplKGUpe3JldHVybiBkLmdldFNpemVGcm9tRGltZW5zaW9uUmFuZ2UoZSwwLGUubGVuZ3RoKX1zdGF0aWMgc2l6ZUZyb21EaW1lbnNpb24oZSx0KXtpZih0PDB8fHQ+ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRpbWVuc2lvbiBvZiAke3R9IGZvciBzaXplRnJvbURpbWVuc2lvbiBhcyBUZW5zb3IgaGFzICR7ZS5sZW5ndGh9IGRpbWVuc2lvbnMuYCk7cmV0dXJuIGQuZ2V0U2l6ZUZyb21EaW1lbnNpb25SYW5nZShlLHQsZS5sZW5ndGgpfXN0YXRpYyBzaXplVG9EaW1lbnNpb24oZSx0KXtpZih0PDB8fHQ+ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRpbWVuc2lvbiBvZiAke3R9IGZvciBzaXplVG9EaW1lbnNpb24gYXMgVGVuc29yIGhhcyAke2UubGVuZ3RofSBkaW1lbnNpb25zLmApO3JldHVybiBkLmdldFNpemVGcm9tRGltZW5zaW9uUmFuZ2UoZSwwLHQpfXN0YXRpYyBnZXRTaXplRnJvbURpbWVuc2lvblJhbmdlKGUsdCxuKXtsZXQgcj0xO2ZvcihsZXQgbz10O288bjtvKyspe2lmKGVbb108PTApdGhyb3cgbmV3IEVycm9yKCJjYW5ub3QgZ2V0IHZhbGlkIHNpemUgZnJvbSBzcGVjaWZpZWQgZGltZW5zaW9uIHJhbmdlLiBNb3N0IGxpa2VseSB0aGUgcmFuZ2UgY29udGFpbnMgMCBvciBuZWdhdGl2ZSB2YWx1ZXMgaW4gdGhlbS4iKTtyKj1lW29dO31yZXR1cm4gcn1zdGF0aWMgY29tcHV0ZVN0cmlkZXMoZSl7Y29uc3QgdD1lLmxlbmd0aDtpZigwPT09dClyZXR1cm4gW107aWYoMT09PXQpcmV0dXJuIFsxXTtjb25zdCBuPW5ldyBBcnJheSh0KTtuW3QtMV09MSxuW3QtMl09ZVt0LTFdO2ZvcihsZXQgcj10LTM7cj49MDstLXIpbltyXT1uW3IrMV0qZVtyKzFdO3JldHVybiBufXN0YXRpYyB0cmFuc3Bvc2UoZSl7cmV0dXJuIGUuc2xpY2UoKS5yZXZlcnNlKCl9c3RhdGljIGluZGljZXNUb09mZnNldChlLHQsbil7dm9pZCAwPT09biYmKG49ZS5sZW5ndGgpO2xldCByPTA7Zm9yKGxldCBvPTA7bzxuOysrbylyKz10W29dKmVbb107cmV0dXJuIHJ9c3RhdGljIG9mZnNldFRvSW5kaWNlcyhlLHQpe2NvbnN0IG49dC5sZW5ndGg7aWYoMD09PW4pcmV0dXJuIFtdO2lmKDE9PT1uKXJldHVybiBbZSp0WzBdXTtjb25zdCByPW5ldyBBcnJheSh0Lmxlbmd0aCk7Zm9yKGxldCBuPTA7bjxyLmxlbmd0aC0xOysrbilyW25dPU1hdGguZmxvb3IoZS90W25dKSxlLT1yW25dKnRbbl07cmV0dXJuIHJbci5sZW5ndGgtMV09ZSxyfXN0YXRpYyBub3JtYWxpemVBeGlzKGUsdCl7aWYoZTwtdCYmZT49dCl0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIGF4aXMgZm9yIHRoaXMgb3BlcmF0aW9uLiIpO3JldHVybiBlPDA/ZSt0OmV9c3RhdGljIG5vcm1hbGl6ZUF4ZXMoZSx0KXtyZXR1cm4gZS5tYXAoKGU9PnRoaXMubm9ybWFsaXplQXhpcyhlLHQpKSl9c3RhdGljIGluY3JlbWVudEluZGV4KGUsdCxuKXtpZigwPT09dC5sZW5ndGh8fDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkluZGV4IGluY3JlbWVudGluZyB1bnN1cHBvcnRlZCBmb3Igc2NhbGFyIFRlbnNvciIpO2lmKHZvaWQgMD09PW4pbj10Lmxlbmd0aDtlbHNlIGlmKG48PTB8fG4+dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbmNvcnJlY3QgYXhpcyB0byBpbmNyZW1lbnQgb24iKTtmb3IobGV0IHI9bi0xO3I+PTAmJihlW3JdKyssIShlW3JdPHRbcl0pKTstLXIpZVtyXT0wO31zdGF0aWMgY2FsY3VsYXRlUmVzaGFwZWREaW1zKGUsdCl7aWYoMD09PXQubGVuZ3RoKXtpZigwPT09ZS5sZW5ndGh8fDE9PT1kLnNpemUoZSkpcmV0dXJuIFtdO3Rocm93IG5ldyBFcnJvcigiY2Fubm90IHJlc2hhcGUgdG8gYSBzY2FsYXIgVGVuc29yIil9Y29uc3Qgbj10Lmxlbmd0aCxyPW5ldyBBcnJheShuKTtsZXQgbz0tMSxpPTE7Zm9yKGxldCBzPTA7czxuO3MrKyl7aWYodFtzXTwtMSl0aHJvdyBuZXcgRXJyb3IoImEgZGltZW5zaW9uIGluIHNoYXBlIGhpbnRzIGNhbm5vdCBiZSBsZXNzIHRoYW4gLTEiKTtpZigtMT09PXRbc10pe2lmKC0xIT09byl0aHJvdyBuZXcgRXJyb3IoImF0IG1vc3Qgb25lIGRpbWVuc2lvbiBpbiBzaGFwZSBoaW50cyBjYW4gYmUgLTEiKTtvPXM7fWVsc2Uge2lmKDA9PT10W3NdKXtpZihzPj1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRoZSBkaW1lbnNpb24gd2l0aCB2YWx1ZSB6ZXJvIGV4Y2VlZHMgdGhlIGRpbWVuc2lvbiBzaXplIG9mIHRoZSBpbnB1dCB0ZW5zb3IiKTtyW3NdPWVbc107fWVsc2UgcltzXT10W3NdO2kqPXJbc107fX1jb25zdCBzPWQuc2l6ZShlKTtpZigtMSE9PW8pe2lmKHMlaSE9MCl0aHJvdyBuZXcgRXJyb3IoYHRoZSBpbnB1dCB0ZW5zb3IgY2Fubm90IGJlIHJlc2hhcGVkIHRvIHRoZSByZXF1ZXN0ZWQgc2hhcGUuIElucHV0IHNoYXBlOiBbJHtlfV0gT3V0cHV0IHNoYXBlOiBbJHt0fV1gKTtyW29dPXMvaTt9ZWxzZSBpZihpIT09cyl0aHJvdyBuZXcgRXJyb3IoInJlc2hhcGVkRGltcyBhbmQgb3JpZ2luYWxEaW1zIGRvbid0IGhhdmUgbWF0Y2hpbmcgc2l6ZXMiKTtyZXR1cm4gcn1zdGF0aWMgc29ydEJhc2VkT25QZXJtKGUsdCl7cmV0dXJuIHQ/dC5tYXAoKHQ9PmVbdF0pKTplLnNsaWNlKCkucmV2ZXJzZSgpfXN0YXRpYyBwYWRTaGFwZShlLHQpe2NvbnN0IG49ZS5sZW5ndGg7cmV0dXJuIGUubWFwKCgoZSxyKT0+ZSt0W3JdK3RbcituXSkpfXN0YXRpYyBhcmVFcXVhbChlLHQpe3JldHVybiBlLmxlbmd0aD09PXQubGVuZ3RoJiZlLmV2ZXJ5KCgoZSxuKT0+ZT09PXRbbl0pKX1zdGF0aWMgdmFsaWRhdGVEaW1zQW5kQ2FsY1NpemUoZSl7aWYoZS5sZW5ndGg+Nil0aHJvdyBuZXcgVHlwZUVycm9yKCJPbmx5IHJhbmsgMCB0byA2IGlzIHN1cHBvcnRlZCBmb3IgdGVuc29yIHNoYXBlLiIpO2xldCB0PTE7Zm9yKGNvbnN0IG4gb2YgZSl7aWYoIU51bWJlci5pc0ludGVnZXIobikpdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBzaGFwZTogJHtufSBpcyBub3QgYW4gaW50ZWdlcmApO2lmKG48MHx8bj4yMTQ3NDgzNjQ3KXRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgc2hhcGU6IGxlbmd0aCAke259IGlzIG5vdCBhbGxvd2VkYCk7dCo9bjt9cmV0dXJuIHR9c3RhdGljIGZsYXR0ZW5TaGFwZShlLHQpe3Q8MCYmKHQrPWUubGVuZ3RoKTtjb25zdCBuPWUucmVkdWNlKCgoZSx0KT0+ZSp0KSwxKSxyPWUuc2xpY2UodCkucmVkdWNlKCgoZSx0KT0+ZSp0KSwxKTtyZXR1cm4gW24vcixyXX1zdGF0aWMgc3F1ZWV6ZVNoYXBlKGUsdCl7Y29uc3Qgbj1uZXcgQXJyYXk7dD1kLm5vcm1hbGl6ZUF4ZXModCxlLmxlbmd0aCk7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspe2NvbnN0IG89dC5pbmRleE9mKHIpPj0wO2lmKG8mJjEhPT1lW3JdKXRocm93IG5ldyBFcnJvcigic3F1ZWV6ZSBhbiBheGlzIG9mIHNpemUgZGlmZmVyZW50IHRoYW4gMSIpOygwPT09dC5sZW5ndGgmJmVbcl0+MXx8dC5sZW5ndGg+MCYmIW8pJiZuLnB1c2goZVtyXSk7fXJldHVybiBufXN0YXRpYyB1bnNxdWVlemVTaGFwZShlLHQpe2NvbnN0IG49bmV3IEFycmF5KGUubGVuZ3RoK3QubGVuZ3RoKTtuLmZpbGwoMCk7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2NvbnN0IHI9ZC5ub3JtYWxpemVBeGlzKHRbZV0sbi5sZW5ndGgpO2lmKHI+PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiJ2F4ZXMnIGhhcyBhbiBvdXQgb2YgcmFuZ2UgYXhpcyIpO2lmKDAhPT1uW3JdKXRocm93IG5ldyBFcnJvcigiJ2F4ZXMnIGhhcyBhIGR1cGxpY2F0ZSBheGlzIik7bltyXT0xO31sZXQgcj0wO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKTA9PT1uW3RdJiYoblt0XT1lW3IrK10pO2lmKHIhPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRoZSB1bnNxdWVlemVkIGRpbWVuc2lvbiBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQiKTtyZXR1cm4gbn19dC5TaGFwZVV0aWw9ZCx0Lk1hdGhVdGlsPWNsYXNze3N0YXRpYyBzcXIoZSx0LG4scixvKXtpZihyPDB8fHI+PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic291cmNlSW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKG48MHx8bj49ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXRJbmRleCBvdXQgb2YgYm91bmRzIik7aWYocitvPnQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigic291cmNlIGluZGljZXMgdG8gYmUgY29waWVkIGFyZSBvdXRzaWRlIGJvdW5kcyIpO2lmKG4rbz5lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInRhcmdldCBhcnJheSBpcyB0b28gc21hbGwgdG8gaG9sZCByZXN1bHQiKTtmb3IobGV0IGk9MDtpPG87aSsrKWVbbitpXSs9TWF0aC5wb3codFtyK2ldLDIpO31zdGF0aWMgYXhweShlLHQsbixyLG8saSl7aWYocjwwfHxyPj10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZUluZGV4IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0SW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKHIrbz50Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZSBpbmRpY2VzIHRvIGJlIGNvcGllZCBhcmUgb3V0c2lkZSBib3VuZHMiKTtpZihuK28+ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXQgYXJyYXkgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVzdWx0Iik7Zm9yKGxldCBzPTA7czxvO3MrKyllW24rc10rPWkqdFtyK3NdO31zdGF0aWMgcG93eChlLHQsbixyLG8saSl7aWYocjwwfHxyPj10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZUluZGV4IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0SW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKHIrbz50Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZSBpbmRpY2VzIHRvIGJlIGNvcGllZCBhcmUgb3V0c2lkZSBib3VuZHMiKTtpZihuK28+ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXQgYXJyYXkgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVzdWx0Iik7Zm9yKGxldCBzPTA7czxvO3MrKyllW24rc109TWF0aC5wb3codFtyK3NdLGkpO31zdGF0aWMgbXVsKGUsdCxuLHIsbyl7aWYocjwwfHxyPj10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZUluZGV4IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigidGFyZ2V0SW5kZXggb3V0IG9mIGJvdW5kcyIpO2lmKHIrbz50Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInNvdXJjZSBpbmRpY2VzIHRvIGJlIGNvcGllZCBhcmUgb3V0c2lkZSBib3VuZHMiKTtpZihuK28+ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXQgYXJyYXkgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVzdWx0Iik7Zm9yKGxldCBpPTA7aTxvO2krKyllW24raV09dFtyK2ldKmVbbitpXTt9fTtjbGFzcyBme3N0YXRpYyBzcGxpdFNoYXBlKGUsdCxuLHIpe2lmKDA9PT1uLmxlbmd0aCl7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJuZWVkIHRvIGtub3cgbnVtYmVyIG9mIG91dHB1dHMgd2hlbiB0aGUgJ3NwbGl0JyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCIpO2YuZGV0ZXJtaW5lU3BsaXQoZVt0XSxyLG4pO31jb25zdCBvPVtdLGk9WzBdO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7KytyKXswIT09ciYmaS5wdXNoKGlbci0xXStuW3ItMV0pO2NvbnN0IHM9ZS5zbGljZSgpO3NbdF09bltyXSxvLnB1c2gocyk7fXJldHVybiBbbyxpXX1zdGF0aWMgZGV0ZXJtaW5lU3BsaXQoZSx0LG4pe2lmKGUldCE9MCl0aHJvdyBuZXcgRXJyb3IoImNhbm5vdCBzcGxpdCB0ZW5zb3IgdG8gZXF1YWwgc2l6ZWQgcGFydHMiKTtmb3IobGV0IHI9MDtyPHQ7KytyKW4ucHVzaChlL3QpO319dC5TcGxpdFV0aWw9ZjtjbGFzcyBoe3N0YXRpYyBjYWxjUmVkdWNlKGUsdCxuLHIsbyl7Y29uc3QgaT1lLmRpbXMuc2xpY2UoMCk7MD09PXQubGVuZ3RoJiZpLmZvckVhY2goKChlLG4pPT50LnB1c2gobikpKTtjb25zdCBzPWguY2FsY1JlZHVjZVNoYXBlKGksdCwhMCksdT1kLnNpemUocyksYz1uZXcgYS5UZW5zb3IocyxlLnR5cGUpLHA9ZC5jb21wdXRlU3RyaWRlcyhzKSxmPWQuY29tcHV0ZVN0cmlkZXMoaSksZz1uZXcgQXJyYXkoaS5sZW5ndGgpO2ZvcihsZXQgbj0wO248dTtuKyspe2NvbnN0IHM9ZC5vZmZzZXRUb0luZGljZXMobixwKTtsLmZpbGxJbmRleChzLGksZyksYy5zZXQocyxoLmNhbGNSZWR1Y2VCeUF4aXMoZS5udW1iZXJEYXRhLHQsaSwwLGQuaW5kaWNlc1RvT2Zmc2V0KGcsZikscixvKSk7fXJldHVybiBuP2M6bmV3IGEuVGVuc29yKGguY2FsY1JlZHVjZVNoYXBlKGksdCxuKSxjLnR5cGUsdm9pZCAwLHZvaWQgMCxjLmRhdGEsYy5kYXRhSWQpfXN0YXRpYyBjYWxjUmVkdWNlQnlBeGlzKGUsdCxuLHIsbyxpLHMpe2xldCBhPTA7aWYocj49dC5sZW5ndGgpcmV0dXJuIGkoZVtvXSk7Y29uc3QgdT10W3JdLGw9dT49bi5sZW5ndGg/MTpkLnNpemUobi5zbGljZSh1KzEpKTtmb3IobGV0IGM9MDtjPG5bdV07YysrKWE9MD09PWM/aC5jYWxjUmVkdWNlQnlBeGlzKGUsdCxuLHIrMSxvLGkscyk6cyhhLGguY2FsY1JlZHVjZUJ5QXhpcyhlLHQsbixyKzEsbyxpLHMpKSxvKz1sO3JldHVybiBhfXN0YXRpYyBjYWxjUmVkdWNlU2hhcGUoZSx0LG4pe2NvbnN0IHI9ZS5zbGljZSgpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXJbdFtlXV09bj8xOjA7cmV0dXJuIHIuZmlsdGVyKChlPT4wIT09ZSkpfX10LlJlZHVjZVV0aWw9aDtjbGFzcyBne3N0YXRpYyBhZGp1c3RQb29sQXR0cmlidXRlcyhlLHQsbixyLG8saSl7aWYoIWUmJm4ubGVuZ3RoIT09dC5sZW5ndGgtMil0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBvZiBzcGVjaWZpZWQga2VybmVsIHNoYXBlcyBzaG91bGQgYmUgMiBsZXNzIHRoYW4gbGVuZ3RoIG9mIGlucHV0IGRpbWVuc2lvbnMiKTtpZihlKWZvcihsZXQgZT0wO2U8dC5sZW5ndGgtMjtlKyspZT49bi5sZW5ndGg/bi5wdXNoKHRbZSsyXSk6bltlXT10W2UrMl07Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspaWYoZTxyLmxlbmd0aCl7aWYocltlXTwwKXRocm93IG5ldyBFcnJvcigic3RyaWRlcyBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEiKX1lbHNlIHIucHVzaCgxKTtmb3IobGV0IGU9MDtlPG4ubGVuZ3RoO2UrKylpZihlPG8ubGVuZ3RoKXtpZihvW2VdPDApdGhyb3cgbmV3IEVycm9yKCJkaWxhdGlvbnMgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIil9ZWxzZSBvLnB1c2goMSk7Zm9yKGxldCBlPTA7ZTwyKm4ubGVuZ3RoO2UrKylpZihlPGkubGVuZ3RoKXtpZihpW2VdPDApdGhyb3cgbmV3IEVycm9yKCJwYWQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxIil9ZWxzZSBpLnB1c2goMCk7Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspe2lmKG5bZV08PTApdGhyb3cgbmV3IEVycm9yKCJrZXJuZWwgc2hhcGVzIG5lZWQgdG8gYmUgZ3JlYXRlciB0aGFuIDAiKTtpZihpW2VdPj1uW2VdfHxpW2Urbi5sZW5ndGhdPj1uW2VdKXRocm93IG5ldyBFcnJvcigicGFkcyBzaG91bGQgYmUgc21hbGxlciB0aGFuIGtlcm5lbCIpfX1zdGF0aWMgYWRqdXN0UGFkc0Jhc2VkT25BdXRvUGFkKGUsdCxuLHIsbyxpKXtpZihpKXtpZihvLmxlbmd0aCE9PTIqKGUubGVuZ3RoLTIpKXRocm93IG5ldyBFcnJvcigibGVuZ3RoIG9mIHBhZHMgc2hvdWxkIGJlIHR3aWNlIHRoZSBsZW5ndGggb2YgZGF0YSBkaW1lbnNpb25zIik7aWYodC5sZW5ndGghPT1lLmxlbmd0aC0yKXRocm93IG5ldyBFcnJvcigibGVuZ3RoIG9mIHN0cmlkZXMgc2hvdWxkIGJlIHRoZSBsZW5ndGggb2YgZGF0YSBkaW1lbnNpb25zIik7aWYoci5sZW5ndGghPT1lLmxlbmd0aC0yKXRocm93IG5ldyBFcnJvcigibGVuZ3RoIG9mIGtlcm5lbCBzaGFwZXMgc2hvdWxkIGJlIHRoZSBsZW5ndGggb2YgZGF0YSBkaW1lbnNpb25zIik7Zm9yKGxldCBzPTA7czxlLmxlbmd0aC0yO3MrKylnLmFkanVzdFBhZEFuZFJldHVyblNoYXBlKGVbcysyXSx0W3NdLG5bc10scltzXSxvLHMscytlLmxlbmd0aC0yLGkpO319c3RhdGljIGNvbXB1dGVQb29sT3V0cHV0U2hhcGUoZSx0LG4scixvLGkscyl7aWYodC5sZW5ndGg8PTApdGhyb3cgbmV3IEVycm9yKCJpbnB1dCBzaGFwZSBtdXN0IGJlIG9mIHNpemUgZ3JlYXRlciB0aGFuIDAiKTtjb25zdCBhPVt0WzBdLHRbMV1dO3JldHVybiBnLmNvbXB1dGVTaGFwZUhlbHBlcihlLHQsYSxuLHIsbyxpLHMpLGF9c3RhdGljIGNvbXB1dGVDb252T3V0cHV0U2hhcGUoZSx0LG4scixvLGkscyl7aWYoZS5sZW5ndGg8PTB8fHQubGVuZ3RoPD0wKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBpbnB1dCB0ZW5zb3IgZGltcyBvciBpbnZhbGlkIGZpbHRlciB0ZW5zb3IgZGltcyIpO2NvbnN0IGE9W2VbMF0sdFswXV07cmV0dXJuIGcuY29tcHV0ZVNoYXBlSGVscGVyKCExLGUsYSxuLHIsbyxpLHMpLGF9c3RhdGljIGNvbXB1dGVTaGFwZUhlbHBlcihlLHQsbixyLG8saSxzLGEpe2lmKGUpZm9yKGxldCBlPTA7ZTx0Lmxlbmd0aC0yO2UrKyluLnB1c2goMSk7ZWxzZSBmb3IobGV0IGU9MDtlPHQubGVuZ3RoLTI7ZSsrKW4ucHVzaChnLmFkanVzdFBhZEFuZFJldHVyblNoYXBlKHRbZSsyXSxyW2VdLG9bZV0saVtlXSxzLGUsZSt0Lmxlbmd0aC0yLGEpKTt9c3RhdGljIGFkanVzdFBhZEFuZFJldHVyblNoYXBlKGUsdCxuLHIsbyxpLHMsYSl7Y29uc3QgdT1uKihyLTEpKzE7aWYoIWF8fCJOT1RTRVQiPT09YSlyZXR1cm4gTWF0aC5mbG9vcigoZStvW2ldK29bc10tdSkvdCsxKTtzd2l0Y2goYSl7Y2FzZSJWQUxJRCI6cmV0dXJuIG9baV09MCxvW3NdPTAsTWF0aC5mbG9vcigoZS11KS90KzEpO2Nhc2UiU0FNRV9MT1dFUiI6Y2FzZSJTQU1FX1VQUEVSIjppZigxIT09bil0aHJvdyBuZXcgRXJyb3IoIkRpbGF0aW9uIG5vdCBzdXBwb3J0ZWQgZm9yIFNBTUVfVVBQRVIgb3IgU0FNRV9MT1dFUiIpO3tjb25zdCBuPSgoZSt0LTEpL3QtMSkqdCtyLWU7cmV0dXJuIG9baV09IlNBTUVfTE9XRVIiPT09YT9NYXRoLmZsb29yKChuKzEpLzIpOk1hdGguZmxvb3Iobi8yKSxvW3NdPW4tb1tpXSxNYXRoLmZsb29yKChlK24tcikvdCsxKX1kZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgQXV0b1BhZCB0eXBlIil9fX10LlBvb2xDb252VXRpbD1nLHQuTUlOX0NMSVA9LTM0MDI4MjM0NjYzODUyODg2ZTIyLHQuTUFYX0NMSVA9MzQwMjgyMzQ2NjM4NTI4ODZlMjIsdC5kZWNvZGVVdGY4U3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiAobmV3IFRleHREZWNvZGVyKS5kZWNvZGUoZSl9O30sODQwODooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnZlcnNpb249dm9pZCAwLHQudmVyc2lvbj0iMS4xNi4zIjt9LDk1NDQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLG89dGhpcyYmdGhpcy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pO3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtvJiYhKCJnZXQiaW4gbz8hdC5fX2VzTW9kdWxlOm8ud3JpdGFibGV8fG8uY29uZmlndXJhYmxlKXx8KG89e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixvKTt9OmZ1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pLGVbcl09dFtuXTt9KSxpPXRoaXMmJnRoaXMuX19zZXRNb2R1bGVEZWZhdWx0fHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihlLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSk7fTpmdW5jdGlvbihlLHQpe2UuZGVmYXVsdD10O30pLHM9dGhpcyYmdGhpcy5fX2ltcG9ydFN0YXJ8fGZ1bmN0aW9uKGUpe2lmKGUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgdD17fTtpZihudWxsIT1lKWZvcih2YXIgbiBpbiBlKSJkZWZhdWx0IiE9PW4mJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZvKHQsZSxuKTtyZXR1cm4gaSh0LGUpLHR9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmVuZFByb2ZpbGluZz10LnJ1bj10LnJlbGVhc2VTZXNzaW9uPXQuY3JlYXRlU2Vzc2lvbj10LmNyZWF0ZVNlc3Npb25GaW5hbGl6ZT10LmNyZWF0ZVNlc3Npb25BbGxvY2F0ZT10LmluaXRpYWxpemVSdW50aW1lPXQuaW5pdGlhbGl6ZVdlYkFzc2VtYmx5SW5zdGFuY2U9dm9pZCAwO2NvbnN0IGE9bigyMjM1KSx1PXMobigxMjU5KSksbD1uKDI2MyksYz0oKT0+ISFhLmVudi53YXNtLnByb3h5JiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50O2xldCBwLGQsZixoPSExLGc9ITEsYj0hMTtjb25zdCBtPVtdLHk9W10sdj1bXSxfPVtdLHc9W10sVD1bXSx4PSgpPT57aWYoaHx8IWd8fGJ8fCFwKXRocm93IG5ldyBFcnJvcigid29ya2VyIG5vdCByZWFkeSIpfSxPPWU9Pntzd2l0Y2goZS5kYXRhLnR5cGUpe2Nhc2UiaW5pdC13YXNtIjpoPSExLGUuZGF0YS5lcnI/KGI9ITAsZFsxXShlLmRhdGEuZXJyKSk6KGc9ITAsZFswXSgpKTticmVhaztjYXNlImluaXQtb3J0IjplLmRhdGEuZXJyP2ZbMV0oZS5kYXRhLmVycik6ZlswXSgpO2JyZWFrO2Nhc2UiY3JlYXRlX2FsbG9jYXRlIjplLmRhdGEuZXJyP20uc2hpZnQoKVsxXShlLmRhdGEuZXJyKTptLnNoaWZ0KClbMF0oZS5kYXRhLm91dCk7YnJlYWs7Y2FzZSJjcmVhdGVfZmluYWxpemUiOmUuZGF0YS5lcnI/eS5zaGlmdCgpWzFdKGUuZGF0YS5lcnIpOnkuc2hpZnQoKVswXShlLmRhdGEub3V0KTticmVhaztjYXNlImNyZWF0ZSI6ZS5kYXRhLmVycj92LnNoaWZ0KClbMV0oZS5kYXRhLmVycik6di5zaGlmdCgpWzBdKGUuZGF0YS5vdXQpO2JyZWFrO2Nhc2UicmVsZWFzZSI6ZS5kYXRhLmVycj9fLnNoaWZ0KClbMV0oZS5kYXRhLmVycik6Xy5zaGlmdCgpWzBdKCk7YnJlYWs7Y2FzZSJydW4iOmUuZGF0YS5lcnI/dy5zaGlmdCgpWzFdKGUuZGF0YS5lcnIpOncuc2hpZnQoKVswXShlLmRhdGEub3V0KTticmVhaztjYXNlImVuZC1wcm9maWxpbmciOmUuZGF0YS5lcnI/VC5zaGlmdCgpWzFdKGUuZGF0YS5lcnIpOlQuc2hpZnQoKVswXSgpO319LFM9InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudD9udWxsPT09KHI9bnVsbD09PWRvY3VtZW50fHx2b2lkIDA9PT1kb2N1bWVudD92b2lkIDA6ZG9jdW1lbnQuY3VycmVudFNjcmlwdCl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3JjOnZvaWQgMDt0LmluaXRpYWxpemVXZWJBc3NlbWJseUluc3RhbmNlPWFzeW5jKCk9PntpZihjKCkpe2lmKGcpcmV0dXJuO2lmKGgpdGhyb3cgbmV3IEVycm9yKCJtdWx0aXBsZSBjYWxscyB0byAnaW5pdFdhc20oKScgZGV0ZWN0ZWQuIik7aWYoYil0aHJvdyBuZXcgRXJyb3IoInByZXZpb3VzIGNhbGwgdG8gJ2luaXRXYXNtKCknIGZhaWxlZC4iKTtyZXR1cm4gaD0hMCx2b2lkIDA9PT1hLmVudi53YXNtLndhc21QYXRocyYmUyYmMCE9PVMuaW5kZXhPZigiYmxvYjoiKSYmKGEuZW52Lndhc20ud2FzbVBhdGhzPVMuc3Vic3RyKDAsK1MubGFzdEluZGV4T2YoIi8iKSsxKSksbmV3IFByb21pc2UoKChlLHQpPT57bnVsbD09cHx8cC50ZXJtaW5hdGUoKSxwPW4oODA1MCkuWigpLHAub25tZXNzYWdlPU8sZD1bZSx0XTtjb25zdCByPXt0eXBlOiJpbml0LXdhc20iLGluOmEuZW52Lndhc219O3AucG9zdE1lc3NhZ2Uocik7fSkpfXJldHVybiAoMCwgbC5pbml0aWFsaXplV2ViQXNzZW1ibHkpKGEuZW52Lndhc20pfSx0LmluaXRpYWxpemVSdW50aW1lPWFzeW5jIGU9PntpZihjKCkpcmV0dXJuIHgoKSxuZXcgUHJvbWlzZSgoKHQsbik9PntmPVt0LG5dO2NvbnN0IHI9e3R5cGU6ImluaXQtb3J0IixpbjplfTtwLnBvc3RNZXNzYWdlKHIpO30pKTthd2FpdCB1LmluaXRSdW50aW1lKGUpO30sdC5jcmVhdGVTZXNzaW9uQWxsb2NhdGU9YXN5bmMgZT0+YygpPyh4KCksbmV3IFByb21pc2UoKCh0LG4pPT57bS5wdXNoKFt0LG5dKTtjb25zdCByPXt0eXBlOiJjcmVhdGVfYWxsb2NhdGUiLGluOnttb2RlbDplfX07cC5wb3N0TWVzc2FnZShyLFtlLmJ1ZmZlcl0pO30pKSk6dS5jcmVhdGVTZXNzaW9uQWxsb2NhdGUoZSksdC5jcmVhdGVTZXNzaW9uRmluYWxpemU9YXN5bmMoZSx0KT0+YygpPyh4KCksbmV3IFByb21pc2UoKChuLHIpPT57eS5wdXNoKFtuLHJdKTtjb25zdCBvPXt0eXBlOiJjcmVhdGVfZmluYWxpemUiLGluOnttb2RlbGRhdGE6ZSxvcHRpb25zOnR9fTtwLnBvc3RNZXNzYWdlKG8pO30pKSk6dS5jcmVhdGVTZXNzaW9uRmluYWxpemUoZSx0KSx0LmNyZWF0ZVNlc3Npb249YXN5bmMoZSx0KT0+YygpPyh4KCksbmV3IFByb21pc2UoKChuLHIpPT57di5wdXNoKFtuLHJdKTtjb25zdCBvPXt0eXBlOiJjcmVhdGUiLGluOnttb2RlbDplLG9wdGlvbnM6dH19O3AucG9zdE1lc3NhZ2UobyxbZS5idWZmZXJdKTt9KSkpOnUuY3JlYXRlU2Vzc2lvbihlLHQpLHQucmVsZWFzZVNlc3Npb249YXN5bmMgZT0+e2lmKGMoKSlyZXR1cm4geCgpLG5ldyBQcm9taXNlKCgodCxuKT0+e18ucHVzaChbdCxuXSk7Y29uc3Qgcj17dHlwZToicmVsZWFzZSIsaW46ZX07cC5wb3N0TWVzc2FnZShyKTt9KSk7dS5yZWxlYXNlU2Vzc2lvbihlKTt9LHQucnVuPWFzeW5jKGUsdCxuLHIsbyk9PmMoKT8oeCgpLG5ldyBQcm9taXNlKCgoaSxzKT0+e3cucHVzaChbaSxzXSk7Y29uc3QgYT17dHlwZToicnVuIixpbjp7c2Vzc2lvbklkOmUsaW5wdXRJbmRpY2VzOnQsaW5wdXRzOm4sb3V0cHV0SW5kaWNlczpyLG9wdGlvbnM6b319O3AucG9zdE1lc3NhZ2UoYSx1LmV4dHJhY3RUcmFuc2ZlcmFibGVCdWZmZXJzKG4pKTt9KSkpOnUucnVuKGUsdCxuLHIsbyksdC5lbmRQcm9maWxpbmc9YXN5bmMgZT0+e2lmKGMoKSlyZXR1cm4geCgpLG5ldyBQcm9taXNlKCgodCxuKT0+e1QucHVzaChbdCxuXSk7Y29uc3Qgcj17dHlwZToiZW5kLXByb2ZpbGluZyIsaW46ZX07cC5wb3N0TWVzc2FnZShyKTt9KSk7dS5lbmRQcm9maWxpbmcoZSk7fTt9LDc5MTg6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnNldFJ1bk9wdGlvbnM9dm9pZCAwO2NvbnN0IHI9bigyNjMpLG89bigxNDk3KTt0LnNldFJ1bk9wdGlvbnM9ZT0+e2NvbnN0IHQ9KDAsIHIuZ2V0SW5zdGFuY2UpKCk7bGV0IG49MDtjb25zdCBpPVtdLHM9ZXx8e307dHJ5e2lmKHZvaWQgMD09PShudWxsPT1lP3ZvaWQgMDplLmxvZ1NldmVyaXR5TGV2ZWwpKXMubG9nU2V2ZXJpdHlMZXZlbD0yO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiBlLmxvZ1NldmVyaXR5TGV2ZWx8fCFOdW1iZXIuaXNJbnRlZ2VyKGUubG9nU2V2ZXJpdHlMZXZlbCl8fGUubG9nU2V2ZXJpdHlMZXZlbDwwfHxlLmxvZ1NldmVyaXR5TGV2ZWw+NCl0aHJvdyBuZXcgRXJyb3IoYGxvZyBzZXJ2ZXJpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke2UubG9nU2V2ZXJpdHlMZXZlbH1gKTtpZih2b2lkIDA9PT0obnVsbD09ZT92b2lkIDA6ZS5sb2dWZXJib3NpdHlMZXZlbCkpcy5sb2dWZXJib3NpdHlMZXZlbD0wO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiBlLmxvZ1ZlcmJvc2l0eUxldmVsfHwhTnVtYmVyLmlzSW50ZWdlcihlLmxvZ1ZlcmJvc2l0eUxldmVsKSl0aHJvdyBuZXcgRXJyb3IoYGxvZyB2ZXJib3NpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke2UubG9nVmVyYm9zaXR5TGV2ZWx9YCk7dm9pZCAwPT09KG51bGw9PWU/dm9pZCAwOmUudGVybWluYXRlKSYmKHMudGVybWluYXRlPSExKTtsZXQgcj0wO3JldHVybiB2b2lkIDAhPT0obnVsbD09ZT92b2lkIDA6ZS50YWcpJiYocj0oMCxvLmFsbG9jV2FzbVN0cmluZykoZS50YWcsaSkpLG49dC5fT3J0Q3JlYXRlUnVuT3B0aW9ucyhzLmxvZ1NldmVyaXR5TGV2ZWwscy5sb2dWZXJib3NpdHlMZXZlbCwhIXMudGVybWluYXRlLHIpLDA9PT1uJiYoMCxvLmNoZWNrTGFzdEVycm9yKSgiQ2FuJ3QgY3JlYXRlIHJ1biBvcHRpb25zLiIpLHZvaWQgMCE9PShudWxsPT1lP3ZvaWQgMDplLmV4dHJhKSYmKDAsby5pdGVyYXRlRXh0cmFPcHRpb25zKShlLmV4dHJhLCIiLG5ldyBXZWFrU2V0LCgoZSxyKT0+e2NvbnN0IHM9KDAsby5hbGxvY1dhc21TdHJpbmcpKGUsaSksYT0oMCxvLmFsbG9jV2FzbVN0cmluZykocixpKTswIT09dC5fT3J0QWRkUnVuQ29uZmlnRW50cnkobixzLGEpJiYoMCxvLmNoZWNrTGFzdEVycm9yKShgQ2FuJ3Qgc2V0IGEgcnVuIGNvbmZpZyBlbnRyeTogJHtlfSAtICR7cn0uYCk7fSkpLFtuLGldfWNhdGNoKGUpe3Rocm93IDAhPT1uJiZ0Ll9PcnRSZWxlYXNlUnVuT3B0aW9ucyhuKSxpLmZvckVhY2goKGU9PnQuX2ZyZWUoZSkpKSxlfX07fSw2NjQwOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Pbm54cnVudGltZVdlYkFzc2VtYmx5U2Vzc2lvbkhhbmRsZXI9dm9pZCAwO2NvbnN0IHI9bigyODA2KSxvPW4oMjIzNSksaT1uKDI4NTApLHM9big5NTQ0KTtsZXQgYTt0Lk9ubnhydW50aW1lV2ViQXNzZW1ibHlTZXNzaW9uSGFuZGxlcj1jbGFzc3thc3luYyBjcmVhdGVTZXNzaW9uQWxsb2NhdGUoZSl7Y29uc3QgdD1hd2FpdCBmZXRjaChlKTtpZigyMDAhPT10LnN0YXR1cyl0aHJvdyBuZXcgRXJyb3IoYGZhaWxlZCB0byBsb2FkIG1vZGVsOiAke2V9YCk7Y29uc3Qgbj1hd2FpdCB0LmFycmF5QnVmZmVyKCk7cmV0dXJuICgwLCBzLmNyZWF0ZVNlc3Npb25BbGxvY2F0ZSkobmV3IFVpbnQ4QXJyYXkobikpfWFzeW5jIGxvYWRNb2RlbChlLHQpe2lmKGF8fChhd2FpdCgwLCBzLmluaXRpYWxpemVSdW50aW1lKShvLmVudiksYT0hMCksInN0cmluZyI9PXR5cGVvZiBlKWlmKCJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy52ZXJzaW9ucyYmcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKXtjb25zdCBuPWF3YWl0KDAsIGkucHJvbWlzaWZ5KShyLnJlYWRGaWxlKShlKTtbdGhpcy5zZXNzaW9uSWQsdGhpcy5pbnB1dE5hbWVzLHRoaXMub3V0cHV0TmFtZXNdPWF3YWl0KDAsIHMuY3JlYXRlU2Vzc2lvbikobix0KTt9ZWxzZSB7Y29uc3Qgbj1hd2FpdCB0aGlzLmNyZWF0ZVNlc3Npb25BbGxvY2F0ZShlKTtbdGhpcy5zZXNzaW9uSWQsdGhpcy5pbnB1dE5hbWVzLHRoaXMub3V0cHV0TmFtZXNdPWF3YWl0KDAsIHMuY3JlYXRlU2Vzc2lvbkZpbmFsaXplKShuLHQpO31lbHNlIFt0aGlzLnNlc3Npb25JZCx0aGlzLmlucHV0TmFtZXMsdGhpcy5vdXRwdXROYW1lc109YXdhaXQoMCwgcy5jcmVhdGVTZXNzaW9uKShlLHQpO31hc3luYyBkaXNwb3NlKCl7cmV0dXJuICgwLCBzLnJlbGVhc2VTZXNzaW9uKSh0aGlzLnNlc3Npb25JZCl9YXN5bmMgcnVuKGUsdCxuKXtjb25zdCByPVtdLGk9W107T2JqZWN0LmVudHJpZXMoZSkuZm9yRWFjaCgoZT0+e2NvbnN0IHQ9ZVswXSxuPWVbMV0sbz10aGlzLmlucHV0TmFtZXMuaW5kZXhPZih0KTtpZigtMT09PW8pdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGlucHV0ICcke3R9J2ApO3IucHVzaChuKSxpLnB1c2gobyk7fSkpO2NvbnN0IGE9W107T2JqZWN0LmVudHJpZXModCkuZm9yRWFjaCgoZT0+e2NvbnN0IHQ9ZVswXSxuPXRoaXMub3V0cHV0TmFtZXMuaW5kZXhPZih0KTtpZigtMT09PW4pdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG91dHB1dCAnJHt0fSdgKTthLnB1c2gobik7fSkpO2NvbnN0IHU9YXdhaXQoMCwgcy5ydW4pKHRoaXMuc2Vzc2lvbklkLGksci5tYXAoKGU9PltlLnR5cGUsZS5kaW1zLGUuZGF0YV0pKSxhLG4pLGw9e307Zm9yKGxldCBlPTA7ZTx1Lmxlbmd0aDtlKyspbFt0aGlzLm91dHB1dE5hbWVzW2FbZV1dXT1uZXcgby5UZW5zb3IodVtlXVswXSx1W2VdWzJdLHVbZV1bMV0pO3JldHVybiBsfXN0YXJ0UHJvZmlsaW5nKCl7fWVuZFByb2ZpbGluZygpeygwLCBzLmVuZFByb2ZpbGluZykodGhpcy5zZXNzaW9uSWQpO319O30sNzYyMjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuc2V0U2Vzc2lvbk9wdGlvbnM9dm9pZCAwO2NvbnN0IHI9bigyNjMpLG89bigxNDk3KTt0LnNldFNlc3Npb25PcHRpb25zPWU9Pnt2YXIgdCxuLGkscztjb25zdCBhPSgwLCByLmdldEluc3RhbmNlKSgpO2xldCB1PTA7Y29uc3QgbD1bXSxjPWV8fHt9OyhlPT57ZS5leHRyYXx8KGUuZXh0cmE9e30pLGUuZXh0cmEuc2Vzc2lvbnx8KGUuZXh0cmEuc2Vzc2lvbj17fSk7Y29uc3QgdD1lLmV4dHJhLnNlc3Npb247dC51c2Vfb3J0X21vZGVsX2J5dGVzX2RpcmVjdGx5fHwodC51c2Vfb3J0X21vZGVsX2J5dGVzX2RpcmVjdGx5PSIxIiksZS5leGVjdXRpb25Qcm92aWRlcnMmJmUuZXhlY3V0aW9uUHJvdmlkZXJzLnNvbWUoKGU9PiJ3ZWJncHUiPT09KCJzdHJpbmciPT10eXBlb2YgZT9lOmUubmFtZSkpKSYmKGUuZW5hYmxlTWVtUGF0dGVybj0hMSk7fSkoYyk7dHJ5e2NvbnN0IGU9KGU9Pntzd2l0Y2goZSl7Y2FzZSJkaXNhYmxlZCI6cmV0dXJuIDA7Y2FzZSJiYXNpYyI6cmV0dXJuIDE7Y2FzZSJleHRlbmRlZCI6cmV0dXJuIDI7Y2FzZSJhbGwiOnJldHVybiA5OTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZ3JhcGggb3B0aW1pemF0aW9uIGxldmVsOiAke2V9YCl9fSkobnVsbCE9PSh0PWMuZ3JhcGhPcHRpbWl6YXRpb25MZXZlbCkmJnZvaWQgMCE9PXQ/dDoiYWxsIikscD0oZT0+e3N3aXRjaChlKXtjYXNlInNlcXVlbnRpYWwiOnJldHVybiAwO2Nhc2UicGFyYWxsZWwiOnJldHVybiAxO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBleGVjdXRpb24gbW9kZTogJHtlfWApfX0pKG51bGwhPT0obj1jLmV4ZWN1dGlvbk1vZGUpJiZ2b2lkIDAhPT1uP246InNlcXVlbnRpYWwiKSxkPSJzdHJpbmciPT10eXBlb2YgYy5sb2dJZD8oMCxvLmFsbG9jV2FzbVN0cmluZykoYy5sb2dJZCxsKTowLGY9bnVsbCE9PShpPWMubG9nU2V2ZXJpdHlMZXZlbCkmJnZvaWQgMCE9PWk/aToyO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGYpfHxmPDB8fGY+NCl0aHJvdyBuZXcgRXJyb3IoYGxvZyBzZXJ2ZXJpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke2Z9YCk7Y29uc3QgaD1udWxsIT09KHM9Yy5sb2dWZXJib3NpdHlMZXZlbCkmJnZvaWQgMCE9PXM/czowO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGgpfHxoPDB8fGg+NCl0aHJvdyBuZXcgRXJyb3IoYGxvZyB2ZXJib3NpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke2h9YCk7Y29uc3QgZz0ic3RyaW5nIj09dHlwZW9mIGMub3B0aW1pemVkTW9kZWxGaWxlUGF0aD8oMCxvLmFsbG9jV2FzbVN0cmluZykoYy5vcHRpbWl6ZWRNb2RlbEZpbGVQYXRoLGwpOjA7cmV0dXJuIHU9YS5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnMoZSwhIWMuZW5hYmxlQ3B1TWVtQXJlbmEsISFjLmVuYWJsZU1lbVBhdHRlcm4scCwhIWMuZW5hYmxlUHJvZmlsaW5nLDAsZCxmLGgsZyksMD09PXUmJigwLG8uY2hlY2tMYXN0RXJyb3IpKCJDYW4ndCBjcmVhdGUgc2Vzc2lvbiBvcHRpb25zLiIpLGMuZXhlY3V0aW9uUHJvdmlkZXJzJiYoKGUsdCxuKT0+e2Zvcihjb25zdCBpIG9mIHQpe2xldCB0PSJzdHJpbmciPT10eXBlb2YgaT9pOmkubmFtZTtzd2l0Y2godCl7Y2FzZSJ4bm5wYWNrIjp0PSJYTk5QQUNLIjticmVhaztjYXNlIndlYm5uIjppZih0PSJXRUJOTiIsInN0cmluZyIhPXR5cGVvZiBpKXtjb25zdCB0PWk7aWYobnVsbD09dD92b2lkIDA6dC5kZXZpY2VUeXBlKXtjb25zdCBpPSgwLG8uYWxsb2NXYXNtU3RyaW5nKSgiZGV2aWNlVHlwZSIsbikscz0oMCxvLmFsbG9jV2FzbVN0cmluZykodC5kZXZpY2VUeXBlLG4pOzAhPT0oMCxyLmdldEluc3RhbmNlKSgpLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnkoZSxpLHMpJiYoMCxvLmNoZWNrTGFzdEVycm9yKShgQ2FuJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6ICdkZXZpY2VUeXBlJyAtICR7dC5kZXZpY2VUeXBlfS5gKTt9aWYobnVsbD09dD92b2lkIDA6dC5wb3dlclByZWZlcmVuY2Upe2NvbnN0IGk9KDAsby5hbGxvY1dhc21TdHJpbmcpKCJwb3dlclByZWZlcmVuY2UiLG4pLHM9KDAsby5hbGxvY1dhc21TdHJpbmcpKHQucG93ZXJQcmVmZXJlbmNlLG4pOzAhPT0oMCxyLmdldEluc3RhbmNlKSgpLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnkoZSxpLHMpJiYoMCxvLmNoZWNrTGFzdEVycm9yKShgQ2FuJ3Qgc2V0IGEgc2Vzc2lvbiBjb25maWcgZW50cnk6ICdwb3dlclByZWZlcmVuY2UnIC0gJHt0LnBvd2VyUHJlZmVyZW5jZX0uYCk7fX1icmVhaztjYXNlIndlYmdwdSI6dD0iSlMiO2JyZWFrO2Nhc2Uid2FzbSI6Y2FzZSJjcHUiOmNvbnRpbnVlO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBub3Qgc3VwcG9ydGVkIGV4ZWN1dGlvbiBwcm92aWRlcjogJHt0fWApfWNvbnN0IHM9KDAsby5hbGxvY1dhc21TdHJpbmcpKHQsbik7MCE9PSgwLHIuZ2V0SW5zdGFuY2UpKCkuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyKGUscykmJigwLG8uY2hlY2tMYXN0RXJyb3IpKGBDYW4ndCBhcHBlbmQgZXhlY3V0aW9uIHByb3ZpZGVyOiAke3R9LmApO319KSh1LGMuZXhlY3V0aW9uUHJvdmlkZXJzLGwpLHZvaWQgMCE9PWMuZXh0cmEmJigwLG8uaXRlcmF0ZUV4dHJhT3B0aW9ucykoYy5leHRyYSwiIixuZXcgV2Vha1NldCwoKGUsdCk9Pntjb25zdCBuPSgwLG8uYWxsb2NXYXNtU3RyaW5nKShlLGwpLHI9KDAsby5hbGxvY1dhc21TdHJpbmcpKHQsbCk7MCE9PWEuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeSh1LG4scikmJigwLG8uY2hlY2tMYXN0RXJyb3IpKGBDYW4ndCBzZXQgYSBzZXNzaW9uIGNvbmZpZyBlbnRyeTogJHtlfSAtICR7dH0uYCk7fSkpLFt1LGxdfWNhdGNoKGUpe3Rocm93IDAhPT11JiZhLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnModSksbC5mb3JFYWNoKChlPT5hLl9mcmVlKGUpKSksZX19O30sNzkxNzooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmxvZ0xldmVsU3RyaW5nVG9FbnVtPXQudGVuc29yVHlwZVRvVHlwZWRBcnJheUNvbnN0cnVjdG9yPXQuZ2V0VGVuc29yRWxlbWVudFNpemU9dC50ZW5zb3JEYXRhVHlwZUVudW1Ub1N0cmluZz10LnRlbnNvckRhdGFUeXBlU3RyaW5nVG9FbnVtPXZvaWQgMCx0LnRlbnNvckRhdGFUeXBlU3RyaW5nVG9FbnVtPWU9Pntzd2l0Y2goZSl7Y2FzZSJpbnQ4IjpyZXR1cm4gMztjYXNlInVpbnQ4IjpyZXR1cm4gMjtjYXNlImJvb2wiOnJldHVybiA5O2Nhc2UiaW50MTYiOnJldHVybiA1O2Nhc2UidWludDE2IjpyZXR1cm4gNDtjYXNlImludDMyIjpyZXR1cm4gNjtjYXNlInVpbnQzMiI6cmV0dXJuIDEyO2Nhc2UiZmxvYXQxNiI6cmV0dXJuIDEwO2Nhc2UiZmxvYXQzMiI6cmV0dXJuIDE7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gMTE7Y2FzZSJzdHJpbmciOnJldHVybiA4O2Nhc2UiaW50NjQiOnJldHVybiA3O2Nhc2UidWludDY0IjpyZXR1cm4gMTM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGRhdGEgdHlwZTogJHtlfWApfX0sdC50ZW5zb3JEYXRhVHlwZUVudW1Ub1N0cmluZz1lPT57c3dpdGNoKGUpe2Nhc2UgMzpyZXR1cm4gImludDgiO2Nhc2UgMjpyZXR1cm4gInVpbnQ4IjtjYXNlIDk6cmV0dXJuICJib29sIjtjYXNlIDU6cmV0dXJuICJpbnQxNiI7Y2FzZSA0OnJldHVybiAidWludDE2IjtjYXNlIDY6cmV0dXJuICJpbnQzMiI7Y2FzZSAxMjpyZXR1cm4gInVpbnQzMiI7Y2FzZSAxMDpyZXR1cm4gImZsb2F0MTYiO2Nhc2UgMTpyZXR1cm4gImZsb2F0MzIiO2Nhc2UgMTE6cmV0dXJuICJmbG9hdDY0IjtjYXNlIDg6cmV0dXJuICJzdHJpbmciO2Nhc2UgNzpyZXR1cm4gImludDY0IjtjYXNlIDEzOnJldHVybiAidWludDY0IjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAke2V9YCl9fSx0LmdldFRlbnNvckVsZW1lbnRTaXplPWU9Plt2b2lkIDAsNCwxLDEsMiwyLDQsOCx2b2lkIDAsMSwyLDgsNCw4LHZvaWQgMCx2b2lkIDAsdm9pZCAwXVtlXSx0LnRlbnNvclR5cGVUb1R5cGVkQXJyYXlDb25zdHJ1Y3Rvcj1lPT57c3dpdGNoKGUpe2Nhc2UiZmxvYXQxNiI6Y2FzZSJ1aW50MTYiOnJldHVybiBVaW50MTZBcnJheTtjYXNlImZsb2F0MzIiOnJldHVybiBGbG9hdDMyQXJyYXk7Y2FzZSJ1aW50OCI6Y2FzZSJib29sIjpyZXR1cm4gVWludDhBcnJheTtjYXNlImludDgiOnJldHVybiBJbnQ4QXJyYXk7Y2FzZSJpbnQxNiI6cmV0dXJuIEludDE2QXJyYXk7Y2FzZSJpbnQzMiI6cmV0dXJuIEludDMyQXJyYXk7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gRmxvYXQ2NEFycmF5O2Nhc2UidWludDMyIjpyZXR1cm4gVWludDMyQXJyYXk7Y2FzZSJpbnQ2NCI6cmV0dXJuIEJpZ0ludDY0QXJyYXk7Y2FzZSJ1aW50NjQiOnJldHVybiBCaWdVaW50NjRBcnJheTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdHlwZTogJHtlfWApfX0sdC5sb2dMZXZlbFN0cmluZ1RvRW51bT1lPT57c3dpdGNoKGUpe2Nhc2UidmVyYm9zZSI6cmV0dXJuIDA7Y2FzZSJpbmZvIjpyZXR1cm4gMTtjYXNlIndhcm5pbmciOnJldHVybiAyO2Nhc2UiZXJyb3IiOnJldHVybiAzO2Nhc2UiZmF0YWwiOnJldHVybiA0O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBsb2dnaW5nIGxldmVsOiAke2V9YCl9fTt9LDEyNTk6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmV4dHJhY3RUcmFuc2ZlcmFibGVCdWZmZXJzPXQuZW5kUHJvZmlsaW5nPXQucnVuPXQucmVsZWFzZVNlc3Npb249dC5jcmVhdGVTZXNzaW9uPXQuY3JlYXRlU2Vzc2lvbkZpbmFsaXplPXQuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlPXQuaW5pdFJ1bnRpbWU9dm9pZCAwO2NvbnN0IHI9big3OTE4KSxvPW4oNzYyMiksaT1uKDc5MTcpLHM9bigyNjMpLGE9bigxNDk3KTt0LmluaXRSdW50aW1lPWFzeW5jIGU9Pnt2YXIgdCxuO3Q9ZS53YXNtLm51bVRocmVhZHMsbj0oMCwgaS5sb2dMZXZlbFN0cmluZ1RvRW51bSkoZS5sb2dMZXZlbCksMCE9PSgwLCBzLmdldEluc3RhbmNlKSgpLl9PcnRJbml0KHQsbikmJigwLCBhLmNoZWNrTGFzdEVycm9yKSgiQ2FuJ3QgaW5pdGlhbGl6ZSBvbm54cnVudGltZS4iKTt9O2NvbnN0IHU9bmV3IE1hcDt0LmNyZWF0ZVNlc3Npb25BbGxvY2F0ZT1lPT57Y29uc3QgdD0oMCwgcy5nZXRJbnN0YW5jZSkoKSxuPXQuX21hbGxvYyhlLmJ5dGVMZW5ndGgpO2lmKDA9PT1uKXRocm93IG5ldyBFcnJvcihgQ2FuJ3QgY3JlYXRlIGEgc2Vzc2lvbi4gZmFpbGVkIHRvIGFsbG9jYXRlIGEgYnVmZmVyIG9mIHNpemUgJHtlLmJ5dGVMZW5ndGh9LmApO3JldHVybiB0LkhFQVBVOC5zZXQoZSxuKSxbbixlLmJ5dGVMZW5ndGhdfSx0LmNyZWF0ZVNlc3Npb25GaW5hbGl6ZT0oZSx0KT0+e2NvbnN0IG49KDAsIHMuZ2V0SW5zdGFuY2UpKCk7bGV0IHI9MCxpPTAsbD1bXTtjb25zdCBjPVtdLHA9W107dHJ5e1tpLGxdPSgwLG8uc2V0U2Vzc2lvbk9wdGlvbnMpKHQpLHI9bi5fT3J0Q3JlYXRlU2Vzc2lvbihlWzBdLGVbMV0saSksMD09PXImJigwLGEuY2hlY2tMYXN0RXJyb3IpKCJDYW4ndCBjcmVhdGUgYSBzZXNzaW9uLiIpO2NvbnN0W2QsZl09KGU9Pntjb25zdCB0PSgwLHMuZ2V0SW5zdGFuY2UpKCksbj10LnN0YWNrU2F2ZSgpO3RyeXtjb25zdCBuPXQuc3RhY2tBbGxvYyg4KTtyZXR1cm4gMCE9PXQuX09ydEdldElucHV0T3V0cHV0Q291bnQoZSxuLG4rNCkmJigwLGEuY2hlY2tMYXN0RXJyb3IpKCJDYW4ndCBnZXQgc2Vzc2lvbiBpbnB1dC9vdXRwdXQgY291bnQuIiksW3QuSEVBUDMyW24vNF0sdC5IRUFQMzJbbi80KzFdXX1maW5hbGx5e3Quc3RhY2tSZXN0b3JlKG4pO319KShyKSxoPVtdLGc9W107Zm9yKGxldCBlPTA7ZTxkO2UrKyl7Y29uc3QgdD1uLl9PcnRHZXRJbnB1dE5hbWUocixlKTswPT09dCYmKDAsYS5jaGVja0xhc3RFcnJvcikoIkNhbid0IGdldCBhbiBpbnB1dCBuYW1lLiIpLGMucHVzaCh0KSxoLnB1c2gobi5VVEY4VG9TdHJpbmcodCkpO31mb3IobGV0IGU9MDtlPGY7ZSsrKXtjb25zdCB0PW4uX09ydEdldE91dHB1dE5hbWUocixlKTswPT09dCYmKDAsYS5jaGVja0xhc3RFcnJvcikoIkNhbid0IGdldCBhbiBvdXRwdXQgbmFtZS4iKSxwLnB1c2godCksZy5wdXNoKG4uVVRGOFRvU3RyaW5nKHQpKTt9cmV0dXJuIHUuc2V0KHIsW3IsYyxwXSksW3IsaCxnXX1jYXRjaChlKXt0aHJvdyBjLmZvckVhY2goKGU9Pm4uX09ydEZyZWUoZSkpKSxwLmZvckVhY2goKGU9Pm4uX09ydEZyZWUoZSkpKSwwIT09ciYmbi5fT3J0UmVsZWFzZVNlc3Npb24ociksZX1maW5hbGx5e24uX2ZyZWUoZVswXSksMCE9PWkmJm4uX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucyhpKSxsLmZvckVhY2goKGU9Pm4uX2ZyZWUoZSkpKTt9fSx0LmNyZWF0ZVNlc3Npb249KGUsbik9Pntjb25zdCByPSgwLCB0LmNyZWF0ZVNlc3Npb25BbGxvY2F0ZSkoZSk7cmV0dXJuICgwLCB0LmNyZWF0ZVNlc3Npb25GaW5hbGl6ZSkocixuKX0sdC5yZWxlYXNlU2Vzc2lvbj1lPT57Y29uc3QgdD0oMCwgcy5nZXRJbnN0YW5jZSkoKSxuPXUuZ2V0KGUpO2lmKCFuKXRocm93IG5ldyBFcnJvcihgY2Fubm90IHJlbGVhc2Ugc2Vzc2lvbi4gaW52YWxpZCBzZXNzaW9uIGlkOiAke2V9YCk7Y29uc3RbcixvLGldPW47by5mb3JFYWNoKChlPT50Ll9PcnRGcmVlKGUpKSksaS5mb3JFYWNoKChlPT50Ll9PcnRGcmVlKGUpKSksdC5fT3J0UmVsZWFzZVNlc3Npb24ociksdS5kZWxldGUoZSk7fSx0LnJ1bj1hc3luYyhlLHQsbixvLGwpPT57Y29uc3QgYz0oMCwgcy5nZXRJbnN0YW5jZSkoKSxwPXUuZ2V0KGUpO2lmKCFwKXRocm93IG5ldyBFcnJvcihgY2Fubm90IHJ1biBpbmZlcmVuY2UuIGludmFsaWQgc2Vzc2lvbiBpZDogJHtlfWApO2NvbnN0W2QsZixoXT1wLGc9dC5sZW5ndGgsYj1vLmxlbmd0aDtsZXQgbT0wLHk9W107Y29uc3Qgdj1bXSxfPVtdO3RyeXtbbSx5XT0oMCxyLnNldFJ1bk9wdGlvbnMpKGwpO2ZvcihsZXQgZT0wO2U8ZztlKyspe2NvbnN0IHQ9bltlXVswXSxyPW5bZV1bMV0sbz1uW2VdWzJdO2xldCBzLHU7aWYoQXJyYXkuaXNBcnJheShvKSl7dT00Km8ubGVuZ3RoLHM9Yy5fbWFsbG9jKHUpLF8ucHVzaChzKTtsZXQgZT1zLzQ7Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kyspe2lmKCJzdHJpbmciIT10eXBlb2Ygb1t0XSl0aHJvdyBuZXcgVHlwZUVycm9yKGB0ZW5zb3IgZGF0YSBhdCBpbmRleCAke3R9IGlzIG5vdCBhIHN0cmluZ2ApO2MuSEVBUFUzMltlKytdPSgwLGEuYWxsb2NXYXNtU3RyaW5nKShvW3RdLF8pO319ZWxzZSB1PW8uYnl0ZUxlbmd0aCxzPWMuX21hbGxvYyh1KSxfLnB1c2gocyksYy5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KG8uYnVmZmVyLG8uYnl0ZU9mZnNldCx1KSxzKTtjb25zdCBsPWMuc3RhY2tTYXZlKCkscD1jLnN0YWNrQWxsb2MoNCpyLmxlbmd0aCk7dHJ5e2xldCBuPXAvNDtyLmZvckVhY2goKGU9PmMuSEVBUDMyW24rK109ZSkpO2NvbnN0IG89Yy5fT3J0Q3JlYXRlVGVuc29yKCgwLGkudGVuc29yRGF0YVR5cGVTdHJpbmdUb0VudW0pKHQpLHMsdSxwLHIubGVuZ3RoKTswPT09byYmKDAsYS5jaGVja0xhc3RFcnJvcikoYENhbid0IGNyZWF0ZSB0ZW5zb3IgZm9yIGlucHV0WyR7ZX1dLmApLHYucHVzaChvKTt9ZmluYWxseXtjLnN0YWNrUmVzdG9yZShsKTt9fWNvbnN0IGU9Yy5zdGFja1NhdmUoKSxzPWMuc3RhY2tBbGxvYyg0KmcpLHU9Yy5zdGFja0FsbG9jKDQqZykscD1jLnN0YWNrQWxsb2MoNCpiKSx3PWMuc3RhY2tBbGxvYyg0KmIpO3RyeXtsZXQgZT1zLzQsbj11LzQscj1wLzQsbD13LzQ7Zm9yKGxldCByPTA7cjxnO3IrKyljLkhFQVBVMzJbZSsrXT12W3JdLGMuSEVBUFUzMltuKytdPWZbdFtyXV07Zm9yKGxldCBlPTA7ZTxiO2UrKyljLkhFQVBVMzJbcisrXT0wLGMuSEVBUFUzMltsKytdPWhbb1tlXV07bGV0IHk9Yy5fT3J0UnVuKGQsdSxzLGcsdyxiLHAsbSk7Y29uc3QgXz1jLmpzZXBSdW5Qcm9taXNlO18mJnZvaWQgMCE9PV8udGhlbiYmKHk9YXdhaXQgXyk7Y29uc3QgVD1bXTswIT09eSYmKDAsYS5jaGVja0xhc3RFcnJvcikoImZhaWxlZCB0byBjYWxsIE9ydFJ1bigpLiIpO2ZvcihsZXQgZT0wO2U8YjtlKyspe2NvbnN0IHQ9Yy5IRUFQVTMyW3AvNCtlXSxuPWMuc3RhY2tTYXZlKCkscj1jLnN0YWNrQWxsb2MoMTYpO2xldCBvLHM9MDt0cnl7eT1jLl9PcnRHZXRUZW5zb3JEYXRhKHQscixyKzQscis4LHIrMTIpLDAhPT15JiYoMCxhLmNoZWNrTGFzdEVycm9yKShgQ2FuJ3QgYWNjZXNzIG91dHB1dCB0ZW5zb3IgZGF0YSBvbiBpbmRleCAke2V9LmApO2xldCBuPXIvNDtjb25zdCB1PWMuSEVBUFUzMltuKytdO3M9Yy5IRUFQVTMyW24rK107Y29uc3QgbD1jLkhFQVBVMzJbbisrXSxwPWMuSEVBUFUzMltuKytdLGQ9W107Zm9yKGxldCBlPTA7ZTxwO2UrKylkLnB1c2goYy5IRUFQVTMyW2wvNCtlXSk7Yy5fT3J0RnJlZShsKTtjb25zdCBmPTA9PT1kLmxlbmd0aD8xOmQucmVkdWNlKCgoZSx0KT0+ZSp0KSk7aWYobz0oMCxpLnRlbnNvckRhdGFUeXBlRW51bVRvU3RyaW5nKSh1KSwic3RyaW5nIj09PW8pe2NvbnN0IGU9W107bGV0IHQ9cy80O2ZvcihsZXQgbj0wO248ZjtuKyspe2NvbnN0IHI9Yy5IRUFQVTMyW3QrK10sbz1uPT09Zi0xP3ZvaWQgMDpjLkhFQVBVMzJbdF0tcjtlLnB1c2goYy5VVEY4VG9TdHJpbmcocixvKSk7fVQucHVzaChbbyxkLGVdKTt9ZWxzZSB7Y29uc3QgZT1uZXcoKDAsaS50ZW5zb3JUeXBlVG9UeXBlZEFycmF5Q29uc3RydWN0b3IpKG8pKShmKTtuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKS5zZXQoYy5IRUFQVTguc3ViYXJyYXkocyxzK2UuYnl0ZUxlbmd0aCkpLFQucHVzaChbbyxkLGVdKTt9fWZpbmFsbHl7Yy5zdGFja1Jlc3RvcmUobiksInN0cmluZyI9PT1vJiZzJiZjLl9mcmVlKHMpLGMuX09ydFJlbGVhc2VUZW5zb3IodCk7fX1yZXR1cm4gVH1maW5hbGx5e2Muc3RhY2tSZXN0b3JlKGUpO319ZmluYWxseXt2LmZvckVhY2goKGU9PmMuX09ydFJlbGVhc2VUZW5zb3IoZSkpKSxfLmZvckVhY2goKGU9PmMuX2ZyZWUoZSkpKSwwIT09bSYmYy5fT3J0UmVsZWFzZVJ1bk9wdGlvbnMobSkseS5mb3JFYWNoKChlPT5jLl9mcmVlKGUpKSk7fX0sdC5lbmRQcm9maWxpbmc9ZT0+e2NvbnN0IHQ9KDAsIHMuZ2V0SW5zdGFuY2UpKCksbj11LmdldChlKTtpZighbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2Vzc2lvbiBpZCIpO2NvbnN0IHI9blswXSxvPXQuX09ydEVuZFByb2ZpbGluZyhyKTswPT09byYmKDAsIGEuY2hlY2tMYXN0RXJyb3IpKCJDYW4ndCBnZXQgYW4gcHJvZmlsZSBmaWxlIG5hbWUuIiksdC5fT3J0RnJlZShvKTt9LHQuZXh0cmFjdFRyYW5zZmVyYWJsZUJ1ZmZlcnM9ZT0+e2NvbnN0IHQ9W107Zm9yKGNvbnN0IG4gb2YgZSl7Y29uc3QgZT1uWzJdOyFBcnJheS5pc0FycmF5KGUpJiZlLmJ1ZmZlciYmdC5wdXNoKGUuYnVmZmVyKTt9cmV0dXJuIHR9O30sMjYzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzJiZ0aGlzLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9bik7dmFyIG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pO28mJiEoImdldCJpbiBvPyF0Ll9fZXNNb2R1bGU6by53cml0YWJsZXx8by5jb25maWd1cmFibGUpfHwobz17ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtuXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLG8pO306ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9biksZVtyXT10W25dO30pLG89dGhpcyYmdGhpcy5fX3NldE1vZHVsZURlZmF1bHR8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KTt9OmZ1bmN0aW9uKGUsdCl7ZS5kZWZhdWx0PXQ7fSksaT10aGlzJiZ0aGlzLl9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24oZSl7aWYoZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciB0PXt9O2lmKG51bGwhPWUpZm9yKHZhciBuIGluIGUpImRlZmF1bHQiIT09biYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJnIodCxlLG4pO3JldHVybiBvKHQsZSksdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZGlzcG9zZT10LmdldEluc3RhbmNlPXQuaW5pdGlhbGl6ZVdlYkFzc2VtYmx5PXZvaWQgMDtjb25zdCBzPWkobig2NDQ5KSksYT1uKDkzMiksdT1uKDM0NzQpO2xldCBsLGM9ITEscD0hMSxkPSExO3QuaW5pdGlhbGl6ZVdlYkFzc2VtYmx5PWFzeW5jIGU9PntpZihjKXJldHVybiBQcm9taXNlLnJlc29sdmUoKTtpZihwKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgY2FsbHMgdG8gJ2luaXRpYWxpemVXZWJBc3NlbWJseSgpJyBkZXRlY3RlZC4iKTtpZihkKXRocm93IG5ldyBFcnJvcigicHJldmlvdXMgY2FsbCB0byAnaW5pdGlhbGl6ZVdlYkFzc2VtYmx5KCknIGZhaWxlZC4iKTtwPSEwO2NvbnN0IHQ9ZS5pbml0VGltZW91dCxyPWUubnVtVGhyZWFkcyxvPWUuc2ltZCxpPXI+MSYmKCgpPT57dHJ5e3JldHVybiAidW5kZWZpbmVkIiE9dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyJiYoInVuZGVmaW5lZCIhPXR5cGVvZiBNZXNzYWdlQ2hhbm5lbCYmKG5ldyBNZXNzYWdlQ2hhbm5lbCkucG9ydDEucG9zdE1lc3NhZ2UobmV3IFNoYXJlZEFycmF5QnVmZmVyKDEpKSxXZWJBc3NlbWJseS52YWxpZGF0ZShuZXcgVWludDhBcnJheShbMCw5NywxMTUsMTA5LDEsMCwwLDAsMSw0LDEsOTYsMCwwLDMsMiwxLDAsNSw0LDEsMywxLDEsMTAsMTEsMSw5LDAsNjUsMCwyNTQsMTYsMiwwLDI2LDExXSkpKX1jYXRjaChlKXtyZXR1cm4gITF9fSkoKSxmPW8mJigoKT0+e3RyeXtyZXR1cm4gV2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNCwxLDk2LDAsMCwzLDIsMSwwLDEwLDMwLDEsMjgsMCw2NSwwLDI1MywxNSwyNTMsMTIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyNTMsMTg2LDEsMjYsMTFdKSl9Y2F0Y2goZSl7cmV0dXJuICExfX0pKCksaD1lLndhc21QYXRocyxnPSJzdHJpbmciPT10eXBlb2YgaD9oOnZvaWQgMCxiPSgoZSx0KT0+dD9lPyJvcnQtd2FzbS1zaW1kLXRocmVhZGVkLndhc20iOiJvcnQtd2FzbS10aHJlYWRlZC53YXNtIjplPyJvcnQtd2FzbS1zaW1kLndhc20iOiJvcnQtd2FzbS53YXNtIikoZixpKSxtPSJvYmplY3QiPT10eXBlb2YgaD9oW2JdOnZvaWQgMDtsZXQgeT0hMTtjb25zdCB2PVtdO2lmKHQ+MCYmdi5wdXNoKG5ldyBQcm9taXNlKChlPT57c2V0VGltZW91dCgoKCk9Pnt5PSEwLGUoKTt9KSx0KTt9KSkpLHYucHVzaChuZXcgUHJvbWlzZSgoKGUsdCk9Pntjb25zdCByPWk/dTphLG89e2xvY2F0ZUZpbGU6KGUsdCk9PmkmJmUuZW5kc1dpdGgoIi53b3JrZXIuanMiKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBCbG9iP1VSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW24oNDE1NCldLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSkpOmUuZW5kc1dpdGgoIi53YXNtIik/bXx8KG51bGwhPWc/Zzp0KStiOnQrZX07aWYoaSlpZigidW5kZWZpbmVkIj09dHlwZW9mIEJsb2Ipby5tYWluU2NyaXB0VXJsT3JCbG9iPXMuam9pbihfX2Rpcm5hbWUsIm9ydC13YXNtLXRocmVhZGVkLmpzIik7ZWxzZSB7Y29uc3QgZT1gdmFyIG9ydFdhc21UaHJlYWRlZD0oZnVuY3Rpb24oKXt2YXIgX3NjcmlwdERpcjtyZXR1cm4gJHtyLnRvU3RyaW5nKCl9fSkoKTtgO28ubWFpblNjcmlwdFVybE9yQmxvYj1uZXcgQmxvYihbZV0se3R5cGU6InRleHQvamF2YXNjcmlwdCJ9KTt9cihvKS50aGVuKCh0PT57cD0hMSxjPSEwLGw9dCxlKCk7fSksKGU9PntwPSExLGQ9ITAsdChlKTt9KSk7fSkpKSxhd2FpdCBQcm9taXNlLnJhY2UodikseSl0aHJvdyBuZXcgRXJyb3IoYFdlYkFzc2VtYmx5IGJhY2tlbmQgaW5pdGlhbGl6aW5nIGZhaWxlZCBkdWUgdG8gdGltZW91dDogJHt0fW1zYCl9LHQuZ2V0SW5zdGFuY2U9KCk9PntpZihjJiZsKXJldHVybiBsO3Rocm93IG5ldyBFcnJvcigiV2ViQXNzZW1ibHkgaXMgbm90IGluaXRpYWxpemVkIHlldC4iKX0sdC5kaXNwb3NlPSgpPT57dmFyIGU7IWN8fHB8fGR8fChwPSEwLG51bGw9PT0oZT1sLlBUaHJlYWQpfHx2b2lkIDA9PT1lfHxlLnRlcm1pbmF0ZUFsbFRocmVhZHMoKSxsPXZvaWQgMCxwPSExLGM9ITEsZD0hMCk7fTt9LDE0OTc6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNoZWNrTGFzdEVycm9yPXQuaXRlcmF0ZUV4dHJhT3B0aW9ucz10LmFsbG9jV2FzbVN0cmluZz12b2lkIDA7Y29uc3Qgcj1uKDI2Myk7dC5hbGxvY1dhc21TdHJpbmc9KGUsdCk9Pntjb25zdCBuPSgwLCByLmdldEluc3RhbmNlKSgpLG89bi5sZW5ndGhCeXRlc1VURjgoZSkrMSxpPW4uX21hbGxvYyhvKTtyZXR1cm4gbi5zdHJpbmdUb1VURjgoZSxpLG8pLHQucHVzaChpKSxpfSx0Lml0ZXJhdGVFeHRyYU9wdGlvbnM9KGUsbixyLG8pPT57aWYoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZSl7aWYoci5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKCJDaXJjdWxhciByZWZlcmVuY2UgaW4gb3B0aW9ucyIpO3IuYWRkKGUpO31PYmplY3QuZW50cmllcyhlKS5mb3JFYWNoKCgoW2UsaV0pPT57Y29uc3Qgcz1uP24rZTplO2lmKCJvYmplY3QiPT10eXBlb2YgaSkoMCwgdC5pdGVyYXRlRXh0cmFPcHRpb25zKShpLHMrIi4iLHIsbyk7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGl8fCJudW1iZXIiPT10eXBlb2YgaSlvKHMsaS50b1N0cmluZygpKTtlbHNlIHtpZigiYm9vbGVhbiIhPXR5cGVvZiBpKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgaGFuZGxlIGV4dHJhIGNvbmZpZyB0eXBlOiAiK3R5cGVvZiBpKTtvKHMsaT8iMSI6IjAiKTt9fSkpO30sdC5jaGVja0xhc3RFcnJvcj1lPT57Y29uc3QgdD0oMCwgci5nZXRJbnN0YW5jZSkoKSxuPXQuc3RhY2tTYXZlKCk7dHJ5e2NvbnN0IG49dC5zdGFja0FsbG9jKDgpO3QuX09ydEdldExhc3RFcnJvcihuLG4rNCk7Y29uc3Qgcj10LkhFQVAzMltuLzRdLG89dC5IRUFQVTMyW24vNCsxXSxpPW8/dC5VVEY4VG9TdHJpbmcobyk6IiI7dGhyb3cgbmV3IEVycm9yKGAke2V9IEVSUk9SX0NPREU6ICR7cn0sIEVSUk9SX01FU1NBR0U6ICR7aX1gKX1maW5hbGx5e3Quc3RhY2tSZXN0b3JlKG4pO319O30sODA1MDooZSx0LG4pPT57bi5kKHQse1o6KCk9Pml9KTt2YXIgcj1uKDY2MTQpLG89bi5uKHIpO2Z1bmN0aW9uIGkoKXtyZXR1cm4gbygpKCcvKiFcbiogT05OWCBSdW50aW1lIFdlYiB2MS4xNi4zXG4qIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4qL1xuKCgpPT57dmFyIGU9ezkxODooZSx0LHIpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnNldFJ1bk9wdGlvbnM9dm9pZCAwO2NvbnN0IG49cigyNjMpLGE9cig0OTcpO3Quc2V0UnVuT3B0aW9ucz1lPT57Y29uc3QgdD0oMCxuLmdldEluc3RhbmNlKSgpO2xldCByPTA7Y29uc3Qgbz1bXSxpPWV8fHt9O3RyeXtpZih2b2lkIDA9PT0obnVsbD09ZT92b2lkIDA6ZS5sb2dTZXZlcml0eUxldmVsKSlpLmxvZ1NldmVyaXR5TGV2ZWw9MjtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2YgZS5sb2dTZXZlcml0eUxldmVsfHwhTnVtYmVyLmlzSW50ZWdlcihlLmxvZ1NldmVyaXR5TGV2ZWwpfHxlLmxvZ1NldmVyaXR5TGV2ZWw8MHx8ZS5sb2dTZXZlcml0eUxldmVsPjQpdGhyb3cgbmV3IEVycm9yKGBsb2cgc2VydmVyaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtlLmxvZ1NldmVyaXR5TGV2ZWx9YCk7aWYodm9pZCAwPT09KG51bGw9PWU/dm9pZCAwOmUubG9nVmVyYm9zaXR5TGV2ZWwpKWkubG9nVmVyYm9zaXR5TGV2ZWw9MDtlbHNlIGlmKCJudW1iZXIiIT10eXBlb2YgZS5sb2dWZXJib3NpdHlMZXZlbHx8IU51bWJlci5pc0ludGVnZXIoZS5sb2dWZXJib3NpdHlMZXZlbCkpdGhyb3cgbmV3IEVycm9yKGBsb2cgdmVyYm9zaXR5IGxldmVsIGlzIG5vdCB2YWxpZDogJHtlLmxvZ1ZlcmJvc2l0eUxldmVsfWApO3ZvaWQgMD09PShudWxsPT1lP3ZvaWQgMDplLnRlcm1pbmF0ZSkmJihpLnRlcm1pbmF0ZT0hMSk7bGV0IG49MDtyZXR1cm4gdm9pZCAwIT09KG51bGw9PWU/dm9pZCAwOmUudGFnKSYmKG49KDAsYS5hbGxvY1dhc21TdHJpbmcpKGUudGFnLG8pKSxyPXQuX09ydENyZWF0ZVJ1bk9wdGlvbnMoaS5sb2dTZXZlcml0eUxldmVsLGkubG9nVmVyYm9zaXR5TGV2ZWwsISFpLnRlcm1pbmF0ZSxuKSwwPT09ciYmKDAsYS5jaGVja0xhc3RFcnJvcikoIkNhblwndCBjcmVhdGUgcnVuIG9wdGlvbnMuIiksdm9pZCAwIT09KG51bGw9PWU/dm9pZCAwOmUuZXh0cmEpJiYoMCxhLml0ZXJhdGVFeHRyYU9wdGlvbnMpKGUuZXh0cmEsIiIsbmV3IFdlYWtTZXQsKChlLG4pPT57Y29uc3QgaT0oMCxhLmFsbG9jV2FzbVN0cmluZykoZSxvKSxzPSgwLGEuYWxsb2NXYXNtU3RyaW5nKShuLG8pOzAhPT10Ll9PcnRBZGRSdW5Db25maWdFbnRyeShyLGkscykmJigwLGEuY2hlY2tMYXN0RXJyb3IpKGBDYW5cJ3Qgc2V0IGEgcnVuIGNvbmZpZyBlbnRyeTogJHtlfSAtICR7bn0uYCl9KSksW3Isb119Y2F0Y2goZSl7dGhyb3cgMCE9PXImJnQuX09ydFJlbGVhc2VSdW5PcHRpb25zKHIpLG8uZm9yRWFjaCgoZT0+dC5fZnJlZShlKSkpLGV9fX0sNjIyOihlLHQscik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuc2V0U2Vzc2lvbk9wdGlvbnM9dm9pZCAwO2NvbnN0IG49cigyNjMpLGE9cig0OTcpO3Quc2V0U2Vzc2lvbk9wdGlvbnM9ZT0+e3ZhciB0LHIsbyxpO2NvbnN0IHM9KDAsbi5nZXRJbnN0YW5jZSkoKTtsZXQgdT0wO2NvbnN0IGM9W10sbD1lfHx7fTsoZT0+e2UuZXh0cmF8fChlLmV4dHJhPXt9KSxlLmV4dHJhLnNlc3Npb258fChlLmV4dHJhLnNlc3Npb249e30pO2NvbnN0IHQ9ZS5leHRyYS5zZXNzaW9uO3QudXNlX29ydF9tb2RlbF9ieXRlc19kaXJlY3RseXx8KHQudXNlX29ydF9tb2RlbF9ieXRlc19kaXJlY3RseT0iMSIpLGUuZXhlY3V0aW9uUHJvdmlkZXJzJiZlLmV4ZWN1dGlvblByb3ZpZGVycy5zb21lKChlPT4id2ViZ3B1Ij09PSgic3RyaW5nIj09dHlwZW9mIGU/ZTplLm5hbWUpKSkmJihlLmVuYWJsZU1lbVBhdHRlcm49ITEpfSkobCk7dHJ5e2NvbnN0IGU9KGU9Pntzd2l0Y2goZSl7Y2FzZSJkaXNhYmxlZCI6cmV0dXJuIDA7Y2FzZSJiYXNpYyI6cmV0dXJuIDE7Y2FzZSJleHRlbmRlZCI6cmV0dXJuIDI7Y2FzZSJhbGwiOnJldHVybiA5OTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZ3JhcGggb3B0aW1pemF0aW9uIGxldmVsOiAke2V9YCl9fSkobnVsbCE9PSh0PWwuZ3JhcGhPcHRpbWl6YXRpb25MZXZlbCkmJnZvaWQgMCE9PXQ/dDoiYWxsIiksZj0oZT0+e3N3aXRjaChlKXtjYXNlInNlcXVlbnRpYWwiOnJldHVybiAwO2Nhc2UicGFyYWxsZWwiOnJldHVybiAxO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBleGVjdXRpb24gbW9kZTogJHtlfWApfX0pKG51bGwhPT0ocj1sLmV4ZWN1dGlvbk1vZGUpJiZ2b2lkIDAhPT1yP3I6InNlcXVlbnRpYWwiKSxkPSJzdHJpbmciPT10eXBlb2YgbC5sb2dJZD8oMCxhLmFsbG9jV2FzbVN0cmluZykobC5sb2dJZCxjKTowLHA9bnVsbCE9PShvPWwubG9nU2V2ZXJpdHlMZXZlbCkmJnZvaWQgMCE9PW8/bzoyO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHApfHxwPDB8fHA+NCl0aHJvdyBuZXcgRXJyb3IoYGxvZyBzZXJ2ZXJpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke3B9YCk7Y29uc3QgZz1udWxsIT09KGk9bC5sb2dWZXJib3NpdHlMZXZlbCkmJnZvaWQgMCE9PWk/aTowO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGcpfHxnPDB8fGc+NCl0aHJvdyBuZXcgRXJyb3IoYGxvZyB2ZXJib3NpdHkgbGV2ZWwgaXMgbm90IHZhbGlkOiAke2d9YCk7Y29uc3QgaD0ic3RyaW5nIj09dHlwZW9mIGwub3B0aW1pemVkTW9kZWxGaWxlUGF0aD8oMCxhLmFsbG9jV2FzbVN0cmluZykobC5vcHRpbWl6ZWRNb2RlbEZpbGVQYXRoLGMpOjA7cmV0dXJuIHU9cy5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnMoZSwhIWwuZW5hYmxlQ3B1TWVtQXJlbmEsISFsLmVuYWJsZU1lbVBhdHRlcm4sZiwhIWwuZW5hYmxlUHJvZmlsaW5nLDAsZCxwLGcsaCksMD09PXUmJigwLGEuY2hlY2tMYXN0RXJyb3IpKCJDYW5cJ3QgY3JlYXRlIHNlc3Npb24gb3B0aW9ucy4iKSxsLmV4ZWN1dGlvblByb3ZpZGVycyYmKChlLHQscik9Pntmb3IoY29uc3QgbyBvZiB0KXtsZXQgdD0ic3RyaW5nIj09dHlwZW9mIG8/bzpvLm5hbWU7c3dpdGNoKHQpe2Nhc2UieG5ucGFjayI6dD0iWE5OUEFDSyI7YnJlYWs7Y2FzZSJ3ZWJubiI6aWYodD0iV0VCTk4iLCJzdHJpbmciIT10eXBlb2Ygbyl7Y29uc3QgdD1vO2lmKG51bGw9PXQ/dm9pZCAwOnQuZGV2aWNlVHlwZSl7Y29uc3Qgbz0oMCxhLmFsbG9jV2FzbVN0cmluZykoImRldmljZVR5cGUiLHIpLGk9KDAsYS5hbGxvY1dhc21TdHJpbmcpKHQuZGV2aWNlVHlwZSxyKTswIT09KDAsbi5nZXRJbnN0YW5jZSkoKS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KGUsbyxpKSYmKDAsYS5jaGVja0xhc3RFcnJvcikoYENhblwndCBzZXQgYSBzZXNzaW9uIGNvbmZpZyBlbnRyeTogXCdkZXZpY2VUeXBlXCcgLSAke3QuZGV2aWNlVHlwZX0uYCl9aWYobnVsbD09dD92b2lkIDA6dC5wb3dlclByZWZlcmVuY2Upe2NvbnN0IG89KDAsYS5hbGxvY1dhc21TdHJpbmcpKCJwb3dlclByZWZlcmVuY2UiLHIpLGk9KDAsYS5hbGxvY1dhc21TdHJpbmcpKHQucG93ZXJQcmVmZXJlbmNlLHIpOzAhPT0oMCxuLmdldEluc3RhbmNlKSgpLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnkoZSxvLGkpJiYoMCxhLmNoZWNrTGFzdEVycm9yKShgQ2FuXCd0IHNldCBhIHNlc3Npb24gY29uZmlnIGVudHJ5OiBcJ3Bvd2VyUHJlZmVyZW5jZVwnIC0gJHt0LnBvd2VyUHJlZmVyZW5jZX0uYCl9fWJyZWFrO2Nhc2Uid2ViZ3B1Ijp0PSJKUyI7YnJlYWs7Y2FzZSJ3YXNtIjpjYXNlImNwdSI6Y29udGludWU7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYG5vdCBzdXBwb3J0ZWQgZXhlY3V0aW9uIHByb3ZpZGVyOiAke3R9YCl9Y29uc3QgaT0oMCxhLmFsbG9jV2FzbVN0cmluZykodCxyKTswIT09KDAsbi5nZXRJbnN0YW5jZSkoKS5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXIoZSxpKSYmKDAsYS5jaGVja0xhc3RFcnJvcikoYENhblwndCBhcHBlbmQgZXhlY3V0aW9uIHByb3ZpZGVyOiAke3R9LmApfX0pKHUsbC5leGVjdXRpb25Qcm92aWRlcnMsYyksdm9pZCAwIT09bC5leHRyYSYmKDAsYS5pdGVyYXRlRXh0cmFPcHRpb25zKShsLmV4dHJhLCIiLG5ldyBXZWFrU2V0LCgoZSx0KT0+e2NvbnN0IHI9KDAsYS5hbGxvY1dhc21TdHJpbmcpKGUsYyksbj0oMCxhLmFsbG9jV2FzbVN0cmluZykodCxjKTswIT09cy5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5KHUscixuKSYmKDAsYS5jaGVja0xhc3RFcnJvcikoYENhblwndCBzZXQgYSBzZXNzaW9uIGNvbmZpZyBlbnRyeTogJHtlfSAtICR7dH0uYCl9KSksW3UsY119Y2F0Y2goZSl7dGhyb3cgMCE9PXUmJnMuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucyh1KSxjLmZvckVhY2goKGU9PnMuX2ZyZWUoZSkpKSxlfX19LDkxNzooZSx0KT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5sb2dMZXZlbFN0cmluZ1RvRW51bT10LnRlbnNvclR5cGVUb1R5cGVkQXJyYXlDb25zdHJ1Y3Rvcj10LmdldFRlbnNvckVsZW1lbnRTaXplPXQudGVuc29yRGF0YVR5cGVFbnVtVG9TdHJpbmc9dC50ZW5zb3JEYXRhVHlwZVN0cmluZ1RvRW51bT12b2lkIDAsdC50ZW5zb3JEYXRhVHlwZVN0cmluZ1RvRW51bT1lPT57c3dpdGNoKGUpe2Nhc2UiaW50OCI6cmV0dXJuIDM7Y2FzZSJ1aW50OCI6cmV0dXJuIDI7Y2FzZSJib29sIjpyZXR1cm4gOTtjYXNlImludDE2IjpyZXR1cm4gNTtjYXNlInVpbnQxNiI6cmV0dXJuIDQ7Y2FzZSJpbnQzMiI6cmV0dXJuIDY7Y2FzZSJ1aW50MzIiOnJldHVybiAxMjtjYXNlImZsb2F0MTYiOnJldHVybiAxMDtjYXNlImZsb2F0MzIiOnJldHVybiAxO2Nhc2UiZmxvYXQ2NCI6cmV0dXJuIDExO2Nhc2Uic3RyaW5nIjpyZXR1cm4gODtjYXNlImludDY0IjpyZXR1cm4gNztjYXNlInVpbnQ2NCI6cmV0dXJuIDEzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBkYXRhIHR5cGU6ICR7ZX1gKX19LHQudGVuc29yRGF0YVR5cGVFbnVtVG9TdHJpbmc9ZT0+e3N3aXRjaChlKXtjYXNlIDM6cmV0dXJuImludDgiO2Nhc2UgMjpyZXR1cm4idWludDgiO2Nhc2UgOTpyZXR1cm4iYm9vbCI7Y2FzZSA1OnJldHVybiJpbnQxNiI7Y2FzZSA0OnJldHVybiJ1aW50MTYiO2Nhc2UgNjpyZXR1cm4iaW50MzIiO2Nhc2UgMTI6cmV0dXJuInVpbnQzMiI7Y2FzZSAxMDpyZXR1cm4iZmxvYXQxNiI7Y2FzZSAxOnJldHVybiJmbG9hdDMyIjtjYXNlIDExOnJldHVybiJmbG9hdDY0IjtjYXNlIDg6cmV0dXJuInN0cmluZyI7Y2FzZSA3OnJldHVybiJpbnQ2NCI7Y2FzZSAxMzpyZXR1cm4idWludDY0IjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAke2V9YCl9fSx0LmdldFRlbnNvckVsZW1lbnRTaXplPWU9Plt2b2lkIDAsNCwxLDEsMiwyLDQsOCx2b2lkIDAsMSwyLDgsNCw4LHZvaWQgMCx2b2lkIDAsdm9pZCAwXVtlXSx0LnRlbnNvclR5cGVUb1R5cGVkQXJyYXlDb25zdHJ1Y3Rvcj1lPT57c3dpdGNoKGUpe2Nhc2UiZmxvYXQxNiI6Y2FzZSJ1aW50MTYiOnJldHVybiBVaW50MTZBcnJheTtjYXNlImZsb2F0MzIiOnJldHVybiBGbG9hdDMyQXJyYXk7Y2FzZSJ1aW50OCI6Y2FzZSJib29sIjpyZXR1cm4gVWludDhBcnJheTtjYXNlImludDgiOnJldHVybiBJbnQ4QXJyYXk7Y2FzZSJpbnQxNiI6cmV0dXJuIEludDE2QXJyYXk7Y2FzZSJpbnQzMiI6cmV0dXJuIEludDMyQXJyYXk7Y2FzZSJmbG9hdDY0IjpyZXR1cm4gRmxvYXQ2NEFycmF5O2Nhc2UidWludDMyIjpyZXR1cm4gVWludDMyQXJyYXk7Y2FzZSJpbnQ2NCI6cmV0dXJuIEJpZ0ludDY0QXJyYXk7Y2FzZSJ1aW50NjQiOnJldHVybiBCaWdVaW50NjRBcnJheTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgdHlwZTogJHtlfWApfX0sdC5sb2dMZXZlbFN0cmluZ1RvRW51bT1lPT57c3dpdGNoKGUpe2Nhc2UidmVyYm9zZSI6cmV0dXJuIDA7Y2FzZSJpbmZvIjpyZXR1cm4gMTtjYXNlIndhcm5pbmciOnJldHVybiAyO2Nhc2UiZXJyb3IiOnJldHVybiAzO2Nhc2UiZmF0YWwiOnJldHVybiA0O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBsb2dnaW5nIGxldmVsOiAke2V9YCl9fX0sMjU5OihlLHQscik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZXh0cmFjdFRyYW5zZmVyYWJsZUJ1ZmZlcnM9dC5lbmRQcm9maWxpbmc9dC5ydW49dC5yZWxlYXNlU2Vzc2lvbj10LmNyZWF0ZVNlc3Npb249dC5jcmVhdGVTZXNzaW9uRmluYWxpemU9dC5jcmVhdGVTZXNzaW9uQWxsb2NhdGU9dC5pbml0UnVudGltZT12b2lkIDA7Y29uc3Qgbj1yKDkxOCksYT1yKDYyMiksbz1yKDkxNyksaT1yKDI2Mykscz1yKDQ5Nyk7dC5pbml0UnVudGltZT1hc3luYyBlPT57dmFyIHQscjt0PWUud2FzbS5udW1UaHJlYWRzLHI9KDAsby5sb2dMZXZlbFN0cmluZ1RvRW51bSkoZS5sb2dMZXZlbCksMCE9PSgwLGkuZ2V0SW5zdGFuY2UpKCkuX09ydEluaXQodCxyKSYmKDAscy5jaGVja0xhc3RFcnJvcikoIkNhblwndCBpbml0aWFsaXplIG9ubnhydW50aW1lLiIpfTtjb25zdCB1PW5ldyBNYXA7dC5jcmVhdGVTZXNzaW9uQWxsb2NhdGU9ZT0+e2NvbnN0IHQ9KDAsaS5nZXRJbnN0YW5jZSkoKSxyPXQuX21hbGxvYyhlLmJ5dGVMZW5ndGgpO2lmKDA9PT1yKXRocm93IG5ldyBFcnJvcihgQ2FuXCd0IGNyZWF0ZSBhIHNlc3Npb24uIGZhaWxlZCB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBvZiBzaXplICR7ZS5ieXRlTGVuZ3RofS5gKTtyZXR1cm4gdC5IRUFQVTguc2V0KGUsciksW3IsZS5ieXRlTGVuZ3RoXX0sdC5jcmVhdGVTZXNzaW9uRmluYWxpemU9KGUsdCk9Pntjb25zdCByPSgwLGkuZ2V0SW5zdGFuY2UpKCk7bGV0IG49MCxvPTAsYz1bXTtjb25zdCBsPVtdLGY9W107dHJ5e1tvLGNdPSgwLGEuc2V0U2Vzc2lvbk9wdGlvbnMpKHQpLG49ci5fT3J0Q3JlYXRlU2Vzc2lvbihlWzBdLGVbMV0sbyksMD09PW4mJigwLHMuY2hlY2tMYXN0RXJyb3IpKCJDYW5cJ3QgY3JlYXRlIGEgc2Vzc2lvbi4iKTtjb25zdFtkLHBdPShlPT57Y29uc3QgdD0oMCxpLmdldEluc3RhbmNlKSgpLHI9dC5zdGFja1NhdmUoKTt0cnl7Y29uc3Qgcj10LnN0YWNrQWxsb2MoOCk7cmV0dXJuIDAhPT10Ll9PcnRHZXRJbnB1dE91dHB1dENvdW50KGUscixyKzQpJiYoMCxzLmNoZWNrTGFzdEVycm9yKSgiQ2FuXCd0IGdldCBzZXNzaW9uIGlucHV0L291dHB1dCBjb3VudC4iKSxbdC5IRUFQMzJbci80XSx0LkhFQVAzMltyLzQrMV1dfWZpbmFsbHl7dC5zdGFja1Jlc3RvcmUocil9fSkobiksZz1bXSxoPVtdO2ZvcihsZXQgZT0wO2U8ZDtlKyspe2NvbnN0IHQ9ci5fT3J0R2V0SW5wdXROYW1lKG4sZSk7MD09PXQmJigwLHMuY2hlY2tMYXN0RXJyb3IpKCJDYW5cJ3QgZ2V0IGFuIGlucHV0IG5hbWUuIiksbC5wdXNoKHQpLGcucHVzaChyLlVURjhUb1N0cmluZyh0KSl9Zm9yKGxldCBlPTA7ZTxwO2UrKyl7Y29uc3QgdD1yLl9PcnRHZXRPdXRwdXROYW1lKG4sZSk7MD09PXQmJigwLHMuY2hlY2tMYXN0RXJyb3IpKCJDYW5cJ3QgZ2V0IGFuIG91dHB1dCBuYW1lLiIpLGYucHVzaCh0KSxoLnB1c2goci5VVEY4VG9TdHJpbmcodCkpfXJldHVybiB1LnNldChuLFtuLGwsZl0pLFtuLGcsaF19Y2F0Y2goZSl7dGhyb3cgbC5mb3JFYWNoKChlPT5yLl9PcnRGcmVlKGUpKSksZi5mb3JFYWNoKChlPT5yLl9PcnRGcmVlKGUpKSksMCE9PW4mJnIuX09ydFJlbGVhc2VTZXNzaW9uKG4pLGV9ZmluYWxseXtyLl9mcmVlKGVbMF0pLDAhPT1vJiZyLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnMobyksYy5mb3JFYWNoKChlPT5yLl9mcmVlKGUpKSl9fSx0LmNyZWF0ZVNlc3Npb249KGUscik9Pntjb25zdCBuPSgwLHQuY3JlYXRlU2Vzc2lvbkFsbG9jYXRlKShlKTtyZXR1cm4oMCx0LmNyZWF0ZVNlc3Npb25GaW5hbGl6ZSkobixyKX0sdC5yZWxlYXNlU2Vzc2lvbj1lPT57Y29uc3QgdD0oMCxpLmdldEluc3RhbmNlKSgpLHI9dS5nZXQoZSk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgcmVsZWFzZSBzZXNzaW9uLiBpbnZhbGlkIHNlc3Npb24gaWQ6ICR7ZX1gKTtjb25zdFtuLGEsb109cjthLmZvckVhY2goKGU9PnQuX09ydEZyZWUoZSkpKSxvLmZvckVhY2goKGU9PnQuX09ydEZyZWUoZSkpKSx0Ll9PcnRSZWxlYXNlU2Vzc2lvbihuKSx1LmRlbGV0ZShlKX0sdC5ydW49YXN5bmMoZSx0LHIsYSxjKT0+e2NvbnN0IGw9KDAsaS5nZXRJbnN0YW5jZSkoKSxmPXUuZ2V0KGUpO2lmKCFmKXRocm93IG5ldyBFcnJvcihgY2Fubm90IHJ1biBpbmZlcmVuY2UuIGludmFsaWQgc2Vzc2lvbiBpZDogJHtlfWApO2NvbnN0W2QscCxnXT1mLGg9dC5sZW5ndGgsbT1hLmxlbmd0aDtsZXQgeT0wLHY9W107Y29uc3QgYj1bXSx3PVtdO3RyeXtbeSx2XT0oMCxuLnNldFJ1bk9wdGlvbnMpKGMpO2ZvcihsZXQgZT0wO2U8aDtlKyspe2NvbnN0IHQ9cltlXVswXSxuPXJbZV1bMV0sYT1yW2VdWzJdO2xldCBpLHU7aWYoQXJyYXkuaXNBcnJheShhKSl7dT00KmEubGVuZ3RoLGk9bC5fbWFsbG9jKHUpLHcucHVzaChpKTtsZXQgZT1pLzQ7Zm9yKGxldCB0PTA7dDxhLmxlbmd0aDt0Kyspe2lmKCJzdHJpbmciIT10eXBlb2YgYVt0XSl0aHJvdyBuZXcgVHlwZUVycm9yKGB0ZW5zb3IgZGF0YSBhdCBpbmRleCAke3R9IGlzIG5vdCBhIHN0cmluZ2ApO2wuSEVBUFUzMltlKytdPSgwLHMuYWxsb2NXYXNtU3RyaW5nKShhW3RdLHcpfX1lbHNlIHU9YS5ieXRlTGVuZ3RoLGk9bC5fbWFsbG9jKHUpLHcucHVzaChpKSxsLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkoYS5idWZmZXIsYS5ieXRlT2Zmc2V0LHUpLGkpO2NvbnN0IGM9bC5zdGFja1NhdmUoKSxmPWwuc3RhY2tBbGxvYyg0Km4ubGVuZ3RoKTt0cnl7bGV0IHI9Zi80O24uZm9yRWFjaCgoZT0+bC5IRUFQMzJbcisrXT1lKSk7Y29uc3QgYT1sLl9PcnRDcmVhdGVUZW5zb3IoKDAsby50ZW5zb3JEYXRhVHlwZVN0cmluZ1RvRW51bSkodCksaSx1LGYsbi5sZW5ndGgpOzA9PT1hJiYoMCxzLmNoZWNrTGFzdEVycm9yKShgQ2FuXCd0IGNyZWF0ZSB0ZW5zb3IgZm9yIGlucHV0WyR7ZX1dLmApLGIucHVzaChhKX1maW5hbGx5e2wuc3RhY2tSZXN0b3JlKGMpfX1jb25zdCBlPWwuc3RhY2tTYXZlKCksaT1sLnN0YWNrQWxsb2MoNCpoKSx1PWwuc3RhY2tBbGxvYyg0KmgpLGY9bC5zdGFja0FsbG9jKDQqbSksXz1sLnN0YWNrQWxsb2MoNCptKTt0cnl7bGV0IGU9aS80LHI9dS80LG49Zi80LGM9Xy80O2ZvcihsZXQgbj0wO248aDtuKyspbC5IRUFQVTMyW2UrK109YltuXSxsLkhFQVBVMzJbcisrXT1wW3Rbbl1dO2ZvcihsZXQgZT0wO2U8bTtlKyspbC5IRUFQVTMyW24rK109MCxsLkhFQVBVMzJbYysrXT1nW2FbZV1dO2xldCB2PWwuX09ydFJ1bihkLHUsaSxoLF8sbSxmLHkpO2NvbnN0IHc9bC5qc2VwUnVuUHJvbWlzZTt3JiZ2b2lkIDAhPT13LnRoZW4mJih2PWF3YWl0IHcpO2NvbnN0IE89W107MCE9PXYmJigwLHMuY2hlY2tMYXN0RXJyb3IpKCJmYWlsZWQgdG8gY2FsbCBPcnRSdW4oKS4iKTtmb3IobGV0IGU9MDtlPG07ZSsrKXtjb25zdCB0PWwuSEVBUFUzMltmLzQrZV0scj1sLnN0YWNrU2F2ZSgpLG49bC5zdGFja0FsbG9jKDE2KTtsZXQgYSxpPTA7dHJ5e3Y9bC5fT3J0R2V0VGVuc29yRGF0YSh0LG4sbis0LG4rOCxuKzEyKSwwIT09diYmKDAscy5jaGVja0xhc3RFcnJvcikoYENhblwndCBhY2Nlc3Mgb3V0cHV0IHRlbnNvciBkYXRhIG9uIGluZGV4ICR7ZX0uYCk7bGV0IHI9bi80O2NvbnN0IHU9bC5IRUFQVTMyW3IrK107aT1sLkhFQVBVMzJbcisrXTtjb25zdCBjPWwuSEVBUFUzMltyKytdLGY9bC5IRUFQVTMyW3IrK10sZD1bXTtmb3IobGV0IGU9MDtlPGY7ZSsrKWQucHVzaChsLkhFQVBVMzJbYy80K2VdKTtsLl9PcnRGcmVlKGMpO2NvbnN0IHA9MD09PWQubGVuZ3RoPzE6ZC5yZWR1Y2UoKChlLHQpPT5lKnQpKTtpZihhPSgwLG8udGVuc29yRGF0YVR5cGVFbnVtVG9TdHJpbmcpKHUpLCJzdHJpbmciPT09YSl7Y29uc3QgZT1bXTtsZXQgdD1pLzQ7Zm9yKGxldCByPTA7cjxwO3IrKyl7Y29uc3Qgbj1sLkhFQVBVMzJbdCsrXSxhPXI9PT1wLTE/dm9pZCAwOmwuSEVBUFUzMlt0XS1uO2UucHVzaChsLlVURjhUb1N0cmluZyhuLGEpKX1PLnB1c2goW2EsZCxlXSl9ZWxzZXtjb25zdCBlPW5ldygoMCxvLnRlbnNvclR5cGVUb1R5cGVkQXJyYXlDb25zdHJ1Y3RvcikoYSkpKHApO25ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpLnNldChsLkhFQVBVOC5zdWJhcnJheShpLGkrZS5ieXRlTGVuZ3RoKSksTy5wdXNoKFthLGQsZV0pfX1maW5hbGx5e2wuc3RhY2tSZXN0b3JlKHIpLCJzdHJpbmciPT09YSYmaSYmbC5fZnJlZShpKSxsLl9PcnRSZWxlYXNlVGVuc29yKHQpfX1yZXR1cm4gT31maW5hbGx5e2wuc3RhY2tSZXN0b3JlKGUpfX1maW5hbGx5e2IuZm9yRWFjaCgoZT0+bC5fT3J0UmVsZWFzZVRlbnNvcihlKSkpLHcuZm9yRWFjaCgoZT0+bC5fZnJlZShlKSkpLDAhPT15JiZsLl9PcnRSZWxlYXNlUnVuT3B0aW9ucyh5KSx2LmZvckVhY2goKGU9PmwuX2ZyZWUoZSkpKX19LHQuZW5kUHJvZmlsaW5nPWU9Pntjb25zdCB0PSgwLGkuZ2V0SW5zdGFuY2UpKCkscj11LmdldChlKTtpZighcil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2Vzc2lvbiBpZCIpO2NvbnN0IG49clswXSxhPXQuX09ydEVuZFByb2ZpbGluZyhuKTswPT09YSYmKDAscy5jaGVja0xhc3RFcnJvcikoIkNhblwndCBnZXQgYW4gcHJvZmlsZSBmaWxlIG5hbWUuIiksdC5fT3J0RnJlZShhKX0sdC5leHRyYWN0VHJhbnNmZXJhYmxlQnVmZmVycz1lPT57Y29uc3QgdD1bXTtmb3IoY29uc3QgciBvZiBlKXtjb25zdCBlPXJbMl07IUFycmF5LmlzQXJyYXkoZSkmJmUuYnVmZmVyJiZ0LnB1c2goZS5idWZmZXIpfXJldHVybiB0fX0sMjYzOmZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7dmFyIG49dGhpcyYmdGhpcy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxyLG4pe3ZvaWQgMD09PW4mJihuPXIpO3ZhciBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxyKTthJiYhKCJnZXQiaW4gYT8hdC5fX2VzTW9kdWxlOmEud3JpdGFibGV8fGEuY29uZmlndXJhYmxlKXx8KGE9e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbcl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbixhKX06ZnVuY3Rpb24oZSx0LHIsbil7dm9pZCAwPT09biYmKG49ciksZVtuXT10W3JdfSksYT10aGlzJiZ0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdHx8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pfTpmdW5jdGlvbihlLHQpe2UuZGVmYXVsdD10fSksbz10aGlzJiZ0aGlzLl9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24oZSl7aWYoZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciB0PXt9O2lmKG51bGwhPWUpZm9yKHZhciByIGluIGUpImRlZmF1bHQiIT09ciYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJm4odCxlLHIpO3JldHVybiBhKHQsZSksdH07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZGlzcG9zZT10LmdldEluc3RhbmNlPXQuaW5pdGlhbGl6ZVdlYkFzc2VtYmx5PXZvaWQgMDtjb25zdCBpPW8ocig0NDkpKSxzPXIoOTMyKSx1PXIoNDc0KTtsZXQgYyxsPSExLGY9ITEsZD0hMTt0LmluaXRpYWxpemVXZWJBc3NlbWJseT1hc3luYyBlPT57aWYobClyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7aWYoZil0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIGNhbGxzIHRvIFwnaW5pdGlhbGl6ZVdlYkFzc2VtYmx5KClcJyBkZXRlY3RlZC4iKTtpZihkKXRocm93IG5ldyBFcnJvcigicHJldmlvdXMgY2FsbCB0byBcJ2luaXRpYWxpemVXZWJBc3NlbWJseSgpXCcgZmFpbGVkLiIpO2Y9ITA7Y29uc3QgdD1lLmluaXRUaW1lb3V0LG49ZS5udW1UaHJlYWRzLGE9ZS5zaW1kLG89bj4xJiYoKCk9Pnt0cnl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciYmKCJ1bmRlZmluZWQiIT10eXBlb2YgTWVzc2FnZUNoYW5uZWwmJihuZXcgTWVzc2FnZUNoYW5uZWwpLnBvcnQxLnBvc3RNZXNzYWdlKG5ldyBTaGFyZWRBcnJheUJ1ZmZlcigxKSksV2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNCwxLDk2LDAsMCwzLDIsMSwwLDUsNCwxLDMsMSwxLDEwLDExLDEsOSwwLDY1LDAsMjU0LDE2LDIsMCwyNiwxMV0pKSl9Y2F0Y2goZSl7cmV0dXJuITF9fSkoKSxwPWEmJigoKT0+e3RyeXtyZXR1cm4gV2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNCwxLDk2LDAsMCwzLDIsMSwwLDEwLDMwLDEsMjgsMCw2NSwwLDI1MywxNSwyNTMsMTIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyNTMsMTg2LDEsMjYsMTFdKSl9Y2F0Y2goZSl7cmV0dXJuITF9fSkoKSxnPWUud2FzbVBhdGhzLGg9InN0cmluZyI9PXR5cGVvZiBnP2c6dm9pZCAwLG09KChlLHQpPT50P2U/Im9ydC13YXNtLXNpbWQtdGhyZWFkZWQud2FzbSI6Im9ydC13YXNtLXRocmVhZGVkLndhc20iOmU/Im9ydC13YXNtLXNpbWQud2FzbSI6Im9ydC13YXNtLndhc20iKShwLG8pLHk9Im9iamVjdCI9PXR5cGVvZiBnP2dbbV06dm9pZCAwO2xldCB2PSExO2NvbnN0IGI9W107aWYodD4wJiZiLnB1c2gobmV3IFByb21pc2UoKGU9PntzZXRUaW1lb3V0KCgoKT0+e3Y9ITAsZSgpfSksdCl9KSkpLGIucHVzaChuZXcgUHJvbWlzZSgoKGUsdCk9Pntjb25zdCBuPW8/dTpzLGE9e2xvY2F0ZUZpbGU6KGUsdCk9Pm8mJmUuZW5kc1dpdGgoIi53b3JrZXIuanMiKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBCbG9iP1VSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3IoMTU0KV0se3R5cGU6InRleHQvamF2YXNjcmlwdCJ9KSk6ZS5lbmRzV2l0aCgiLndhc20iKT95fHwobnVsbCE9aD9oOnQpK206dCtlfTtpZihvKWlmKCJ1bmRlZmluZWQiPT10eXBlb2YgQmxvYilhLm1haW5TY3JpcHRVcmxPckJsb2I9aS5qb2luKF9fZGlybmFtZSwib3J0LXdhc20tdGhyZWFkZWQuanMiKTtlbHNle2NvbnN0IGU9YHZhciBvcnRXYXNtVGhyZWFkZWQ9KGZ1bmN0aW9uKCl7dmFyIF9zY3JpcHREaXI7cmV0dXJuICR7bi50b1N0cmluZygpfX0pKCk7YDthLm1haW5TY3JpcHRVcmxPckJsb2I9bmV3IEJsb2IoW2VdLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSl9bihhKS50aGVuKCh0PT57Zj0hMSxsPSEwLGM9dCxlKCl9KSwoZT0+e2Y9ITEsZD0hMCx0KGUpfSkpfSkpKSxhd2FpdCBQcm9taXNlLnJhY2UoYiksdil0aHJvdyBuZXcgRXJyb3IoYFdlYkFzc2VtYmx5IGJhY2tlbmQgaW5pdGlhbGl6aW5nIGZhaWxlZCBkdWUgdG8gdGltZW91dDogJHt0fW1zYCl9LHQuZ2V0SW5zdGFuY2U9KCk9PntpZihsJiZjKXJldHVybiBjO3Rocm93IG5ldyBFcnJvcigiV2ViQXNzZW1ibHkgaXMgbm90IGluaXRpYWxpemVkIHlldC4iKX0sdC5kaXNwb3NlPSgpPT57dmFyIGU7IWx8fGZ8fGR8fChmPSEwLG51bGw9PT0oZT1jLlBUaHJlYWQpfHx2b2lkIDA9PT1lfHxlLnRlcm1pbmF0ZUFsbFRocmVhZHMoKSxjPXZvaWQgMCxmPSExLGw9ITEsZD0hMCl9fSw0OTc6KGUsdCxyKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jaGVja0xhc3RFcnJvcj10Lml0ZXJhdGVFeHRyYU9wdGlvbnM9dC5hbGxvY1dhc21TdHJpbmc9dm9pZCAwO2NvbnN0IG49cigyNjMpO3QuYWxsb2NXYXNtU3RyaW5nPShlLHQpPT57Y29uc3Qgcj0oMCxuLmdldEluc3RhbmNlKSgpLGE9ci5sZW5ndGhCeXRlc1VURjgoZSkrMSxvPXIuX21hbGxvYyhhKTtyZXR1cm4gci5zdHJpbmdUb1VURjgoZSxvLGEpLHQucHVzaChvKSxvfSx0Lml0ZXJhdGVFeHRyYU9wdGlvbnM9KGUscixuLGEpPT57aWYoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZSl7aWYobi5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKCJDaXJjdWxhciByZWZlcmVuY2UgaW4gb3B0aW9ucyIpO24uYWRkKGUpfU9iamVjdC5lbnRyaWVzKGUpLmZvckVhY2goKChbZSxvXSk9Pntjb25zdCBpPXI/citlOmU7aWYoIm9iamVjdCI9PXR5cGVvZiBvKSgwLHQuaXRlcmF0ZUV4dHJhT3B0aW9ucykobyxpKyIuIixuLGEpO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBvfHwibnVtYmVyIj09dHlwZW9mIG8pYShpLG8udG9TdHJpbmcoKSk7ZWxzZXtpZigiYm9vbGVhbiIhPXR5cGVvZiBvKXRocm93IG5ldyBFcnJvcigiQ2FuXCd0IGhhbmRsZSBleHRyYSBjb25maWcgdHlwZTogIit0eXBlb2Ygbyk7YShpLG8/IjEiOiIwIil9fSkpfSx0LmNoZWNrTGFzdEVycm9yPWU9Pntjb25zdCB0PSgwLG4uZ2V0SW5zdGFuY2UpKCkscj10LnN0YWNrU2F2ZSgpO3RyeXtjb25zdCByPXQuc3RhY2tBbGxvYyg4KTt0Ll9PcnRHZXRMYXN0RXJyb3IocixyKzQpO2NvbnN0IG49dC5IRUFQMzJbci80XSxhPXQuSEVBUFUzMltyLzQrMV0sbz1hP3QuVVRGOFRvU3RyaW5nKGEpOiIiO3Rocm93IG5ldyBFcnJvcihgJHtlfSBFUlJPUl9DT0RFOiAke259LCBFUlJPUl9NRVNTQUdFOiAke299YCl9ZmluYWxseXt0LnN0YWNrUmVzdG9yZShyKX19fSw0NzQ6KGUsdCxyKT0+e3ZhciBfc2NyaXB0RGlyLG49KF9zY3JpcHREaXI9InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdD9kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYzp2b2lkIDAsInVuZGVmaW5lZCIhPXR5cGVvZiBfX2ZpbGVuYW1lJiYoX3NjcmlwdERpcj1fc2NyaXB0RGlyfHxfX2ZpbGVuYW1lKSxmdW5jdGlvbihlPXt9KXtmdW5jdGlvbiB0KCl7cmV0dXJuIGsuYnVmZmVyIT14LmJ1ZmZlciYmWSgpLHh9ZnVuY3Rpb24gbigpe3JldHVybiBrLmJ1ZmZlciE9eC5idWZmZXImJlkoKSxJfWZ1bmN0aW9uIGEoKXtyZXR1cm4gay5idWZmZXIhPXguYnVmZmVyJiZZKCksVX1mdW5jdGlvbiBvKCl7cmV0dXJuIGsuYnVmZmVyIT14LmJ1ZmZlciYmWSgpLEx9ZnVuY3Rpb24gaSgpe3JldHVybiBrLmJ1ZmZlciE9eC5idWZmZXImJlkoKSxXfXZhciBzLHUsYz1lO2MucmVhZHk9bmV3IFByb21pc2UoKChlLHQpPT57cz1lLHU9dH0pKTt2YXIgbCxmLGQscD1PYmplY3QuYXNzaWduKHt9LGMpLGc9Ii4vdGhpcy5wcm9ncmFtIixoPShlLHQpPT57dGhyb3cgdH0sbT0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyx5PSJmdW5jdGlvbiI9PXR5cGVvZiBpbXBvcnRTY3JpcHRzLHY9Im9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiYib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMmJiJzdHJpbmciPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLGI9Yy5FTlZJUk9OTUVOVF9JU19QVEhSRUFEfHwhMSx3PSIiO2Z1bmN0aW9uIF8oZSl7cmV0dXJuIGMubG9jYXRlRmlsZT9jLmxvY2F0ZUZpbGUoZSx3KTp3K2V9aWYodil7dmFyIE89cigzODQpLFM9cig5MDgpO2xldCB0O3c9eT9TLmRpcm5hbWUodykrIi8iOl9fZGlybmFtZSsiLyIsbD0oZSx0KT0+KGU9ZS5zdGFydHNXaXRoKCJmaWxlOi8vIik/bmV3IFVSTChlKTpTLm5vcm1hbGl6ZShlKSxPLnJlYWRGaWxlU3luYyhlLHQ/dm9pZCAwOiJ1dGY4IikpLGQ9ZT0+KChlPWwoZSwhMCkpLmJ1ZmZlcnx8KGU9bmV3IFVpbnQ4QXJyYXkoZSkpLGUpLGY9KGUsdCxyLG49ITApPT57ZT1lLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKT9uZXcgVVJMKGUpOlMubm9ybWFsaXplKGUpLE8ucmVhZEZpbGUoZSxuP3ZvaWQgMDoidXRmOCIsKChlLGEpPT57ZT9yKGUpOnQobj9hLmJ1ZmZlcjphKX0pKX0sIWMudGhpc1Byb2dyYW0mJjE8cHJvY2Vzcy5hcmd2Lmxlbmd0aCYmKGc9cHJvY2Vzcy5hcmd2WzFdLnJlcGxhY2UoL1xcXFwvZywiLyIpKSxwcm9jZXNzLmFyZ3Yuc2xpY2UoMiksaD0oZSx0KT0+e3Rocm93IHByb2Nlc3MuZXhpdENvZGU9ZSx0fSxjLmluc3BlY3Q9KCk9PiJbRW1zY3JpcHRlbiBNb2R1bGUgb2JqZWN0XSI7dHJ5e3Q9cig5MjUpfWNhdGNoKGUpe3Rocm93IGNvbnNvbGUuZXJyb3IoXCdUaGUgIndvcmtlcl90aHJlYWRzIiBtb2R1bGUgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIG5vZGUuanMgYnVpbGQgLSBwZXJoYXBzIGEgbmV3ZXIgdmVyc2lvbiBpcyBuZWVkZWQ/XCcpLGV9Z2xvYmFsLldvcmtlcj10Lldvcmtlcn1lbHNlKG18fHkpJiYoeT93PXNlbGYubG9jYXRpb24uaHJlZjoidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYodz1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksX3NjcmlwdERpciYmKHc9X3NjcmlwdERpciksdz0wIT09dy5pbmRleE9mKCJibG9iOiIpP3cuc3Vic3RyKDAsdy5yZXBsYWNlKC9bPyNdLiovLCIiKS5sYXN0SW5kZXhPZigiLyIpKzEpOiIiLHZ8fChsPWU9Pnt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHQub3BlbigiR0VUIixlLCExKSx0LnNlbmQobnVsbCksdC5yZXNwb25zZVRleHR9LHkmJihkPWU9Pnt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHQub3BlbigiR0VUIixlLCExKSx0LnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLHQuc2VuZChudWxsKSxuZXcgVWludDhBcnJheSh0LnJlc3BvbnNlKX0pLGY9KGUsdCxyKT0+e3ZhciBuPW5ldyBYTUxIdHRwUmVxdWVzdDtuLm9wZW4oIkdFVCIsZSwhMCksbi5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixuLm9ubG9hZD0oKT0+ezIwMD09bi5zdGF0dXN8fDA9PW4uc3RhdHVzJiZuLnJlc3BvbnNlP3Qobi5yZXNwb25zZSk6cigpfSxuLm9uZXJyb3I9cixuLnNlbmQobnVsbCl9KSk7diYmInVuZGVmaW5lZCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmKGdsb2JhbC5wZXJmb3JtYW5jZT1yKDk1MykucGVyZm9ybWFuY2UpO3ZhciBFPWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksQT1jb25zb2xlLmVycm9yLmJpbmQoY29uc29sZSk7diYmKEU9KC4uLmUpPT5PLndyaXRlU3luYygxLGUuam9pbigiICIpKyJcXG4iKSxBPSguLi5lKT0+Ty53cml0ZVN5bmMoMixlLmpvaW4oIiAiKSsiXFxuIikpO3ZhciBULE09Yy5wcmludHx8RSxSPWMucHJpbnRFcnJ8fEE7T2JqZWN0LmFzc2lnbihjLHApLHA9bnVsbCxjLnRoaXNQcm9ncmFtJiYoZz1jLnRoaXNQcm9ncmFtKSxjLnF1aXQmJihoPWMucXVpdCksYy53YXNtQmluYXJ5JiYoVD1jLndhc21CaW5hcnkpO3ZhciBGPWMubm9FeGl0UnVudGltZXx8ITA7Im9iamVjdCIhPXR5cGVvZiBXZWJBc3NlbWJseSYmdGUoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTt2YXIgayxDLFAsRCx4LEksVSxMLFcsSD0hMTtmdW5jdGlvbiBZKCl7dmFyIGU9ay5idWZmZXI7Yy5IRUFQOD14PW5ldyBJbnQ4QXJyYXkoZSksYy5IRUFQMTY9bmV3IEludDE2QXJyYXkoZSksYy5IRUFQMzI9VT1uZXcgSW50MzJBcnJheShlKSxjLkhFQVBVOD1JPW5ldyBVaW50OEFycmF5KGUpLGMuSEVBUFUxNj1uZXcgVWludDE2QXJyYXkoZSksYy5IRUFQVTMyPUw9bmV3IFVpbnQzMkFycmF5KGUpLGMuSEVBUEYzMj1uZXcgRmxvYXQzMkFycmF5KGUpLGMuSEVBUEY2ND1XPW5ldyBGbG9hdDY0QXJyYXkoZSl9dmFyIGo9Yy5JTklUSUFMX01FTU9SWXx8MTY3NzcyMTY7aWYoNTI0Mjg4MDw9anx8dGUoIklOSVRJQUxfTUVNT1JZIHNob3VsZCBiZSBsYXJnZXIgdGhhbiBTVEFDS19TSVpFLCB3YXMgIitqKyIhIChTVEFDS19TSVpFPTUyNDI4ODApIiksYilrPWMud2FzbU1lbW9yeTtlbHNlIGlmKGMud2FzbU1lbW9yeSlrPWMud2FzbU1lbW9yeTtlbHNlIGlmKCEoKGs9bmV3IFdlYkFzc2VtYmx5Lk1lbW9yeSh7aW5pdGlhbDpqLzY1NTM2LG1heGltdW06NjU1MzYsc2hhcmVkOiEwfSkpLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSl0aHJvdyBSKCJyZXF1ZXN0ZWQgYSBzaGFyZWQgV2ViQXNzZW1ibHkuTWVtb3J5IGJ1dCB0aGUgcmV0dXJuZWQgYnVmZmVyIGlzIG5vdCBhIFNoYXJlZEFycmF5QnVmZmVyLCBpbmRpY2F0aW5nIHRoYXQgd2hpbGUgdGhlIGJyb3dzZXIgaGFzIFNoYXJlZEFycmF5QnVmZmVyIGl0IGRvZXMgbm90IGhhdmUgV2ViQXNzZW1ibHkgdGhyZWFkcyBzdXBwb3J0IC0geW91IG1heSBuZWVkIHRvIHNldCBhIGZsYWciKSx2JiZSKCIob24gbm9kZSB5b3UgbWF5IG5lZWQ6IC0tZXhwZXJpbWVudGFsLXdhc20tdGhyZWFkcyAtLWV4cGVyaW1lbnRhbC13YXNtLWJ1bGstbWVtb3J5IGFuZC9vciByZWNlbnQgdmVyc2lvbikiKSxFcnJvcigiYmFkIG1lbW9yeSIpO1koKSxqPWsuYnVmZmVyLmJ5dGVMZW5ndGg7dmFyIHosRz1bXSxOPVtdLEI9W10sJD0wO2Z1bmN0aW9uIHEoKXtyZXR1cm4gRnx8MDwkfXZhciBWLEosWD0wLEs9bnVsbCxaPW51bGw7ZnVuY3Rpb24gUSgpe1grKyxjLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJmMubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhYKX1mdW5jdGlvbiBlZSgpe2lmKFgtLSxjLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJmMubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhYKSwwPT1YJiYobnVsbCE9PUsmJihjbGVhckludGVydmFsKEspLEs9bnVsbCksWikpe3ZhciBlPVo7Wj1udWxsLGUoKX19ZnVuY3Rpb24gdGUoZSl7dGhyb3cgYy5vbkFib3J0JiZjLm9uQWJvcnQoZSksUihlPSJBYm9ydGVkKCIrZSsiKSIpLEg9ITAsRD0xLGU9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihlKyIuIEJ1aWxkIHdpdGggLXNBU1NFUlRJT05TIGZvciBtb3JlIGluZm8uIiksdShlKSxlfWZ1bmN0aW9uIHJlKGUpe3JldHVybiBlLnN0YXJ0c1dpdGgoImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiKX1mdW5jdGlvbiBuZShlKXtpZihlPT1WJiZUKXJldHVybiBuZXcgVWludDhBcnJheShUKTtpZihkKXJldHVybiBkKGUpO3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1mdW5jdGlvbiBhZShlLHQscil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKCFUJiYobXx8eSkpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBmZXRjaCYmIWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpKXJldHVybiBmZXRjaChlLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbigodD0+e2lmKCF0Lm9rKXRocm93ImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgXCciK2UrIlwnIjtyZXR1cm4gdC5hcnJheUJ1ZmZlcigpfSkpLmNhdGNoKCgoKT0+bmUoZSkpKTtpZihmKXJldHVybiBuZXcgUHJvbWlzZSgoKHQscik9PntmKGUsKGU9PnQobmV3IFVpbnQ4QXJyYXkoZSkpKSxyKX0pKX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKCk9Pm5lKGUpKSl9KGUpLnRoZW4oKGU9PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGUsdCkpKS50aGVuKChlPT5lKSkudGhlbihyLChlPT57UigiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIitlKSx0ZShlKX0pKX1mdW5jdGlvbiBvZShlKXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiLHRoaXMubWVzc2FnZT1gUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgke2V9KWAsdGhpcy5zdGF0dXM9ZX1mdW5jdGlvbiBpZShlKXtlLnRlcm1pbmF0ZSgpLGUub25tZXNzYWdlPSgpPT57fX1mdW5jdGlvbiBzZShlKXsoZT1nZS5GYVtlXSl8fHRlKCksZ2UuZmIoZSl9ZnVuY3Rpb24gdWUoZSl7dmFyIHQ9Z2UuWmEoKTtpZighdClyZXR1cm4gNjtnZS5JYS5wdXNoKHQpLGdlLkZhW2UuSGFdPXQsdC5IYT1lLkhhO3ZhciByPXtjbWQ6InJ1biIsc3RhcnRfcm91dGluZTplLmdiLGFyZzplLllhLHB0aHJlYWRfcHRyOmUuSGF9O3JldHVybiB2JiZ0LnVucmVmKCksdC5wb3N0TWVzc2FnZShyLGUubWIpLDB9cmUoVj0ib3J0LXdhc20tdGhyZWFkZWQud2FzbSIpfHwoVj1fKFYpKTt2YXIgY2U9InVuZGVmaW5lZCIhPXR5cGVvZiBUZXh0RGVjb2Rlcj9uZXcgVGV4dERlY29kZXIoInV0ZjgiKTp2b2lkIDAsbGU9KGUsdCxyKT0+e3ZhciBuPSh0Pj4+PTApK3I7Zm9yKHI9dDtlW3JdJiYhKHI+PW4pOykrK3I7aWYoMTY8ci10JiZlLmJ1ZmZlciYmY2UpcmV0dXJuIGNlLmRlY29kZShlLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyP2Uuc2xpY2UodCxyKTplLnN1YmFycmF5KHQscikpO2ZvcihuPSIiO3Q8cjspe3ZhciBhPWVbdCsrXTtpZigxMjgmYSl7dmFyIG89NjMmZVt0KytdO2lmKDE5Mj09KDIyNCZhKSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCgzMSZhKTw8NnxvKTtlbHNle3ZhciBpPTYzJmVbdCsrXTs2NTUzNj4oYT0yMjQ9PSgyNDAmYSk/KDE1JmEpPDwxMnxvPDw2fGk6KDcmYSk8PDE4fG88PDEyfGk8PDZ8NjMmZVt0KytdKT9uKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpOihhLT02NTUzNixuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGE+PjEwLDU2MzIwfDEwMjMmYSkpfX1lbHNlIG4rPVN0cmluZy5mcm9tQ2hhckNvZGUoYSl9cmV0dXJuIG59LGZlPShlLHQpPT4oZT4+Pj0wKT9sZShuKCksZSx0KToiIjtmdW5jdGlvbiBkZShlKXtpZihiKXJldHVybiBxZSgxLDEsZSk7RD1lLHEoKXx8KGdlLmhiKCksYy5vbkV4aXQmJmMub25FeGl0KGUpLEg9ITApLGgoZSxuZXcgb2UoZSkpfXZhciBwZT1lPT57aWYoRD1lLGIpdGhyb3cgbWUoZSksInVud2luZCI7ZGUoZSl9LGdlPXtMYTpbXSxJYTpbXSxUYTpbXSxGYTp7fSxQYTpmdW5jdGlvbigpe2I/Z2UuYWIoKTpnZS4kYSgpfSwkYTpmdW5jdGlvbigpe0cudW5zaGlmdCgoKCk9PntRKCksZ2UuYmIoKCgpPT5lZSgpKSl9KSl9LGFiOmZ1bmN0aW9uKCl7Z2UucmVjZWl2ZU9iamVjdFRyYW5zZmVyPWdlLmViLGdlLnRocmVhZEluaXRUTFM9Z2UuU2EsZ2Uuc2V0RXhpdFN0YXR1cz1nZS5SYSxGPSExfSxSYTpmdW5jdGlvbihlKXtEPWV9LHJiOlsiJHRlcm1pbmF0ZVdvcmtlciJdLGhiOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIG9mIGdlLklhKWllKGUpO2ZvcihlIG9mIGdlLkxhKWllKGUpO2dlLkxhPVtdLGdlLklhPVtdLGdlLkZhPVtdfSxmYjpmdW5jdGlvbihlKXt2YXIgdD1lLkhhO2RlbGV0ZSBnZS5GYVt0XSxnZS5MYS5wdXNoKGUpLGdlLklhLnNwbGljZShnZS5JYS5pbmRleE9mKGUpLDEpLGUuSGE9MCx5dCh0KX0sZWI6ZnVuY3Rpb24oKXt9LFNhOmZ1bmN0aW9uKCl7Z2UuVGEuZm9yRWFjaCgoZT0+ZSgpKSl9LGNiOmU9Pm5ldyBQcm9taXNlKCh0PT57ZS5vbm1lc3NhZ2U9cj0+e3ZhciBuPShyPXIuZGF0YSkuY21kO2lmKHIudGFyZ2V0VGhyZWFkJiZyLnRhcmdldFRocmVhZCE9ZHQoKSl7dmFyIGE9Z2UuRmFbci5xYl07YT9hLnBvc3RNZXNzYWdlKHIsci50cmFuc2Zlckxpc3QpOlIoXCdJbnRlcm5hbCBlcnJvciEgV29ya2VyIHNlbnQgYSBtZXNzYWdlICJcJytuK1wnIiB0byB0YXJnZXQgcHRocmVhZCBcJytyLnRhcmdldFRocmVhZCsiLCBidXQgdGhhdCB0aHJlYWQgbm8gbG9uZ2VyIGV4aXN0cyEiKX1lbHNlImNoZWNrTWFpbGJveCI9PT1uP0hlKCk6InNwYXduVGhyZWFkIj09PW4/dWUocik6ImNsZWFudXBUaHJlYWQiPT09bj9zZShyLnRocmVhZCk6ImtpbGxUaHJlYWQiPT09bj8ocj1yLnRocmVhZCxuPWdlLkZhW3JdLGRlbGV0ZSBnZS5GYVtyXSxpZShuKSx5dChyKSxnZS5JYS5zcGxpY2UoZ2UuSWEuaW5kZXhPZihuKSwxKSxuLkhhPTApOiJjYW5jZWxUaHJlYWQiPT09bj9nZS5GYVtyLnRocmVhZF0ucG9zdE1lc3NhZ2Uoe2NtZDoiY2FuY2VsIn0pOiJsb2FkZWQiPT09bj8oZS5sb2FkZWQ9ITAsdChlKSk6ImFsZXJ0Ij09PW4/YWxlcnQoIlRocmVhZCAiK3IudGhyZWFkSWQrIjogIityLnRleHQpOiJzZXRpbW1lZGlhdGUiPT09ci50YXJnZXQ/ZS5wb3N0TWVzc2FnZShyKToiY2FsbEhhbmRsZXIiPT09bj9jW3IuaGFuZGxlcl0oLi4uci5hcmdzKTpuJiZSKCJ3b3JrZXIgc2VudCBhbiB1bmtub3duIGNvbW1hbmQgIituKX0sZS5vbmVycm9yPWU9Pnt0aHJvdyBSKCJ3b3JrZXIgc2VudCBhbiBlcnJvciEgIitlLmZpbGVuYW1lKyI6IitlLmxpbmVubysiOiAiK2UubWVzc2FnZSksZX0sdiYmKGUub24oIm1lc3NhZ2UiLChmdW5jdGlvbih0KXtlLm9ubWVzc2FnZSh7ZGF0YTp0fSl9KSksZS5vbigiZXJyb3IiLChmdW5jdGlvbih0KXtlLm9uZXJyb3IodCl9KSkpO3ZhciByLG49W107Zm9yKHIgb2ZbIm9uRXhpdCIsIm9uQWJvcnQiLCJwcmludCIsInByaW50RXJyIl0pYy5oYXNPd25Qcm9wZXJ0eShyKSYmbi5wdXNoKHIpO2UucG9zdE1lc3NhZ2Uoe2NtZDoibG9hZCIsaGFuZGxlcnM6bix1cmxPckJsb2I6Yy5tYWluU2NyaXB0VXJsT3JCbG9ifHxfc2NyaXB0RGlyLHdhc21NZW1vcnk6ayx3YXNtTW9kdWxlOlB9KX0pKSxiYjpmdW5jdGlvbihlKXtlKCl9LFhhOmZ1bmN0aW9uKCl7dmFyIGU9Xygib3J0LXdhc20tdGhyZWFkZWQud29ya2VyLmpzIik7ZT1uZXcgV29ya2VyKGUpLGdlLkxhLnB1c2goZSl9LFphOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PWdlLkxhLmxlbmd0aCYmKGdlLlhhKCksZ2UuY2IoZ2UuTGFbMF0pKSxnZS5MYS5wb3AoKX19O2MuUFRocmVhZD1nZTt2YXIgaGU9ZT0+e2Zvcig7MDxlLmxlbmd0aDspZS5zaGlmdCgpKGMpfTtmdW5jdGlvbiBtZShlKXtpZihiKXJldHVybiBxZSgyLDAsZSk7cGUoZSl9Yy5lc3RhYmxpc2hTdGFja1NwYWNlPWZ1bmN0aW9uKCl7dmFyIGU9ZHQoKSx0PWEoKVtlKzUyPj4yPj4+MF07ZT1hKClbZSs1Nj4+Mj4+PjBdLF90KHQsdC1lKSxTdCh0KX07dmFyIHllPVtdO2Z1bmN0aW9uIHZlKGUpe3RoaXMuT2E9ZS0yNCx0aGlzLldhPWZ1bmN0aW9uKGUpe28oKVt0aGlzLk9hKzQ+PjI+Pj4wXT1lfSx0aGlzLlZhPWZ1bmN0aW9uKGUpe28oKVt0aGlzLk9hKzg+PjI+Pj4wXT1lfSx0aGlzLlBhPWZ1bmN0aW9uKGUsdCl7dGhpcy5VYSgpLHRoaXMuV2EoZSksdGhpcy5WYSh0KX0sdGhpcy5VYT1mdW5jdGlvbigpe28oKVt0aGlzLk9hKzE2Pj4yPj4+MF09MH19ZnVuY3Rpb24gYmUoZSx0LHIsbil7cmV0dXJuIGI/cWUoMywxLGUsdCxyLG4pOndlKGUsdCxyLG4pfWZ1bmN0aW9uIHdlKGUsdCxyLG4pe2lmKGU+Pj49MCx0Pj4+PTAscj4+Pj0wLG4+Pj49MCwidW5kZWZpbmVkIj09dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyKXJldHVybiBSKCJDdXJyZW50IGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgU2hhcmVkQXJyYXlCdWZmZXIsIHB0aHJlYWRzIGFyZSBub3QgYXZhaWxhYmxlISIpLDY7dmFyIGE9W107cmV0dXJuIGImJjA9PT1hLmxlbmd0aD9iZShlLHQscixuKTooZT17Z2I6cixIYTplLFlhOm4sbWI6YX0sYj8oZS5vYj0ic3Bhd25UaHJlYWQiLHBvc3RNZXNzYWdlKGUsYSksMCk6dWUoZSkpfWZ1bmN0aW9uIF9lKGUsdCxyKXtyZXR1cm4gYj9xZSg0LDEsZSx0LHIpOjB9ZnVuY3Rpb24gT2UoZSx0KXtpZihiKXJldHVybiBxZSg1LDEsZSx0KX1jLmludm9rZUVudHJ5UG9pbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgcj15ZVtlXTtyfHwoZT49eWUubGVuZ3RoJiYoeWUubGVuZ3RoPWUrMSkseWVbZV09cj16LmdldChlKSksZT1yKHQpLHEoKT9nZS5SYShlKTp2dChlKX07dmFyIFNlPWU9Pntmb3IodmFyIHQ9MCxyPTA7cjxlLmxlbmd0aDsrK3Ipe3ZhciBuPWUuY2hhckNvZGVBdChyKTsxMjc+PW4/dCsrOjIwNDc+PW4/dCs9Mjo1NTI5Njw9biYmNTczNDM+PW4/KHQrPTQsKytyKTp0Kz0zfXJldHVybiB0fSxFZT0oZSx0LHIsbik9PntpZighKDA8bikpcmV0dXJuIDA7dmFyIGE9cj4+Pj0wO249cituLTE7Zm9yKHZhciBvPTA7bzxlLmxlbmd0aDsrK28pe3ZhciBpPWUuY2hhckNvZGVBdChvKTtpZig1NTI5Njw9aSYmNTczNDM+PWkmJihpPTY1NTM2KygoMTAyMyZpKTw8MTApfDEwMjMmZS5jaGFyQ29kZUF0KCsrbykpLDEyNz49aSl7aWYocj49bilicmVhazt0W3IrKz4+PjBdPWl9ZWxzZXtpZigyMDQ3Pj1pKXtpZihyKzE+PW4pYnJlYWs7dFtyKys+Pj4wXT0xOTJ8aT4+Nn1lbHNle2lmKDY1NTM1Pj1pKXtpZihyKzI+PW4pYnJlYWs7dFtyKys+Pj4wXT0yMjR8aT4+MTJ9ZWxzZXtpZihyKzM+PW4pYnJlYWs7dFtyKys+Pj4wXT0yNDB8aT4+MTgsdFtyKys+Pj4wXT0xMjh8aT4+MTImNjN9dFtyKys+Pj4wXT0xMjh8aT4+NiY2M310W3IrKz4+PjBdPTEyOHw2MyZpfX1yZXR1cm4gdFtyPj4+MF09MCxyLWF9LEFlPShlLHQscik9PkVlKGUsbigpLHQscik7ZnVuY3Rpb24gVGUoZSx0KXtpZihiKXJldHVybiBxZSg2LDEsZSx0KX1mdW5jdGlvbiBNZShlLHQscil7aWYoYilyZXR1cm4gcWUoNywxLGUsdCxyKX1mdW5jdGlvbiBSZShlLHQscil7cmV0dXJuIGI/cWUoOCwxLGUsdCxyKTowfWZ1bmN0aW9uIEZlKGUsdCl7aWYoYilyZXR1cm4gcWUoOSwxLGUsdCl9ZnVuY3Rpb24ga2UoZSx0LHIpe2lmKGIpcmV0dXJuIHFlKDEwLDEsZSx0LHIpfWZ1bmN0aW9uIENlKGUsdCxyLG4pe2lmKGIpcmV0dXJuIHFlKDExLDEsZSx0LHIsbil9ZnVuY3Rpb24gUGUoZSx0LHIsbil7aWYoYilyZXR1cm4gcWUoMTIsMSxlLHQscixuKX1mdW5jdGlvbiBEZShlLHQscixuKXtpZihiKXJldHVybiBxZSgxMywxLGUsdCxyLG4pfWZ1bmN0aW9uIHhlKGUpe2lmKGIpcmV0dXJuIHFlKDE0LDEsZSl9ZnVuY3Rpb24gSWUoZSx0KXtpZihiKXJldHVybiBxZSgxNSwxLGUsdCl9ZnVuY3Rpb24gVWUoZSx0LHIpe2lmKGIpcmV0dXJuIHFlKDE2LDEsZSx0LHIpfXZhciBMZT1lPT57aWYoIUgpdHJ5e2lmKGUoKSwhcSgpKXRyeXtiP3Z0KEQpOnBlKEQpfWNhdGNoKGUpe2UgaW5zdGFuY2VvZiBvZXx8InVud2luZCI9PWV8fGgoMSxlKX19Y2F0Y2goZSl7ZSBpbnN0YW5jZW9mIG9lfHwidW53aW5kIj09ZXx8aCgxLGUpfX07ZnVuY3Rpb24gV2UoZSl7ZT4+Pj0wLCJmdW5jdGlvbiI9PXR5cGVvZiBBdG9taWNzLm5iJiYoQXRvbWljcy5uYihhKCksZT4+MixlKS52YWx1ZS50aGVuKEhlKSxlKz0xMjgsQXRvbWljcy5zdG9yZShhKCksZT4+MiwxKSl9ZnVuY3Rpb24gSGUoKXt2YXIgZT1kdCgpO2UmJihXZShlKSxMZSgoKCk9PmJ0KCkpKSl9Yy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX21haWxib3hfYXdhaXQ9V2UsYy5jaGVja01haWxib3g9SGU7dmFyIFllPWU9PjA9PWUlNCYmKDAhPWUlMTAwfHwwPT1lJTQwMCksamU9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV0semU9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF07ZnVuY3Rpb24gR2UoZSx0LHIsbixhLG8saSxzKXtyZXR1cm4gYj9xZSgxNywxLGUsdCxyLG4sYSxvLGkscyk6LTUyfWZ1bmN0aW9uIE5lKGUsdCxyLG4sYSxvLGkpe2lmKGIpcmV0dXJuIHFlKDE4LDEsZSx0LHIsbixhLG8saSl9dmFyIEJlPWU9Pnt2YXIgdD1TZShlKSsxLHI9cHQodCk7cmV0dXJuIHImJkFlKGUscix0KSxyfSwkZT1lPT57dmFyIHQ9T3QoKTtyZXR1cm4gZT1lKCksU3QodCksZX07ZnVuY3Rpb24gcWUoZSx0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoLTIsbj1hcmd1bWVudHM7cmV0dXJuICRlKCgoKT0+e2Zvcih2YXIgYT1FdCg4KnIpLG89YT4+MyxzPTA7czxyO3MrKyl7dmFyIHU9blsyK3NdO2koKVtvK3M+Pj4wXT11fXJldHVybiBtdChlLHIsYSx0KX0pKX12YXIgVmUsSmU9W10sWGU9e30sS2U9KCk9PntpZighVmUpe3ZhciBlLHQ9e1VTRVI6IndlYl91c2VyIixMT0dOQU1FOiJ3ZWJfdXNlciIsUEFUSDoiLyIsUFdEOiIvIixIT01FOiIvaG9tZS93ZWJfdXNlciIsTEFORzooIm9iamVjdCI9PXR5cGVvZiBuYXZpZ2F0b3ImJm5hdmlnYXRvci5sYW5ndWFnZXMmJm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fCJDIikucmVwbGFjZSgiLSIsIl8iKSsiLlVURi04IixfOmd8fCIuL3RoaXMucHJvZ3JhbSJ9O2ZvcihlIGluIFhlKXZvaWQgMD09PVhlW2VdP2RlbGV0ZSB0W2VdOnRbZV09WGVbZV07dmFyIHI9W107Zm9yKGUgaW4gdClyLnB1c2goYCR7ZX09JHt0W2VdfWApO1ZlPXJ9cmV0dXJuIFZlfTtmdW5jdGlvbiBaZShlLHIpe2lmKGIpcmV0dXJuIHFlKDE5LDEsZSxyKTtlPj4+PTAscj4+Pj0wO3ZhciBuPTA7cmV0dXJuIEtlKCkuZm9yRWFjaCgoZnVuY3Rpb24oYSxpKXt2YXIgcz1yK247Zm9yKGk9bygpW2UrNCppPj4yPj4+MF09cyxzPTA7czxhLmxlbmd0aDsrK3MpdCgpW2krKz4+MD4+PjBdPWEuY2hhckNvZGVBdChzKTt0KClbaT4+MD4+PjBdPTAsbis9YS5sZW5ndGgrMX0pKSwwfWZ1bmN0aW9uIFFlKGUsdCl7aWYoYilyZXR1cm4gcWUoMjAsMSxlLHQpO2U+Pj49MCx0Pj4+PTA7dmFyIHI9S2UoKTtvKClbZT4+Mj4+PjBdPXIubGVuZ3RoO3ZhciBuPTA7cmV0dXJuIHIuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bis9ZS5sZW5ndGgrMX0pKSxvKClbdD4+Mj4+PjBdPW4sMH1mdW5jdGlvbiBldChlKXtyZXR1cm4gYj9xZSgyMSwxLGUpOjUyfWZ1bmN0aW9uIHR0KGUsdCxyLG4pe3JldHVybiBiP3FlKDIyLDEsZSx0LHIsbik6NTJ9ZnVuY3Rpb24gcnQoZSx0LHIsbixhKXtyZXR1cm4gYj9xZSgyMywxLGUsdCxyLG4sYSk6NzB9dmFyIG50PVtudWxsLFtdLFtdXTtmdW5jdGlvbiBhdChlLHQscixhKXtpZihiKXJldHVybiBxZSgyNCwxLGUsdCxyLGEpO3Q+Pj49MCxyPj4+PTAsYT4+Pj0wO2Zvcih2YXIgaT0wLHM9MDtzPHI7cysrKXt2YXIgdT1vKClbdD4+Mj4+PjBdLGM9bygpW3QrND4+Mj4+PjBdO3QrPTg7Zm9yKHZhciBsPTA7bDxjO2wrKyl7dmFyIGY9bigpW3UrbD4+PjBdLGQ9bnRbZV07MD09PWZ8fDEwPT09Zj8oKDE9PT1lP006UikobGUoZCwwKSksZC5sZW5ndGg9MCk6ZC5wdXNoKGYpfWkrPWN9cmV0dXJuIG8oKVthPj4yPj4+MF09aSwwfXZhciBvdD1lPT4ob3Q9KCgpPT57aWYoIm9iamVjdCI9PXR5cGVvZiBjcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXJldHVybiBlPT4oZS5zZXQoY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShlLmJ5dGVMZW5ndGgpKSksZSk7aWYodil0cnl7dmFyIGU9cig3NjApO2lmKGUucmFuZG9tRmlsbFN5bmMpcmV0dXJuIHQ9PmUucmFuZG9tRmlsbFN5bmModCk7dmFyIHQ9ZS5yYW5kb21CeXRlcztyZXR1cm4gZT0+KGUuc2V0KHQoZS5ieXRlTGVuZ3RoKSksZSl9Y2F0Y2goZSl7fXRlKCJpbml0UmFuZG9tRGV2aWNlIil9KSgpKShlKSxpdD1bMzEsMjksMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLHN0PVszMSwyOCwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMV0sdXQ9KGUscik9Pnt0KCkuc2V0KGUscj4+PjApfTtmdW5jdGlvbiBjdChlLHQscixuKXtmdW5jdGlvbiBvKGUsdCxyKXtmb3IoZT0ibnVtYmVyIj09dHlwZW9mIGU/ZS50b1N0cmluZygpOmV8fCIiO2UubGVuZ3RoPHQ7KWU9clswXStlO3JldHVybiBlfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gbyhlLHQsIjAiKX1mdW5jdGlvbiBzKGUsdCl7ZnVuY3Rpb24gcihlKXtyZXR1cm4gMD5lPy0xOjA8ZT8xOjB9dmFyIG47cmV0dXJuIDA9PT0obj1yKGUuZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpKSYmMD09PShuPXIoZS5nZXRNb250aCgpLXQuZ2V0TW9udGgoKSkpJiYobj1yKGUuZ2V0RGF0ZSgpLXQuZ2V0RGF0ZSgpKSksbn1mdW5jdGlvbiB1KGUpe3N3aXRjaChlLmdldERheSgpKXtjYXNlIDA6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDI5KTtjYXNlIDE6cmV0dXJuIGU7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwzKTtjYXNlIDM6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDIpO2Nhc2UgNDpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCktMSwxMSwzMSk7Y2FzZSA2OnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCktMSwxMSwzMCl9fWZ1bmN0aW9uIGMoZSl7dmFyIHQ9ZS5KYTtmb3IoZT1uZXcgRGF0ZShuZXcgRGF0ZShlLkthKzE5MDAsMCwxKS5nZXRUaW1lKCkpOzA8dDspe3ZhciByPWUuZ2V0TW9udGgoKSxuPShZZShlLmdldEZ1bGxZZWFyKCkpP2l0OnN0KVtyXTtpZighKHQ+bi1lLmdldERhdGUoKSkpe2Uuc2V0RGF0ZShlLmdldERhdGUoKSt0KTticmVha310LT1uLWUuZ2V0RGF0ZSgpKzEsZS5zZXREYXRlKDEpLDExPnI/ZS5zZXRNb250aChyKzEpOihlLnNldE1vbnRoKDApLGUuc2V0RnVsbFllYXIoZS5nZXRGdWxsWWVhcigpKzEpKX1yZXR1cm4gcj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCkrMSwwLDQpLHQ9dShuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCw0KSkscj11KHIpLDA+PXModCxlKT8wPj1zKHIsZSk/ZS5nZXRGdWxsWWVhcigpKzE6ZS5nZXRGdWxsWWVhcigpOmUuZ2V0RnVsbFllYXIoKS0xfWU+Pj49MCx0Pj4+PTAscj4+Pj0wLG4+Pj49MDt2YXIgbD1hKClbbis0MD4+Mj4+PjBdO2Zvcih2YXIgZiBpbiBuPXtrYjphKClbbj4+Mj4+PjBdLGpiOmEoKVtuKzQ+PjI+Pj4wXSxNYTphKClbbis4Pj4yPj4+MF0sUWE6YSgpW24rMTI+PjI+Pj4wXSxOYTphKClbbisxNj4+Mj4+PjBdLEthOmEoKVtuKzIwPj4yPj4+MF0sR2E6YSgpW24rMjQ+PjI+Pj4wXSxKYTphKClbbisyOD4+Mj4+PjBdLHNiOmEoKVtuKzMyPj4yPj4+MF0saWI6YSgpW24rMzY+PjI+Pj4wXSxsYjpsP2ZlKGwpOiIifSxyPWZlKHIpLGw9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9KXI9ci5yZXBsYWNlKG5ldyBSZWdFeHAoZiwiZyIpLGxbZl0pO3ZhciBkPSJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheSIuc3BsaXQoIiAiKSxwPSJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyIi5zcGxpdCgiICIpO2ZvcihmIGluIGw9eyIlYSI6ZT0+ZFtlLkdhXS5zdWJzdHJpbmcoMCwzKSwiJUEiOmU9PmRbZS5HYV0sIiViIjplPT5wW2UuTmFdLnN1YnN0cmluZygwLDMpLCIlQiI6ZT0+cFtlLk5hXSwiJUMiOmU9PmkoKGUuS2ErMTkwMCkvMTAwfDAsMiksIiVkIjplPT5pKGUuUWEsMiksIiVlIjplPT5vKGUuUWEsMiwiICIpLCIlZyI6ZT0+YyhlKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJUciOmU9PmMoZSksIiVIIjplPT5pKGUuTWEsMiksIiVJIjplPT4oMD09KGU9ZS5NYSk/ZT0xMjoxMjxlJiYoZS09MTIpLGkoZSwyKSksIiVqIjplPT57Zm9yKHZhciB0PTAscj0wO3I8PWUuTmEtMTt0Kz0oWWUoZS5LYSsxOTAwKT9pdDpzdClbcisrXSk7cmV0dXJuIGkoZS5RYSt0LDMpfSwiJW0iOmU9PmkoZS5OYSsxLDIpLCIlTSI6ZT0+aShlLmpiLDIpLCIlbiI6KCk9PiJcXG4iLCIlcCI6ZT0+MDw9ZS5NYSYmMTI+ZS5NYT8iQU0iOiJQTSIsIiVTIjplPT5pKGUua2IsMiksIiV0IjooKT0+IlxcdCIsIiV1IjplPT5lLkdhfHw3LCIlVSI6ZT0+aShNYXRoLmZsb29yKChlLkphKzctZS5HYSkvNyksMiksIiVWIjplPT57dmFyIHQ9TWF0aC5mbG9vcigoZS5KYSs3LShlLkdhKzYpJTcpLzcpO2lmKDI+PShlLkdhKzM3MS1lLkphLTIpJTcmJnQrKyx0KTUzPT10JiYoND09KHI9KGUuR2ErMzcxLWUuSmEpJTcpfHwzPT1yJiZZZShlLkthKXx8KHQ9MSkpO2Vsc2V7dD01Mjt2YXIgcj0oZS5HYSs3LWUuSmEtMSklNzsoND09cnx8NT09ciYmWWUoZS5LYSU0MDAtMSkpJiZ0Kyt9cmV0dXJuIGkodCwyKX0sIiV3IjplPT5lLkdhLCIlVyI6ZT0+aShNYXRoLmZsb29yKChlLkphKzctKGUuR2ErNiklNykvNyksMiksIiV5IjplPT4oZS5LYSsxOTAwKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJVkiOmU9PmUuS2ErMTkwMCwiJXoiOmU9Pnt2YXIgdD0wPD0oZT1lLmliKTtyZXR1cm4gZT1NYXRoLmFicyhlKS82MCwodD8iKyI6Ii0iKStTdHJpbmcoIjAwMDAiKyhlLzYwKjEwMCtlJTYwKSkuc2xpY2UoLTQpfSwiJVoiOmU9PmUubGIsIiUlIjooKT0+IiUifSxyPXIucmVwbGFjZSgvJSUvZywiXFwwXFwwIiksbClyLmluY2x1ZGVzKGYpJiYocj1yLnJlcGxhY2UobmV3IFJlZ0V4cChmLCJnIiksbFtmXShuKSkpO3JldHVybiBmPWZ1bmN0aW9uKGUpe3ZhciB0PUFycmF5KFNlKGUpKzEpO3JldHVybiBFZShlLHQsMCx0Lmxlbmd0aCksdH0ocj1yLnJlcGxhY2UoL1xcMFxcMC9nLCIlIikpLGYubGVuZ3RoPnQ/MDoodXQoZixlKSxmLmxlbmd0aC0xKX1nZS5QYSgpO3ZhciBsdD1bbnVsbCxkZSxtZSxiZSxfZSxPZSxUZSxNZSxSZSxGZSxrZSxDZSxQZSxEZSx4ZSxJZSxVZSxHZSxOZSxaZSxRZSxldCx0dCxydCxhdF0sZnQ9e2I6ZnVuY3Rpb24oZSx0LHIpe3Rocm93IG5ldyB2ZShlPj4+PTApLlBhKHQ+Pj4wLHI+Pj4wKSxlfSxOOmZ1bmN0aW9uKGUpe2d0KGU+Pj4wLCF5LDEsIW0sMTMxMDcyLCExKSxnZS5TYSgpfSxrOmZ1bmN0aW9uKGUpe2U+Pj49MCxiP3Bvc3RNZXNzYWdlKHtjbWQ6ImNsZWFudXBUaHJlYWQiLHRocmVhZDplfSk6c2UoZSl9LEk6d2UsaDpfZSxUOk9lLEU6VGUsRzpNZSxVOlJlLFI6RmUsSjprZSxROkNlLG86UGUsRjpEZSxDOnhlLFM6SWUsRDpVZSxxOigpPT4hMCxBOmZ1bmN0aW9uKGUsdCl7KGU+Pj49MCk9PXQ+Pj4wP3NldFRpbWVvdXQoKCgpPT5IZSgpKSk6Yj9wb3N0TWVzc2FnZSh7dGFyZ2V0VGhyZWFkOmUsY21kOiJjaGVja01haWxib3gifSk6KGU9Z2UuRmFbZV0pJiZlLnBvc3RNZXNzYWdlKHtjbWQ6ImNoZWNrTWFpbGJveCJ9KX0sTDpmdW5jdGlvbigpe3JldHVybi0xfSxNOldlLHA6ZnVuY3Rpb24oZSl7diYmZ2UuRmFbZT4+PjBdLnJlZigpfSx0OmZ1bmN0aW9uKGUsdCxyKXtlPXQrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKSs0Mjk0OTY3Mjk2KnQ6TmFOLHI+Pj49MCxlPW5ldyBEYXRlKDFlMyplKSxhKClbcj4+Mj4+PjBdPWUuZ2V0VVRDU2Vjb25kcygpLGEoKVtyKzQ+PjI+Pj4wXT1lLmdldFVUQ01pbnV0ZXMoKSxhKClbcis4Pj4yPj4+MF09ZS5nZXRVVENIb3VycygpLGEoKVtyKzEyPj4yPj4+MF09ZS5nZXRVVENEYXRlKCksYSgpW3IrMTY+PjI+Pj4wXT1lLmdldFVUQ01vbnRoKCksYSgpW3IrMjA+PjI+Pj4wXT1lLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCxhKClbcisyND4+Mj4+PjBdPWUuZ2V0VVRDRGF5KCksZT0oZS5nZXRUaW1lKCktRGF0ZS5VVEMoZS5nZXRVVENGdWxsWWVhcigpLDAsMSwwLDAsMCwwKSkvODY0ZTV8MCxhKClbcisyOD4+Mj4+PjBdPWV9LHU6ZnVuY3Rpb24oZSx0LHIpe2U9dCsyMDk3MTUyPj4+MDw0MTk0MzA1LSEhZT8oZT4+PjApKzQyOTQ5NjcyOTYqdDpOYU4scj4+Pj0wLGU9bmV3IERhdGUoMWUzKmUpLGEoKVtyPj4yPj4+MF09ZS5nZXRTZWNvbmRzKCksYSgpW3IrND4+Mj4+PjBdPWUuZ2V0TWludXRlcygpLGEoKVtyKzg+PjI+Pj4wXT1lLmdldEhvdXJzKCksYSgpW3IrMTI+PjI+Pj4wXT1lLmdldERhdGUoKSxhKClbcisxNj4+Mj4+PjBdPWUuZ2V0TW9udGgoKSxhKClbcisyMD4+Mj4+PjBdPWUuZ2V0RnVsbFllYXIoKS0xOTAwLGEoKVtyKzI0Pj4yPj4+MF09ZS5nZXREYXkoKSx0PShZZShlLmdldEZ1bGxZZWFyKCkpP2plOnplKVtlLmdldE1vbnRoKCldK2UuZ2V0RGF0ZSgpLTF8MCxhKClbcisyOD4+Mj4+PjBdPXQsYSgpW3IrMzY+PjI+Pj4wXT0tNjAqZS5nZXRUaW1lem9uZU9mZnNldCgpLHQ9bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgbj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpO2U9MHwodCE9biYmZS5nZXRUaW1lem9uZU9mZnNldCgpPT1NYXRoLm1pbihuLHQpKSxhKClbciszMj4+Mj4+PjBdPWV9LHY6ZnVuY3Rpb24oZSl7ZT4+Pj0wO3ZhciB0PW5ldyBEYXRlKGEoKVtlKzIwPj4yPj4+MF0rMTkwMCxhKClbZSsxNj4+Mj4+PjBdLGEoKVtlKzEyPj4yPj4+MF0sYSgpW2UrOD4+Mj4+PjBdLGEoKVtlKzQ+PjI+Pj4wXSxhKClbZT4+Mj4+PjBdLDApLHI9YSgpW2UrMzI+PjI+Pj4wXSxuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSxvPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCksaT1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpLHM9TWF0aC5taW4oaSxvKTtyZXR1cm4gMD5yP2EoKVtlKzMyPj4yPj4+MF09TnVtYmVyKG8hPWkmJnM9PW4pOjA8ciE9KHM9PW4pJiYobz1NYXRoLm1heChpLG8pLHQuc2V0VGltZSh0LmdldFRpbWUoKSs2ZTQqKCgwPHI/czpvKS1uKSkpLGEoKVtlKzI0Pj4yPj4+MF09dC5nZXREYXkoKSxyPShZZSh0LmdldEZ1bGxZZWFyKCkpP2plOnplKVt0LmdldE1vbnRoKCldK3QuZ2V0RGF0ZSgpLTF8MCxhKClbZSsyOD4+Mj4+PjBdPXIsYSgpW2U+PjI+Pj4wXT10LmdldFNlY29uZHMoKSxhKClbZSs0Pj4yPj4+MF09dC5nZXRNaW51dGVzKCksYSgpW2UrOD4+Mj4+PjBdPXQuZ2V0SG91cnMoKSxhKClbZSsxMj4+Mj4+PjBdPXQuZ2V0RGF0ZSgpLGEoKVtlKzE2Pj4yPj4+MF09dC5nZXRNb250aCgpLGEoKVtlKzIwPj4yPj4+MF09dC5nZXRZZWFyKCksZT10LmdldFRpbWUoKS8xZTMsd3QoKEo9ZSwxPD0rTWF0aC5hYnMoSik/MDxKPytNYXRoLmZsb29yKEovNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoSi0rKH5+Sj4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCkpLGU+Pj4wfSxyOkdlLHM6TmUsejpmdW5jdGlvbihlLHQscil7ZnVuY3Rpb24gbihlKXtyZXR1cm4oZT1lLnRvVGltZVN0cmluZygpLm1hdGNoKC9cXCgoW0EtWmEteiBdKylcXCkkLykpP2VbMV06IkdNVCJ9ZT4+Pj0wLHQ+Pj49MCxyPj4+PTA7dmFyIGk9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLHM9bmV3IERhdGUoaSwwLDEpLHU9bmV3IERhdGUoaSw2LDEpO2k9cy5nZXRUaW1lem9uZU9mZnNldCgpO3ZhciBjPXUuZ2V0VGltZXpvbmVPZmZzZXQoKSxsPU1hdGgubWF4KGksYyk7bygpW2U+PjI+Pj4wXT02MCpsLGEoKVt0Pj4yPj4+MF09TnVtYmVyKGkhPWMpLGU9bihzKSx0PW4odSksZT1CZShlKSx0PUJlKHQpLGM8aT8obygpW3I+PjI+Pj4wXT1lLG8oKVtyKzQ+PjI+Pj4wXT10KToobygpW3I+PjI+Pj4wXT10LG8oKVtyKzQ+PjI+Pj4wXT1lKX0sYzooKT0+e3RlKCIiKX0sbDpmdW5jdGlvbigpe30saTpmdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdygpfSxWOigpPT57dGhyb3cgJCs9MSwidW53aW5kIn0sQjpmdW5jdGlvbigpe3JldHVybiA0Mjk0OTAxNzYwfSxlOigpPT5wZXJmb3JtYW5jZS50aW1lT3JpZ2luK3BlcmZvcm1hbmNlLm5vdygpLGY6ZnVuY3Rpb24oKXtyZXR1cm4gdj9yKDk5MykuY3B1cygpLmxlbmd0aDpuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeX0sSzpmdW5jdGlvbihlLHQscixuKXtmb3IoZ2UucGI9dD4+PjAsSmUubGVuZ3RoPXIsdD1uPj4+MD4+MyxuPTA7bjxyO24rKylKZVtuXT1pKClbdCtuPj4+MF07cmV0dXJuIGx0W2VdLmFwcGx5KG51bGwsSmUpfSx5OmZ1bmN0aW9uKGUpe2U+Pj49MDt2YXIgdD1uKCkubGVuZ3RoO2lmKGU8PXR8fDQyOTQ5MDE3NjA8ZSlyZXR1cm4hMTtmb3IodmFyIHI9MTs0Pj1yO3IqPTIpe3ZhciBhPXQqKDErLjIvcik7YT1NYXRoLm1pbihhLGUrMTAwNjYzMjk2KTt2YXIgbz1NYXRoO2E9TWF0aC5tYXgoZSxhKTtlOntvPW8ubWluLmNhbGwobyw0Mjk0OTAxNzYwLGErKDY1NTM2LWElNjU1MzYpJTY1NTM2KS1rLmJ1ZmZlci5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTY7dHJ5e2suZ3JvdyhvKSxZKCk7dmFyIGk9MTticmVhayBlfWNhdGNoKGUpe31pPXZvaWQgMH1pZihpKXJldHVybiEwfXJldHVybiExfSxPOlplLFA6UWUsajpwZSxnOmV0LG46dHQsdzpydCxtOmF0LHg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT4+Pj0wLHQ+Pj49MCxvdChuKCkuc3ViYXJyYXkoZT4+PjAsZSt0Pj4+MCkpLDB9LGE6a3x8Yy53YXNtTWVtb3J5LEg6Y3QsZDpmdW5jdGlvbihlLHQscixuKXtyZXR1cm4gY3QoZT4+PjAsdD4+PjAscj4+PjAsbj4+PjApfX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3JldHVybiBlPWUuZXhwb3J0cyxDPWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZT0+KCk9PmUoKT4+PjAscj1lPT50PT5lKHQpPj4+MDtyZXR1cm4oZT1PYmplY3QuYXNzaWduKHt9LGUpKS5fX2Vycm5vX2xvY2F0aW9uPXQoZS5fX2Vycm5vX2xvY2F0aW9uKSxlLnB0aHJlYWRfc2VsZj10KGUucHRocmVhZF9zZWxmKSxlLm1hbGxvYz1yKGUubWFsbG9jKSxlLnN0YWNrU2F2ZT10KGUuc3RhY2tTYXZlKSxlLnN0YWNrQWxsb2M9cihlLnN0YWNrQWxsb2MpLGV9KGUpLGdlLlRhLnB1c2goQy5zYSksej1DLnRhLE4udW5zaGlmdChDLlcpLFA9dCxlZSgpLGV9dmFyIHQ9e2E6ZnR9O2lmKFEoKSxjLmluc3RhbnRpYXRlV2FzbSl0cnl7cmV0dXJuIGMuaW5zdGFudGlhdGVXYXNtKHQsZSl9Y2F0Y2goZSl7UigiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIitlKSx1KGUpfShmdW5jdGlvbihlLHQpe3ZhciByPVY7cmV0dXJuIFR8fCJmdW5jdGlvbiIhPXR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZ3x8cmUocil8fHIuc3RhcnRzV2l0aCgiZmlsZTovLyIpfHx2fHwiZnVuY3Rpb24iIT10eXBlb2YgZmV0Y2g/YWUocixlLHQpOmZldGNoKHIse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKChuPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhuLGUpLnRoZW4odCwoZnVuY3Rpb24obil7cmV0dXJuIFIoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK24pLFIoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksYWUocixlLHQpfSkpKSl9KSh0LChmdW5jdGlvbih0KXtlKHQuaW5zdGFuY2UsdC5tb2R1bGUpfSkpLmNhdGNoKHUpfSgpLGMuX09ydEluaXQ9KGUsdCk9PihjLl9PcnRJbml0PUMuWCkoZSx0KSxjLl9PcnRHZXRMYXN0RXJyb3I9KGUsdCk9PihjLl9PcnRHZXRMYXN0RXJyb3I9Qy5ZKShlLHQpLGMuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zPShlLHQscixuLGEsbyxpLHMsdSxsKT0+KGMuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zPUMuWikoZSx0LHIsbixhLG8saSxzLHUsbCksYy5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXI9KGUsdCk9PihjLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj1DLl8pKGUsdCksYy5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PShlLHQscik9PihjLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9Qy4kKShlLHQsciksYy5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zPWU9PihjLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnM9Qy5hYSkoZSksYy5fT3J0Q3JlYXRlU2Vzc2lvbj0oZSx0LHIpPT4oYy5fT3J0Q3JlYXRlU2Vzc2lvbj1DLmJhKShlLHQsciksYy5fT3J0UmVsZWFzZVNlc3Npb249ZT0+KGMuX09ydFJlbGVhc2VTZXNzaW9uPUMuY2EpKGUpLGMuX09ydEdldElucHV0T3V0cHV0Q291bnQ9KGUsdCxyKT0+KGMuX09ydEdldElucHV0T3V0cHV0Q291bnQ9Qy5kYSkoZSx0LHIpLGMuX09ydEdldElucHV0TmFtZT0oZSx0KT0+KGMuX09ydEdldElucHV0TmFtZT1DLmVhKShlLHQpLGMuX09ydEdldE91dHB1dE5hbWU9KGUsdCk9PihjLl9PcnRHZXRPdXRwdXROYW1lPUMuZmEpKGUsdCksYy5fT3J0RnJlZT1lPT4oYy5fT3J0RnJlZT1DLmdhKShlKSxjLl9PcnRDcmVhdGVUZW5zb3I9KGUsdCxyLG4sYSk9PihjLl9PcnRDcmVhdGVUZW5zb3I9Qy5oYSkoZSx0LHIsbixhKSxjLl9PcnRHZXRUZW5zb3JEYXRhPShlLHQscixuLGEpPT4oYy5fT3J0R2V0VGVuc29yRGF0YT1DLmlhKShlLHQscixuLGEpLGMuX09ydFJlbGVhc2VUZW5zb3I9ZT0+KGMuX09ydFJlbGVhc2VUZW5zb3I9Qy5qYSkoZSksYy5fT3J0Q3JlYXRlUnVuT3B0aW9ucz0oZSx0LHIsbik9PihjLl9PcnRDcmVhdGVSdW5PcHRpb25zPUMua2EpKGUsdCxyLG4pLGMuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PShlLHQscik9PihjLl9PcnRBZGRSdW5Db25maWdFbnRyeT1DLmxhKShlLHQsciksYy5fT3J0UmVsZWFzZVJ1bk9wdGlvbnM9ZT0+KGMuX09ydFJlbGVhc2VSdW5PcHRpb25zPUMubWEpKGUpLGMuX09ydFJ1bj0oZSx0LHIsbixhLG8saSxzKT0+KGMuX09ydFJ1bj1DLm5hKShlLHQscixuLGEsbyxpLHMpLGMuX09ydEVuZFByb2ZpbGluZz1lPT4oYy5fT3J0RW5kUHJvZmlsaW5nPUMub2EpKGUpO3ZhciBkdD1jLl9wdGhyZWFkX3NlbGY9KCk9PihkdD1jLl9wdGhyZWFkX3NlbGY9Qy5wYSkoKSxwdD1jLl9tYWxsb2M9ZT0+KHB0PWMuX21hbGxvYz1DLnFhKShlKTtjLl9mcmVlPWU9PihjLl9mcmVlPUMucmEpKGUpLGMuX19lbXNjcmlwdGVuX3Rsc19pbml0PSgpPT4oYy5fX2Vtc2NyaXB0ZW5fdGxzX2luaXQ9Qy5zYSkoKTt2YXIgZ3Q9Yy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQ9KGUsdCxyLG4sYSxvKT0+KGd0PWMuX19lbXNjcmlwdGVuX3RocmVhZF9pbml0PUMudWEpKGUsdCxyLG4sYSxvKTtjLl9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZD0oKT0+KGMuX19lbXNjcmlwdGVuX3RocmVhZF9jcmFzaGVkPUMudmEpKCk7dmFyIGh0LG10PShlLHQscixuKT0+KG10PUMud2EpKGUsdCxyLG4pLHl0PWU9Pih5dD1DLnhhKShlKSx2dD1jLl9fZW1zY3JpcHRlbl90aHJlYWRfZXhpdD1lPT4odnQ9Yy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2V4aXQ9Qy55YSkoZSksYnQ9Yy5fX2Vtc2NyaXB0ZW5fY2hlY2tfbWFpbGJveD0oKT0+KGJ0PWMuX19lbXNjcmlwdGVuX2NoZWNrX21haWxib3g9Qy56YSkoKSx3dD1lPT4od3Q9Qy5BYSkoZSksX3Q9KGUsdCk9PihfdD1DLkJhKShlLHQpLE90PSgpPT4oT3Q9Qy5DYSkoKSxTdD1lPT4oU3Q9Qy5EYSkoZSksRXQ9ZT0+KEV0PUMuRWEpKGUpO2Z1bmN0aW9uIEF0KCl7ZnVuY3Rpb24gZSgpe2lmKCFodCYmKGh0PSEwLGMuY2FsbGVkUnVuPSEwLCFIKSYmKGJ8fGhlKE4pLHMoYyksYy5vblJ1bnRpbWVJbml0aWFsaXplZCYmYy5vblJ1bnRpbWVJbml0aWFsaXplZCgpLCFiKSl7aWYoYy5wb3N0UnVuKWZvcigiZnVuY3Rpb24iPT10eXBlb2YgYy5wb3N0UnVuJiYoYy5wb3N0UnVuPVtjLnBvc3RSdW5dKTtjLnBvc3RSdW4ubGVuZ3RoOyl7dmFyIGU9Yy5wb3N0UnVuLnNoaWZ0KCk7Qi51bnNoaWZ0KGUpfWhlKEIpfX1pZighKDA8WCkpaWYoYilzKGMpLGJ8fGhlKE4pLHN0YXJ0V29ya2VyKGMpO2Vsc2V7aWYoYy5wcmVSdW4pZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBjLnByZVJ1biYmKGMucHJlUnVuPVtjLnByZVJ1bl0pO2MucHJlUnVuLmxlbmd0aDspRy51bnNoaWZ0KGMucHJlUnVuLnNoaWZ0KCkpO2hlKEcpLDA8WHx8KGMuc2V0U3RhdHVzPyhjLnNldFN0YXR1cygiUnVubmluZy4uLiIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtjLnNldFN0YXR1cygiIil9KSwxKSxlKCl9KSwxKSk6ZSgpKX19aWYoYy5rZWVwUnVudGltZUFsaXZlPXEsYy53YXNtTWVtb3J5PWssYy5zdGFja0FsbG9jPUV0LGMuc3RhY2tTYXZlPU90LGMuc3RhY2tSZXN0b3JlPVN0LGMuVVRGOFRvU3RyaW5nPWZlLGMuc3RyaW5nVG9VVEY4PUFlLGMubGVuZ3RoQnl0ZXNVVEY4PVNlLGMuRXhpdFN0YXR1cz1vZSxjLlBUaHJlYWQ9Z2UsWj1mdW5jdGlvbiBlKCl7aHR8fEF0KCksaHR8fChaPWUpfSxjLnByZUluaXQpZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBjLnByZUluaXQmJihjLnByZUluaXQ9W2MucHJlSW5pdF0pOzA8Yy5wcmVJbml0Lmxlbmd0aDspYy5wcmVJbml0LnBvcCgpKCk7cmV0dXJuIEF0KCksZS5yZWFkeX0pO2UuZXhwb3J0cz1ufSw5MzI6KGUsdCxyKT0+e3ZhciBfc2NyaXB0RGlyLG49KF9zY3JpcHREaXI9InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdD9kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYzp2b2lkIDAsInVuZGVmaW5lZCIhPXR5cGVvZiBfX2ZpbGVuYW1lJiYoX3NjcmlwdERpcj1fc2NyaXB0RGlyfHxfX2ZpbGVuYW1lKSxmdW5jdGlvbihlPXt9KXt2YXIgdCxuLGE9ZTthLnJlYWR5PW5ldyBQcm9taXNlKCgoZSxyKT0+e3Q9ZSxuPXJ9KSk7dmFyIG8saSxzLHU9T2JqZWN0LmFzc2lnbih7fSxhKSxjPSIuL3RoaXMucHJvZ3JhbSIsbD0oZSx0KT0+e3Rocm93IHR9LGY9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3csZD0iZnVuY3Rpb24iPT10eXBlb2YgaW1wb3J0U2NyaXB0cyxwPSJvYmplY3QiPT10eXBlb2YgcHJvY2VzcyYmIm9iamVjdCI9PXR5cGVvZiBwcm9jZXNzLnZlcnNpb25zJiYic3RyaW5nIj09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSxnPSIiO2lmKHApe3ZhciBoPXIoMzg0KSxtPXIoOTA4KTtnPWQ/bS5kaXJuYW1lKGcpKyIvIjpfX2Rpcm5hbWUrIi8iLG89KGUsdCk9PihlPWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpP25ldyBVUkwoZSk6bS5ub3JtYWxpemUoZSksaC5yZWFkRmlsZVN5bmMoZSx0P3ZvaWQgMDoidXRmOCIpKSxzPWU9PigoZT1vKGUsITApKS5idWZmZXJ8fChlPW5ldyBVaW50OEFycmF5KGUpKSxlKSxpPShlLHQscixuPSEwKT0+e2U9ZS5zdGFydHNXaXRoKCJmaWxlOi8vIik/bmV3IFVSTChlKTptLm5vcm1hbGl6ZShlKSxoLnJlYWRGaWxlKGUsbj92b2lkIDA6InV0ZjgiLCgoZSxhKT0+e2U/cihlKTp0KG4/YS5idWZmZXI6YSl9KSl9LCFhLnRoaXNQcm9ncmFtJiYxPHByb2Nlc3MuYXJndi5sZW5ndGgmJihjPXByb2Nlc3MuYXJndlsxXS5yZXBsYWNlKC9cXFxcL2csIi8iKSkscHJvY2Vzcy5hcmd2LnNsaWNlKDIpLGw9KGUsdCk9Pnt0aHJvdyBwcm9jZXNzLmV4aXRDb2RlPWUsdH0sYS5pbnNwZWN0PSgpPT4iW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0ifWVsc2UoZnx8ZCkmJihkP2c9c2VsZi5sb2NhdGlvbi5ocmVmOiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQmJihnPWRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjKSxfc2NyaXB0RGlyJiYoZz1fc2NyaXB0RGlyKSxnPTAhPT1nLmluZGV4T2YoImJsb2I6Iik/Zy5zdWJzdHIoMCxnLnJlcGxhY2UoL1s/I10uKi8sIiIpLmxhc3RJbmRleE9mKCIvIikrMSk6IiIsbz1lPT57dmFyIHQ9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB0Lm9wZW4oIkdFVCIsZSwhMSksdC5zZW5kKG51bGwpLHQucmVzcG9uc2VUZXh0fSxkJiYocz1lPT57dmFyIHQ9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiB0Lm9wZW4oIkdFVCIsZSwhMSksdC5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIix0LnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkodC5yZXNwb25zZSl9KSxpPShlLHQscik9Pnt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKCJHRVQiLGUsITApLG4ucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsbi5vbmxvYWQ9KCk9PnsyMDA9PW4uc3RhdHVzfHwwPT1uLnN0YXR1cyYmbi5yZXNwb25zZT90KG4ucmVzcG9uc2UpOnIoKX0sbi5vbmVycm9yPXIsbi5zZW5kKG51bGwpfSk7dmFyIHksdj1hLnByaW50fHxjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLGI9YS5wcmludEVycnx8Y29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpO09iamVjdC5hc3NpZ24oYSx1KSx1PW51bGwsYS50aGlzUHJvZ3JhbSYmKGM9YS50aGlzUHJvZ3JhbSksYS5xdWl0JiYobD1hLnF1aXQpLGEud2FzbUJpbmFyeSYmKHk9YS53YXNtQmluYXJ5KTt2YXIgdz1hLm5vRXhpdFJ1bnRpbWV8fCEwOyJvYmplY3QiIT10eXBlb2YgV2ViQXNzZW1ibHkmJlcoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTt2YXIgXyxPLFMsRSxBLFQsTT0hMTtmdW5jdGlvbiBSKCl7dmFyIGU9Xy5idWZmZXI7YS5IRUFQOD1TPW5ldyBJbnQ4QXJyYXkoZSksYS5IRUFQMTY9bmV3IEludDE2QXJyYXkoZSksYS5IRUFQMzI9QT1uZXcgSW50MzJBcnJheShlKSxhLkhFQVBVOD1FPW5ldyBVaW50OEFycmF5KGUpLGEuSEVBUFUxNj1uZXcgVWludDE2QXJyYXkoZSksYS5IRUFQVTMyPVQ9bmV3IFVpbnQzMkFycmF5KGUpLGEuSEVBUEYzMj1uZXcgRmxvYXQzMkFycmF5KGUpLGEuSEVBUEY2ND1uZXcgRmxvYXQ2NEFycmF5KGUpfXZhciBGPVtdLGs9W10sQz1bXTtmdW5jdGlvbiBQKCl7dmFyIGU9YS5wcmVSdW4uc2hpZnQoKTtGLnVuc2hpZnQoZSl9dmFyIEQseCxJPTAsVT1udWxsLEw9bnVsbDtmdW5jdGlvbiBXKGUpe3Rocm93IGEub25BYm9ydCYmYS5vbkFib3J0KGUpLGIoZT0iQWJvcnRlZCgiK2UrIikiKSxNPSEwLGU9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihlKyIuIEJ1aWxkIHdpdGggLXNBU1NFUlRJT05TIGZvciBtb3JlIGluZm8uIiksbihlKSxlfWZ1bmN0aW9uIEgoZSl7cmV0dXJuIGUuc3RhcnRzV2l0aCgiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCIpfWlmKCFIKEQ9Im9ydC13YXNtLndhc20iKSl7dmFyIFk9RDtEPWEubG9jYXRlRmlsZT9hLmxvY2F0ZUZpbGUoWSxnKTpnK1l9ZnVuY3Rpb24gaihlKXtpZihlPT1EJiZ5KXJldHVybiBuZXcgVWludDhBcnJheSh5KTtpZihzKXJldHVybiBzKGUpO3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1mdW5jdGlvbiB6KGUsdCxyKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoIXkmJihmfHxkKSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGZldGNoJiYhZS5zdGFydHNXaXRoKCJmaWxlOi8vIikpcmV0dXJuIGZldGNoKGUse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKCh0PT57aWYoIXQub2spdGhyb3ciZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCBcJyIrZSsiXCciO3JldHVybiB0LmFycmF5QnVmZmVyKCl9KSkuY2F0Y2goKCgpPT5qKGUpKSk7aWYoaSlyZXR1cm4gbmV3IFByb21pc2UoKCh0LHIpPT57aShlLChlPT50KG5ldyBVaW50OEFycmF5KGUpKSkscil9KSl9cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT5qKGUpKSl9KGUpLnRoZW4oKGU9PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGUsdCkpKS50aGVuKChlPT5lKSkudGhlbihyLChlPT57YigiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIitlKSxXKGUpfSkpfWZ1bmN0aW9uIEcoZSl7dGhpcy5uYW1lPSJFeGl0U3RhdHVzIix0aGlzLm1lc3NhZ2U9YFByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoJHtlfSlgLHRoaXMuc3RhdHVzPWV9dmFyIE49ZT0+e2Zvcig7MDxlLmxlbmd0aDspZS5zaGlmdCgpKGEpfTtmdW5jdGlvbiBCKGUpe3RoaXMucWE9ZS0yNCx0aGlzLnZhPWZ1bmN0aW9uKGUpe1RbdGhpcy5xYSs0Pj4yPj4+MF09ZX0sdGhpcy51YT1mdW5jdGlvbihlKXtUW3RoaXMucWErOD4+Mj4+PjBdPWV9LHRoaXMuc2E9ZnVuY3Rpb24oZSx0KXt0aGlzLnRhKCksdGhpcy52YShlKSx0aGlzLnVhKHQpfSx0aGlzLnRhPWZ1bmN0aW9uKCl7VFt0aGlzLnFhKzE2Pj4yPj4+MF09MH19dmFyICQscT0idW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxWPShlLHQscik9Pnt2YXIgbj0odD4+Pj0wKStyO2ZvcihyPXQ7ZVtyXSYmIShyPj1uKTspKytyO2lmKDE2PHItdCYmZS5idWZmZXImJnEpcmV0dXJuIHEuZGVjb2RlKGUuc3ViYXJyYXkodCxyKSk7Zm9yKG49IiI7dDxyOyl7dmFyIGE9ZVt0KytdO2lmKDEyOCZhKXt2YXIgbz02MyZlW3QrK107aWYoMTkyPT0oMjI0JmEpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoKDMxJmEpPDw2fG8pO2Vsc2V7dmFyIGk9NjMmZVt0KytdOzY1NTM2PihhPTIyND09KDI0MCZhKT8oMTUmYSk8PDEyfG88PDZ8aTooNyZhKTw8MTh8bzw8MTJ8aTw8Nnw2MyZlW3QrK10pP24rPVN0cmluZy5mcm9tQ2hhckNvZGUoYSk6KGEtPTY1NTM2LG4rPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8YT4+MTAsNTYzMjB8MTAyMyZhKSl9fWVsc2Ugbis9U3RyaW5nLmZyb21DaGFyQ29kZShhKX1yZXR1cm4gbn0sSj0oZSx0KT0+KGU+Pj49MCk/VihFLGUsdCk6IiIsWD1lPT57Zm9yKHZhciB0PTAscj0wO3I8ZS5sZW5ndGg7KytyKXt2YXIgbj1lLmNoYXJDb2RlQXQocik7MTI3Pj1uP3QrKzoyMDQ3Pj1uP3QrPTI6NTUyOTY8PW4mJjU3MzQzPj1uPyh0Kz00LCsrcik6dCs9M31yZXR1cm4gdH0sSz0oZSx0LHIsbik9PntpZighKDA8bikpcmV0dXJuIDA7dmFyIGE9cj4+Pj0wO249cituLTE7Zm9yKHZhciBvPTA7bzxlLmxlbmd0aDsrK28pe3ZhciBpPWUuY2hhckNvZGVBdChvKTtpZig1NTI5Njw9aSYmNTczNDM+PWkmJihpPTY1NTM2KygoMTAyMyZpKTw8MTApfDEwMjMmZS5jaGFyQ29kZUF0KCsrbykpLDEyNz49aSl7aWYocj49bilicmVhazt0W3IrKz4+PjBdPWl9ZWxzZXtpZigyMDQ3Pj1pKXtpZihyKzE+PW4pYnJlYWs7dFtyKys+Pj4wXT0xOTJ8aT4+Nn1lbHNle2lmKDY1NTM1Pj1pKXtpZihyKzI+PW4pYnJlYWs7dFtyKys+Pj4wXT0yMjR8aT4+MTJ9ZWxzZXtpZihyKzM+PW4pYnJlYWs7dFtyKys+Pj4wXT0yNDB8aT4+MTgsdFtyKys+Pj4wXT0xMjh8aT4+MTImNjN9dFtyKys+Pj4wXT0xMjh8aT4+NiY2M310W3IrKz4+PjBdPTEyOHw2MyZpfX1yZXR1cm4gdFtyPj4+MF09MCxyLWF9LFo9ZT0+MD09ZSU0JiYoMCE9ZSUxMDB8fDA9PWUlNDAwKSxRPVswLDMxLDYwLDkxLDEyMSwxNTIsMTgyLDIxMywyNDQsMjc0LDMwNSwzMzVdLGVlPVswLDMxLDU5LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzRdLHRlPWU9Pnt2YXIgdD1YKGUpKzEscj1sZSh0KTtyZXR1cm4gciYmSyhlLEUscix0KSxyfSxyZT17fSxuZT0oKT0+e2lmKCEkKXt2YXIgZSx0PXtVU0VSOiJ3ZWJfdXNlciIsTE9HTkFNRToid2ViX3VzZXIiLFBBVEg6Ii8iLFBXRDoiLyIsSE9NRToiL2hvbWUvd2ViX3VzZXIiLExBTkc6KCJvYmplY3QiPT10eXBlb2YgbmF2aWdhdG9yJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIsXzpjfHwiLi90aGlzLnByb2dyYW0ifTtmb3IoZSBpbiByZSl2b2lkIDA9PT1yZVtlXT9kZWxldGUgdFtlXTp0W2VdPXJlW2VdO3ZhciByPVtdO2ZvcihlIGluIHQpci5wdXNoKGAke2V9PSR7dFtlXX1gKTskPXJ9cmV0dXJuICR9LGFlPVtudWxsLFtdLFtdXSxvZT1lPT4ob2U9KCgpPT57aWYoIm9iamVjdCI9PXR5cGVvZiBjcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXJldHVybiBlPT5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpO2lmKHApdHJ5e3ZhciBlPXIoNzYwKTtpZihlLnJhbmRvbUZpbGxTeW5jKXJldHVybiB0PT5lLnJhbmRvbUZpbGxTeW5jKHQpO3ZhciB0PWUucmFuZG9tQnl0ZXM7cmV0dXJuIGU9PihlLnNldCh0KGUuYnl0ZUxlbmd0aCkpLGUpfWNhdGNoKGUpe31XKCJpbml0UmFuZG9tRGV2aWNlIil9KSgpKShlKSxpZT1bMzEsMjksMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLHNlPVszMSwyOCwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMV07ZnVuY3Rpb24gdWUoZSx0LHIsbil7ZnVuY3Rpb24gYShlLHQscil7Zm9yKGU9Im51bWJlciI9PXR5cGVvZiBlP2UudG9TdHJpbmcoKTplfHwiIjtlLmxlbmd0aDx0OyllPXJbMF0rZTtyZXR1cm4gZX1mdW5jdGlvbiBvKGUsdCl7cmV0dXJuIGEoZSx0LCIwIil9ZnVuY3Rpb24gaShlLHQpe2Z1bmN0aW9uIHIoZSl7cmV0dXJuIDA+ZT8tMTowPGU/MTowfXZhciBuO3JldHVybiAwPT09KG49cihlLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpKSkmJjA9PT0obj1yKGUuZ2V0TW9udGgoKS10LmdldE1vbnRoKCkpKSYmKG49cihlLmdldERhdGUoKS10LmdldERhdGUoKSkpLG59ZnVuY3Rpb24gcyhlKXtzd2l0Y2goZS5nZXREYXkoKSl7Y2FzZSAwOnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCktMSwxMSwyOSk7Y2FzZSAxOnJldHVybiBlO2Nhc2UgMjpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMyk7Y2FzZSAzOnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwyKTtjYXNlIDQ6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDEpO2Nhc2UgNTpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMzEpO2Nhc2UgNjpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMzApfX1mdW5jdGlvbiB1KGUpe3ZhciB0PWUubWE7Zm9yKGU9bmV3IERhdGUobmV3IERhdGUoZS5uYSsxOTAwLDAsMSkuZ2V0VGltZSgpKTswPHQ7KXt2YXIgcj1lLmdldE1vbnRoKCksbj0oWihlLmdldEZ1bGxZZWFyKCkpP2llOnNlKVtyXTtpZighKHQ+bi1lLmdldERhdGUoKSkpe2Uuc2V0RGF0ZShlLmdldERhdGUoKSt0KTticmVha310LT1uLWUuZ2V0RGF0ZSgpKzEsZS5zZXREYXRlKDEpLDExPnI/ZS5zZXRNb250aChyKzEpOihlLnNldE1vbnRoKDApLGUuc2V0RnVsbFllYXIoZS5nZXRGdWxsWWVhcigpKzEpKX1yZXR1cm4gcj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCkrMSwwLDQpLHQ9cyhuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCw0KSkscj1zKHIpLDA+PWkodCxlKT8wPj1pKHIsZSk/ZS5nZXRGdWxsWWVhcigpKzE6ZS5nZXRGdWxsWWVhcigpOmUuZ2V0RnVsbFllYXIoKS0xfWU+Pj49MCx0Pj4+PTAscj4+Pj0wO3ZhciBjPUFbNDArKG4+Pj49MCk+PjI+Pj4wXTtmb3IodmFyIGwgaW4gbj17eWE6QVtuPj4yPj4+MF0seGE6QVtuKzQ+PjI+Pj4wXSxvYTpBW24rOD4+Mj4+PjBdLHJhOkFbbisxMj4+Mj4+PjBdLHBhOkFbbisxNj4+Mj4+PjBdLG5hOkFbbisyMD4+Mj4+PjBdLGhhOkFbbisyND4+Mj4+PjBdLG1hOkFbbisyOD4+Mj4+PjBdLEFhOkFbbiszMj4+Mj4+PjBdLHdhOkFbbiszNj4+Mj4+PjBdLHphOmM/SihjKToiIn0scj1KKHIpLGM9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9KXI9ci5yZXBsYWNlKG5ldyBSZWdFeHAobCwiZyIpLGNbbF0pO3ZhciBmPSJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheSIuc3BsaXQoIiAiKSxkPSJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyIi5zcGxpdCgiICIpO2ZvcihsIGluIGM9eyIlYSI6ZT0+ZltlLmhhXS5zdWJzdHJpbmcoMCwzKSwiJUEiOmU9PmZbZS5oYV0sIiViIjplPT5kW2UucGFdLnN1YnN0cmluZygwLDMpLCIlQiI6ZT0+ZFtlLnBhXSwiJUMiOmU9Pm8oKGUubmErMTkwMCkvMTAwfDAsMiksIiVkIjplPT5vKGUucmEsMiksIiVlIjplPT5hKGUucmEsMiwiICIpLCIlZyI6ZT0+dShlKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJUciOmU9PnUoZSksIiVIIjplPT5vKGUub2EsMiksIiVJIjplPT4oMD09KGU9ZS5vYSk/ZT0xMjoxMjxlJiYoZS09MTIpLG8oZSwyKSksIiVqIjplPT57Zm9yKHZhciB0PTAscj0wO3I8PWUucGEtMTt0Kz0oWihlLm5hKzE5MDApP2llOnNlKVtyKytdKTtyZXR1cm4gbyhlLnJhK3QsMyl9LCIlbSI6ZT0+byhlLnBhKzEsMiksIiVNIjplPT5vKGUueGEsMiksIiVuIjooKT0+IlxcbiIsIiVwIjplPT4wPD1lLm9hJiYxMj5lLm9hPyJBTSI6IlBNIiwiJVMiOmU9Pm8oZS55YSwyKSwiJXQiOigpPT4iXFx0IiwiJXUiOmU9PmUuaGF8fDcsIiVVIjplPT5vKE1hdGguZmxvb3IoKGUubWErNy1lLmhhKS83KSwyKSwiJVYiOmU9Pnt2YXIgdD1NYXRoLmZsb29yKChlLm1hKzctKGUuaGErNiklNykvNyk7aWYoMj49KGUuaGErMzcxLWUubWEtMiklNyYmdCsrLHQpNTM9PXQmJig0PT0ocj0oZS5oYSszNzEtZS5tYSklNyl8fDM9PXImJlooZS5uYSl8fCh0PTEpKTtlbHNle3Q9NTI7dmFyIHI9KGUuaGErNy1lLm1hLTEpJTc7KDQ9PXJ8fDU9PXImJlooZS5uYSU0MDAtMSkpJiZ0Kyt9cmV0dXJuIG8odCwyKX0sIiV3IjplPT5lLmhhLCIlVyI6ZT0+byhNYXRoLmZsb29yKChlLm1hKzctKGUuaGErNiklNykvNyksMiksIiV5IjplPT4oZS5uYSsxOTAwKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJVkiOmU9PmUubmErMTkwMCwiJXoiOmU9Pnt2YXIgdD0wPD0oZT1lLndhKTtyZXR1cm4gZT1NYXRoLmFicyhlKS82MCwodD8iKyI6Ii0iKStTdHJpbmcoIjAwMDAiKyhlLzYwKjEwMCtlJTYwKSkuc2xpY2UoLTQpfSwiJVoiOmU9PmUuemEsIiUlIjooKT0+IiUifSxyPXIucmVwbGFjZSgvJSUvZywiXFwwXFwwIiksYylyLmluY2x1ZGVzKGwpJiYocj1yLnJlcGxhY2UobmV3IFJlZ0V4cChsLCJnIiksY1tsXShuKSkpO3JldHVybiBsPWZ1bmN0aW9uKGUpe3ZhciB0PUFycmF5KFgoZSkrMSk7cmV0dXJuIEsoZSx0LDAsdC5sZW5ndGgpLHR9KHI9ci5yZXBsYWNlKC9cXDBcXDAvZywiJSIpKSxsLmxlbmd0aD50PzA6KFMuc2V0KGwsZT4+PjApLGwubGVuZ3RoLTEpfXZhciBjZT17YTpmdW5jdGlvbihlLHQscil7dGhyb3cgbmV3IEIoZT4+Pj0wKS5zYSh0Pj4+MCxyPj4+MCksZX0sZTpmdW5jdGlvbigpe3JldHVybiAwfSxJOmZ1bmN0aW9uKCl7fSx5OmZ1bmN0aW9uKCl7fSxBOmZ1bmN0aW9uKCl7fSxLOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LEc6ZnVuY3Rpb24oKXt9LEI6ZnVuY3Rpb24oKXt9LEY6ZnVuY3Rpb24oKXt9LGc6ZnVuY3Rpb24oKXt9LHo6ZnVuY3Rpb24oKXt9LHc6ZnVuY3Rpb24oKXt9LEg6ZnVuY3Rpb24oKXt9LHg6ZnVuY3Rpb24oKXt9LGs6KCk9PiEwLG46ZnVuY3Rpb24oZSx0LHIpe2U9dCsyMDk3MTUyPj4+MDw0MTk0MzA1LSEhZT8oZT4+PjApKzQyOTQ5NjcyOTYqdDpOYU4scj4+Pj0wLGU9bmV3IERhdGUoMWUzKmUpLEFbcj4+Mj4+PjBdPWUuZ2V0VVRDU2Vjb25kcygpLEFbcis0Pj4yPj4+MF09ZS5nZXRVVENNaW51dGVzKCksQVtyKzg+PjI+Pj4wXT1lLmdldFVUQ0hvdXJzKCksQVtyKzEyPj4yPj4+MF09ZS5nZXRVVENEYXRlKCksQVtyKzE2Pj4yPj4+MF09ZS5nZXRVVENNb250aCgpLEFbcisyMD4+Mj4+PjBdPWUuZ2V0VVRDRnVsbFllYXIoKS0xOTAwLEFbcisyND4+Mj4+PjBdPWUuZ2V0VVRDRGF5KCksQVtyKzI4Pj4yPj4+MF09KGUuZ2V0VGltZSgpLURhdGUuVVRDKGUuZ2V0VVRDRnVsbFllYXIoKSwwLDEsMCwwLDAsMCkpLzg2NGU1fDB9LG86ZnVuY3Rpb24oZSx0LHIpe2U9dCsyMDk3MTUyPj4+MDw0MTk0MzA1LSEhZT8oZT4+PjApKzQyOTQ5NjcyOTYqdDpOYU4scj4+Pj0wLGU9bmV3IERhdGUoMWUzKmUpLEFbcj4+Mj4+PjBdPWUuZ2V0U2Vjb25kcygpLEFbcis0Pj4yPj4+MF09ZS5nZXRNaW51dGVzKCksQVtyKzg+PjI+Pj4wXT1lLmdldEhvdXJzKCksQVtyKzEyPj4yPj4+MF09ZS5nZXREYXRlKCksQVtyKzE2Pj4yPj4+MF09ZS5nZXRNb250aCgpLEFbcisyMD4+Mj4+PjBdPWUuZ2V0RnVsbFllYXIoKS0xOTAwLEFbcisyND4+Mj4+PjBdPWUuZ2V0RGF5KCksQVtyKzI4Pj4yPj4+MF09KFooZS5nZXRGdWxsWWVhcigpKT9ROmVlKVtlLmdldE1vbnRoKCldK2UuZ2V0RGF0ZSgpLTF8MCxBW3IrMzY+PjI+Pj4wXT0tNjAqZS5nZXRUaW1lem9uZU9mZnNldCgpLHQ9bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgbj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpO0FbciszMj4+Mj4+PjBdPTB8KHQhPW4mJmUuZ2V0VGltZXpvbmVPZmZzZXQoKT09TWF0aC5taW4obix0KSl9LHA6ZnVuY3Rpb24oZSl7ZT4+Pj0wO3ZhciB0PW5ldyBEYXRlKEFbZSsyMD4+Mj4+PjBdKzE5MDAsQVtlKzE2Pj4yPj4+MF0sQVtlKzEyPj4yPj4+MF0sQVtlKzg+PjI+Pj4wXSxBW2UrND4+Mj4+PjBdLEFbZT4+Mj4+PjBdLDApLHI9QVtlKzMyPj4yPj4+MF0sbj10LmdldFRpbWV6b25lT2Zmc2V0KCksYT1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksNiwxKS5nZXRUaW1lem9uZU9mZnNldCgpLG89bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLDAsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKSxpPU1hdGgubWluKG8sYSk7cmV0dXJuIDA+cj9BW2UrMzI+PjI+Pj4wXT1OdW1iZXIoYSE9byYmaT09bik6MDxyIT0oaT09bikmJihhPU1hdGgubWF4KG8sYSksdC5zZXRUaW1lKHQuZ2V0VGltZSgpKzZlNCooKDA8cj9pOmEpLW4pKSksQVtlKzI0Pj4yPj4+MF09dC5nZXREYXkoKSxBW2UrMjg+PjI+Pj4wXT0oWih0LmdldEZ1bGxZZWFyKCkpP1E6ZWUpW3QuZ2V0TW9udGgoKV0rdC5nZXREYXRlKCktMXwwLEFbZT4+Mj4+PjBdPXQuZ2V0U2Vjb25kcygpLEFbZSs0Pj4yPj4+MF09dC5nZXRNaW51dGVzKCksQVtlKzg+PjI+Pj4wXT10LmdldEhvdXJzKCksQVtlKzEyPj4yPj4+MF09dC5nZXREYXRlKCksQVtlKzE2Pj4yPj4+MF09dC5nZXRNb250aCgpLEFbZSsyMD4+Mj4+PjBdPXQuZ2V0WWVhcigpLGU9dC5nZXRUaW1lKCkvMWUzLGRlKCh4PWUsMTw9K01hdGguYWJzKHgpPzA8eD8rTWF0aC5mbG9vcih4LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHgtKyh+fng+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApKSxlPj4+MH0sbDpmdW5jdGlvbigpe3JldHVybi01Mn0sbTpmdW5jdGlvbigpe30sdTpmdW5jdGlvbihlLHQscil7ZnVuY3Rpb24gbihlKXtyZXR1cm4oZT1lLnRvVGltZVN0cmluZygpLm1hdGNoKC9cXCgoW0EtWmEteiBdKylcXCkkLykpP2VbMV06IkdNVCJ9cj4+Pj0wO3ZhciBhPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSxvPW5ldyBEYXRlKGEsMCwxKSxpPW5ldyBEYXRlKGEsNiwxKTthPW8uZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgcz1pLmdldFRpbWV6b25lT2Zmc2V0KCk7VFtlPj4+MD4+Mj4+PjBdPTYwKk1hdGgubWF4KGEscyksQVt0Pj4+MD4+Mj4+PjBdPU51bWJlcihhIT1zKSxlPW4obyksdD1uKGkpLGU9dGUoZSksdD10ZSh0KSxzPGE/KFRbcj4+Mj4+PjBdPWUsVFtyKzQ+PjI+Pj4wXT10KTooVFtyPj4yPj4+MF09dCxUW3IrND4+Mj4+PjBdPWUpfSxkOigpPT57VygiIil9LGg6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX0sdjpmdW5jdGlvbigpe3JldHVybiA0Mjk0OTAxNzYwfSxiOigpPT5wZXJmb3JtYW5jZS5ub3coKSxKOmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdD4+Pj0wLEUuY29weVdpdGhpbihlPj4+MD4+PjAsdD4+PjAsdCsocj4+PjApPj4+MCl9LHQ6ZnVuY3Rpb24oZSl7ZT4+Pj0wO3ZhciB0PUUubGVuZ3RoO2lmKDQyOTQ5MDE3NjA8ZSlyZXR1cm4hMTtmb3IodmFyIHI9MTs0Pj1yO3IqPTIpe3ZhciBuPXQqKDErLjIvcik7bj1NYXRoLm1pbihuLGUrMTAwNjYzMjk2KTt2YXIgYT1NYXRoO249TWF0aC5tYXgoZSxuKTtlOnthPWEubWluLmNhbGwoYSw0Mjk0OTAxNzYwLG4rKDY1NTM2LW4lNjU1MzYpJTY1NTM2KS1fLmJ1ZmZlci5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTY7dHJ5e18uZ3JvdyhhKSxSKCk7dmFyIG89MTticmVhayBlfWNhdGNoKGUpe31vPXZvaWQgMH1pZihvKXJldHVybiEwfXJldHVybiExfSxEOmZ1bmN0aW9uKGUsdCl7ZT4+Pj0wLHQ+Pj49MDt2YXIgcj0wO3JldHVybiBuZSgpLmZvckVhY2goKGZ1bmN0aW9uKG4sYSl7dmFyIG89dCtyO2ZvcihhPVRbZSs0KmE+PjI+Pj4wXT1vLG89MDtvPG4ubGVuZ3RoOysrbylTW2ErKz4+MD4+PjBdPW4uY2hhckNvZGVBdChvKTtTW2E+PjA+Pj4wXT0wLHIrPW4ubGVuZ3RoKzF9KSksMH0sRTpmdW5jdGlvbihlLHQpe2U+Pj49MCx0Pj4+PTA7dmFyIHI9bmUoKTtUW2U+PjI+Pj4wXT1yLmxlbmd0aDt2YXIgbj0wO3JldHVybiByLmZvckVhY2goKGZ1bmN0aW9uKGUpe24rPWUubGVuZ3RoKzF9KSksVFt0Pj4yPj4+MF09biwwfSxzOmU9Pnt3fHwoYS5vbkV4aXQmJmEub25FeGl0KGUpLE09ITApLGwoZSxuZXcgRyhlKSl9LGY6KCk9PjUyLGo6ZnVuY3Rpb24oKXtyZXR1cm4gNTJ9LHE6ZnVuY3Rpb24oKXtyZXR1cm4gNzB9LGk6ZnVuY3Rpb24oZSx0LHIsbil7dD4+Pj0wLHI+Pj49MCxuPj4+PTA7Zm9yKHZhciBhPTAsbz0wO288cjtvKyspe3ZhciBpPVRbdD4+Mj4+PjBdLHM9VFt0KzQ+PjI+Pj4wXTt0Kz04O2Zvcih2YXIgdT0wO3U8czt1Kyspe3ZhciBjPUVbaSt1Pj4+MF0sbD1hZVtlXTswPT09Y3x8MTA9PT1jPygoMT09PWU/djpiKShWKGwsMCkpLGwubGVuZ3RoPTApOmwucHVzaChjKX1hKz1zfXJldHVybiBUW24+PjI+Pj4wXT1hLDB9LHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT4+Pj0wLG9lKEUuc3ViYXJyYXkoZT4+PjAsZSsodD4+PjApPj4+MCkpLDB9LEM6dWUsYzpmdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdWUoZT4+PjAsdD4+PjAscj4+PjAsbj4+PjApfX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlPWUuZXhwb3J0cyxPPWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZT0+KCk9PmUoKT4+PjAscj1lPT50PT5lKHQpPj4+MDtyZXR1cm4oZT1PYmplY3QuYXNzaWduKHt9LGUpKS5fX2Vycm5vX2xvY2F0aW9uPXQoZS5fX2Vycm5vX2xvY2F0aW9uKSxlLm1hbGxvYz1yKGUubWFsbG9jKSxlLnN0YWNrU2F2ZT10KGUuc3RhY2tTYXZlKSxlLnN0YWNrQWxsb2M9cihlLnN0YWNrQWxsb2MpLGV9KGUpLF89Ty5MLFIoKSxrLnVuc2hpZnQoTy5NKSxJLS0sYS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZhLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoSSksMD09SSYmKG51bGwhPT1VJiYoY2xlYXJJbnRlcnZhbChVKSxVPW51bGwpLEwpKXt2YXIgdD1MO0w9bnVsbCx0KCl9cmV0dXJuIGV9dmFyIHQ9e2E6Y2V9O2lmKEkrKyxhLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJmEubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhJKSxhLmluc3RhbnRpYXRlV2FzbSl0cnl7cmV0dXJuIGEuaW5zdGFudGlhdGVXYXNtKHQsZSl9Y2F0Y2goZSl7YigiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIitlKSxuKGUpfShmdW5jdGlvbihlLHQpe3ZhciByPUQ7cmV0dXJuIHl8fCJmdW5jdGlvbiIhPXR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZ3x8SChyKXx8ci5zdGFydHNXaXRoKCJmaWxlOi8vIil8fHB8fCJmdW5jdGlvbiIhPXR5cGVvZiBmZXRjaD96KHIsZSx0KTpmZXRjaChyLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbigobj0+V2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcobixlKS50aGVuKHQsKGZ1bmN0aW9uKG4pe3JldHVybiBiKCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogIituKSxiKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpLHoocixlLHQpfSkpKSl9KSh0LChmdW5jdGlvbih0KXtlKHQuaW5zdGFuY2UpfSkpLmNhdGNoKG4pfSgpLGEuX09ydEluaXQ9KGUsdCk9PihhLl9PcnRJbml0PU8uTikoZSx0KSxhLl9PcnRHZXRMYXN0RXJyb3I9KGUsdCk9PihhLl9PcnRHZXRMYXN0RXJyb3I9Ty5PKShlLHQpLGEuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zPShlLHQscixuLG8saSxzLHUsYyxsKT0+KGEuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zPU8uUCkoZSx0LHIsbixvLGkscyx1LGMsbCksYS5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXI9KGUsdCk9PihhLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj1PLlEpKGUsdCksYS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PShlLHQscik9PihhLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9Ty5SKShlLHQsciksYS5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zPWU9PihhLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnM9Ty5TKShlKSxhLl9PcnRDcmVhdGVTZXNzaW9uPShlLHQscik9PihhLl9PcnRDcmVhdGVTZXNzaW9uPU8uVCkoZSx0LHIpLGEuX09ydFJlbGVhc2VTZXNzaW9uPWU9PihhLl9PcnRSZWxlYXNlU2Vzc2lvbj1PLlUpKGUpLGEuX09ydEdldElucHV0T3V0cHV0Q291bnQ9KGUsdCxyKT0+KGEuX09ydEdldElucHV0T3V0cHV0Q291bnQ9Ty5WKShlLHQsciksYS5fT3J0R2V0SW5wdXROYW1lPShlLHQpPT4oYS5fT3J0R2V0SW5wdXROYW1lPU8uVykoZSx0KSxhLl9PcnRHZXRPdXRwdXROYW1lPShlLHQpPT4oYS5fT3J0R2V0T3V0cHV0TmFtZT1PLlgpKGUsdCksYS5fT3J0RnJlZT1lPT4oYS5fT3J0RnJlZT1PLlkpKGUpLGEuX09ydENyZWF0ZVRlbnNvcj0oZSx0LHIsbixvKT0+KGEuX09ydENyZWF0ZVRlbnNvcj1PLlopKGUsdCxyLG4sbyksYS5fT3J0R2V0VGVuc29yRGF0YT0oZSx0LHIsbixvKT0+KGEuX09ydEdldFRlbnNvckRhdGE9Ty5fKShlLHQscixuLG8pLGEuX09ydFJlbGVhc2VUZW5zb3I9ZT0+KGEuX09ydFJlbGVhc2VUZW5zb3I9Ty4kKShlKSxhLl9PcnRDcmVhdGVSdW5PcHRpb25zPShlLHQscixuKT0+KGEuX09ydENyZWF0ZVJ1bk9wdGlvbnM9Ty5hYSkoZSx0LHIsbiksYS5fT3J0QWRkUnVuQ29uZmlnRW50cnk9KGUsdCxyKT0+KGEuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PU8uYmEpKGUsdCxyKSxhLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1lPT4oYS5fT3J0UmVsZWFzZVJ1bk9wdGlvbnM9Ty5jYSkoZSksYS5fT3J0UnVuPShlLHQscixuLG8saSxzLHUpPT4oYS5fT3J0UnVuPU8uZGEpKGUsdCxyLG4sbyxpLHMsdSksYS5fT3J0RW5kUHJvZmlsaW5nPWU9PihhLl9PcnRFbmRQcm9maWxpbmc9Ty5lYSkoZSk7dmFyIGxlPWEuX21hbGxvYz1lPT4obGU9YS5fbWFsbG9jPU8uZmEpKGUpO2EuX2ZyZWU9ZT0+KGEuX2ZyZWU9Ty5nYSkoZSk7dmFyIGZlLGRlPWU9PihkZT1PLmlhKShlKSxwZT0oKT0+KHBlPU8uamEpKCksZ2U9ZT0+KGdlPU8ua2EpKGUpLGhlPWU9PihoZT1PLmxhKShlKTtmdW5jdGlvbiBtZSgpe2Z1bmN0aW9uIGUoKXtpZighZmUmJihmZT0hMCxhLmNhbGxlZFJ1bj0hMCwhTSkpe2lmKE4oayksdChhKSxhLm9uUnVudGltZUluaXRpYWxpemVkJiZhLm9uUnVudGltZUluaXRpYWxpemVkKCksYS5wb3N0UnVuKWZvcigiZnVuY3Rpb24iPT10eXBlb2YgYS5wb3N0UnVuJiYoYS5wb3N0UnVuPVthLnBvc3RSdW5dKTthLnBvc3RSdW4ubGVuZ3RoOyl7dmFyIGU9YS5wb3N0UnVuLnNoaWZ0KCk7Qy51bnNoaWZ0KGUpfU4oQyl9fWlmKCEoMDxJKSl7aWYoYS5wcmVSdW4pZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBhLnByZVJ1biYmKGEucHJlUnVuPVthLnByZVJ1bl0pO2EucHJlUnVuLmxlbmd0aDspUCgpO04oRiksMDxJfHwoYS5zZXRTdGF0dXM/KGEuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Euc2V0U3RhdHVzKCIiKX0pLDEpLGUoKX0pLDEpKTplKCkpfX1pZihhLnN0YWNrQWxsb2M9aGUsYS5zdGFja1NhdmU9cGUsYS5zdGFja1Jlc3RvcmU9Z2UsYS5VVEY4VG9TdHJpbmc9SixhLnN0cmluZ1RvVVRGOD0oZSx0LHIpPT5LKGUsRSx0LHIpLGEubGVuZ3RoQnl0ZXNVVEY4PVgsTD1mdW5jdGlvbiBlKCl7ZmV8fG1lKCksZmV8fChMPWUpfSxhLnByZUluaXQpZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBhLnByZUluaXQmJihhLnByZUluaXQ9W2EucHJlSW5pdF0pOzA8YS5wcmVJbml0Lmxlbmd0aDspYS5wcmVJbml0LnBvcCgpKCk7cmV0dXJuIG1lKCksZS5yZWFkeX0pO2UuZXhwb3J0cz1ufSwxNTQ6ZT0+eyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9XCcidXNlIHN0cmljdCI7dmFyIGU9e30sYT0ib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MmJiJvYmplY3QiPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyYmInN0cmluZyI9PXR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGU7aWYoYSl7dmFyIHI9cmVxdWlyZSgid29ya2VyX3RocmVhZHMiKSx0PXIucGFyZW50UG9ydDt0Lm9uKCJtZXNzYWdlIiwoZT0+b25tZXNzYWdlKHtkYXRhOmV9KSkpO3ZhciBzPXJlcXVpcmUoImZzIik7T2JqZWN0LmFzc2lnbihnbG9iYWwse3NlbGY6Z2xvYmFsLHJlcXVpcmU6cmVxdWlyZSxNb2R1bGU6ZSxsb2NhdGlvbjp7aHJlZjpfX2ZpbGVuYW1lfSxXb3JrZXI6ci5Xb3JrZXIsaW1wb3J0U2NyaXB0czplPT4oMCxldmFsKShzLnJlYWRGaWxlU3luYyhlLCJ1dGY4IikrIi8vIyBzb3VyY2VVUkw9IitlKSxwb3N0TWVzc2FnZTplPT50LnBvc3RNZXNzYWdlKGUpLHBlcmZvcm1hbmNlOmdsb2JhbC5wZXJmb3JtYW5jZXx8e25vdzpEYXRlLm5vd319KX12YXIgbz0hMSxkPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIgIik7YT9zLndyaXRlU3luYygyLGUrIlxcXFxuIik6Y29uc29sZS5lcnJvcihlKX07c2VsZi5hbGVydD1mdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiICIpO3Bvc3RNZXNzYWdlKHtjbWQ6ImFsZXJ0Iix0ZXh0OmEsdGhyZWFkSWQ6ZS5fcHRocmVhZF9zZWxmKCl9KX0sZS5pbnN0YW50aWF0ZVdhc209KGEscik9Pnt2YXIgdD1lLndhc21Nb2R1bGU7cmV0dXJuIGUud2FzbU1vZHVsZT1udWxsLHIobmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKHQsYSkpfSxzZWxmLm9udW5oYW5kbGVkcmVqZWN0aW9uPWU9Pnt0aHJvdyBlLnJlYXNvbj8/ZX0sc2VsZi5vbm1lc3NhZ2U9ZnVuY3Rpb24gYShyKXt0cnl7aWYoImxvYWQiPT09ci5kYXRhLmNtZCl7bGV0IHM9W107c2VsZi5vbm1lc3NhZ2U9ZT0+cy5wdXNoKGUpLHNlbGYuc3RhcnRXb3JrZXI9cj0+e2U9cixwb3N0TWVzc2FnZSh7Y21kOiJsb2FkZWQifSk7Zm9yKGxldCBlIG9mIHMpYShlKTtzZWxmLm9ubWVzc2FnZT1hfSxlLndhc21Nb2R1bGU9ci5kYXRhLndhc21Nb2R1bGU7Zm9yKGNvbnN0IGEgb2Ygci5kYXRhLmhhbmRsZXJzKWVbYV09KC4uLmUpPT57cG9zdE1lc3NhZ2Uoe2NtZDoiY2FsbEhhbmRsZXIiLGhhbmRsZXI6YSxhcmdzOmV9KX07aWYoZS53YXNtTWVtb3J5PXIuZGF0YS53YXNtTWVtb3J5LGUuYnVmZmVyPWUud2FzbU1lbW9yeS5idWZmZXIsZS5FTlZJUk9OTUVOVF9JU19QVEhSRUFEPSEwLCJzdHJpbmciPT10eXBlb2Ygci5kYXRhLnVybE9yQmxvYilpbXBvcnRTY3JpcHRzKHIuZGF0YS51cmxPckJsb2IpO2Vsc2V7dmFyIHQ9VVJMLmNyZWF0ZU9iamVjdFVSTChyLmRhdGEudXJsT3JCbG9iKTtpbXBvcnRTY3JpcHRzKHQpLFVSTC5yZXZva2VPYmplY3RVUkwodCl9b3J0V2FzbVRocmVhZGVkKGUpfWVsc2UgaWYoInJ1biI9PT1yLmRhdGEuY21kKXtlLl9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdChyLmRhdGEucHRocmVhZF9wdHIsMCwwLDEpLGUuX19lbXNjcmlwdGVuX3RocmVhZF9tYWlsYm94X2F3YWl0KHIuZGF0YS5wdGhyZWFkX3B0ciksZS5lc3RhYmxpc2hTdGFja1NwYWNlKCksZS5QVGhyZWFkLnJlY2VpdmVPYmplY3RUcmFuc2ZlcihyLmRhdGEpLGUuUFRocmVhZC50aHJlYWRJbml0VExTKCksb3x8KG89ITApO3RyeXtlLmludm9rZUVudHJ5UG9pbnQoci5kYXRhLnN0YXJ0X3JvdXRpbmUsci5kYXRhLmFyZyl9Y2F0Y2goZSl7aWYoInVud2luZCIhPWUpdGhyb3cgZX19ZWxzZSJjYW5jZWwiPT09ci5kYXRhLmNtZD9lLl9wdGhyZWFkX3NlbGYoKSYmZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2V4aXQoLTEpOiJzZXRpbW1lZGlhdGUiPT09ci5kYXRhLnRhcmdldHx8KCJjaGVja01haWxib3giPT09ci5kYXRhLmNtZD9vJiZlLmNoZWNrTWFpbGJveCgpOnIuZGF0YS5jbWQmJihkKCJ3b3JrZXIuanMgcmVjZWl2ZWQgdW5rbm93biBjb21tYW5kICIrci5kYXRhLmNtZCksZChyLmRhdGEpKSl9Y2F0Y2goYSl7dGhyb3cgZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2NyYXNoZWQmJmUuX19lbXNjcmlwdGVuX3RocmVhZF9jcmFzaGVkKCksYX19O1xcblwnfSw3NjA6KCk9Pnt9LDM4NDooKT0+e30sOTkzOigpPT57fSw5MDg6KCk9Pnt9LDk1MzooKT0+e30sOTI1OigpPT57fSw0NDk6KCk9Pnt9fSx0PXt9O2Z1bmN0aW9uIHIobil7dmFyIGE9dFtuXTtpZih2b2lkIDAhPT1hKXJldHVybiBhLmV4cG9ydHM7dmFyIG89dFtuXT17ZXhwb3J0czp7fX07cmV0dXJuIGVbbl0uY2FsbChvLmV4cG9ydHMsbyxvLmV4cG9ydHMsciksby5leHBvcnRzfSgoKT0+eyJ1c2Ugc3RyaWN0Ijtjb25zdCBlPXIoMjU5KSx0PXIoMjYzKTtzZWxmLm9ubWVzc2FnZT1yPT57c3dpdGNoKHIuZGF0YS50eXBlKXtjYXNlImluaXQtd2FzbSI6dHJ5eygwLHQuaW5pdGlhbGl6ZVdlYkFzc2VtYmx5KShyLmRhdGEuaW4pLnRoZW4oKCgpPT5wb3N0TWVzc2FnZSh7dHlwZToiaW5pdC13YXNtIn0pKSwoZT0+cG9zdE1lc3NhZ2Uoe3R5cGU6ImluaXQtd2FzbSIsZXJyOmV9KSkpfWNhdGNoKGUpe3Bvc3RNZXNzYWdlKHt0eXBlOiJpbml0LXdhc20iLGVycjplfSl9YnJlYWs7Y2FzZSJpbml0LW9ydCI6dHJ5eygwLGUuaW5pdFJ1bnRpbWUpKHIuZGF0YS5pbikudGhlbigoKCk9PnBvc3RNZXNzYWdlKHt0eXBlOiJpbml0LW9ydCJ9KSksKGU9PnBvc3RNZXNzYWdlKHt0eXBlOiJpbml0LW9ydCIsZXJyOmV9KSkpLHBvc3RNZXNzYWdlKHt0eXBlOiJpbml0LW9ydCJ9KX1jYXRjaChlKXtwb3N0TWVzc2FnZSh7dHlwZToiaW5pdC1vcnQiLGVycjplfSl9YnJlYWs7Y2FzZSJjcmVhdGVfYWxsb2NhdGUiOnRyeXtjb25zdHttb2RlbDp0fT1yLmRhdGEuaW4sbj0oMCxlLmNyZWF0ZVNlc3Npb25BbGxvY2F0ZSkodCk7cG9zdE1lc3NhZ2Uoe3R5cGU6ImNyZWF0ZV9hbGxvY2F0ZSIsb3V0Om59KX1jYXRjaChlKXtwb3N0TWVzc2FnZSh7dHlwZToiY3JlYXRlX2FsbG9jYXRlIixlcnI6ZX0pfWJyZWFrO2Nhc2UiY3JlYXRlX2ZpbmFsaXplIjp0cnl7Y29uc3R7bW9kZWxkYXRhOnQsb3B0aW9uczpufT1yLmRhdGEuaW4sYT0oMCxlLmNyZWF0ZVNlc3Npb25GaW5hbGl6ZSkodCxuKTtwb3N0TWVzc2FnZSh7dHlwZToiY3JlYXRlX2ZpbmFsaXplIixvdXQ6YX0pfWNhdGNoKGUpe3Bvc3RNZXNzYWdlKHt0eXBlOiJjcmVhdGVfZmluYWxpemUiLGVycjplfSl9YnJlYWs7Y2FzZSJjcmVhdGUiOnRyeXtjb25zdHttb2RlbDp0LG9wdGlvbnM6bn09ci5kYXRhLmluLGE9KDAsZS5jcmVhdGVTZXNzaW9uKSh0LG4pO3Bvc3RNZXNzYWdlKHt0eXBlOiJjcmVhdGUiLG91dDphfSl9Y2F0Y2goZSl7cG9zdE1lc3NhZ2Uoe3R5cGU6ImNyZWF0ZSIsZXJyOmV9KX1icmVhaztjYXNlInJlbGVhc2UiOnRyeXtjb25zdCB0PXIuZGF0YS5pbjsoMCxlLnJlbGVhc2VTZXNzaW9uKSh0KSxwb3N0TWVzc2FnZSh7dHlwZToicmVsZWFzZSJ9KX1jYXRjaChlKXtwb3N0TWVzc2FnZSh7dHlwZToicmVsZWFzZSIsZXJyOmV9KX1icmVhaztjYXNlInJ1biI6dHJ5e2NvbnN0e3Nlc3Npb25JZDp0LGlucHV0SW5kaWNlczpuLGlucHV0czphLG91dHB1dEluZGljZXM6byxvcHRpb25zOml9PXIuZGF0YS5pbjsoMCxlLnJ1bikodCxuLGEsbyxpKS50aGVuKCh0PT57cG9zdE1lc3NhZ2Uoe3R5cGU6InJ1biIsb3V0OnR9LCgwLGUuZXh0cmFjdFRyYW5zZmVyYWJsZUJ1ZmZlcnMpKHQpKX0pLChlPT57cG9zdE1lc3NhZ2Uoe3R5cGU6InJ1biIsZXJyOmV9KX0pKX1jYXRjaChlKXtwb3N0TWVzc2FnZSh7dHlwZToicnVuIixlcnI6ZX0pfWJyZWFrO2Nhc2UiZW5kLXByb2ZpbGluZyI6dHJ5e2NvbnN0IHQ9ci5kYXRhLmluOygwLGUuZW5kUHJvZmlsaW5nKSh0KSxwb3N0TWVzc2FnZSh7dHlwZToiZW5kLXByb2ZpbGluZyJ9KX1jYXRjaChlKXtwb3N0TWVzc2FnZSh7dHlwZToiZW5kLXByb2ZpbGluZyIsZXJyOmV9KX19fX0pKCl9KSgpO1xuJywiV29ya2VyIix2b2lkIDAsdm9pZCAwKX19LDY2MTQ6ZT0+e2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz1zZWxmfHx3aW5kb3c7dHJ5e3RyeXt2YXIgaTt0cnl7aT1uZXcgby5CbG9iKFtlXSk7fWNhdGNoKHQpeyhpPW5ldyhvLkJsb2JCdWlsZGVyfHxvLldlYktpdEJsb2JCdWlsZGVyfHxvLk1vekJsb2JCdWlsZGVyfHxvLk1TQmxvYkJ1aWxkZXIpKS5hcHBlbmQoZSksaT1pLmdldEJsb2IoKTt9dmFyIHM9by5VUkx8fG8ud2Via2l0VVJMLGE9cy5jcmVhdGVPYmplY3RVUkwoaSksdT1uZXcgb1t0XShhLG4pO3JldHVybiBzLnJldm9rZU9iamVjdFVSTChhKSx1fWNhdGNoKHIpe3JldHVybiBuZXcgb1t0XSgiZGF0YTphcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCIuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChlKSksbil9fWNhdGNoKGUpe2lmKCFyKXRocm93IEVycm9yKCJJbmxpbmUgd29ya2VyIGlzIG5vdCBzdXBwb3J0ZWQiKTtyZXR1cm4gbmV3IG9bdF0ocixuKX19O30sMjQ0NjooZSx0LG4pPT57dmFyIHIsbyxpLHM9bigyMTAwKSxhPXMuUmVhZGVyLHU9cy5Xcml0ZXIsbD1zLnV0aWwsYz1zLnJvb3RzLmRlZmF1bHR8fChzLnJvb3RzLmRlZmF1bHQ9e30pO2Mub25ueD0oKGk9e30pLlZlcnNpb249KHI9e30sKG89T2JqZWN0LmNyZWF0ZShyKSlbclswXT0iX1NUQVJUX1ZFUlNJT04iXT0wLG9bclsxXT0iSVJfVkVSU0lPTl8yMDE3XzEwXzEwIl09MSxvW3JbMl09IklSX1ZFUlNJT05fMjAxN18xMF8zMCJdPTIsb1tyWzNdPSJJUl9WRVJTSU9OXzIwMTdfMTFfMyJdPTMsb1tyWzRdPSJJUl9WRVJTSU9OXzIwMTlfMV8yMiJdPTQsb1tyWzVdPSJJUl9WRVJTSU9OXzIwMTlfM18xOCJdPTUsb1tyWzZdPSJJUl9WRVJTSU9OXzIwMTlfOV8xOSJdPTYsb1tyWzddPSJJUl9WRVJTSU9OXzIwMjBfNV84Il09NyxvW3JbOF09IklSX1ZFUlNJT05fMjAyMV83XzMwIl09OCxvW3JbOV09IklSX1ZFUlNJT04iXT05LG8pLGkuQXR0cmlidXRlUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuZmxvYXRzPVtdLHRoaXMuaW50cz1bXSx0aGlzLnN0cmluZ3M9W10sdGhpcy50ZW5zb3JzPVtdLHRoaXMuZ3JhcGhzPVtdLHRoaXMuc3BhcnNlVGVuc29ycz1bXSx0aGlzLnR5cGVQcm90b3M9W10sZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUubmFtZT0iIixlLnByb3RvdHlwZS5yZWZBdHRyTmFtZT0iIixlLnByb3RvdHlwZS5kb2NTdHJpbmc9IiIsZS5wcm90b3R5cGUudHlwZT0wLGUucHJvdG90eXBlLmY9MCxlLnByb3RvdHlwZS5pPWwuTG9uZz9sLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLGUucHJvdG90eXBlLnM9bC5uZXdCdWZmZXIoW10pLGUucHJvdG90eXBlLnQ9bnVsbCxlLnByb3RvdHlwZS5nPW51bGwsZS5wcm90b3R5cGUuc3BhcnNlVGVuc29yPW51bGwsZS5wcm90b3R5cGUudHA9bnVsbCxlLnByb3RvdHlwZS5mbG9hdHM9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmludHM9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnN0cmluZ3M9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnRlbnNvcnM9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmdyYXBocz1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuc3BhcnNlVGVuc29ycz1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUudHlwZVByb3Rvcz1sLmVtcHR5QXJyYXksZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe2lmKHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUubmFtZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwibmFtZSIpJiZ0LnVpbnQzMigxMCkuc3RyaW5nKGUubmFtZSksbnVsbCE9ZS5mJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJmIikmJnQudWludDMyKDIxKS5mbG9hdChlLmYpLG51bGwhPWUuaSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiaSIpJiZ0LnVpbnQzMigyNCkuaW50NjQoZS5pKSxudWxsIT1lLnMmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInMiKSYmdC51aW50MzIoMzQpLmJ5dGVzKGUucyksbnVsbCE9ZS50JiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJ0IikmJmMub25ueC5UZW5zb3JQcm90by5lbmNvZGUoZS50LHQudWludDMyKDQyKS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuZyYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZyIpJiZjLm9ubnguR3JhcGhQcm90by5lbmNvZGUoZS5nLHQudWludDMyKDUwKS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuZmxvYXRzJiZlLmZsb2F0cy5sZW5ndGgpe3QudWludDMyKDU4KS5mb3JrKCk7Zm9yKHZhciBuPTA7bjxlLmZsb2F0cy5sZW5ndGg7KytuKXQuZmxvYXQoZS5mbG9hdHNbbl0pO3QubGRlbGltKCk7fWlmKG51bGwhPWUuaW50cyYmZS5pbnRzLmxlbmd0aCl7Zm9yKHQudWludDMyKDY2KS5mb3JrKCksbj0wO248ZS5pbnRzLmxlbmd0aDsrK24pdC5pbnQ2NChlLmludHNbbl0pO3QubGRlbGltKCk7fWlmKG51bGwhPWUuc3RyaW5ncyYmZS5zdHJpbmdzLmxlbmd0aClmb3Iobj0wO248ZS5zdHJpbmdzLmxlbmd0aDsrK24pdC51aW50MzIoNzQpLmJ5dGVzKGUuc3RyaW5nc1tuXSk7aWYobnVsbCE9ZS50ZW5zb3JzJiZlLnRlbnNvcnMubGVuZ3RoKWZvcihuPTA7bjxlLnRlbnNvcnMubGVuZ3RoOysrbiljLm9ubnguVGVuc29yUHJvdG8uZW5jb2RlKGUudGVuc29yc1tuXSx0LnVpbnQzMig4MikuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLmdyYXBocyYmZS5ncmFwaHMubGVuZ3RoKWZvcihuPTA7bjxlLmdyYXBocy5sZW5ndGg7KytuKWMub25ueC5HcmFwaFByb3RvLmVuY29kZShlLmdyYXBoc1tuXSx0LnVpbnQzMig5MCkuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLmRvY1N0cmluZyYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZG9jU3RyaW5nIikmJnQudWludDMyKDEwNikuc3RyaW5nKGUuZG9jU3RyaW5nKSxudWxsIT1lLnRwJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJ0cCIpJiZjLm9ubnguVHlwZVByb3RvLmVuY29kZShlLnRwLHQudWludDMyKDExNCkuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLnR5cGVQcm90b3MmJmUudHlwZVByb3Rvcy5sZW5ndGgpZm9yKG49MDtuPGUudHlwZVByb3Rvcy5sZW5ndGg7KytuKWMub25ueC5UeXBlUHJvdG8uZW5jb2RlKGUudHlwZVByb3Rvc1tuXSx0LnVpbnQzMigxMjIpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS50eXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJ0eXBlIikmJnQudWludDMyKDE2MCkuaW50MzIoZS50eXBlKSxudWxsIT1lLnJlZkF0dHJOYW1lJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJyZWZBdHRyTmFtZSIpJiZ0LnVpbnQzMigxNzApLnN0cmluZyhlLnJlZkF0dHJOYW1lKSxudWxsIT1lLnNwYXJzZVRlbnNvciYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwic3BhcnNlVGVuc29yIikmJmMub25ueC5TcGFyc2VUZW5zb3JQcm90by5lbmNvZGUoZS5zcGFyc2VUZW5zb3IsdC51aW50MzIoMTc4KS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuc3BhcnNlVGVuc29ycyYmZS5zcGFyc2VUZW5zb3JzLmxlbmd0aClmb3Iobj0wO248ZS5zcGFyc2VUZW5zb3JzLmxlbmd0aDsrK24pYy5vbm54LlNwYXJzZVRlbnNvclByb3RvLmVuY29kZShlLnNwYXJzZVRlbnNvcnNbbl0sdC51aW50MzIoMTg2KS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiB0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguQXR0cmlidXRlUHJvdG87ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci5uYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAyMTpyLnJlZkF0dHJOYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAxMzpyLmRvY1N0cmluZz1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMjA6ci50eXBlPWUuaW50MzIoKTticmVhaztjYXNlIDI6ci5mPWUuZmxvYXQoKTticmVhaztjYXNlIDM6ci5pPWUuaW50NjQoKTticmVhaztjYXNlIDQ6ci5zPWUuYnl0ZXMoKTticmVhaztjYXNlIDU6ci50PWMub25ueC5UZW5zb3JQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDY6ci5nPWMub25ueC5HcmFwaFByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMjI6ci5zcGFyc2VUZW5zb3I9Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMTQ6ci50cD1jLm9ubnguVHlwZVByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgNzppZihyLmZsb2F0cyYmci5mbG9hdHMubGVuZ3RofHwoci5mbG9hdHM9W10pLDI9PSg3Jm8pKWZvcih2YXIgaT1lLnVpbnQzMigpK2UucG9zO2UucG9zPGk7KXIuZmxvYXRzLnB1c2goZS5mbG9hdCgpKTtlbHNlIHIuZmxvYXRzLnB1c2goZS5mbG9hdCgpKTticmVhaztjYXNlIDg6aWYoci5pbnRzJiZyLmludHMubGVuZ3RofHwoci5pbnRzPVtdKSwyPT0oNyZvKSlmb3IoaT1lLnVpbnQzMigpK2UucG9zO2UucG9zPGk7KXIuaW50cy5wdXNoKGUuaW50NjQoKSk7ZWxzZSByLmludHMucHVzaChlLmludDY0KCkpO2JyZWFrO2Nhc2UgOTpyLnN0cmluZ3MmJnIuc3RyaW5ncy5sZW5ndGh8fChyLnN0cmluZ3M9W10pLHIuc3RyaW5ncy5wdXNoKGUuYnl0ZXMoKSk7YnJlYWs7Y2FzZSAxMDpyLnRlbnNvcnMmJnIudGVuc29ycy5sZW5ndGh8fChyLnRlbnNvcnM9W10pLHIudGVuc29ycy5wdXNoKGMub25ueC5UZW5zb3JQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAxMTpyLmdyYXBocyYmci5ncmFwaHMubGVuZ3RofHwoci5ncmFwaHM9W10pLHIuZ3JhcGhzLnB1c2goYy5vbm54LkdyYXBoUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMjM6ci5zcGFyc2VUZW5zb3JzJiZyLnNwYXJzZVRlbnNvcnMubGVuZ3RofHwoci5zcGFyc2VUZW5zb3JzPVtdKSxyLnNwYXJzZVRlbnNvcnMucHVzaChjLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTU6ci50eXBlUHJvdG9zJiZyLnR5cGVQcm90b3MubGVuZ3RofHwoci50eXBlUHJvdG9zPVtdKSxyLnR5cGVQcm90b3MucHVzaChjLm9ubnguVHlwZVByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmIWwuaXNTdHJpbmcoZS5uYW1lKSlyZXR1cm4gIm5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5yZWZBdHRyTmFtZSYmZS5oYXNPd25Qcm9wZXJ0eSgicmVmQXR0ck5hbWUiKSYmIWwuaXNTdHJpbmcoZS5yZWZBdHRyTmFtZSkpcmV0dXJuICJyZWZBdHRyTmFtZTogc3RyaW5nIGV4cGVjdGVkIjtpZihudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJiFsLmlzU3RyaW5nKGUuZG9jU3RyaW5nKSlyZXR1cm4gImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjtpZihudWxsIT1lLnR5cGUmJmUuaGFzT3duUHJvcGVydHkoInR5cGUiKSlzd2l0Y2goZS50eXBlKXtkZWZhdWx0OnJldHVybiAidHlwZTogZW51bSB2YWx1ZSBleHBlY3RlZCI7Y2FzZSAwOmNhc2UgMTpjYXNlIDI6Y2FzZSAzOmNhc2UgNDpjYXNlIDU6Y2FzZSAxMTpjYXNlIDEzOmNhc2UgNjpjYXNlIDc6Y2FzZSA4OmNhc2UgOTpjYXNlIDEwOmNhc2UgMTI6Y2FzZSAxNDp9aWYobnVsbCE9ZS5mJiZlLmhhc093blByb3BlcnR5KCJmIikmJiJudW1iZXIiIT10eXBlb2YgZS5mKXJldHVybiAiZjogbnVtYmVyIGV4cGVjdGVkIjtpZihudWxsIT1lLmkmJmUuaGFzT3duUHJvcGVydHkoImkiKSYmIShsLmlzSW50ZWdlcihlLmkpfHxlLmkmJmwuaXNJbnRlZ2VyKGUuaS5sb3cpJiZsLmlzSW50ZWdlcihlLmkuaGlnaCkpKXJldHVybiAiaTogaW50ZWdlcnxMb25nIGV4cGVjdGVkIjtpZihudWxsIT1lLnMmJmUuaGFzT3duUHJvcGVydHkoInMiKSYmIShlLnMmJiJudW1iZXIiPT10eXBlb2YgZS5zLmxlbmd0aHx8bC5pc1N0cmluZyhlLnMpKSlyZXR1cm4gInM6IGJ1ZmZlciBleHBlY3RlZCI7aWYobnVsbCE9ZS50JiZlLmhhc093blByb3BlcnR5KCJ0IikmJihuPWMub25ueC5UZW5zb3JQcm90by52ZXJpZnkoZS50KSkpcmV0dXJuICJ0LiIrbjtpZihudWxsIT1lLmcmJmUuaGFzT3duUHJvcGVydHkoImciKSYmKG49Yy5vbm54LkdyYXBoUHJvdG8udmVyaWZ5KGUuZykpKXJldHVybiAiZy4iK247aWYobnVsbCE9ZS5zcGFyc2VUZW5zb3ImJmUuaGFzT3duUHJvcGVydHkoInNwYXJzZVRlbnNvciIpJiYobj1jLm9ubnguU3BhcnNlVGVuc29yUHJvdG8udmVyaWZ5KGUuc3BhcnNlVGVuc29yKSkpcmV0dXJuICJzcGFyc2VUZW5zb3IuIituO2lmKG51bGwhPWUudHAmJmUuaGFzT3duUHJvcGVydHkoInRwIikmJihuPWMub25ueC5UeXBlUHJvdG8udmVyaWZ5KGUudHApKSlyZXR1cm4gInRwLiIrbjtpZihudWxsIT1lLmZsb2F0cyYmZS5oYXNPd25Qcm9wZXJ0eSgiZmxvYXRzIikpe2lmKCFBcnJheS5pc0FycmF5KGUuZmxvYXRzKSlyZXR1cm4gImZsb2F0czogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgdD0wO3Q8ZS5mbG9hdHMubGVuZ3RoOysrdClpZigibnVtYmVyIiE9dHlwZW9mIGUuZmxvYXRzW3RdKXJldHVybiAiZmxvYXRzOiBudW1iZXJbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS5pbnRzJiZlLmhhc093blByb3BlcnR5KCJpbnRzIikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW50cykpcmV0dXJuICJpbnRzOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuaW50cy5sZW5ndGg7Kyt0KWlmKCEobC5pc0ludGVnZXIoZS5pbnRzW3RdKXx8ZS5pbnRzW3RdJiZsLmlzSW50ZWdlcihlLmludHNbdF0ubG93KSYmbC5pc0ludGVnZXIoZS5pbnRzW3RdLmhpZ2gpKSlyZXR1cm4gImludHM6IGludGVnZXJ8TG9uZ1tdIGV4cGVjdGVkIn1pZihudWxsIT1lLnN0cmluZ3MmJmUuaGFzT3duUHJvcGVydHkoInN0cmluZ3MiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5zdHJpbmdzKSlyZXR1cm4gInN0cmluZ3M6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5zdHJpbmdzLmxlbmd0aDsrK3QpaWYoIShlLnN0cmluZ3NbdF0mJiJudW1iZXIiPT10eXBlb2YgZS5zdHJpbmdzW3RdLmxlbmd0aHx8bC5pc1N0cmluZyhlLnN0cmluZ3NbdF0pKSlyZXR1cm4gInN0cmluZ3M6IGJ1ZmZlcltdIGV4cGVjdGVkIn1pZihudWxsIT1lLnRlbnNvcnMmJmUuaGFzT3duUHJvcGVydHkoInRlbnNvcnMiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS50ZW5zb3JzKSlyZXR1cm4gInRlbnNvcnM6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS50ZW5zb3JzLmxlbmd0aDsrK3QpaWYobj1jLm9ubnguVGVuc29yUHJvdG8udmVyaWZ5KGUudGVuc29yc1t0XSkpcmV0dXJuICJ0ZW5zb3JzLiIrbn1pZihudWxsIT1lLmdyYXBocyYmZS5oYXNPd25Qcm9wZXJ0eSgiZ3JhcGhzIikpe2lmKCFBcnJheS5pc0FycmF5KGUuZ3JhcGhzKSlyZXR1cm4gImdyYXBoczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmdyYXBocy5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LkdyYXBoUHJvdG8udmVyaWZ5KGUuZ3JhcGhzW3RdKSlyZXR1cm4gImdyYXBocy4iK259aWYobnVsbCE9ZS5zcGFyc2VUZW5zb3JzJiZlLmhhc093blByb3BlcnR5KCJzcGFyc2VUZW5zb3JzIikpe2lmKCFBcnJheS5pc0FycmF5KGUuc3BhcnNlVGVuc29ycykpcmV0dXJuICJzcGFyc2VUZW5zb3JzOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuc3BhcnNlVGVuc29ycy5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLnZlcmlmeShlLnNwYXJzZVRlbnNvcnNbdF0pKXJldHVybiAic3BhcnNlVGVuc29ycy4iK259aWYobnVsbCE9ZS50eXBlUHJvdG9zJiZlLmhhc093blByb3BlcnR5KCJ0eXBlUHJvdG9zIikpe2lmKCFBcnJheS5pc0FycmF5KGUudHlwZVByb3RvcykpcmV0dXJuICJ0eXBlUHJvdG9zOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUudHlwZVByb3Rvcy5sZW5ndGg7Kyt0KXt2YXIgbjtpZihuPWMub25ueC5UeXBlUHJvdG8udmVyaWZ5KGUudHlwZVByb3Rvc1t0XSkpcmV0dXJuICJ0eXBlUHJvdG9zLiIrbn19cmV0dXJuIG51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LkF0dHJpYnV0ZVByb3RvKXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguQXR0cmlidXRlUHJvdG87c3dpdGNoKG51bGwhPWUubmFtZSYmKHQubmFtZT1TdHJpbmcoZS5uYW1lKSksbnVsbCE9ZS5yZWZBdHRyTmFtZSYmKHQucmVmQXR0ck5hbWU9U3RyaW5nKGUucmVmQXR0ck5hbWUpKSxudWxsIT1lLmRvY1N0cmluZyYmKHQuZG9jU3RyaW5nPVN0cmluZyhlLmRvY1N0cmluZykpLGUudHlwZSl7ZGVmYXVsdDppZigibnVtYmVyIj09dHlwZW9mIGUudHlwZSl7dC50eXBlPWUudHlwZTticmVha31icmVhaztjYXNlIlVOREVGSU5FRCI6Y2FzZSAwOnQudHlwZT0wO2JyZWFrO2Nhc2UiRkxPQVQiOmNhc2UgMTp0LnR5cGU9MTticmVhaztjYXNlIklOVCI6Y2FzZSAyOnQudHlwZT0yO2JyZWFrO2Nhc2UiU1RSSU5HIjpjYXNlIDM6dC50eXBlPTM7YnJlYWs7Y2FzZSJURU5TT1IiOmNhc2UgNDp0LnR5cGU9NDticmVhaztjYXNlIkdSQVBIIjpjYXNlIDU6dC50eXBlPTU7YnJlYWs7Y2FzZSJTUEFSU0VfVEVOU09SIjpjYXNlIDExOnQudHlwZT0xMTticmVhaztjYXNlIlRZUEVfUFJPVE8iOmNhc2UgMTM6dC50eXBlPTEzO2JyZWFrO2Nhc2UiRkxPQVRTIjpjYXNlIDY6dC50eXBlPTY7YnJlYWs7Y2FzZSJJTlRTIjpjYXNlIDc6dC50eXBlPTc7YnJlYWs7Y2FzZSJTVFJJTkdTIjpjYXNlIDg6dC50eXBlPTg7YnJlYWs7Y2FzZSJURU5TT1JTIjpjYXNlIDk6dC50eXBlPTk7YnJlYWs7Y2FzZSJHUkFQSFMiOmNhc2UgMTA6dC50eXBlPTEwO2JyZWFrO2Nhc2UiU1BBUlNFX1RFTlNPUlMiOmNhc2UgMTI6dC50eXBlPTEyO2JyZWFrO2Nhc2UiVFlQRV9QUk9UT1MiOmNhc2UgMTQ6dC50eXBlPTE0O31pZihudWxsIT1lLmYmJih0LmY9TnVtYmVyKGUuZikpLG51bGwhPWUuaSYmKGwuTG9uZz8odC5pPWwuTG9uZy5mcm9tVmFsdWUoZS5pKSkudW5zaWduZWQ9ITE6InN0cmluZyI9PXR5cGVvZiBlLmk/dC5pPXBhcnNlSW50KGUuaSwxMCk6Im51bWJlciI9PXR5cGVvZiBlLmk/dC5pPWUuaToib2JqZWN0Ij09dHlwZW9mIGUuaSYmKHQuaT1uZXcgbC5Mb25nQml0cyhlLmkubG93Pj4+MCxlLmkuaGlnaD4+PjApLnRvTnVtYmVyKCkpKSxudWxsIT1lLnMmJigic3RyaW5nIj09dHlwZW9mIGUucz9sLmJhc2U2NC5kZWNvZGUoZS5zLHQucz1sLm5ld0J1ZmZlcihsLmJhc2U2NC5sZW5ndGgoZS5zKSksMCk6ZS5zLmxlbmd0aD49MCYmKHQucz1lLnMpKSxudWxsIT1lLnQpe2lmKCJvYmplY3QiIT10eXBlb2YgZS50KXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8udDogb2JqZWN0IGV4cGVjdGVkIik7dC50PWMub25ueC5UZW5zb3JQcm90by5mcm9tT2JqZWN0KGUudCk7fWlmKG51bGwhPWUuZyl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmcpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5nOiBvYmplY3QgZXhwZWN0ZWQiKTt0Lmc9Yy5vbm54LkdyYXBoUHJvdG8uZnJvbU9iamVjdChlLmcpO31pZihudWxsIT1lLnNwYXJzZVRlbnNvcil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnNwYXJzZVRlbnNvcil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnNwYXJzZVRlbnNvcjogb2JqZWN0IGV4cGVjdGVkIik7dC5zcGFyc2VUZW5zb3I9Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLmZyb21PYmplY3QoZS5zcGFyc2VUZW5zb3IpO31pZihudWxsIT1lLnRwKXtpZigib2JqZWN0IiE9dHlwZW9mIGUudHApdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by50cDogb2JqZWN0IGV4cGVjdGVkIik7dC50cD1jLm9ubnguVHlwZVByb3RvLmZyb21PYmplY3QoZS50cCk7fWlmKGUuZmxvYXRzKXtpZighQXJyYXkuaXNBcnJheShlLmZsb2F0cykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5mbG9hdHM6IGFycmF5IGV4cGVjdGVkIik7dC5mbG9hdHM9W107Zm9yKHZhciBuPTA7bjxlLmZsb2F0cy5sZW5ndGg7KytuKXQuZmxvYXRzW25dPU51bWJlcihlLmZsb2F0c1tuXSk7fWlmKGUuaW50cyl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnRzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLmludHM6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuaW50cz1bXSxuPTA7bjxlLmludHMubGVuZ3RoOysrbilsLkxvbmc/KHQuaW50c1tuXT1sLkxvbmcuZnJvbVZhbHVlKGUuaW50c1tuXSkpLnVuc2lnbmVkPSExOiJzdHJpbmciPT10eXBlb2YgZS5pbnRzW25dP3QuaW50c1tuXT1wYXJzZUludChlLmludHNbbl0sMTApOiJudW1iZXIiPT10eXBlb2YgZS5pbnRzW25dP3QuaW50c1tuXT1lLmludHNbbl06Im9iamVjdCI9PXR5cGVvZiBlLmludHNbbl0mJih0LmludHNbbl09bmV3IGwuTG9uZ0JpdHMoZS5pbnRzW25dLmxvdz4+PjAsZS5pbnRzW25dLmhpZ2g+Pj4wKS50b051bWJlcigpKTt9aWYoZS5zdHJpbmdzKXtpZighQXJyYXkuaXNBcnJheShlLnN0cmluZ3MpKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8uc3RyaW5nczogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5zdHJpbmdzPVtdLG49MDtuPGUuc3RyaW5ncy5sZW5ndGg7KytuKSJzdHJpbmciPT10eXBlb2YgZS5zdHJpbmdzW25dP2wuYmFzZTY0LmRlY29kZShlLnN0cmluZ3Nbbl0sdC5zdHJpbmdzW25dPWwubmV3QnVmZmVyKGwuYmFzZTY0Lmxlbmd0aChlLnN0cmluZ3Nbbl0pKSwwKTplLnN0cmluZ3Nbbl0ubGVuZ3RoPj0wJiYodC5zdHJpbmdzW25dPWUuc3RyaW5nc1tuXSk7fWlmKGUudGVuc29ycyl7aWYoIUFycmF5LmlzQXJyYXkoZS50ZW5zb3JzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnRlbnNvcnM6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQudGVuc29ycz1bXSxuPTA7bjxlLnRlbnNvcnMubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnRlbnNvcnNbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by50ZW5zb3JzOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnRlbnNvcnNbbl09Yy5vbm54LlRlbnNvclByb3RvLmZyb21PYmplY3QoZS50ZW5zb3JzW25dKTt9fWlmKGUuZ3JhcGhzKXtpZighQXJyYXkuaXNBcnJheShlLmdyYXBocykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5ncmFwaHM6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuZ3JhcGhzPVtdLG49MDtuPGUuZ3JhcGhzLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5ncmFwaHNbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5BdHRyaWJ1dGVQcm90by5ncmFwaHM6IG9iamVjdCBleHBlY3RlZCIpO3QuZ3JhcGhzW25dPWMub25ueC5HcmFwaFByb3RvLmZyb21PYmplY3QoZS5ncmFwaHNbbl0pO319aWYoZS5zcGFyc2VUZW5zb3JzKXtpZighQXJyYXkuaXNBcnJheShlLnNwYXJzZVRlbnNvcnMpKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8uc3BhcnNlVGVuc29yczogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5zcGFyc2VUZW5zb3JzPVtdLG49MDtuPGUuc3BhcnNlVGVuc29ycy5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuc3BhcnNlVGVuc29yc1tuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnNwYXJzZVRlbnNvcnM6IG9iamVjdCBleHBlY3RlZCIpO3Quc3BhcnNlVGVuc29yc1tuXT1jLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZnJvbU9iamVjdChlLnNwYXJzZVRlbnNvcnNbbl0pO319aWYoZS50eXBlUHJvdG9zKXtpZighQXJyYXkuaXNBcnJheShlLnR5cGVQcm90b3MpKXRocm93IFR5cGVFcnJvcigiLm9ubnguQXR0cmlidXRlUHJvdG8udHlwZVByb3RvczogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC50eXBlUHJvdG9zPVtdLG49MDtuPGUudHlwZVByb3Rvcy5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUudHlwZVByb3Rvc1tuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkF0dHJpYnV0ZVByb3RvLnR5cGVQcm90b3M6IG9iamVjdCBleHBlY3RlZCIpO3QudHlwZVByb3Rvc1tuXT1jLm9ubnguVHlwZVByb3RvLmZyb21PYmplY3QoZS50eXBlUHJvdG9zW25dKTt9fXJldHVybiB0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O2lmKCh0LmFycmF5c3x8dC5kZWZhdWx0cykmJihuLmZsb2F0cz1bXSxuLmludHM9W10sbi5zdHJpbmdzPVtdLG4udGVuc29ycz1bXSxuLmdyYXBocz1bXSxuLnR5cGVQcm90b3M9W10sbi5zcGFyc2VUZW5zb3JzPVtdKSx0LmRlZmF1bHRzKXtpZihuLm5hbWU9IiIsbi5mPTAsbC5Mb25nKXt2YXIgcj1uZXcgbC5Mb25nKDAsMCwhMSk7bi5pPXQubG9uZ3M9PT1TdHJpbmc/ci50b1N0cmluZygpOnQubG9uZ3M9PT1OdW1iZXI/ci50b051bWJlcigpOnI7fWVsc2Ugbi5pPXQubG9uZ3M9PT1TdHJpbmc/IjAiOjA7dC5ieXRlcz09PVN0cmluZz9uLnM9IiI6KG4ucz1bXSx0LmJ5dGVzIT09QXJyYXkmJihuLnM9bC5uZXdCdWZmZXIobi5zKSkpLG4udD1udWxsLG4uZz1udWxsLG4uZG9jU3RyaW5nPSIiLG4udHA9bnVsbCxuLnR5cGU9dC5lbnVtcz09PVN0cmluZz8iVU5ERUZJTkVEIjowLG4ucmVmQXR0ck5hbWU9IiIsbi5zcGFyc2VUZW5zb3I9bnVsbDt9aWYobnVsbCE9ZS5uYW1lJiZlLmhhc093blByb3BlcnR5KCJuYW1lIikmJihuLm5hbWU9ZS5uYW1lKSxudWxsIT1lLmYmJmUuaGFzT3duUHJvcGVydHkoImYiKSYmKG4uZj10Lmpzb24mJiFpc0Zpbml0ZShlLmYpP1N0cmluZyhlLmYpOmUuZiksbnVsbCE9ZS5pJiZlLmhhc093blByb3BlcnR5KCJpIikmJigibnVtYmVyIj09dHlwZW9mIGUuaT9uLmk9dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5pKTplLmk6bi5pPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuaSk6dC5sb25ncz09PU51bWJlcj9uZXcgbC5Mb25nQml0cyhlLmkubG93Pj4+MCxlLmkuaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5pKSxudWxsIT1lLnMmJmUuaGFzT3duUHJvcGVydHkoInMiKSYmKG4ucz10LmJ5dGVzPT09U3RyaW5nP2wuYmFzZTY0LmVuY29kZShlLnMsMCxlLnMubGVuZ3RoKTp0LmJ5dGVzPT09QXJyYXk/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5zKTplLnMpLG51bGwhPWUudCYmZS5oYXNPd25Qcm9wZXJ0eSgidCIpJiYobi50PWMub25ueC5UZW5zb3JQcm90by50b09iamVjdChlLnQsdCkpLG51bGwhPWUuZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZyIpJiYobi5nPWMub25ueC5HcmFwaFByb3RvLnRvT2JqZWN0KGUuZyx0KSksZS5mbG9hdHMmJmUuZmxvYXRzLmxlbmd0aCl7bi5mbG9hdHM9W107Zm9yKHZhciBvPTA7bzxlLmZsb2F0cy5sZW5ndGg7KytvKW4uZmxvYXRzW29dPXQuanNvbiYmIWlzRmluaXRlKGUuZmxvYXRzW29dKT9TdHJpbmcoZS5mbG9hdHNbb10pOmUuZmxvYXRzW29dO31pZihlLmludHMmJmUuaW50cy5sZW5ndGgpZm9yKG4uaW50cz1bXSxvPTA7bzxlLmludHMubGVuZ3RoOysrbykibnVtYmVyIj09dHlwZW9mIGUuaW50c1tvXT9uLmludHNbb109dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5pbnRzW29dKTplLmludHNbb106bi5pbnRzW29dPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuaW50c1tvXSk6dC5sb25ncz09PU51bWJlcj9uZXcgbC5Mb25nQml0cyhlLmludHNbb10ubG93Pj4+MCxlLmludHNbb10uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5pbnRzW29dO2lmKGUuc3RyaW5ncyYmZS5zdHJpbmdzLmxlbmd0aClmb3Iobi5zdHJpbmdzPVtdLG89MDtvPGUuc3RyaW5ncy5sZW5ndGg7KytvKW4uc3RyaW5nc1tvXT10LmJ5dGVzPT09U3RyaW5nP2wuYmFzZTY0LmVuY29kZShlLnN0cmluZ3Nbb10sMCxlLnN0cmluZ3Nbb10ubGVuZ3RoKTp0LmJ5dGVzPT09QXJyYXk/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5zdHJpbmdzW29dKTplLnN0cmluZ3Nbb107aWYoZS50ZW5zb3JzJiZlLnRlbnNvcnMubGVuZ3RoKWZvcihuLnRlbnNvcnM9W10sbz0wO288ZS50ZW5zb3JzLmxlbmd0aDsrK28pbi50ZW5zb3JzW29dPWMub25ueC5UZW5zb3JQcm90by50b09iamVjdChlLnRlbnNvcnNbb10sdCk7aWYoZS5ncmFwaHMmJmUuZ3JhcGhzLmxlbmd0aClmb3Iobi5ncmFwaHM9W10sbz0wO288ZS5ncmFwaHMubGVuZ3RoOysrbyluLmdyYXBoc1tvXT1jLm9ubnguR3JhcGhQcm90by50b09iamVjdChlLmdyYXBoc1tvXSx0KTtpZihudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJihuLmRvY1N0cmluZz1lLmRvY1N0cmluZyksbnVsbCE9ZS50cCYmZS5oYXNPd25Qcm9wZXJ0eSgidHAiKSYmKG4udHA9Yy5vbm54LlR5cGVQcm90by50b09iamVjdChlLnRwLHQpKSxlLnR5cGVQcm90b3MmJmUudHlwZVByb3Rvcy5sZW5ndGgpZm9yKG4udHlwZVByb3Rvcz1bXSxvPTA7bzxlLnR5cGVQcm90b3MubGVuZ3RoOysrbyluLnR5cGVQcm90b3Nbb109Yy5vbm54LlR5cGVQcm90by50b09iamVjdChlLnR5cGVQcm90b3Nbb10sdCk7aWYobnVsbCE9ZS50eXBlJiZlLmhhc093blByb3BlcnR5KCJ0eXBlIikmJihuLnR5cGU9dC5lbnVtcz09PVN0cmluZz92b2lkIDA9PT1jLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZVtlLnR5cGVdP2UudHlwZTpjLm9ubnguQXR0cmlidXRlUHJvdG8uQXR0cmlidXRlVHlwZVtlLnR5cGVdOmUudHlwZSksbnVsbCE9ZS5yZWZBdHRyTmFtZSYmZS5oYXNPd25Qcm9wZXJ0eSgicmVmQXR0ck5hbWUiKSYmKG4ucmVmQXR0ck5hbWU9ZS5yZWZBdHRyTmFtZSksbnVsbCE9ZS5zcGFyc2VUZW5zb3ImJmUuaGFzT3duUHJvcGVydHkoInNwYXJzZVRlbnNvciIpJiYobi5zcGFyc2VUZW5zb3I9Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLnRvT2JqZWN0KGUuc3BhcnNlVGVuc29yLHQpKSxlLnNwYXJzZVRlbnNvcnMmJmUuc3BhcnNlVGVuc29ycy5sZW5ndGgpZm9yKG4uc3BhcnNlVGVuc29ycz1bXSxvPTA7bzxlLnNwYXJzZVRlbnNvcnMubGVuZ3RoOysrbyluLnNwYXJzZVRlbnNvcnNbb109Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLnRvT2JqZWN0KGUuc3BhcnNlVGVuc29yc1tvXSx0KTtyZXR1cm4gbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5BdHRyaWJ1dGVQcm90byJ9LGUuQXR0cmlidXRlVHlwZT1mdW5jdGlvbigpe3ZhciBlPXt9LHQ9T2JqZWN0LmNyZWF0ZShlKTtyZXR1cm4gdFtlWzBdPSJVTkRFRklORUQiXT0wLHRbZVsxXT0iRkxPQVQiXT0xLHRbZVsyXT0iSU5UIl09Mix0W2VbM109IlNUUklORyJdPTMsdFtlWzRdPSJURU5TT1IiXT00LHRbZVs1XT0iR1JBUEgiXT01LHRbZVsxMV09IlNQQVJTRV9URU5TT1IiXT0xMSx0W2VbMTNdPSJUWVBFX1BST1RPIl09MTMsdFtlWzZdPSJGTE9BVFMiXT02LHRbZVs3XT0iSU5UUyJdPTcsdFtlWzhdPSJTVFJJTkdTIl09OCx0W2VbOV09IlRFTlNPUlMiXT05LHRbZVsxMF09IkdSQVBIUyJdPTEwLHRbZVsxMl09IlNQQVJTRV9URU5TT1JTIl09MTIsdFtlWzE0XT0iVFlQRV9QUk9UT1MiXT0xNCx0fSgpLGV9KCksaS5WYWx1ZUluZm9Qcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUubmFtZT0iIixlLnByb3RvdHlwZS50eXBlPW51bGwsZS5wcm90b3R5cGUuZG9jU3RyaW5nPSIiLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5uYW1lJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJuYW1lIikmJnQudWludDMyKDEwKS5zdHJpbmcoZS5uYW1lKSxudWxsIT1lLnR5cGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInR5cGUiKSYmYy5vbm54LlR5cGVQcm90by5lbmNvZGUoZS50eXBlLHQudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuZG9jU3RyaW5nJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb2NTdHJpbmciKSYmdC51aW50MzIoMjYpLnN0cmluZyhlLmRvY1N0cmluZyksdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlZhbHVlSW5mb1Byb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIubmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMjpyLnR5cGU9Yy5vbm54LlR5cGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDM6ci5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmIWwuaXNTdHJpbmcoZS5uYW1lKSlyZXR1cm4gIm5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS50eXBlJiZlLmhhc093blByb3BlcnR5KCJ0eXBlIikpe3ZhciB0PWMub25ueC5UeXBlUHJvdG8udmVyaWZ5KGUudHlwZSk7aWYodClyZXR1cm4gInR5cGUuIit0fXJldHVybiBudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJiFsLmlzU3RyaW5nKGUuZG9jU3RyaW5nKT8iZG9jU3RyaW5nOiBzdHJpbmcgZXhwZWN0ZWQiOm51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlZhbHVlSW5mb1Byb3RvKXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguVmFsdWVJbmZvUHJvdG87aWYobnVsbCE9ZS5uYW1lJiYodC5uYW1lPVN0cmluZyhlLm5hbWUpKSxudWxsIT1lLnR5cGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZS50eXBlKXRocm93IFR5cGVFcnJvcigiLm9ubnguVmFsdWVJbmZvUHJvdG8udHlwZTogb2JqZWN0IGV4cGVjdGVkIik7dC50eXBlPWMub25ueC5UeXBlUHJvdG8uZnJvbU9iamVjdChlLnR5cGUpO31yZXR1cm4gbnVsbCE9ZS5kb2NTdHJpbmcmJih0LmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSx0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O3JldHVybiB0LmRlZmF1bHRzJiYobi5uYW1lPSIiLG4udHlwZT1udWxsLG4uZG9jU3RyaW5nPSIiKSxudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmKG4ubmFtZT1lLm5hbWUpLG51bGwhPWUudHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgidHlwZSIpJiYobi50eXBlPWMub25ueC5UeXBlUHJvdG8udG9PYmplY3QoZS50eXBlLHQpKSxudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJihuLmRvY1N0cmluZz1lLmRvY1N0cmluZyksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5WYWx1ZUluZm9Qcm90byJ9LGV9KCksaS5Ob2RlUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuaW5wdXQ9W10sdGhpcy5vdXRwdXQ9W10sdGhpcy5hdHRyaWJ1dGU9W10sZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUuaW5wdXQ9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLm91dHB1dD1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUubmFtZT0iIixlLnByb3RvdHlwZS5vcFR5cGU9IiIsZS5wcm90b3R5cGUuZG9tYWluPSIiLGUucHJvdG90eXBlLmF0dHJpYnV0ZT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuZG9jU3RyaW5nPSIiLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtpZih0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmlucHV0JiZlLmlucHV0Lmxlbmd0aClmb3IodmFyIG49MDtuPGUuaW5wdXQubGVuZ3RoOysrbil0LnVpbnQzMigxMCkuc3RyaW5nKGUuaW5wdXRbbl0pO2lmKG51bGwhPWUub3V0cHV0JiZlLm91dHB1dC5sZW5ndGgpZm9yKG49MDtuPGUub3V0cHV0Lmxlbmd0aDsrK24pdC51aW50MzIoMTgpLnN0cmluZyhlLm91dHB1dFtuXSk7aWYobnVsbCE9ZS5uYW1lJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJuYW1lIikmJnQudWludDMyKDI2KS5zdHJpbmcoZS5uYW1lKSxudWxsIT1lLm9wVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwib3BUeXBlIikmJnQudWludDMyKDM0KS5zdHJpbmcoZS5vcFR5cGUpLG51bGwhPWUuYXR0cmlidXRlJiZlLmF0dHJpYnV0ZS5sZW5ndGgpZm9yKG49MDtuPGUuYXR0cmlidXRlLmxlbmd0aDsrK24pYy5vbm54LkF0dHJpYnV0ZVByb3RvLmVuY29kZShlLmF0dHJpYnV0ZVtuXSx0LnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gbnVsbCE9ZS5kb2NTdHJpbmcmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvY1N0cmluZyIpJiZ0LnVpbnQzMig1MCkuc3RyaW5nKGUuZG9jU3RyaW5nKSxudWxsIT1lLmRvbWFpbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZG9tYWluIikmJnQudWludDMyKDU4KS5zdHJpbmcoZS5kb21haW4pLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5Ob2RlUHJvdG87ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci5pbnB1dCYmci5pbnB1dC5sZW5ndGh8fChyLmlucHV0PVtdKSxyLmlucHV0LnB1c2goZS5zdHJpbmcoKSk7YnJlYWs7Y2FzZSAyOnIub3V0cHV0JiZyLm91dHB1dC5sZW5ndGh8fChyLm91dHB1dD1bXSksci5vdXRwdXQucHVzaChlLnN0cmluZygpKTticmVhaztjYXNlIDM6ci5uYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA0OnIub3BUeXBlPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA3OnIuZG9tYWluPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA1OnIuYXR0cmlidXRlJiZyLmF0dHJpYnV0ZS5sZW5ndGh8fChyLmF0dHJpYnV0ZT1bXSksci5hdHRyaWJ1dGUucHVzaChjLm9ubnguQXR0cmlidXRlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgNjpyLmRvY1N0cmluZz1lLnN0cmluZygpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO2lmKG51bGwhPWUuaW5wdXQmJmUuaGFzT3duUHJvcGVydHkoImlucHV0Iikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5wdXQpKXJldHVybiAiaW5wdXQ6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHQ9MDt0PGUuaW5wdXQubGVuZ3RoOysrdClpZighbC5pc1N0cmluZyhlLmlucHV0W3RdKSlyZXR1cm4gImlucHV0OiBzdHJpbmdbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS5vdXRwdXQmJmUuaGFzT3duUHJvcGVydHkoIm91dHB1dCIpKXtpZighQXJyYXkuaXNBcnJheShlLm91dHB1dCkpcmV0dXJuICJvdXRwdXQ6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5vdXRwdXQubGVuZ3RoOysrdClpZighbC5pc1N0cmluZyhlLm91dHB1dFt0XSkpcmV0dXJuICJvdXRwdXQ6IHN0cmluZ1tdIGV4cGVjdGVkIn1pZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmIWwuaXNTdHJpbmcoZS5uYW1lKSlyZXR1cm4gIm5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5vcFR5cGUmJmUuaGFzT3duUHJvcGVydHkoIm9wVHlwZSIpJiYhbC5pc1N0cmluZyhlLm9wVHlwZSkpcmV0dXJuICJvcFR5cGU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5kb21haW4mJmUuaGFzT3duUHJvcGVydHkoImRvbWFpbiIpJiYhbC5pc1N0cmluZyhlLmRvbWFpbikpcmV0dXJuICJkb21haW46IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5hdHRyaWJ1dGUmJmUuaGFzT3duUHJvcGVydHkoImF0dHJpYnV0ZSIpKXtpZighQXJyYXkuaXNBcnJheShlLmF0dHJpYnV0ZSkpcmV0dXJuICJhdHRyaWJ1dGU6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5hdHRyaWJ1dGUubGVuZ3RoOysrdCl7dmFyIG49Yy5vbm54LkF0dHJpYnV0ZVByb3RvLnZlcmlmeShlLmF0dHJpYnV0ZVt0XSk7aWYobilyZXR1cm4gImF0dHJpYnV0ZS4iK259fXJldHVybiBudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJiFsLmlzU3RyaW5nKGUuZG9jU3RyaW5nKT8iZG9jU3RyaW5nOiBzdHJpbmcgZXhwZWN0ZWQiOm51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54Lk5vZGVQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54Lk5vZGVQcm90bztpZihlLmlucHV0KXtpZighQXJyYXkuaXNBcnJheShlLmlucHV0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk5vZGVQcm90by5pbnB1dDogYXJyYXkgZXhwZWN0ZWQiKTt0LmlucHV0PVtdO2Zvcih2YXIgbj0wO248ZS5pbnB1dC5sZW5ndGg7KytuKXQuaW5wdXRbbl09U3RyaW5nKGUuaW5wdXRbbl0pO31pZihlLm91dHB1dCl7aWYoIUFycmF5LmlzQXJyYXkoZS5vdXRwdXQpKXRocm93IFR5cGVFcnJvcigiLm9ubnguTm9kZVByb3RvLm91dHB1dDogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5vdXRwdXQ9W10sbj0wO248ZS5vdXRwdXQubGVuZ3RoOysrbil0Lm91dHB1dFtuXT1TdHJpbmcoZS5vdXRwdXRbbl0pO31pZihudWxsIT1lLm5hbWUmJih0Lm5hbWU9U3RyaW5nKGUubmFtZSkpLG51bGwhPWUub3BUeXBlJiYodC5vcFR5cGU9U3RyaW5nKGUub3BUeXBlKSksbnVsbCE9ZS5kb21haW4mJih0LmRvbWFpbj1TdHJpbmcoZS5kb21haW4pKSxlLmF0dHJpYnV0ZSl7aWYoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGUpKXRocm93IFR5cGVFcnJvcigiLm9ubnguTm9kZVByb3RvLmF0dHJpYnV0ZTogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5hdHRyaWJ1dGU9W10sbj0wO248ZS5hdHRyaWJ1dGUubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmF0dHJpYnV0ZVtuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk5vZGVQcm90by5hdHRyaWJ1dGU6IG9iamVjdCBleHBlY3RlZCIpO3QuYXR0cmlidXRlW25dPWMub25ueC5BdHRyaWJ1dGVQcm90by5mcm9tT2JqZWN0KGUuYXR0cmlidXRlW25dKTt9fXJldHVybiBudWxsIT1lLmRvY1N0cmluZyYmKHQuZG9jU3RyaW5nPVN0cmluZyhlLmRvY1N0cmluZykpLHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYoKHQuYXJyYXlzfHx0LmRlZmF1bHRzKSYmKG4uaW5wdXQ9W10sbi5vdXRwdXQ9W10sbi5hdHRyaWJ1dGU9W10pLHQuZGVmYXVsdHMmJihuLm5hbWU9IiIsbi5vcFR5cGU9IiIsbi5kb2NTdHJpbmc9IiIsbi5kb21haW49IiIpLGUuaW5wdXQmJmUuaW5wdXQubGVuZ3RoKXtuLmlucHV0PVtdO2Zvcih2YXIgcj0wO3I8ZS5pbnB1dC5sZW5ndGg7KytyKW4uaW5wdXRbcl09ZS5pbnB1dFtyXTt9aWYoZS5vdXRwdXQmJmUub3V0cHV0Lmxlbmd0aClmb3Iobi5vdXRwdXQ9W10scj0wO3I8ZS5vdXRwdXQubGVuZ3RoOysrciluLm91dHB1dFtyXT1lLm91dHB1dFtyXTtpZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmKG4ubmFtZT1lLm5hbWUpLG51bGwhPWUub3BUeXBlJiZlLmhhc093blByb3BlcnR5KCJvcFR5cGUiKSYmKG4ub3BUeXBlPWUub3BUeXBlKSxlLmF0dHJpYnV0ZSYmZS5hdHRyaWJ1dGUubGVuZ3RoKWZvcihuLmF0dHJpYnV0ZT1bXSxyPTA7cjxlLmF0dHJpYnV0ZS5sZW5ndGg7KytyKW4uYXR0cmlidXRlW3JdPWMub25ueC5BdHRyaWJ1dGVQcm90by50b09iamVjdChlLmF0dHJpYnV0ZVtyXSx0KTtyZXR1cm4gbnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYobi5kb2NTdHJpbmc9ZS5kb2NTdHJpbmcpLG51bGwhPWUuZG9tYWluJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmKG4uZG9tYWluPWUuZG9tYWluKSxufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54Lk5vZGVQcm90byJ9LGV9KCksaS5UcmFpbmluZ0luZm9Qcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5pbml0aWFsaXphdGlvbkJpbmRpbmc9W10sdGhpcy51cGRhdGVCaW5kaW5nPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmluaXRpYWxpemF0aW9uPW51bGwsZS5wcm90b3R5cGUuYWxnb3JpdGhtPW51bGwsZS5wcm90b3R5cGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS51cGRhdGVCaW5kaW5nPWwuZW1wdHlBcnJheSxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7aWYodHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5pbml0aWFsaXphdGlvbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiaW5pdGlhbGl6YXRpb24iKSYmYy5vbm54LkdyYXBoUHJvdG8uZW5jb2RlKGUuaW5pdGlhbGl6YXRpb24sdC51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS5hbGdvcml0aG0mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImFsZ29yaXRobSIpJiZjLm9ubnguR3JhcGhQcm90by5lbmNvZGUoZS5hbGdvcml0aG0sdC51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS5pbml0aWFsaXphdGlvbkJpbmRpbmcmJmUuaW5pdGlhbGl6YXRpb25CaW5kaW5nLmxlbmd0aClmb3IodmFyIG49MDtuPGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nLmxlbmd0aDsrK24pYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZW5jb2RlKGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nW25dLHQudWludDMyKDI2KS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUudXBkYXRlQmluZGluZyYmZS51cGRhdGVCaW5kaW5nLmxlbmd0aClmb3Iobj0wO248ZS51cGRhdGVCaW5kaW5nLmxlbmd0aDsrK24pYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZW5jb2RlKGUudXBkYXRlQmluZGluZ1tuXSx0LnVpbnQzMigzNCkuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlRyYWluaW5nSW5mb1Byb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIuaW5pdGlhbGl6YXRpb249Yy5vbm54LkdyYXBoUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSAyOnIuYWxnb3JpdGhtPWMub25ueC5HcmFwaFByb3RvLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgMzpyLmluaXRpYWxpemF0aW9uQmluZGluZyYmci5pbml0aWFsaXphdGlvbkJpbmRpbmcubGVuZ3RofHwoci5pbml0aWFsaXphdGlvbkJpbmRpbmc9W10pLHIuaW5pdGlhbGl6YXRpb25CaW5kaW5nLnB1c2goYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgNDpyLnVwZGF0ZUJpbmRpbmcmJnIudXBkYXRlQmluZGluZy5sZW5ndGh8fChyLnVwZGF0ZUJpbmRpbmc9W10pLHIudXBkYXRlQmluZGluZy5wdXNoKGMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLmluaXRpYWxpemF0aW9uJiZlLmhhc093blByb3BlcnR5KCJpbml0aWFsaXphdGlvbiIpJiYobj1jLm9ubnguR3JhcGhQcm90by52ZXJpZnkoZS5pbml0aWFsaXphdGlvbikpKXJldHVybiAiaW5pdGlhbGl6YXRpb24uIituO2lmKG51bGwhPWUuYWxnb3JpdGhtJiZlLmhhc093blByb3BlcnR5KCJhbGdvcml0aG0iKSYmKG49Yy5vbm54LkdyYXBoUHJvdG8udmVyaWZ5KGUuYWxnb3JpdGhtKSkpcmV0dXJuICJhbGdvcml0aG0uIituO2lmKG51bGwhPWUuaW5pdGlhbGl6YXRpb25CaW5kaW5nJiZlLmhhc093blByb3BlcnR5KCJpbml0aWFsaXphdGlvbkJpbmRpbmciKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbml0aWFsaXphdGlvbkJpbmRpbmcpKXJldHVybiAiaW5pdGlhbGl6YXRpb25CaW5kaW5nOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciB0PTA7dDxlLmluaXRpYWxpemF0aW9uQmluZGluZy5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udmVyaWZ5KGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nW3RdKSlyZXR1cm4gImluaXRpYWxpemF0aW9uQmluZGluZy4iK259aWYobnVsbCE9ZS51cGRhdGVCaW5kaW5nJiZlLmhhc093blByb3BlcnR5KCJ1cGRhdGVCaW5kaW5nIikpe2lmKCFBcnJheS5pc0FycmF5KGUudXBkYXRlQmluZGluZykpcmV0dXJuICJ1cGRhdGVCaW5kaW5nOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUudXBkYXRlQmluZGluZy5sZW5ndGg7Kyt0KXt2YXIgbjtpZihuPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnZlcmlmeShlLnVwZGF0ZUJpbmRpbmdbdF0pKXJldHVybiAidXBkYXRlQmluZGluZy4iK259fXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UcmFpbmluZ0luZm9Qcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlRyYWluaW5nSW5mb1Byb3RvO2lmKG51bGwhPWUuaW5pdGlhbGl6YXRpb24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5pbml0aWFsaXphdGlvbil0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRyYWluaW5nSW5mb1Byb3RvLmluaXRpYWxpemF0aW9uOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmluaXRpYWxpemF0aW9uPWMub25ueC5HcmFwaFByb3RvLmZyb21PYmplY3QoZS5pbml0aWFsaXphdGlvbik7fWlmKG51bGwhPWUuYWxnb3JpdGhtKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuYWxnb3JpdGhtKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8uYWxnb3JpdGhtOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmFsZ29yaXRobT1jLm9ubnguR3JhcGhQcm90by5mcm9tT2JqZWN0KGUuYWxnb3JpdGhtKTt9aWYoZS5pbml0aWFsaXphdGlvbkJpbmRpbmcpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRyYWluaW5nSW5mb1Byb3RvLmluaXRpYWxpemF0aW9uQmluZGluZzogYXJyYXkgZXhwZWN0ZWQiKTt0LmluaXRpYWxpemF0aW9uQmluZGluZz1bXTtmb3IodmFyIG49MDtuPGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5pbml0aWFsaXphdGlvbkJpbmRpbmdbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5UcmFpbmluZ0luZm9Qcm90by5pbml0aWFsaXphdGlvbkJpbmRpbmc6IG9iamVjdCBleHBlY3RlZCIpO3QuaW5pdGlhbGl6YXRpb25CaW5kaW5nW25dPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmZyb21PYmplY3QoZS5pbml0aWFsaXphdGlvbkJpbmRpbmdbbl0pO319aWYoZS51cGRhdGVCaW5kaW5nKXtpZighQXJyYXkuaXNBcnJheShlLnVwZGF0ZUJpbmRpbmcpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8udXBkYXRlQmluZGluZzogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC51cGRhdGVCaW5kaW5nPVtdLG49MDtuPGUudXBkYXRlQmluZGluZy5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUudXBkYXRlQmluZGluZ1tuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRyYWluaW5nSW5mb1Byb3RvLnVwZGF0ZUJpbmRpbmc6IG9iamVjdCBleHBlY3RlZCIpO3QudXBkYXRlQmluZGluZ1tuXT1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5mcm9tT2JqZWN0KGUudXBkYXRlQmluZGluZ1tuXSk7fX1yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5pbml0aWFsaXphdGlvbkJpbmRpbmc9W10sbi51cGRhdGVCaW5kaW5nPVtdKSx0LmRlZmF1bHRzJiYobi5pbml0aWFsaXphdGlvbj1udWxsLG4uYWxnb3JpdGhtPW51bGwpLG51bGwhPWUuaW5pdGlhbGl6YXRpb24mJmUuaGFzT3duUHJvcGVydHkoImluaXRpYWxpemF0aW9uIikmJihuLmluaXRpYWxpemF0aW9uPWMub25ueC5HcmFwaFByb3RvLnRvT2JqZWN0KGUuaW5pdGlhbGl6YXRpb24sdCkpLG51bGwhPWUuYWxnb3JpdGhtJiZlLmhhc093blByb3BlcnR5KCJhbGdvcml0aG0iKSYmKG4uYWxnb3JpdGhtPWMub25ueC5HcmFwaFByb3RvLnRvT2JqZWN0KGUuYWxnb3JpdGhtLHQpKSxlLmluaXRpYWxpemF0aW9uQmluZGluZyYmZS5pbml0aWFsaXphdGlvbkJpbmRpbmcubGVuZ3RoKXtuLmluaXRpYWxpemF0aW9uQmluZGluZz1bXTtmb3IodmFyIHI9MDtyPGUuaW5pdGlhbGl6YXRpb25CaW5kaW5nLmxlbmd0aDsrK3Ipbi5pbml0aWFsaXphdGlvbkJpbmRpbmdbcl09Yy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udG9PYmplY3QoZS5pbml0aWFsaXphdGlvbkJpbmRpbmdbcl0sdCk7fWlmKGUudXBkYXRlQmluZGluZyYmZS51cGRhdGVCaW5kaW5nLmxlbmd0aClmb3Iobi51cGRhdGVCaW5kaW5nPVtdLHI9MDtyPGUudXBkYXRlQmluZGluZy5sZW5ndGg7KytyKW4udXBkYXRlQmluZGluZ1tyXT1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by50b09iamVjdChlLnVwZGF0ZUJpbmRpbmdbcl0sdCk7cmV0dXJuIG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVHJhaW5pbmdJbmZvUHJvdG8ifSxlfSgpLGkuTW9kZWxQcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5vcHNldEltcG9ydD1bXSx0aGlzLm1ldGFkYXRhUHJvcHM9W10sdGhpcy50cmFpbmluZ0luZm89W10sdGhpcy5mdW5jdGlvbnM9W10sZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUuaXJWZXJzaW9uPWwuTG9uZz9sLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLGUucHJvdG90eXBlLm9wc2V0SW1wb3J0PWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5wcm9kdWNlck5hbWU9IiIsZS5wcm90b3R5cGUucHJvZHVjZXJWZXJzaW9uPSIiLGUucHJvdG90eXBlLmRvbWFpbj0iIixlLnByb3RvdHlwZS5tb2RlbFZlcnNpb249bC5Mb25nP2wuTG9uZy5mcm9tQml0cygwLDAsITEpOjAsZS5wcm90b3R5cGUuZG9jU3RyaW5nPSIiLGUucHJvdG90eXBlLmdyYXBoPW51bGwsZS5wcm90b3R5cGUubWV0YWRhdGFQcm9wcz1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUudHJhaW5pbmdJbmZvPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5mdW5jdGlvbnM9bC5lbXB0eUFycmF5LGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtpZih0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmlyVmVyc2lvbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiaXJWZXJzaW9uIikmJnQudWludDMyKDgpLmludDY0KGUuaXJWZXJzaW9uKSxudWxsIT1lLnByb2R1Y2VyTmFtZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwicHJvZHVjZXJOYW1lIikmJnQudWludDMyKDE4KS5zdHJpbmcoZS5wcm9kdWNlck5hbWUpLG51bGwhPWUucHJvZHVjZXJWZXJzaW9uJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJwcm9kdWNlclZlcnNpb24iKSYmdC51aW50MzIoMjYpLnN0cmluZyhlLnByb2R1Y2VyVmVyc2lvbiksbnVsbCE9ZS5kb21haW4mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvbWFpbiIpJiZ0LnVpbnQzMigzNCkuc3RyaW5nKGUuZG9tYWluKSxudWxsIT1lLm1vZGVsVmVyc2lvbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwibW9kZWxWZXJzaW9uIikmJnQudWludDMyKDQwKS5pbnQ2NChlLm1vZGVsVmVyc2lvbiksbnVsbCE9ZS5kb2NTdHJpbmcmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvY1N0cmluZyIpJiZ0LnVpbnQzMig1MCkuc3RyaW5nKGUuZG9jU3RyaW5nKSxudWxsIT1lLmdyYXBoJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJncmFwaCIpJiZjLm9ubnguR3JhcGhQcm90by5lbmNvZGUoZS5ncmFwaCx0LnVpbnQzMig1OCkuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLm9wc2V0SW1wb3J0JiZlLm9wc2V0SW1wb3J0Lmxlbmd0aClmb3IodmFyIG49MDtuPGUub3BzZXRJbXBvcnQubGVuZ3RoOysrbiljLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLmVuY29kZShlLm9wc2V0SW1wb3J0W25dLHQudWludDMyKDY2KS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUubWV0YWRhdGFQcm9wcyYmZS5tZXRhZGF0YVByb3BzLmxlbmd0aClmb3Iobj0wO248ZS5tZXRhZGF0YVByb3BzLmxlbmd0aDsrK24pYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZW5jb2RlKGUubWV0YWRhdGFQcm9wc1tuXSx0LnVpbnQzMigxMTQpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS50cmFpbmluZ0luZm8mJmUudHJhaW5pbmdJbmZvLmxlbmd0aClmb3Iobj0wO248ZS50cmFpbmluZ0luZm8ubGVuZ3RoOysrbiljLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8uZW5jb2RlKGUudHJhaW5pbmdJbmZvW25dLHQudWludDMyKDE2MikuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLmZ1bmN0aW9ucyYmZS5mdW5jdGlvbnMubGVuZ3RoKWZvcihuPTA7bjxlLmZ1bmN0aW9ucy5sZW5ndGg7KytuKWMub25ueC5GdW5jdGlvblByb3RvLmVuY29kZShlLmZ1bmN0aW9uc1tuXSx0LnVpbnQzMigyMDIpLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5Nb2RlbFByb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIuaXJWZXJzaW9uPWUuaW50NjQoKTticmVhaztjYXNlIDg6ci5vcHNldEltcG9ydCYmci5vcHNldEltcG9ydC5sZW5ndGh8fChyLm9wc2V0SW1wb3J0PVtdKSxyLm9wc2V0SW1wb3J0LnB1c2goYy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAyOnIucHJvZHVjZXJOYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAzOnIucHJvZHVjZXJWZXJzaW9uPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA0OnIuZG9tYWluPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA1OnIubW9kZWxWZXJzaW9uPWUuaW50NjQoKTticmVhaztjYXNlIDY6ci5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVhaztjYXNlIDc6ci5ncmFwaD1jLm9ubnguR3JhcGhQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDE0OnIubWV0YWRhdGFQcm9wcyYmci5tZXRhZGF0YVByb3BzLmxlbmd0aHx8KHIubWV0YWRhdGFQcm9wcz1bXSksci5tZXRhZGF0YVByb3BzLnB1c2goYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMjA6ci50cmFpbmluZ0luZm8mJnIudHJhaW5pbmdJbmZvLmxlbmd0aHx8KHIudHJhaW5pbmdJbmZvPVtdKSxyLnRyYWluaW5nSW5mby5wdXNoKGMub25ueC5UcmFpbmluZ0luZm9Qcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAyNTpyLmZ1bmN0aW9ucyYmci5mdW5jdGlvbnMubGVuZ3RofHwoci5mdW5jdGlvbnM9W10pLHIuZnVuY3Rpb25zLnB1c2goYy5vbm54LkZ1bmN0aW9uUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO2lmKG51bGwhPWUuaXJWZXJzaW9uJiZlLmhhc093blByb3BlcnR5KCJpclZlcnNpb24iKSYmIShsLmlzSW50ZWdlcihlLmlyVmVyc2lvbil8fGUuaXJWZXJzaW9uJiZsLmlzSW50ZWdlcihlLmlyVmVyc2lvbi5sb3cpJiZsLmlzSW50ZWdlcihlLmlyVmVyc2lvbi5oaWdoKSkpcmV0dXJuICJpclZlcnNpb246IGludGVnZXJ8TG9uZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5vcHNldEltcG9ydCYmZS5oYXNPd25Qcm9wZXJ0eSgib3BzZXRJbXBvcnQiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5vcHNldEltcG9ydCkpcmV0dXJuICJvcHNldEltcG9ydDogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgdD0wO3Q8ZS5vcHNldEltcG9ydC5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by52ZXJpZnkoZS5vcHNldEltcG9ydFt0XSkpcmV0dXJuICJvcHNldEltcG9ydC4iK259aWYobnVsbCE9ZS5wcm9kdWNlck5hbWUmJmUuaGFzT3duUHJvcGVydHkoInByb2R1Y2VyTmFtZSIpJiYhbC5pc1N0cmluZyhlLnByb2R1Y2VyTmFtZSkpcmV0dXJuICJwcm9kdWNlck5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5wcm9kdWNlclZlcnNpb24mJmUuaGFzT3duUHJvcGVydHkoInByb2R1Y2VyVmVyc2lvbiIpJiYhbC5pc1N0cmluZyhlLnByb2R1Y2VyVmVyc2lvbikpcmV0dXJuICJwcm9kdWNlclZlcnNpb246IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5kb21haW4mJmUuaGFzT3duUHJvcGVydHkoImRvbWFpbiIpJiYhbC5pc1N0cmluZyhlLmRvbWFpbikpcmV0dXJuICJkb21haW46IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5tb2RlbFZlcnNpb24mJmUuaGFzT3duUHJvcGVydHkoIm1vZGVsVmVyc2lvbiIpJiYhKGwuaXNJbnRlZ2VyKGUubW9kZWxWZXJzaW9uKXx8ZS5tb2RlbFZlcnNpb24mJmwuaXNJbnRlZ2VyKGUubW9kZWxWZXJzaW9uLmxvdykmJmwuaXNJbnRlZ2VyKGUubW9kZWxWZXJzaW9uLmhpZ2gpKSlyZXR1cm4gIm1vZGVsVmVyc2lvbjogaW50ZWdlcnxMb25nIGV4cGVjdGVkIjtpZihudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJiFsLmlzU3RyaW5nKGUuZG9jU3RyaW5nKSlyZXR1cm4gImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjtpZihudWxsIT1lLmdyYXBoJiZlLmhhc093blByb3BlcnR5KCJncmFwaCIpJiYobj1jLm9ubnguR3JhcGhQcm90by52ZXJpZnkoZS5ncmFwaCkpKXJldHVybiAiZ3JhcGguIituO2lmKG51bGwhPWUubWV0YWRhdGFQcm9wcyYmZS5oYXNPd25Qcm9wZXJ0eSgibWV0YWRhdGFQcm9wcyIpKXtpZighQXJyYXkuaXNBcnJheShlLm1ldGFkYXRhUHJvcHMpKXJldHVybiAibWV0YWRhdGFQcm9wczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLm1ldGFkYXRhUHJvcHMubGVuZ3RoOysrdClpZihuPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnZlcmlmeShlLm1ldGFkYXRhUHJvcHNbdF0pKXJldHVybiAibWV0YWRhdGFQcm9wcy4iK259aWYobnVsbCE9ZS50cmFpbmluZ0luZm8mJmUuaGFzT3duUHJvcGVydHkoInRyYWluaW5nSW5mbyIpKXtpZighQXJyYXkuaXNBcnJheShlLnRyYWluaW5nSW5mbykpcmV0dXJuICJ0cmFpbmluZ0luZm86IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS50cmFpbmluZ0luZm8ubGVuZ3RoOysrdClpZihuPWMub25ueC5UcmFpbmluZ0luZm9Qcm90by52ZXJpZnkoZS50cmFpbmluZ0luZm9bdF0pKXJldHVybiAidHJhaW5pbmdJbmZvLiIrbn1pZihudWxsIT1lLmZ1bmN0aW9ucyYmZS5oYXNPd25Qcm9wZXJ0eSgiZnVuY3Rpb25zIikpe2lmKCFBcnJheS5pc0FycmF5KGUuZnVuY3Rpb25zKSlyZXR1cm4gImZ1bmN0aW9uczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmZ1bmN0aW9ucy5sZW5ndGg7Kyt0KXt2YXIgbjtpZihuPWMub25ueC5GdW5jdGlvblByb3RvLnZlcmlmeShlLmZ1bmN0aW9uc1t0XSkpcmV0dXJuICJmdW5jdGlvbnMuIitufX1yZXR1cm4gbnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguTW9kZWxQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54Lk1vZGVsUHJvdG87aWYobnVsbCE9ZS5pclZlcnNpb24mJihsLkxvbmc/KHQuaXJWZXJzaW9uPWwuTG9uZy5mcm9tVmFsdWUoZS5pclZlcnNpb24pKS51bnNpZ25lZD0hMToic3RyaW5nIj09dHlwZW9mIGUuaXJWZXJzaW9uP3QuaXJWZXJzaW9uPXBhcnNlSW50KGUuaXJWZXJzaW9uLDEwKToibnVtYmVyIj09dHlwZW9mIGUuaXJWZXJzaW9uP3QuaXJWZXJzaW9uPWUuaXJWZXJzaW9uOiJvYmplY3QiPT10eXBlb2YgZS5pclZlcnNpb24mJih0LmlyVmVyc2lvbj1uZXcgbC5Mb25nQml0cyhlLmlyVmVyc2lvbi5sb3c+Pj4wLGUuaXJWZXJzaW9uLmhpZ2g+Pj4wKS50b051bWJlcigpKSksZS5vcHNldEltcG9ydCl7aWYoIUFycmF5LmlzQXJyYXkoZS5vcHNldEltcG9ydCkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLm9wc2V0SW1wb3J0OiBhcnJheSBleHBlY3RlZCIpO3Qub3BzZXRJbXBvcnQ9W107Zm9yKHZhciBuPTA7bjxlLm9wc2V0SW1wb3J0Lmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5vcHNldEltcG9ydFtuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk1vZGVsUHJvdG8ub3BzZXRJbXBvcnQ6IG9iamVjdCBleHBlY3RlZCIpO3Qub3BzZXRJbXBvcnRbbl09Yy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by5mcm9tT2JqZWN0KGUub3BzZXRJbXBvcnRbbl0pO319aWYobnVsbCE9ZS5wcm9kdWNlck5hbWUmJih0LnByb2R1Y2VyTmFtZT1TdHJpbmcoZS5wcm9kdWNlck5hbWUpKSxudWxsIT1lLnByb2R1Y2VyVmVyc2lvbiYmKHQucHJvZHVjZXJWZXJzaW9uPVN0cmluZyhlLnByb2R1Y2VyVmVyc2lvbikpLG51bGwhPWUuZG9tYWluJiYodC5kb21haW49U3RyaW5nKGUuZG9tYWluKSksbnVsbCE9ZS5tb2RlbFZlcnNpb24mJihsLkxvbmc/KHQubW9kZWxWZXJzaW9uPWwuTG9uZy5mcm9tVmFsdWUoZS5tb2RlbFZlcnNpb24pKS51bnNpZ25lZD0hMToic3RyaW5nIj09dHlwZW9mIGUubW9kZWxWZXJzaW9uP3QubW9kZWxWZXJzaW9uPXBhcnNlSW50KGUubW9kZWxWZXJzaW9uLDEwKToibnVtYmVyIj09dHlwZW9mIGUubW9kZWxWZXJzaW9uP3QubW9kZWxWZXJzaW9uPWUubW9kZWxWZXJzaW9uOiJvYmplY3QiPT10eXBlb2YgZS5tb2RlbFZlcnNpb24mJih0Lm1vZGVsVmVyc2lvbj1uZXcgbC5Mb25nQml0cyhlLm1vZGVsVmVyc2lvbi5sb3c+Pj4wLGUubW9kZWxWZXJzaW9uLmhpZ2g+Pj4wKS50b051bWJlcigpKSksbnVsbCE9ZS5kb2NTdHJpbmcmJih0LmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSxudWxsIT1lLmdyYXBoKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuZ3JhcGgpdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLmdyYXBoOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmdyYXBoPWMub25ueC5HcmFwaFByb3RvLmZyb21PYmplY3QoZS5ncmFwaCk7fWlmKGUubWV0YWRhdGFQcm9wcyl7aWYoIUFycmF5LmlzQXJyYXkoZS5tZXRhZGF0YVByb3BzKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk1vZGVsUHJvdG8ubWV0YWRhdGFQcm9wczogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5tZXRhZGF0YVByb3BzPVtdLG49MDtuPGUubWV0YWRhdGFQcm9wcy5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUubWV0YWRhdGFQcm9wc1tuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk1vZGVsUHJvdG8ubWV0YWRhdGFQcm9wczogb2JqZWN0IGV4cGVjdGVkIik7dC5tZXRhZGF0YVByb3BzW25dPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmZyb21PYmplY3QoZS5tZXRhZGF0YVByb3BzW25dKTt9fWlmKGUudHJhaW5pbmdJbmZvKXtpZighQXJyYXkuaXNBcnJheShlLnRyYWluaW5nSW5mbykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLnRyYWluaW5nSW5mbzogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC50cmFpbmluZ0luZm89W10sbj0wO248ZS50cmFpbmluZ0luZm8ubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnRyYWluaW5nSW5mb1tuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54Lk1vZGVsUHJvdG8udHJhaW5pbmdJbmZvOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnRyYWluaW5nSW5mb1tuXT1jLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8uZnJvbU9iamVjdChlLnRyYWluaW5nSW5mb1tuXSk7fX1pZihlLmZ1bmN0aW9ucyl7aWYoIUFycmF5LmlzQXJyYXkoZS5mdW5jdGlvbnMpKXRocm93IFR5cGVFcnJvcigiLm9ubnguTW9kZWxQcm90by5mdW5jdGlvbnM6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuZnVuY3Rpb25zPVtdLG49MDtuPGUuZnVuY3Rpb25zLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5mdW5jdGlvbnNbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5Nb2RlbFByb3RvLmZ1bmN0aW9uczogb2JqZWN0IGV4cGVjdGVkIik7dC5mdW5jdGlvbnNbbl09Yy5vbm54LkZ1bmN0aW9uUHJvdG8uZnJvbU9iamVjdChlLmZ1bmN0aW9uc1tuXSk7fX1yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5vcHNldEltcG9ydD1bXSxuLm1ldGFkYXRhUHJvcHM9W10sbi50cmFpbmluZ0luZm89W10sbi5mdW5jdGlvbnM9W10pLHQuZGVmYXVsdHMpe2lmKGwuTG9uZyl7dmFyIHI9bmV3IGwuTG9uZygwLDAsITEpO24uaXJWZXJzaW9uPXQubG9uZ3M9PT1TdHJpbmc/ci50b1N0cmluZygpOnQubG9uZ3M9PT1OdW1iZXI/ci50b051bWJlcigpOnI7fWVsc2Ugbi5pclZlcnNpb249dC5sb25ncz09PVN0cmluZz8iMCI6MDtuLnByb2R1Y2VyTmFtZT0iIixuLnByb2R1Y2VyVmVyc2lvbj0iIixuLmRvbWFpbj0iIixsLkxvbmc/KHI9bmV3IGwuTG9uZygwLDAsITEpLG4ubW9kZWxWZXJzaW9uPXQubG9uZ3M9PT1TdHJpbmc/ci50b1N0cmluZygpOnQubG9uZ3M9PT1OdW1iZXI/ci50b051bWJlcigpOnIpOm4ubW9kZWxWZXJzaW9uPXQubG9uZ3M9PT1TdHJpbmc/IjAiOjAsbi5kb2NTdHJpbmc9IiIsbi5ncmFwaD1udWxsO31pZihudWxsIT1lLmlyVmVyc2lvbiYmZS5oYXNPd25Qcm9wZXJ0eSgiaXJWZXJzaW9uIikmJigibnVtYmVyIj09dHlwZW9mIGUuaXJWZXJzaW9uP24uaXJWZXJzaW9uPXQubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUuaXJWZXJzaW9uKTplLmlyVmVyc2lvbjpuLmlyVmVyc2lvbj10LmxvbmdzPT09U3RyaW5nP2wuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLmlyVmVyc2lvbik6dC5sb25ncz09PU51bWJlcj9uZXcgbC5Mb25nQml0cyhlLmlyVmVyc2lvbi5sb3c+Pj4wLGUuaXJWZXJzaW9uLmhpZ2g+Pj4wKS50b051bWJlcigpOmUuaXJWZXJzaW9uKSxudWxsIT1lLnByb2R1Y2VyTmFtZSYmZS5oYXNPd25Qcm9wZXJ0eSgicHJvZHVjZXJOYW1lIikmJihuLnByb2R1Y2VyTmFtZT1lLnByb2R1Y2VyTmFtZSksbnVsbCE9ZS5wcm9kdWNlclZlcnNpb24mJmUuaGFzT3duUHJvcGVydHkoInByb2R1Y2VyVmVyc2lvbiIpJiYobi5wcm9kdWNlclZlcnNpb249ZS5wcm9kdWNlclZlcnNpb24pLG51bGwhPWUuZG9tYWluJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmKG4uZG9tYWluPWUuZG9tYWluKSxudWxsIT1lLm1vZGVsVmVyc2lvbiYmZS5oYXNPd25Qcm9wZXJ0eSgibW9kZWxWZXJzaW9uIikmJigibnVtYmVyIj09dHlwZW9mIGUubW9kZWxWZXJzaW9uP24ubW9kZWxWZXJzaW9uPXQubG9uZ3M9PT1TdHJpbmc/U3RyaW5nKGUubW9kZWxWZXJzaW9uKTplLm1vZGVsVmVyc2lvbjpuLm1vZGVsVmVyc2lvbj10LmxvbmdzPT09U3RyaW5nP2wuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLm1vZGVsVmVyc2lvbik6dC5sb25ncz09PU51bWJlcj9uZXcgbC5Mb25nQml0cyhlLm1vZGVsVmVyc2lvbi5sb3c+Pj4wLGUubW9kZWxWZXJzaW9uLmhpZ2g+Pj4wKS50b051bWJlcigpOmUubW9kZWxWZXJzaW9uKSxudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJihuLmRvY1N0cmluZz1lLmRvY1N0cmluZyksbnVsbCE9ZS5ncmFwaCYmZS5oYXNPd25Qcm9wZXJ0eSgiZ3JhcGgiKSYmKG4uZ3JhcGg9Yy5vbm54LkdyYXBoUHJvdG8udG9PYmplY3QoZS5ncmFwaCx0KSksZS5vcHNldEltcG9ydCYmZS5vcHNldEltcG9ydC5sZW5ndGgpe24ub3BzZXRJbXBvcnQ9W107Zm9yKHZhciBvPTA7bzxlLm9wc2V0SW1wb3J0Lmxlbmd0aDsrK28pbi5vcHNldEltcG9ydFtvXT1jLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLnRvT2JqZWN0KGUub3BzZXRJbXBvcnRbb10sdCk7fWlmKGUubWV0YWRhdGFQcm9wcyYmZS5tZXRhZGF0YVByb3BzLmxlbmd0aClmb3Iobi5tZXRhZGF0YVByb3BzPVtdLG89MDtvPGUubWV0YWRhdGFQcm9wcy5sZW5ndGg7KytvKW4ubWV0YWRhdGFQcm9wc1tvXT1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by50b09iamVjdChlLm1ldGFkYXRhUHJvcHNbb10sdCk7aWYoZS50cmFpbmluZ0luZm8mJmUudHJhaW5pbmdJbmZvLmxlbmd0aClmb3Iobi50cmFpbmluZ0luZm89W10sbz0wO288ZS50cmFpbmluZ0luZm8ubGVuZ3RoOysrbyluLnRyYWluaW5nSW5mb1tvXT1jLm9ubnguVHJhaW5pbmdJbmZvUHJvdG8udG9PYmplY3QoZS50cmFpbmluZ0luZm9bb10sdCk7aWYoZS5mdW5jdGlvbnMmJmUuZnVuY3Rpb25zLmxlbmd0aClmb3Iobi5mdW5jdGlvbnM9W10sbz0wO288ZS5mdW5jdGlvbnMubGVuZ3RoOysrbyluLmZ1bmN0aW9uc1tvXT1jLm9ubnguRnVuY3Rpb25Qcm90by50b09iamVjdChlLmZ1bmN0aW9uc1tvXSx0KTtyZXR1cm4gbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5Nb2RlbFByb3RvIn0sZX0oKSxpLlN0cmluZ1N0cmluZ0VudHJ5UHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmtleT0iIixlLnByb3RvdHlwZS52YWx1ZT0iIixlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUua2V5JiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJrZXkiKSYmdC51aW50MzIoMTApLnN0cmluZyhlLmtleSksbnVsbCE9ZS52YWx1ZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidmFsdWUiKSYmdC51aW50MzIoMTgpLnN0cmluZyhlLnZhbHVlKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLmtleT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMjpyLnZhbHVlPWUuc3RyaW5nKCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7cmV0dXJuICJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWU/Im9iamVjdCBleHBlY3RlZCI6bnVsbCE9ZS5rZXkmJmUuaGFzT3duUHJvcGVydHkoImtleSIpJiYhbC5pc1N0cmluZyhlLmtleSk/ImtleTogc3RyaW5nIGV4cGVjdGVkIjpudWxsIT1lLnZhbHVlJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZSIpJiYhbC5pc1N0cmluZyhlLnZhbHVlKT8idmFsdWU6IHN0cmluZyBleHBlY3RlZCI6bnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG87cmV0dXJuIG51bGwhPWUua2V5JiYodC5rZXk9U3RyaW5nKGUua2V5KSksbnVsbCE9ZS52YWx1ZSYmKHQudmFsdWU9U3RyaW5nKGUudmFsdWUpKSx0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O3JldHVybiB0LmRlZmF1bHRzJiYobi5rZXk9IiIsbi52YWx1ZT0iIiksbnVsbCE9ZS5rZXkmJmUuaGFzT3duUHJvcGVydHkoImtleSIpJiYobi5rZXk9ZS5rZXkpLG51bGwhPWUudmFsdWUmJmUuaGFzT3duUHJvcGVydHkoInZhbHVlIikmJihuLnZhbHVlPWUudmFsdWUpLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90byJ9LGV9KCksaS5UZW5zb3JBbm5vdGF0aW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXM9W10sZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUudGVuc29yTmFtZT0iIixlLnByb3RvdHlwZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzPWwuZW1wdHlBcnJheSxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7aWYodHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS50ZW5zb3JOYW1lJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJ0ZW5zb3JOYW1lIikmJnQudWludDMyKDEwKS5zdHJpbmcoZS50ZW5zb3JOYW1lKSxudWxsIT1lLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMmJmUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcy5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMubGVuZ3RoOysrbiljLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5lbmNvZGUoZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzW25dLHQudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiB0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguVGVuc29yQW5ub3RhdGlvbjtlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLnRlbnNvck5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDI6ci5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzJiZyLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMubGVuZ3RofHwoci5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzPVtdKSxyLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMucHVzaChjLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS50ZW5zb3JOYW1lJiZlLmhhc093blByb3BlcnR5KCJ0ZW5zb3JOYW1lIikmJiFsLmlzU3RyaW5nKGUudGVuc29yTmFtZSkpcmV0dXJuICJ0ZW5zb3JOYW1lOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcyYmZS5oYXNPd25Qcm9wZXJ0eSgicXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcyIpKXtpZighQXJyYXkuaXNBcnJheShlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMpKXJldHVybiAicXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgdD0wO3Q8ZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLmxlbmd0aDsrK3Qpe3ZhciBuPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLnZlcmlmeShlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXNbdF0pO2lmKG4pcmV0dXJuICJxdWFudFBhcmFtZXRlclRlbnNvck5hbWVzLiIrbn19cmV0dXJuIG51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlRlbnNvckFubm90YXRpb24pcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UZW5zb3JBbm5vdGF0aW9uO2lmKG51bGwhPWUudGVuc29yTmFtZSYmKHQudGVuc29yTmFtZT1TdHJpbmcoZS50ZW5zb3JOYW1lKSksZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzKXtpZighQXJyYXkuaXNBcnJheShlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMpKXRocm93IFR5cGVFcnJvcigiLm9ubnguVGVuc29yQW5ub3RhdGlvbi5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzOiBhcnJheSBleHBlY3RlZCIpO3QucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcz1bXTtmb3IodmFyIG49MDtuPGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lcy5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lc1tuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvckFubm90YXRpb24ucXVhbnRQYXJhbWV0ZXJUZW5zb3JOYW1lczogb2JqZWN0IGV4cGVjdGVkIik7dC5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzW25dPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmZyb21PYmplY3QoZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzW25dKTt9fXJldHVybiB0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O2lmKCh0LmFycmF5c3x8dC5kZWZhdWx0cykmJihuLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXM9W10pLHQuZGVmYXVsdHMmJihuLnRlbnNvck5hbWU9IiIpLG51bGwhPWUudGVuc29yTmFtZSYmZS5oYXNPd25Qcm9wZXJ0eSgidGVuc29yTmFtZSIpJiYobi50ZW5zb3JOYW1lPWUudGVuc29yTmFtZSksZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzJiZlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMubGVuZ3RoKXtuLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXM9W107Zm9yKHZhciByPTA7cjxlLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXMubGVuZ3RoOysrciluLnF1YW50UGFyYW1ldGVyVGVuc29yTmFtZXNbcl09Yy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udG9PYmplY3QoZS5xdWFudFBhcmFtZXRlclRlbnNvck5hbWVzW3JdLHQpO31yZXR1cm4gbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UZW5zb3JBbm5vdGF0aW9uIn0sZX0oKSxpLkdyYXBoUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMubm9kZT1bXSx0aGlzLmluaXRpYWxpemVyPVtdLHRoaXMuc3BhcnNlSW5pdGlhbGl6ZXI9W10sdGhpcy5pbnB1dD1bXSx0aGlzLm91dHB1dD1bXSx0aGlzLnZhbHVlSW5mbz1bXSx0aGlzLnF1YW50aXphdGlvbkFubm90YXRpb249W10sZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUubm9kZT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUubmFtZT0iIixlLnByb3RvdHlwZS5pbml0aWFsaXplcj1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuc3BhcnNlSW5pdGlhbGl6ZXI9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmRvY1N0cmluZz0iIixlLnByb3RvdHlwZS5pbnB1dD1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUub3V0cHV0PWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS52YWx1ZUluZm89bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLnF1YW50aXphdGlvbkFubm90YXRpb249bC5lbXB0eUFycmF5LGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtpZih0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLm5vZGUmJmUubm9kZS5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLm5vZGUubGVuZ3RoOysrbiljLm9ubnguTm9kZVByb3RvLmVuY29kZShlLm5vZGVbbl0sdC51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS5uYW1lJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJuYW1lIikmJnQudWludDMyKDE4KS5zdHJpbmcoZS5uYW1lKSxudWxsIT1lLmluaXRpYWxpemVyJiZlLmluaXRpYWxpemVyLmxlbmd0aClmb3Iobj0wO248ZS5pbml0aWFsaXplci5sZW5ndGg7KytuKWMub25ueC5UZW5zb3JQcm90by5lbmNvZGUoZS5pbml0aWFsaXplcltuXSx0LnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLmRvY1N0cmluZyYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZG9jU3RyaW5nIikmJnQudWludDMyKDgyKS5zdHJpbmcoZS5kb2NTdHJpbmcpLG51bGwhPWUuaW5wdXQmJmUuaW5wdXQubGVuZ3RoKWZvcihuPTA7bjxlLmlucHV0Lmxlbmd0aDsrK24pYy5vbm54LlZhbHVlSW5mb1Byb3RvLmVuY29kZShlLmlucHV0W25dLHQudWludDMyKDkwKS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUub3V0cHV0JiZlLm91dHB1dC5sZW5ndGgpZm9yKG49MDtuPGUub3V0cHV0Lmxlbmd0aDsrK24pYy5vbm54LlZhbHVlSW5mb1Byb3RvLmVuY29kZShlLm91dHB1dFtuXSx0LnVpbnQzMig5OCkuZm9yaygpKS5sZGVsaW0oKTtpZihudWxsIT1lLnZhbHVlSW5mbyYmZS52YWx1ZUluZm8ubGVuZ3RoKWZvcihuPTA7bjxlLnZhbHVlSW5mby5sZW5ndGg7KytuKWMub25ueC5WYWx1ZUluZm9Qcm90by5lbmNvZGUoZS52YWx1ZUluZm9bbl0sdC51aW50MzIoMTA2KS5mb3JrKCkpLmxkZWxpbSgpO2lmKG51bGwhPWUucXVhbnRpemF0aW9uQW5ub3RhdGlvbiYmZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uLmxlbmd0aClmb3Iobj0wO248ZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uLmxlbmd0aDsrK24pYy5vbm54LlRlbnNvckFubm90YXRpb24uZW5jb2RlKGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbltuXSx0LnVpbnQzMigxMTQpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS5zcGFyc2VJbml0aWFsaXplciYmZS5zcGFyc2VJbml0aWFsaXplci5sZW5ndGgpZm9yKG49MDtuPGUuc3BhcnNlSW5pdGlhbGl6ZXIubGVuZ3RoOysrbiljLm9ubnguU3BhcnNlVGVuc29yUHJvdG8uZW5jb2RlKGUuc3BhcnNlSW5pdGlhbGl6ZXJbbl0sdC51aW50MzIoMTIyKS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiB0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguR3JhcGhQcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLm5vZGUmJnIubm9kZS5sZW5ndGh8fChyLm5vZGU9W10pLHIubm9kZS5wdXNoKGMub25ueC5Ob2RlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMjpyLm5hbWU9ZS5zdHJpbmcoKTticmVhaztjYXNlIDU6ci5pbml0aWFsaXplciYmci5pbml0aWFsaXplci5sZW5ndGh8fChyLmluaXRpYWxpemVyPVtdKSxyLmluaXRpYWxpemVyLnB1c2goYy5vbm54LlRlbnNvclByb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDE1OnIuc3BhcnNlSW5pdGlhbGl6ZXImJnIuc3BhcnNlSW5pdGlhbGl6ZXIubGVuZ3RofHwoci5zcGFyc2VJbml0aWFsaXplcj1bXSksci5zcGFyc2VJbml0aWFsaXplci5wdXNoKGMub25ueC5TcGFyc2VUZW5zb3JQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAxMDpyLmRvY1N0cmluZz1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMTE6ci5pbnB1dCYmci5pbnB1dC5sZW5ndGh8fChyLmlucHV0PVtdKSxyLmlucHV0LnB1c2goYy5vbm54LlZhbHVlSW5mb1Byb3RvLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztjYXNlIDEyOnIub3V0cHV0JiZyLm91dHB1dC5sZW5ndGh8fChyLm91dHB1dD1bXSksci5vdXRwdXQucHVzaChjLm9ubnguVmFsdWVJbmZvUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTM6ci52YWx1ZUluZm8mJnIudmFsdWVJbmZvLmxlbmd0aHx8KHIudmFsdWVJbmZvPVtdKSxyLnZhbHVlSW5mby5wdXNoKGMub25ueC5WYWx1ZUluZm9Qcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAxNDpyLnF1YW50aXphdGlvbkFubm90YXRpb24mJnIucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGh8fChyLnF1YW50aXphdGlvbkFubm90YXRpb249W10pLHIucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5wdXNoKGMub25ueC5UZW5zb3JBbm5vdGF0aW9uLmRlY29kZShlLGUudWludDMyKCkpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLm5vZGUmJmUuaGFzT3duUHJvcGVydHkoIm5vZGUiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5ub2RlKSlyZXR1cm4gIm5vZGU6IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHQ9MDt0PGUubm9kZS5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54Lk5vZGVQcm90by52ZXJpZnkoZS5ub2RlW3RdKSlyZXR1cm4gIm5vZGUuIitufWlmKG51bGwhPWUubmFtZSYmZS5oYXNPd25Qcm9wZXJ0eSgibmFtZSIpJiYhbC5pc1N0cmluZyhlLm5hbWUpKXJldHVybiAibmFtZTogc3RyaW5nIGV4cGVjdGVkIjtpZihudWxsIT1lLmluaXRpYWxpemVyJiZlLmhhc093blByb3BlcnR5KCJpbml0aWFsaXplciIpKXtpZighQXJyYXkuaXNBcnJheShlLmluaXRpYWxpemVyKSlyZXR1cm4gImluaXRpYWxpemVyOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuaW5pdGlhbGl6ZXIubGVuZ3RoOysrdClpZihuPWMub25ueC5UZW5zb3JQcm90by52ZXJpZnkoZS5pbml0aWFsaXplclt0XSkpcmV0dXJuICJpbml0aWFsaXplci4iK259aWYobnVsbCE9ZS5zcGFyc2VJbml0aWFsaXplciYmZS5oYXNPd25Qcm9wZXJ0eSgic3BhcnNlSW5pdGlhbGl6ZXIiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5zcGFyc2VJbml0aWFsaXplcikpcmV0dXJuICJzcGFyc2VJbml0aWFsaXplcjogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLnNwYXJzZUluaXRpYWxpemVyLmxlbmd0aDsrK3QpaWYobj1jLm9ubnguU3BhcnNlVGVuc29yUHJvdG8udmVyaWZ5KGUuc3BhcnNlSW5pdGlhbGl6ZXJbdF0pKXJldHVybiAic3BhcnNlSW5pdGlhbGl6ZXIuIitufWlmKG51bGwhPWUuZG9jU3RyaW5nJiZlLmhhc093blByb3BlcnR5KCJkb2NTdHJpbmciKSYmIWwuaXNTdHJpbmcoZS5kb2NTdHJpbmcpKXJldHVybiAiZG9jU3RyaW5nOiBzdHJpbmcgZXhwZWN0ZWQiO2lmKG51bGwhPWUuaW5wdXQmJmUuaGFzT3duUHJvcGVydHkoImlucHV0Iikpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5wdXQpKXJldHVybiAiaW5wdXQ6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5pbnB1dC5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LlZhbHVlSW5mb1Byb3RvLnZlcmlmeShlLmlucHV0W3RdKSlyZXR1cm4gImlucHV0LiIrbn1pZihudWxsIT1lLm91dHB1dCYmZS5oYXNPd25Qcm9wZXJ0eSgib3V0cHV0Iikpe2lmKCFBcnJheS5pc0FycmF5KGUub3V0cHV0KSlyZXR1cm4gIm91dHB1dDogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLm91dHB1dC5sZW5ndGg7Kyt0KWlmKG49Yy5vbm54LlZhbHVlSW5mb1Byb3RvLnZlcmlmeShlLm91dHB1dFt0XSkpcmV0dXJuICJvdXRwdXQuIitufWlmKG51bGwhPWUudmFsdWVJbmZvJiZlLmhhc093blByb3BlcnR5KCJ2YWx1ZUluZm8iKSl7aWYoIUFycmF5LmlzQXJyYXkoZS52YWx1ZUluZm8pKXJldHVybiAidmFsdWVJbmZvOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUudmFsdWVJbmZvLmxlbmd0aDsrK3QpaWYobj1jLm9ubnguVmFsdWVJbmZvUHJvdG8udmVyaWZ5KGUudmFsdWVJbmZvW3RdKSlyZXR1cm4gInZhbHVlSW5mby4iK259aWYobnVsbCE9ZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uJiZlLmhhc093blByb3BlcnR5KCJxdWFudGl6YXRpb25Bbm5vdGF0aW9uIikpe2lmKCFBcnJheS5pc0FycmF5KGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbikpcmV0dXJuICJxdWFudGl6YXRpb25Bbm5vdGF0aW9uOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGg7Kyt0KXt2YXIgbjtpZihuPWMub25ueC5UZW5zb3JBbm5vdGF0aW9uLnZlcmlmeShlLnF1YW50aXphdGlvbkFubm90YXRpb25bdF0pKXJldHVybiAicXVhbnRpemF0aW9uQW5ub3RhdGlvbi4iK259fXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5HcmFwaFByb3RvKXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguR3JhcGhQcm90bztpZihlLm5vZGUpe2lmKCFBcnJheS5pc0FycmF5KGUubm9kZSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLm5vZGU6IGFycmF5IGV4cGVjdGVkIik7dC5ub2RlPVtdO2Zvcih2YXIgbj0wO248ZS5ub2RlLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5ub2RlW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5ub2RlOiBvYmplY3QgZXhwZWN0ZWQiKTt0Lm5vZGVbbl09Yy5vbm54Lk5vZGVQcm90by5mcm9tT2JqZWN0KGUubm9kZVtuXSk7fX1pZihudWxsIT1lLm5hbWUmJih0Lm5hbWU9U3RyaW5nKGUubmFtZSkpLGUuaW5pdGlhbGl6ZXIpe2lmKCFBcnJheS5pc0FycmF5KGUuaW5pdGlhbGl6ZXIpKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5pbml0aWFsaXplcjogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5pbml0aWFsaXplcj1bXSxuPTA7bjxlLmluaXRpYWxpemVyLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5pbml0aWFsaXplcltuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8uaW5pdGlhbGl6ZXI6IG9iamVjdCBleHBlY3RlZCIpO3QuaW5pdGlhbGl6ZXJbbl09Yy5vbm54LlRlbnNvclByb3RvLmZyb21PYmplY3QoZS5pbml0aWFsaXplcltuXSk7fX1pZihlLnNwYXJzZUluaXRpYWxpemVyKXtpZighQXJyYXkuaXNBcnJheShlLnNwYXJzZUluaXRpYWxpemVyKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8uc3BhcnNlSW5pdGlhbGl6ZXI6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuc3BhcnNlSW5pdGlhbGl6ZXI9W10sbj0wO248ZS5zcGFyc2VJbml0aWFsaXplci5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuc3BhcnNlSW5pdGlhbGl6ZXJbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLnNwYXJzZUluaXRpYWxpemVyOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnNwYXJzZUluaXRpYWxpemVyW25dPWMub25ueC5TcGFyc2VUZW5zb3JQcm90by5mcm9tT2JqZWN0KGUuc3BhcnNlSW5pdGlhbGl6ZXJbbl0pO319aWYobnVsbCE9ZS5kb2NTdHJpbmcmJih0LmRvY1N0cmluZz1TdHJpbmcoZS5kb2NTdHJpbmcpKSxlLmlucHV0KXtpZighQXJyYXkuaXNBcnJheShlLmlucHV0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8uaW5wdXQ6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuaW5wdXQ9W10sbj0wO248ZS5pbnB1dC5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuaW5wdXRbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLmlucHV0OiBvYmplY3QgZXhwZWN0ZWQiKTt0LmlucHV0W25dPWMub25ueC5WYWx1ZUluZm9Qcm90by5mcm9tT2JqZWN0KGUuaW5wdXRbbl0pO319aWYoZS5vdXRwdXQpe2lmKCFBcnJheS5pc0FycmF5KGUub3V0cHV0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8ub3V0cHV0OiBhcnJheSBleHBlY3RlZCIpO2Zvcih0Lm91dHB1dD1bXSxuPTA7bjxlLm91dHB1dC5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUub3V0cHV0W25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguR3JhcGhQcm90by5vdXRwdXQ6IG9iamVjdCBleHBlY3RlZCIpO3Qub3V0cHV0W25dPWMub25ueC5WYWx1ZUluZm9Qcm90by5mcm9tT2JqZWN0KGUub3V0cHV0W25dKTt9fWlmKGUudmFsdWVJbmZvKXtpZighQXJyYXkuaXNBcnJheShlLnZhbHVlSW5mbykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLnZhbHVlSW5mbzogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC52YWx1ZUluZm89W10sbj0wO248ZS52YWx1ZUluZm8ubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnZhbHVlSW5mb1tuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkdyYXBoUHJvdG8udmFsdWVJbmZvOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnZhbHVlSW5mb1tuXT1jLm9ubnguVmFsdWVJbmZvUHJvdG8uZnJvbU9iamVjdChlLnZhbHVlSW5mb1tuXSk7fX1pZihlLnF1YW50aXphdGlvbkFubm90YXRpb24pe2lmKCFBcnJheS5pc0FycmF5KGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbikpdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLnF1YW50aXphdGlvbkFubm90YXRpb246IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQucXVhbnRpemF0aW9uQW5ub3RhdGlvbj1bXSxuPTA7bjxlLnF1YW50aXphdGlvbkFubm90YXRpb24ubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnF1YW50aXphdGlvbkFubm90YXRpb25bbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5HcmFwaFByb3RvLnF1YW50aXphdGlvbkFubm90YXRpb246IG9iamVjdCBleHBlY3RlZCIpO3QucXVhbnRpemF0aW9uQW5ub3RhdGlvbltuXT1jLm9ubnguVGVuc29yQW5ub3RhdGlvbi5mcm9tT2JqZWN0KGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbltuXSk7fX1yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5ub2RlPVtdLG4uaW5pdGlhbGl6ZXI9W10sbi5pbnB1dD1bXSxuLm91dHB1dD1bXSxuLnZhbHVlSW5mbz1bXSxuLnF1YW50aXphdGlvbkFubm90YXRpb249W10sbi5zcGFyc2VJbml0aWFsaXplcj1bXSksdC5kZWZhdWx0cyYmKG4ubmFtZT0iIixuLmRvY1N0cmluZz0iIiksZS5ub2RlJiZlLm5vZGUubGVuZ3RoKXtuLm5vZGU9W107Zm9yKHZhciByPTA7cjxlLm5vZGUubGVuZ3RoOysrciluLm5vZGVbcl09Yy5vbm54Lk5vZGVQcm90by50b09iamVjdChlLm5vZGVbcl0sdCk7fWlmKG51bGwhPWUubmFtZSYmZS5oYXNPd25Qcm9wZXJ0eSgibmFtZSIpJiYobi5uYW1lPWUubmFtZSksZS5pbml0aWFsaXplciYmZS5pbml0aWFsaXplci5sZW5ndGgpZm9yKG4uaW5pdGlhbGl6ZXI9W10scj0wO3I8ZS5pbml0aWFsaXplci5sZW5ndGg7KytyKW4uaW5pdGlhbGl6ZXJbcl09Yy5vbm54LlRlbnNvclByb3RvLnRvT2JqZWN0KGUuaW5pdGlhbGl6ZXJbcl0sdCk7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYobi5kb2NTdHJpbmc9ZS5kb2NTdHJpbmcpLGUuaW5wdXQmJmUuaW5wdXQubGVuZ3RoKWZvcihuLmlucHV0PVtdLHI9MDtyPGUuaW5wdXQubGVuZ3RoOysrciluLmlucHV0W3JdPWMub25ueC5WYWx1ZUluZm9Qcm90by50b09iamVjdChlLmlucHV0W3JdLHQpO2lmKGUub3V0cHV0JiZlLm91dHB1dC5sZW5ndGgpZm9yKG4ub3V0cHV0PVtdLHI9MDtyPGUub3V0cHV0Lmxlbmd0aDsrK3Ipbi5vdXRwdXRbcl09Yy5vbm54LlZhbHVlSW5mb1Byb3RvLnRvT2JqZWN0KGUub3V0cHV0W3JdLHQpO2lmKGUudmFsdWVJbmZvJiZlLnZhbHVlSW5mby5sZW5ndGgpZm9yKG4udmFsdWVJbmZvPVtdLHI9MDtyPGUudmFsdWVJbmZvLmxlbmd0aDsrK3Ipbi52YWx1ZUluZm9bcl09Yy5vbm54LlZhbHVlSW5mb1Byb3RvLnRvT2JqZWN0KGUudmFsdWVJbmZvW3JdLHQpO2lmKGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbiYmZS5xdWFudGl6YXRpb25Bbm5vdGF0aW9uLmxlbmd0aClmb3Iobi5xdWFudGl6YXRpb25Bbm5vdGF0aW9uPVtdLHI9MDtyPGUucXVhbnRpemF0aW9uQW5ub3RhdGlvbi5sZW5ndGg7KytyKW4ucXVhbnRpemF0aW9uQW5ub3RhdGlvbltyXT1jLm9ubnguVGVuc29yQW5ub3RhdGlvbi50b09iamVjdChlLnF1YW50aXphdGlvbkFubm90YXRpb25bcl0sdCk7aWYoZS5zcGFyc2VJbml0aWFsaXplciYmZS5zcGFyc2VJbml0aWFsaXplci5sZW5ndGgpZm9yKG4uc3BhcnNlSW5pdGlhbGl6ZXI9W10scj0wO3I8ZS5zcGFyc2VJbml0aWFsaXplci5sZW5ndGg7KytyKW4uc3BhcnNlSW5pdGlhbGl6ZXJbcl09Yy5vbm54LlNwYXJzZVRlbnNvclByb3RvLnRvT2JqZWN0KGUuc3BhcnNlSW5pdGlhbGl6ZXJbcl0sdCk7cmV0dXJuIG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguR3JhcGhQcm90byJ9LGV9KCksaS5UZW5zb3JQcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5kaW1zPVtdLHRoaXMuZmxvYXREYXRhPVtdLHRoaXMuaW50MzJEYXRhPVtdLHRoaXMuc3RyaW5nRGF0YT1bXSx0aGlzLmludDY0RGF0YT1bXSx0aGlzLmV4dGVybmFsRGF0YT1bXSx0aGlzLmRvdWJsZURhdGE9W10sdGhpcy51aW50NjREYXRhPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmRpbXM9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLmRhdGFUeXBlPTAsZS5wcm90b3R5cGUuc2VnbWVudD1udWxsLGUucHJvdG90eXBlLmZsb2F0RGF0YT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuaW50MzJEYXRhPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5zdHJpbmdEYXRhPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5pbnQ2NERhdGE9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLm5hbWU9IiIsZS5wcm90b3R5cGUuZG9jU3RyaW5nPSIiLGUucHJvdG90eXBlLnJhd0RhdGE9bC5uZXdCdWZmZXIoW10pLGUucHJvdG90eXBlLmV4dGVybmFsRGF0YT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuZGF0YUxvY2F0aW9uPTAsZS5wcm90b3R5cGUuZG91YmxlRGF0YT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUudWludDY0RGF0YT1sLmVtcHR5QXJyYXksZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe2lmKHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUuZGltcyYmZS5kaW1zLmxlbmd0aCl7dC51aW50MzIoMTApLmZvcmsoKTtmb3IodmFyIG49MDtuPGUuZGltcy5sZW5ndGg7KytuKXQuaW50NjQoZS5kaW1zW25dKTt0LmxkZWxpbSgpO31pZihudWxsIT1lLmRhdGFUeXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkYXRhVHlwZSIpJiZ0LnVpbnQzMigxNikuaW50MzIoZS5kYXRhVHlwZSksbnVsbCE9ZS5zZWdtZW50JiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJzZWdtZW50IikmJmMub25ueC5UZW5zb3JQcm90by5TZWdtZW50LmVuY29kZShlLnNlZ21lbnQsdC51aW50MzIoMjYpLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS5mbG9hdERhdGEmJmUuZmxvYXREYXRhLmxlbmd0aCl7Zm9yKHQudWludDMyKDM0KS5mb3JrKCksbj0wO248ZS5mbG9hdERhdGEubGVuZ3RoOysrbil0LmZsb2F0KGUuZmxvYXREYXRhW25dKTt0LmxkZWxpbSgpO31pZihudWxsIT1lLmludDMyRGF0YSYmZS5pbnQzMkRhdGEubGVuZ3RoKXtmb3IodC51aW50MzIoNDIpLmZvcmsoKSxuPTA7bjxlLmludDMyRGF0YS5sZW5ndGg7KytuKXQuaW50MzIoZS5pbnQzMkRhdGFbbl0pO3QubGRlbGltKCk7fWlmKG51bGwhPWUuc3RyaW5nRGF0YSYmZS5zdHJpbmdEYXRhLmxlbmd0aClmb3Iobj0wO248ZS5zdHJpbmdEYXRhLmxlbmd0aDsrK24pdC51aW50MzIoNTApLmJ5dGVzKGUuc3RyaW5nRGF0YVtuXSk7aWYobnVsbCE9ZS5pbnQ2NERhdGEmJmUuaW50NjREYXRhLmxlbmd0aCl7Zm9yKHQudWludDMyKDU4KS5mb3JrKCksbj0wO248ZS5pbnQ2NERhdGEubGVuZ3RoOysrbil0LmludDY0KGUuaW50NjREYXRhW25dKTt0LmxkZWxpbSgpO31pZihudWxsIT1lLm5hbWUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm5hbWUiKSYmdC51aW50MzIoNjYpLnN0cmluZyhlLm5hbWUpLG51bGwhPWUucmF3RGF0YSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwicmF3RGF0YSIpJiZ0LnVpbnQzMig3NCkuYnl0ZXMoZS5yYXdEYXRhKSxudWxsIT1lLmRvdWJsZURhdGEmJmUuZG91YmxlRGF0YS5sZW5ndGgpe2Zvcih0LnVpbnQzMig4MikuZm9yaygpLG49MDtuPGUuZG91YmxlRGF0YS5sZW5ndGg7KytuKXQuZG91YmxlKGUuZG91YmxlRGF0YVtuXSk7dC5sZGVsaW0oKTt9aWYobnVsbCE9ZS51aW50NjREYXRhJiZlLnVpbnQ2NERhdGEubGVuZ3RoKXtmb3IodC51aW50MzIoOTApLmZvcmsoKSxuPTA7bjxlLnVpbnQ2NERhdGEubGVuZ3RoOysrbil0LnVpbnQ2NChlLnVpbnQ2NERhdGFbbl0pO3QubGRlbGltKCk7fWlmKG51bGwhPWUuZG9jU3RyaW5nJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkb2NTdHJpbmciKSYmdC51aW50MzIoOTgpLnN0cmluZyhlLmRvY1N0cmluZyksbnVsbCE9ZS5leHRlcm5hbERhdGEmJmUuZXh0ZXJuYWxEYXRhLmxlbmd0aClmb3Iobj0wO248ZS5leHRlcm5hbERhdGEubGVuZ3RoOysrbiljLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5lbmNvZGUoZS5leHRlcm5hbERhdGFbbl0sdC51aW50MzIoMTA2KS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiBudWxsIT1lLmRhdGFMb2NhdGlvbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZGF0YUxvY2F0aW9uIikmJnQudWludDMyKDExMikuaW50MzIoZS5kYXRhTG9jYXRpb24pLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UZW5zb3JQcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTppZihyLmRpbXMmJnIuZGltcy5sZW5ndGh8fChyLmRpbXM9W10pLDI9PSg3Jm8pKWZvcih2YXIgaT1lLnVpbnQzMigpK2UucG9zO2UucG9zPGk7KXIuZGltcy5wdXNoKGUuaW50NjQoKSk7ZWxzZSByLmRpbXMucHVzaChlLmludDY0KCkpO2JyZWFrO2Nhc2UgMjpyLmRhdGFUeXBlPWUuaW50MzIoKTticmVhaztjYXNlIDM6ci5zZWdtZW50PWMub25ueC5UZW5zb3JQcm90by5TZWdtZW50LmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgNDppZihyLmZsb2F0RGF0YSYmci5mbG9hdERhdGEubGVuZ3RofHwoci5mbG9hdERhdGE9W10pLDI9PSg3Jm8pKWZvcihpPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8aTspci5mbG9hdERhdGEucHVzaChlLmZsb2F0KCkpO2Vsc2Ugci5mbG9hdERhdGEucHVzaChlLmZsb2F0KCkpO2JyZWFrO2Nhc2UgNTppZihyLmludDMyRGF0YSYmci5pbnQzMkRhdGEubGVuZ3RofHwoci5pbnQzMkRhdGE9W10pLDI9PSg3Jm8pKWZvcihpPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8aTspci5pbnQzMkRhdGEucHVzaChlLmludDMyKCkpO2Vsc2Ugci5pbnQzMkRhdGEucHVzaChlLmludDMyKCkpO2JyZWFrO2Nhc2UgNjpyLnN0cmluZ0RhdGEmJnIuc3RyaW5nRGF0YS5sZW5ndGh8fChyLnN0cmluZ0RhdGE9W10pLHIuc3RyaW5nRGF0YS5wdXNoKGUuYnl0ZXMoKSk7YnJlYWs7Y2FzZSA3OmlmKHIuaW50NjREYXRhJiZyLmludDY0RGF0YS5sZW5ndGh8fChyLmludDY0RGF0YT1bXSksMj09KDcmbykpZm9yKGk9ZS51aW50MzIoKStlLnBvcztlLnBvczxpOylyLmludDY0RGF0YS5wdXNoKGUuaW50NjQoKSk7ZWxzZSByLmludDY0RGF0YS5wdXNoKGUuaW50NjQoKSk7YnJlYWs7Y2FzZSA4OnIubmFtZT1lLnN0cmluZygpO2JyZWFrO2Nhc2UgMTI6ci5kb2NTdHJpbmc9ZS5zdHJpbmcoKTticmVhaztjYXNlIDk6ci5yYXdEYXRhPWUuYnl0ZXMoKTticmVhaztjYXNlIDEzOnIuZXh0ZXJuYWxEYXRhJiZyLmV4dGVybmFsRGF0YS5sZW5ndGh8fChyLmV4dGVybmFsRGF0YT1bXSksci5leHRlcm5hbERhdGEucHVzaChjLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSAxNDpyLmRhdGFMb2NhdGlvbj1lLmludDMyKCk7YnJlYWs7Y2FzZSAxMDppZihyLmRvdWJsZURhdGEmJnIuZG91YmxlRGF0YS5sZW5ndGh8fChyLmRvdWJsZURhdGE9W10pLDI9PSg3Jm8pKWZvcihpPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8aTspci5kb3VibGVEYXRhLnB1c2goZS5kb3VibGUoKSk7ZWxzZSByLmRvdWJsZURhdGEucHVzaChlLmRvdWJsZSgpKTticmVhaztjYXNlIDExOmlmKHIudWludDY0RGF0YSYmci51aW50NjREYXRhLmxlbmd0aHx8KHIudWludDY0RGF0YT1bXSksMj09KDcmbykpZm9yKGk9ZS51aW50MzIoKStlLnBvcztlLnBvczxpOylyLnVpbnQ2NERhdGEucHVzaChlLnVpbnQ2NCgpKTtlbHNlIHIudWludDY0RGF0YS5wdXNoKGUudWludDY0KCkpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO2lmKG51bGwhPWUuZGltcyYmZS5oYXNPd25Qcm9wZXJ0eSgiZGltcyIpKXtpZighQXJyYXkuaXNBcnJheShlLmRpbXMpKXJldHVybiAiZGltczogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgdD0wO3Q8ZS5kaW1zLmxlbmd0aDsrK3QpaWYoIShsLmlzSW50ZWdlcihlLmRpbXNbdF0pfHxlLmRpbXNbdF0mJmwuaXNJbnRlZ2VyKGUuZGltc1t0XS5sb3cpJiZsLmlzSW50ZWdlcihlLmRpbXNbdF0uaGlnaCkpKXJldHVybiAiZGltczogaW50ZWdlcnxMb25nW10gZXhwZWN0ZWQifWlmKG51bGwhPWUuZGF0YVR5cGUmJmUuaGFzT3duUHJvcGVydHkoImRhdGFUeXBlIikmJiFsLmlzSW50ZWdlcihlLmRhdGFUeXBlKSlyZXR1cm4gImRhdGFUeXBlOiBpbnRlZ2VyIGV4cGVjdGVkIjtpZihudWxsIT1lLnNlZ21lbnQmJmUuaGFzT3duUHJvcGVydHkoInNlZ21lbnQiKSYmKG49Yy5vbm54LlRlbnNvclByb3RvLlNlZ21lbnQudmVyaWZ5KGUuc2VnbWVudCkpKXJldHVybiAic2VnbWVudC4iK247aWYobnVsbCE9ZS5mbG9hdERhdGEmJmUuaGFzT3duUHJvcGVydHkoImZsb2F0RGF0YSIpKXtpZighQXJyYXkuaXNBcnJheShlLmZsb2F0RGF0YSkpcmV0dXJuICJmbG9hdERhdGE6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5mbG9hdERhdGEubGVuZ3RoOysrdClpZigibnVtYmVyIiE9dHlwZW9mIGUuZmxvYXREYXRhW3RdKXJldHVybiAiZmxvYXREYXRhOiBudW1iZXJbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS5pbnQzMkRhdGEmJmUuaGFzT3duUHJvcGVydHkoImludDMyRGF0YSIpKXtpZighQXJyYXkuaXNBcnJheShlLmludDMyRGF0YSkpcmV0dXJuICJpbnQzMkRhdGE6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS5pbnQzMkRhdGEubGVuZ3RoOysrdClpZighbC5pc0ludGVnZXIoZS5pbnQzMkRhdGFbdF0pKXJldHVybiAiaW50MzJEYXRhOiBpbnRlZ2VyW10gZXhwZWN0ZWQifWlmKG51bGwhPWUuc3RyaW5nRGF0YSYmZS5oYXNPd25Qcm9wZXJ0eSgic3RyaW5nRGF0YSIpKXtpZighQXJyYXkuaXNBcnJheShlLnN0cmluZ0RhdGEpKXJldHVybiAic3RyaW5nRGF0YTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLnN0cmluZ0RhdGEubGVuZ3RoOysrdClpZighKGUuc3RyaW5nRGF0YVt0XSYmIm51bWJlciI9PXR5cGVvZiBlLnN0cmluZ0RhdGFbdF0ubGVuZ3RofHxsLmlzU3RyaW5nKGUuc3RyaW5nRGF0YVt0XSkpKXJldHVybiAic3RyaW5nRGF0YTogYnVmZmVyW10gZXhwZWN0ZWQifWlmKG51bGwhPWUuaW50NjREYXRhJiZlLmhhc093blByb3BlcnR5KCJpbnQ2NERhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnQ2NERhdGEpKXJldHVybiAiaW50NjREYXRhOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuaW50NjREYXRhLmxlbmd0aDsrK3QpaWYoIShsLmlzSW50ZWdlcihlLmludDY0RGF0YVt0XSl8fGUuaW50NjREYXRhW3RdJiZsLmlzSW50ZWdlcihlLmludDY0RGF0YVt0XS5sb3cpJiZsLmlzSW50ZWdlcihlLmludDY0RGF0YVt0XS5oaWdoKSkpcmV0dXJuICJpbnQ2NERhdGE6IGludGVnZXJ8TG9uZ1tdIGV4cGVjdGVkIn1pZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmIWwuaXNTdHJpbmcoZS5uYW1lKSlyZXR1cm4gIm5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJmUuaGFzT3duUHJvcGVydHkoImRvY1N0cmluZyIpJiYhbC5pc1N0cmluZyhlLmRvY1N0cmluZykpcmV0dXJuICJkb2NTdHJpbmc6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5yYXdEYXRhJiZlLmhhc093blByb3BlcnR5KCJyYXdEYXRhIikmJiEoZS5yYXdEYXRhJiYibnVtYmVyIj09dHlwZW9mIGUucmF3RGF0YS5sZW5ndGh8fGwuaXNTdHJpbmcoZS5yYXdEYXRhKSkpcmV0dXJuICJyYXdEYXRhOiBidWZmZXIgZXhwZWN0ZWQiO2lmKG51bGwhPWUuZXh0ZXJuYWxEYXRhJiZlLmhhc093blByb3BlcnR5KCJleHRlcm5hbERhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5leHRlcm5hbERhdGEpKXJldHVybiAiZXh0ZXJuYWxEYXRhOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuZXh0ZXJuYWxEYXRhLmxlbmd0aDsrK3Qpe3ZhciBuO2lmKG49Yy5vbm54LlN0cmluZ1N0cmluZ0VudHJ5UHJvdG8udmVyaWZ5KGUuZXh0ZXJuYWxEYXRhW3RdKSlyZXR1cm4gImV4dGVybmFsRGF0YS4iK259fWlmKG51bGwhPWUuZGF0YUxvY2F0aW9uJiZlLmhhc093blByb3BlcnR5KCJkYXRhTG9jYXRpb24iKSlzd2l0Y2goZS5kYXRhTG9jYXRpb24pe2RlZmF1bHQ6cmV0dXJuICJkYXRhTG9jYXRpb246IGVudW0gdmFsdWUgZXhwZWN0ZWQiO2Nhc2UgMDpjYXNlIDE6fWlmKG51bGwhPWUuZG91YmxlRGF0YSYmZS5oYXNPd25Qcm9wZXJ0eSgiZG91YmxlRGF0YSIpKXtpZighQXJyYXkuaXNBcnJheShlLmRvdWJsZURhdGEpKXJldHVybiAiZG91YmxlRGF0YTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmRvdWJsZURhdGEubGVuZ3RoOysrdClpZigibnVtYmVyIiE9dHlwZW9mIGUuZG91YmxlRGF0YVt0XSlyZXR1cm4gImRvdWJsZURhdGE6IG51bWJlcltdIGV4cGVjdGVkIn1pZihudWxsIT1lLnVpbnQ2NERhdGEmJmUuaGFzT3duUHJvcGVydHkoInVpbnQ2NERhdGEiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS51aW50NjREYXRhKSlyZXR1cm4gInVpbnQ2NERhdGE6IGFycmF5IGV4cGVjdGVkIjtmb3IodD0wO3Q8ZS51aW50NjREYXRhLmxlbmd0aDsrK3QpaWYoIShsLmlzSW50ZWdlcihlLnVpbnQ2NERhdGFbdF0pfHxlLnVpbnQ2NERhdGFbdF0mJmwuaXNJbnRlZ2VyKGUudWludDY0RGF0YVt0XS5sb3cpJiZsLmlzSW50ZWdlcihlLnVpbnQ2NERhdGFbdF0uaGlnaCkpKXJldHVybiAidWludDY0RGF0YTogaW50ZWdlcnxMb25nW10gZXhwZWN0ZWQifXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UZW5zb3JQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlRlbnNvclByb3RvO2lmKGUuZGltcyl7aWYoIUFycmF5LmlzQXJyYXkoZS5kaW1zKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLmRpbXM6IGFycmF5IGV4cGVjdGVkIik7dC5kaW1zPVtdO2Zvcih2YXIgbj0wO248ZS5kaW1zLmxlbmd0aDsrK24pbC5Mb25nPyh0LmRpbXNbbl09bC5Mb25nLmZyb21WYWx1ZShlLmRpbXNbbl0pKS51bnNpZ25lZD0hMToic3RyaW5nIj09dHlwZW9mIGUuZGltc1tuXT90LmRpbXNbbl09cGFyc2VJbnQoZS5kaW1zW25dLDEwKToibnVtYmVyIj09dHlwZW9mIGUuZGltc1tuXT90LmRpbXNbbl09ZS5kaW1zW25dOiJvYmplY3QiPT10eXBlb2YgZS5kaW1zW25dJiYodC5kaW1zW25dPW5ldyBsLkxvbmdCaXRzKGUuZGltc1tuXS5sb3c+Pj4wLGUuZGltc1tuXS5oaWdoPj4+MCkudG9OdW1iZXIoKSk7fWlmKG51bGwhPWUuZGF0YVR5cGUmJih0LmRhdGFUeXBlPTB8ZS5kYXRhVHlwZSksbnVsbCE9ZS5zZWdtZW50KXtpZigib2JqZWN0IiE9dHlwZW9mIGUuc2VnbWVudCl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLnNlZ21lbnQ6IG9iamVjdCBleHBlY3RlZCIpO3Quc2VnbWVudD1jLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudC5mcm9tT2JqZWN0KGUuc2VnbWVudCk7fWlmKGUuZmxvYXREYXRhKXtpZighQXJyYXkuaXNBcnJheShlLmZsb2F0RGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5mbG9hdERhdGE6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuZmxvYXREYXRhPVtdLG49MDtuPGUuZmxvYXREYXRhLmxlbmd0aDsrK24pdC5mbG9hdERhdGFbbl09TnVtYmVyKGUuZmxvYXREYXRhW25dKTt9aWYoZS5pbnQzMkRhdGEpe2lmKCFBcnJheS5pc0FycmF5KGUuaW50MzJEYXRhKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLmludDMyRGF0YTogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5pbnQzMkRhdGE9W10sbj0wO248ZS5pbnQzMkRhdGEubGVuZ3RoOysrbil0LmludDMyRGF0YVtuXT0wfGUuaW50MzJEYXRhW25dO31pZihlLnN0cmluZ0RhdGEpe2lmKCFBcnJheS5pc0FycmF5KGUuc3RyaW5nRGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5zdHJpbmdEYXRhOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0LnN0cmluZ0RhdGE9W10sbj0wO248ZS5zdHJpbmdEYXRhLmxlbmd0aDsrK24pInN0cmluZyI9PXR5cGVvZiBlLnN0cmluZ0RhdGFbbl0/bC5iYXNlNjQuZGVjb2RlKGUuc3RyaW5nRGF0YVtuXSx0LnN0cmluZ0RhdGFbbl09bC5uZXdCdWZmZXIobC5iYXNlNjQubGVuZ3RoKGUuc3RyaW5nRGF0YVtuXSkpLDApOmUuc3RyaW5nRGF0YVtuXS5sZW5ndGg+PTAmJih0LnN0cmluZ0RhdGFbbl09ZS5zdHJpbmdEYXRhW25dKTt9aWYoZS5pbnQ2NERhdGEpe2lmKCFBcnJheS5pc0FycmF5KGUuaW50NjREYXRhKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLmludDY0RGF0YTogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5pbnQ2NERhdGE9W10sbj0wO248ZS5pbnQ2NERhdGEubGVuZ3RoOysrbilsLkxvbmc/KHQuaW50NjREYXRhW25dPWwuTG9uZy5mcm9tVmFsdWUoZS5pbnQ2NERhdGFbbl0pKS51bnNpZ25lZD0hMToic3RyaW5nIj09dHlwZW9mIGUuaW50NjREYXRhW25dP3QuaW50NjREYXRhW25dPXBhcnNlSW50KGUuaW50NjREYXRhW25dLDEwKToibnVtYmVyIj09dHlwZW9mIGUuaW50NjREYXRhW25dP3QuaW50NjREYXRhW25dPWUuaW50NjREYXRhW25dOiJvYmplY3QiPT10eXBlb2YgZS5pbnQ2NERhdGFbbl0mJih0LmludDY0RGF0YVtuXT1uZXcgbC5Mb25nQml0cyhlLmludDY0RGF0YVtuXS5sb3c+Pj4wLGUuaW50NjREYXRhW25dLmhpZ2g+Pj4wKS50b051bWJlcigpKTt9aWYobnVsbCE9ZS5uYW1lJiYodC5uYW1lPVN0cmluZyhlLm5hbWUpKSxudWxsIT1lLmRvY1N0cmluZyYmKHQuZG9jU3RyaW5nPVN0cmluZyhlLmRvY1N0cmluZykpLG51bGwhPWUucmF3RGF0YSYmKCJzdHJpbmciPT10eXBlb2YgZS5yYXdEYXRhP2wuYmFzZTY0LmRlY29kZShlLnJhd0RhdGEsdC5yYXdEYXRhPWwubmV3QnVmZmVyKGwuYmFzZTY0Lmxlbmd0aChlLnJhd0RhdGEpKSwwKTplLnJhd0RhdGEubGVuZ3RoPj0wJiYodC5yYXdEYXRhPWUucmF3RGF0YSkpLGUuZXh0ZXJuYWxEYXRhKXtpZighQXJyYXkuaXNBcnJheShlLmV4dGVybmFsRGF0YSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5leHRlcm5hbERhdGE6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuZXh0ZXJuYWxEYXRhPVtdLG49MDtuPGUuZXh0ZXJuYWxEYXRhLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5leHRlcm5hbERhdGFbbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5UZW5zb3JQcm90by5leHRlcm5hbERhdGE6IG9iamVjdCBleHBlY3RlZCIpO3QuZXh0ZXJuYWxEYXRhW25dPWMub25ueC5TdHJpbmdTdHJpbmdFbnRyeVByb3RvLmZyb21PYmplY3QoZS5leHRlcm5hbERhdGFbbl0pO319c3dpdGNoKGUuZGF0YUxvY2F0aW9uKXtkZWZhdWx0OmlmKCJudW1iZXIiPT10eXBlb2YgZS5kYXRhTG9jYXRpb24pe3QuZGF0YUxvY2F0aW9uPWUuZGF0YUxvY2F0aW9uO2JyZWFrfWJyZWFrO2Nhc2UiREVGQVVMVCI6Y2FzZSAwOnQuZGF0YUxvY2F0aW9uPTA7YnJlYWs7Y2FzZSJFWFRFUk5BTCI6Y2FzZSAxOnQuZGF0YUxvY2F0aW9uPTE7fWlmKGUuZG91YmxlRGF0YSl7aWYoIUFycmF5LmlzQXJyYXkoZS5kb3VibGVEYXRhKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLmRvdWJsZURhdGE6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuZG91YmxlRGF0YT1bXSxuPTA7bjxlLmRvdWJsZURhdGEubGVuZ3RoOysrbil0LmRvdWJsZURhdGFbbl09TnVtYmVyKGUuZG91YmxlRGF0YVtuXSk7fWlmKGUudWludDY0RGF0YSl7aWYoIUFycmF5LmlzQXJyYXkoZS51aW50NjREYXRhKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclByb3RvLnVpbnQ2NERhdGE6IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQudWludDY0RGF0YT1bXSxuPTA7bjxlLnVpbnQ2NERhdGEubGVuZ3RoOysrbilsLkxvbmc/KHQudWludDY0RGF0YVtuXT1sLkxvbmcuZnJvbVZhbHVlKGUudWludDY0RGF0YVtuXSkpLnVuc2lnbmVkPSEwOiJzdHJpbmciPT10eXBlb2YgZS51aW50NjREYXRhW25dP3QudWludDY0RGF0YVtuXT1wYXJzZUludChlLnVpbnQ2NERhdGFbbl0sMTApOiJudW1iZXIiPT10eXBlb2YgZS51aW50NjREYXRhW25dP3QudWludDY0RGF0YVtuXT1lLnVpbnQ2NERhdGFbbl06Im9iamVjdCI9PXR5cGVvZiBlLnVpbnQ2NERhdGFbbl0mJih0LnVpbnQ2NERhdGFbbl09bmV3IGwuTG9uZ0JpdHMoZS51aW50NjREYXRhW25dLmxvdz4+PjAsZS51aW50NjREYXRhW25dLmhpZ2g+Pj4wKS50b051bWJlcighMCkpO31yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5kaW1zPVtdLG4uZmxvYXREYXRhPVtdLG4uaW50MzJEYXRhPVtdLG4uc3RyaW5nRGF0YT1bXSxuLmludDY0RGF0YT1bXSxuLmRvdWJsZURhdGE9W10sbi51aW50NjREYXRhPVtdLG4uZXh0ZXJuYWxEYXRhPVtdKSx0LmRlZmF1bHRzJiYobi5kYXRhVHlwZT0wLG4uc2VnbWVudD1udWxsLG4ubmFtZT0iIix0LmJ5dGVzPT09U3RyaW5nP24ucmF3RGF0YT0iIjoobi5yYXdEYXRhPVtdLHQuYnl0ZXMhPT1BcnJheSYmKG4ucmF3RGF0YT1sLm5ld0J1ZmZlcihuLnJhd0RhdGEpKSksbi5kb2NTdHJpbmc9IiIsbi5kYXRhTG9jYXRpb249dC5lbnVtcz09PVN0cmluZz8iREVGQVVMVCI6MCksZS5kaW1zJiZlLmRpbXMubGVuZ3RoKXtuLmRpbXM9W107Zm9yKHZhciByPTA7cjxlLmRpbXMubGVuZ3RoOysrcikibnVtYmVyIj09dHlwZW9mIGUuZGltc1tyXT9uLmRpbXNbcl09dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5kaW1zW3JdKTplLmRpbXNbcl06bi5kaW1zW3JdPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuZGltc1tyXSk6dC5sb25ncz09PU51bWJlcj9uZXcgbC5Mb25nQml0cyhlLmRpbXNbcl0ubG93Pj4+MCxlLmRpbXNbcl0uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5kaW1zW3JdO31pZihudWxsIT1lLmRhdGFUeXBlJiZlLmhhc093blByb3BlcnR5KCJkYXRhVHlwZSIpJiYobi5kYXRhVHlwZT1lLmRhdGFUeXBlKSxudWxsIT1lLnNlZ21lbnQmJmUuaGFzT3duUHJvcGVydHkoInNlZ21lbnQiKSYmKG4uc2VnbWVudD1jLm9ubnguVGVuc29yUHJvdG8uU2VnbWVudC50b09iamVjdChlLnNlZ21lbnQsdCkpLGUuZmxvYXREYXRhJiZlLmZsb2F0RGF0YS5sZW5ndGgpZm9yKG4uZmxvYXREYXRhPVtdLHI9MDtyPGUuZmxvYXREYXRhLmxlbmd0aDsrK3Ipbi5mbG9hdERhdGFbcl09dC5qc29uJiYhaXNGaW5pdGUoZS5mbG9hdERhdGFbcl0pP1N0cmluZyhlLmZsb2F0RGF0YVtyXSk6ZS5mbG9hdERhdGFbcl07aWYoZS5pbnQzMkRhdGEmJmUuaW50MzJEYXRhLmxlbmd0aClmb3Iobi5pbnQzMkRhdGE9W10scj0wO3I8ZS5pbnQzMkRhdGEubGVuZ3RoOysrciluLmludDMyRGF0YVtyXT1lLmludDMyRGF0YVtyXTtpZihlLnN0cmluZ0RhdGEmJmUuc3RyaW5nRGF0YS5sZW5ndGgpZm9yKG4uc3RyaW5nRGF0YT1bXSxyPTA7cjxlLnN0cmluZ0RhdGEubGVuZ3RoOysrciluLnN0cmluZ0RhdGFbcl09dC5ieXRlcz09PVN0cmluZz9sLmJhc2U2NC5lbmNvZGUoZS5zdHJpbmdEYXRhW3JdLDAsZS5zdHJpbmdEYXRhW3JdLmxlbmd0aCk6dC5ieXRlcz09PUFycmF5P0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuc3RyaW5nRGF0YVtyXSk6ZS5zdHJpbmdEYXRhW3JdO2lmKGUuaW50NjREYXRhJiZlLmludDY0RGF0YS5sZW5ndGgpZm9yKG4uaW50NjREYXRhPVtdLHI9MDtyPGUuaW50NjREYXRhLmxlbmd0aDsrK3IpIm51bWJlciI9PXR5cGVvZiBlLmludDY0RGF0YVtyXT9uLmludDY0RGF0YVtyXT10LmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLmludDY0RGF0YVtyXSk6ZS5pbnQ2NERhdGFbcl06bi5pbnQ2NERhdGFbcl09dC5sb25ncz09PVN0cmluZz9sLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5pbnQ2NERhdGFbcl0pOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5pbnQ2NERhdGFbcl0ubG93Pj4+MCxlLmludDY0RGF0YVtyXS5oaWdoPj4+MCkudG9OdW1iZXIoKTplLmludDY0RGF0YVtyXTtpZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmKG4ubmFtZT1lLm5hbWUpLG51bGwhPWUucmF3RGF0YSYmZS5oYXNPd25Qcm9wZXJ0eSgicmF3RGF0YSIpJiYobi5yYXdEYXRhPXQuYnl0ZXM9PT1TdHJpbmc/bC5iYXNlNjQuZW5jb2RlKGUucmF3RGF0YSwwLGUucmF3RGF0YS5sZW5ndGgpOnQuYnl0ZXM9PT1BcnJheT9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLnJhd0RhdGEpOmUucmF3RGF0YSksZS5kb3VibGVEYXRhJiZlLmRvdWJsZURhdGEubGVuZ3RoKWZvcihuLmRvdWJsZURhdGE9W10scj0wO3I8ZS5kb3VibGVEYXRhLmxlbmd0aDsrK3Ipbi5kb3VibGVEYXRhW3JdPXQuanNvbiYmIWlzRmluaXRlKGUuZG91YmxlRGF0YVtyXSk/U3RyaW5nKGUuZG91YmxlRGF0YVtyXSk6ZS5kb3VibGVEYXRhW3JdO2lmKGUudWludDY0RGF0YSYmZS51aW50NjREYXRhLmxlbmd0aClmb3Iobi51aW50NjREYXRhPVtdLHI9MDtyPGUudWludDY0RGF0YS5sZW5ndGg7KytyKSJudW1iZXIiPT10eXBlb2YgZS51aW50NjREYXRhW3JdP24udWludDY0RGF0YVtyXT10LmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLnVpbnQ2NERhdGFbcl0pOmUudWludDY0RGF0YVtyXTpuLnVpbnQ2NERhdGFbcl09dC5sb25ncz09PVN0cmluZz9sLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS51aW50NjREYXRhW3JdKTp0LmxvbmdzPT09TnVtYmVyP25ldyBsLkxvbmdCaXRzKGUudWludDY0RGF0YVtyXS5sb3c+Pj4wLGUudWludDY0RGF0YVtyXS5oaWdoPj4+MCkudG9OdW1iZXIoITApOmUudWludDY0RGF0YVtyXTtpZihudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJihuLmRvY1N0cmluZz1lLmRvY1N0cmluZyksZS5leHRlcm5hbERhdGEmJmUuZXh0ZXJuYWxEYXRhLmxlbmd0aClmb3Iobi5leHRlcm5hbERhdGE9W10scj0wO3I8ZS5leHRlcm5hbERhdGEubGVuZ3RoOysrciluLmV4dGVybmFsRGF0YVtyXT1jLm9ubnguU3RyaW5nU3RyaW5nRW50cnlQcm90by50b09iamVjdChlLmV4dGVybmFsRGF0YVtyXSx0KTtyZXR1cm4gbnVsbCE9ZS5kYXRhTG9jYXRpb24mJmUuaGFzT3duUHJvcGVydHkoImRhdGFMb2NhdGlvbiIpJiYobi5kYXRhTG9jYXRpb249dC5lbnVtcz09PVN0cmluZz92b2lkIDA9PT1jLm9ubnguVGVuc29yUHJvdG8uRGF0YUxvY2F0aW9uW2UuZGF0YUxvY2F0aW9uXT9lLmRhdGFMb2NhdGlvbjpjLm9ubnguVGVuc29yUHJvdG8uRGF0YUxvY2F0aW9uW2UuZGF0YUxvY2F0aW9uXTplLmRhdGFMb2NhdGlvbiksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UZW5zb3JQcm90byJ9LGUuRGF0YVR5cGU9ZnVuY3Rpb24oKXt2YXIgZT17fSx0PU9iamVjdC5jcmVhdGUoZSk7cmV0dXJuIHRbZVswXT0iVU5ERUZJTkVEIl09MCx0W2VbMV09IkZMT0FUIl09MSx0W2VbMl09IlVJTlQ4Il09Mix0W2VbM109IklOVDgiXT0zLHRbZVs0XT0iVUlOVDE2Il09NCx0W2VbNV09IklOVDE2Il09NSx0W2VbNl09IklOVDMyIl09Nix0W2VbN109IklOVDY0Il09Nyx0W2VbOF09IlNUUklORyJdPTgsdFtlWzldPSJCT09MIl09OSx0W2VbMTBdPSJGTE9BVDE2Il09MTAsdFtlWzExXT0iRE9VQkxFIl09MTEsdFtlWzEyXT0iVUlOVDMyIl09MTIsdFtlWzEzXT0iVUlOVDY0Il09MTMsdFtlWzE0XT0iQ09NUExFWDY0Il09MTQsdFtlWzE1XT0iQ09NUExFWDEyOCJdPTE1LHRbZVsxNl09IkJGTE9BVDE2Il09MTYsdFtlWzE3XT0iRkxPQVQ4RTRNM0ZOIl09MTcsdFtlWzE4XT0iRkxPQVQ4RTRNM0ZOVVoiXT0xOCx0W2VbMTldPSJGTE9BVDhFNU0yIl09MTksdFtlWzIwXT0iRkxPQVQ4RTVNMkZOVVoiXT0yMCx0fSgpLGUuU2VnbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUuYmVnaW49bC5Mb25nP2wuTG9uZy5mcm9tQml0cygwLDAsITEpOjAsZS5wcm90b3R5cGUuZW5kPWwuTG9uZz9sLkxvbmcuZnJvbUJpdHMoMCwwLCExKTowLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5iZWdpbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiYmVnaW4iKSYmdC51aW50MzIoOCkuaW50NjQoZS5iZWdpbiksbnVsbCE9ZS5lbmQmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImVuZCIpJiZ0LnVpbnQzMigxNikuaW50NjQoZS5lbmQpLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UZW5zb3JQcm90by5TZWdtZW50O2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIuYmVnaW49ZS5pbnQ2NCgpO2JyZWFrO2Nhc2UgMjpyLmVuZD1lLmludDY0KCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7cmV0dXJuICJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWU/Im9iamVjdCBleHBlY3RlZCI6bnVsbCE9ZS5iZWdpbiYmZS5oYXNPd25Qcm9wZXJ0eSgiYmVnaW4iKSYmIShsLmlzSW50ZWdlcihlLmJlZ2luKXx8ZS5iZWdpbiYmbC5pc0ludGVnZXIoZS5iZWdpbi5sb3cpJiZsLmlzSW50ZWdlcihlLmJlZ2luLmhpZ2gpKT8iYmVnaW46IGludGVnZXJ8TG9uZyBleHBlY3RlZCI6bnVsbCE9ZS5lbmQmJmUuaGFzT3duUHJvcGVydHkoImVuZCIpJiYhKGwuaXNJbnRlZ2VyKGUuZW5kKXx8ZS5lbmQmJmwuaXNJbnRlZ2VyKGUuZW5kLmxvdykmJmwuaXNJbnRlZ2VyKGUuZW5kLmhpZ2gpKT8iZW5kOiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWQiOm51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlRlbnNvclByb3RvLlNlZ21lbnQpcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UZW5zb3JQcm90by5TZWdtZW50O3JldHVybiBudWxsIT1lLmJlZ2luJiYobC5Mb25nPyh0LmJlZ2luPWwuTG9uZy5mcm9tVmFsdWUoZS5iZWdpbikpLnVuc2lnbmVkPSExOiJzdHJpbmciPT10eXBlb2YgZS5iZWdpbj90LmJlZ2luPXBhcnNlSW50KGUuYmVnaW4sMTApOiJudW1iZXIiPT10eXBlb2YgZS5iZWdpbj90LmJlZ2luPWUuYmVnaW46Im9iamVjdCI9PXR5cGVvZiBlLmJlZ2luJiYodC5iZWdpbj1uZXcgbC5Mb25nQml0cyhlLmJlZ2luLmxvdz4+PjAsZS5iZWdpbi5oaWdoPj4+MCkudG9OdW1iZXIoKSkpLG51bGwhPWUuZW5kJiYobC5Mb25nPyh0LmVuZD1sLkxvbmcuZnJvbVZhbHVlKGUuZW5kKSkudW5zaWduZWQ9ITE6InN0cmluZyI9PXR5cGVvZiBlLmVuZD90LmVuZD1wYXJzZUludChlLmVuZCwxMCk6Im51bWJlciI9PXR5cGVvZiBlLmVuZD90LmVuZD1lLmVuZDoib2JqZWN0Ij09dHlwZW9mIGUuZW5kJiYodC5lbmQ9bmV3IGwuTG9uZ0JpdHMoZS5lbmQubG93Pj4+MCxlLmVuZC5oaWdoPj4+MCkudG9OdW1iZXIoKSkpLHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307aWYodC5kZWZhdWx0cyl7aWYobC5Mb25nKXt2YXIgcj1uZXcgbC5Mb25nKDAsMCwhMSk7bi5iZWdpbj10LmxvbmdzPT09U3RyaW5nP3IudG9TdHJpbmcoKTp0LmxvbmdzPT09TnVtYmVyP3IudG9OdW1iZXIoKTpyO31lbHNlIG4uYmVnaW49dC5sb25ncz09PVN0cmluZz8iMCI6MDtsLkxvbmc/KHI9bmV3IGwuTG9uZygwLDAsITEpLG4uZW5kPXQubG9uZ3M9PT1TdHJpbmc/ci50b1N0cmluZygpOnQubG9uZ3M9PT1OdW1iZXI/ci50b051bWJlcigpOnIpOm4uZW5kPXQubG9uZ3M9PT1TdHJpbmc/IjAiOjA7fXJldHVybiBudWxsIT1lLmJlZ2luJiZlLmhhc093blByb3BlcnR5KCJiZWdpbiIpJiYoIm51bWJlciI9PXR5cGVvZiBlLmJlZ2luP24uYmVnaW49dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5iZWdpbik6ZS5iZWdpbjpuLmJlZ2luPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuYmVnaW4pOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5iZWdpbi5sb3c+Pj4wLGUuYmVnaW4uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5iZWdpbiksbnVsbCE9ZS5lbmQmJmUuaGFzT3duUHJvcGVydHkoImVuZCIpJiYoIm51bWJlciI9PXR5cGVvZiBlLmVuZD9uLmVuZD10LmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLmVuZCk6ZS5lbmQ6bi5lbmQ9dC5sb25ncz09PVN0cmluZz9sLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5lbmQpOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5lbmQubG93Pj4+MCxlLmVuZC5oaWdoPj4+MCkudG9OdW1iZXIoKTplLmVuZCksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UZW5zb3JQcm90by5TZWdtZW50In0sZX0oKSxlLkRhdGFMb2NhdGlvbj1mdW5jdGlvbigpe3ZhciBlPXt9LHQ9T2JqZWN0LmNyZWF0ZShlKTtyZXR1cm4gdFtlWzBdPSJERUZBVUxUIl09MCx0W2VbMV09IkVYVEVSTkFMIl09MSx0fSgpLGV9KCksaS5TcGFyc2VUZW5zb3JQcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5kaW1zPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLnZhbHVlcz1udWxsLGUucHJvdG90eXBlLmluZGljZXM9bnVsbCxlLnByb3RvdHlwZS5kaW1zPWwuZW1wdHlBcnJheSxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7aWYodHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS52YWx1ZXMmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInZhbHVlcyIpJiZjLm9ubnguVGVuc29yUHJvdG8uZW5jb2RlKGUudmFsdWVzLHQudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuaW5kaWNlcyYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiaW5kaWNlcyIpJiZjLm9ubnguVGVuc29yUHJvdG8uZW5jb2RlKGUuaW5kaWNlcyx0LnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLmRpbXMmJmUuZGltcy5sZW5ndGgpe3QudWludDMyKDI2KS5mb3JrKCk7Zm9yKHZhciBuPTA7bjxlLmRpbXMubGVuZ3RoOysrbil0LmludDY0KGUuZGltc1tuXSk7dC5sZGVsaW0oKTt9cmV0dXJuIHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5TcGFyc2VUZW5zb3JQcm90bztlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLnZhbHVlcz1jLm9ubnguVGVuc29yUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSAyOnIuaW5kaWNlcz1jLm9ubnguVGVuc29yUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSAzOmlmKHIuZGltcyYmci5kaW1zLmxlbmd0aHx8KHIuZGltcz1bXSksMj09KDcmbykpZm9yKHZhciBpPWUudWludDMyKCkrZS5wb3M7ZS5wb3M8aTspci5kaW1zLnB1c2goZS5pbnQ2NCgpKTtlbHNlIHIuZGltcy5wdXNoKGUuaW50NjQoKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7dmFyIHQ7aWYobnVsbCE9ZS52YWx1ZXMmJmUuaGFzT3duUHJvcGVydHkoInZhbHVlcyIpJiYodD1jLm9ubnguVGVuc29yUHJvdG8udmVyaWZ5KGUudmFsdWVzKSkpcmV0dXJuICJ2YWx1ZXMuIit0O2lmKG51bGwhPWUuaW5kaWNlcyYmZS5oYXNPd25Qcm9wZXJ0eSgiaW5kaWNlcyIpJiYodD1jLm9ubnguVGVuc29yUHJvdG8udmVyaWZ5KGUuaW5kaWNlcykpKXJldHVybiAiaW5kaWNlcy4iK3Q7aWYobnVsbCE9ZS5kaW1zJiZlLmhhc093blByb3BlcnR5KCJkaW1zIikpe2lmKCFBcnJheS5pc0FycmF5KGUuZGltcykpcmV0dXJuICJkaW1zOiBhcnJheSBleHBlY3RlZCI7Zm9yKHZhciBuPTA7bjxlLmRpbXMubGVuZ3RoOysrbilpZighKGwuaXNJbnRlZ2VyKGUuZGltc1tuXSl8fGUuZGltc1tuXSYmbC5pc0ludGVnZXIoZS5kaW1zW25dLmxvdykmJmwuaXNJbnRlZ2VyKGUuZGltc1tuXS5oaWdoKSkpcmV0dXJuICJkaW1zOiBpbnRlZ2VyfExvbmdbXSBleHBlY3RlZCJ9cmV0dXJuIG51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlNwYXJzZVRlbnNvclByb3RvKXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguU3BhcnNlVGVuc29yUHJvdG87aWYobnVsbCE9ZS52YWx1ZXMpe2lmKCJvYmplY3QiIT10eXBlb2YgZS52YWx1ZXMpdGhyb3cgVHlwZUVycm9yKCIub25ueC5TcGFyc2VUZW5zb3JQcm90by52YWx1ZXM6IG9iamVjdCBleHBlY3RlZCIpO3QudmFsdWVzPWMub25ueC5UZW5zb3JQcm90by5mcm9tT2JqZWN0KGUudmFsdWVzKTt9aWYobnVsbCE9ZS5pbmRpY2VzKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuaW5kaWNlcyl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlNwYXJzZVRlbnNvclByb3RvLmluZGljZXM6IG9iamVjdCBleHBlY3RlZCIpO3QuaW5kaWNlcz1jLm9ubnguVGVuc29yUHJvdG8uZnJvbU9iamVjdChlLmluZGljZXMpO31pZihlLmRpbXMpe2lmKCFBcnJheS5pc0FycmF5KGUuZGltcykpdGhyb3cgVHlwZUVycm9yKCIub25ueC5TcGFyc2VUZW5zb3JQcm90by5kaW1zOiBhcnJheSBleHBlY3RlZCIpO3QuZGltcz1bXTtmb3IodmFyIG49MDtuPGUuZGltcy5sZW5ndGg7KytuKWwuTG9uZz8odC5kaW1zW25dPWwuTG9uZy5mcm9tVmFsdWUoZS5kaW1zW25dKSkudW5zaWduZWQ9ITE6InN0cmluZyI9PXR5cGVvZiBlLmRpbXNbbl0/dC5kaW1zW25dPXBhcnNlSW50KGUuZGltc1tuXSwxMCk6Im51bWJlciI9PXR5cGVvZiBlLmRpbXNbbl0/dC5kaW1zW25dPWUuZGltc1tuXToib2JqZWN0Ij09dHlwZW9mIGUuZGltc1tuXSYmKHQuZGltc1tuXT1uZXcgbC5Mb25nQml0cyhlLmRpbXNbbl0ubG93Pj4+MCxlLmRpbXNbbl0uaGlnaD4+PjApLnRvTnVtYmVyKCkpO31yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5kaW1zPVtdKSx0LmRlZmF1bHRzJiYobi52YWx1ZXM9bnVsbCxuLmluZGljZXM9bnVsbCksbnVsbCE9ZS52YWx1ZXMmJmUuaGFzT3duUHJvcGVydHkoInZhbHVlcyIpJiYobi52YWx1ZXM9Yy5vbm54LlRlbnNvclByb3RvLnRvT2JqZWN0KGUudmFsdWVzLHQpKSxudWxsIT1lLmluZGljZXMmJmUuaGFzT3duUHJvcGVydHkoImluZGljZXMiKSYmKG4uaW5kaWNlcz1jLm9ubnguVGVuc29yUHJvdG8udG9PYmplY3QoZS5pbmRpY2VzLHQpKSxlLmRpbXMmJmUuZGltcy5sZW5ndGgpe24uZGltcz1bXTtmb3IodmFyIHI9MDtyPGUuZGltcy5sZW5ndGg7KytyKSJudW1iZXIiPT10eXBlb2YgZS5kaW1zW3JdP24uZGltc1tyXT10LmxvbmdzPT09U3RyaW5nP1N0cmluZyhlLmRpbXNbcl0pOmUuZGltc1tyXTpuLmRpbXNbcl09dC5sb25ncz09PVN0cmluZz9sLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5kaW1zW3JdKTp0LmxvbmdzPT09TnVtYmVyP25ldyBsLkxvbmdCaXRzKGUuZGltc1tyXS5sb3c+Pj4wLGUuZGltc1tyXS5oaWdoPj4+MCkudG9OdW1iZXIoKTplLmRpbXNbcl07fXJldHVybiBufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlNwYXJzZVRlbnNvclByb3RvIn0sZX0oKSxpLlRlbnNvclNoYXBlUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMuZGltPVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmRpbT1sLmVtcHR5QXJyYXksZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe2lmKHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUuZGltJiZlLmRpbS5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLmRpbS5sZW5ndGg7KytuKWMub25ueC5UZW5zb3JTaGFwZVByb3RvLkRpbWVuc2lvbi5lbmNvZGUoZS5kaW1bbl0sdC51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UZW5zb3JTaGFwZVByb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO28+Pj4zPT0xPyhyLmRpbSYmci5kaW0ubGVuZ3RofHwoci5kaW09W10pLHIuZGltLnB1c2goYy5vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uLmRlY29kZShlLGUudWludDMyKCkpKSk6ZS5za2lwVHlwZSg3Jm8pO31yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5kaW0mJmUuaGFzT3duUHJvcGVydHkoImRpbSIpKXtpZighQXJyYXkuaXNBcnJheShlLmRpbSkpcmV0dXJuICJkaW06IGFycmF5IGV4cGVjdGVkIjtmb3IodmFyIHQ9MDt0PGUuZGltLmxlbmd0aDsrK3Qpe3ZhciBuPWMub25ueC5UZW5zb3JTaGFwZVByb3RvLkRpbWVuc2lvbi52ZXJpZnkoZS5kaW1bdF0pO2lmKG4pcmV0dXJuICJkaW0uIitufX1yZXR1cm4gbnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguVGVuc29yU2hhcGVQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlRlbnNvclNoYXBlUHJvdG87aWYoZS5kaW0pe2lmKCFBcnJheS5pc0FycmF5KGUuZGltKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclNoYXBlUHJvdG8uZGltOiBhcnJheSBleHBlY3RlZCIpO3QuZGltPVtdO2Zvcih2YXIgbj0wO248ZS5kaW0ubGVuZ3RoOysrbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmRpbVtuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlRlbnNvclNoYXBlUHJvdG8uZGltOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmRpbVtuXT1jLm9ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24uZnJvbU9iamVjdChlLmRpbVtuXSk7fX1yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5kaW09W10pLGUuZGltJiZlLmRpbS5sZW5ndGgpe24uZGltPVtdO2Zvcih2YXIgcj0wO3I8ZS5kaW0ubGVuZ3RoOysrciluLmRpbVtyXT1jLm9ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24udG9PYmplY3QoZS5kaW1bcl0sdCk7fXJldHVybiBufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlRlbnNvclNoYXBlUHJvdG8ifSxlLkRpbWVuc2lvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO312YXIgdDtyZXR1cm4gZS5wcm90b3R5cGUuZGltVmFsdWU9bnVsbCxlLnByb3RvdHlwZS5kaW1QYXJhbT1udWxsLGUucHJvdG90eXBlLmRlbm90YXRpb249IiIsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ2YWx1ZSIse2dldDpsLm9uZU9mR2V0dGVyKHQ9WyJkaW1WYWx1ZSIsImRpbVBhcmFtIl0pLHNldDpsLm9uZU9mU2V0dGVyKHQpfSksZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmRpbVZhbHVlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkaW1WYWx1ZSIpJiZ0LnVpbnQzMig4KS5pbnQ2NChlLmRpbVZhbHVlKSxudWxsIT1lLmRpbVBhcmFtJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkaW1QYXJhbSIpJiZ0LnVpbnQzMigxOCkuc3RyaW5nKGUuZGltUGFyYW0pLG51bGwhPWUuZGVub3RhdGlvbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZGVub3RhdGlvbiIpJiZ0LnVpbnQzMigyNikuc3RyaW5nKGUuZGVub3RhdGlvbiksdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIuZGltVmFsdWU9ZS5pbnQ2NCgpO2JyZWFrO2Nhc2UgMjpyLmRpbVBhcmFtPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAzOnIuZGVub3RhdGlvbj1lLnN0cmluZygpO2JyZWFrO2RlZmF1bHQ6ZS5za2lwVHlwZSg3Jm8pO319cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO3ZhciB0PXt9O2lmKG51bGwhPWUuZGltVmFsdWUmJmUuaGFzT3duUHJvcGVydHkoImRpbVZhbHVlIikmJih0LnZhbHVlPTEsIShsLmlzSW50ZWdlcihlLmRpbVZhbHVlKXx8ZS5kaW1WYWx1ZSYmbC5pc0ludGVnZXIoZS5kaW1WYWx1ZS5sb3cpJiZsLmlzSW50ZWdlcihlLmRpbVZhbHVlLmhpZ2gpKSkpcmV0dXJuICJkaW1WYWx1ZTogaW50ZWdlcnxMb25nIGV4cGVjdGVkIjtpZihudWxsIT1lLmRpbVBhcmFtJiZlLmhhc093blByb3BlcnR5KCJkaW1QYXJhbSIpKXtpZigxPT09dC52YWx1ZSlyZXR1cm4gInZhbHVlOiBtdWx0aXBsZSB2YWx1ZXMiO2lmKHQudmFsdWU9MSwhbC5pc1N0cmluZyhlLmRpbVBhcmFtKSlyZXR1cm4gImRpbVBhcmFtOiBzdHJpbmcgZXhwZWN0ZWQifXJldHVybiBudWxsIT1lLmRlbm90YXRpb24mJmUuaGFzT3duUHJvcGVydHkoImRlbm90YXRpb24iKSYmIWwuaXNTdHJpbmcoZS5kZW5vdGF0aW9uKT8iZGVub3RhdGlvbjogc3RyaW5nIGV4cGVjdGVkIjpudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UZW5zb3JTaGFwZVByb3RvLkRpbWVuc2lvbilyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlRlbnNvclNoYXBlUHJvdG8uRGltZW5zaW9uO3JldHVybiBudWxsIT1lLmRpbVZhbHVlJiYobC5Mb25nPyh0LmRpbVZhbHVlPWwuTG9uZy5mcm9tVmFsdWUoZS5kaW1WYWx1ZSkpLnVuc2lnbmVkPSExOiJzdHJpbmciPT10eXBlb2YgZS5kaW1WYWx1ZT90LmRpbVZhbHVlPXBhcnNlSW50KGUuZGltVmFsdWUsMTApOiJudW1iZXIiPT10eXBlb2YgZS5kaW1WYWx1ZT90LmRpbVZhbHVlPWUuZGltVmFsdWU6Im9iamVjdCI9PXR5cGVvZiBlLmRpbVZhbHVlJiYodC5kaW1WYWx1ZT1uZXcgbC5Mb25nQml0cyhlLmRpbVZhbHVlLmxvdz4+PjAsZS5kaW1WYWx1ZS5oaWdoPj4+MCkudG9OdW1iZXIoKSkpLG51bGwhPWUuZGltUGFyYW0mJih0LmRpbVBhcmFtPVN0cmluZyhlLmRpbVBhcmFtKSksbnVsbCE9ZS5kZW5vdGF0aW9uJiYodC5kZW5vdGF0aW9uPVN0cmluZyhlLmRlbm90YXRpb24pKSx0fSxlLnRvT2JqZWN0PWZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pO3ZhciBuPXt9O3JldHVybiB0LmRlZmF1bHRzJiYobi5kZW5vdGF0aW9uPSIiKSxudWxsIT1lLmRpbVZhbHVlJiZlLmhhc093blByb3BlcnR5KCJkaW1WYWx1ZSIpJiYoIm51bWJlciI9PXR5cGVvZiBlLmRpbVZhbHVlP24uZGltVmFsdWU9dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS5kaW1WYWx1ZSk6ZS5kaW1WYWx1ZTpuLmRpbVZhbHVlPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuZGltVmFsdWUpOnQubG9uZ3M9PT1OdW1iZXI/bmV3IGwuTG9uZ0JpdHMoZS5kaW1WYWx1ZS5sb3c+Pj4wLGUuZGltVmFsdWUuaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS5kaW1WYWx1ZSx0Lm9uZW9mcyYmKG4udmFsdWU9ImRpbVZhbHVlIikpLG51bGwhPWUuZGltUGFyYW0mJmUuaGFzT3duUHJvcGVydHkoImRpbVBhcmFtIikmJihuLmRpbVBhcmFtPWUuZGltUGFyYW0sdC5vbmVvZnMmJihuLnZhbHVlPSJkaW1QYXJhbSIpKSxudWxsIT1lLmRlbm90YXRpb24mJmUuaGFzT3duUHJvcGVydHkoImRlbm90YXRpb24iKSYmKG4uZGVub3RhdGlvbj1lLmRlbm90YXRpb24pLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVGVuc29yU2hhcGVQcm90by5EaW1lbnNpb24ifSxlfSgpLGV9KCksaS5UeXBlUHJvdG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9dmFyIHQ7cmV0dXJuIGUucHJvdG90eXBlLnRlbnNvclR5cGU9bnVsbCxlLnByb3RvdHlwZS5zZXF1ZW5jZVR5cGU9bnVsbCxlLnByb3RvdHlwZS5tYXBUeXBlPW51bGwsZS5wcm90b3R5cGUub3B0aW9uYWxUeXBlPW51bGwsZS5wcm90b3R5cGUuc3BhcnNlVGVuc29yVHlwZT1udWxsLGUucHJvdG90eXBlLmRlbm90YXRpb249IiIsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJ2YWx1ZSIse2dldDpsLm9uZU9mR2V0dGVyKHQ9WyJ0ZW5zb3JUeXBlIiwic2VxdWVuY2VUeXBlIiwibWFwVHlwZSIsIm9wdGlvbmFsVHlwZSIsInNwYXJzZVRlbnNvclR5cGUiXSksc2V0Omwub25lT2ZTZXR0ZXIodCl9KSxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUudGVuc29yVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidGVuc29yVHlwZSIpJiZjLm9ubnguVHlwZVByb3RvLlRlbnNvci5lbmNvZGUoZS50ZW5zb3JUeXBlLHQudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpLG51bGwhPWUuc2VxdWVuY2VUeXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJzZXF1ZW5jZVR5cGUiKSYmYy5vbm54LlR5cGVQcm90by5TZXF1ZW5jZS5lbmNvZGUoZS5zZXF1ZW5jZVR5cGUsdC51aW50MzIoMzQpLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS5tYXBUeXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJtYXBUeXBlIikmJmMub25ueC5UeXBlUHJvdG8uTWFwLmVuY29kZShlLm1hcFR5cGUsdC51aW50MzIoNDIpLmZvcmsoKSkubGRlbGltKCksbnVsbCE9ZS5kZW5vdGF0aW9uJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZW5vdGF0aW9uIikmJnQudWludDMyKDUwKS5zdHJpbmcoZS5kZW5vdGF0aW9uKSxudWxsIT1lLnNwYXJzZVRlbnNvclR5cGUmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsInNwYXJzZVRlbnNvclR5cGUiKSYmYy5vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3IuZW5jb2RlKGUuc3BhcnNlVGVuc29yVHlwZSx0LnVpbnQzMig2NikuZm9yaygpKS5sZGVsaW0oKSxudWxsIT1lLm9wdGlvbmFsVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwib3B0aW9uYWxUeXBlIikmJmMub25ueC5UeXBlUHJvdG8uT3B0aW9uYWwuZW5jb2RlKGUub3B0aW9uYWxUeXBlLHQudWludDMyKDc0KS5mb3JrKCkpLmxkZWxpbSgpLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UeXBlUHJvdG87ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci50ZW5zb3JUeXBlPWMub25ueC5UeXBlUHJvdG8uVGVuc29yLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgNDpyLnNlcXVlbmNlVHlwZT1jLm9ubnguVHlwZVByb3RvLlNlcXVlbmNlLmRlY29kZShlLGUudWludDMyKCkpO2JyZWFrO2Nhc2UgNTpyLm1hcFR5cGU9Yy5vbm54LlR5cGVQcm90by5NYXAuZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSA5OnIub3B0aW9uYWxUeXBlPWMub25ueC5UeXBlUHJvdG8uT3B0aW9uYWwuZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7Y2FzZSA4OnIuc3BhcnNlVGVuc29yVHlwZT1jLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvci5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztjYXNlIDY6ci5kZW5vdGF0aW9uPWUuc3RyaW5nKCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7dmFyIHQ9e307aWYobnVsbCE9ZS50ZW5zb3JUeXBlJiZlLmhhc093blByb3BlcnR5KCJ0ZW5zb3JUeXBlIikmJih0LnZhbHVlPTEsbj1jLm9ubnguVHlwZVByb3RvLlRlbnNvci52ZXJpZnkoZS50ZW5zb3JUeXBlKSkpcmV0dXJuICJ0ZW5zb3JUeXBlLiIrbjtpZihudWxsIT1lLnNlcXVlbmNlVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgic2VxdWVuY2VUeXBlIikpe2lmKDE9PT10LnZhbHVlKXJldHVybiAidmFsdWU6IG11bHRpcGxlIHZhbHVlcyI7aWYodC52YWx1ZT0xLG49Yy5vbm54LlR5cGVQcm90by5TZXF1ZW5jZS52ZXJpZnkoZS5zZXF1ZW5jZVR5cGUpKXJldHVybiAic2VxdWVuY2VUeXBlLiIrbn1pZihudWxsIT1lLm1hcFR5cGUmJmUuaGFzT3duUHJvcGVydHkoIm1hcFR5cGUiKSl7aWYoMT09PXQudmFsdWUpcmV0dXJuICJ2YWx1ZTogbXVsdGlwbGUgdmFsdWVzIjtpZih0LnZhbHVlPTEsbj1jLm9ubnguVHlwZVByb3RvLk1hcC52ZXJpZnkoZS5tYXBUeXBlKSlyZXR1cm4gIm1hcFR5cGUuIitufWlmKG51bGwhPWUub3B0aW9uYWxUeXBlJiZlLmhhc093blByb3BlcnR5KCJvcHRpb25hbFR5cGUiKSl7aWYoMT09PXQudmFsdWUpcmV0dXJuICJ2YWx1ZTogbXVsdGlwbGUgdmFsdWVzIjtpZih0LnZhbHVlPTEsbj1jLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsLnZlcmlmeShlLm9wdGlvbmFsVHlwZSkpcmV0dXJuICJvcHRpb25hbFR5cGUuIitufWlmKG51bGwhPWUuc3BhcnNlVGVuc29yVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgic3BhcnNlVGVuc29yVHlwZSIpKXtpZigxPT09dC52YWx1ZSlyZXR1cm4gInZhbHVlOiBtdWx0aXBsZSB2YWx1ZXMiO3ZhciBuO2lmKHQudmFsdWU9MSxuPWMub25ueC5UeXBlUHJvdG8uU3BhcnNlVGVuc29yLnZlcmlmeShlLnNwYXJzZVRlbnNvclR5cGUpKXJldHVybiAic3BhcnNlVGVuc29yVHlwZS4iK259cmV0dXJuIG51bGwhPWUuZGVub3RhdGlvbiYmZS5oYXNPd25Qcm9wZXJ0eSgiZGVub3RhdGlvbiIpJiYhbC5pc1N0cmluZyhlLmRlbm90YXRpb24pPyJkZW5vdGF0aW9uOiBzdHJpbmcgZXhwZWN0ZWQiOm51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlR5cGVQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlR5cGVQcm90bztpZihudWxsIT1lLnRlbnNvclR5cGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZS50ZW5zb3JUeXBlKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHlwZVByb3RvLnRlbnNvclR5cGU6IG9iamVjdCBleHBlY3RlZCIpO3QudGVuc29yVHlwZT1jLm9ubnguVHlwZVByb3RvLlRlbnNvci5mcm9tT2JqZWN0KGUudGVuc29yVHlwZSk7fWlmKG51bGwhPWUuc2VxdWVuY2VUeXBlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuc2VxdWVuY2VUeXBlKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHlwZVByb3RvLnNlcXVlbmNlVHlwZTogb2JqZWN0IGV4cGVjdGVkIik7dC5zZXF1ZW5jZVR5cGU9Yy5vbm54LlR5cGVQcm90by5TZXF1ZW5jZS5mcm9tT2JqZWN0KGUuc2VxdWVuY2VUeXBlKTt9aWYobnVsbCE9ZS5tYXBUeXBlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUubWFwVHlwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5tYXBUeXBlOiBvYmplY3QgZXhwZWN0ZWQiKTt0Lm1hcFR5cGU9Yy5vbm54LlR5cGVQcm90by5NYXAuZnJvbU9iamVjdChlLm1hcFR5cGUpO31pZihudWxsIT1lLm9wdGlvbmFsVHlwZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLm9wdGlvbmFsVHlwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5vcHRpb25hbFR5cGU6IG9iamVjdCBleHBlY3RlZCIpO3Qub3B0aW9uYWxUeXBlPWMub25ueC5UeXBlUHJvdG8uT3B0aW9uYWwuZnJvbU9iamVjdChlLm9wdGlvbmFsVHlwZSk7fWlmKG51bGwhPWUuc3BhcnNlVGVuc29yVHlwZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnNwYXJzZVRlbnNvclR5cGUpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UeXBlUHJvdG8uc3BhcnNlVGVuc29yVHlwZTogb2JqZWN0IGV4cGVjdGVkIik7dC5zcGFyc2VUZW5zb3JUeXBlPWMub25ueC5UeXBlUHJvdG8uU3BhcnNlVGVuc29yLmZyb21PYmplY3QoZS5zcGFyc2VUZW5zb3JUeXBlKTt9cmV0dXJuIG51bGwhPWUuZGVub3RhdGlvbiYmKHQuZGVub3RhdGlvbj1TdHJpbmcoZS5kZW5vdGF0aW9uKSksdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtyZXR1cm4gdC5kZWZhdWx0cyYmKG4uZGVub3RhdGlvbj0iIiksbnVsbCE9ZS50ZW5zb3JUeXBlJiZlLmhhc093blByb3BlcnR5KCJ0ZW5zb3JUeXBlIikmJihuLnRlbnNvclR5cGU9Yy5vbm54LlR5cGVQcm90by5UZW5zb3IudG9PYmplY3QoZS50ZW5zb3JUeXBlLHQpLHQub25lb2ZzJiYobi52YWx1ZT0idGVuc29yVHlwZSIpKSxudWxsIT1lLnNlcXVlbmNlVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgic2VxdWVuY2VUeXBlIikmJihuLnNlcXVlbmNlVHlwZT1jLm9ubnguVHlwZVByb3RvLlNlcXVlbmNlLnRvT2JqZWN0KGUuc2VxdWVuY2VUeXBlLHQpLHQub25lb2ZzJiYobi52YWx1ZT0ic2VxdWVuY2VUeXBlIikpLG51bGwhPWUubWFwVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgibWFwVHlwZSIpJiYobi5tYXBUeXBlPWMub25ueC5UeXBlUHJvdG8uTWFwLnRvT2JqZWN0KGUubWFwVHlwZSx0KSx0Lm9uZW9mcyYmKG4udmFsdWU9Im1hcFR5cGUiKSksbnVsbCE9ZS5kZW5vdGF0aW9uJiZlLmhhc093blByb3BlcnR5KCJkZW5vdGF0aW9uIikmJihuLmRlbm90YXRpb249ZS5kZW5vdGF0aW9uKSxudWxsIT1lLnNwYXJzZVRlbnNvclR5cGUmJmUuaGFzT3duUHJvcGVydHkoInNwYXJzZVRlbnNvclR5cGUiKSYmKG4uc3BhcnNlVGVuc29yVHlwZT1jLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvci50b09iamVjdChlLnNwYXJzZVRlbnNvclR5cGUsdCksdC5vbmVvZnMmJihuLnZhbHVlPSJzcGFyc2VUZW5zb3JUeXBlIikpLG51bGwhPWUub3B0aW9uYWxUeXBlJiZlLmhhc093blByb3BlcnR5KCJvcHRpb25hbFR5cGUiKSYmKG4ub3B0aW9uYWxUeXBlPWMub25ueC5UeXBlUHJvdG8uT3B0aW9uYWwudG9PYmplY3QoZS5vcHRpb25hbFR5cGUsdCksdC5vbmVvZnMmJihuLnZhbHVlPSJvcHRpb25hbFR5cGUiKSksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UeXBlUHJvdG8ifSxlLlRlbnNvcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUuZWxlbVR5cGU9MCxlLnByb3RvdHlwZS5zaGFwZT1udWxsLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5lbGVtVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZWxlbVR5cGUiKSYmdC51aW50MzIoOCkuaW50MzIoZS5lbGVtVHlwZSksbnVsbCE9ZS5zaGFwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwic2hhcGUiKSYmYy5vbm54LlRlbnNvclNoYXBlUHJvdG8uZW5jb2RlKGUuc2hhcGUsdC51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCksdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlR5cGVQcm90by5UZW5zb3I7ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci5lbGVtVHlwZT1lLmludDMyKCk7YnJlYWs7Y2FzZSAyOnIuc2hhcGU9Yy5vbm54LlRlbnNvclNoYXBlUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gIm9iamVjdCBleHBlY3RlZCI7aWYobnVsbCE9ZS5lbGVtVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgiZWxlbVR5cGUiKSYmIWwuaXNJbnRlZ2VyKGUuZWxlbVR5cGUpKXJldHVybiAiZWxlbVR5cGU6IGludGVnZXIgZXhwZWN0ZWQiO2lmKG51bGwhPWUuc2hhcGUmJmUuaGFzT3duUHJvcGVydHkoInNoYXBlIikpe3ZhciB0PWMub25ueC5UZW5zb3JTaGFwZVByb3RvLnZlcmlmeShlLnNoYXBlKTtpZih0KXJldHVybiAic2hhcGUuIit0fXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UeXBlUHJvdG8uVGVuc29yKXJldHVybiBlO3ZhciB0PW5ldyBjLm9ubnguVHlwZVByb3RvLlRlbnNvcjtpZihudWxsIT1lLmVsZW1UeXBlJiYodC5lbGVtVHlwZT0wfGUuZWxlbVR5cGUpLG51bGwhPWUuc2hhcGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZS5zaGFwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5UZW5zb3Iuc2hhcGU6IG9iamVjdCBleHBlY3RlZCIpO3Quc2hhcGU9Yy5vbm54LlRlbnNvclNoYXBlUHJvdG8uZnJvbU9iamVjdChlLnNoYXBlKTt9cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307cmV0dXJuIHQuZGVmYXVsdHMmJihuLmVsZW1UeXBlPTAsbi5zaGFwZT1udWxsKSxudWxsIT1lLmVsZW1UeXBlJiZlLmhhc093blByb3BlcnR5KCJlbGVtVHlwZSIpJiYobi5lbGVtVHlwZT1lLmVsZW1UeXBlKSxudWxsIT1lLnNoYXBlJiZlLmhhc093blByb3BlcnR5KCJzaGFwZSIpJiYobi5zaGFwZT1jLm9ubnguVGVuc29yU2hhcGVQcm90by50b09iamVjdChlLnNoYXBlLHQpKSxufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlR5cGVQcm90by5UZW5zb3IifSxlfSgpLGUuU2VxdWVuY2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmVsZW1UeXBlPW51bGwsZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmVsZW1UeXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJlbGVtVHlwZSIpJiZjLm9ubnguVHlwZVByb3RvLmVuY29kZShlLmVsZW1UeXBlLHQudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpLHR9LGUuZW5jb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5jb2RlKGUsdCkubGRlbGltKCl9LGUuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIGF8fChlPWEuY3JlYXRlKGUpKTtmb3IodmFyIG49dm9pZCAwPT09dD9lLmxlbjplLnBvcyt0LHI9bmV3IGMub25ueC5UeXBlUHJvdG8uU2VxdWVuY2U7ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7bz4+PjM9PTE/ci5lbGVtVHlwZT1jLm9ubnguVHlwZVByb3RvLmRlY29kZShlLGUudWludDMyKCkpOmUuc2tpcFR5cGUoNyZvKTt9cmV0dXJuIHJ9LGUuZGVjb2RlRGVsaW1pdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXx8KGU9bmV3IGEoZSkpLHRoaXMuZGVjb2RlKGUsZS51aW50MzIoKSl9LGUudmVyaWZ5PWZ1bmN0aW9uKGUpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuICJvYmplY3QgZXhwZWN0ZWQiO2lmKG51bGwhPWUuZWxlbVR5cGUmJmUuaGFzT3duUHJvcGVydHkoImVsZW1UeXBlIikpe3ZhciB0PWMub25ueC5UeXBlUHJvdG8udmVyaWZ5KGUuZWxlbVR5cGUpO2lmKHQpcmV0dXJuICJlbGVtVHlwZS4iK3R9cmV0dXJuIG51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlR5cGVQcm90by5TZXF1ZW5jZSlyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlR5cGVQcm90by5TZXF1ZW5jZTtpZihudWxsIT1lLmVsZW1UeXBlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuZWxlbVR5cGUpdGhyb3cgVHlwZUVycm9yKCIub25ueC5UeXBlUHJvdG8uU2VxdWVuY2UuZWxlbVR5cGU6IG9iamVjdCBleHBlY3RlZCIpO3QuZWxlbVR5cGU9Yy5vbm54LlR5cGVQcm90by5mcm9tT2JqZWN0KGUuZWxlbVR5cGUpO31yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtyZXR1cm4gdC5kZWZhdWx0cyYmKG4uZWxlbVR5cGU9bnVsbCksbnVsbCE9ZS5lbGVtVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgiZWxlbVR5cGUiKSYmKG4uZWxlbVR5cGU9Yy5vbm54LlR5cGVQcm90by50b09iamVjdChlLmVsZW1UeXBlLHQpKSxufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54LlR5cGVQcm90by5TZXF1ZW5jZSJ9LGV9KCksZS5NYXA9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLmtleVR5cGU9MCxlLnByb3RvdHlwZS52YWx1ZVR5cGU9bnVsbCxlLmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUuZW5jb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUua2V5VHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwia2V5VHlwZSIpJiZ0LnVpbnQzMig4KS5pbnQzMihlLmtleVR5cGUpLG51bGwhPWUudmFsdWVUeXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJ2YWx1ZVR5cGUiKSYmYy5vbm54LlR5cGVQcm90by5lbmNvZGUoZS52YWx1ZVR5cGUsdC51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCksdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LlR5cGVQcm90by5NYXA7ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci5rZXlUeXBlPWUuaW50MzIoKTticmVhaztjYXNlIDI6ci52YWx1ZVR5cGU9Yy5vbm54LlR5cGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLmtleVR5cGUmJmUuaGFzT3duUHJvcGVydHkoImtleVR5cGUiKSYmIWwuaXNJbnRlZ2VyKGUua2V5VHlwZSkpcmV0dXJuICJrZXlUeXBlOiBpbnRlZ2VyIGV4cGVjdGVkIjtpZihudWxsIT1lLnZhbHVlVHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgidmFsdWVUeXBlIikpe3ZhciB0PWMub25ueC5UeXBlUHJvdG8udmVyaWZ5KGUudmFsdWVUeXBlKTtpZih0KXJldHVybiAidmFsdWVUeXBlLiIrdH1yZXR1cm4gbnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguVHlwZVByb3RvLk1hcClyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LlR5cGVQcm90by5NYXA7aWYobnVsbCE9ZS5rZXlUeXBlJiYodC5rZXlUeXBlPTB8ZS5rZXlUeXBlKSxudWxsIT1lLnZhbHVlVHlwZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnZhbHVlVHlwZSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LlR5cGVQcm90by5NYXAudmFsdWVUeXBlOiBvYmplY3QgZXhwZWN0ZWQiKTt0LnZhbHVlVHlwZT1jLm9ubnguVHlwZVByb3RvLmZyb21PYmplY3QoZS52YWx1ZVR5cGUpO31yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtyZXR1cm4gdC5kZWZhdWx0cyYmKG4ua2V5VHlwZT0wLG4udmFsdWVUeXBlPW51bGwpLG51bGwhPWUua2V5VHlwZSYmZS5oYXNPd25Qcm9wZXJ0eSgia2V5VHlwZSIpJiYobi5rZXlUeXBlPWUua2V5VHlwZSksbnVsbCE9ZS52YWx1ZVR5cGUmJmUuaGFzT3duUHJvcGVydHkoInZhbHVlVHlwZSIpJiYobi52YWx1ZVR5cGU9Yy5vbm54LlR5cGVQcm90by50b09iamVjdChlLnZhbHVlVHlwZSx0KSksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UeXBlUHJvdG8uTWFwIn0sZX0oKSxlLk9wdGlvbmFsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5lbGVtVHlwZT1udWxsLGUuY3JlYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0sZS5lbmNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8KHQ9dS5jcmVhdGUoKSksbnVsbCE9ZS5lbGVtVHlwZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZWxlbVR5cGUiKSYmYy5vbm54LlR5cGVQcm90by5lbmNvZGUoZS5lbGVtVHlwZSx0LnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO28+Pj4zPT0xP3IuZWxlbVR5cGU9Yy5vbm54LlR5cGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTplLnNraXBUeXBlKDcmbyk7fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLmVsZW1UeXBlJiZlLmhhc093blByb3BlcnR5KCJlbGVtVHlwZSIpKXt2YXIgdD1jLm9ubnguVHlwZVByb3RvLnZlcmlmeShlLmVsZW1UeXBlKTtpZih0KXJldHVybiAiZWxlbVR5cGUuIit0fXJldHVybiBudWxsfSxlLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGMub25ueC5UeXBlUHJvdG8uT3B0aW9uYWwpcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UeXBlUHJvdG8uT3B0aW9uYWw7aWYobnVsbCE9ZS5lbGVtVHlwZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmVsZW1UeXBlKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHlwZVByb3RvLk9wdGlvbmFsLmVsZW1UeXBlOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmVsZW1UeXBlPWMub25ueC5UeXBlUHJvdG8uZnJvbU9iamVjdChlLmVsZW1UeXBlKTt9cmV0dXJuIHR9LGUudG9PYmplY3Q9ZnVuY3Rpb24oZSx0KXt0fHwodD17fSk7dmFyIG49e307cmV0dXJuIHQuZGVmYXVsdHMmJihuLmVsZW1UeXBlPW51bGwpLG51bGwhPWUuZWxlbVR5cGUmJmUuaGFzT3duUHJvcGVydHkoImVsZW1UeXBlIikmJihuLmVsZW1UeXBlPWMub25ueC5UeXBlUHJvdG8udG9PYmplY3QoZS5lbGVtVHlwZSx0KSksbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5UeXBlUHJvdG8uT3B0aW9uYWwifSxlfSgpLGUuU3BhcnNlVGVuc29yPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZihlKWZvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDsrK24pbnVsbCE9ZVt0W25dXSYmKHRoaXNbdFtuXV09ZVt0W25dXSk7fXJldHVybiBlLnByb3RvdHlwZS5lbGVtVHlwZT0wLGUucHJvdG90eXBlLnNoYXBlPW51bGwsZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmVsZW1UeXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJlbGVtVHlwZSIpJiZ0LnVpbnQzMig4KS5pbnQzMihlLmVsZW1UeXBlKSxudWxsIT1lLnNoYXBlJiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCJzaGFwZSIpJiZjLm9ubnguVGVuc29yU2hhcGVQcm90by5lbmNvZGUoZS5zaGFwZSx0LnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvcjtlLnBvczxuOyl7dmFyIG89ZS51aW50MzIoKTtzd2l0Y2gobz4+PjMpe2Nhc2UgMTpyLmVsZW1UeXBlPWUuaW50MzIoKTticmVhaztjYXNlIDI6ci5zaGFwZT1jLm9ubnguVGVuc29yU2hhcGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLmVsZW1UeXBlJiZlLmhhc093blByb3BlcnR5KCJlbGVtVHlwZSIpJiYhbC5pc0ludGVnZXIoZS5lbGVtVHlwZSkpcmV0dXJuICJlbGVtVHlwZTogaW50ZWdlciBleHBlY3RlZCI7aWYobnVsbCE9ZS5zaGFwZSYmZS5oYXNPd25Qcm9wZXJ0eSgic2hhcGUiKSl7dmFyIHQ9Yy5vbm54LlRlbnNvclNoYXBlUHJvdG8udmVyaWZ5KGUuc2hhcGUpO2lmKHQpcmV0dXJuICJzaGFwZS4iK3R9cmV0dXJuIG51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54LlR5cGVQcm90by5TcGFyc2VUZW5zb3IpcmV0dXJuIGU7dmFyIHQ9bmV3IGMub25ueC5UeXBlUHJvdG8uU3BhcnNlVGVuc29yO2lmKG51bGwhPWUuZWxlbVR5cGUmJih0LmVsZW1UeXBlPTB8ZS5lbGVtVHlwZSksbnVsbCE9ZS5zaGFwZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlLnNoYXBlKXRocm93IFR5cGVFcnJvcigiLm9ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvci5zaGFwZTogb2JqZWN0IGV4cGVjdGVkIik7dC5zaGFwZT1jLm9ubnguVGVuc29yU2hhcGVQcm90by5mcm9tT2JqZWN0KGUuc2hhcGUpO31yZXR1cm4gdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtyZXR1cm4gdC5kZWZhdWx0cyYmKG4uZWxlbVR5cGU9MCxuLnNoYXBlPW51bGwpLG51bGwhPWUuZWxlbVR5cGUmJmUuaGFzT3duUHJvcGVydHkoImVsZW1UeXBlIikmJihuLmVsZW1UeXBlPWUuZWxlbVR5cGUpLG51bGwhPWUuc2hhcGUmJmUuaGFzT3duUHJvcGVydHkoInNoYXBlIikmJihuLnNoYXBlPWMub25ueC5UZW5zb3JTaGFwZVByb3RvLnRvT2JqZWN0KGUuc2hhcGUsdCkpLG59LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMscy51dGlsLnRvSlNPTk9wdGlvbnMpfSxlLmdldFR5cGVVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSJ0eXBlLmdvb2dsZWFwaXMuY29tIiksZSsiL29ubnguVHlwZVByb3RvLlNwYXJzZVRlbnNvciJ9LGV9KCksZX0oKSxpLk9wZXJhdG9yU2V0SWRQcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZSlmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7KytuKW51bGwhPWVbdFtuXV0mJih0aGlzW3Rbbl1dPWVbdFtuXV0pO31yZXR1cm4gZS5wcm90b3R5cGUuZG9tYWluPSIiLGUucHJvdG90eXBlLnZlcnNpb249bC5Mb25nP2wuTG9uZy5mcm9tQml0cygwLDAsITEpOjAsZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD11LmNyZWF0ZSgpKSxudWxsIT1lLmRvbWFpbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwiZG9tYWluIikmJnQudWludDMyKDEwKS5zdHJpbmcoZS5kb21haW4pLG51bGwhPWUudmVyc2lvbiYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwidmVyc2lvbiIpJiZ0LnVpbnQzMigxNikuaW50NjQoZS52ZXJzaW9uKSx0fSxlLmVuY29kZURlbGltaXRlZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuY29kZShlLHQpLmxkZWxpbSgpfSxlLmRlY29kZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBhfHwoZT1hLmNyZWF0ZShlKSk7Zm9yKHZhciBuPXZvaWQgMD09PXQ/ZS5sZW46ZS5wb3MrdCxyPW5ldyBjLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvO2UucG9zPG47KXt2YXIgbz1lLnVpbnQzMigpO3N3aXRjaChvPj4+Myl7Y2FzZSAxOnIuZG9tYWluPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSAyOnIudmVyc2lvbj1lLmludDY0KCk7YnJlYWs7ZGVmYXVsdDplLnNraXBUeXBlKDcmbyk7fX1yZXR1cm4gcn0sZS5kZWNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBhfHwoZT1uZXcgYShlKSksdGhpcy5kZWNvZGUoZSxlLnVpbnQzMigpKX0sZS52ZXJpZnk9ZnVuY3Rpb24oZSl7cmV0dXJuICJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWU/Im9iamVjdCBleHBlY3RlZCI6bnVsbCE9ZS5kb21haW4mJmUuaGFzT3duUHJvcGVydHkoImRvbWFpbiIpJiYhbC5pc1N0cmluZyhlLmRvbWFpbik/ImRvbWFpbjogc3RyaW5nIGV4cGVjdGVkIjpudWxsIT1lLnZlcnNpb24mJmUuaGFzT3duUHJvcGVydHkoInZlcnNpb24iKSYmIShsLmlzSW50ZWdlcihlLnZlcnNpb24pfHxlLnZlcnNpb24mJmwuaXNJbnRlZ2VyKGUudmVyc2lvbi5sb3cpJiZsLmlzSW50ZWdlcihlLnZlcnNpb24uaGlnaCkpPyJ2ZXJzaW9uOiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWQiOm51bGx9LGUuZnJvbU9iamVjdD1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgYy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90bztyZXR1cm4gbnVsbCE9ZS5kb21haW4mJih0LmRvbWFpbj1TdHJpbmcoZS5kb21haW4pKSxudWxsIT1lLnZlcnNpb24mJihsLkxvbmc/KHQudmVyc2lvbj1sLkxvbmcuZnJvbVZhbHVlKGUudmVyc2lvbikpLnVuc2lnbmVkPSExOiJzdHJpbmciPT10eXBlb2YgZS52ZXJzaW9uP3QudmVyc2lvbj1wYXJzZUludChlLnZlcnNpb24sMTApOiJudW1iZXIiPT10eXBlb2YgZS52ZXJzaW9uP3QudmVyc2lvbj1lLnZlcnNpb246Im9iamVjdCI9PXR5cGVvZiBlLnZlcnNpb24mJih0LnZlcnNpb249bmV3IGwuTG9uZ0JpdHMoZS52ZXJzaW9uLmxvdz4+PjAsZS52ZXJzaW9uLmhpZ2g+Pj4wKS50b051bWJlcigpKSksdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZih0LmRlZmF1bHRzKWlmKG4uZG9tYWluPSIiLGwuTG9uZyl7dmFyIHI9bmV3IGwuTG9uZygwLDAsITEpO24udmVyc2lvbj10LmxvbmdzPT09U3RyaW5nP3IudG9TdHJpbmcoKTp0LmxvbmdzPT09TnVtYmVyP3IudG9OdW1iZXIoKTpyO31lbHNlIG4udmVyc2lvbj10LmxvbmdzPT09U3RyaW5nPyIwIjowO3JldHVybiBudWxsIT1lLmRvbWFpbiYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluIikmJihuLmRvbWFpbj1lLmRvbWFpbiksbnVsbCE9ZS52ZXJzaW9uJiZlLmhhc093blByb3BlcnR5KCJ2ZXJzaW9uIikmJigibnVtYmVyIj09dHlwZW9mIGUudmVyc2lvbj9uLnZlcnNpb249dC5sb25ncz09PVN0cmluZz9TdHJpbmcoZS52ZXJzaW9uKTplLnZlcnNpb246bi52ZXJzaW9uPXQubG9uZ3M9PT1TdHJpbmc/bC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUudmVyc2lvbik6dC5sb25ncz09PU51bWJlcj9uZXcgbC5Mb25nQml0cyhlLnZlcnNpb24ubG93Pj4+MCxlLnZlcnNpb24uaGlnaD4+PjApLnRvTnVtYmVyKCk6ZS52ZXJzaW9uKSxufSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLHMudXRpbC50b0pTT05PcHRpb25zKX0sZS5nZXRUeXBlVXJsPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0idHlwZS5nb29nbGVhcGlzLmNvbSIpLGUrIi9vbm54Lk9wZXJhdG9yU2V0SWRQcm90byJ9LGV9KCksaS5PcGVyYXRvclN0YXR1cz1mdW5jdGlvbigpe3ZhciBlPXt9LHQ9T2JqZWN0LmNyZWF0ZShlKTtyZXR1cm4gdFtlWzBdPSJFWFBFUklNRU5UQUwiXT0wLHRbZVsxXT0iU1RBQkxFIl09MSx0fSgpLGkuRnVuY3Rpb25Qcm90bz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYodGhpcy5pbnB1dD1bXSx0aGlzLm91dHB1dD1bXSx0aGlzLmF0dHJpYnV0ZT1bXSx0aGlzLmF0dHJpYnV0ZVByb3RvPVtdLHRoaXMubm9kZT1bXSx0aGlzLm9wc2V0SW1wb3J0PVtdLGUpZm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoOysrbiludWxsIT1lW3Rbbl1dJiYodGhpc1t0W25dXT1lW3Rbbl1dKTt9cmV0dXJuIGUucHJvdG90eXBlLm5hbWU9IiIsZS5wcm90b3R5cGUuaW5wdXQ9bC5lbXB0eUFycmF5LGUucHJvdG90eXBlLm91dHB1dD1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuYXR0cmlidXRlPWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5hdHRyaWJ1dGVQcm90bz1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUubm9kZT1sLmVtcHR5QXJyYXksZS5wcm90b3R5cGUuZG9jU3RyaW5nPSIiLGUucHJvdG90eXBlLm9wc2V0SW1wb3J0PWwuZW1wdHlBcnJheSxlLnByb3RvdHlwZS5kb21haW49IiIsZS5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQpfSxlLmVuY29kZT1mdW5jdGlvbihlLHQpe2lmKHR8fCh0PXUuY3JlYXRlKCkpLG51bGwhPWUubmFtZSYmT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwibmFtZSIpJiZ0LnVpbnQzMigxMCkuc3RyaW5nKGUubmFtZSksbnVsbCE9ZS5pbnB1dCYmZS5pbnB1dC5sZW5ndGgpZm9yKHZhciBuPTA7bjxlLmlucHV0Lmxlbmd0aDsrK24pdC51aW50MzIoMzQpLnN0cmluZyhlLmlucHV0W25dKTtpZihudWxsIT1lLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoKWZvcihuPTA7bjxlLm91dHB1dC5sZW5ndGg7KytuKXQudWludDMyKDQyKS5zdHJpbmcoZS5vdXRwdXRbbl0pO2lmKG51bGwhPWUuYXR0cmlidXRlJiZlLmF0dHJpYnV0ZS5sZW5ndGgpZm9yKG49MDtuPGUuYXR0cmlidXRlLmxlbmd0aDsrK24pdC51aW50MzIoNTApLnN0cmluZyhlLmF0dHJpYnV0ZVtuXSk7aWYobnVsbCE9ZS5ub2RlJiZlLm5vZGUubGVuZ3RoKWZvcihuPTA7bjxlLm5vZGUubGVuZ3RoOysrbiljLm9ubnguTm9kZVByb3RvLmVuY29kZShlLm5vZGVbbl0sdC51aW50MzIoNTgpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS5kb2NTdHJpbmcmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvY1N0cmluZyIpJiZ0LnVpbnQzMig2Nikuc3RyaW5nKGUuZG9jU3RyaW5nKSxudWxsIT1lLm9wc2V0SW1wb3J0JiZlLm9wc2V0SW1wb3J0Lmxlbmd0aClmb3Iobj0wO248ZS5vcHNldEltcG9ydC5sZW5ndGg7KytuKWMub25ueC5PcGVyYXRvclNldElkUHJvdG8uZW5jb2RlKGUub3BzZXRJbXBvcnRbbl0sdC51aW50MzIoNzQpLmZvcmsoKSkubGRlbGltKCk7aWYobnVsbCE9ZS5kb21haW4mJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRvbWFpbiIpJiZ0LnVpbnQzMig4Mikuc3RyaW5nKGUuZG9tYWluKSxudWxsIT1lLmF0dHJpYnV0ZVByb3RvJiZlLmF0dHJpYnV0ZVByb3RvLmxlbmd0aClmb3Iobj0wO248ZS5hdHRyaWJ1dGVQcm90by5sZW5ndGg7KytuKWMub25ueC5BdHRyaWJ1dGVQcm90by5lbmNvZGUoZS5hdHRyaWJ1dGVQcm90b1tuXSx0LnVpbnQzMig5MCkuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gdH0sZS5lbmNvZGVEZWxpbWl0ZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmNvZGUoZSx0KS5sZGVsaW0oKX0sZS5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtlIGluc3RhbmNlb2YgYXx8KGU9YS5jcmVhdGUoZSkpO2Zvcih2YXIgbj12b2lkIDA9PT10P2UubGVuOmUucG9zK3Qscj1uZXcgYy5vbm54LkZ1bmN0aW9uUHJvdG87ZS5wb3M8bjspe3ZhciBvPWUudWludDMyKCk7c3dpdGNoKG8+Pj4zKXtjYXNlIDE6ci5uYW1lPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA0OnIuaW5wdXQmJnIuaW5wdXQubGVuZ3RofHwoci5pbnB1dD1bXSksci5pbnB1dC5wdXNoKGUuc3RyaW5nKCkpO2JyZWFrO2Nhc2UgNTpyLm91dHB1dCYmci5vdXRwdXQubGVuZ3RofHwoci5vdXRwdXQ9W10pLHIub3V0cHV0LnB1c2goZS5zdHJpbmcoKSk7YnJlYWs7Y2FzZSA2OnIuYXR0cmlidXRlJiZyLmF0dHJpYnV0ZS5sZW5ndGh8fChyLmF0dHJpYnV0ZT1bXSksci5hdHRyaWJ1dGUucHVzaChlLnN0cmluZygpKTticmVhaztjYXNlIDExOnIuYXR0cmlidXRlUHJvdG8mJnIuYXR0cmlidXRlUHJvdG8ubGVuZ3RofHwoci5hdHRyaWJ1dGVQcm90bz1bXSksci5hdHRyaWJ1dGVQcm90by5wdXNoKGMub25ueC5BdHRyaWJ1dGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSA3OnIubm9kZSYmci5ub2RlLmxlbmd0aHx8KHIubm9kZT1bXSksci5ub2RlLnB1c2goYy5vbm54Lk5vZGVQcm90by5kZWNvZGUoZSxlLnVpbnQzMigpKSk7YnJlYWs7Y2FzZSA4OnIuZG9jU3RyaW5nPWUuc3RyaW5nKCk7YnJlYWs7Y2FzZSA5OnIub3BzZXRJbXBvcnQmJnIub3BzZXRJbXBvcnQubGVuZ3RofHwoci5vcHNldEltcG9ydD1bXSksci5vcHNldEltcG9ydC5wdXNoKGMub25ueC5PcGVyYXRvclNldElkUHJvdG8uZGVjb2RlKGUsZS51aW50MzIoKSkpO2JyZWFrO2Nhc2UgMTA6ci5kb21haW49ZS5zdHJpbmcoKTticmVhaztkZWZhdWx0OmUuc2tpcFR5cGUoNyZvKTt9fXJldHVybiByfSxlLmRlY29kZURlbGltaXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF8fChlPW5ldyBhKGUpKSx0aGlzLmRlY29kZShlLGUudWludDMyKCkpfSxlLnZlcmlmeT1mdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiAib2JqZWN0IGV4cGVjdGVkIjtpZihudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmIWwuaXNTdHJpbmcoZS5uYW1lKSlyZXR1cm4gIm5hbWU6IHN0cmluZyBleHBlY3RlZCI7aWYobnVsbCE9ZS5pbnB1dCYmZS5oYXNPd25Qcm9wZXJ0eSgiaW5wdXQiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5pbnB1dCkpcmV0dXJuICJpbnB1dDogYXJyYXkgZXhwZWN0ZWQiO2Zvcih2YXIgdD0wO3Q8ZS5pbnB1dC5sZW5ndGg7Kyt0KWlmKCFsLmlzU3RyaW5nKGUuaW5wdXRbdF0pKXJldHVybiAiaW5wdXQ6IHN0cmluZ1tdIGV4cGVjdGVkIn1pZihudWxsIT1lLm91dHB1dCYmZS5oYXNPd25Qcm9wZXJ0eSgib3V0cHV0Iikpe2lmKCFBcnJheS5pc0FycmF5KGUub3V0cHV0KSlyZXR1cm4gIm91dHB1dDogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLm91dHB1dC5sZW5ndGg7Kyt0KWlmKCFsLmlzU3RyaW5nKGUub3V0cHV0W3RdKSlyZXR1cm4gIm91dHB1dDogc3RyaW5nW10gZXhwZWN0ZWQifWlmKG51bGwhPWUuYXR0cmlidXRlJiZlLmhhc093blByb3BlcnR5KCJhdHRyaWJ1dGUiKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGUpKXJldHVybiAiYXR0cmlidXRlOiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUuYXR0cmlidXRlLmxlbmd0aDsrK3QpaWYoIWwuaXNTdHJpbmcoZS5hdHRyaWJ1dGVbdF0pKXJldHVybiAiYXR0cmlidXRlOiBzdHJpbmdbXSBleHBlY3RlZCJ9aWYobnVsbCE9ZS5hdHRyaWJ1dGVQcm90byYmZS5oYXNPd25Qcm9wZXJ0eSgiYXR0cmlidXRlUHJvdG8iKSl7aWYoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGVQcm90bykpcmV0dXJuICJhdHRyaWJ1dGVQcm90bzogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLmF0dHJpYnV0ZVByb3RvLmxlbmd0aDsrK3QpaWYobj1jLm9ubnguQXR0cmlidXRlUHJvdG8udmVyaWZ5KGUuYXR0cmlidXRlUHJvdG9bdF0pKXJldHVybiAiYXR0cmlidXRlUHJvdG8uIitufWlmKG51bGwhPWUubm9kZSYmZS5oYXNPd25Qcm9wZXJ0eSgibm9kZSIpKXtpZighQXJyYXkuaXNBcnJheShlLm5vZGUpKXJldHVybiAibm9kZTogYXJyYXkgZXhwZWN0ZWQiO2Zvcih0PTA7dDxlLm5vZGUubGVuZ3RoOysrdClpZihuPWMub25ueC5Ob2RlUHJvdG8udmVyaWZ5KGUubm9kZVt0XSkpcmV0dXJuICJub2RlLiIrbn1pZihudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJiFsLmlzU3RyaW5nKGUuZG9jU3RyaW5nKSlyZXR1cm4gImRvY1N0cmluZzogc3RyaW5nIGV4cGVjdGVkIjtpZihudWxsIT1lLm9wc2V0SW1wb3J0JiZlLmhhc093blByb3BlcnR5KCJvcHNldEltcG9ydCIpKXtpZighQXJyYXkuaXNBcnJheShlLm9wc2V0SW1wb3J0KSlyZXR1cm4gIm9wc2V0SW1wb3J0OiBhcnJheSBleHBlY3RlZCI7Zm9yKHQ9MDt0PGUub3BzZXRJbXBvcnQubGVuZ3RoOysrdCl7dmFyIG47aWYobj1jLm9ubnguT3BlcmF0b3JTZXRJZFByb3RvLnZlcmlmeShlLm9wc2V0SW1wb3J0W3RdKSlyZXR1cm4gIm9wc2V0SW1wb3J0LiIrbn19cmV0dXJuIG51bGwhPWUuZG9tYWluJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmIWwuaXNTdHJpbmcoZS5kb21haW4pPyJkb21haW46IHN0cmluZyBleHBlY3RlZCI6bnVsbH0sZS5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBjLm9ubnguRnVuY3Rpb25Qcm90bylyZXR1cm4gZTt2YXIgdD1uZXcgYy5vbm54LkZ1bmN0aW9uUHJvdG87aWYobnVsbCE9ZS5uYW1lJiYodC5uYW1lPVN0cmluZyhlLm5hbWUpKSxlLmlucHV0KXtpZighQXJyYXkuaXNBcnJheShlLmlucHV0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8uaW5wdXQ6IGFycmF5IGV4cGVjdGVkIik7dC5pbnB1dD1bXTtmb3IodmFyIG49MDtuPGUuaW5wdXQubGVuZ3RoOysrbil0LmlucHV0W25dPVN0cmluZyhlLmlucHV0W25dKTt9aWYoZS5vdXRwdXQpe2lmKCFBcnJheS5pc0FycmF5KGUub3V0cHV0KSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8ub3V0cHV0OiBhcnJheSBleHBlY3RlZCIpO2Zvcih0Lm91dHB1dD1bXSxuPTA7bjxlLm91dHB1dC5sZW5ndGg7KytuKXQub3V0cHV0W25dPVN0cmluZyhlLm91dHB1dFtuXSk7fWlmKGUuYXR0cmlidXRlKXtpZighQXJyYXkuaXNBcnJheShlLmF0dHJpYnV0ZSkpdGhyb3cgVHlwZUVycm9yKCIub25ueC5GdW5jdGlvblByb3RvLmF0dHJpYnV0ZTogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5hdHRyaWJ1dGU9W10sbj0wO248ZS5hdHRyaWJ1dGUubGVuZ3RoOysrbil0LmF0dHJpYnV0ZVtuXT1TdHJpbmcoZS5hdHRyaWJ1dGVbbl0pO31pZihlLmF0dHJpYnV0ZVByb3RvKXtpZighQXJyYXkuaXNBcnJheShlLmF0dHJpYnV0ZVByb3RvKSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8uYXR0cmlidXRlUHJvdG86IGFycmF5IGV4cGVjdGVkIik7Zm9yKHQuYXR0cmlidXRlUHJvdG89W10sbj0wO248ZS5hdHRyaWJ1dGVQcm90by5sZW5ndGg7KytuKXtpZigib2JqZWN0IiE9dHlwZW9mIGUuYXR0cmlidXRlUHJvdG9bbl0pdGhyb3cgVHlwZUVycm9yKCIub25ueC5GdW5jdGlvblByb3RvLmF0dHJpYnV0ZVByb3RvOiBvYmplY3QgZXhwZWN0ZWQiKTt0LmF0dHJpYnV0ZVByb3RvW25dPWMub25ueC5BdHRyaWJ1dGVQcm90by5mcm9tT2JqZWN0KGUuYXR0cmlidXRlUHJvdG9bbl0pO319aWYoZS5ub2RlKXtpZighQXJyYXkuaXNBcnJheShlLm5vZGUpKXRocm93IFR5cGVFcnJvcigiLm9ubnguRnVuY3Rpb25Qcm90by5ub2RlOiBhcnJheSBleHBlY3RlZCIpO2Zvcih0Lm5vZGU9W10sbj0wO248ZS5ub2RlLmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5ub2RlW25dKXRocm93IFR5cGVFcnJvcigiLm9ubnguRnVuY3Rpb25Qcm90by5ub2RlOiBvYmplY3QgZXhwZWN0ZWQiKTt0Lm5vZGVbbl09Yy5vbm54Lk5vZGVQcm90by5mcm9tT2JqZWN0KGUubm9kZVtuXSk7fX1pZihudWxsIT1lLmRvY1N0cmluZyYmKHQuZG9jU3RyaW5nPVN0cmluZyhlLmRvY1N0cmluZykpLGUub3BzZXRJbXBvcnQpe2lmKCFBcnJheS5pc0FycmF5KGUub3BzZXRJbXBvcnQpKXRocm93IFR5cGVFcnJvcigiLm9ubnguRnVuY3Rpb25Qcm90by5vcHNldEltcG9ydDogYXJyYXkgZXhwZWN0ZWQiKTtmb3IodC5vcHNldEltcG9ydD1bXSxuPTA7bjxlLm9wc2V0SW1wb3J0Lmxlbmd0aDsrK24pe2lmKCJvYmplY3QiIT10eXBlb2YgZS5vcHNldEltcG9ydFtuXSl0aHJvdyBUeXBlRXJyb3IoIi5vbm54LkZ1bmN0aW9uUHJvdG8ub3BzZXRJbXBvcnQ6IG9iamVjdCBleHBlY3RlZCIpO3Qub3BzZXRJbXBvcnRbbl09Yy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by5mcm9tT2JqZWN0KGUub3BzZXRJbXBvcnRbbl0pO319cmV0dXJuIG51bGwhPWUuZG9tYWluJiYodC5kb21haW49U3RyaW5nKGUuZG9tYWluKSksdH0sZS50b09iamVjdD1mdW5jdGlvbihlLHQpe3R8fCh0PXt9KTt2YXIgbj17fTtpZigodC5hcnJheXN8fHQuZGVmYXVsdHMpJiYobi5pbnB1dD1bXSxuLm91dHB1dD1bXSxuLmF0dHJpYnV0ZT1bXSxuLm5vZGU9W10sbi5vcHNldEltcG9ydD1bXSxuLmF0dHJpYnV0ZVByb3RvPVtdKSx0LmRlZmF1bHRzJiYobi5uYW1lPSIiLG4uZG9jU3RyaW5nPSIiLG4uZG9tYWluPSIiKSxudWxsIT1lLm5hbWUmJmUuaGFzT3duUHJvcGVydHkoIm5hbWUiKSYmKG4ubmFtZT1lLm5hbWUpLGUuaW5wdXQmJmUuaW5wdXQubGVuZ3RoKXtuLmlucHV0PVtdO2Zvcih2YXIgcj0wO3I8ZS5pbnB1dC5sZW5ndGg7KytyKW4uaW5wdXRbcl09ZS5pbnB1dFtyXTt9aWYoZS5vdXRwdXQmJmUub3V0cHV0Lmxlbmd0aClmb3Iobi5vdXRwdXQ9W10scj0wO3I8ZS5vdXRwdXQubGVuZ3RoOysrciluLm91dHB1dFtyXT1lLm91dHB1dFtyXTtpZihlLmF0dHJpYnV0ZSYmZS5hdHRyaWJ1dGUubGVuZ3RoKWZvcihuLmF0dHJpYnV0ZT1bXSxyPTA7cjxlLmF0dHJpYnV0ZS5sZW5ndGg7KytyKW4uYXR0cmlidXRlW3JdPWUuYXR0cmlidXRlW3JdO2lmKGUubm9kZSYmZS5ub2RlLmxlbmd0aClmb3Iobi5ub2RlPVtdLHI9MDtyPGUubm9kZS5sZW5ndGg7KytyKW4ubm9kZVtyXT1jLm9ubnguTm9kZVByb3RvLnRvT2JqZWN0KGUubm9kZVtyXSx0KTtpZihudWxsIT1lLmRvY1N0cmluZyYmZS5oYXNPd25Qcm9wZXJ0eSgiZG9jU3RyaW5nIikmJihuLmRvY1N0cmluZz1lLmRvY1N0cmluZyksZS5vcHNldEltcG9ydCYmZS5vcHNldEltcG9ydC5sZW5ndGgpZm9yKG4ub3BzZXRJbXBvcnQ9W10scj0wO3I8ZS5vcHNldEltcG9ydC5sZW5ndGg7KytyKW4ub3BzZXRJbXBvcnRbcl09Yy5vbm54Lk9wZXJhdG9yU2V0SWRQcm90by50b09iamVjdChlLm9wc2V0SW1wb3J0W3JdLHQpO2lmKG51bGwhPWUuZG9tYWluJiZlLmhhc093blByb3BlcnR5KCJkb21haW4iKSYmKG4uZG9tYWluPWUuZG9tYWluKSxlLmF0dHJpYnV0ZVByb3RvJiZlLmF0dHJpYnV0ZVByb3RvLmxlbmd0aClmb3Iobi5hdHRyaWJ1dGVQcm90bz1bXSxyPTA7cjxlLmF0dHJpYnV0ZVByb3RvLmxlbmd0aDsrK3Ipbi5hdHRyaWJ1dGVQcm90b1tyXT1jLm9ubnguQXR0cmlidXRlUHJvdG8udG9PYmplY3QoZS5hdHRyaWJ1dGVQcm90b1tyXSx0KTtyZXR1cm4gbn0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcyxzLnV0aWwudG9KU09OT3B0aW9ucyl9LGUuZ2V0VHlwZVVybD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9InR5cGUuZ29vZ2xlYXBpcy5jb20iKSxlKyIvb25ueC5GdW5jdGlvblByb3RvIn0sZX0oKSxpKSxlLmV4cG9ydHM9Yzt9LDM0NzQ6KGUsdCxuKT0+e3ZhciByLG89KHI9InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdD9kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYzp2b2lkIDAsInVuZGVmaW5lZCIhPXR5cGVvZiBfX2ZpbGVuYW1lJiYocj1yfHxfX2ZpbGVuYW1lKSxmdW5jdGlvbihlPXt9KXtmdW5jdGlvbiB0KCl7cmV0dXJuICQuYnVmZmVyIT1qLmJ1ZmZlciYmQigpLGp9ZnVuY3Rpb24gbygpe3JldHVybiAkLmJ1ZmZlciE9ai5idWZmZXImJkIoKSxSfWZ1bmN0aW9uIGkoKXtyZXR1cm4gJC5idWZmZXIhPWouYnVmZmVyJiZCKCksTH1mdW5jdGlvbiBzKCl7cmV0dXJuICQuYnVmZmVyIT1qLmJ1ZmZlciYmQigpLEN9ZnVuY3Rpb24gYSgpe3JldHVybiAkLmJ1ZmZlciE9ai5idWZmZXImJkIoKSxNfXZhciB1LGwsYz1lO2MucmVhZHk9bmV3IFByb21pc2UoKChlLHQpPT57dT1lLGw9dDt9KSk7dmFyIHAsZCxmLGg9T2JqZWN0LmFzc2lnbih7fSxjKSxnPSIuL3RoaXMucHJvZ3JhbSIsYj0oZSx0KT0+e3Rocm93IHR9LG09Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cseT0iZnVuY3Rpb24iPT10eXBlb2YgaW1wb3J0U2NyaXB0cyx2PSJvYmplY3QiPT10eXBlb2YgcHJvY2VzcyYmIm9iamVjdCI9PXR5cGVvZiBwcm9jZXNzLnZlcnNpb25zJiYic3RyaW5nIj09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSxfPWMuRU5WSVJPTk1FTlRfSVNfUFRIUkVBRHx8ITEsdz0iIjtmdW5jdGlvbiBUKGUpe3JldHVybiBjLmxvY2F0ZUZpbGU/Yy5sb2NhdGVGaWxlKGUsdyk6dytlfWlmKHYpe3ZhciB4PW4oMTM4NCksTz1uKDkwOCk7bGV0IHQ7dz15P08uZGlybmFtZSh3KSsiLyI6X19kaXJuYW1lKyIvIixwPShlLHQpPT4oZT1lLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKT9uZXcgVVJMKGUpOk8ubm9ybWFsaXplKGUpLHgucmVhZEZpbGVTeW5jKGUsdD92b2lkIDA6InV0ZjgiKSksZj1lPT4oKGU9cChlLCEwKSkuYnVmZmVyfHwoZT1uZXcgVWludDhBcnJheShlKSksZSksZD0oZSx0LG4scj0hMCk9PntlPWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpP25ldyBVUkwoZSk6Ty5ub3JtYWxpemUoZSkseC5yZWFkRmlsZShlLHI/dm9pZCAwOiJ1dGY4IiwoKGUsbyk9PntlP24oZSk6dChyP28uYnVmZmVyOm8pO30pKTt9LCFjLnRoaXNQcm9ncmFtJiYxPHByb2Nlc3MuYXJndi5sZW5ndGgmJihnPXByb2Nlc3MuYXJndlsxXS5yZXBsYWNlKC9cXC9nLCIvIikpLHByb2Nlc3MuYXJndi5zbGljZSgyKSxiPShlLHQpPT57dGhyb3cgcHJvY2Vzcy5leGl0Q29kZT1lLHR9LGMuaW5zcGVjdD0oKT0+IltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdIjt0cnl7dD1uKDk5MjUpO31jYXRjaChlKXt0aHJvdyBjb25zb2xlLmVycm9yKCdUaGUgIndvcmtlcl90aHJlYWRzIiBtb2R1bGUgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIG5vZGUuanMgYnVpbGQgLSBwZXJoYXBzIGEgbmV3ZXIgdmVyc2lvbiBpcyBuZWVkZWQ/JyksZX1jb21tb25qc0dsb2JhbC5Xb3JrZXI9dC5Xb3JrZXI7fWVsc2UgKG18fHkpJiYoeT93PXNlbGYubG9jYXRpb24uaHJlZjoidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYodz1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksciYmKHc9ciksdz0wIT09dy5pbmRleE9mKCJibG9iOiIpP3cuc3Vic3RyKDAsdy5yZXBsYWNlKC9bPyNdLiovLCIiKS5sYXN0SW5kZXhPZigiLyIpKzEpOiIiLHZ8fChwPWU9Pnt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHQub3BlbigiR0VUIixlLCExKSx0LnNlbmQobnVsbCksdC5yZXNwb25zZVRleHR9LHkmJihmPWU9Pnt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHQub3BlbigiR0VUIixlLCExKSx0LnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLHQuc2VuZChudWxsKSxuZXcgVWludDhBcnJheSh0LnJlc3BvbnNlKX0pLGQ9KGUsdCxuKT0+e3ZhciByPW5ldyBYTUxIdHRwUmVxdWVzdDtyLm9wZW4oIkdFVCIsZSwhMCksci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixyLm9ubG9hZD0oKT0+ezIwMD09ci5zdGF0dXN8fDA9PXIuc3RhdHVzJiZyLnJlc3BvbnNlP3Qoci5yZXNwb25zZSk6bigpO30sci5vbmVycm9yPW4sci5zZW5kKG51bGwpO30pKTt2JiYidW5kZWZpbmVkIj09dHlwZW9mIHBlcmZvcm1hbmNlJiYoY29tbW9uanNHbG9iYWwucGVyZm9ybWFuY2U9big2OTUzKS5wZXJmb3JtYW5jZSk7dmFyIFM9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSxBPWNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTt2JiYoUz0oLi4uZSk9Pngud3JpdGVTeW5jKDEsZS5qb2luKCIgIikrIlxuIiksQT0oLi4uZSk9Pngud3JpdGVTeW5jKDIsZS5qb2luKCIgIikrIlxuIikpO3ZhciBQLEk9Yy5wcmludHx8UyxFPWMucHJpbnRFcnJ8fEE7T2JqZWN0LmFzc2lnbihjLGgpLGg9bnVsbCxjLnRoaXNQcm9ncmFtJiYoZz1jLnRoaXNQcm9ncmFtKSxjLnF1aXQmJihiPWMucXVpdCksYy53YXNtQmluYXJ5JiYoUD1jLndhc21CaW5hcnkpO3ZhciBEPWMubm9FeGl0UnVudGltZXx8ITA7Im9iamVjdCIhPXR5cGVvZiBXZWJBc3NlbWJseSYmbmUoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTt2YXIgJCxrLEYsTixqLFIsTCxDLE0sVT0hMTtmdW5jdGlvbiBCKCl7dmFyIGU9JC5idWZmZXI7Yy5IRUFQOD1qPW5ldyBJbnQ4QXJyYXkoZSksYy5IRUFQMTY9bmV3IEludDE2QXJyYXkoZSksYy5IRUFQMzI9TD1uZXcgSW50MzJBcnJheShlKSxjLkhFQVBVOD1SPW5ldyBVaW50OEFycmF5KGUpLGMuSEVBUFUxNj1uZXcgVWludDE2QXJyYXkoZSksYy5IRUFQVTMyPUM9bmV3IFVpbnQzMkFycmF5KGUpLGMuSEVBUEYzMj1uZXcgRmxvYXQzMkFycmF5KGUpLGMuSEVBUEY2ND1NPW5ldyBGbG9hdDY0QXJyYXkoZSk7fXZhciBWPWMuSU5JVElBTF9NRU1PUll8fDE2Nzc3MjE2O2lmKDUyNDI4ODA8PVZ8fG5lKCJJTklUSUFMX01FTU9SWSBzaG91bGQgYmUgbGFyZ2VyIHRoYW4gU1RBQ0tfU0laRSwgd2FzICIrVisiISAoU1RBQ0tfU0laRT01MjQyODgwKSIpLF8pJD1jLndhc21NZW1vcnk7ZWxzZSBpZihjLndhc21NZW1vcnkpJD1jLndhc21NZW1vcnk7ZWxzZSBpZighKCgkPW5ldyBXZWJBc3NlbWJseS5NZW1vcnkoe2luaXRpYWw6Vi82NTUzNixtYXhpbXVtOjY1NTM2LHNoYXJlZDohMH0pKS5idWZmZXIgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcikpdGhyb3cgRSgicmVxdWVzdGVkIGEgc2hhcmVkIFdlYkFzc2VtYmx5Lk1lbW9yeSBidXQgdGhlIHJldHVybmVkIGJ1ZmZlciBpcyBub3QgYSBTaGFyZWRBcnJheUJ1ZmZlciwgaW5kaWNhdGluZyB0aGF0IHdoaWxlIHRoZSBicm93c2VyIGhhcyBTaGFyZWRBcnJheUJ1ZmZlciBpdCBkb2VzIG5vdCBoYXZlIFdlYkFzc2VtYmx5IHRocmVhZHMgc3VwcG9ydCAtIHlvdSBtYXkgbmVlZCB0byBzZXQgYSBmbGFnIiksdiYmRSgiKG9uIG5vZGUgeW91IG1heSBuZWVkOiAtLWV4cGVyaW1lbnRhbC13YXNtLXRocmVhZHMgLS1leHBlcmltZW50YWwtd2FzbS1idWxrLW1lbW9yeSBhbmQvb3IgcmVjZW50IHZlcnNpb24pIiksRXJyb3IoImJhZCBtZW1vcnkiKTtCKCksVj0kLmJ1ZmZlci5ieXRlTGVuZ3RoO3ZhciB6LEc9W10sSD1bXSxXPVtdLHE9MDtmdW5jdGlvbiBYKCl7cmV0dXJuIER8fDA8cX12YXIgWSxLLEo9MCxRPW51bGw7ZnVuY3Rpb24gZWUoKXtKKyssYy5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZjLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoSik7fWZ1bmN0aW9uIHRlKCl7aWYoSi0tLGMubW9uaXRvclJ1bkRlcGVuZGVuY2llcyYmYy5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKEopLDA9PUomJihRKSl7dmFyIGU9UTtRPW51bGwsZSgpO319ZnVuY3Rpb24gbmUoZSl7dGhyb3cgYy5vbkFib3J0JiZjLm9uQWJvcnQoZSksRShlPSJBYm9ydGVkKCIrZSsiKSIpLFU9ITAsTj0xLGU9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihlKyIuIEJ1aWxkIHdpdGggLXNBU1NFUlRJT05TIGZvciBtb3JlIGluZm8uIiksbChlKSxlfWZ1bmN0aW9uIHJlKGUpe3JldHVybiBlLnN0YXJ0c1dpdGgoImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiKX1mdW5jdGlvbiBvZShlKXtpZihlPT1ZJiZQKXJldHVybiBuZXcgVWludDhBcnJheShQKTtpZihmKXJldHVybiBmKGUpO3Rocm93ICJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9ZnVuY3Rpb24gaWUoZSx0LG4pe3JldHVybiBmdW5jdGlvbihlKXtpZighUCYmKG18fHkpKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZmV0Y2gmJiFlLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSlyZXR1cm4gZmV0Y2goZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oKHQ9PntpZighdC5vayl0aHJvdyAiZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnIitlKyInIjtyZXR1cm4gdC5hcnJheUJ1ZmZlcigpfSkpLmNhdGNoKCgoKT0+b2UoZSkpKTtpZihkKXJldHVybiBuZXcgUHJvbWlzZSgoKHQsbik9PntkKGUsKGU9PnQobmV3IFVpbnQ4QXJyYXkoZSkpKSxuKTt9KSl9cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT5vZShlKSkpfShlKS50aGVuKChlPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShlLHQpKSkudGhlbigoZT0+ZSkpLnRoZW4obiwoZT0+e0UoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrZSksbmUoZSk7fSkpfWZ1bmN0aW9uIHNlKGUpe3RoaXMubmFtZT0iRXhpdFN0YXR1cyIsdGhpcy5tZXNzYWdlPWBQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCR7ZX0pYCx0aGlzLnN0YXR1cz1lO31mdW5jdGlvbiBhZShlKXtlLnRlcm1pbmF0ZSgpLGUub25tZXNzYWdlPSgpPT57fTt9ZnVuY3Rpb24gdWUoZSl7KGU9Z2UuRmFbZV0pfHxuZSgpLGdlLmZiKGUpO31mdW5jdGlvbiBsZShlKXt2YXIgdD1nZS5aYSgpO2lmKCF0KXJldHVybiA2O2dlLklhLnB1c2godCksZ2UuRmFbZS5IYV09dCx0LkhhPWUuSGE7dmFyIG49e2NtZDoicnVuIixzdGFydF9yb3V0aW5lOmUuZ2IsYXJnOmUuWWEscHRocmVhZF9wdHI6ZS5IYX07cmV0dXJuIHYmJnQudW5yZWYoKSx0LnBvc3RNZXNzYWdlKG4sZS5tYiksMH1yZShZPSJvcnQtd2FzbS10aHJlYWRlZC53YXNtIil8fChZPVQoWSkpO3ZhciBjZT0idW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxwZT0oZSx0LG4pPT57dmFyIHI9KHQ+Pj49MCkrbjtmb3Iobj10O2Vbbl0mJiEobj49cik7KSsrbjtpZigxNjxuLXQmJmUuYnVmZmVyJiZjZSlyZXR1cm4gY2UuZGVjb2RlKGUuYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXI/ZS5zbGljZSh0LG4pOmUuc3ViYXJyYXkodCxuKSk7Zm9yKHI9IiI7dDxuOyl7dmFyIG89ZVt0KytdO2lmKDEyOCZvKXt2YXIgaT02MyZlW3QrK107aWYoMTkyPT0oMjI0Jm8pKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKDMxJm8pPDw2fGkpO2Vsc2Uge3ZhciBzPTYzJmVbdCsrXTs2NTUzNj4obz0yMjQ9PSgyNDAmbyk/KDE1Jm8pPDwxMnxpPDw2fHM6KDcmbyk8PDE4fGk8PDEyfHM8PDZ8NjMmZVt0KytdKT9yKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pOihvLT02NTUzNixyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fG8+PjEwLDU2MzIwfDEwMjMmbykpO319ZWxzZSByKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pO31yZXR1cm4gcn0sZGU9KGUsdCk9PihlPj4+PTApP3BlKG8oKSxlLHQpOiIiO2Z1bmN0aW9uIGZlKGUpe2lmKF8pcmV0dXJuIFhlKDEsMSxlKTtOPWUsWCgpfHwoZ2UuaGIoKSxjLm9uRXhpdCYmYy5vbkV4aXQoZSksVT0hMCksYihlLG5ldyBzZShlKSk7fXZhciBoZT1lPT57aWYoTj1lLF8pdGhyb3cgbWUoZSksInVud2luZCI7ZmUoZSk7fSxnZT17TGE6W10sSWE6W10sVGE6W10sRmE6e30sUGE6ZnVuY3Rpb24oKXtfP2dlLmFiKCk6Z2UuJGEoKTt9LCRhOmZ1bmN0aW9uKCl7Ry51bnNoaWZ0KCgoKT0+e2VlKCksZ2UuYmIoKCgpPT50ZSgpKSk7fSkpO30sYWI6ZnVuY3Rpb24oKXtnZS5yZWNlaXZlT2JqZWN0VHJhbnNmZXI9Z2UuZWIsZ2UudGhyZWFkSW5pdFRMUz1nZS5TYSxnZS5zZXRFeGl0U3RhdHVzPWdlLlJhLEQ9ITE7fSxSYTpmdW5jdGlvbihlKXtOPWU7fSxyYjpbIiR0ZXJtaW5hdGVXb3JrZXIiXSxoYjpmdW5jdGlvbigpe2Zvcih2YXIgZSBvZiBnZS5JYSlhZShlKTtmb3IoZSBvZiBnZS5MYSlhZShlKTtnZS5MYT1bXSxnZS5JYT1bXSxnZS5GYT1bXTt9LGZiOmZ1bmN0aW9uKGUpe3ZhciB0PWUuSGE7ZGVsZXRlIGdlLkZhW3RdLGdlLkxhLnB1c2goZSksZ2UuSWEuc3BsaWNlKGdlLklhLmluZGV4T2YoZSksMSksZS5IYT0wLHl0KHQpO30sZWI6ZnVuY3Rpb24oKXt9LFNhOmZ1bmN0aW9uKCl7Z2UuVGEuZm9yRWFjaCgoZT0+ZSgpKSk7fSxjYjplPT5uZXcgUHJvbWlzZSgodD0+e2Uub25tZXNzYWdlPW49Pnt2YXIgcj0obj1uLmRhdGEpLmNtZDtpZihuLnRhcmdldFRocmVhZCYmbi50YXJnZXRUaHJlYWQhPWZ0KCkpe3ZhciBvPWdlLkZhW24ucWJdO28/by5wb3N0TWVzc2FnZShuLG4udHJhbnNmZXJMaXN0KTpFKCdJbnRlcm5hbCBlcnJvciEgV29ya2VyIHNlbnQgYSBtZXNzYWdlICInK3IrJyIgdG8gdGFyZ2V0IHB0aHJlYWQgJytuLnRhcmdldFRocmVhZCsiLCBidXQgdGhhdCB0aHJlYWQgbm8gbG9uZ2VyIGV4aXN0cyEiKTt9ZWxzZSAiY2hlY2tNYWlsYm94Ij09PXI/VWUoKToic3Bhd25UaHJlYWQiPT09cj9sZShuKToiY2xlYW51cFRocmVhZCI9PT1yP3VlKG4udGhyZWFkKToia2lsbFRocmVhZCI9PT1yPyhuPW4udGhyZWFkLHI9Z2UuRmFbbl0sZGVsZXRlIGdlLkZhW25dLGFlKHIpLHl0KG4pLGdlLklhLnNwbGljZShnZS5JYS5pbmRleE9mKHIpLDEpLHIuSGE9MCk6ImNhbmNlbFRocmVhZCI9PT1yP2dlLkZhW24udGhyZWFkXS5wb3N0TWVzc2FnZSh7Y21kOiJjYW5jZWwifSk6ImxvYWRlZCI9PT1yPyhlLmxvYWRlZD0hMCx0KGUpKToiYWxlcnQiPT09cj9hbGVydCgiVGhyZWFkICIrbi50aHJlYWRJZCsiOiAiK24udGV4dCk6InNldGltbWVkaWF0ZSI9PT1uLnRhcmdldD9lLnBvc3RNZXNzYWdlKG4pOiJjYWxsSGFuZGxlciI9PT1yP2Nbbi5oYW5kbGVyXSguLi5uLmFyZ3MpOnImJkUoIndvcmtlciBzZW50IGFuIHVua25vd24gY29tbWFuZCAiK3IpO30sZS5vbmVycm9yPWU9Pnt0aHJvdyBFKCJ3b3JrZXIgc2VudCBhbiBlcnJvciEgIitlLmZpbGVuYW1lKyI6IitlLmxpbmVubysiOiAiK2UubWVzc2FnZSksZX0sdiYmKGUub24oIm1lc3NhZ2UiLChmdW5jdGlvbih0KXtlLm9ubWVzc2FnZSh7ZGF0YTp0fSk7fSkpLGUub24oImVycm9yIiwoZnVuY3Rpb24odCl7ZS5vbmVycm9yKHQpO30pKSk7dmFyIG4sbz1bXTtmb3IobiBvZiBbIm9uRXhpdCIsIm9uQWJvcnQiLCJwcmludCIsInByaW50RXJyIl0pYy5oYXNPd25Qcm9wZXJ0eShuKSYmby5wdXNoKG4pO2UucG9zdE1lc3NhZ2Uoe2NtZDoibG9hZCIsaGFuZGxlcnM6byx1cmxPckJsb2I6Yy5tYWluU2NyaXB0VXJsT3JCbG9ifHxyLHdhc21NZW1vcnk6JCx3YXNtTW9kdWxlOkZ9KTt9KSksYmI6ZnVuY3Rpb24oZSl7ZSgpO30sWGE6ZnVuY3Rpb24oKXt2YXIgZT1UKCJvcnQtd2FzbS10aHJlYWRlZC53b3JrZXIuanMiKTtlPW5ldyBXb3JrZXIoZSksZ2UuTGEucHVzaChlKTt9LFphOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PWdlLkxhLmxlbmd0aCYmKGdlLlhhKCksZ2UuY2IoZ2UuTGFbMF0pKSxnZS5MYS5wb3AoKX19O2MuUFRocmVhZD1nZTt2YXIgYmU9ZT0+e2Zvcig7MDxlLmxlbmd0aDspZS5zaGlmdCgpKGMpO307ZnVuY3Rpb24gbWUoZSl7aWYoXylyZXR1cm4gWGUoMiwwLGUpO2hlKGUpO31jLmVzdGFibGlzaFN0YWNrU3BhY2U9ZnVuY3Rpb24oKXt2YXIgZT1mdCgpLHQ9aSgpW2UrNTI+PjI+Pj4wXTtlPWkoKVtlKzU2Pj4yPj4+MF0sVHQodCx0LWUpLE90KHQpO307dmFyIHllPVtdO2Z1bmN0aW9uIHZlKGUpe3RoaXMuT2E9ZS0yNCx0aGlzLldhPWZ1bmN0aW9uKGUpe3MoKVt0aGlzLk9hKzQ+PjI+Pj4wXT1lO30sdGhpcy5WYT1mdW5jdGlvbihlKXtzKClbdGhpcy5PYSs4Pj4yPj4+MF09ZTt9LHRoaXMuUGE9ZnVuY3Rpb24oZSx0KXt0aGlzLlVhKCksdGhpcy5XYShlKSx0aGlzLlZhKHQpO30sdGhpcy5VYT1mdW5jdGlvbigpe3MoKVt0aGlzLk9hKzE2Pj4yPj4+MF09MDt9O31mdW5jdGlvbiBfZShlLHQsbixyKXtyZXR1cm4gXz9YZSgzLDEsZSx0LG4scik6d2UoZSx0LG4scil9ZnVuY3Rpb24gd2UoZSx0LG4scil7aWYoZT4+Pj0wLHQ+Pj49MCxuPj4+PTAscj4+Pj0wLCJ1bmRlZmluZWQiPT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIpcmV0dXJuIEUoIkN1cnJlbnQgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCBTaGFyZWRBcnJheUJ1ZmZlciwgcHRocmVhZHMgYXJlIG5vdCBhdmFpbGFibGUhIiksNjt2YXIgbz1bXTtyZXR1cm4gXyYmMD09PW8ubGVuZ3RoP19lKGUsdCxuLHIpOihlPXtnYjpuLEhhOmUsWWE6cixtYjpvfSxfPyhlLm9iPSJzcGF3blRocmVhZCIscG9zdE1lc3NhZ2UoZSxvKSwwKTpsZShlKSl9ZnVuY3Rpb24gVGUoZSx0LG4pe3JldHVybiBfP1hlKDQsMSxlLHQsbik6MH1mdW5jdGlvbiB4ZShlLHQpe2lmKF8pcmV0dXJuIFhlKDUsMSxlLHQpfWMuaW52b2tlRW50cnlQb2ludD1mdW5jdGlvbihlLHQpe3ZhciBuPXllW2VdO258fChlPj15ZS5sZW5ndGgmJih5ZS5sZW5ndGg9ZSsxKSx5ZVtlXT1uPXouZ2V0KGUpKSxlPW4odCksWCgpP2dlLlJhKGUpOnZ0KGUpO307dmFyIE9lPWU9Pntmb3IodmFyIHQ9MCxuPTA7bjxlLmxlbmd0aDsrK24pe3ZhciByPWUuY2hhckNvZGVBdChuKTsxMjc+PXI/dCsrOjIwNDc+PXI/dCs9Mjo1NTI5Njw9ciYmNTczNDM+PXI/KHQrPTQsKytuKTp0Kz0zO31yZXR1cm4gdH0sU2U9KGUsdCxuLHIpPT57aWYoISgwPHIpKXJldHVybiAwO3ZhciBvPW4+Pj49MDtyPW4rci0xO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7KytpKXt2YXIgcz1lLmNoYXJDb2RlQXQoaSk7aWYoNTUyOTY8PXMmJjU3MzQzPj1zJiYocz02NTUzNisoKDEwMjMmcyk8PDEwKXwxMDIzJmUuY2hhckNvZGVBdCgrK2kpKSwxMjc+PXMpe2lmKG4+PXIpYnJlYWs7dFtuKys+Pj4wXT1zO31lbHNlIHtpZigyMDQ3Pj1zKXtpZihuKzE+PXIpYnJlYWs7dFtuKys+Pj4wXT0xOTJ8cz4+Njt9ZWxzZSB7aWYoNjU1MzU+PXMpe2lmKG4rMj49cilicmVhazt0W24rKz4+PjBdPTIyNHxzPj4xMjt9ZWxzZSB7aWYobiszPj1yKWJyZWFrO3RbbisrPj4+MF09MjQwfHM+PjE4LHRbbisrPj4+MF09MTI4fHM+PjEyJjYzO310W24rKz4+PjBdPTEyOHxzPj42JjYzO310W24rKz4+PjBdPTEyOHw2MyZzO319cmV0dXJuIHRbbj4+PjBdPTAsbi1vfSxBZT0oZSx0LG4pPT5TZShlLG8oKSx0LG4pO2Z1bmN0aW9uIFBlKGUsdCl7aWYoXylyZXR1cm4gWGUoNiwxLGUsdCl9ZnVuY3Rpb24gSWUoZSx0LG4pe2lmKF8pcmV0dXJuIFhlKDcsMSxlLHQsbil9ZnVuY3Rpb24gRWUoZSx0LG4pe3JldHVybiBfP1hlKDgsMSxlLHQsbik6MH1mdW5jdGlvbiBEZShlLHQpe2lmKF8pcmV0dXJuIFhlKDksMSxlLHQpfWZ1bmN0aW9uICRlKGUsdCxuKXtpZihfKXJldHVybiBYZSgxMCwxLGUsdCxuKX1mdW5jdGlvbiBrZShlLHQsbixyKXtpZihfKXJldHVybiBYZSgxMSwxLGUsdCxuLHIpfWZ1bmN0aW9uIEZlKGUsdCxuLHIpe2lmKF8pcmV0dXJuIFhlKDEyLDEsZSx0LG4scil9ZnVuY3Rpb24gTmUoZSx0LG4scil7aWYoXylyZXR1cm4gWGUoMTMsMSxlLHQsbixyKX1mdW5jdGlvbiBqZShlKXtpZihfKXJldHVybiBYZSgxNCwxLGUpfWZ1bmN0aW9uIFJlKGUsdCl7aWYoXylyZXR1cm4gWGUoMTUsMSxlLHQpfWZ1bmN0aW9uIExlKGUsdCxuKXtpZihfKXJldHVybiBYZSgxNiwxLGUsdCxuKX12YXIgQ2U9ZT0+e2lmKCFVKXRyeXtpZihlKCksIVgoKSl0cnl7Xz92dChOKTpoZShOKTt9Y2F0Y2goZSl7ZSBpbnN0YW5jZW9mIHNlfHwidW53aW5kIj09ZXx8YigxLGUpO319Y2F0Y2goZSl7ZSBpbnN0YW5jZW9mIHNlfHwidW53aW5kIj09ZXx8YigxLGUpO319O2Z1bmN0aW9uIE1lKGUpe2U+Pj49MCwiZnVuY3Rpb24iPT10eXBlb2YgQXRvbWljcy5uYiYmKEF0b21pY3MubmIoaSgpLGU+PjIsZSkudmFsdWUudGhlbihVZSksZSs9MTI4LEF0b21pY3Muc3RvcmUoaSgpLGU+PjIsMSkpO31mdW5jdGlvbiBVZSgpe3ZhciBlPWZ0KCk7ZSYmKE1lKGUpLENlKCgoKT0+X3QoKSkpKTt9Yy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX21haWxib3hfYXdhaXQ9TWUsYy5jaGVja01haWxib3g9VWU7dmFyIEJlPWU9PjA9PWUlNCYmKDAhPWUlMTAwfHwwPT1lJTQwMCksVmU9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV0semU9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF07ZnVuY3Rpb24gR2UoZSx0LG4scixvLGkscyxhKXtyZXR1cm4gXz9YZSgxNywxLGUsdCxuLHIsbyxpLHMsYSk6LTUyfWZ1bmN0aW9uIEhlKGUsdCxuLHIsbyxpLHMpe2lmKF8pcmV0dXJuIFhlKDE4LDEsZSx0LG4scixvLGkscyl9dmFyIFdlPWU9Pnt2YXIgdD1PZShlKSsxLG49aHQodCk7cmV0dXJuIG4mJkFlKGUsbix0KSxufSxxZT1lPT57dmFyIHQ9eHQoKTtyZXR1cm4gZT1lKCksT3QodCksZX07ZnVuY3Rpb24gWGUoZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoLTIscj1hcmd1bWVudHM7cmV0dXJuIHFlKCgoKT0+e2Zvcih2YXIgbz1TdCg4Km4pLGk9bz4+MyxzPTA7czxuO3MrKyl7dmFyIHU9clsyK3NdO2EoKVtpK3M+Pj4wXT11O31yZXR1cm4gbXQoZSxuLG8sdCl9KSl9dmFyIFllLEtlPVtdLEplPXt9LFplPSgpPT57aWYoIVllKXt2YXIgZSx0PXtVU0VSOiJ3ZWJfdXNlciIsTE9HTkFNRToid2ViX3VzZXIiLFBBVEg6Ii8iLFBXRDoiLyIsSE9NRToiL2hvbWUvd2ViX3VzZXIiLExBTkc6KCJvYmplY3QiPT10eXBlb2YgbmF2aWdhdG9yJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIsXzpnfHwiLi90aGlzLnByb2dyYW0ifTtmb3IoZSBpbiBKZSl2b2lkIDA9PT1KZVtlXT9kZWxldGUgdFtlXTp0W2VdPUplW2VdO3ZhciBuPVtdO2ZvcihlIGluIHQpbi5wdXNoKGAke2V9PSR7dFtlXX1gKTtZZT1uO31yZXR1cm4gWWV9O2Z1bmN0aW9uIFFlKGUsbil7aWYoXylyZXR1cm4gWGUoMTksMSxlLG4pO2U+Pj49MCxuPj4+PTA7dmFyIHI9MDtyZXR1cm4gWmUoKS5mb3JFYWNoKChmdW5jdGlvbihvLGkpe3ZhciBhPW4rcjtmb3IoaT1zKClbZSs0Kmk+PjI+Pj4wXT1hLGE9MDthPG8ubGVuZ3RoOysrYSl0KClbaSsrPj4wPj4+MF09by5jaGFyQ29kZUF0KGEpO3QoKVtpPj4wPj4+MF09MCxyKz1vLmxlbmd0aCsxO30pKSwwfWZ1bmN0aW9uIGV0KGUsdCl7aWYoXylyZXR1cm4gWGUoMjAsMSxlLHQpO2U+Pj49MCx0Pj4+PTA7dmFyIG49WmUoKTtzKClbZT4+Mj4+PjBdPW4ubGVuZ3RoO3ZhciByPTA7cmV0dXJuIG4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7cis9ZS5sZW5ndGgrMTt9KSkscygpW3Q+PjI+Pj4wXT1yLDB9ZnVuY3Rpb24gdHQoZSl7cmV0dXJuIF8/WGUoMjEsMSxlKTo1Mn1mdW5jdGlvbiBudChlLHQsbixyKXtyZXR1cm4gXz9YZSgyMiwxLGUsdCxuLHIpOjUyfWZ1bmN0aW9uIHJ0KGUsdCxuLHIsbyl7cmV0dXJuIF8/WGUoMjMsMSxlLHQsbixyLG8pOjcwfXZhciBvdD1bbnVsbCxbXSxbXV07ZnVuY3Rpb24gaXQoZSx0LG4scil7aWYoXylyZXR1cm4gWGUoMjQsMSxlLHQsbixyKTt0Pj4+PTAsbj4+Pj0wLHI+Pj49MDtmb3IodmFyIGk9MCxhPTA7YTxuO2ErKyl7dmFyIHU9cygpW3Q+PjI+Pj4wXSxsPXMoKVt0KzQ+PjI+Pj4wXTt0Kz04O2Zvcih2YXIgYz0wO2M8bDtjKyspe3ZhciBwPW8oKVt1K2M+Pj4wXSxkPW90W2VdOzA9PT1wfHwxMD09PXA/KCgxPT09ZT9JOkUpKHBlKGQsMCkpLGQubGVuZ3RoPTApOmQucHVzaChwKTt9aSs9bDt9cmV0dXJuIHMoKVtyPj4yPj4+MF09aSwwfXZhciBzdD1lPT4oc3Q9KCgpPT57aWYoIm9iamVjdCI9PXR5cGVvZiBjcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXJldHVybiBlPT4oZS5zZXQoY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShlLmJ5dGVMZW5ndGgpKSksZSk7aWYodil0cnl7dmFyIGU9big3NjApO2lmKGUucmFuZG9tRmlsbFN5bmMpcmV0dXJuIHQ9PmUucmFuZG9tRmlsbFN5bmModCk7dmFyIHQ9ZS5yYW5kb21CeXRlcztyZXR1cm4gZT0+KGUuc2V0KHQoZS5ieXRlTGVuZ3RoKSksZSl9Y2F0Y2goZSl7fW5lKCJpbml0UmFuZG9tRGV2aWNlIik7fSkoKSkoZSksYXQ9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSx1dD1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLGx0PShlLG4pPT57dCgpLnNldChlLG4+Pj4wKTt9O2Z1bmN0aW9uIGN0KGUsdCxuLHIpe2Z1bmN0aW9uIG8oZSx0LG4pe2ZvcihlPSJudW1iZXIiPT10eXBlb2YgZT9lLnRvU3RyaW5nKCk6ZXx8IiI7ZS5sZW5ndGg8dDspZT1uWzBdK2U7cmV0dXJuIGV9ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBvKGUsdCwiMCIpfWZ1bmN0aW9uIGEoZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiAwPmU/LTE6MDxlPzE6MH12YXIgcjtyZXR1cm4gMD09PShyPW4oZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSkpJiYwPT09KHI9bihlLmdldE1vbnRoKCktdC5nZXRNb250aCgpKSkmJihyPW4oZS5nZXREYXRlKCktdC5nZXREYXRlKCkpKSxyfWZ1bmN0aW9uIHUoZSl7c3dpdGNoKGUuZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMjkpO2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMik7Y2FzZSA0OnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKTtjYXNlIDU6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMwKX19ZnVuY3Rpb24gbChlKXt2YXIgdD1lLkphO2ZvcihlPW5ldyBEYXRlKG5ldyBEYXRlKGUuS2ErMTkwMCwwLDEpLmdldFRpbWUoKSk7MDx0Oyl7dmFyIG49ZS5nZXRNb250aCgpLHI9KEJlKGUuZ2V0RnVsbFllYXIoKSk/YXQ6dXQpW25dO2lmKCEodD5yLWUuZ2V0RGF0ZSgpKSl7ZS5zZXREYXRlKGUuZ2V0RGF0ZSgpK3QpO2JyZWFrfXQtPXItZS5nZXREYXRlKCkrMSxlLnNldERhdGUoMSksMTE+bj9lLnNldE1vbnRoKG4rMSk6KGUuc2V0TW9udGgoMCksZS5zZXRGdWxsWWVhcihlLmdldEZ1bGxZZWFyKCkrMSkpO31yZXR1cm4gbj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCkrMSwwLDQpLHQ9dShuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCw0KSksbj11KG4pLDA+PWEodCxlKT8wPj1hKG4sZSk/ZS5nZXRGdWxsWWVhcigpKzE6ZS5nZXRGdWxsWWVhcigpOmUuZ2V0RnVsbFllYXIoKS0xfWU+Pj49MCx0Pj4+PTAsbj4+Pj0wLHI+Pj49MDt2YXIgYz1pKClbcis0MD4+Mj4+PjBdO2Zvcih2YXIgcCBpbiByPXtrYjppKClbcj4+Mj4+PjBdLGpiOmkoKVtyKzQ+PjI+Pj4wXSxNYTppKClbcis4Pj4yPj4+MF0sUWE6aSgpW3IrMTI+PjI+Pj4wXSxOYTppKClbcisxNj4+Mj4+PjBdLEthOmkoKVtyKzIwPj4yPj4+MF0sR2E6aSgpW3IrMjQ+PjI+Pj4wXSxKYTppKClbcisyOD4+Mj4+PjBdLHNiOmkoKVtyKzMyPj4yPj4+MF0saWI6aSgpW3IrMzY+PjI+Pj4wXSxsYjpjP2RlKGMpOiIifSxuPWRlKG4pLGM9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9KW49bi5yZXBsYWNlKG5ldyBSZWdFeHAocCwiZyIpLGNbcF0pO3ZhciBkPSJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheSIuc3BsaXQoIiAiKSxmPSJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyIi5zcGxpdCgiICIpO2ZvcihwIGluIGM9eyIlYSI6ZT0+ZFtlLkdhXS5zdWJzdHJpbmcoMCwzKSwiJUEiOmU9PmRbZS5HYV0sIiViIjplPT5mW2UuTmFdLnN1YnN0cmluZygwLDMpLCIlQiI6ZT0+ZltlLk5hXSwiJUMiOmU9PnMoKGUuS2ErMTkwMCkvMTAwfDAsMiksIiVkIjplPT5zKGUuUWEsMiksIiVlIjplPT5vKGUuUWEsMiwiICIpLCIlZyI6ZT0+bChlKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJUciOmU9PmwoZSksIiVIIjplPT5zKGUuTWEsMiksIiVJIjplPT4oMD09KGU9ZS5NYSk/ZT0xMjoxMjxlJiYoZS09MTIpLHMoZSwyKSksIiVqIjplPT57Zm9yKHZhciB0PTAsbj0wO248PWUuTmEtMTt0Kz0oQmUoZS5LYSsxOTAwKT9hdDp1dClbbisrXSk7cmV0dXJuIHMoZS5RYSt0LDMpfSwiJW0iOmU9PnMoZS5OYSsxLDIpLCIlTSI6ZT0+cyhlLmpiLDIpLCIlbiI6KCk9PiJcbiIsIiVwIjplPT4wPD1lLk1hJiYxMj5lLk1hPyJBTSI6IlBNIiwiJVMiOmU9PnMoZS5rYiwyKSwiJXQiOigpPT4iXHQiLCIldSI6ZT0+ZS5HYXx8NywiJVUiOmU9PnMoTWF0aC5mbG9vcigoZS5KYSs3LWUuR2EpLzcpLDIpLCIlViI6ZT0+e3ZhciB0PU1hdGguZmxvb3IoKGUuSmErNy0oZS5HYSs2KSU3KS83KTtpZigyPj0oZS5HYSszNzEtZS5KYS0yKSU3JiZ0KyssdCk1Mz09dCYmKDQ9PShuPShlLkdhKzM3MS1lLkphKSU3KXx8Mz09biYmQmUoZS5LYSl8fCh0PTEpKTtlbHNlIHt0PTUyO3ZhciBuPShlLkdhKzctZS5KYS0xKSU3Oyg0PT1ufHw1PT1uJiZCZShlLkthJTQwMC0xKSkmJnQrKzt9cmV0dXJuIHModCwyKX0sIiV3IjplPT5lLkdhLCIlVyI6ZT0+cyhNYXRoLmZsb29yKChlLkphKzctKGUuR2ErNiklNykvNyksMiksIiV5IjplPT4oZS5LYSsxOTAwKS50b1N0cmluZygpLnN1YnN0cmluZygyKSwiJVkiOmU9PmUuS2ErMTkwMCwiJXoiOmU9Pnt2YXIgdD0wPD0oZT1lLmliKTtyZXR1cm4gZT1NYXRoLmFicyhlKS82MCwodD8iKyI6Ii0iKStTdHJpbmcoIjAwMDAiKyhlLzYwKjEwMCtlJTYwKSkuc2xpY2UoLTQpfSwiJVoiOmU9PmUubGIsIiUlIjooKT0+IiUifSxuPW4ucmVwbGFjZSgvJSUvZywiXDBcMCIpLGMpbi5pbmNsdWRlcyhwKSYmKG49bi5yZXBsYWNlKG5ldyBSZWdFeHAocCwiZyIpLGNbcF0ocikpKTtyZXR1cm4gcD1mdW5jdGlvbihlKXt2YXIgdD1BcnJheShPZShlKSsxKTtyZXR1cm4gU2UoZSx0LDAsdC5sZW5ndGgpLHR9KG49bi5yZXBsYWNlKC9cMFwwL2csIiUiKSkscC5sZW5ndGg+dD8wOihsdChwLGUpLHAubGVuZ3RoLTEpfWdlLlBhKCk7dmFyIHB0PVtudWxsLGZlLG1lLF9lLFRlLHhlLFBlLEllLEVlLERlLCRlLGtlLEZlLE5lLGplLFJlLExlLEdlLEhlLFFlLGV0LHR0LG50LHJ0LGl0XSxkdD17YjpmdW5jdGlvbihlLHQsbil7dGhyb3cgbmV3IHZlKGU+Pj49MCkuUGEodD4+PjAsbj4+PjApLGV9LE46ZnVuY3Rpb24oZSl7Z3QoZT4+PjAsIXksMSwhbSwxMzEwNzIsITEpLGdlLlNhKCk7fSxrOmZ1bmN0aW9uKGUpe2U+Pj49MCxfP3Bvc3RNZXNzYWdlKHtjbWQ6ImNsZWFudXBUaHJlYWQiLHRocmVhZDplfSk6dWUoZSk7fSxJOndlLGg6VGUsVDp4ZSxFOlBlLEc6SWUsVTpFZSxSOkRlLEo6JGUsUTprZSxvOkZlLEY6TmUsQzpqZSxTOlJlLEQ6TGUscTooKT0+ITAsQTpmdW5jdGlvbihlLHQpeyhlPj4+PTApPT10Pj4+MD9zZXRUaW1lb3V0KCgoKT0+VWUoKSkpOl8/cG9zdE1lc3NhZ2Uoe3RhcmdldFRocmVhZDplLGNtZDoiY2hlY2tNYWlsYm94In0pOihlPWdlLkZhW2VdKSYmZS5wb3N0TWVzc2FnZSh7Y21kOiJjaGVja01haWxib3gifSk7fSxMOmZ1bmN0aW9uKCl7cmV0dXJuIC0xfSxNOk1lLHA6ZnVuY3Rpb24oZSl7diYmZ2UuRmFbZT4+PjBdLnJlZigpO30sdDpmdW5jdGlvbihlLHQsbil7ZT10KzIwOTcxNTI+Pj4wPDQxOTQzMDUtISFlPyhlPj4+MCkrNDI5NDk2NzI5Nip0Ok5hTixuPj4+PTAsZT1uZXcgRGF0ZSgxZTMqZSksaSgpW24+PjI+Pj4wXT1lLmdldFVUQ1NlY29uZHMoKSxpKClbbis0Pj4yPj4+MF09ZS5nZXRVVENNaW51dGVzKCksaSgpW24rOD4+Mj4+PjBdPWUuZ2V0VVRDSG91cnMoKSxpKClbbisxMj4+Mj4+PjBdPWUuZ2V0VVRDRGF0ZSgpLGkoKVtuKzE2Pj4yPj4+MF09ZS5nZXRVVENNb250aCgpLGkoKVtuKzIwPj4yPj4+MF09ZS5nZXRVVENGdWxsWWVhcigpLTE5MDAsaSgpW24rMjQ+PjI+Pj4wXT1lLmdldFVUQ0RheSgpLGU9KGUuZ2V0VGltZSgpLURhdGUuVVRDKGUuZ2V0VVRDRnVsbFllYXIoKSwwLDEsMCwwLDAsMCkpLzg2NGU1fDAsaSgpW24rMjg+PjI+Pj4wXT1lO30sdTpmdW5jdGlvbihlLHQsbil7ZT10KzIwOTcxNTI+Pj4wPDQxOTQzMDUtISFlPyhlPj4+MCkrNDI5NDk2NzI5Nip0Ok5hTixuPj4+PTAsZT1uZXcgRGF0ZSgxZTMqZSksaSgpW24+PjI+Pj4wXT1lLmdldFNlY29uZHMoKSxpKClbbis0Pj4yPj4+MF09ZS5nZXRNaW51dGVzKCksaSgpW24rOD4+Mj4+PjBdPWUuZ2V0SG91cnMoKSxpKClbbisxMj4+Mj4+PjBdPWUuZ2V0RGF0ZSgpLGkoKVtuKzE2Pj4yPj4+MF09ZS5nZXRNb250aCgpLGkoKVtuKzIwPj4yPj4+MF09ZS5nZXRGdWxsWWVhcigpLTE5MDAsaSgpW24rMjQ+PjI+Pj4wXT1lLmdldERheSgpLHQ9KEJlKGUuZ2V0RnVsbFllYXIoKSk/VmU6emUpW2UuZ2V0TW9udGgoKV0rZS5nZXREYXRlKCktMXwwLGkoKVtuKzI4Pj4yPj4+MF09dCxpKClbbiszNj4+Mj4+PjBdPS02MCplLmdldFRpbWV6b25lT2Zmc2V0KCksdD1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksNiwxKS5nZXRUaW1lem9uZU9mZnNldCgpO3ZhciByPW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDEpLmdldFRpbWV6b25lT2Zmc2V0KCk7ZT0wfCh0IT1yJiZlLmdldFRpbWV6b25lT2Zmc2V0KCk9PU1hdGgubWluKHIsdCkpLGkoKVtuKzMyPj4yPj4+MF09ZTt9LHY6ZnVuY3Rpb24oZSl7ZT4+Pj0wO3ZhciB0PW5ldyBEYXRlKGkoKVtlKzIwPj4yPj4+MF0rMTkwMCxpKClbZSsxNj4+Mj4+PjBdLGkoKVtlKzEyPj4yPj4+MF0saSgpW2UrOD4+Mj4+PjBdLGkoKVtlKzQ+PjI+Pj4wXSxpKClbZT4+Mj4+PjBdLDApLG49aSgpW2UrMzI+PjI+Pj4wXSxyPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSxvPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSw2LDEpLmdldFRpbWV6b25lT2Zmc2V0KCkscz1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpLGE9TWF0aC5taW4ocyxvKTtyZXR1cm4gMD5uP2koKVtlKzMyPj4yPj4+MF09TnVtYmVyKG8hPXMmJmE9PXIpOjA8biE9KGE9PXIpJiYobz1NYXRoLm1heChzLG8pLHQuc2V0VGltZSh0LmdldFRpbWUoKSs2ZTQqKCgwPG4/YTpvKS1yKSkpLGkoKVtlKzI0Pj4yPj4+MF09dC5nZXREYXkoKSxuPShCZSh0LmdldEZ1bGxZZWFyKCkpP1ZlOnplKVt0LmdldE1vbnRoKCldK3QuZ2V0RGF0ZSgpLTF8MCxpKClbZSsyOD4+Mj4+PjBdPW4saSgpW2U+PjI+Pj4wXT10LmdldFNlY29uZHMoKSxpKClbZSs0Pj4yPj4+MF09dC5nZXRNaW51dGVzKCksaSgpW2UrOD4+Mj4+PjBdPXQuZ2V0SG91cnMoKSxpKClbZSsxMj4+Mj4+PjBdPXQuZ2V0RGF0ZSgpLGkoKVtlKzE2Pj4yPj4+MF09dC5nZXRNb250aCgpLGkoKVtlKzIwPj4yPj4+MF09dC5nZXRZZWFyKCksZT10LmdldFRpbWUoKS8xZTMsd3QoKEs9ZSwxPD0rTWF0aC5hYnMoSyk/MDxLPytNYXRoLmZsb29yKEsvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoSy0rKH5+Sz4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCkpLGU+Pj4wfSxyOkdlLHM6SGUsejpmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlKXtyZXR1cm4gKGU9ZS50b1RpbWVTdHJpbmcoKS5tYXRjaCgvXCgoW0EtWmEteiBdKylcKSQvKSk/ZVsxXToiR01UIn1lPj4+PTAsdD4+Pj0wLG4+Pj49MDt2YXIgbz0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCksYT1uZXcgRGF0ZShvLDAsMSksdT1uZXcgRGF0ZShvLDYsMSk7bz1hLmdldFRpbWV6b25lT2Zmc2V0KCk7dmFyIGw9dS5nZXRUaW1lem9uZU9mZnNldCgpLGM9TWF0aC5tYXgobyxsKTtzKClbZT4+Mj4+PjBdPTYwKmMsaSgpW3Q+PjI+Pj4wXT1OdW1iZXIobyE9bCksZT1yKGEpLHQ9cih1KSxlPVdlKGUpLHQ9V2UodCksbDxvPyhzKClbbj4+Mj4+PjBdPWUscygpW24rND4+Mj4+PjBdPXQpOihzKClbbj4+Mj4+PjBdPXQscygpW24rND4+Mj4+PjBdPWUpO30sYzooKT0+e25lKCIiKTt9LGw6ZnVuY3Rpb24oKXt9LGk6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX0sVjooKT0+e3Rocm93IHErPTEsInVud2luZCJ9LEI6ZnVuY3Rpb24oKXtyZXR1cm4gNDI5NDkwMTc2MH0sZTooKT0+cGVyZm9ybWFuY2UudGltZU9yaWdpbitwZXJmb3JtYW5jZS5ub3coKSxmOmZ1bmN0aW9uKCl7cmV0dXJuIHY/bigzOTkzKS5jcHVzKCkubGVuZ3RoOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5fSxLOmZ1bmN0aW9uKGUsdCxuLHIpe2ZvcihnZS5wYj10Pj4+MCxLZS5sZW5ndGg9bix0PXI+Pj4wPj4zLHI9MDtyPG47cisrKUtlW3JdPWEoKVt0K3I+Pj4wXTtyZXR1cm4gcHRbZV0uYXBwbHkobnVsbCxLZSl9LHk6ZnVuY3Rpb24oZSl7ZT4+Pj0wO3ZhciB0PW8oKS5sZW5ndGg7aWYoZTw9dHx8NDI5NDkwMTc2MDxlKXJldHVybiAhMTtmb3IodmFyIG49MTs0Pj1uO24qPTIpe3ZhciByPXQqKDErLjIvbik7cj1NYXRoLm1pbihyLGUrMTAwNjYzMjk2KTt2YXIgaT1NYXRoO3I9TWF0aC5tYXgoZSxyKTtlOntpPWkubWluLmNhbGwoaSw0Mjk0OTAxNzYwLHIrKDY1NTM2LXIlNjU1MzYpJTY1NTM2KS0kLmJ1ZmZlci5ieXRlTGVuZ3RoKzY1NTM1Pj4+MTY7dHJ5eyQuZ3JvdyhpKSxCKCk7dmFyIHM9MTticmVhayBlfWNhdGNoKGUpe31zPXZvaWQgMDt9aWYocylyZXR1cm4gITB9cmV0dXJuICExfSxPOlFlLFA6ZXQsajpoZSxnOnR0LG46bnQsdzpydCxtOml0LHg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT4+Pj0wLHQ+Pj49MCxzdChvKCkuc3ViYXJyYXkoZT4+PjAsZSt0Pj4+MCkpLDB9LGE6JHx8Yy53YXNtTWVtb3J5LEg6Y3QsZDpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gY3QoZT4+PjAsdD4+PjAsbj4+PjAscj4+PjApfX07IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3JldHVybiBlPWUuZXhwb3J0cyxrPWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZT0+KCk9PmUoKT4+PjAsbj1lPT50PT5lKHQpPj4+MDtyZXR1cm4gKGU9T2JqZWN0LmFzc2lnbih7fSxlKSkuX19lcnJub19sb2NhdGlvbj10KGUuX19lcnJub19sb2NhdGlvbiksZS5wdGhyZWFkX3NlbGY9dChlLnB0aHJlYWRfc2VsZiksZS5tYWxsb2M9bihlLm1hbGxvYyksZS5zdGFja1NhdmU9dChlLnN0YWNrU2F2ZSksZS5zdGFja0FsbG9jPW4oZS5zdGFja0FsbG9jKSxlfShlKSxnZS5UYS5wdXNoKGsuc2EpLHo9ay50YSxILnVuc2hpZnQoay5XKSxGPXQsdGUoKSxlfXZhciB0PXthOmR0fTtpZihlZSgpLGMuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gYy5pbnN0YW50aWF0ZVdhc20odCxlKX1jYXRjaChlKXtFKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK2UpLGwoZSk7fShmdW5jdGlvbihlLHQpe3ZhciBuPVk7cmV0dXJuIFB8fCJmdW5jdGlvbiIhPXR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZ3x8cmUobil8fG4uc3RhcnRzV2l0aCgiZmlsZTovLyIpfHx2fHwiZnVuY3Rpb24iIT10eXBlb2YgZmV0Y2g/aWUobixlLHQpOmZldGNoKG4se2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKChyPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyLGUpLnRoZW4odCwoZnVuY3Rpb24ocil7cmV0dXJuIEUoIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK3IpLEUoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksaWUobixlLHQpfSkpKSl9KSh0LChmdW5jdGlvbih0KXtlKHQuaW5zdGFuY2UsdC5tb2R1bGUpO30pKS5jYXRjaChsKTt9KCksYy5fT3J0SW5pdD0oZSx0KT0+KGMuX09ydEluaXQ9ay5YKShlLHQpLGMuX09ydEdldExhc3RFcnJvcj0oZSx0KT0+KGMuX09ydEdldExhc3RFcnJvcj1rLlkpKGUsdCksYy5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnM9KGUsdCxuLHIsbyxpLHMsYSx1LGwpPT4oYy5fT3J0Q3JlYXRlU2Vzc2lvbk9wdGlvbnM9ay5aKShlLHQsbixyLG8saSxzLGEsdSxsKSxjLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj0oZSx0KT0+KGMuX09ydEFwcGVuZEV4ZWN1dGlvblByb3ZpZGVyPWsuXykoZSx0KSxjLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9KGUsdCxuKT0+KGMuX09ydEFkZFNlc3Npb25Db25maWdFbnRyeT1rLiQpKGUsdCxuKSxjLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnM9ZT0+KGMuX09ydFJlbGVhc2VTZXNzaW9uT3B0aW9ucz1rLmFhKShlKSxjLl9PcnRDcmVhdGVTZXNzaW9uPShlLHQsbik9PihjLl9PcnRDcmVhdGVTZXNzaW9uPWsuYmEpKGUsdCxuKSxjLl9PcnRSZWxlYXNlU2Vzc2lvbj1lPT4oYy5fT3J0UmVsZWFzZVNlc3Npb249ay5jYSkoZSksYy5fT3J0R2V0SW5wdXRPdXRwdXRDb3VudD0oZSx0LG4pPT4oYy5fT3J0R2V0SW5wdXRPdXRwdXRDb3VudD1rLmRhKShlLHQsbiksYy5fT3J0R2V0SW5wdXROYW1lPShlLHQpPT4oYy5fT3J0R2V0SW5wdXROYW1lPWsuZWEpKGUsdCksYy5fT3J0R2V0T3V0cHV0TmFtZT0oZSx0KT0+KGMuX09ydEdldE91dHB1dE5hbWU9ay5mYSkoZSx0KSxjLl9PcnRGcmVlPWU9PihjLl9PcnRGcmVlPWsuZ2EpKGUpLGMuX09ydENyZWF0ZVRlbnNvcj0oZSx0LG4scixvKT0+KGMuX09ydENyZWF0ZVRlbnNvcj1rLmhhKShlLHQsbixyLG8pLGMuX09ydEdldFRlbnNvckRhdGE9KGUsdCxuLHIsbyk9PihjLl9PcnRHZXRUZW5zb3JEYXRhPWsuaWEpKGUsdCxuLHIsbyksYy5fT3J0UmVsZWFzZVRlbnNvcj1lPT4oYy5fT3J0UmVsZWFzZVRlbnNvcj1rLmphKShlKSxjLl9PcnRDcmVhdGVSdW5PcHRpb25zPShlLHQsbixyKT0+KGMuX09ydENyZWF0ZVJ1bk9wdGlvbnM9ay5rYSkoZSx0LG4sciksYy5fT3J0QWRkUnVuQ29uZmlnRW50cnk9KGUsdCxuKT0+KGMuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PWsubGEpKGUsdCxuKSxjLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1lPT4oYy5fT3J0UmVsZWFzZVJ1bk9wdGlvbnM9ay5tYSkoZSksYy5fT3J0UnVuPShlLHQsbixyLG8saSxzLGEpPT4oYy5fT3J0UnVuPWsubmEpKGUsdCxuLHIsbyxpLHMsYSksYy5fT3J0RW5kUHJvZmlsaW5nPWU9PihjLl9PcnRFbmRQcm9maWxpbmc9ay5vYSkoZSk7dmFyIGZ0PWMuX3B0aHJlYWRfc2VsZj0oKT0+KGZ0PWMuX3B0aHJlYWRfc2VsZj1rLnBhKSgpLGh0PWMuX21hbGxvYz1lPT4oaHQ9Yy5fbWFsbG9jPWsucWEpKGUpO2MuX2ZyZWU9ZT0+KGMuX2ZyZWU9ay5yYSkoZSksYy5fX2Vtc2NyaXB0ZW5fdGxzX2luaXQ9KCk9PihjLl9fZW1zY3JpcHRlbl90bHNfaW5pdD1rLnNhKSgpO3ZhciBndD1jLl9fZW1zY3JpcHRlbl90aHJlYWRfaW5pdD0oZSx0LG4scixvLGkpPT4oZ3Q9Yy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2luaXQ9ay51YSkoZSx0LG4scixvLGkpO2MuX19lbXNjcmlwdGVuX3RocmVhZF9jcmFzaGVkPSgpPT4oYy5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2NyYXNoZWQ9ay52YSkoKTt2YXIgYnQsbXQ9KGUsdCxuLHIpPT4obXQ9ay53YSkoZSx0LG4scikseXQ9ZT0+KHl0PWsueGEpKGUpLHZ0PWMuX19lbXNjcmlwdGVuX3RocmVhZF9leGl0PWU9Pih2dD1jLl9fZW1zY3JpcHRlbl90aHJlYWRfZXhpdD1rLnlhKShlKSxfdD1jLl9fZW1zY3JpcHRlbl9jaGVja19tYWlsYm94PSgpPT4oX3Q9Yy5fX2Vtc2NyaXB0ZW5fY2hlY2tfbWFpbGJveD1rLnphKSgpLHd0PWU9Pih3dD1rLkFhKShlKSxUdD0oZSx0KT0+KFR0PWsuQmEpKGUsdCkseHQ9KCk9Pih4dD1rLkNhKSgpLE90PWU9PihPdD1rLkRhKShlKSxTdD1lPT4oU3Q9ay5FYSkoZSk7ZnVuY3Rpb24gQXQoKXtmdW5jdGlvbiBlKCl7aWYoIWJ0JiYoYnQ9ITAsYy5jYWxsZWRSdW49ITAsIVUpJiYoX3x8YmUoSCksdShjKSxjLm9uUnVudGltZUluaXRpYWxpemVkJiZjLm9uUnVudGltZUluaXRpYWxpemVkKCksIV8pKXtpZihjLnBvc3RSdW4pZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBjLnBvc3RSdW4mJihjLnBvc3RSdW49W2MucG9zdFJ1bl0pO2MucG9zdFJ1bi5sZW5ndGg7KXt2YXIgZT1jLnBvc3RSdW4uc2hpZnQoKTtXLnVuc2hpZnQoZSk7fWJlKFcpO319aWYoISgwPEopKWlmKF8pdShjKSxffHxiZShIKSxzdGFydFdvcmtlcihjKTtlbHNlIHtpZihjLnByZVJ1bilmb3IoImZ1bmN0aW9uIj09dHlwZW9mIGMucHJlUnVuJiYoYy5wcmVSdW49W2MucHJlUnVuXSk7Yy5wcmVSdW4ubGVuZ3RoOylHLnVuc2hpZnQoYy5wcmVSdW4uc2hpZnQoKSk7YmUoRyksMDxKfHwoYy5zZXRTdGF0dXM/KGMuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Muc2V0U3RhdHVzKCIiKTt9KSwxKSxlKCk7fSksMSkpOmUoKSk7fX1pZihjLmtlZXBSdW50aW1lQWxpdmU9WCxjLndhc21NZW1vcnk9JCxjLnN0YWNrQWxsb2M9U3QsYy5zdGFja1NhdmU9eHQsYy5zdGFja1Jlc3RvcmU9T3QsYy5VVEY4VG9TdHJpbmc9ZGUsYy5zdHJpbmdUb1VURjg9QWUsYy5sZW5ndGhCeXRlc1VURjg9T2UsYy5FeGl0U3RhdHVzPXNlLGMuUFRocmVhZD1nZSxRPWZ1bmN0aW9uIGUoKXtidHx8QXQoKSxidHx8KFE9ZSk7fSxjLnByZUluaXQpZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBjLnByZUluaXQmJihjLnByZUluaXQ9W2MucHJlSW5pdF0pOzA8Yy5wcmVJbml0Lmxlbmd0aDspYy5wcmVJbml0LnBvcCgpKCk7cmV0dXJuIEF0KCksZS5yZWFkeX0pO2UuZXhwb3J0cz1vO30sOTMyOihlLHQsbik9Pnt2YXIgcixvPShyPSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwLCJ1bmRlZmluZWQiIT10eXBlb2YgX19maWxlbmFtZSYmKHI9cnx8X19maWxlbmFtZSksZnVuY3Rpb24oZT17fSl7dmFyIHQsbyxpPWU7aS5yZWFkeT1uZXcgUHJvbWlzZSgoKGUsbik9Pnt0PWUsbz1uO30pKTt2YXIgcyxhLHUsbD1PYmplY3QuYXNzaWduKHt9LGkpLGM9Ii4vdGhpcy5wcm9ncmFtIixwPShlLHQpPT57dGhyb3cgdH0sZD0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyxmPSJmdW5jdGlvbiI9PXR5cGVvZiBpbXBvcnRTY3JpcHRzLGg9Im9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiYib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMmJiJzdHJpbmciPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLGc9IiI7aWYoaCl7dmFyIGI9bigxMzg0KSxtPW4oOTA4KTtnPWY/bS5kaXJuYW1lKGcpKyIvIjpfX2Rpcm5hbWUrIi8iLHM9KGUsdCk9PihlPWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpP25ldyBVUkwoZSk6bS5ub3JtYWxpemUoZSksYi5yZWFkRmlsZVN5bmMoZSx0P3ZvaWQgMDoidXRmOCIpKSx1PWU9PigoZT1zKGUsITApKS5idWZmZXJ8fChlPW5ldyBVaW50OEFycmF5KGUpKSxlKSxhPShlLHQsbixyPSEwKT0+e2U9ZS5zdGFydHNXaXRoKCJmaWxlOi8vIik/bmV3IFVSTChlKTptLm5vcm1hbGl6ZShlKSxiLnJlYWRGaWxlKGUscj92b2lkIDA6InV0ZjgiLCgoZSxvKT0+e2U/bihlKTp0KHI/by5idWZmZXI6byk7fSkpO30sIWkudGhpc1Byb2dyYW0mJjE8cHJvY2Vzcy5hcmd2Lmxlbmd0aCYmKGM9cHJvY2Vzcy5hcmd2WzFdLnJlcGxhY2UoL1xcL2csIi8iKSkscHJvY2Vzcy5hcmd2LnNsaWNlKDIpLHA9KGUsdCk9Pnt0aHJvdyBwcm9jZXNzLmV4aXRDb2RlPWUsdH0saS5pbnNwZWN0PSgpPT4iW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0iO31lbHNlIChkfHxmKSYmKGY/Zz1zZWxmLmxvY2F0aW9uLmhyZWY6InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKGc9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHImJihnPXIpLGc9MCE9PWcuaW5kZXhPZigiYmxvYjoiKT9nLnN1YnN0cigwLGcucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKToiIixzPWU9Pnt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHQub3BlbigiR0VUIixlLCExKSx0LnNlbmQobnVsbCksdC5yZXNwb25zZVRleHR9LGYmJih1PWU9Pnt2YXIgdD1uZXcgWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHQub3BlbigiR0VUIixlLCExKSx0LnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLHQuc2VuZChudWxsKSxuZXcgVWludDhBcnJheSh0LnJlc3BvbnNlKX0pLGE9KGUsdCxuKT0+e3ZhciByPW5ldyBYTUxIdHRwUmVxdWVzdDtyLm9wZW4oIkdFVCIsZSwhMCksci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixyLm9ubG9hZD0oKT0+ezIwMD09ci5zdGF0dXN8fDA9PXIuc3RhdHVzJiZyLnJlc3BvbnNlP3Qoci5yZXNwb25zZSk6bigpO30sci5vbmVycm9yPW4sci5zZW5kKG51bGwpO30pO3ZhciB5LHY9aS5wcmludHx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSxfPWkucHJpbnRFcnJ8fGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKGksbCksbD1udWxsLGkudGhpc1Byb2dyYW0mJihjPWkudGhpc1Byb2dyYW0pLGkucXVpdCYmKHA9aS5xdWl0KSxpLndhc21CaW5hcnkmJih5PWkud2FzbUJpbmFyeSk7dmFyIHc9aS5ub0V4aXRSdW50aW1lfHwhMDsib2JqZWN0IiE9dHlwZW9mIFdlYkFzc2VtYmx5JiZNKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIFQseCxPLFMsQSxQLEk9ITE7ZnVuY3Rpb24gRSgpe3ZhciBlPVQuYnVmZmVyO2kuSEVBUDg9Tz1uZXcgSW50OEFycmF5KGUpLGkuSEVBUDE2PW5ldyBJbnQxNkFycmF5KGUpLGkuSEVBUDMyPUE9bmV3IEludDMyQXJyYXkoZSksaS5IRUFQVTg9Uz1uZXcgVWludDhBcnJheShlKSxpLkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGUpLGkuSEVBUFUzMj1QPW5ldyBVaW50MzJBcnJheShlKSxpLkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShlKSxpLkhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShlKTt9dmFyIEQ9W10sJD1bXSxrPVtdO2Z1bmN0aW9uIEYoKXt2YXIgZT1pLnByZVJ1bi5zaGlmdCgpO0QudW5zaGlmdChlKTt9dmFyIE4saixSPTAsQz1udWxsO2Z1bmN0aW9uIE0oZSl7dGhyb3cgaS5vbkFib3J0JiZpLm9uQWJvcnQoZSksXyhlPSJBYm9ydGVkKCIrZSsiKSIpLEk9ITAsZT1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKGUrIi4gQnVpbGQgd2l0aCAtc0FTU0VSVElPTlMgZm9yIG1vcmUgaW5mby4iKSxvKGUpLGV9ZnVuY3Rpb24gVShlKXtyZXR1cm4gZS5zdGFydHNXaXRoKCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIil9aWYoIVUoTj0ib3J0LXdhc20ud2FzbSIpKXt2YXIgQj1OO049aS5sb2NhdGVGaWxlP2kubG9jYXRlRmlsZShCLGcpOmcrQjt9ZnVuY3Rpb24gVihlKXtpZihlPT1OJiZ5KXJldHVybiBuZXcgVWludDhBcnJheSh5KTtpZih1KXJldHVybiB1KGUpO3Rocm93ICJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9ZnVuY3Rpb24geihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKCF5JiYoZHx8Zikpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBmZXRjaCYmIWUuc3RhcnRzV2l0aCgiZmlsZTovLyIpKXJldHVybiBmZXRjaChlLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbigodD0+e2lmKCF0Lm9rKXRocm93ICJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciK2UrIiciO3JldHVybiB0LmFycmF5QnVmZmVyKCl9KSkuY2F0Y2goKCgpPT5WKGUpKSk7aWYoYSlyZXR1cm4gbmV3IFByb21pc2UoKCh0LG4pPT57YShlLChlPT50KG5ldyBVaW50OEFycmF5KGUpKSksbik7fSkpfXJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+VihlKSkpfShlKS50aGVuKChlPT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShlLHQpKSkudGhlbigoZT0+ZSkpLnRoZW4obiwoZT0+e18oImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrZSksTShlKTt9KSl9ZnVuY3Rpb24gRyhlKXt0aGlzLm5hbWU9IkV4aXRTdGF0dXMiLHRoaXMubWVzc2FnZT1gUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgke2V9KWAsdGhpcy5zdGF0dXM9ZTt9dmFyIEg9ZT0+e2Zvcig7MDxlLmxlbmd0aDspZS5zaGlmdCgpKGkpO307ZnVuY3Rpb24gVyhlKXt0aGlzLnFhPWUtMjQsdGhpcy52YT1mdW5jdGlvbihlKXtQW3RoaXMucWErND4+Mj4+PjBdPWU7fSx0aGlzLnVhPWZ1bmN0aW9uKGUpe1BbdGhpcy5xYSs4Pj4yPj4+MF09ZTt9LHRoaXMuc2E9ZnVuY3Rpb24oZSx0KXt0aGlzLnRhKCksdGhpcy52YShlKSx0aGlzLnVhKHQpO30sdGhpcy50YT1mdW5jdGlvbigpe1BbdGhpcy5xYSsxNj4+Mj4+PjBdPTA7fTt9dmFyIHEsWD0idW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxZPShlLHQsbik9Pnt2YXIgcj0odD4+Pj0wKStuO2ZvcihuPXQ7ZVtuXSYmIShuPj1yKTspKytuO2lmKDE2PG4tdCYmZS5idWZmZXImJlgpcmV0dXJuIFguZGVjb2RlKGUuc3ViYXJyYXkodCxuKSk7Zm9yKHI9IiI7dDxuOyl7dmFyIG89ZVt0KytdO2lmKDEyOCZvKXt2YXIgaT02MyZlW3QrK107aWYoMTkyPT0oMjI0Jm8pKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKDMxJm8pPDw2fGkpO2Vsc2Uge3ZhciBzPTYzJmVbdCsrXTs2NTUzNj4obz0yMjQ9PSgyNDAmbyk/KDE1Jm8pPDwxMnxpPDw2fHM6KDcmbyk8PDE4fGk8PDEyfHM8PDZ8NjMmZVt0KytdKT9yKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pOihvLT02NTUzNixyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fG8+PjEwLDU2MzIwfDEwMjMmbykpO319ZWxzZSByKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pO31yZXR1cm4gcn0sSz0oZSx0KT0+KGU+Pj49MCk/WShTLGUsdCk6IiIsSj1lPT57Zm9yKHZhciB0PTAsbj0wO248ZS5sZW5ndGg7KytuKXt2YXIgcj1lLmNoYXJDb2RlQXQobik7MTI3Pj1yP3QrKzoyMDQ3Pj1yP3QrPTI6NTUyOTY8PXImJjU3MzQzPj1yPyh0Kz00LCsrbik6dCs9Mzt9cmV0dXJuIHR9LFo9KGUsdCxuLHIpPT57aWYoISgwPHIpKXJldHVybiAwO3ZhciBvPW4+Pj49MDtyPW4rci0xO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7KytpKXt2YXIgcz1lLmNoYXJDb2RlQXQoaSk7aWYoNTUyOTY8PXMmJjU3MzQzPj1zJiYocz02NTUzNisoKDEwMjMmcyk8PDEwKXwxMDIzJmUuY2hhckNvZGVBdCgrK2kpKSwxMjc+PXMpe2lmKG4+PXIpYnJlYWs7dFtuKys+Pj4wXT1zO31lbHNlIHtpZigyMDQ3Pj1zKXtpZihuKzE+PXIpYnJlYWs7dFtuKys+Pj4wXT0xOTJ8cz4+Njt9ZWxzZSB7aWYoNjU1MzU+PXMpe2lmKG4rMj49cilicmVhazt0W24rKz4+PjBdPTIyNHxzPj4xMjt9ZWxzZSB7aWYobiszPj1yKWJyZWFrO3RbbisrPj4+MF09MjQwfHM+PjE4LHRbbisrPj4+MF09MTI4fHM+PjEyJjYzO310W24rKz4+PjBdPTEyOHxzPj42JjYzO310W24rKz4+PjBdPTEyOHw2MyZzO319cmV0dXJuIHRbbj4+PjBdPTAsbi1vfSxRPWU9PjA9PWUlNCYmKDAhPWUlMTAwfHwwPT1lJTQwMCksZWU9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV0sdGU9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF0sbmU9ZT0+e3ZhciB0PUooZSkrMSxuPXBlKHQpO3JldHVybiBuJiZaKGUsUyxuLHQpLG59LHJlPXt9LG9lPSgpPT57aWYoIXEpe3ZhciBlLHQ9e1VTRVI6IndlYl91c2VyIixMT0dOQU1FOiJ3ZWJfdXNlciIsUEFUSDoiLyIsUFdEOiIvIixIT01FOiIvaG9tZS93ZWJfdXNlciIsTEFORzooIm9iamVjdCI9PXR5cGVvZiBuYXZpZ2F0b3ImJm5hdmlnYXRvci5sYW5ndWFnZXMmJm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fCJDIikucmVwbGFjZSgiLSIsIl8iKSsiLlVURi04IixfOmN8fCIuL3RoaXMucHJvZ3JhbSJ9O2ZvcihlIGluIHJlKXZvaWQgMD09PXJlW2VdP2RlbGV0ZSB0W2VdOnRbZV09cmVbZV07dmFyIG49W107Zm9yKGUgaW4gdCluLnB1c2goYCR7ZX09JHt0W2VdfWApO3E9bjt9cmV0dXJuIHF9LGllPVtudWxsLFtdLFtdXSxzZT1lPT4oc2U9KCgpPT57aWYoIm9iamVjdCI9PXR5cGVvZiBjcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKXJldHVybiBlPT5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpO2lmKGgpdHJ5e3ZhciBlPW4oNzYwKTtpZihlLnJhbmRvbUZpbGxTeW5jKXJldHVybiB0PT5lLnJhbmRvbUZpbGxTeW5jKHQpO3ZhciB0PWUucmFuZG9tQnl0ZXM7cmV0dXJuIGU9PihlLnNldCh0KGUuYnl0ZUxlbmd0aCkpLGUpfWNhdGNoKGUpe31NKCJpbml0UmFuZG9tRGV2aWNlIik7fSkoKSkoZSksYWU9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSx1ZT1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdO2Z1bmN0aW9uIGxlKGUsdCxuLHIpe2Z1bmN0aW9uIG8oZSx0LG4pe2ZvcihlPSJudW1iZXIiPT10eXBlb2YgZT9lLnRvU3RyaW5nKCk6ZXx8IiI7ZS5sZW5ndGg8dDspZT1uWzBdK2U7cmV0dXJuIGV9ZnVuY3Rpb24gaShlLHQpe3JldHVybiBvKGUsdCwiMCIpfWZ1bmN0aW9uIHMoZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiAwPmU/LTE6MDxlPzE6MH12YXIgcjtyZXR1cm4gMD09PShyPW4oZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSkpJiYwPT09KHI9bihlLmdldE1vbnRoKCktdC5nZXRNb250aCgpKSkmJihyPW4oZS5nZXREYXRlKCktdC5nZXREYXRlKCkpKSxyfWZ1bmN0aW9uIGEoZSl7c3dpdGNoKGUuZ2V0RGF5KCkpe2Nhc2UgMDpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLTEsMTEsMjkpO2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDMpO2Nhc2UgMzpyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDAsMik7Y2FzZSA0OnJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKTtjYXNlIDU6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMxKTtjYXNlIDY6cmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKS0xLDExLDMwKX19ZnVuY3Rpb24gdShlKXt2YXIgdD1lLm1hO2ZvcihlPW5ldyBEYXRlKG5ldyBEYXRlKGUubmErMTkwMCwwLDEpLmdldFRpbWUoKSk7MDx0Oyl7dmFyIG49ZS5nZXRNb250aCgpLHI9KFEoZS5nZXRGdWxsWWVhcigpKT9hZTp1ZSlbbl07aWYoISh0PnItZS5nZXREYXRlKCkpKXtlLnNldERhdGUoZS5nZXREYXRlKCkrdCk7YnJlYWt9dC09ci1lLmdldERhdGUoKSsxLGUuc2V0RGF0ZSgxKSwxMT5uP2Uuc2V0TW9udGgobisxKTooZS5zZXRNb250aCgwKSxlLnNldEZ1bGxZZWFyKGUuZ2V0RnVsbFllYXIoKSsxKSk7fXJldHVybiBuPW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSsxLDAsNCksdD1hKG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwwLDQpKSxuPWEobiksMD49cyh0LGUpPzA+PXMobixlKT9lLmdldEZ1bGxZZWFyKCkrMTplLmdldEZ1bGxZZWFyKCk6ZS5nZXRGdWxsWWVhcigpLTF9ZT4+Pj0wLHQ+Pj49MCxuPj4+PTA7dmFyIGw9QVs0MCsocj4+Pj0wKT4+Mj4+PjBdO2Zvcih2YXIgYyBpbiByPXt5YTpBW3I+PjI+Pj4wXSx4YTpBW3IrND4+Mj4+PjBdLG9hOkFbcis4Pj4yPj4+MF0scmE6QVtyKzEyPj4yPj4+MF0scGE6QVtyKzE2Pj4yPj4+MF0sbmE6QVtyKzIwPj4yPj4+MF0saGE6QVtyKzI0Pj4yPj4+MF0sbWE6QVtyKzI4Pj4yPj4+MF0sQWE6QVtyKzMyPj4yPj4+MF0sd2E6QVtyKzM2Pj4yPj4+MF0semE6bD9LKGwpOiIifSxuPUsobiksbD17IiVjIjoiJWEgJWIgJWQgJUg6JU06JVMgJVkiLCIlRCI6IiVtLyVkLyV5IiwiJUYiOiIlWS0lbS0lZCIsIiVoIjoiJWIiLCIlciI6IiVJOiVNOiVTICVwIiwiJVIiOiIlSDolTSIsIiVUIjoiJUg6JU06JVMiLCIleCI6IiVtLyVkLyV5IiwiJVgiOiIlSDolTTolUyIsIiVFYyI6IiVjIiwiJUVDIjoiJUMiLCIlRXgiOiIlbS8lZC8leSIsIiVFWCI6IiVIOiVNOiVTIiwiJUV5IjoiJXkiLCIlRVkiOiIlWSIsIiVPZCI6IiVkIiwiJU9lIjoiJWUiLCIlT0giOiIlSCIsIiVPSSI6IiVJIiwiJU9tIjoiJW0iLCIlT00iOiIlTSIsIiVPUyI6IiVTIiwiJU91IjoiJXUiLCIlT1UiOiIlVSIsIiVPViI6IiVWIiwiJU93IjoiJXciLCIlT1ciOiIlVyIsIiVPeSI6IiV5In0pbj1uLnJlcGxhY2UobmV3IFJlZ0V4cChjLCJnIiksbFtjXSk7dmFyIHA9IlN1bmRheSBNb25kYXkgVHVlc2RheSBXZWRuZXNkYXkgVGh1cnNkYXkgRnJpZGF5IFNhdHVyZGF5Ii5zcGxpdCgiICIpLGQ9IkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXIiLnNwbGl0KCIgIik7Zm9yKGMgaW4gbD17IiVhIjplPT5wW2UuaGFdLnN1YnN0cmluZygwLDMpLCIlQSI6ZT0+cFtlLmhhXSwiJWIiOmU9PmRbZS5wYV0uc3Vic3RyaW5nKDAsMyksIiVCIjplPT5kW2UucGFdLCIlQyI6ZT0+aSgoZS5uYSsxOTAwKS8xMDB8MCwyKSwiJWQiOmU9PmkoZS5yYSwyKSwiJWUiOmU9Pm8oZS5yYSwyLCIgIiksIiVnIjplPT51KGUpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpLCIlRyI6ZT0+dShlKSwiJUgiOmU9PmkoZS5vYSwyKSwiJUkiOmU9PigwPT0oZT1lLm9hKT9lPTEyOjEyPGUmJihlLT0xMiksaShlLDIpKSwiJWoiOmU9Pntmb3IodmFyIHQ9MCxuPTA7bjw9ZS5wYS0xO3QrPShRKGUubmErMTkwMCk/YWU6dWUpW24rK10pO3JldHVybiBpKGUucmErdCwzKX0sIiVtIjplPT5pKGUucGErMSwyKSwiJU0iOmU9PmkoZS54YSwyKSwiJW4iOigpPT4iXG4iLCIlcCI6ZT0+MDw9ZS5vYSYmMTI+ZS5vYT8iQU0iOiJQTSIsIiVTIjplPT5pKGUueWEsMiksIiV0IjooKT0+Ilx0IiwiJXUiOmU9PmUuaGF8fDcsIiVVIjplPT5pKE1hdGguZmxvb3IoKGUubWErNy1lLmhhKS83KSwyKSwiJVYiOmU9Pnt2YXIgdD1NYXRoLmZsb29yKChlLm1hKzctKGUuaGErNiklNykvNyk7aWYoMj49KGUuaGErMzcxLWUubWEtMiklNyYmdCsrLHQpNTM9PXQmJig0PT0obj0oZS5oYSszNzEtZS5tYSklNyl8fDM9PW4mJlEoZS5uYSl8fCh0PTEpKTtlbHNlIHt0PTUyO3ZhciBuPShlLmhhKzctZS5tYS0xKSU3Oyg0PT1ufHw1PT1uJiZRKGUubmElNDAwLTEpKSYmdCsrO31yZXR1cm4gaSh0LDIpfSwiJXciOmU9PmUuaGEsIiVXIjplPT5pKE1hdGguZmxvb3IoKGUubWErNy0oZS5oYSs2KSU3KS83KSwyKSwiJXkiOmU9PihlLm5hKzE5MDApLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpLCIlWSI6ZT0+ZS5uYSsxOTAwLCIleiI6ZT0+e3ZhciB0PTA8PShlPWUud2EpO3JldHVybiBlPU1hdGguYWJzKGUpLzYwLCh0PyIrIjoiLSIpK1N0cmluZygiMDAwMCIrKGUvNjAqMTAwK2UlNjApKS5zbGljZSgtNCl9LCIlWiI6ZT0+ZS56YSwiJSUiOigpPT4iJSJ9LG49bi5yZXBsYWNlKC8lJS9nLCJcMFwwIiksbCluLmluY2x1ZGVzKGMpJiYobj1uLnJlcGxhY2UobmV3IFJlZ0V4cChjLCJnIiksbFtjXShyKSkpO3JldHVybiBjPWZ1bmN0aW9uKGUpe3ZhciB0PUFycmF5KEooZSkrMSk7cmV0dXJuIFooZSx0LDAsdC5sZW5ndGgpLHR9KG49bi5yZXBsYWNlKC9cMFwwL2csIiUiKSksYy5sZW5ndGg+dD8wOihPLnNldChjLGU+Pj4wKSxjLmxlbmd0aC0xKX12YXIgY2U9e2E6ZnVuY3Rpb24oZSx0LG4pe3Rocm93IG5ldyBXKGU+Pj49MCkuc2EodD4+PjAsbj4+PjApLGV9LGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sSTpmdW5jdGlvbigpe30seTpmdW5jdGlvbigpe30sQTpmdW5jdGlvbigpe30sSzpmdW5jdGlvbigpe3JldHVybiAwfSxHOmZ1bmN0aW9uKCl7fSxCOmZ1bmN0aW9uKCl7fSxGOmZ1bmN0aW9uKCl7fSxnOmZ1bmN0aW9uKCl7fSx6OmZ1bmN0aW9uKCl7fSx3OmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7fSx4OmZ1bmN0aW9uKCl7fSxrOigpPT4hMCxuOmZ1bmN0aW9uKGUsdCxuKXtlPXQrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKSs0Mjk0OTY3Mjk2KnQ6TmFOLG4+Pj49MCxlPW5ldyBEYXRlKDFlMyplKSxBW24+PjI+Pj4wXT1lLmdldFVUQ1NlY29uZHMoKSxBW24rND4+Mj4+PjBdPWUuZ2V0VVRDTWludXRlcygpLEFbbis4Pj4yPj4+MF09ZS5nZXRVVENIb3VycygpLEFbbisxMj4+Mj4+PjBdPWUuZ2V0VVRDRGF0ZSgpLEFbbisxNj4+Mj4+PjBdPWUuZ2V0VVRDTW9udGgoKSxBW24rMjA+PjI+Pj4wXT1lLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCxBW24rMjQ+PjI+Pj4wXT1lLmdldFVUQ0RheSgpLEFbbisyOD4+Mj4+PjBdPShlLmdldFRpbWUoKS1EYXRlLlVUQyhlLmdldFVUQ0Z1bGxZZWFyKCksMCwxLDAsMCwwLDApKS84NjRlNXwwO30sbzpmdW5jdGlvbihlLHQsbil7ZT10KzIwOTcxNTI+Pj4wPDQxOTQzMDUtISFlPyhlPj4+MCkrNDI5NDk2NzI5Nip0Ok5hTixuPj4+PTAsZT1uZXcgRGF0ZSgxZTMqZSksQVtuPj4yPj4+MF09ZS5nZXRTZWNvbmRzKCksQVtuKzQ+PjI+Pj4wXT1lLmdldE1pbnV0ZXMoKSxBW24rOD4+Mj4+PjBdPWUuZ2V0SG91cnMoKSxBW24rMTI+PjI+Pj4wXT1lLmdldERhdGUoKSxBW24rMTY+PjI+Pj4wXT1lLmdldE1vbnRoKCksQVtuKzIwPj4yPj4+MF09ZS5nZXRGdWxsWWVhcigpLTE5MDAsQVtuKzI0Pj4yPj4+MF09ZS5nZXREYXkoKSxBW24rMjg+PjI+Pj4wXT0oUShlLmdldEZ1bGxZZWFyKCkpP2VlOnRlKVtlLmdldE1vbnRoKCldK2UuZ2V0RGF0ZSgpLTF8MCxBW24rMzY+PjI+Pj4wXT0tNjAqZS5nZXRUaW1lem9uZU9mZnNldCgpLHQ9bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKTt2YXIgcj1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksMCwxKS5nZXRUaW1lem9uZU9mZnNldCgpO0FbbiszMj4+Mj4+PjBdPTB8KHQhPXImJmUuZ2V0VGltZXpvbmVPZmZzZXQoKT09TWF0aC5taW4ocix0KSk7fSxwOmZ1bmN0aW9uKGUpe2U+Pj49MDt2YXIgdD1uZXcgRGF0ZShBW2UrMjA+PjI+Pj4wXSsxOTAwLEFbZSsxNj4+Mj4+PjBdLEFbZSsxMj4+Mj4+PjBdLEFbZSs4Pj4yPj4+MF0sQVtlKzQ+PjI+Pj4wXSxBW2U+PjI+Pj4wXSwwKSxuPUFbZSszMj4+Mj4+PjBdLHI9dC5nZXRUaW1lem9uZU9mZnNldCgpLG89bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLDYsMSkuZ2V0VGltZXpvbmVPZmZzZXQoKSxpPW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSwwLDEpLmdldFRpbWV6b25lT2Zmc2V0KCkscz1NYXRoLm1pbihpLG8pO3JldHVybiAwPm4/QVtlKzMyPj4yPj4+MF09TnVtYmVyKG8hPWkmJnM9PXIpOjA8biE9KHM9PXIpJiYobz1NYXRoLm1heChpLG8pLHQuc2V0VGltZSh0LmdldFRpbWUoKSs2ZTQqKCgwPG4/czpvKS1yKSkpLEFbZSsyND4+Mj4+PjBdPXQuZ2V0RGF5KCksQVtlKzI4Pj4yPj4+MF09KFEodC5nZXRGdWxsWWVhcigpKT9lZTp0ZSlbdC5nZXRNb250aCgpXSt0LmdldERhdGUoKS0xfDAsQVtlPj4yPj4+MF09dC5nZXRTZWNvbmRzKCksQVtlKzQ+PjI+Pj4wXT10LmdldE1pbnV0ZXMoKSxBW2UrOD4+Mj4+PjBdPXQuZ2V0SG91cnMoKSxBW2UrMTI+PjI+Pj4wXT10LmdldERhdGUoKSxBW2UrMTY+PjI+Pj4wXT10LmdldE1vbnRoKCksQVtlKzIwPj4yPj4+MF09dC5nZXRZZWFyKCksZT10LmdldFRpbWUoKS8xZTMsZmUoKGo9ZSwxPD0rTWF0aC5hYnMoaik/MDxqPytNYXRoLmZsb29yKGovNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoai0rKH5+aj4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCkpLGU+Pj4wfSxsOmZ1bmN0aW9uKCl7cmV0dXJuIC01Mn0sbTpmdW5jdGlvbigpe30sdTpmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlKXtyZXR1cm4gKGU9ZS50b1RpbWVTdHJpbmcoKS5tYXRjaCgvXCgoW0EtWmEteiBdKylcKSQvKSk/ZVsxXToiR01UIn1uPj4+PTA7dmFyIG89KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLGk9bmV3IERhdGUobywwLDEpLHM9bmV3IERhdGUobyw2LDEpO289aS5nZXRUaW1lem9uZU9mZnNldCgpO3ZhciBhPXMuZ2V0VGltZXpvbmVPZmZzZXQoKTtQW2U+Pj4wPj4yPj4+MF09NjAqTWF0aC5tYXgobyxhKSxBW3Q+Pj4wPj4yPj4+MF09TnVtYmVyKG8hPWEpLGU9cihpKSx0PXIocyksZT1uZShlKSx0PW5lKHQpLGE8bz8oUFtuPj4yPj4+MF09ZSxQW24rND4+Mj4+PjBdPXQpOihQW24+PjI+Pj4wXT10LFBbbis0Pj4yPj4+MF09ZSk7fSxkOigpPT57TSgiIik7fSxoOmZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93KCl9LHY6ZnVuY3Rpb24oKXtyZXR1cm4gNDI5NDkwMTc2MH0sYjooKT0+cGVyZm9ybWFuY2Uubm93KCksSjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ+Pj49MCxTLmNvcHlXaXRoaW4oZT4+PjA+Pj4wLHQ+Pj4wLHQrKG4+Pj4wKT4+PjApfSx0OmZ1bmN0aW9uKGUpe2U+Pj49MDt2YXIgdD1TLmxlbmd0aDtpZig0Mjk0OTAxNzYwPGUpcmV0dXJuICExO2Zvcih2YXIgbj0xOzQ+PW47bio9Mil7dmFyIHI9dCooMSsuMi9uKTtyPU1hdGgubWluKHIsZSsxMDA2NjMyOTYpO3ZhciBvPU1hdGg7cj1NYXRoLm1heChlLHIpO2U6e289by5taW4uY2FsbChvLDQyOTQ5MDE3NjAscisoNjU1MzYtciU2NTUzNiklNjU1MzYpLVQuYnVmZmVyLmJ5dGVMZW5ndGgrNjU1MzU+Pj4xNjt0cnl7VC5ncm93KG8pLEUoKTt2YXIgaT0xO2JyZWFrIGV9Y2F0Y2goZSl7fWk9dm9pZCAwO31pZihpKXJldHVybiAhMH1yZXR1cm4gITF9LEQ6ZnVuY3Rpb24oZSx0KXtlPj4+PTAsdD4+Pj0wO3ZhciBuPTA7cmV0dXJuIG9lKCkuZm9yRWFjaCgoZnVuY3Rpb24ocixvKXt2YXIgaT10K247Zm9yKG89UFtlKzQqbz4+Mj4+PjBdPWksaT0wO2k8ci5sZW5ndGg7KytpKU9bbysrPj4wPj4+MF09ci5jaGFyQ29kZUF0KGkpO09bbz4+MD4+PjBdPTAsbis9ci5sZW5ndGgrMTt9KSksMH0sRTpmdW5jdGlvbihlLHQpe2U+Pj49MCx0Pj4+PTA7dmFyIG49b2UoKTtQW2U+PjI+Pj4wXT1uLmxlbmd0aDt2YXIgcj0wO3JldHVybiBuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3IrPWUubGVuZ3RoKzE7fSkpLFBbdD4+Mj4+PjBdPXIsMH0sczplPT57d3x8KGkub25FeGl0JiZpLm9uRXhpdChlKSxJPSEwKSxwKGUsbmV3IEcoZSkpO30sZjooKT0+NTIsajpmdW5jdGlvbigpe3JldHVybiA1Mn0scTpmdW5jdGlvbigpe3JldHVybiA3MH0saTpmdW5jdGlvbihlLHQsbixyKXt0Pj4+PTAsbj4+Pj0wLHI+Pj49MDtmb3IodmFyIG89MCxpPTA7aTxuO2krKyl7dmFyIHM9UFt0Pj4yPj4+MF0sYT1QW3QrND4+Mj4+PjBdO3QrPTg7Zm9yKHZhciB1PTA7dTxhO3UrKyl7dmFyIGw9U1tzK3U+Pj4wXSxjPWllW2VdOzA9PT1sfHwxMD09PWw/KCgxPT09ZT92Ol8pKFkoYywwKSksYy5sZW5ndGg9MCk6Yy5wdXNoKGwpO31vKz1hO31yZXR1cm4gUFtyPj4yPj4+MF09bywwfSxyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+Pj49MCxzZShTLnN1YmFycmF5KGU+Pj4wLGUrKHQ+Pj4wKT4+PjApKSwwfSxDOmxlLGM6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGxlKGU+Pj4wLHQ+Pj4wLG4+Pj4wLHI+Pj4wKX19OyFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7aWYoZT1lLmV4cG9ydHMseD1lPWZ1bmN0aW9uKGUpe3ZhciB0PWU9PigpPT5lKCk+Pj4wLG49ZT0+dD0+ZSh0KT4+PjA7cmV0dXJuIChlPU9iamVjdC5hc3NpZ24oe30sZSkpLl9fZXJybm9fbG9jYXRpb249dChlLl9fZXJybm9fbG9jYXRpb24pLGUubWFsbG9jPW4oZS5tYWxsb2MpLGUuc3RhY2tTYXZlPXQoZS5zdGFja1NhdmUpLGUuc3RhY2tBbGxvYz1uKGUuc3RhY2tBbGxvYyksZX0oZSksVD14LkwsRSgpLCQudW5zaGlmdCh4Lk0pLFItLSxpLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJmkubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhSKSwwPT1SJiYoQykpe3ZhciB0PUM7Qz1udWxsLHQoKTt9cmV0dXJuIGV9dmFyIHQ9e2E6Y2V9O2lmKFIrKyxpLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJmkubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhSKSxpLmluc3RhbnRpYXRlV2FzbSl0cnl7cmV0dXJuIGkuaW5zdGFudGlhdGVXYXNtKHQsZSl9Y2F0Y2goZSl7XygiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIitlKSxvKGUpO30oZnVuY3Rpb24oZSx0KXt2YXIgbj1OO3JldHVybiB5fHwiZnVuY3Rpb24iIT10eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmd8fFUobil8fG4uc3RhcnRzV2l0aCgiZmlsZTovLyIpfHxofHwiZnVuY3Rpb24iIT10eXBlb2YgZmV0Y2g/eihuLGUsdCk6ZmV0Y2gobix7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4oKHI9PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHIsZSkudGhlbih0LChmdW5jdGlvbihyKXtyZXR1cm4gXygid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIrciksXygiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSx6KG4sZSx0KX0pKSkpfSkodCwoZnVuY3Rpb24odCl7ZSh0Lmluc3RhbmNlKTt9KSkuY2F0Y2gobyk7fSgpLGkuX09ydEluaXQ9KGUsdCk9PihpLl9PcnRJbml0PXguTikoZSx0KSxpLl9PcnRHZXRMYXN0RXJyb3I9KGUsdCk9PihpLl9PcnRHZXRMYXN0RXJyb3I9eC5PKShlLHQpLGkuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zPShlLHQsbixyLG8scyxhLHUsbCxjKT0+KGkuX09ydENyZWF0ZVNlc3Npb25PcHRpb25zPXguUCkoZSx0LG4scixvLHMsYSx1LGwsYyksaS5fT3J0QXBwZW5kRXhlY3V0aW9uUHJvdmlkZXI9KGUsdCk9PihpLl9PcnRBcHBlbmRFeGVjdXRpb25Qcm92aWRlcj14LlEpKGUsdCksaS5fT3J0QWRkU2Vzc2lvbkNvbmZpZ0VudHJ5PShlLHQsbik9PihpLl9PcnRBZGRTZXNzaW9uQ29uZmlnRW50cnk9eC5SKShlLHQsbiksaS5fT3J0UmVsZWFzZVNlc3Npb25PcHRpb25zPWU9PihpLl9PcnRSZWxlYXNlU2Vzc2lvbk9wdGlvbnM9eC5TKShlKSxpLl9PcnRDcmVhdGVTZXNzaW9uPShlLHQsbik9PihpLl9PcnRDcmVhdGVTZXNzaW9uPXguVCkoZSx0LG4pLGkuX09ydFJlbGVhc2VTZXNzaW9uPWU9PihpLl9PcnRSZWxlYXNlU2Vzc2lvbj14LlUpKGUpLGkuX09ydEdldElucHV0T3V0cHV0Q291bnQ9KGUsdCxuKT0+KGkuX09ydEdldElucHV0T3V0cHV0Q291bnQ9eC5WKShlLHQsbiksaS5fT3J0R2V0SW5wdXROYW1lPShlLHQpPT4oaS5fT3J0R2V0SW5wdXROYW1lPXguVykoZSx0KSxpLl9PcnRHZXRPdXRwdXROYW1lPShlLHQpPT4oaS5fT3J0R2V0T3V0cHV0TmFtZT14LlgpKGUsdCksaS5fT3J0RnJlZT1lPT4oaS5fT3J0RnJlZT14LlkpKGUpLGkuX09ydENyZWF0ZVRlbnNvcj0oZSx0LG4scixvKT0+KGkuX09ydENyZWF0ZVRlbnNvcj14LlopKGUsdCxuLHIsbyksaS5fT3J0R2V0VGVuc29yRGF0YT0oZSx0LG4scixvKT0+KGkuX09ydEdldFRlbnNvckRhdGE9eC5fKShlLHQsbixyLG8pLGkuX09ydFJlbGVhc2VUZW5zb3I9ZT0+KGkuX09ydFJlbGVhc2VUZW5zb3I9eC4kKShlKSxpLl9PcnRDcmVhdGVSdW5PcHRpb25zPShlLHQsbixyKT0+KGkuX09ydENyZWF0ZVJ1bk9wdGlvbnM9eC5hYSkoZSx0LG4sciksaS5fT3J0QWRkUnVuQ29uZmlnRW50cnk9KGUsdCxuKT0+KGkuX09ydEFkZFJ1bkNvbmZpZ0VudHJ5PXguYmEpKGUsdCxuKSxpLl9PcnRSZWxlYXNlUnVuT3B0aW9ucz1lPT4oaS5fT3J0UmVsZWFzZVJ1bk9wdGlvbnM9eC5jYSkoZSksaS5fT3J0UnVuPShlLHQsbixyLG8scyxhLHUpPT4oaS5fT3J0UnVuPXguZGEpKGUsdCxuLHIsbyxzLGEsdSksaS5fT3J0RW5kUHJvZmlsaW5nPWU9PihpLl9PcnRFbmRQcm9maWxpbmc9eC5lYSkoZSk7dmFyIHBlPWkuX21hbGxvYz1lPT4ocGU9aS5fbWFsbG9jPXguZmEpKGUpO2kuX2ZyZWU9ZT0+KGkuX2ZyZWU9eC5nYSkoZSk7dmFyIGRlLGZlPWU9PihmZT14LmlhKShlKSxoZT0oKT0+KGhlPXguamEpKCksZ2U9ZT0+KGdlPXgua2EpKGUpLGJlPWU9PihiZT14LmxhKShlKTtmdW5jdGlvbiBtZSgpe2Z1bmN0aW9uIGUoKXtpZighZGUmJihkZT0hMCxpLmNhbGxlZFJ1bj0hMCwhSSkpe2lmKEgoJCksdChpKSxpLm9uUnVudGltZUluaXRpYWxpemVkJiZpLm9uUnVudGltZUluaXRpYWxpemVkKCksaS5wb3N0UnVuKWZvcigiZnVuY3Rpb24iPT10eXBlb2YgaS5wb3N0UnVuJiYoaS5wb3N0UnVuPVtpLnBvc3RSdW5dKTtpLnBvc3RSdW4ubGVuZ3RoOyl7dmFyIGU9aS5wb3N0UnVuLnNoaWZ0KCk7ay51bnNoaWZ0KGUpO31IKGspO319aWYoISgwPFIpKXtpZihpLnByZVJ1bilmb3IoImZ1bmN0aW9uIj09dHlwZW9mIGkucHJlUnVuJiYoaS5wcmVSdW49W2kucHJlUnVuXSk7aS5wcmVSdW4ubGVuZ3RoOylGKCk7SChEKSwwPFJ8fChpLnNldFN0YXR1cz8oaS5zZXRTdGF0dXMoIlJ1bm5pbmcuLi4iKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aS5zZXRTdGF0dXMoIiIpO30pLDEpLGUoKTt9KSwxKSk6ZSgpKTt9fWlmKGkuc3RhY2tBbGxvYz1iZSxpLnN0YWNrU2F2ZT1oZSxpLnN0YWNrUmVzdG9yZT1nZSxpLlVURjhUb1N0cmluZz1LLGkuc3RyaW5nVG9VVEY4PShlLHQsbik9PlooZSxTLHQsbiksaS5sZW5ndGhCeXRlc1VURjg9SixDPWZ1bmN0aW9uIGUoKXtkZXx8bWUoKSxkZXx8KEM9ZSk7fSxpLnByZUluaXQpZm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBpLnByZUluaXQmJihpLnByZUluaXQ9W2kucHJlSW5pdF0pOzA8aS5wcmVJbml0Lmxlbmd0aDspaS5wcmVJbml0LnBvcCgpKCk7cmV0dXJuIG1lKCksZS5yZWFkeX0pO2UuZXhwb3J0cz1vO30sNDUzNzplPT57ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLHI9MCxvPTIsaT0hMDtvPGFyZ3VtZW50cy5sZW5ndGg7KW5bcisrXT1hcmd1bWVudHNbbysrXTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8scyl7bltyXT1mdW5jdGlvbihlKXtpZihpKWlmKGk9ITEsZSlzKGUpO2Vsc2Uge2Zvcih2YXIgdD1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxuPTA7bjx0Lmxlbmd0aDspdFtuKytdPWFyZ3VtZW50c1tuXTtvLmFwcGx5KG51bGwsdCk7fX07dHJ5e2UuYXBwbHkodHx8bnVsbCxuKTt9Y2F0Y2goZSl7aSYmKGk9ITEscyhlKSk7fX0pKX07fSw3NDE5OihlLHQpPT57dmFyIG49dDtuLmxlbmd0aD1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtpZighdClyZXR1cm4gMDtmb3IodmFyIG49MDstLXQlND4xJiYiPSI9PT1lLmNoYXJBdCh0KTspKytuO3JldHVybiBNYXRoLmNlaWwoMyplLmxlbmd0aCkvNC1ufTtmb3IodmFyIHI9bmV3IEFycmF5KDY0KSxvPW5ldyBBcnJheSgxMjMpLGk9MDtpPDY0OylvW3JbaV09aTwyNj9pKzY1Omk8NTI/aSs3MTppPDYyP2ktNDppLTU5fDQzXT1pKys7bi5lbmNvZGU9ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgbyxpPW51bGwscz1bXSxhPTAsdT0wO3Q8bjspe3ZhciBsPWVbdCsrXTtzd2l0Y2godSl7Y2FzZSAwOnNbYSsrXT1yW2w+PjJdLG89KDMmbCk8PDQsdT0xO2JyZWFrO2Nhc2UgMTpzW2ErK109cltvfGw+PjRdLG89KDE1JmwpPDwyLHU9MjticmVhaztjYXNlIDI6c1thKytdPXJbb3xsPj42XSxzW2ErK109cls2MyZsXSx1PTA7fWE+ODE5MSYmKChpfHwoaT1bXSkpLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcscykpLGE9MCk7fXJldHVybiB1JiYoc1thKytdPXJbb10sc1thKytdPTYxLDE9PT11JiYoc1thKytdPTYxKSksaT8oYSYmaS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHMuc2xpY2UoMCxhKSkpLGkuam9pbigiIikpOlN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHMuc2xpY2UoMCxhKSl9O3ZhciBzPSJpbnZhbGlkIGVuY29kaW5nIjtuLmRlY29kZT1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciByLGk9bixhPTAsdT0wO3U8ZS5sZW5ndGg7KXt2YXIgbD1lLmNoYXJDb2RlQXQodSsrKTtpZig2MT09PWwmJmE+MSlicmVhaztpZih2b2lkIDA9PT0obD1vW2xdKSl0aHJvdyBFcnJvcihzKTtzd2l0Y2goYSl7Y2FzZSAwOnI9bCxhPTE7YnJlYWs7Y2FzZSAxOnRbbisrXT1yPDwyfCg0OCZsKT4+NCxyPWwsYT0yO2JyZWFrO2Nhc2UgMjp0W24rK109KDE1JnIpPDw0fCg2MCZsKT4+MixyPWwsYT0zO2JyZWFrO2Nhc2UgMzp0W24rK109KDMmcik8PDZ8bCxhPTA7fX1pZigxPT09YSl0aHJvdyBFcnJvcihzKTtyZXR1cm4gbi1pfSxuLnRlc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIC9eKD86W0EtWmEtejAtOSsvXXs0fSkqKD86W0EtWmEtejAtOSsvXXsyfT09fFtBLVphLXowLTkrL117M309KT8kLy50ZXN0KGUpfTt9LDkyMTE6ZT0+e2Z1bmN0aW9uIHQoKXt0aGlzLl9saXN0ZW5lcnM9e307fWUuZXhwb3J0cz10LHQucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gKHRoaXMuX2xpc3RlbmVyc1tlXXx8KHRoaXMuX2xpc3RlbmVyc1tlXT1bXSkpLnB1c2goe2ZuOnQsY3R4Om58fHRoaXN9KSx0aGlzfSx0LnByb3RvdHlwZS5vZmY9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT1lKXRoaXMuX2xpc3RlbmVycz17fTtlbHNlIGlmKHZvaWQgMD09PXQpdGhpcy5fbGlzdGVuZXJzW2VdPVtdO2Vsc2UgZm9yKHZhciBuPXRoaXMuX2xpc3RlbmVyc1tlXSxyPTA7cjxuLmxlbmd0aDspbltyXS5mbj09PXQ/bi5zcGxpY2UociwxKTorK3I7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzW2VdO2lmKHQpe2Zvcih2YXIgbj1bXSxyPTE7cjxhcmd1bWVudHMubGVuZ3RoOyluLnB1c2goYXJndW1lbnRzW3IrK10pO2ZvcihyPTA7cjx0Lmxlbmd0aDspdFtyXS5mbi5hcHBseSh0W3IrK10uY3R4LG4pO31yZXR1cm4gdGhpc307fSw5NDU6ZT0+e2Z1bmN0aW9uIHQoZSl7cmV0dXJuICJ1bmRlZmluZWQiIT10eXBlb2YgRmxvYXQzMkFycmF5P2Z1bmN0aW9uKCl7dmFyIHQ9bmV3IEZsb2F0MzJBcnJheShbLTBdKSxuPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyKSxyPTEyOD09PW5bM107ZnVuY3Rpb24gbyhlLHIsbyl7dFswXT1lLHJbb109blswXSxyW28rMV09blsxXSxyW28rMl09blsyXSxyW28rM109blszXTt9ZnVuY3Rpb24gaShlLHIsbyl7dFswXT1lLHJbb109blszXSxyW28rMV09blsyXSxyW28rMl09blsxXSxyW28rM109blswXTt9ZnVuY3Rpb24gcyhlLHIpe3JldHVybiBuWzBdPWVbcl0sblsxXT1lW3IrMV0sblsyXT1lW3IrMl0sblszXT1lW3IrM10sdFswXX1mdW5jdGlvbiBhKGUscil7cmV0dXJuIG5bM109ZVtyXSxuWzJdPWVbcisxXSxuWzFdPWVbcisyXSxuWzBdPWVbciszXSx0WzBdfWUud3JpdGVGbG9hdExFPXI/bzppLGUud3JpdGVGbG9hdEJFPXI/aTpvLGUucmVhZEZsb2F0TEU9cj9zOmEsZS5yZWFkRmxvYXRCRT1yP2E6czt9KCk6ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsdCxuLHIpe3ZhciBvPXQ8MD8xOjA7aWYobyYmKHQ9LXQpLDA9PT10KWUoMS90PjA/MDoyMTQ3NDgzNjQ4LG4scik7ZWxzZSBpZihpc05hTih0KSllKDIxNDMyODkzNDQsbixyKTtlbHNlIGlmKHQ+MzQwMjgyMzQ2NjM4NTI4ODZlMjIpZSgobzw8MzF8MjEzOTA5NTA0MCk+Pj4wLG4scik7ZWxzZSBpZih0PDExNzU0OTQzNTA4MjIyODc1ZS01NCllKChvPDwzMXxNYXRoLnJvdW5kKHQvMTQwMTI5ODQ2NDMyNDgxN2UtNjApKT4+PjAsbixyKTtlbHNlIHt2YXIgaT1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKTtlKChvPDwzMXxpKzEyNzw8MjN8ODM4ODYwNyZNYXRoLnJvdW5kKHQqTWF0aC5wb3coMiwtaSkqODM4ODYwOCkpPj4+MCxuLHIpO319ZnVuY3Rpb24gcyhlLHQsbil7dmFyIHI9ZSh0LG4pLG89Mioocj4+MzEpKzEsaT1yPj4+MjMmMjU1LHM9ODM4ODYwNyZyO3JldHVybiAyNTU9PT1pP3M/TmFOOm8qKDEvMCk6MD09PWk/MTQwMTI5ODQ2NDMyNDgxN2UtNjAqbypzOm8qTWF0aC5wb3coMixpLTE1MCkqKHMrODM4ODYwOCl9ZS53cml0ZUZsb2F0TEU9dC5iaW5kKG51bGwsbiksZS53cml0ZUZsb2F0QkU9dC5iaW5kKG51bGwsciksZS5yZWFkRmxvYXRMRT1zLmJpbmQobnVsbCxvKSxlLnJlYWRGbG9hdEJFPXMuYmluZChudWxsLGkpO30oKSwidW5kZWZpbmVkIiE9dHlwZW9mIEZsb2F0NjRBcnJheT9mdW5jdGlvbigpe3ZhciB0PW5ldyBGbG9hdDY0QXJyYXkoWy0wXSksbj1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcikscj0xMjg9PT1uWzddO2Z1bmN0aW9uIG8oZSxyLG8pe3RbMF09ZSxyW29dPW5bMF0scltvKzFdPW5bMV0scltvKzJdPW5bMl0scltvKzNdPW5bM10scltvKzRdPW5bNF0scltvKzVdPW5bNV0scltvKzZdPW5bNl0scltvKzddPW5bN107fWZ1bmN0aW9uIGkoZSxyLG8pe3RbMF09ZSxyW29dPW5bN10scltvKzFdPW5bNl0scltvKzJdPW5bNV0scltvKzNdPW5bNF0scltvKzRdPW5bM10scltvKzVdPW5bMl0scltvKzZdPW5bMV0scltvKzddPW5bMF07fWZ1bmN0aW9uIHMoZSxyKXtyZXR1cm4gblswXT1lW3JdLG5bMV09ZVtyKzFdLG5bMl09ZVtyKzJdLG5bM109ZVtyKzNdLG5bNF09ZVtyKzRdLG5bNV09ZVtyKzVdLG5bNl09ZVtyKzZdLG5bN109ZVtyKzddLHRbMF19ZnVuY3Rpb24gYShlLHIpe3JldHVybiBuWzddPWVbcl0sbls2XT1lW3IrMV0sbls1XT1lW3IrMl0sbls0XT1lW3IrM10sblszXT1lW3IrNF0sblsyXT1lW3IrNV0sblsxXT1lW3IrNl0sblswXT1lW3IrN10sdFswXX1lLndyaXRlRG91YmxlTEU9cj9vOmksZS53cml0ZURvdWJsZUJFPXI/aTpvLGUucmVhZERvdWJsZUxFPXI/czphLGUucmVhZERvdWJsZUJFPXI/YTpzO30oKTpmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSx0LG4scixvLGkpe3ZhciBzPXI8MD8xOjA7aWYocyYmKHI9LXIpLDA9PT1yKWUoMCxvLGkrdCksZSgxL3I+MD8wOjIxNDc0ODM2NDgsbyxpK24pO2Vsc2UgaWYoaXNOYU4ocikpZSgwLG8saSt0KSxlKDIxNDY5NTkzNjAsbyxpK24pO2Vsc2UgaWYocj4xNzk3NjkzMTM0ODYyMzE1N2UyOTIpZSgwLG8saSt0KSxlKChzPDwzMXwyMTQ2NDM1MDcyKT4+PjAsbyxpK24pO2Vsc2Uge3ZhciBhO2lmKHI8MjIyNTA3Mzg1ODUwNzIwMTRlLTMyNCllKChhPXIvNWUtMzI0KT4+PjAsbyxpK3QpLGUoKHM8PDMxfGEvNDI5NDk2NzI5Nik+Pj4wLG8saStuKTtlbHNlIHt2YXIgdT1NYXRoLmZsb29yKE1hdGgubG9nKHIpL01hdGguTE4yKTsxMDI0PT09dSYmKHU9MTAyMyksZSg0NTAzNTk5NjI3MzcwNDk2KihhPXIqTWF0aC5wb3coMiwtdSkpPj4+MCxvLGkrdCksZSgoczw8MzF8dSsxMDIzPDwyMHwxMDQ4NTc2KmEmMTA0ODU3NSk+Pj4wLG8saStuKTt9fX1mdW5jdGlvbiBzKGUsdCxuLHIsbyl7dmFyIGk9ZShyLG8rdCkscz1lKHIsbytuKSxhPTIqKHM+PjMxKSsxLHU9cz4+PjIwJjIwNDcsbD00Mjk0OTY3Mjk2KigxMDQ4NTc1JnMpK2k7cmV0dXJuIDIwNDc9PT11P2w/TmFOOmEqKDEvMCk6MD09PXU/NWUtMzI0KmEqbDphKk1hdGgucG93KDIsdS0xMDc1KSoobCs0NTAzNTk5NjI3MzcwNDk2KX1lLndyaXRlRG91YmxlTEU9dC5iaW5kKG51bGwsbiwwLDQpLGUud3JpdGVEb3VibGVCRT10LmJpbmQobnVsbCxyLDQsMCksZS5yZWFkRG91YmxlTEU9cy5iaW5kKG51bGwsbywwLDQpLGUucmVhZERvdWJsZUJFPXMuYmluZChudWxsLGksNCwwKTt9KCksZX1mdW5jdGlvbiBuKGUsdCxuKXt0W25dPTI1NSZlLHRbbisxXT1lPj4+OCYyNTUsdFtuKzJdPWU+Pj4xNiYyNTUsdFtuKzNdPWU+Pj4yNDt9ZnVuY3Rpb24gcihlLHQsbil7dFtuXT1lPj4+MjQsdFtuKzFdPWU+Pj4xNiYyNTUsdFtuKzJdPWU+Pj44JjI1NSx0W24rM109MjU1JmU7fWZ1bmN0aW9uIG8oZSx0KXtyZXR1cm4gKGVbdF18ZVt0KzFdPDw4fGVbdCsyXTw8MTZ8ZVt0KzNdPDwyNCk+Pj4wfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gKGVbdF08PDI0fGVbdCsxXTw8MTZ8ZVt0KzJdPDw4fGVbdCszXSk+Pj4wfWUuZXhwb3J0cz10KHQpO30sNzE5OTptb2R1bGU9PntmdW5jdGlvbiBpbnF1aXJlKG1vZHVsZU5hbWUpe3RyeXt2YXIgbW9kPWV2YWwoInF1aXJlIi5yZXBsYWNlKC9eLywicmUiKSkobW9kdWxlTmFtZSk7aWYobW9kJiYobW9kLmxlbmd0aHx8T2JqZWN0LmtleXMobW9kKS5sZW5ndGgpKXJldHVybiBtb2R9Y2F0Y2goZSl7fXJldHVybiBudWxsfW1vZHVsZS5leHBvcnRzPWlucXVpcmU7fSw2NjYyOmU9PntlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW58fDgxOTIsbz1yPj4+MSxpPW51bGwscz1yO3JldHVybiBmdW5jdGlvbihuKXtpZihuPDF8fG4+bylyZXR1cm4gZShuKTtzK24+ciYmKGk9ZShyKSxzPTApO3ZhciBhPXQuY2FsbChpLHMscys9bik7cmV0dXJuIDcmcyYmKHM9MSsoN3xzKSksYX19O30sNDk5NzooZSx0KT0+e3ZhciBuPXQ7bi5sZW5ndGg9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj0wLHI9MDtyPGUubGVuZ3RoOysrcikobj1lLmNoYXJDb2RlQXQocikpPDEyOD90Kz0xOm48MjA0OD90Kz0yOjU1Mjk2PT0oNjQ1MTImbikmJjU2MzIwPT0oNjQ1MTImZS5jaGFyQ29kZUF0KHIrMSkpPygrK3IsdCs9NCk6dCs9MztyZXR1cm4gdH0sbi5yZWFkPWZ1bmN0aW9uKGUsdCxuKXtpZihuLXQ8MSlyZXR1cm4gIiI7Zm9yKHZhciByLG89bnVsbCxpPVtdLHM9MDt0PG47KShyPWVbdCsrXSk8MTI4P2lbcysrXT1yOnI+MTkxJiZyPDIyND9pW3MrK109KDMxJnIpPDw2fDYzJmVbdCsrXTpyPjIzOSYmcjwzNjU/KHI9KCg3JnIpPDwxOHwoNjMmZVt0KytdKTw8MTJ8KDYzJmVbdCsrXSk8PDZ8NjMmZVt0KytdKS02NTUzNixpW3MrK109NTUyOTYrKHI+PjEwKSxpW3MrK109NTYzMjArKDEwMjMmcikpOmlbcysrXT0oMTUmcik8PDEyfCg2MyZlW3QrK10pPDw2fDYzJmVbdCsrXSxzPjgxOTEmJigob3x8KG89W10pKS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGkpKSxzPTApO3JldHVybiBvPyhzJiZvLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsaS5zbGljZSgwLHMpKSksby5qb2luKCIiKSk6U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsaS5zbGljZSgwLHMpKX0sbi53cml0ZT1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciByLG8saT1uLHM9MDtzPGUubGVuZ3RoOysrcykocj1lLmNoYXJDb2RlQXQocykpPDEyOD90W24rK109cjpyPDIwNDg/KHRbbisrXT1yPj42fDE5Mix0W24rK109NjMmcnwxMjgpOjU1Mjk2PT0oNjQ1MTImcikmJjU2MzIwPT0oNjQ1MTImKG89ZS5jaGFyQ29kZUF0KHMrMSkpKT8ocj02NTUzNisoKDEwMjMmcik8PDEwKSsoMTAyMyZvKSwrK3MsdFtuKytdPXI+PjE4fDI0MCx0W24rK109cj4+MTImNjN8MTI4LHRbbisrXT1yPj42JjYzfDEyOCx0W24rK109NjMmcnwxMjgpOih0W24rK109cj4+MTJ8MjI0LHRbbisrXT1yPj42JjYzfDEyOCx0W24rK109NjMmcnwxMjgpO3JldHVybiBuLWl9O30sMzQ0MjooZSx0KT0+e3QuX19lc01vZHVsZT0hMDt2YXIgbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7aWYoIXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhcmd1bWVudDsgYHZhbHVlYCBoYXMgbm8gdmFsdWUuIik7dGhpcy52YWx1ZT1lLkVNUFRZLHQmJmUuaXNHdWlkKHQpJiYodGhpcy52YWx1ZT10KTt9cmV0dXJuIGUuaXNHdWlkPWZ1bmN0aW9uKHQpe3ZhciBuPXQudG9TdHJpbmcoKTtyZXR1cm4gdCYmKHQgaW5zdGFuY2VvZiBlfHxlLnZhbGlkYXRvci50ZXN0KG4pKX0sZS5jcmVhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUoW2UuZ2VuKDIpLGUuZ2VuKDEpLGUuZ2VuKDEpLGUuZ2VuKDEpLGUuZ2VuKDMpXS5qb2luKCItIikpfSxlLmNyZWF0ZUVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlKCJlbXB0eWd1aWQiKX0sZS5wYXJzZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGUodCl9LGUucmF3PWZ1bmN0aW9uKCl7cmV0dXJuIFtlLmdlbigyKSxlLmdlbigxKSxlLmdlbigxKSxlLmdlbigxKSxlLmdlbigzKV0uam9pbigiLSIpfSxlLmdlbj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9IiIsbj0wO248ZTtuKyspdCs9KDY1NTM2KigxK01hdGgucmFuZG9tKCkpfDApLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gZS5pc0d1aWQodCkmJnRoaXMudmFsdWU9PT10LnRvU3RyaW5nKCl9LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZT09PWUuRU1QVFl9LGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWV9LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB7dmFsdWU6dGhpcy52YWx1ZX19LGUudmFsaWRhdG9yPW5ldyBSZWdFeHAoIl5bYS16MC05XXs4fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXs0fS1bYS16MC05XXsxMn0kIiwiaSIpLGUuRU1QVFk9IjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCIsZX0oKTt0Lkd1aWQ9bjt9LDIxMDA6KGUsdCxuKT0+e2UuZXhwb3J0cz1uKDk0ODIpO30sOTQ4MjooZSx0LG4pPT57dmFyIHI9dDtmdW5jdGlvbiBvKCl7ci51dGlsLl9jb25maWd1cmUoKSxyLldyaXRlci5fY29uZmlndXJlKHIuQnVmZmVyV3JpdGVyKSxyLlJlYWRlci5fY29uZmlndXJlKHIuQnVmZmVyUmVhZGVyKTt9ci5idWlsZD0ibWluaW1hbCIsci5Xcml0ZXI9bigxMTczKSxyLkJ1ZmZlcldyaXRlcj1uKDMxNTUpLHIuUmVhZGVyPW4oMTQwOCksci5CdWZmZXJSZWFkZXI9big1OTMpLHIudXRpbD1uKDk2OTMpLHIucnBjPW4oNTk5NCksci5yb290cz1uKDUwNTQpLHIuY29uZmlndXJlPW8sbygpO30sMTQwODooZSx0LG4pPT57ZS5leHBvcnRzPXU7dmFyIHIsbz1uKDk2OTMpLGk9by5Mb25nQml0cyxzPW8udXRmODtmdW5jdGlvbiBhKGUsdCl7cmV0dXJuIFJhbmdlRXJyb3IoImluZGV4IG91dCBvZiByYW5nZTogIitlLnBvcysiICsgIisodHx8MSkrIiA+ICIrZS5sZW4pfWZ1bmN0aW9uIHUoZSl7dGhpcy5idWY9ZSx0aGlzLnBvcz0wLHRoaXMubGVuPWUubGVuZ3RoO312YXIgbCxjPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheXx8QXJyYXkuaXNBcnJheShlKSlyZXR1cm4gbmV3IHUoZSk7dGhyb3cgRXJyb3IoImlsbGVnYWwgYnVmZmVyIil9OmZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIG5ldyB1KGUpO3Rocm93IEVycm9yKCJpbGxlZ2FsIGJ1ZmZlciIpfSxwPWZ1bmN0aW9uKCl7cmV0dXJuIG8uQnVmZmVyP2Z1bmN0aW9uKGUpe3JldHVybiAodS5jcmVhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG8uQnVmZmVyLmlzQnVmZmVyKGUpP25ldyByKGUpOmMoZSl9KShlKX06Y307ZnVuY3Rpb24gZCgpe3ZhciBlPW5ldyBpKDAsMCksdD0wO2lmKCEodGhpcy5sZW4tdGhpcy5wb3M+NCkpe2Zvcig7dDwzOysrdCl7aWYodGhpcy5wb3M+PXRoaXMubGVuKXRocm93IGEodGhpcyk7aWYoZS5sbz0oZS5sb3woMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDcqdCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gZX1yZXR1cm4gZS5sbz0oZS5sb3woMTI3JnRoaXMuYnVmW3RoaXMucG9zKytdKTw8Nyp0KT4+PjAsZX1mb3IoO3Q8NDsrK3QpaWYoZS5sbz0oZS5sb3woMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDcqdCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gZTtpZihlLmxvPShlLmxvfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKTw8MjgpPj4+MCxlLmhpPShlLmhpfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKT4+NCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gZTtpZih0PTAsdGhpcy5sZW4tdGhpcy5wb3M+NCl7Zm9yKDt0PDU7Kyt0KWlmKGUuaGk9KGUuaGl8KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDw3KnQrMyk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gZX1lbHNlIGZvcig7dDw1OysrdCl7aWYodGhpcy5wb3M+PXRoaXMubGVuKXRocm93IGEodGhpcyk7aWYoZS5oaT0oZS5oaXwoMTI3JnRoaXMuYnVmW3RoaXMucG9zXSk8PDcqdCszKT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBlfXRocm93IEVycm9yKCJpbnZhbGlkIHZhcmludCBlbmNvZGluZyIpfWZ1bmN0aW9uIGYoZSx0KXtyZXR1cm4gKGVbdC00XXxlW3QtM108PDh8ZVt0LTJdPDwxNnxlW3QtMV08PDI0KT4+PjB9ZnVuY3Rpb24gaCgpe2lmKHRoaXMucG9zKzg+dGhpcy5sZW4pdGhyb3cgYSh0aGlzLDgpO3JldHVybiBuZXcgaShmKHRoaXMuYnVmLHRoaXMucG9zKz00KSxmKHRoaXMuYnVmLHRoaXMucG9zKz00KSl9dS5jcmVhdGU9cCgpLHUucHJvdG90eXBlLl9zbGljZT1vLkFycmF5LnByb3RvdHlwZS5zdWJhcnJheXx8by5BcnJheS5wcm90b3R5cGUuc2xpY2UsdS5wcm90b3R5cGUudWludDMyPShsPTQyOTQ5NjcyOTUsZnVuY3Rpb24oKXtpZihsPSgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBsO2lmKGw9KGx8KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDw3KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBsO2lmKGw9KGx8KDEyNyZ0aGlzLmJ1Zlt0aGlzLnBvc10pPDwxNCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gbDtpZihsPShsfCgxMjcmdGhpcy5idWZbdGhpcy5wb3NdKTw8MjEpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIGw7aWYobD0obHwoMTUmdGhpcy5idWZbdGhpcy5wb3NdKTw8MjgpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIGw7aWYoKHRoaXMucG9zKz01KT50aGlzLmxlbil0aHJvdyB0aGlzLnBvcz10aGlzLmxlbixhKHRoaXMsMTApO3JldHVybiBsfSksdS5wcm90b3R5cGUuaW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gMHx0aGlzLnVpbnQzMigpfSx1LnByb3RvdHlwZS5zaW50MzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnVpbnQzMigpO3JldHVybiBlPj4+MV4tKDEmZSl8MH0sdS5wcm90b3R5cGUuYm9vbD1mdW5jdGlvbigpe3JldHVybiAwIT09dGhpcy51aW50MzIoKX0sdS5wcm90b3R5cGUuZml4ZWQzMj1mdW5jdGlvbigpe2lmKHRoaXMucG9zKzQ+dGhpcy5sZW4pdGhyb3cgYSh0aGlzLDQpO3JldHVybiBmKHRoaXMuYnVmLHRoaXMucG9zKz00KX0sdS5wcm90b3R5cGUuc2ZpeGVkMzI9ZnVuY3Rpb24oKXtpZih0aGlzLnBvcys0PnRoaXMubGVuKXRocm93IGEodGhpcyw0KTtyZXR1cm4gMHxmKHRoaXMuYnVmLHRoaXMucG9zKz00KX0sdS5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24oKXtpZih0aGlzLnBvcys0PnRoaXMubGVuKXRocm93IGEodGhpcyw0KTt2YXIgZT1vLmZsb2F0LnJlYWRGbG9hdExFKHRoaXMuYnVmLHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsZX0sdS5wcm90b3R5cGUuZG91YmxlPWZ1bmN0aW9uKCl7aWYodGhpcy5wb3MrOD50aGlzLmxlbil0aHJvdyBhKHRoaXMsNCk7dmFyIGU9by5mbG9hdC5yZWFkRG91YmxlTEUodGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfSx1LnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMudWludDMyKCksdD10aGlzLnBvcyxuPXRoaXMucG9zK2U7aWYobj50aGlzLmxlbil0aHJvdyBhKHRoaXMsZSk7cmV0dXJuIHRoaXMucG9zKz1lLEFycmF5LmlzQXJyYXkodGhpcy5idWYpP3RoaXMuYnVmLnNsaWNlKHQsbik6dD09PW4/bmV3IHRoaXMuYnVmLmNvbnN0cnVjdG9yKDApOnRoaXMuX3NsaWNlLmNhbGwodGhpcy5idWYsdCxuKX0sdS5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5ieXRlcygpO3JldHVybiBzLnJlYWQoZSwwLGUubGVuZ3RoKX0sdS5wcm90b3R5cGUuc2tpcD1mdW5jdGlvbihlKXtpZigibnVtYmVyIj09dHlwZW9mIGUpe2lmKHRoaXMucG9zK2U+dGhpcy5sZW4pdGhyb3cgYSh0aGlzLGUpO3RoaXMucG9zKz1lO31lbHNlIGRve2lmKHRoaXMucG9zPj10aGlzLmxlbil0aHJvdyBhKHRoaXMpfXdoaWxlKDEyOCZ0aGlzLmJ1Zlt0aGlzLnBvcysrXSk7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnNraXBUeXBlPWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlIDA6dGhpcy5za2lwKCk7YnJlYWs7Y2FzZSAxOnRoaXMuc2tpcCg4KTticmVhaztjYXNlIDI6dGhpcy5za2lwKHRoaXMudWludDMyKCkpO2JyZWFrO2Nhc2UgMzpmb3IoOzQhPShlPTcmdGhpcy51aW50MzIoKSk7KXRoaXMuc2tpcFR5cGUoZSk7YnJlYWs7Y2FzZSA1OnRoaXMuc2tpcCg0KTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJpbnZhbGlkIHdpcmUgdHlwZSAiK2UrIiBhdCBvZmZzZXQgIit0aGlzLnBvcyl9cmV0dXJuIHRoaXN9LHUuX2NvbmZpZ3VyZT1mdW5jdGlvbihlKXtyPWUsdS5jcmVhdGU9cCgpLHIuX2NvbmZpZ3VyZSgpO3ZhciB0PW8uTG9uZz8idG9Mb25nIjoidG9OdW1iZXIiO28ubWVyZ2UodS5wcm90b3R5cGUse2ludDY0OmZ1bmN0aW9uKCl7cmV0dXJuIGQuY2FsbCh0aGlzKVt0XSghMSl9LHVpbnQ2NDpmdW5jdGlvbigpe3JldHVybiBkLmNhbGwodGhpcylbdF0oITApfSxzaW50NjQ6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpLnp6RGVjb2RlKClbdF0oITEpfSxmaXhlZDY0OmZ1bmN0aW9uKCl7cmV0dXJuIGguY2FsbCh0aGlzKVt0XSghMCl9LHNmaXhlZDY0OmZ1bmN0aW9uKCl7cmV0dXJuIGguY2FsbCh0aGlzKVt0XSghMSl9fSk7fTt9LDU5MzooZSx0LG4pPT57ZS5leHBvcnRzPWk7dmFyIHI9bigxNDA4KTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWk7dmFyIG89big5NjkzKTtmdW5jdGlvbiBpKGUpe3IuY2FsbCh0aGlzLGUpO31pLl9jb25maWd1cmU9ZnVuY3Rpb24oKXtvLkJ1ZmZlciYmKGkucHJvdG90eXBlLl9zbGljZT1vLkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UpO30saS5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy51aW50MzIoKTtyZXR1cm4gdGhpcy5idWYudXRmOFNsaWNlP3RoaXMuYnVmLnV0ZjhTbGljZSh0aGlzLnBvcyx0aGlzLnBvcz1NYXRoLm1pbih0aGlzLnBvcytlLHRoaXMubGVuKSk6dGhpcy5idWYudG9TdHJpbmcoInV0Zi04Iix0aGlzLnBvcyx0aGlzLnBvcz1NYXRoLm1pbih0aGlzLnBvcytlLHRoaXMubGVuKSl9LGkuX2NvbmZpZ3VyZSgpO30sNTA1NDplPT57ZS5leHBvcnRzPXt9O30sNTk5NDooZSx0LG4pPT57dC5TZXJ2aWNlPW4oNzk0OCk7fSw3OTQ4OihlLHQsbik9PntlLmV4cG9ydHM9bzt2YXIgcj1uKDk2OTMpO2Z1bmN0aW9uIG8oZSx0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IFR5cGVFcnJvcigicnBjSW1wbCBtdXN0IGJlIGEgZnVuY3Rpb24iKTtyLkV2ZW50RW1pdHRlci5jYWxsKHRoaXMpLHRoaXMucnBjSW1wbD1lLHRoaXMucmVxdWVzdERlbGltaXRlZD1Cb29sZWFuKHQpLHRoaXMucmVzcG9uc2VEZWxpbWl0ZWQ9Qm9vbGVhbihuKTt9KG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoci5FdmVudEVtaXR0ZXIucHJvdG90eXBlKSkuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5ycGNDYWxsPWZ1bmN0aW9uIGUodCxuLG8saSxzKXtpZighaSl0aHJvdyBUeXBlRXJyb3IoInJlcXVlc3QgbXVzdCBiZSBzcGVjaWZpZWQiKTt2YXIgYT10aGlzO2lmKCFzKXJldHVybiByLmFzUHJvbWlzZShlLGEsdCxuLG8saSk7aWYoYS5ycGNJbXBsKXRyeXtyZXR1cm4gYS5ycGNJbXBsKHQsblthLnJlcXVlc3REZWxpbWl0ZWQ/ImVuY29kZURlbGltaXRlZCI6ImVuY29kZSJdKGkpLmZpbmlzaCgpLChmdW5jdGlvbihlLG4pe2lmKGUpcmV0dXJuIGEuZW1pdCgiZXJyb3IiLGUsdCkscyhlKTtpZihudWxsIT09bil7aWYoIShuIGluc3RhbmNlb2YgbykpdHJ5e249b1thLnJlc3BvbnNlRGVsaW1pdGVkPyJkZWNvZGVEZWxpbWl0ZWQiOiJkZWNvZGUiXShuKTt9Y2F0Y2goZSl7cmV0dXJuIGEuZW1pdCgiZXJyb3IiLGUsdCkscyhlKX1yZXR1cm4gYS5lbWl0KCJkYXRhIixuLHQpLHMobnVsbCxuKX1hLmVuZCghMCk7fSkpfWNhdGNoKGUpe3JldHVybiBhLmVtaXQoImVycm9yIixlLHQpLHZvaWQgc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzKGUpO30pLDApfWVsc2Ugc2V0VGltZW91dCgoZnVuY3Rpb24oKXtzKEVycm9yKCJhbHJlYWR5IGVuZGVkIikpO30pLDApO30sby5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJwY0ltcGwmJihlfHx0aGlzLnJwY0ltcGwobnVsbCxudWxsLG51bGwpLHRoaXMucnBjSW1wbD1udWxsLHRoaXMuZW1pdCgiZW5kIikub2ZmKCkpLHRoaXN9O30sMTk0NTooZSx0LG4pPT57ZS5leHBvcnRzPW87dmFyIHI9big5NjkzKTtmdW5jdGlvbiBvKGUsdCl7dGhpcy5sbz1lPj4+MCx0aGlzLmhpPXQ+Pj4wO312YXIgaT1vLnplcm89bmV3IG8oMCwwKTtpLnRvTnVtYmVyPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGkuenpFbmNvZGU9aS56ekRlY29kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxpLmxlbmd0aD1mdW5jdGlvbigpe3JldHVybiAxfTt2YXIgcz1vLnplcm9IYXNoPSJcMFwwXDBcMFwwXDBcMFwwIjtvLmZyb21OdW1iZXI9ZnVuY3Rpb24oZSl7aWYoMD09PWUpcmV0dXJuIGk7dmFyIHQ9ZTwwO3QmJihlPS1lKTt2YXIgbj1lPj4+MCxyPShlLW4pLzQyOTQ5NjcyOTY+Pj4wO3JldHVybiB0JiYocj1+cj4+PjAsbj1+bj4+PjAsKytuPjQyOTQ5NjcyOTUmJihuPTAsKytyPjQyOTQ5NjcyOTUmJihyPTApKSksbmV3IG8obixyKX0sby5mcm9tPWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gby5mcm9tTnVtYmVyKGUpO2lmKHIuaXNTdHJpbmcoZSkpe2lmKCFyLkxvbmcpcmV0dXJuIG8uZnJvbU51bWJlcihwYXJzZUludChlLDEwKSk7ZT1yLkxvbmcuZnJvbVN0cmluZyhlKTt9cmV0dXJuIGUubG93fHxlLmhpZ2g/bmV3IG8oZS5sb3c+Pj4wLGUuaGlnaD4+PjApOml9LG8ucHJvdG90eXBlLnRvTnVtYmVyPWZ1bmN0aW9uKGUpe2lmKCFlJiZ0aGlzLmhpPj4+MzEpe3ZhciB0PTErfnRoaXMubG8+Pj4wLG49fnRoaXMuaGk+Pj4wO3JldHVybiB0fHwobj1uKzE+Pj4wKSwtKHQrNDI5NDk2NzI5NipuKX1yZXR1cm4gdGhpcy5sbys0Mjk0OTY3Mjk2KnRoaXMuaGl9LG8ucHJvdG90eXBlLnRvTG9uZz1mdW5jdGlvbihlKXtyZXR1cm4gci5Mb25nP25ldyByLkxvbmcoMHx0aGlzLmxvLDB8dGhpcy5oaSxCb29sZWFuKGUpKTp7bG93OjB8dGhpcy5sbyxoaWdoOjB8dGhpcy5oaSx1bnNpZ25lZDpCb29sZWFuKGUpfX07dmFyIGE9U3RyaW5nLnByb3RvdHlwZS5jaGFyQ29kZUF0O28uZnJvbUhhc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1zP2k6bmV3IG8oKGEuY2FsbChlLDApfGEuY2FsbChlLDEpPDw4fGEuY2FsbChlLDIpPDwxNnxhLmNhbGwoZSwzKTw8MjQpPj4+MCwoYS5jYWxsKGUsNCl8YS5jYWxsKGUsNSk8PDh8YS5jYWxsKGUsNik8PDE2fGEuY2FsbChlLDcpPDwyNCk+Pj4wKX0sby5wcm90b3R5cGUudG9IYXNoPWZ1bmN0aW9uKCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoMjU1JnRoaXMubG8sdGhpcy5sbz4+PjgmMjU1LHRoaXMubG8+Pj4xNiYyNTUsdGhpcy5sbz4+PjI0LDI1NSZ0aGlzLmhpLHRoaXMuaGk+Pj44JjI1NSx0aGlzLmhpPj4+MTYmMjU1LHRoaXMuaGk+Pj4yNCl9LG8ucHJvdG90eXBlLnp6RW5jb2RlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oaT4+MzE7cmV0dXJuIHRoaXMuaGk9KCh0aGlzLmhpPDwxfHRoaXMubG8+Pj4zMSleZSk+Pj4wLHRoaXMubG89KHRoaXMubG88PDFeZSk+Pj4wLHRoaXN9LG8ucHJvdG90eXBlLnp6RGVjb2RlPWZ1bmN0aW9uKCl7dmFyIGU9LSgxJnRoaXMubG8pO3JldHVybiB0aGlzLmxvPSgodGhpcy5sbz4+PjF8dGhpcy5oaTw8MzEpXmUpPj4+MCx0aGlzLmhpPSh0aGlzLmhpPj4+MV5lKT4+PjAsdGhpc30sby5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sbyx0PSh0aGlzLmxvPj4+Mjh8dGhpcy5oaTw8NCk+Pj4wLG49dGhpcy5oaT4+PjI0O3JldHVybiAwPT09bj8wPT09dD9lPDE2Mzg0P2U8MTI4PzE6MjplPDIwOTcxNTI/Mzo0OnQ8MTYzODQ/dDwxMjg/NTo2OnQ8MjA5NzE1Mj83Ojg6bjwxMjg/OToxMH07fSw5NjkzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10O2Z1bmN0aW9uIG8oZSx0LG4pe2Zvcih2YXIgcj1PYmplY3Qua2V5cyh0KSxvPTA7bzxyLmxlbmd0aDsrK28pdm9pZCAwIT09ZVtyW29dXSYmbnx8KGVbcltvXV09dFtyW29dXSk7cmV0dXJuIGV9ZnVuY3Rpb24gaShlKXtmdW5jdGlvbiB0KGUsbil7aWYoISh0aGlzIGluc3RhbmNlb2YgdCkpcmV0dXJuIG5ldyB0KGUsbik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1lc3NhZ2UiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZX19KSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHQpOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzdGFjayIse3ZhbHVlOihuZXcgRXJyb3IpLnN0YWNrfHwiIn0pLG4mJm8odGhpcyxuKTt9cmV0dXJuIHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0sbmFtZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGV9LHNldDp2b2lkIDAsZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9LHRvU3RyaW5nOnt2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUrIjogIit0aGlzLm1lc3NhZ2V9LHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfX0pLHR9ci5hc1Byb21pc2U9big0NTM3KSxyLmJhc2U2ND1uKDc0MTkpLHIuRXZlbnRFbWl0dGVyPW4oOTIxMSksci5mbG9hdD1uKDk0NSksci5pbnF1aXJlPW4oNzE5OSksci51dGY4PW4oNDk5Nyksci5wb29sPW4oNjY2Miksci5Mb25nQml0cz1uKDE5NDUpLHIuaXNOb2RlPUJvb2xlYW4odm9pZCAwIT09Y29tbW9uanNHbG9iYWwmJmNvbW1vbmpzR2xvYmFsJiZjb21tb25qc0dsb2JhbC5wcm9jZXNzJiZjb21tb25qc0dsb2JhbC5wcm9jZXNzLnZlcnNpb25zJiZjb21tb25qc0dsb2JhbC5wcm9jZXNzLnZlcnNpb25zLm5vZGUpLHIuZ2xvYmFsPXIuaXNOb2RlJiZjb21tb25qc0dsb2JhbHx8InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvd3x8InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZzZWxmfHx0aGlzLHIuZW1wdHlBcnJheT1PYmplY3QuZnJlZXplP09iamVjdC5mcmVlemUoW10pOltdLHIuZW1wdHlPYmplY3Q9T2JqZWN0LmZyZWV6ZT9PYmplY3QuZnJlZXplKHt9KTp7fSxyLmlzSW50ZWdlcj1OdW1iZXIuaXNJbnRlZ2VyfHxmdW5jdGlvbihlKXtyZXR1cm4gIm51bWJlciI9PXR5cGVvZiBlJiZpc0Zpbml0ZShlKSYmTWF0aC5mbG9vcihlKT09PWV9LHIuaXNTdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuICJzdHJpbmciPT10eXBlb2YgZXx8ZSBpbnN0YW5jZW9mIFN0cmluZ30sci5pc09iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZSYmIm9iamVjdCI9PXR5cGVvZiBlfSxyLmlzc2V0PXIuaXNTZXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lW3RdO3JldHVybiAhKG51bGw9PW58fCFlLmhhc093blByb3BlcnR5KHQpKSYmKCJvYmplY3QiIT10eXBlb2Ygbnx8KEFycmF5LmlzQXJyYXkobik/bi5sZW5ndGg6T2JqZWN0LmtleXMobikubGVuZ3RoKT4wKX0sci5CdWZmZXI9ZnVuY3Rpb24oKXt0cnl7dmFyIGU9ci5pbnF1aXJlKCJidWZmZXIiKS5CdWZmZXI7cmV0dXJuIGUucHJvdG90eXBlLnV0ZjhXcml0ZT9lOm51bGx9Y2F0Y2goZSl7cmV0dXJuIG51bGx9fSgpLHIuX0J1ZmZlcl9mcm9tPW51bGwsci5fQnVmZmVyX2FsbG9jVW5zYWZlPW51bGwsci5uZXdCdWZmZXI9ZnVuY3Rpb24oZSl7cmV0dXJuICJudW1iZXIiPT10eXBlb2YgZT9yLkJ1ZmZlcj9yLl9CdWZmZXJfYWxsb2NVbnNhZmUoZSk6bmV3IHIuQXJyYXkoZSk6ci5CdWZmZXI/ci5fQnVmZmVyX2Zyb20oZSk6InVuZGVmaW5lZCI9PXR5cGVvZiBVaW50OEFycmF5P2U6bmV3IFVpbnQ4QXJyYXkoZSl9LHIuQXJyYXk9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksci5Mb25nPXIuZ2xvYmFsLmRjb2RlSU8mJnIuZ2xvYmFsLmRjb2RlSU8uTG9uZ3x8ci5nbG9iYWwuTG9uZ3x8ci5pbnF1aXJlKCJsb25nIiksci5rZXkyUmU9L150cnVlfGZhbHNlfDB8MSQvLHIua2V5MzJSZT0vXi0/KD86MHxbMS05XVswLTldKikkLyxyLmtleTY0UmU9L14oPzpbXFx4MDAtXFx4ZmZdezh9fC0/KD86MHxbMS05XVswLTldKikpJC8sci5sb25nVG9IYXNoPWZ1bmN0aW9uKGUpe3JldHVybiBlP3IuTG9uZ0JpdHMuZnJvbShlKS50b0hhc2goKTpyLkxvbmdCaXRzLnplcm9IYXNofSxyLmxvbmdGcm9tSGFzaD1mdW5jdGlvbihlLHQpe3ZhciBuPXIuTG9uZ0JpdHMuZnJvbUhhc2goZSk7cmV0dXJuIHIuTG9uZz9yLkxvbmcuZnJvbUJpdHMobi5sbyxuLmhpLHQpOm4udG9OdW1iZXIoQm9vbGVhbih0KSl9LHIubWVyZ2U9byxyLmxjRmlyc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkrZS5zdWJzdHJpbmcoMSl9LHIubmV3RXJyb3I9aSxyLlByb3RvY29sRXJyb3I9aSgiUHJvdG9jb2xFcnJvciIpLHIub25lT2ZHZXR0ZXI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoOysrbil0W2Vbbl1dPTE7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKHRoaXMpLG49ZS5sZW5ndGgtMTtuPi0xOy0tbilpZigxPT09dFtlW25dXSYmdm9pZCAwIT09dGhpc1tlW25dXSYmbnVsbCE9PXRoaXNbZVtuXV0pcmV0dXJuIGVbbl19fSxyLm9uZU9mU2V0dGVyPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoOysrbillW25dIT09dCYmZGVsZXRlIHRoaXNbZVtuXV07fX0sci50b0pTT05PcHRpb25zPXtsb25nczpTdHJpbmcsZW51bXM6U3RyaW5nLGJ5dGVzOlN0cmluZyxqc29uOiEwfSxyLl9jb25maWd1cmU9ZnVuY3Rpb24oKXt2YXIgZT1yLkJ1ZmZlcjtlPyhyLl9CdWZmZXJfZnJvbT1lLmZyb20hPT1VaW50OEFycmF5LmZyb20mJmUuZnJvbXx8ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IGUodCxuKX0sci5fQnVmZmVyX2FsbG9jVW5zYWZlPWUuYWxsb2NVbnNhZmV8fGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSh0KX0pOnIuX0J1ZmZlcl9mcm9tPXIuX0J1ZmZlcl9hbGxvY1Vuc2FmZT1udWxsO307fSwxMTczOihlLHQsbik9PntlLmV4cG9ydHM9cDt2YXIgcixvPW4oOTY5MyksaT1vLkxvbmdCaXRzLHM9by5iYXNlNjQsYT1vLnV0Zjg7ZnVuY3Rpb24gdShlLHQsbil7dGhpcy5mbj1lLHRoaXMubGVuPXQsdGhpcy5uZXh0PXZvaWQgMCx0aGlzLnZhbD1uO31mdW5jdGlvbiBsKCl7fWZ1bmN0aW9uIGMoZSl7dGhpcy5oZWFkPWUuaGVhZCx0aGlzLnRhaWw9ZS50YWlsLHRoaXMubGVuPWUubGVuLHRoaXMubmV4dD1lLnN0YXRlczt9ZnVuY3Rpb24gcCgpe3RoaXMubGVuPTAsdGhpcy5oZWFkPW5ldyB1KGwsMCwwKSx0aGlzLnRhaWw9dGhpcy5oZWFkLHRoaXMuc3RhdGVzPW51bGw7fXZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuIG8uQnVmZmVyP2Z1bmN0aW9uKCl7cmV0dXJuIChwLmNyZWF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgcn0pKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwfX07ZnVuY3Rpb24gZihlLHQsbil7dFtuXT0yNTUmZTt9ZnVuY3Rpb24gaChlLHQpe3RoaXMubGVuPWUsdGhpcy5uZXh0PXZvaWQgMCx0aGlzLnZhbD10O31mdW5jdGlvbiBnKGUsdCxuKXtmb3IoO2UuaGk7KXRbbisrXT0xMjcmZS5sb3wxMjgsZS5sbz0oZS5sbz4+Pjd8ZS5oaTw8MjUpPj4+MCxlLmhpPj4+PTc7Zm9yKDtlLmxvPjEyNzspdFtuKytdPTEyNyZlLmxvfDEyOCxlLmxvPWUubG8+Pj43O3RbbisrXT1lLmxvO31mdW5jdGlvbiBiKGUsdCxuKXt0W25dPTI1NSZlLHRbbisxXT1lPj4+OCYyNTUsdFtuKzJdPWU+Pj4xNiYyNTUsdFtuKzNdPWU+Pj4yNDt9cC5jcmVhdGU9ZCgpLHAuYWxsb2M9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBvLkFycmF5KGUpfSxvLkFycmF5IT09QXJyYXkmJihwLmFsbG9jPW8ucG9vbChwLmFsbG9jLG8uQXJyYXkucHJvdG90eXBlLnN1YmFycmF5KSkscC5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLnRhaWw9dGhpcy50YWlsLm5leHQ9bmV3IHUoZSx0LG4pLHRoaXMubGVuKz10LHRoaXN9LGgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodS5wcm90b3R5cGUpLGgucHJvdG90eXBlLmZuPWZ1bmN0aW9uKGUsdCxuKXtmb3IoO2U+MTI3Oyl0W24rK109MTI3JmV8MTI4LGU+Pj49Nzt0W25dPWU7fSxwLnByb3RvdHlwZS51aW50MzI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubGVuKz0odGhpcy50YWlsPXRoaXMudGFpbC5uZXh0PW5ldyBoKChlPj4+PTApPDEyOD8xOmU8MTYzODQ/MjplPDIwOTcxNTI/MzplPDI2ODQzNTQ1Nj80OjUsZSkpLmxlbix0aGlzfSxwLnByb3RvdHlwZS5pbnQzMj1mdW5jdGlvbihlKXtyZXR1cm4gZTwwP3RoaXMuX3B1c2goZywxMCxpLmZyb21OdW1iZXIoZSkpOnRoaXMudWludDMyKGUpfSxwLnByb3RvdHlwZS5zaW50MzI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudWludDMyKChlPDwxXmU+PjMxKT4+PjApfSxwLnByb3RvdHlwZS51aW50NjQ9ZnVuY3Rpb24oZSl7dmFyIHQ9aS5mcm9tKGUpO3JldHVybiB0aGlzLl9wdXNoKGcsdC5sZW5ndGgoKSx0KX0scC5wcm90b3R5cGUuaW50NjQ9cC5wcm90b3R5cGUudWludDY0LHAucHJvdG90eXBlLnNpbnQ2ND1mdW5jdGlvbihlKXt2YXIgdD1pLmZyb20oZSkuenpFbmNvZGUoKTtyZXR1cm4gdGhpcy5fcHVzaChnLHQubGVuZ3RoKCksdCl9LHAucHJvdG90eXBlLmJvb2w9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3B1c2goZiwxLGU/MTowKX0scC5wcm90b3R5cGUuZml4ZWQzMj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcHVzaChiLDQsZT4+PjApfSxwLnByb3RvdHlwZS5zZml4ZWQzMj1wLnByb3RvdHlwZS5maXhlZDMyLHAucHJvdG90eXBlLmZpeGVkNjQ9ZnVuY3Rpb24oZSl7dmFyIHQ9aS5mcm9tKGUpO3JldHVybiB0aGlzLl9wdXNoKGIsNCx0LmxvKS5fcHVzaChiLDQsdC5oaSl9LHAucHJvdG90eXBlLnNmaXhlZDY0PXAucHJvdG90eXBlLmZpeGVkNjQscC5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3B1c2goby5mbG9hdC53cml0ZUZsb2F0TEUsNCxlKX0scC5wcm90b3R5cGUuZG91YmxlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9wdXNoKG8uZmxvYXQud3JpdGVEb3VibGVMRSw4LGUpfTt2YXIgbT1vLkFycmF5LnByb3RvdHlwZS5zZXQ/ZnVuY3Rpb24oZSx0LG4pe3Quc2V0KGUsbik7fTpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDsrK3IpdFtuK3JdPWVbcl07fTtwLnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aD4+PjA7aWYoIXQpcmV0dXJuIHRoaXMuX3B1c2goZiwxLDApO2lmKG8uaXNTdHJpbmcoZSkpe3ZhciBuPXAuYWxsb2ModD1zLmxlbmd0aChlKSk7cy5kZWNvZGUoZSxuLDApLGU9bjt9cmV0dXJuIHRoaXMudWludDMyKHQpLl9wdXNoKG0sdCxlKX0scC5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKGUpe3ZhciB0PWEubGVuZ3RoKGUpO3JldHVybiB0P3RoaXMudWludDMyKHQpLl9wdXNoKGEud3JpdGUsdCxlKTp0aGlzLl9wdXNoKGYsMSwwKX0scC5wcm90b3R5cGUuZm9yaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlcz1uZXcgYyh0aGlzKSx0aGlzLmhlYWQ9dGhpcy50YWlsPW5ldyB1KGwsMCwwKSx0aGlzLmxlbj0wLHRoaXN9LHAucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGVzPyh0aGlzLmhlYWQ9dGhpcy5zdGF0ZXMuaGVhZCx0aGlzLnRhaWw9dGhpcy5zdGF0ZXMudGFpbCx0aGlzLmxlbj10aGlzLnN0YXRlcy5sZW4sdGhpcy5zdGF0ZXM9dGhpcy5zdGF0ZXMubmV4dCk6KHRoaXMuaGVhZD10aGlzLnRhaWw9bmV3IHUobCwwLDApLHRoaXMubGVuPTApLHRoaXN9LHAucHJvdG90eXBlLmxkZWxpbT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaGVhZCx0PXRoaXMudGFpbCxuPXRoaXMubGVuO3JldHVybiB0aGlzLnJlc2V0KCkudWludDMyKG4pLG4mJih0aGlzLnRhaWwubmV4dD1lLm5leHQsdGhpcy50YWlsPXQsdGhpcy5sZW4rPW4pLHRoaXN9LHAucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmhlYWQubmV4dCx0PXRoaXMuY29uc3RydWN0b3IuYWxsb2ModGhpcy5sZW4pLG49MDtlOyllLmZuKGUudmFsLHQsbiksbis9ZS5sZW4sZT1lLm5leHQ7cmV0dXJuIHR9LHAuX2NvbmZpZ3VyZT1mdW5jdGlvbihlKXtyPWUscC5jcmVhdGU9ZCgpLHIuX2NvbmZpZ3VyZSgpO307fSwzMTU1OihlLHQsbik9PntlLmV4cG9ydHM9aTt2YXIgcj1uKDExNzMpOyhpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHIucHJvdG90eXBlKSkuY29uc3RydWN0b3I9aTt2YXIgbz1uKDk2OTMpO2Z1bmN0aW9uIGkoKXtyLmNhbGwodGhpcyk7fWZ1bmN0aW9uIHMoZSx0LG4pe2UubGVuZ3RoPDQwP28udXRmOC53cml0ZShlLHQsbik6dC51dGY4V3JpdGU/dC51dGY4V3JpdGUoZSxuKTp0LndyaXRlKGUsbik7fWkuX2NvbmZpZ3VyZT1mdW5jdGlvbigpe2kuYWxsb2M9by5fQnVmZmVyX2FsbG9jVW5zYWZlLGkud3JpdGVCeXRlc0J1ZmZlcj1vLkJ1ZmZlciYmby5CdWZmZXIucHJvdG90eXBlIGluc3RhbmNlb2YgVWludDhBcnJheSYmInNldCI9PT1vLkJ1ZmZlci5wcm90b3R5cGUuc2V0Lm5hbWU/ZnVuY3Rpb24oZSx0LG4pe3Quc2V0KGUsbik7fTpmdW5jdGlvbihlLHQsbil7aWYoZS5jb3B5KWUuY29weSh0LG4sMCxlLmxlbmd0aCk7ZWxzZSBmb3IodmFyIHI9MDtyPGUubGVuZ3RoOyl0W24rK109ZVtyKytdO307fSxpLnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbihlKXtvLmlzU3RyaW5nKGUpJiYoZT1vLl9CdWZmZXJfZnJvbShlLCJiYXNlNjQiKSk7dmFyIHQ9ZS5sZW5ndGg+Pj4wO3JldHVybiB0aGlzLnVpbnQzMih0KSx0JiZ0aGlzLl9wdXNoKGkud3JpdGVCeXRlc0J1ZmZlcix0LGUpLHRoaXN9LGkucHJvdG90eXBlLnN0cmluZz1mdW5jdGlvbihlKXt2YXIgdD1vLkJ1ZmZlci5ieXRlTGVuZ3RoKGUpO3JldHVybiB0aGlzLnVpbnQzMih0KSx0JiZ0aGlzLl9wdXNoKHMsdCxlKSx0aGlzfSxpLl9jb25maWd1cmUoKTt9LDQxNTQ6ZT0+e2UuZXhwb3J0cz0nInVzZSBzdHJpY3QiO3ZhciBlPXt9LGE9Im9iamVjdCI9PXR5cGVvZiBwcm9jZXNzJiYib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MudmVyc2lvbnMmJiJzdHJpbmciPT10eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlO2lmKGEpe3ZhciByPXJlcXVpcmUoIndvcmtlcl90aHJlYWRzIiksdD1yLnBhcmVudFBvcnQ7dC5vbigibWVzc2FnZSIsKGU9Pm9ubWVzc2FnZSh7ZGF0YTplfSkpKTt2YXIgcz1yZXF1aXJlKCJmcyIpO09iamVjdC5hc3NpZ24oZ2xvYmFsLHtzZWxmOmdsb2JhbCxyZXF1aXJlOnJlcXVpcmUsTW9kdWxlOmUsbG9jYXRpb246e2hyZWY6X19maWxlbmFtZX0sV29ya2VyOnIuV29ya2VyLGltcG9ydFNjcmlwdHM6ZT0+KDAsZXZhbCkocy5yZWFkRmlsZVN5bmMoZSwidXRmOCIpKyIvLyMgc291cmNlVVJMPSIrZSkscG9zdE1lc3NhZ2U6ZT0+dC5wb3N0TWVzc2FnZShlKSxwZXJmb3JtYW5jZTpnbG9iYWwucGVyZm9ybWFuY2V8fHtub3c6RGF0ZS5ub3d9fSl9dmFyIG89ITEsZD1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiICIpO2E/cy53cml0ZVN5bmMoMixlKyJcXG4iKTpjb25zb2xlLmVycm9yKGUpfTtzZWxmLmFsZXJ0PWZ1bmN0aW9uKCl7dmFyIGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIgIik7cG9zdE1lc3NhZ2Uoe2NtZDoiYWxlcnQiLHRleHQ6YSx0aHJlYWRJZDplLl9wdGhyZWFkX3NlbGYoKX0pfSxlLmluc3RhbnRpYXRlV2FzbT0oYSxyKT0+e3ZhciB0PWUud2FzbU1vZHVsZTtyZXR1cm4gZS53YXNtTW9kdWxlPW51bGwscihuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UodCxhKSl9LHNlbGYub251bmhhbmRsZWRyZWplY3Rpb249ZT0+e3Rocm93IGUucmVhc29uPz9lfSxzZWxmLm9ubWVzc2FnZT1mdW5jdGlvbiBhKHIpe3RyeXtpZigibG9hZCI9PT1yLmRhdGEuY21kKXtsZXQgcz1bXTtzZWxmLm9ubWVzc2FnZT1lPT5zLnB1c2goZSksc2VsZi5zdGFydFdvcmtlcj1yPT57ZT1yLHBvc3RNZXNzYWdlKHtjbWQ6ImxvYWRlZCJ9KTtmb3IobGV0IGUgb2YgcylhKGUpO3NlbGYub25tZXNzYWdlPWF9LGUud2FzbU1vZHVsZT1yLmRhdGEud2FzbU1vZHVsZTtmb3IoY29uc3QgYSBvZiByLmRhdGEuaGFuZGxlcnMpZVthXT0oLi4uZSk9Pntwb3N0TWVzc2FnZSh7Y21kOiJjYWxsSGFuZGxlciIsaGFuZGxlcjphLGFyZ3M6ZX0pfTtpZihlLndhc21NZW1vcnk9ci5kYXRhLndhc21NZW1vcnksZS5idWZmZXI9ZS53YXNtTWVtb3J5LmJ1ZmZlcixlLkVOVklST05NRU5UX0lTX1BUSFJFQUQ9ITAsInN0cmluZyI9PXR5cGVvZiByLmRhdGEudXJsT3JCbG9iKWltcG9ydFNjcmlwdHMoci5kYXRhLnVybE9yQmxvYik7ZWxzZXt2YXIgdD1VUkwuY3JlYXRlT2JqZWN0VVJMKHIuZGF0YS51cmxPckJsb2IpO2ltcG9ydFNjcmlwdHModCksVVJMLnJldm9rZU9iamVjdFVSTCh0KX1vcnRXYXNtVGhyZWFkZWQoZSl9ZWxzZSBpZigicnVuIj09PXIuZGF0YS5jbWQpe2UuX19lbXNjcmlwdGVuX3RocmVhZF9pbml0KHIuZGF0YS5wdGhyZWFkX3B0ciwwLDAsMSksZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX21haWxib3hfYXdhaXQoci5kYXRhLnB0aHJlYWRfcHRyKSxlLmVzdGFibGlzaFN0YWNrU3BhY2UoKSxlLlBUaHJlYWQucmVjZWl2ZU9iamVjdFRyYW5zZmVyKHIuZGF0YSksZS5QVGhyZWFkLnRocmVhZEluaXRUTFMoKSxvfHwobz0hMCk7dHJ5e2UuaW52b2tlRW50cnlQb2ludChyLmRhdGEuc3RhcnRfcm91dGluZSxyLmRhdGEuYXJnKX1jYXRjaChlKXtpZigidW53aW5kIiE9ZSl0aHJvdyBlfX1lbHNlImNhbmNlbCI9PT1yLmRhdGEuY21kP2UuX3B0aHJlYWRfc2VsZigpJiZlLl9fZW1zY3JpcHRlbl90aHJlYWRfZXhpdCgtMSk6InNldGltbWVkaWF0ZSI9PT1yLmRhdGEudGFyZ2V0fHwoImNoZWNrTWFpbGJveCI9PT1yLmRhdGEuY21kP28mJmUuY2hlY2tNYWlsYm94KCk6ci5kYXRhLmNtZCYmKGQoIndvcmtlci5qcyByZWNlaXZlZCB1bmtub3duIGNvbW1hbmQgIityLmRhdGEuY21kKSxkKHIuZGF0YSkpKX1jYXRjaChhKXt0aHJvdyBlLl9fZW1zY3JpcHRlbl90aHJlYWRfY3Jhc2hlZCYmZS5fX2Vtc2NyaXB0ZW5fdGhyZWFkX2NyYXNoZWQoKSxhfX07XG4nO30sNzA2NzooKT0+e30sMTI5NjooKT0+e30sNzYwOigpPT57fSwxMzg0OigpPT57fSwzOTkzOigpPT57fSw5MDg6KCk9Pnt9LDY5NTM6KCk9Pnt9LDk5MjU6KCk9Pnt9LDI4MDY6KCk9Pnt9LDY0NDk6KCk9Pnt9LDI4NTA6KCk9Pnt9LDUzODE6KCk9Pnt9LDY4NTooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnJlc29sdmVCYWNrZW5kPXQucmVnaXN0ZXJCYWNrZW5kPXZvaWQgMDtjb25zdCBuPXt9LHI9W107dC5yZWdpc3RlckJhY2tlbmQ9KGUsdCxvKT0+e2lmKCF0fHwiZnVuY3Rpb24iIT10eXBlb2YgdC5pbml0fHwiZnVuY3Rpb24iIT10eXBlb2YgdC5jcmVhdGVTZXNzaW9uSGFuZGxlcil0aHJvdyBuZXcgVHlwZUVycm9yKCJub3QgYSB2YWxpZCBiYWNrZW5kIik7e2NvbnN0IGk9bltlXTtpZih2b2lkIDA9PT1pKW5bZV09e2JhY2tlbmQ6dCxwcmlvcml0eTpvfTtlbHNlIHtpZihpLnByaW9yaXR5Pm8pcmV0dXJuO2lmKGkucHJpb3JpdHk9PT1vJiZpLmJhY2tlbmQhPT10KXRocm93IG5ldyBFcnJvcihgY2Fubm90IHJlZ2lzdGVyIGJhY2tlbmQgIiR7ZX0iIHVzaW5nIHByaW9yaXR5ICR7b31gKX1pZihvPj0wKXtjb25zdCB0PXIuaW5kZXhPZihlKTstMSE9PXQmJnIuc3BsaWNlKHQsMSk7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0KyspaWYobltyW3RdXS5wcmlvcml0eTw9bylyZXR1cm4gdm9pZCByLnNwbGljZSh0LDAsZSk7ci5wdXNoKGUpO319fSx0LnJlc29sdmVCYWNrZW5kPWFzeW5jIGU9Pntjb25zdCB0PTA9PT1lLmxlbmd0aD9yOmUsbz1bXTtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PW5bZV07aWYodCl7aWYodC5pbml0aWFsaXplZClyZXR1cm4gdC5iYWNrZW5kO2lmKHQuYWJvcnRlZCljb250aW51ZTtjb25zdCBuPSEhdC5pbml0UHJvbWlzZTt0cnl7cmV0dXJuIG58fCh0LmluaXRQcm9taXNlPXQuYmFja2VuZC5pbml0KCkpLGF3YWl0IHQuaW5pdFByb21pc2UsdC5pbml0aWFsaXplZD0hMCx0LmJhY2tlbmR9Y2F0Y2gocil7bnx8by5wdXNoKHtuYW1lOmUsZXJyOnJ9KSx0LmFib3J0ZWQ9ITA7fWZpbmFsbHl7ZGVsZXRlIHQuaW5pdFByb21pc2U7fX19dGhyb3cgbmV3IEVycm9yKGBubyBhdmFpbGFibGUgYmFja2VuZCBmb3VuZC4gRVJSOiAke28ubWFwKChlPT5gWyR7ZS5uYW1lfV0gJHtlLmVycn1gKSkuam9pbigiLCAiKX1gKX07fSw0Nzk4OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5yZWdpc3RlckJhY2tlbmQ9dm9pZCAwO3ZhciByPW4oNjg1KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicmVnaXN0ZXJCYWNrZW5kIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5yZWdpc3RlckJhY2tlbmR9fSk7fSwzMTIxOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5lbnY9dm9pZCAwO2NvbnN0IHI9big5MTA0KTtsZXQgbz0id2FybmluZyI7dC5lbnY9e3dhc206e30sd2ViZ2w6e30sd2ViZ3B1Ont9LHZlcnNpb25zOntjb21tb246ci52ZXJzaW9ufSxzZXQgbG9nTGV2ZWwoZSl7aWYodm9pZCAwIT09ZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlfHwtMT09PVsidmVyYm9zZSIsImluZm8iLCJ3YXJuaW5nIiwiZXJyb3IiLCJmYXRhbCJdLmluZGV4T2YoZSkpdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2dnaW5nIGxldmVsOiAke2V9YCk7bz1lO319LGdldCBsb2dMZXZlbCgpe3JldHVybiBvfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuZW52LCJsb2dMZXZlbCIse2VudW1lcmFibGU6ITB9KTt9LDI0NTc6KGUsdCxuKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmVudj12b2lkIDA7Y29uc3Qgcj1uKDMxMjEpO3QuZW52PXIuZW52O30sMjIzNTpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyYmdGhpcy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pO3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtvJiYhKCJnZXQiaW4gbz8hdC5fX2VzTW9kdWxlOm8ud3JpdGFibGV8fG8uY29uZmlndXJhYmxlKXx8KG89e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixvKTt9OmZ1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXImJihyPW4pLGVbcl09dFtuXTt9KSxvPXRoaXMmJnRoaXMuX19leHBvcnRTdGFyfHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKSJkZWZhdWx0Ij09PW58fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pfHxyKHQsZSxuKTt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxvKG4oNDc5OCksdCksbyhuKDI0NTcpLHQpLG8obigzOTc0KSx0KSxvKG4oOTYzKSx0KSxvKG4oNzg1MiksdCk7fSw4MDM2OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5JbmZlcmVuY2VTZXNzaW9uPXZvaWQgMDtjb25zdCByPW4oNjg1KSxvPW4oOTYzKTtjbGFzcyBpe2NvbnN0cnVjdG9yKGUpe3RoaXMuaGFuZGxlcj1lO31hc3luYyBydW4oZSx0LG4pe2NvbnN0IHI9e307bGV0IGk9e307aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZXx8ZSBpbnN0YW5jZW9mIG8uVGVuc29yfHxBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIidmZWVkcycgbXVzdCBiZSBhbiBvYmplY3QgdGhhdCB1c2UgaW5wdXQgbmFtZXMgYXMga2V5cyBhbmQgT25ueFZhbHVlIGFzIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiIpO2xldCBzPSEwO2lmKCJvYmplY3QiPT10eXBlb2YgdCl7aWYobnVsbD09PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5leHBlY3RlZCBhcmd1bWVudFsxXTogY2Fubm90IGJlIG51bGwuIik7aWYodCBpbnN0YW5jZW9mIG8uVGVuc29yKXRocm93IG5ldyBUeXBlRXJyb3IoIidmZXRjaGVzJyBjYW5ub3QgYmUgYSBUZW5zb3IiKTtpZihBcnJheS5pc0FycmF5KHQpKXtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2ZldGNoZXMnIGNhbm5vdCBiZSBhbiBlbXB0eSBhcnJheS4iKTtzPSExO2Zvcihjb25zdCBlIG9mIHQpe2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCInZmV0Y2hlcycgbXVzdCBiZSBhIHN0cmluZyBhcnJheSBvciBhbiBvYmplY3QuIik7aWYoLTE9PT10aGlzLm91dHB1dE5hbWVzLmluZGV4T2YoZSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCdmZXRjaGVzJyBjb250YWlucyBpbnZhbGlkIG91dHB1dCBuYW1lOiAke2V9LmApO3JbZV09bnVsbDt9aWYoIm9iamVjdCI9PXR5cGVvZiBuJiZudWxsIT09bilpPW47ZWxzZSBpZih2b2lkIDAhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIHtsZXQgZT0hMTtjb25zdCBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpO2Zvcihjb25zdCBuIG9mIHRoaXMub3V0cHV0TmFtZXMpaWYoLTEhPT1hLmluZGV4T2Yobikpe2NvbnN0IGk9dFtuXTsobnVsbD09PWl8fGkgaW5zdGFuY2VvZiBvLlRlbnNvcikmJihlPSEwLHM9ITEscltuXT1pKTt9aWYoZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBuJiZudWxsIT09bilpPW47ZWxzZSBpZih2b2lkIDAhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIGk9dDt9fWVsc2UgaWYodm9pZCAwIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmV4cGVjdGVkIGFyZ3VtZW50WzFdOiBtdXN0IGJlICdmZXRjaGVzJyBvciAnb3B0aW9ucycuIik7Zm9yKGNvbnN0IHQgb2YgdGhpcy5pbnB1dE5hbWVzKWlmKHZvaWQgMD09PWVbdF0pdGhyb3cgbmV3IEVycm9yKGBpbnB1dCAnJHt0fScgaXMgbWlzc2luZyBpbiAnZmVlZHMnLmApO2lmKHMpZm9yKGNvbnN0IGUgb2YgdGhpcy5vdXRwdXROYW1lcylyW2VdPW51bGw7Y29uc3QgYT1hd2FpdCB0aGlzLmhhbmRsZXIucnVuKGUscixpKSx1PXt9O2Zvcihjb25zdCBlIGluIGEpT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYSxlKSYmKHVbZV09bmV3IG8uVGVuc29yKGFbZV0udHlwZSxhW2VdLmRhdGEsYVtlXS5kaW1zKSk7cmV0dXJuIHV9YXN5bmMgcmVsZWFzZSgpe3JldHVybiB0aGlzLmhhbmRsZXIuZGlzcG9zZSgpfXN0YXRpYyBhc3luYyBjcmVhdGUoZSx0LG4sbyl7bGV0IHMsYT17fTtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKHM9ZSwib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KWE9dDtlbHNlIGlmKHZvaWQgMCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ29wdGlvbnMnIG11c3QgYmUgYW4gb2JqZWN0LiIpfWVsc2UgaWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2lmKHM9ZSwib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KWE9dDtlbHNlIGlmKHZvaWQgMCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiJ29wdGlvbnMnIG11c3QgYmUgYW4gb2JqZWN0LiIpfWVsc2Uge2lmKCEoZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwidW5kZWZpbmVkIiE9dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVuZXhwZWN0ZWQgYXJndW1lbnRbMF06IG11c3QgYmUgJ3BhdGgnIG9yICdidWZmZXInLiIpO3tjb25zdCByPWU7bGV0IGk9MCx1PWUuYnl0ZUxlbmd0aDtpZigib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KWE9dDtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoaT10LCFOdW1iZXIuaXNTYWZlSW50ZWdlcihpKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2J5dGVPZmZzZXQnIG11c3QgYmUgYW4gaW50ZWdlci4iKTtpZihpPDB8fGk+PXIuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJ2J5dGVPZmZzZXQnIGlzIG91dCBvZiByYW5nZSBbMCwgJHtyLmJ5dGVMZW5ndGh9KS5gKTtpZih1PWUuYnl0ZUxlbmd0aC1pLCJudW1iZXIiPT10eXBlb2Ygbil7aWYodT1uLCFOdW1iZXIuaXNTYWZlSW50ZWdlcih1KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2J5dGVMZW5ndGgnIG11c3QgYmUgYW4gaW50ZWdlci4iKTtpZih1PD0wfHxpK3U+ci5ieXRlTGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKGAnYnl0ZUxlbmd0aCcgaXMgb3V0IG9mIHJhbmdlICgwLCAke3IuYnl0ZUxlbmd0aC1pfV0uYCk7aWYoIm9iamVjdCI9PXR5cGVvZiBvJiZudWxsIT09bylhPW87ZWxzZSBpZih2b2lkIDAhPT1vKXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKX1lbHNlIGlmKHZvaWQgMCE9PW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiJ2J5dGVMZW5ndGgnIG11c3QgYmUgYSBudW1iZXIuIil9ZWxzZSBpZih2b2lkIDAhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIidvcHRpb25zJyBtdXN0IGJlIGFuIG9iamVjdC4iKTtzPW5ldyBVaW50OEFycmF5KHIsaSx1KTt9fWNvbnN0IHU9KGEuZXhlY3V0aW9uUHJvdmlkZXJzfHxbXSkubWFwKChlPT4ic3RyaW5nIj09dHlwZW9mIGU/ZTplLm5hbWUpKSxsPWF3YWl0KDAsIHIucmVzb2x2ZUJhY2tlbmQpKHUpLGM9YXdhaXQgbC5jcmVhdGVTZXNzaW9uSGFuZGxlcihzLGEpO3JldHVybiBuZXcgaShjKX1zdGFydFByb2ZpbGluZygpe3RoaXMuaGFuZGxlci5zdGFydFByb2ZpbGluZygpO31lbmRQcm9maWxpbmcoKXt0aGlzLmhhbmRsZXIuZW5kUHJvZmlsaW5nKCk7fWdldCBpbnB1dE5hbWVzKCl7cmV0dXJuIHRoaXMuaGFuZGxlci5pbnB1dE5hbWVzfWdldCBvdXRwdXROYW1lcygpe3JldHVybiB0aGlzLmhhbmRsZXIub3V0cHV0TmFtZXN9fXQuSW5mZXJlbmNlU2Vzc2lvbj1pO30sMzk3NDooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuSW5mZXJlbmNlU2Vzc2lvbj12b2lkIDA7Y29uc3Qgcj1uKDgwMzYpO3QuSW5mZXJlbmNlU2Vzc2lvbj1yLkluZmVyZW5jZVNlc3Npb247fSw3ODUyOihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO30sMjM1MDooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LnRlbnNvclRvSW1hZ2VEYXRhPXQudGVuc29yVG9EYXRhVVJMPXZvaWQgMCx0LnRlbnNvclRvRGF0YVVSTD0oZSx0KT0+e2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7bi53aWR0aD1lLmRpbXNbM10sbi5oZWlnaHQ9ZS5kaW1zWzJdO2NvbnN0IHI9bi5nZXRDb250ZXh0KCIyZCIpO2lmKG51bGwhPXIpe2xldCBvLGk7dm9pZCAwIT09dD8udGVuc29yTGF5b3V0JiYiTkhXQyI9PT10LnRlbnNvckxheW91dD8obz1lLmRpbXNbMl0saT1lLmRpbXNbM10pOihvPWUuZGltc1szXSxpPWUuZGltc1syXSk7Y29uc3Qgcz12b2lkIDAhPT10Py5mb3JtYXQ/dC5mb3JtYXQ6IlJHQiIsYT10Py5ub3JtO2xldCB1LGw7dm9pZCAwPT09YXx8dm9pZCAwPT09YS5tZWFuP3U9WzI1NSwyNTUsMjU1LDI1NV06Im51bWJlciI9PXR5cGVvZiBhLm1lYW4/dT1bYS5tZWFuLGEubWVhbixhLm1lYW4sYS5tZWFuXToodT1bYS5tZWFuWzBdLGEubWVhblsxXSxhLm1lYW5bMl0sMF0sdm9pZCAwIT09YS5tZWFuWzNdJiYodVszXT1hLm1lYW5bM10pKSx2b2lkIDA9PT1hfHx2b2lkIDA9PT1hLmJpYXM/bD1bMCwwLDAsMF06Im51bWJlciI9PXR5cGVvZiBhLmJpYXM/bD1bYS5iaWFzLGEuYmlhcyxhLmJpYXMsYS5iaWFzXToobD1bYS5iaWFzWzBdLGEuYmlhc1sxXSxhLmJpYXNbMl0sMF0sdm9pZCAwIT09YS5iaWFzWzNdJiYobFszXT1hLmJpYXNbM10pKTtjb25zdCBjPWkqbztsZXQgcD0wLGQ9YyxmPTIqYyxoPS0xOyJSR0JBIj09PXM/KHA9MCxkPWMsZj0yKmMsaD0zKmMpOiJSR0IiPT09cz8ocD0wLGQ9YyxmPTIqYyk6IlJCRyI9PT1zJiYocD0wLGY9YyxkPTIqYyk7Zm9yKGxldCB0PTA7dDxpO3QrKylmb3IobGV0IG49MDtuPG87bisrKXtjb25zdCBvPShlLmRhdGFbcCsrXS1sWzBdKSp1WzBdLGk9KGUuZGF0YVtkKytdLWxbMV0pKnVbMV0scz0oZS5kYXRhW2YrK10tbFsyXSkqdVsyXSxhPS0xPT09aD8yNTU6KGUuZGF0YVtoKytdLWxbM10pKnVbM107ci5maWxsU3R5bGU9InJnYmEoIitvKyIsIitpKyIsIitzKyIsIithKyIpIixyLmZpbGxSZWN0KG4sdCwxLDEpO31yZXR1cm4gbi50b0RhdGFVUkwoKX10aHJvdyBuZXcgRXJyb3IoIkNhbiBub3QgYWNjZXNzIGltYWdlIGRhdGEiKX0sdC50ZW5zb3JUb0ltYWdlRGF0YT0oZSx0KT0+e2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiKTtsZXQgcjtpZihudWxsPT1uKXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpO3tsZXQgbyxpLHM7dm9pZCAwIT09dD8udGVuc29yTGF5b3V0JiYiTkhXQyI9PT10LnRlbnNvckxheW91dD8obz1lLmRpbXNbMl0saT1lLmRpbXNbMV0scz1lLmRpbXNbM10pOihvPWUuZGltc1szXSxpPWUuZGltc1syXSxzPWUuZGltc1sxXSk7Y29uc3QgYT12b2lkIDAhPT10JiZ2b2lkIDAhPT10LmZvcm1hdD90LmZvcm1hdDoiUkdCIix1PXQ/Lm5vcm07bGV0IGwsYzt2b2lkIDA9PT11fHx2b2lkIDA9PT11Lm1lYW4/bD1bMjU1LDI1NSwyNTUsMjU1XToibnVtYmVyIj09dHlwZW9mIHUubWVhbj9sPVt1Lm1lYW4sdS5tZWFuLHUubWVhbix1Lm1lYW5dOihsPVt1Lm1lYW5bMF0sdS5tZWFuWzFdLHUubWVhblsyXSwyNTVdLHZvaWQgMCE9PXUubWVhblszXSYmKGxbM109dS5tZWFuWzNdKSksdm9pZCAwPT09dXx8dm9pZCAwPT09dS5iaWFzP2M9WzAsMCwwLDBdOiJudW1iZXIiPT10eXBlb2YgdS5iaWFzP2M9W3UuYmlhcyx1LmJpYXMsdS5iaWFzLHUuYmlhc106KGM9W3UuYmlhc1swXSx1LmJpYXNbMV0sdS5iaWFzWzJdLDBdLHZvaWQgMCE9PXUuYmlhc1szXSYmKGNbM109dS5iaWFzWzNdKSk7Y29uc3QgcD1pKm87aWYodm9pZCAwIT09dCYmKHZvaWQgMCE9PXQuZm9ybWF0JiY0PT09cyYmIlJHQkEiIT09dC5mb3JtYXR8fDM9PT1zJiYiUkdCIiE9PXQuZm9ybWF0JiYiQkdSIiE9PXQuZm9ybWF0KSl0aHJvdyBuZXcgRXJyb3IoIlRlbnNvciBmb3JtYXQgZG9lc24ndCBtYXRjaCBpbnB1dCB0ZW5zb3IgZGltcyIpO2NvbnN0IGQ9NDtsZXQgZj0wLGg9MSxnPTIsYj0zLG09MCx5PXAsdj0yKnAsXz0tMTsiUkdCQSI9PT1hPyhtPTAseT1wLHY9MipwLF89MypwKToiUkdCIj09PWE/KG09MCx5PXAsdj0yKnApOiJSQkciPT09YSYmKG09MCx2PXAseT0yKnApLHI9bi5jcmVhdGVJbWFnZURhdGEobyxpKTtmb3IobGV0IHQ9MDt0PGkqbztmKz1kLGgrPWQsZys9ZCxiKz1kLHQrKylyLmRhdGFbZl09KGUuZGF0YVttKytdLWNbMF0pKmxbMF0sci5kYXRhW2hdPShlLmRhdGFbeSsrXS1jWzFdKSpsWzFdLHIuZGF0YVtnXT0oZS5kYXRhW3YrK10tY1syXSkqbFsyXSxyLmRhdGFbYl09LTE9PT1fPzI1NTooZS5kYXRhW18rK10tY1szXSkqbFszXTt9cmV0dXJuIHJ9O30sNDg2NjooZSx0LG4pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQudGVuc29yRnJvbUltYWdlPXQuYnVmZmVyVG9UZW5zb3I9dm9pZCAwO2NvbnN0IHI9big5NjMpO3QuYnVmZmVyVG9UZW5zb3I9KGUsdCk9PntpZih2b2lkIDA9PT1lKXRocm93IG5ldyBFcnJvcigiSW1hZ2UgYnVmZmVyIG11c3QgYmUgZGVmaW5lZCIpO2lmKHZvaWQgMD09PXQuaGVpZ2h0fHx2b2lkIDA9PT10LndpZHRoKXRocm93IG5ldyBFcnJvcigiSW1hZ2UgaGVpZ2h0IGFuZCB3aWR0aCBtdXN0IGJlIGRlZmluZWQiKTtpZigiTkhXQyI9PT10LnRlbnNvckxheW91dCl0aHJvdyBuZXcgRXJyb3IoIk5IV0MgVGVuc29yIGxheW91dCBpcyBub3Qgc3VwcG9ydGVkIHlldCIpO2NvbnN0e2hlaWdodDpuLHdpZHRoOm99PXQsaT10Lm5vcm0/P3ttZWFuOjI1NSxiaWFzOjB9O2xldCBzLGE7cz0ibnVtYmVyIj09dHlwZW9mIGkubWVhbj9baS5tZWFuLGkubWVhbixpLm1lYW4saS5tZWFuXTpbaS5tZWFuWzBdLGkubWVhblsxXSxpLm1lYW5bMl0saS5tZWFuWzNdPz8yNTVdLGE9Im51bWJlciI9PXR5cGVvZiBpLmJpYXM/W2kuYmlhcyxpLmJpYXMsaS5iaWFzLGkuYmlhc106W2kuYmlhc1swXSxpLmJpYXNbMV0saS5iaWFzWzJdLGkuYmlhc1szXT8/MF07Y29uc3QgdT12b2lkIDAhPT10LmZvcm1hdD90LmZvcm1hdDoiUkdCQSIsbD12b2lkIDAhPT10LnRlbnNvckZvcm1hdCYmdm9pZCAwIT09dC50ZW5zb3JGb3JtYXQ/dC50ZW5zb3JGb3JtYXQ6IlJHQiIsYz1uKm8scD0iUkdCQSI9PT1sP25ldyBGbG9hdDMyQXJyYXkoNCpjKTpuZXcgRmxvYXQzMkFycmF5KDMqYyk7bGV0IGQ9NCxmPTAsaD0xLGc9MixiPTMsbT0wLHk9Yyx2PTIqYyxfPS0xOyJSR0IiPT09dSYmKGQ9MyxmPTAsaD0xLGc9MixiPS0xKSwiUkdCQSI9PT1sP189MypjOiJSQkciPT09bD8obT0wLHY9Yyx5PTIqYyk6IkJHUiI9PT1sJiYodj0wLHk9YyxtPTIqYyk7Zm9yKGxldCB0PTA7dDxjO3QrKyxmKz1kLGcrPWQsaCs9ZCxiKz1kKXBbbSsrXT0oZVtmXSthWzBdKS9zWzBdLHBbeSsrXT0oZVtoXSthWzFdKS9zWzFdLHBbdisrXT0oZVtnXSthWzJdKS9zWzJdLC0xIT09XyYmLTEhPT1iJiYocFtfKytdPShlW2JdK2FbM10pL3NbM10pO3JldHVybiAiUkdCQSI9PT1sP25ldyByLlRlbnNvcigiZmxvYXQzMiIscCxbMSw0LG4sb10pOm5ldyByLlRlbnNvcigiZmxvYXQzMiIscCxbMSwzLG4sb10pfSx0LnRlbnNvckZyb21JbWFnZT1hc3luYyhlLG4pPT57Y29uc3Qgcj0idW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQmJmUgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50LG89InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZURhdGEmJmUgaW5zdGFuY2VvZiBJbWFnZURhdGEsaT0idW5kZWZpbmVkIiE9dHlwZW9mIEltYWdlQml0bWFwJiZlIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAscz0ic3RyaW5nIj09dHlwZW9mIGU7bGV0IGEsdT1uPz97fTtpZihyKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3Qud2lkdGg9ZS53aWR0aCx0LmhlaWdodD1lLmhlaWdodDtjb25zdCByPXQuZ2V0Q29udGV4dCgiMmQiKTtpZihudWxsPT1yKXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpO3tsZXQgdD1lLmhlaWdodCxvPWUud2lkdGg7aWYodm9pZCAwIT09biYmdm9pZCAwIT09bi5yZXNpemVkSGVpZ2h0JiZ2b2lkIDAhPT1uLnJlc2l6ZWRXaWR0aCYmKHQ9bi5yZXNpemVkSGVpZ2h0LG89bi5yZXNpemVkV2lkdGgpLHZvaWQgMCE9PW4pe2lmKHU9bix2b2lkIDAhPT1uLnRlbnNvckZvcm1hdCl0aHJvdyBuZXcgRXJyb3IoIkltYWdlIGlucHV0IGNvbmZpZyBmb3JtYXQgbXVzdCBiZSBSR0JBIGZvciBIVE1MSW1hZ2VFbGVtZW50Iik7dS50ZW5zb3JGb3JtYXQ9IlJHQkEiLHUuaGVpZ2h0PXQsdS53aWR0aD1vO31lbHNlIHUudGVuc29yRm9ybWF0PSJSR0JBIix1LmhlaWdodD10LHUud2lkdGg9bztyLmRyYXdJbWFnZShlLDAsMCksYT1yLmdldEltYWdlRGF0YSgwLDAsbyx0KS5kYXRhO319ZWxzZSB7aWYoIW8pe2lmKGkpe2lmKHZvaWQgMD09PW4pdGhyb3cgbmV3IEVycm9yKCJQbGVhc2UgcHJvdmlkZSBpbWFnZSBjb25maWcgd2l0aCBmb3JtYXQgZm9yIEltYWdlYml0bWFwIik7Y29uc3Qgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtyLndpZHRoPWUud2lkdGgsci5oZWlnaHQ9ZS5oZWlnaHQ7Y29uc3Qgbz1yLmdldENvbnRleHQoIjJkIik7aWYobnVsbCE9byl7Y29uc3Qgbj1lLmhlaWdodCxyPWUud2lkdGg7cmV0dXJuIG8uZHJhd0ltYWdlKGUsMCwwLHIsbiksYT1vLmdldEltYWdlRGF0YSgwLDAscixuKS5kYXRhLHUuaGVpZ2h0PW4sdS53aWR0aD1yLCgwLCB0LmJ1ZmZlclRvVGVuc29yKShhLHUpfXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCBhY2Nlc3MgaW1hZ2UgZGF0YSIpfWlmKHMpcmV0dXJuIG5ldyBQcm9taXNlKCgobixyKT0+e2NvbnN0IG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksaT1vLmdldENvbnRleHQoIjJkIik7aWYoIWV8fCFpKXJldHVybiByKCk7Y29uc3Qgcz1uZXcgSW1hZ2U7cy5jcm9zc09yaWdpbj0iQW5vbnltb3VzIixzLnNyYz1lLHMub25sb2FkPSgpPT57by53aWR0aD1zLndpZHRoLG8uaGVpZ2h0PXMuaGVpZ2h0LGkuZHJhd0ltYWdlKHMsMCwwLG8ud2lkdGgsby5oZWlnaHQpO2NvbnN0IGU9aS5nZXRJbWFnZURhdGEoMCwwLG8ud2lkdGgsby5oZWlnaHQpO3UuaGVpZ2h0PW8uaGVpZ2h0LHUud2lkdGg9by53aWR0aCxuKCgwLCB0LmJ1ZmZlclRvVGVuc29yKShlLmRhdGEsdSkpO307fSkpO3Rocm93IG5ldyBFcnJvcigiSW5wdXQgZGF0YSBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkIC0gYWJvcnRlZCB0ZW5zb3IgY3JlYXRpb24iKX17bGV0IHQscjtpZih2b2lkIDAhPT1uJiZ2b2lkIDAhPT1uLnJlc2l6ZWRXaWR0aCYmdm9pZCAwIT09bi5yZXNpemVkSGVpZ2h0Pyh0PW4ucmVzaXplZEhlaWdodCxyPW4ucmVzaXplZFdpZHRoKToodD1lLmhlaWdodCxyPWUud2lkdGgpLHZvaWQgMCE9PW4mJih1PW4pLHUuZm9ybWF0PSJSR0JBIix1LmhlaWdodD10LHUud2lkdGg9cix2b2lkIDAhPT1uKXtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO24ud2lkdGg9cixuLmhlaWdodD10O2NvbnN0IG89bi5nZXRDb250ZXh0KCIyZCIpO2lmKG51bGw9PW8pdGhyb3cgbmV3IEVycm9yKCJDYW4gbm90IGFjY2VzcyBpbWFnZSBkYXRhIik7by5wdXRJbWFnZURhdGEoZSwwLDApLGE9by5nZXRJbWFnZURhdGEoMCwwLHIsdCkuZGF0YTt9ZWxzZSBhPWUuZGF0YTt9fWlmKHZvaWQgMCE9PWEpcmV0dXJuICgwLCB0LmJ1ZmZlclRvVGVuc29yKShhLHUpO3Rocm93IG5ldyBFcnJvcigiSW5wdXQgZGF0YSBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkIC0gYWJvcnRlZCB0ZW5zb3IgY3JlYXRpb24iKX07fSw1OTU3OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UZW5zb3I9dm9pZCAwO2NvbnN0IHI9bigyMzUwKSxvPW4oNDg2NiksaT1uKDEwNikscz1uZXcgTWFwKFtbImZsb2F0MzIiLEZsb2F0MzJBcnJheV0sWyJ1aW50OCIsVWludDhBcnJheV0sWyJpbnQ4IixJbnQ4QXJyYXldLFsidWludDE2IixVaW50MTZBcnJheV0sWyJmbG9hdDE2IixVaW50MTZBcnJheV0sWyJpbnQxNiIsSW50MTZBcnJheV0sWyJpbnQzMiIsSW50MzJBcnJheV0sWyJib29sIixVaW50OEFycmF5XSxbImZsb2F0NjQiLEZsb2F0NjRBcnJheV0sWyJ1aW50MzIiLFVpbnQzMkFycmF5XV0pLGE9bmV3IE1hcChbW0Zsb2F0MzJBcnJheSwiZmxvYXQzMiJdLFtVaW50OEFycmF5LCJ1aW50OCJdLFtJbnQ4QXJyYXksImludDgiXSxbVWludDE2QXJyYXksInVpbnQxNiJdLFtJbnQxNkFycmF5LCJpbnQxNiJdLFtJbnQzMkFycmF5LCJpbnQzMiJdLFtGbG9hdDY0QXJyYXksImZsb2F0NjQiXSxbVWludDMyQXJyYXksInVpbnQzMiJdXSk7bGV0IHU9ITE7dC5UZW5zb3I9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe2xldCByLG8sbDtpZigoKCk9PntpZighdSl7dT0hMDtjb25zdCBlPSJ1bmRlZmluZWQiIT10eXBlb2YgQmlnSW50NjRBcnJheSYmImZ1bmN0aW9uIj09dHlwZW9mIEJpZ0ludDY0QXJyYXkuZnJvbSx0PSJ1bmRlZmluZWQiIT10eXBlb2YgQmlnVWludDY0QXJyYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBCaWdVaW50NjRBcnJheS5mcm9tO2UmJihzLnNldCgiaW50NjQiLEJpZ0ludDY0QXJyYXkpLGEuc2V0KEJpZ0ludDY0QXJyYXksImludDY0IikpLHQmJihzLnNldCgidWludDY0IixCaWdVaW50NjRBcnJheSksYS5zZXQoQmlnVWludDY0QXJyYXksInVpbnQ2NCIpKTt9fSkoKSwic3RyaW5nIj09dHlwZW9mIGUpaWYocj1lLGw9biwic3RyaW5nIj09PWUpe2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkEgc3RyaW5nIHRlbnNvcidzIGRhdGEgbXVzdCBiZSBhIHN0cmluZyBhcnJheS4iKTtvPXQ7fWVsc2Uge2NvbnN0IG49cy5nZXQoZSk7aWYodm9pZCAwPT09bil0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCB0ZW5zb3IgdHlwZTogJHtlfS5gKTtpZihBcnJheS5pc0FycmF5KHQpKXtpZigiZmxvYXQxNiI9PT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIkNyZWF0aW5nIGEgZmxvYXQxNiB0ZW5zb3IgZnJvbSBudW1iZXIgYXJyYXkgaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSBVaW50MTZBcnJheSBhcyBkYXRhLiIpO289InVpbnQ2NCI9PT1lfHwiaW50NjQiPT09ZT9uLmZyb20odCxCaWdJbnQpOm4uZnJvbSh0KTt9ZWxzZSB7aWYoISh0IGluc3RhbmNlb2YgbikpdGhyb3cgbmV3IFR5cGVFcnJvcihgQSAke3J9IHRlbnNvcidzIGRhdGEgbXVzdCBiZSB0eXBlIG9mICR7bn1gKTtvPXQ7fX1lbHNlIGlmKGw9dCxBcnJheS5pc0FycmF5KGUpKXtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGVuc29yIHR5cGUgY2Fubm90IGJlIGluZmVycmVkIGZyb20gYW4gZW1wdHkgYXJyYXkuIik7Y29uc3QgdD10eXBlb2YgZVswXTtpZigic3RyaW5nIj09PXQpcj0ic3RyaW5nIixvPWU7ZWxzZSB7aWYoImJvb2xlYW4iIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZSBvZiBkYXRhIGFycmF5OiAke3R9LmApO3I9ImJvb2wiLG89VWludDhBcnJheS5mcm9tKGUpO319ZWxzZSB7Y29uc3QgdD1hLmdldChlLmNvbnN0cnVjdG9yKTtpZih2b2lkIDA9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGUgZm9yIHRlbnNvciBkYXRhOiAke2UuY29uc3RydWN0b3J9LmApO3I9dCxvPWU7fWlmKHZvaWQgMD09PWwpbD1bby5sZW5ndGhdO2Vsc2UgaWYoIUFycmF5LmlzQXJyYXkobCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQSB0ZW5zb3IncyBkaW1zIG11c3QgYmUgYSBudW1iZXIgYXJyYXkiKTtjb25zdCBjPSgwLCBpLmNhbGN1bGF0ZVNpemUpKGwpO2lmKGMhPT1vLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYFRlbnNvcidzIHNpemUoJHtjfSkgZG9lcyBub3QgbWF0Y2ggZGF0YSBsZW5ndGgoJHtvLmxlbmd0aH0pLmApO3RoaXMuZGltcz1sLHRoaXMudHlwZT1yLHRoaXMuZGF0YT1vLHRoaXMuc2l6ZT1jO31zdGF0aWMgYXN5bmMgZnJvbUltYWdlKGUsdCl7cmV0dXJuICgwLCBvLnRlbnNvckZyb21JbWFnZSkoZSx0KX10b0RhdGFVUkwoZSl7cmV0dXJuICgwLCByLnRlbnNvclRvRGF0YVVSTCkodGhpcyxlKX10b0ltYWdlRGF0YShlKXtyZXR1cm4gKDAsIHIudGVuc29yVG9JbWFnZURhdGEpKHRoaXMsZSl9cmVzaGFwZShlKXtyZXR1cm4gKDAsIGkudGVuc29yUmVzaGFwZSkodGhpcyxlKX19O30sMTA2OihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC50ZW5zb3JSZXNoYXBlPXQuY2FsY3VsYXRlU2l6ZT12b2lkIDA7Y29uc3Qgcj1uKDk2Myk7dC5jYWxjdWxhdGVTaXplPWU9PntsZXQgdD0xO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdCByPWVbbl07aWYoIm51bWJlciIhPXR5cGVvZiByfHwhTnVtYmVyLmlzU2FmZUludGVnZXIocikpdGhyb3cgbmV3IFR5cGVFcnJvcihgZGltc1ske259XSBtdXN0IGJlIGFuIGludGVnZXIsIGdvdDogJHtyfWApO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgZGltc1ske259XSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIGdvdDogJHtyfWApO3QqPXI7fXJldHVybiB0fSx0LnRlbnNvclJlc2hhcGU9KGUsdCk9Pm5ldyByLlRlbnNvcihlLnR5cGUsZS5kYXRhLHQpO30sOTYzOihlLHQsbik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UZW5zb3I9dm9pZCAwO2NvbnN0IHI9big1OTU3KTt0LlRlbnNvcj1yLlRlbnNvcjt9LDkxMDQ6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC52ZXJzaW9uPXZvaWQgMCx0LnZlcnNpb249IjEuMTYuMyI7fSwxNTgzOihlLHQpPT57dmFyIG4scj1mdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5kZWZhdWx0PXZvaWQgMDt2YXIgdD1udWxsO3RyeXt0PW5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDEzLDIsOTYsMCwxLDEyNyw5Niw0LDEyNywxMjcsMTI3LDEyNywxLDEyNywzLDcsNiwwLDEsMSwxLDEsMSw2LDYsMSwxMjcsMSw2NSwwLDExLDcsNTAsNiwzLDEwOSwxMTcsMTA4LDAsMSw1LDEwMCwxMDUsMTE4LDk1LDExNSwwLDIsNSwxMDAsMTA1LDExOCw5NSwxMTcsMCwzLDUsMTE0LDEwMSwxMDksOTUsMTE1LDAsNCw1LDExNCwxMDEsMTA5LDk1LDExNywwLDUsOCwxMDMsMTAxLDExNiw5NSwxMDQsMTA1LDEwMywxMDQsMCwwLDEwLDE5MSwxLDYsNCwwLDM1LDAsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI2LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEyNywzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMSwzNiwxLDEsMTI2LDMyLDAsMTczLDMyLDEsMTczLDY2LDMyLDEzNCwxMzIsMzIsMiwxNzMsMzIsMywxNzMsNjYsMzIsMTM0LDEzMiwxMjgsMzQsNCw2NiwzMiwxMzUsMTY3LDM2LDAsMzIsNCwxNjcsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI5LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEzMCwzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMV0pKSx7fSkuZXhwb3J0czt9Y2F0Y2goZSl7fWZ1bmN0aW9uIG4oZSx0LG4pe3RoaXMubG93PTB8ZSx0aGlzLmhpZ2g9MHx0LHRoaXMudW5zaWduZWQ9ISFuO31mdW5jdGlvbiByKGUpe3JldHVybiAhMD09PShlJiZlLl9faXNMb25nX18pfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9TWF0aC5jbHozMihlJi1lKTtyZXR1cm4gZT8zMS10OnR9bi5wcm90b3R5cGUuX19pc0xvbmdfXyxPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsIl9faXNMb25nX18iLHt2YWx1ZTohMH0pLG4uaXNMb25nPXI7dmFyIGk9e30scz17fTtmdW5jdGlvbiBhKGUsdCl7dmFyIG4scixvO3JldHVybiB0PyhvPTA8PShlPj4+PTApJiZlPDI1NikmJihyPXNbZV0pP3I6KG49bChlLDAsITApLG8mJihzW2VdPW4pLG4pOihvPS0xMjg8PShlfD0wKSYmZTwxMjgpJiYocj1pW2VdKT9yOihuPWwoZSxlPDA/LTE6MCwhMSksbyYmKGlbZV09biksbil9ZnVuY3Rpb24gdShlLHQpe2lmKGlzTmFOKGUpKXJldHVybiB0P3k6bTtpZih0KXtpZihlPDApcmV0dXJuIHk7aWYoZT49aClyZXR1cm4geH1lbHNlIHtpZihlPD0tZylyZXR1cm4gTztpZihlKzE+PWcpcmV0dXJuIFR9cmV0dXJuIGU8MD91KC1lLHQpLm5lZygpOmwoZSVmfDAsZS9mfDAsdCl9ZnVuY3Rpb24gbChlLHQscil7cmV0dXJuIG5ldyBuKGUsdCxyKX1uLmZyb21JbnQ9YSxuLmZyb21OdW1iZXI9dSxuLmZyb21CaXRzPWw7dmFyIGM9TWF0aC5wb3c7ZnVuY3Rpb24gcChlLHQsbil7aWYoMD09PWUubGVuZ3RoKXRocm93IEVycm9yKCJlbXB0eSBzdHJpbmciKTtpZigibnVtYmVyIj09dHlwZW9mIHQ/KG49dCx0PSExKTp0PSEhdCwiTmFOIj09PWV8fCJJbmZpbml0eSI9PT1lfHwiK0luZmluaXR5Ij09PWV8fCItSW5maW5pdHkiPT09ZSlyZXR1cm4gdD95Om07aWYoKG49bnx8MTApPDJ8fDM2PG4pdGhyb3cgUmFuZ2VFcnJvcigicmFkaXgiKTt2YXIgcjtpZigocj1lLmluZGV4T2YoIi0iKSk+MCl0aHJvdyBFcnJvcigiaW50ZXJpb3IgaHlwaGVuIik7aWYoMD09PXIpcmV0dXJuIHAoZS5zdWJzdHJpbmcoMSksdCxuKS5uZWcoKTtmb3IodmFyIG89dShjKG4sOCkpLGk9bSxzPTA7czxlLmxlbmd0aDtzKz04KXt2YXIgYT1NYXRoLm1pbig4LGUubGVuZ3RoLXMpLGw9cGFyc2VJbnQoZS5zdWJzdHJpbmcocyxzK2EpLG4pO2lmKGE8OCl7dmFyIGQ9dShjKG4sYSkpO2k9aS5tdWwoZCkuYWRkKHUobCkpO31lbHNlIGk9KGk9aS5tdWwobykpLmFkZCh1KGwpKTt9cmV0dXJuIGkudW5zaWduZWQ9dCxpfWZ1bmN0aW9uIGQoZSx0KXtyZXR1cm4gIm51bWJlciI9PXR5cGVvZiBlP3UoZSx0KToic3RyaW5nIj09dHlwZW9mIGU/cChlLHQpOmwoZS5sb3csZS5oaWdoLCJib29sZWFuIj09dHlwZW9mIHQ/dDplLnVuc2lnbmVkKX1uLmZyb21TdHJpbmc9cCxuLmZyb21WYWx1ZT1kO3ZhciBmPTQyOTQ5NjcyOTYsaD1mKmYsZz1oLzIsYj1hKDE8PDI0KSxtPWEoMCk7bi5aRVJPPW07dmFyIHk9YSgwLCEwKTtuLlVaRVJPPXk7dmFyIHY9YSgxKTtuLk9ORT12O3ZhciBfPWEoMSwhMCk7bi5VT05FPV87dmFyIHc9YSgtMSk7bi5ORUdfT05FPXc7dmFyIFQ9bCgtMSwyMTQ3NDgzNjQ3LCExKTtuLk1BWF9WQUxVRT1UO3ZhciB4PWwoLTEsLTEsITApO24uTUFYX1VOU0lHTkVEX1ZBTFVFPXg7dmFyIE89bCgwLC0yMTQ3NDgzNjQ4LCExKTtuLk1JTl9WQUxVRT1PO3ZhciBTPW4ucHJvdG90eXBlO1MudG9JbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnNpZ25lZD90aGlzLmxvdz4+PjA6dGhpcy5sb3d9LFMudG9OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnNpZ25lZD8odGhpcy5oaWdoPj4+MCkqZisodGhpcy5sb3c+Pj4wKTp0aGlzLmhpZ2gqZisodGhpcy5sb3c+Pj4wKX0sUy50b1N0cmluZz1mdW5jdGlvbihlKXtpZigoZT1lfHwxMCk8Mnx8MzY8ZSl0aHJvdyBSYW5nZUVycm9yKCJyYWRpeCIpO2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuICIwIjtpZih0aGlzLmlzTmVnYXRpdmUoKSl7aWYodGhpcy5lcShPKSl7dmFyIHQ9dShlKSxuPXRoaXMuZGl2KHQpLHI9bi5tdWwodCkuc3ViKHRoaXMpO3JldHVybiBuLnRvU3RyaW5nKGUpK3IudG9JbnQoKS50b1N0cmluZyhlKX1yZXR1cm4gIi0iK3RoaXMubmVnKCkudG9TdHJpbmcoZSl9Zm9yKHZhciBvPXUoYyhlLDYpLHRoaXMudW5zaWduZWQpLGk9dGhpcyxzPSIiOzspe3ZhciBhPWkuZGl2KG8pLGw9KGkuc3ViKGEubXVsKG8pKS50b0ludCgpPj4+MCkudG9TdHJpbmcoZSk7aWYoKGk9YSkuaXNaZXJvKCkpcmV0dXJuIGwrcztmb3IoO2wubGVuZ3RoPDY7KWw9IjAiK2w7cz0iIitsK3M7fX0sUy5nZXRIaWdoQml0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2h9LFMuZ2V0SGlnaEJpdHNVbnNpZ25lZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2g+Pj4wfSxTLmdldExvd0JpdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb3d9LFMuZ2V0TG93Qml0c1Vuc2lnbmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG93Pj4+MH0sUy5nZXROdW1CaXRzQWJzPWZ1bmN0aW9uKCl7aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMuZXEoTyk/NjQ6dGhpcy5uZWcoKS5nZXROdW1CaXRzQWJzKCk7Zm9yKHZhciBlPTAhPXRoaXMuaGlnaD90aGlzLmhpZ2g6dGhpcy5sb3csdD0zMTt0PjAmJjA9PShlJjE8PHQpO3QtLSk7cmV0dXJuIDAhPXRoaXMuaGlnaD90KzMzOnQrMX0sUy5pc1plcm89ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuaGlnaCYmMD09PXRoaXMubG93fSxTLmVxej1TLmlzWmVybyxTLmlzTmVnYXRpdmU9ZnVuY3Rpb24oKXtyZXR1cm4gIXRoaXMudW5zaWduZWQmJnRoaXMuaGlnaDwwfSxTLmlzUG9zaXRpdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnNpZ25lZHx8dGhpcy5oaWdoPj0wfSxTLmlzT2RkPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PSgxJnRoaXMubG93KX0sUy5pc0V2ZW49ZnVuY3Rpb24oKXtyZXR1cm4gMD09KDEmdGhpcy5sb3cpfSxTLmVxdWFscz1mdW5jdGlvbihlKXtyZXR1cm4gcihlKXx8KGU9ZChlKSksKHRoaXMudW5zaWduZWQ9PT1lLnVuc2lnbmVkfHx0aGlzLmhpZ2g+Pj4zMSE9MXx8ZS5oaWdoPj4+MzEhPTEpJiZ0aGlzLmhpZ2g9PT1lLmhpZ2gmJnRoaXMubG93PT09ZS5sb3d9LFMuZXE9Uy5lcXVhbHMsUy5ub3RFcXVhbHM9ZnVuY3Rpb24oZSl7cmV0dXJuICF0aGlzLmVxKGUpfSxTLm5lcT1TLm5vdEVxdWFscyxTLm5lPVMubm90RXF1YWxzLFMubGVzc1RoYW49ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29tcChlKTwwfSxTLmx0PVMubGVzc1RoYW4sUy5sZXNzVGhhbk9yRXF1YWw9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29tcChlKTw9MH0sUy5sdGU9Uy5sZXNzVGhhbk9yRXF1YWwsUy5sZT1TLmxlc3NUaGFuT3JFcXVhbCxTLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbXAoZSk+MH0sUy5ndD1TLmdyZWF0ZXJUaGFuLFMuZ3JlYXRlclRoYW5PckVxdWFsPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbXAoZSk+PTB9LFMuZ3RlPVMuZ3JlYXRlclRoYW5PckVxdWFsLFMuZ2U9Uy5ncmVhdGVyVGhhbk9yRXF1YWwsUy5jb21wYXJlPWZ1bmN0aW9uKGUpe2lmKHIoZSl8fChlPWQoZSkpLHRoaXMuZXEoZSkpcmV0dXJuIDA7dmFyIHQ9dGhpcy5pc05lZ2F0aXZlKCksbj1lLmlzTmVnYXRpdmUoKTtyZXR1cm4gdCYmIW4/LTE6IXQmJm4/MTp0aGlzLnVuc2lnbmVkP2UuaGlnaD4+PjA+dGhpcy5oaWdoPj4+MHx8ZS5oaWdoPT09dGhpcy5oaWdoJiZlLmxvdz4+PjA+dGhpcy5sb3c+Pj4wPy0xOjE6dGhpcy5zdWIoZSkuaXNOZWdhdGl2ZSgpPy0xOjF9LFMuY29tcD1TLmNvbXBhcmUsUy5uZWdhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gIXRoaXMudW5zaWduZWQmJnRoaXMuZXEoTyk/Tzp0aGlzLm5vdCgpLmFkZCh2KX0sUy5uZWc9Uy5uZWdhdGUsUy5hZGQ9ZnVuY3Rpb24oZSl7cihlKXx8KGU9ZChlKSk7dmFyIHQ9dGhpcy5oaWdoPj4+MTYsbj02NTUzNSZ0aGlzLmhpZ2gsbz10aGlzLmxvdz4+PjE2LGk9NjU1MzUmdGhpcy5sb3cscz1lLmhpZ2g+Pj4xNixhPTY1NTM1JmUuaGlnaCx1PWUubG93Pj4+MTYsYz0wLHA9MCxmPTAsaD0wO3JldHVybiBmKz0oaCs9aSsoNjU1MzUmZS5sb3cpKT4+PjE2LHArPShmKz1vK3UpPj4+MTYsYys9KHArPW4rYSk+Pj4xNixjKz10K3MsbCgoZiY9NjU1MzUpPDwxNnwoaCY9NjU1MzUpLChjJj02NTUzNSk8PDE2fChwJj02NTUzNSksdGhpcy51bnNpZ25lZCl9LFMuc3VidHJhY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSl8fChlPWQoZSkpLHRoaXMuYWRkKGUubmVnKCkpfSxTLnN1Yj1TLnN1YnRyYWN0LFMubXVsdGlwbHk9ZnVuY3Rpb24oZSl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gdGhpcztpZihyKGUpfHwoZT1kKGUpKSx0KXJldHVybiBsKHQubXVsKHRoaXMubG93LHRoaXMuaGlnaCxlLmxvdyxlLmhpZ2gpLHQuZ2V0X2hpZ2goKSx0aGlzLnVuc2lnbmVkKTtpZihlLmlzWmVybygpKXJldHVybiB0aGlzLnVuc2lnbmVkP3k6bTtpZih0aGlzLmVxKE8pKXJldHVybiBlLmlzT2RkKCk/TzptO2lmKGUuZXEoTykpcmV0dXJuIHRoaXMuaXNPZGQoKT9POm07aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIGUuaXNOZWdhdGl2ZSgpP3RoaXMubmVnKCkubXVsKGUubmVnKCkpOnRoaXMubmVnKCkubXVsKGUpLm5lZygpO2lmKGUuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLm11bChlLm5lZygpKS5uZWcoKTtpZih0aGlzLmx0KGIpJiZlLmx0KGIpKXJldHVybiB1KHRoaXMudG9OdW1iZXIoKSplLnRvTnVtYmVyKCksdGhpcy51bnNpZ25lZCk7dmFyIG49dGhpcy5oaWdoPj4+MTYsbz02NTUzNSZ0aGlzLmhpZ2gsaT10aGlzLmxvdz4+PjE2LHM9NjU1MzUmdGhpcy5sb3csYT1lLmhpZ2g+Pj4xNixjPTY1NTM1JmUuaGlnaCxwPWUubG93Pj4+MTYsZj02NTUzNSZlLmxvdyxoPTAsZz0wLHY9MCxfPTA7cmV0dXJuIHYrPShfKz1zKmYpPj4+MTYsZys9KHYrPWkqZik+Pj4xNix2Jj02NTUzNSxnKz0odis9cypwKT4+PjE2LGgrPShnKz1vKmYpPj4+MTYsZyY9NjU1MzUsaCs9KGcrPWkqcCk+Pj4xNixnJj02NTUzNSxoKz0oZys9cypjKT4+PjE2LGgrPW4qZitvKnAraSpjK3MqYSxsKCh2Jj02NTUzNSk8PDE2fChfJj02NTUzNSksKGgmPTY1NTM1KTw8MTZ8KGcmPTY1NTM1KSx0aGlzLnVuc2lnbmVkKX0sUy5tdWw9Uy5tdWx0aXBseSxTLmRpdmlkZT1mdW5jdGlvbihlKXtpZihyKGUpfHwoZT1kKGUpKSxlLmlzWmVybygpKXRocm93IEVycm9yKCJkaXZpc2lvbiBieSB6ZXJvIik7dmFyIG4sbyxpO2lmKHQpcmV0dXJuIHRoaXMudW5zaWduZWR8fC0yMTQ3NDgzNjQ4IT09dGhpcy5oaWdofHwtMSE9PWUubG93fHwtMSE9PWUuaGlnaD9sKCh0aGlzLnVuc2lnbmVkP3QuZGl2X3U6dC5kaXZfcykodGhpcy5sb3csdGhpcy5oaWdoLGUubG93LGUuaGlnaCksdC5nZXRfaGlnaCgpLHRoaXMudW5zaWduZWQpOnRoaXM7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gdGhpcy51bnNpZ25lZD95Om07aWYodGhpcy51bnNpZ25lZCl7aWYoZS51bnNpZ25lZHx8KGU9ZS50b1Vuc2lnbmVkKCkpLGUuZ3QodGhpcykpcmV0dXJuIHk7aWYoZS5ndCh0aGlzLnNocnUoMSkpKXJldHVybiBfO2k9eTt9ZWxzZSB7aWYodGhpcy5lcShPKSlyZXR1cm4gZS5lcSh2KXx8ZS5lcSh3KT9POmUuZXEoTyk/djoobj10aGlzLnNocigxKS5kaXYoZSkuc2hsKDEpKS5lcShtKT9lLmlzTmVnYXRpdmUoKT92Onc6KG89dGhpcy5zdWIoZS5tdWwobikpLGk9bi5hZGQoby5kaXYoZSkpKTtpZihlLmVxKE8pKXJldHVybiB0aGlzLnVuc2lnbmVkP3k6bTtpZih0aGlzLmlzTmVnYXRpdmUoKSlyZXR1cm4gZS5pc05lZ2F0aXZlKCk/dGhpcy5uZWcoKS5kaXYoZS5uZWcoKSk6dGhpcy5uZWcoKS5kaXYoZSkubmVnKCk7aWYoZS5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMuZGl2KGUubmVnKCkpLm5lZygpO2k9bTt9Zm9yKG89dGhpcztvLmd0ZShlKTspe249TWF0aC5tYXgoMSxNYXRoLmZsb29yKG8udG9OdW1iZXIoKS9lLnRvTnVtYmVyKCkpKTtmb3IodmFyIHM9TWF0aC5jZWlsKE1hdGgubG9nKG4pL01hdGguTE4yKSxhPXM8PTQ4PzE6YygyLHMtNDgpLHA9dShuKSxmPXAubXVsKGUpO2YuaXNOZWdhdGl2ZSgpfHxmLmd0KG8pOylmPShwPXUobi09YSx0aGlzLnVuc2lnbmVkKSkubXVsKGUpO3AuaXNaZXJvKCkmJihwPXYpLGk9aS5hZGQocCksbz1vLnN1YihmKTt9cmV0dXJuIGl9LFMuZGl2PVMuZGl2aWRlLFMubW9kdWxvPWZ1bmN0aW9uKGUpe3JldHVybiByKGUpfHwoZT1kKGUpKSx0P2woKHRoaXMudW5zaWduZWQ/dC5yZW1fdTp0LnJlbV9zKSh0aGlzLmxvdyx0aGlzLmhpZ2gsZS5sb3csZS5oaWdoKSx0LmdldF9oaWdoKCksdGhpcy51bnNpZ25lZCk6dGhpcy5zdWIodGhpcy5kaXYoZSkubXVsKGUpKX0sUy5tb2Q9Uy5tb2R1bG8sUy5yZW09Uy5tb2R1bG8sUy5ub3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbCh+dGhpcy5sb3csfnRoaXMuaGlnaCx0aGlzLnVuc2lnbmVkKX0sUy5jb3VudExlYWRpbmdaZXJvcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpZ2g/TWF0aC5jbHozMih0aGlzLmhpZ2gpOk1hdGguY2x6MzIodGhpcy5sb3cpKzMyfSxTLmNsej1TLmNvdW50TGVhZGluZ1plcm9zLFMuY291bnRUcmFpbGluZ1plcm9zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG93P28odGhpcy5sb3cpOm8odGhpcy5oaWdoKSszMn0sUy5jdHo9Uy5jb3VudFRyYWlsaW5nWmVyb3MsUy5hbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSl8fChlPWQoZSkpLGwodGhpcy5sb3cmZS5sb3csdGhpcy5oaWdoJmUuaGlnaCx0aGlzLnVuc2lnbmVkKX0sUy5vcj1mdW5jdGlvbihlKXtyZXR1cm4gcihlKXx8KGU9ZChlKSksbCh0aGlzLmxvd3xlLmxvdyx0aGlzLmhpZ2h8ZS5oaWdoLHRoaXMudW5zaWduZWQpfSxTLnhvcj1mdW5jdGlvbihlKXtyZXR1cm4gcihlKXx8KGU9ZChlKSksbCh0aGlzLmxvd15lLmxvdyx0aGlzLmhpZ2heZS5oaWdoLHRoaXMudW5zaWduZWQpfSxTLnNoaWZ0TGVmdD1mdW5jdGlvbihlKXtyZXR1cm4gcihlKSYmKGU9ZS50b0ludCgpKSwwPT0oZSY9NjMpP3RoaXM6ZTwzMj9sKHRoaXMubG93PDxlLHRoaXMuaGlnaDw8ZXx0aGlzLmxvdz4+PjMyLWUsdGhpcy51bnNpZ25lZCk6bCgwLHRoaXMubG93PDxlLTMyLHRoaXMudW5zaWduZWQpfSxTLnNobD1TLnNoaWZ0TGVmdCxTLnNoaWZ0UmlnaHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSkmJihlPWUudG9JbnQoKSksMD09KGUmPTYzKT90aGlzOmU8MzI/bCh0aGlzLmxvdz4+PmV8dGhpcy5oaWdoPDwzMi1lLHRoaXMuaGlnaD4+ZSx0aGlzLnVuc2lnbmVkKTpsKHRoaXMuaGlnaD4+ZS0zMix0aGlzLmhpZ2g+PTA/MDotMSx0aGlzLnVuc2lnbmVkKX0sUy5zaHI9Uy5zaGlmdFJpZ2h0LFMuc2hpZnRSaWdodFVuc2lnbmVkPWZ1bmN0aW9uKGUpe3JldHVybiByKGUpJiYoZT1lLnRvSW50KCkpLDA9PShlJj02Myk/dGhpczplPDMyP2wodGhpcy5sb3c+Pj5lfHRoaXMuaGlnaDw8MzItZSx0aGlzLmhpZ2g+Pj5lLHRoaXMudW5zaWduZWQpOmwoMzI9PT1lP3RoaXMuaGlnaDp0aGlzLmhpZ2g+Pj5lLTMyLDAsdGhpcy51bnNpZ25lZCl9LFMuc2hydT1TLnNoaWZ0UmlnaHRVbnNpZ25lZCxTLnNocl91PVMuc2hpZnRSaWdodFVuc2lnbmVkLFMucm90YXRlTGVmdD1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gcihlKSYmKGU9ZS50b0ludCgpKSwwPT0oZSY9NjMpP3RoaXM6MzI9PT1lP2wodGhpcy5oaWdoLHRoaXMubG93LHRoaXMudW5zaWduZWQpOmU8MzI/KHQ9MzItZSxsKHRoaXMubG93PDxlfHRoaXMuaGlnaD4+PnQsdGhpcy5oaWdoPDxlfHRoaXMubG93Pj4+dCx0aGlzLnVuc2lnbmVkKSk6KHQ9MzItKGUtPTMyKSxsKHRoaXMuaGlnaDw8ZXx0aGlzLmxvdz4+PnQsdGhpcy5sb3c8PGV8dGhpcy5oaWdoPj4+dCx0aGlzLnVuc2lnbmVkKSl9LFMucm90bD1TLnJvdGF0ZUxlZnQsUy5yb3RhdGVSaWdodD1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gcihlKSYmKGU9ZS50b0ludCgpKSwwPT0oZSY9NjMpP3RoaXM6MzI9PT1lP2wodGhpcy5oaWdoLHRoaXMubG93LHRoaXMudW5zaWduZWQpOmU8MzI/KHQ9MzItZSxsKHRoaXMuaGlnaDw8dHx0aGlzLmxvdz4+PmUsdGhpcy5sb3c8PHR8dGhpcy5oaWdoPj4+ZSx0aGlzLnVuc2lnbmVkKSk6KHQ9MzItKGUtPTMyKSxsKHRoaXMubG93PDx0fHRoaXMuaGlnaD4+PmUsdGhpcy5oaWdoPDx0fHRoaXMubG93Pj4+ZSx0aGlzLnVuc2lnbmVkKSl9LFMucm90cj1TLnJvdGF0ZVJpZ2h0LFMudG9TaWduZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnNpZ25lZD9sKHRoaXMubG93LHRoaXMuaGlnaCwhMSk6dGhpc30sUy50b1Vuc2lnbmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5zaWduZWQ/dGhpczpsKHRoaXMubG93LHRoaXMuaGlnaCwhMCl9LFMudG9CeXRlcz1mdW5jdGlvbihlKXtyZXR1cm4gZT90aGlzLnRvQnl0ZXNMRSgpOnRoaXMudG9CeXRlc0JFKCl9LFMudG9CeXRlc0xFPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oaWdoLHQ9dGhpcy5sb3c7cmV0dXJuIFsyNTUmdCx0Pj4+OCYyNTUsdD4+PjE2JjI1NSx0Pj4+MjQsMjU1JmUsZT4+PjgmMjU1LGU+Pj4xNiYyNTUsZT4+PjI0XX0sUy50b0J5dGVzQkU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmhpZ2gsdD10aGlzLmxvdztyZXR1cm4gW2U+Pj4yNCxlPj4+MTYmMjU1LGU+Pj44JjI1NSwyNTUmZSx0Pj4+MjQsdD4+PjE2JjI1NSx0Pj4+OCYyNTUsMjU1JnRdfSxuLmZyb21CeXRlcz1mdW5jdGlvbihlLHQscil7cmV0dXJuIHI/bi5mcm9tQnl0ZXNMRShlLHQpOm4uZnJvbUJ5dGVzQkUoZSx0KX0sbi5mcm9tQnl0ZXNMRT1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgbihlWzBdfGVbMV08PDh8ZVsyXTw8MTZ8ZVszXTw8MjQsZVs0XXxlWzVdPDw4fGVbNl08PDE2fGVbN108PDI0LHQpfSxuLmZyb21CeXRlc0JFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBuKGVbNF08PDI0fGVbNV08PDE2fGVbNl08PDh8ZVs3XSxlWzBdPDwyNHxlWzFdPDwxNnxlWzJdPDw4fGVbM10sdCl9O3ZhciBBPW47cmV0dXJuIGUuZGVmYXVsdD1BLCJkZWZhdWx0ImluIGU/ZS5kZWZhdWx0OmV9KHt9KTt2b2lkIDA9PT0obj1mdW5jdGlvbigpe3JldHVybiByfS5hcHBseSh0LFtdKSl8fChlLmV4cG9ydHM9bik7fSw1Njg2OihlLHQsbik9PntuLnIodCksbi5kKHQse2ZsYXRidWZmZXJzOigpPT5yfSk7dmFyIHI9e307ci5PZmZzZXQsci5UYWJsZSxyLlNJWkVPRl9TSE9SVD0yLHIuU0laRU9GX0lOVD00LHIuRklMRV9JREVOVElGSUVSX0xFTkdUSD00LHIuU0laRV9QUkVGSVhfTEVOR1RIPTQsci5FbmNvZGluZz17VVRGOF9CWVRFUzoxLFVURjE2X1NUUklORzoyfSxyLmludDMyPW5ldyBJbnQzMkFycmF5KDIpLHIuZmxvYXQzMj1uZXcgRmxvYXQzMkFycmF5KHIuaW50MzIuYnVmZmVyKSxyLmZsb2F0NjQ9bmV3IEZsb2F0NjRBcnJheShyLmludDMyLmJ1ZmZlciksci5pc0xpdHRsZUVuZGlhbj0xPT09bmV3IFVpbnQxNkFycmF5KG5ldyBVaW50OEFycmF5KFsxLDBdKS5idWZmZXIpWzBdLHIuTG9uZz1mdW5jdGlvbihlLHQpe3RoaXMubG93PTB8ZSx0aGlzLmhpZ2g9MHx0O30sci5Mb25nLmNyZWF0ZT1mdW5jdGlvbihlLHQpe3JldHVybiAwPT1lJiYwPT10P3IuTG9uZy5aRVJPOm5ldyByLkxvbmcoZSx0KX0sci5Mb25nLnByb3RvdHlwZS50b0Zsb2F0NjQ9ZnVuY3Rpb24oKXtyZXR1cm4gKHRoaXMubG93Pj4+MCkrNDI5NDk2NzI5Nip0aGlzLmhpZ2h9LHIuTG9uZy5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxvdz09ZS5sb3cmJnRoaXMuaGlnaD09ZS5oaWdofSxyLkxvbmcuWkVSTz1uZXcgci5Mb25nKDAsMCksci5CdWlsZGVyPWZ1bmN0aW9uKGUpe2lmKGUpdD1lO2Vsc2UgdmFyIHQ9MTAyNDt0aGlzLmJiPXIuQnl0ZUJ1ZmZlci5hbGxvY2F0ZSh0KSx0aGlzLnNwYWNlPXQsdGhpcy5taW5hbGlnbj0xLHRoaXMudnRhYmxlPW51bGwsdGhpcy52dGFibGVfaW5fdXNlPTAsdGhpcy5pc05lc3RlZD0hMSx0aGlzLm9iamVjdF9zdGFydD0wLHRoaXMudnRhYmxlcz1bXSx0aGlzLnZlY3Rvcl9udW1fZWxlbXM9MCx0aGlzLmZvcmNlX2RlZmF1bHRzPSExO30sci5CdWlsZGVyLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuYmIuY2xlYXIoKSx0aGlzLnNwYWNlPXRoaXMuYmIuY2FwYWNpdHkoKSx0aGlzLm1pbmFsaWduPTEsdGhpcy52dGFibGU9bnVsbCx0aGlzLnZ0YWJsZV9pbl91c2U9MCx0aGlzLmlzTmVzdGVkPSExLHRoaXMub2JqZWN0X3N0YXJ0PTAsdGhpcy52dGFibGVzPVtdLHRoaXMudmVjdG9yX251bV9lbGVtcz0wLHRoaXMuZm9yY2VfZGVmYXVsdHM9ITE7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmZvcmNlRGVmYXVsdHM9ZnVuY3Rpb24oZSl7dGhpcy5mb3JjZV9kZWZhdWx0cz1lO30sci5CdWlsZGVyLnByb3RvdHlwZS5kYXRhQnVmZmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmJ9LHIuQnVpbGRlci5wcm90b3R5cGUuYXNVaW50OEFycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmIuYnl0ZXMoKS5zdWJhcnJheSh0aGlzLmJiLnBvc2l0aW9uKCksdGhpcy5iYi5wb3NpdGlvbigpK3RoaXMub2Zmc2V0KCkpfSxyLkJ1aWxkZXIucHJvdG90eXBlLnByZXA9ZnVuY3Rpb24oZSx0KXtlPnRoaXMubWluYWxpZ24mJih0aGlzLm1pbmFsaWduPWUpO2Zvcih2YXIgbj0xK34odGhpcy5iYi5jYXBhY2l0eSgpLXRoaXMuc3BhY2UrdCkmZS0xO3RoaXMuc3BhY2U8bitlK3Q7KXt2YXIgbz10aGlzLmJiLmNhcGFjaXR5KCk7dGhpcy5iYj1yLkJ1aWxkZXIuZ3Jvd0J5dGVCdWZmZXIodGhpcy5iYiksdGhpcy5zcGFjZSs9dGhpcy5iYi5jYXBhY2l0eSgpLW87fXRoaXMucGFkKG4pO30sci5CdWlsZGVyLnByb3RvdHlwZS5wYWQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlO3QrKyl0aGlzLmJiLndyaXRlSW50OCgtLXRoaXMuc3BhY2UsMCk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlKXt0aGlzLmJiLndyaXRlSW50OCh0aGlzLnNwYWNlLT0xLGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS53cml0ZUludDE2PWZ1bmN0aW9uKGUpe3RoaXMuYmIud3JpdGVJbnQxNih0aGlzLnNwYWNlLT0yLGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS53cml0ZUludDMyPWZ1bmN0aW9uKGUpe3RoaXMuYmIud3JpdGVJbnQzMih0aGlzLnNwYWNlLT00LGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS53cml0ZUludDY0PWZ1bmN0aW9uKGUpe3RoaXMuYmIud3JpdGVJbnQ2NCh0aGlzLnNwYWNlLT04LGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS53cml0ZUZsb2F0MzI9ZnVuY3Rpb24oZSl7dGhpcy5iYi53cml0ZUZsb2F0MzIodGhpcy5zcGFjZS09NCxlKTt9LHIuQnVpbGRlci5wcm90b3R5cGUud3JpdGVGbG9hdDY0PWZ1bmN0aW9uKGUpe3RoaXMuYmIud3JpdGVGbG9hdDY0KHRoaXMuc3BhY2UtPTgsZSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEludDg9ZnVuY3Rpb24oZSl7dGhpcy5wcmVwKDEsMCksdGhpcy53cml0ZUludDgoZSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEludDE2PWZ1bmN0aW9uKGUpe3RoaXMucHJlcCgyLDApLHRoaXMud3JpdGVJbnQxNihlKTt9LHIuQnVpbGRlci5wcm90b3R5cGUuYWRkSW50MzI9ZnVuY3Rpb24oZSl7dGhpcy5wcmVwKDQsMCksdGhpcy53cml0ZUludDMyKGUpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRJbnQ2ND1mdW5jdGlvbihlKXt0aGlzLnByZXAoOCwwKSx0aGlzLndyaXRlSW50NjQoZSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZsb2F0MzI9ZnVuY3Rpb24oZSl7dGhpcy5wcmVwKDQsMCksdGhpcy53cml0ZUZsb2F0MzIoZSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZsb2F0NjQ9ZnVuY3Rpb24oZSl7dGhpcy5wcmVwKDgsMCksdGhpcy53cml0ZUZsb2F0NjQoZSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZpZWxkSW50OD1mdW5jdGlvbihlLHQsbil7KHRoaXMuZm9yY2VfZGVmYXVsdHN8fHQhPW4pJiYodGhpcy5hZGRJbnQ4KHQpLHRoaXMuc2xvdChlKSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZpZWxkSW50MTY9ZnVuY3Rpb24oZSx0LG4peyh0aGlzLmZvcmNlX2RlZmF1bHRzfHx0IT1uKSYmKHRoaXMuYWRkSW50MTYodCksdGhpcy5zbG90KGUpKTt9LHIuQnVpbGRlci5wcm90b3R5cGUuYWRkRmllbGRJbnQzMj1mdW5jdGlvbihlLHQsbil7KHRoaXMuZm9yY2VfZGVmYXVsdHN8fHQhPW4pJiYodGhpcy5hZGRJbnQzMih0KSx0aGlzLnNsb3QoZSkpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZEludDY0PWZ1bmN0aW9uKGUsdCxuKXshdGhpcy5mb3JjZV9kZWZhdWx0cyYmdC5lcXVhbHMobil8fCh0aGlzLmFkZEludDY0KHQpLHRoaXMuc2xvdChlKSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZpZWxkRmxvYXQzMj1mdW5jdGlvbihlLHQsbil7KHRoaXMuZm9yY2VfZGVmYXVsdHN8fHQhPW4pJiYodGhpcy5hZGRGbG9hdDMyKHQpLHRoaXMuc2xvdChlKSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZpZWxkRmxvYXQ2ND1mdW5jdGlvbihlLHQsbil7KHRoaXMuZm9yY2VfZGVmYXVsdHN8fHQhPW4pJiYodGhpcy5hZGRGbG9hdDY0KHQpLHRoaXMuc2xvdChlKSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmFkZEZpZWxkT2Zmc2V0PWZ1bmN0aW9uKGUsdCxuKXsodGhpcy5mb3JjZV9kZWZhdWx0c3x8dCE9bikmJih0aGlzLmFkZE9mZnNldCh0KSx0aGlzLnNsb3QoZSkpO30sci5CdWlsZGVyLnByb3RvdHlwZS5hZGRGaWVsZFN0cnVjdD1mdW5jdGlvbihlLHQsbil7dCE9biYmKHRoaXMubmVzdGVkKHQpLHRoaXMuc2xvdChlKSk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLm5lc3RlZD1mdW5jdGlvbihlKXtpZihlIT10aGlzLm9mZnNldCgpKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IHN0cnVjdCBtdXN0IGJlIHNlcmlhbGl6ZWQgaW5saW5lLiIpfSxyLkJ1aWxkZXIucHJvdG90eXBlLm5vdE5lc3RlZD1mdW5jdGlvbigpe2lmKHRoaXMuaXNOZXN0ZWQpdGhyb3cgbmV3IEVycm9yKCJGbGF0QnVmZmVyczogb2JqZWN0IHNlcmlhbGl6YXRpb24gbXVzdCBub3QgYmUgbmVzdGVkLiIpfSxyLkJ1aWxkZXIucHJvdG90eXBlLnNsb3Q9ZnVuY3Rpb24oZSl7dGhpcy52dGFibGVbZV09dGhpcy5vZmZzZXQoKTt9LHIuQnVpbGRlci5wcm90b3R5cGUub2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmIuY2FwYWNpdHkoKS10aGlzLnNwYWNlfSxyLkJ1aWxkZXIuZ3Jvd0J5dGVCdWZmZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jYXBhY2l0eSgpO2lmKDMyMjEyMjU0NzImdCl0aHJvdyBuZXcgRXJyb3IoIkZsYXRCdWZmZXJzOiBjYW5ub3QgZ3JvdyBidWZmZXIgYmV5b25kIDIgZ2lnYWJ5dGVzLiIpO3ZhciBuPXQ8PDEsbz1yLkJ5dGVCdWZmZXIuYWxsb2NhdGUobik7cmV0dXJuIG8uc2V0UG9zaXRpb24obi10KSxvLmJ5dGVzKCkuc2V0KGUuYnl0ZXMoKSxuLXQpLG99LHIuQnVpbGRlci5wcm90b3R5cGUuYWRkT2Zmc2V0PWZ1bmN0aW9uKGUpe3RoaXMucHJlcChyLlNJWkVPRl9JTlQsMCksdGhpcy53cml0ZUludDMyKHRoaXMub2Zmc2V0KCktZStyLlNJWkVPRl9JTlQpO30sci5CdWlsZGVyLnByb3RvdHlwZS5zdGFydE9iamVjdD1mdW5jdGlvbihlKXt0aGlzLm5vdE5lc3RlZCgpLG51bGw9PXRoaXMudnRhYmxlJiYodGhpcy52dGFibGU9W10pLHRoaXMudnRhYmxlX2luX3VzZT1lO2Zvcih2YXIgdD0wO3Q8ZTt0KyspdGhpcy52dGFibGVbdF09MDt0aGlzLmlzTmVzdGVkPSEwLHRoaXMub2JqZWN0X3N0YXJ0PXRoaXMub2Zmc2V0KCk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmVuZE9iamVjdD1mdW5jdGlvbigpe2lmKG51bGw9PXRoaXMudnRhYmxlfHwhdGhpcy5pc05lc3RlZCl0aHJvdyBuZXcgRXJyb3IoIkZsYXRCdWZmZXJzOiBlbmRPYmplY3QgY2FsbGVkIHdpdGhvdXQgc3RhcnRPYmplY3QiKTt0aGlzLmFkZEludDMyKDApO2Zvcih2YXIgZT10aGlzLm9mZnNldCgpLHQ9dGhpcy52dGFibGVfaW5fdXNlLTE7dD49MCYmMD09dGhpcy52dGFibGVbdF07dC0tKTtmb3IodmFyIG49dCsxO3Q+PTA7dC0tKXRoaXMuYWRkSW50MTYoMCE9dGhpcy52dGFibGVbdF0/ZS10aGlzLnZ0YWJsZVt0XTowKTt0aGlzLmFkZEludDE2KGUtdGhpcy5vYmplY3Rfc3RhcnQpO3ZhciBvPShuKzIpKnIuU0laRU9GX1NIT1JUO3RoaXMuYWRkSW50MTYobyk7dmFyIGk9MCxzPXRoaXMuc3BhY2U7ZTpmb3IodD0wO3Q8dGhpcy52dGFibGVzLmxlbmd0aDt0Kyspe3ZhciBhPXRoaXMuYmIuY2FwYWNpdHkoKS10aGlzLnZ0YWJsZXNbdF07aWYobz09dGhpcy5iYi5yZWFkSW50MTYoYSkpe2Zvcih2YXIgdT1yLlNJWkVPRl9TSE9SVDt1PG87dSs9ci5TSVpFT0ZfU0hPUlQpaWYodGhpcy5iYi5yZWFkSW50MTYocyt1KSE9dGhpcy5iYi5yZWFkSW50MTYoYSt1KSljb250aW51ZSBlO2k9dGhpcy52dGFibGVzW3RdO2JyZWFrfX1yZXR1cm4gaT8odGhpcy5zcGFjZT10aGlzLmJiLmNhcGFjaXR5KCktZSx0aGlzLmJiLndyaXRlSW50MzIodGhpcy5zcGFjZSxpLWUpKToodGhpcy52dGFibGVzLnB1c2godGhpcy5vZmZzZXQoKSksdGhpcy5iYi53cml0ZUludDMyKHRoaXMuYmIuY2FwYWNpdHkoKS1lLHRoaXMub2Zmc2V0KCktZSkpLHRoaXMuaXNOZXN0ZWQ9ITEsZX0sci5CdWlsZGVyLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPW4/ci5TSVpFX1BSRUZJWF9MRU5HVEg6MDtpZih0KXt2YXIgaT10O2lmKHRoaXMucHJlcCh0aGlzLm1pbmFsaWduLHIuU0laRU9GX0lOVCtyLkZJTEVfSURFTlRJRklFUl9MRU5HVEgrbyksaS5sZW5ndGghPXIuRklMRV9JREVOVElGSUVSX0xFTkdUSCl0aHJvdyBuZXcgRXJyb3IoIkZsYXRCdWZmZXJzOiBmaWxlIGlkZW50aWZpZXIgbXVzdCBiZSBsZW5ndGggIityLkZJTEVfSURFTlRJRklFUl9MRU5HVEgpO2Zvcih2YXIgcz1yLkZJTEVfSURFTlRJRklFUl9MRU5HVEgtMTtzPj0wO3MtLSl0aGlzLndyaXRlSW50OChpLmNoYXJDb2RlQXQocykpO310aGlzLnByZXAodGhpcy5taW5hbGlnbixyLlNJWkVPRl9JTlQrbyksdGhpcy5hZGRPZmZzZXQoZSksbyYmdGhpcy5hZGRJbnQzMih0aGlzLmJiLmNhcGFjaXR5KCktdGhpcy5zcGFjZSksdGhpcy5iYi5zZXRQb3NpdGlvbih0aGlzLnNwYWNlKTt9LHIuQnVpbGRlci5wcm90b3R5cGUuZmluaXNoU2l6ZVByZWZpeGVkPWZ1bmN0aW9uKGUsdCl7dGhpcy5maW5pc2goZSx0LCEwKTt9LHIuQnVpbGRlci5wcm90b3R5cGUucmVxdWlyZWRGaWVsZD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYmIuY2FwYWNpdHkoKS1lLHI9bi10aGlzLmJiLnJlYWRJbnQzMihuKTtpZigwPT10aGlzLmJiLnJlYWRJbnQxNihyK3QpKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IGZpZWxkICIrdCsiIG11c3QgYmUgc2V0Iil9LHIuQnVpbGRlci5wcm90b3R5cGUuc3RhcnRWZWN0b3I9ZnVuY3Rpb24oZSx0LG4pe3RoaXMubm90TmVzdGVkKCksdGhpcy52ZWN0b3JfbnVtX2VsZW1zPXQsdGhpcy5wcmVwKHIuU0laRU9GX0lOVCxlKnQpLHRoaXMucHJlcChuLGUqdCk7fSxyLkJ1aWxkZXIucHJvdG90eXBlLmVuZFZlY3Rvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLndyaXRlSW50MzIodGhpcy52ZWN0b3JfbnVtX2VsZW1zKSx0aGlzLm9mZnNldCgpfSxyLkJ1aWxkZXIucHJvdG90eXBlLmNyZWF0ZVN0cmluZz1mdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheSl2YXIgdD1lO2Vsc2Uge3Q9W107Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDspe3ZhciByLG89ZS5jaGFyQ29kZUF0KG4rKyk7KHI9bzw1NTI5Nnx8bz49NTYzMjA/bzoobzw8MTApK2UuY2hhckNvZGVBdChuKyspKy01NjYxMzg4OCk8MTI4P3QucHVzaChyKToocjwyMDQ4P3QucHVzaChyPj42JjMxfDE5Mik6KHI8NjU1MzY/dC5wdXNoKHI+PjEyJjE1fDIyNCk6dC5wdXNoKHI+PjE4Jjd8MjQwLHI+PjEyJjYzfDEyOCksdC5wdXNoKHI+PjYmNjN8MTI4KSksdC5wdXNoKDYzJnJ8MTI4KSk7fX10aGlzLmFkZEludDgoMCksdGhpcy5zdGFydFZlY3RvcigxLHQubGVuZ3RoLDEpLHRoaXMuYmIuc2V0UG9zaXRpb24odGhpcy5zcGFjZS09dC5sZW5ndGgpLG49MDtmb3IodmFyIGk9dGhpcy5zcGFjZSxzPXRoaXMuYmIuYnl0ZXMoKTtuPHQubGVuZ3RoO24rKylzW2krK109dFtuXTtyZXR1cm4gdGhpcy5lbmRWZWN0b3IoKX0sci5CdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVMb25nPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuTG9uZy5jcmVhdGUoZSx0KX0sci5CeXRlQnVmZmVyPWZ1bmN0aW9uKGUpe3RoaXMuYnl0ZXNfPWUsdGhpcy5wb3NpdGlvbl89MDt9LHIuQnl0ZUJ1ZmZlci5hbGxvY2F0ZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHIuQnl0ZUJ1ZmZlcihuZXcgVWludDhBcnJheShlKSl9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnBvc2l0aW9uXz0wO30sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ5dGVzX30sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5wb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uX30sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5zZXRQb3NpdGlvbj1mdW5jdGlvbihlKXt0aGlzLnBvc2l0aW9uXz1lO30sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5jYXBhY2l0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ5dGVzXy5sZW5ndGh9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVhZFVpbnQ4KGUpPDwyND4+MjR9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQ4PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmJ5dGVzX1tlXX0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTY9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVhZFVpbnQxNihlKTw8MTY+PjE2fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MTY9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYnl0ZXNfW2VdfHRoaXMuYnl0ZXNfW2UrMV08PDh9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmJ5dGVzX1tlXXx0aGlzLmJ5dGVzX1tlKzFdPDw4fHRoaXMuYnl0ZXNfW2UrMl08PDE2fHRoaXMuYnl0ZXNfW2UrM108PDI0fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MzI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVhZEludDMyKGUpPj4+MH0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50NjQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyByLkxvbmcodGhpcy5yZWFkSW50MzIoZSksdGhpcy5yZWFkSW50MzIoZSs0KSl9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQ2ND1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHIuTG9uZyh0aGlzLnJlYWRVaW50MzIoZSksdGhpcy5yZWFkVWludDMyKGUrNCkpfSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdDMyPWZ1bmN0aW9uKGUpe3JldHVybiByLmludDMyWzBdPXRoaXMucmVhZEludDMyKGUpLHIuZmxvYXQzMlswXX0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXQ2ND1mdW5jdGlvbihlKXtyZXR1cm4gci5pbnQzMltyLmlzTGl0dGxlRW5kaWFuPzA6MV09dGhpcy5yZWFkSW50MzIoZSksci5pbnQzMltyLmlzTGl0dGxlRW5kaWFuPzE6MF09dGhpcy5yZWFkSW50MzIoZSs0KSxyLmZsb2F0NjRbMF19LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGUsdCl7dGhpcy5ieXRlc19bZV09dDt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50OD1mdW5jdGlvbihlLHQpe3RoaXMuYnl0ZXNfW2VdPXQ7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTY9ZnVuY3Rpb24oZSx0KXt0aGlzLmJ5dGVzX1tlXT10LHRoaXMuYnl0ZXNfW2UrMV09dD4+ODt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MTY9ZnVuY3Rpb24oZSx0KXt0aGlzLmJ5dGVzX1tlXT10LHRoaXMuYnl0ZXNfW2UrMV09dD4+ODt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMj1mdW5jdGlvbihlLHQpe3RoaXMuYnl0ZXNfW2VdPXQsdGhpcy5ieXRlc19bZSsxXT10Pj44LHRoaXMuYnl0ZXNfW2UrMl09dD4+MTYsdGhpcy5ieXRlc19bZSszXT10Pj4yNDt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MzI9ZnVuY3Rpb24oZSx0KXt0aGlzLmJ5dGVzX1tlXT10LHRoaXMuYnl0ZXNfW2UrMV09dD4+OCx0aGlzLmJ5dGVzX1tlKzJdPXQ+PjE2LHRoaXMuYnl0ZXNfW2UrM109dD4+MjQ7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlSW50NjQ9ZnVuY3Rpb24oZSx0KXt0aGlzLndyaXRlSW50MzIoZSx0LmxvdyksdGhpcy53cml0ZUludDMyKGUrNCx0LmhpZ2gpO30sci5CeXRlQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQ2ND1mdW5jdGlvbihlLHQpe3RoaXMud3JpdGVVaW50MzIoZSx0LmxvdyksdGhpcy53cml0ZVVpbnQzMihlKzQsdC5oaWdoKTt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdDMyPWZ1bmN0aW9uKGUsdCl7ci5mbG9hdDMyWzBdPXQsdGhpcy53cml0ZUludDMyKGUsci5pbnQzMlswXSk7fSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXQ2ND1mdW5jdGlvbihlLHQpe3IuZmxvYXQ2NFswXT10LHRoaXMud3JpdGVJbnQzMihlLHIuaW50MzJbci5pc0xpdHRsZUVuZGlhbj8wOjFdKSx0aGlzLndyaXRlSW50MzIoZSs0LHIuaW50MzJbci5pc0xpdHRsZUVuZGlhbj8xOjBdKTt9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuZ2V0QnVmZmVySWRlbnRpZmllcj1mdW5jdGlvbigpe2lmKHRoaXMuYnl0ZXNfLmxlbmd0aDx0aGlzLnBvc2l0aW9uXytyLlNJWkVPRl9JTlQrci5GSUxFX0lERU5USUZJRVJfTEVOR1RIKXRocm93IG5ldyBFcnJvcigiRmxhdEJ1ZmZlcnM6IEJ5dGVCdWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4gYW4gaWRlbnRpZmllci4iKTtmb3IodmFyIGU9IiIsdD0wO3Q8ci5GSUxFX0lERU5USUZJRVJfTEVOR1RIO3QrKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMucmVhZEludDgodGhpcy5wb3NpdGlvbl8rci5TSVpFT0ZfSU5UK3QpKTtyZXR1cm4gZX0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5fX29mZnNldD1mdW5jdGlvbihlLHQpe3ZhciBuPWUtdGhpcy5yZWFkSW50MzIoZSk7cmV0dXJuIHQ8dGhpcy5yZWFkSW50MTYobik/dGhpcy5yZWFkSW50MTYobit0KTowfSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLl9fdW5pb249ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5iYl9wb3M9dCt0aGlzLnJlYWRJbnQzMih0KSxlLmJiPXRoaXMsZX0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5fX3N0cmluZz1mdW5jdGlvbihlLHQpe2UrPXRoaXMucmVhZEludDMyKGUpO3ZhciBuPXRoaXMucmVhZEludDMyKGUpLG89IiIsaT0wO2lmKGUrPXIuU0laRU9GX0lOVCx0PT09ci5FbmNvZGluZy5VVEY4X0JZVEVTKXJldHVybiB0aGlzLmJ5dGVzXy5zdWJhcnJheShlLGUrbik7Zm9yKDtpPG47KXt2YXIgcyxhPXRoaXMucmVhZFVpbnQ4KGUraSsrKTtpZihhPDE5MilzPWE7ZWxzZSB7dmFyIHU9dGhpcy5yZWFkVWludDgoZStpKyspO2lmKGE8MjI0KXM9KDMxJmEpPDw2fDYzJnU7ZWxzZSB7dmFyIGw9dGhpcy5yZWFkVWludDgoZStpKyspO3M9YTwyNDA/KDE1JmEpPDwxMnwoNjMmdSk8PDZ8NjMmbDooNyZhKTw8MTh8KDYzJnUpPDwxMnwoNjMmbCk8PDZ8NjMmdGhpcy5yZWFkVWludDgoZStpKyspO319czw2NTUzNj9vKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpOihzLT02NTUzNixvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2KyhzPj4xMCksNTYzMjArKDEwMjMmcykpKTt9cmV0dXJuIG99LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX19pbmRpcmVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZSt0aGlzLnJlYWRJbnQzMihlKX0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5fX3ZlY3Rvcj1mdW5jdGlvbihlKXtyZXR1cm4gZSt0aGlzLnJlYWRJbnQzMihlKStyLlNJWkVPRl9JTlR9LHIuQnl0ZUJ1ZmZlci5wcm90b3R5cGUuX192ZWN0b3JfbGVuPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlYWRJbnQzMihlK3RoaXMucmVhZEludDMyKGUpKX0sci5CeXRlQnVmZmVyLnByb3RvdHlwZS5fX2hhc19pZGVudGlmaWVyPWZ1bmN0aW9uKGUpe2lmKGUubGVuZ3RoIT1yLkZJTEVfSURFTlRJRklFUl9MRU5HVEgpdGhyb3cgbmV3IEVycm9yKCJGbGF0QnVmZmVyczogZmlsZSBpZGVudGlmaWVyIG11c3QgYmUgbGVuZ3RoICIrci5GSUxFX0lERU5USUZJRVJfTEVOR1RIKTtmb3IodmFyIHQ9MDt0PHIuRklMRV9JREVOVElGSUVSX0xFTkdUSDt0KyspaWYoZS5jaGFyQ29kZUF0KHQpIT10aGlzLnJlYWRJbnQ4KHRoaXMucG9zaXRpb25fK3IuU0laRU9GX0lOVCt0KSlyZXR1cm4gITE7cmV0dXJuICEwfSxyLkJ5dGVCdWZmZXIucHJvdG90eXBlLmNyZWF0ZUxvbmc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci5Mb25nLmNyZWF0ZShlLHQpfTt9fSxfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX189e307ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhlKXt2YXIgdD1fX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bZV07aWYodm9pZCAwIT09dClyZXR1cm4gdC5leHBvcnRzO3ZhciBuPV9fd2VicGFja19tb2R1bGVfY2FjaGVfX1tlXT17ZXhwb3J0czp7fX07cmV0dXJuIF9fd2VicGFja19tb2R1bGVzX19bZV0uY2FsbChuLmV4cG9ydHMsbixuLmV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyksbi5leHBvcnRzfV9fd2VicGFja19yZXF1aXJlX18ubj1lPT57dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlPygpPT5lLmRlZmF1bHQ6KCk9PmU7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18uZCh0LHthOnR9KSx0fSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQ9KGUsdCk9Pntmb3IodmFyIG4gaW4gdClfX3dlYnBhY2tfcmVxdWlyZV9fLm8odCxuKSYmIV9fd2VicGFja19yZXF1aXJlX18ubyhlLG4pJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHtlbnVtZXJhYmxlOiEwLGdldDp0W25dfSk7fSxfX3dlYnBhY2tfcmVxdWlyZV9fLm89KGUsdCk9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpLF9fd2VicGFja19yZXF1aXJlX18ucj1lPT57InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt9O3ZhciBfX3dlYnBhY2tfZXhwb3J0c19fPV9fd2VicGFja19yZXF1aXJlX18oMTA1Nyk7cmV0dXJuIF9fd2VicGFja19leHBvcnRzX199KSgpLG1vZHVsZS5leHBvcnRzPXQoKTt9KShvcnRfbWluLG9ydF9taW4uZXhwb3J0cyk7dmFyIG9ydF9taW5FeHBvcnRzPW9ydF9taW4uZXhwb3J0cztnZXREZWZhdWx0RXhwb3J0RnJvbUNqcyhvcnRfbWluRXhwb3J0cyk7CgpjbGFzcyBXb3JrZXJOYXRpdmV7Y29uc3RydWN0b3IoKXt0aGlzLnJlYWR5PSExO29ydF9taW5FeHBvcnRzLmVudi53YXNtLndhc21QYXRocz0ie3tNRVRBX1VSTH19Iix0aGlzLmluZGV4ZWREQk1hbmFnZXI9bmV3IEluZGV4ZWREQk1hbmFnZXIoIm9uaXJpeC1zZGsiLCJmaWxlcyIpLHRoaXMuaW5kZXhlZERCTWFuYWdlci5nZXRGaWxlRnJvbUluZGV4ZWREQigiU0RLXzEuNi4xMyIpLnRoZW4oKGFzeW5jIHQ9PntsZXQgZT1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0XSx7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pKTtjb25zdHtkZWZhdWx0OmF9PWF3YWl0IGltcG9ydCgvKiB3ZWJwYWNrSWdub3JlOiB0cnVlLCB3ZWJwYWNrTW9kZTogImxhenkiICovZSksaT1hd2FpdCBhKCk7dGhpcy5uYXRpdmVTREs9aSx0aGlzLmNvYXJzZUZyYW1lPXRoaXMubmF0aXZlU0RLLl9tYWxsb2MoMzY4NjQwMCksdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmZyYW1lTGF5b3V0U3RydWN0PXRoaXMubmF0aXZlU0RLLl9tYWxsb2MoMjgpO2xldCBzPWF3YWl0IHRoaXMuaW5kZXhlZERCTWFuYWdlci5nZXRGcm9tQ2FjaGVPckZldGNoKCJjb2Fyc2Vsb2Mub25ueCIsImh0dHBzOi8vc2RrLm9uaXJpeC5jb20vY29tbW9uL2NvYXJzZWxvYy5vbm54Iik7Y29uc3Qgcj1hd2FpdCBvcnRfbWluRXhwb3J0cy5JbmZlcmVuY2VTZXNzaW9uLmNyZWF0ZShzLHtleGVjdXRpb25Qcm92aWRlcnM6WyJ3YXNtIl19KTt0aGlzLnNlc3Npb249cixhd2FpdCB0aGlzLnNlc3Npb24ucnVuKHtpbnB1dDpuZXcgb3J0X21pbkV4cG9ydHMuVGVuc29yKG5ldyBGbG9hdDMyQXJyYXkoQXJyYXkoOTIxNjAwKS5maWxsKDApKSxbMSwzLDY0MCw0ODBdKX0pLHRoaXMucmVhZHk9ITAscG9zdE1lc3NhZ2UoInJlYWR5Iik7fSkpO31zdGFydCgpe2FkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLChhc3luYyB0PT57aWYoIXRoaXMucmVhZHkpcmV0dXJuIHZvaWQgcG9zdE1lc3NhZ2UoITEpO3RoaXMucmVhZHk9ITE7Y29uc3QgZT10LmRhdGEsYT1lLndpZHRoKmUuaGVpZ2h0KjQ7MCE9dGhpcy5idWZmZXJMZW5ndGgmJnRoaXMuYnVmZmVyTGVuZ3RoPT1hfHwoMCE9dGhpcy5idWZmZXJMZW5ndGgmJnRoaXMubmF0aXZlU0RLLl9mcmVlKHRoaXMuYnVmZmVyKSx0aGlzLmJ1ZmZlckxlbmd0aD1hLHRoaXMuYnVmZmVyPXRoaXMubmF0aXZlU0RLLl9tYWxsb2ModGhpcy5idWZmZXJMZW5ndGgpKSx0aGlzLm5hdGl2ZVNESy5IRUFQVTguc2V0KGUuZGF0YSx0aGlzLmJ1ZmZlciksdGhpcy5uYXRpdmVTREsuSEVBUFUzMlt0aGlzLmZyYW1lTGF5b3V0U3RydWN0LzQrMF09ZS53aWR0aCx0aGlzLm5hdGl2ZVNESy5IRUFQVTMyW3RoaXMuZnJhbWVMYXlvdXRTdHJ1Y3QvNCsxXT1lLmhlaWdodCx0aGlzLm5hdGl2ZVNESy5IRUFQVTMyW3RoaXMuZnJhbWVMYXlvdXRTdHJ1Y3QvNCsyXT00KmUud2lkdGgsdGhpcy5uYXRpdmVTREsuSEVBUFUzMlt0aGlzLmZyYW1lTGF5b3V0U3RydWN0LzQrM109ITEsdGhpcy5uYXRpdmVTREsuSEVBUFUzMlt0aGlzLmZyYW1lTGF5b3V0U3RydWN0LzQrNF09ZS5jb2xvclNwYWNlLHRoaXMubmF0aXZlU0RLLkhFQVBVMzJbdGhpcy5mcmFtZUxheW91dFN0cnVjdC80KzVdPWUucm90YXRlLHRoaXMubmF0aXZlU0RLLkhFQVBVMzJbdGhpcy5mcmFtZUxheW91dFN0cnVjdC80KzZdPWUuZmxpcDtsZXQgaT10aGlzLm5hdGl2ZVNESy5fT1hfRXh0cmFjdCh0aGlzLmJ1ZmZlcix0aGlzLmNvYXJzZUZyYW1lLHRoaXMuZnJhbWVMYXlvdXRTdHJ1Y3QsZS5kdHlwZSkscz1bXTtmb3IobGV0IHQ9MDt0PDkyMTYwMDt0Kyspcy5wdXNoKHRoaXMubmF0aXZlU0RLLkhFQVBGMzJbdGhpcy5jb2Fyc2VGcmFtZS80K3RdKTtsZXQgcj1hd2FpdCB0aGlzLnNlc3Npb24ucnVuKHtpbnB1dDpuZXcgb3J0X21pbkV4cG9ydHMuVGVuc29yKG5ldyBGbG9hdDMyQXJyYXkocyksWzEsMyw2NDAsNDgwXSl9KTtwb3N0TWVzc2FnZSh7ZXh0cmFjdGlvbjpuZXcgRmxvYXQzMkFycmF5KHRoaXMucmVhZEV4dHJhY3Rpb25EYXRhKHRoaXMubmF0aXZlU0RLLkhFQVBGMzIsaS80KSksZGVzY3JpcHRvcjpyLm91dHB1dC5kYXRhfSksdGhpcy5yZWFkeT0hMDt9KSk7fXJlYWRFeHRyYWN0aW9uRGF0YSh0LGUpe2xldCBhPWUsaT1bXSxzPXRbYV07aS5wdXNoKHMpLGErKztmb3IobGV0IGU9MDtlPHM7ZSsrKWkucHVzaCh0W2FdKSxpLnB1c2godFthKzFdKSxhKz0yO2ZvcihsZXQgZT0wO2U8MTI4KnM7ZSsrKWkucHVzaCh0W2FdKSxhKys7cmV0dXJuIGl9fWNvbnN0IHdvcmtlcj1uZXcgV29ya2VyTmF0aXZlO3dvcmtlci5zdGFydCgpOwo=").replace("{{META_URL}}",new URL("./",import.meta.url)),d=new Blob([b],{type:"application/javascript"});this.workers[l]=new Worker(/* webpackIgnore: true, webpackMode: "lazy" */URL.createObjectURL(d),{type:"module"}),this.callbacks[l]=Z,this.workers[l].addEventListener("message",(Z=>{this.callbacks[l](Z.data);}));}}createMatchingWorker(l,Z){if(!this.workerExists(l)){let b=new Blob([atob("Y2xhc3MgSW5kZXhlZERCTWFuYWdlcntjb25zdHJ1Y3RvcihlLHIpe3RoaXMuZGJOYW1lPWUsdGhpcy5zdG9yZU5hbWU9cjt9YXN5bmMgZ2V0RnJvbUNhY2hlT3JGZXRjaChlLHIpe2xldCB0PW51bGw7dHJ5e3Q9YXdhaXQgdGhpcy5nZXRGaWxlRnJvbUluZGV4ZWREQihlKTt9Y2F0Y2goZSl7Y29uc29sZS5sb2coIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBnZXQgZWxlbWVudCBmcm9tIGluZGV4ZWREQi4iKTt9cmV0dXJuIHR8fCh0PWF3YWl0IHRoaXMuZmV0Y2hBbmRDYWNoZUZpbGUocixlKSksbmV3IFVpbnQ4QXJyYXkodCl9YXN5bmMgZ2V0RmlsZUZyb21JbmRleGVkREIoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCgocix0KT0+e2NvbnN0IG89aW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUpO28ub25lcnJvcj0oKT0+dChvLmVycm9yKSxvLm9uc3VjY2Vzcz0oKT0+e2NvbnN0IHM9by5yZXN1bHQudHJhbnNhY3Rpb24odGhpcy5zdG9yZU5hbWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLmdldChlKTtzLm9uc3VjY2Vzcz0oKT0+cihzLnJlc3VsdCkscy5vbmVycm9yPSgpPT50KHMuZXJyb3IpO30sby5vbnVwZ3JhZGVuZWVkZWQ9ZT0+e2UudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7fTt9KSl9YXN5bmMgc2F2ZUZpbGVUb0luZGV4ZWREQihlLHIpe3JldHVybiBuZXcgUHJvbWlzZSgoKHQsbyk9Pntjb25zdCBzPWluZGV4ZWREQi5vcGVuKHRoaXMuZGJOYW1lKTtzLm9uZXJyb3I9KCk9Pm8ocy5lcnJvcikscy5vbnVwZ3JhZGVuZWVkZWQ9ZT0+e2UudGFyZ2V0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7fSxzLm9uc3VjY2Vzcz0oKT0+e3RyeXtjb25zdCBuPXMucmVzdWx0LnRyYW5zYWN0aW9uKHRoaXMuc3RvcmVOYW1lLCJyZWFkd3JpdGUiKSxhPW4ub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpLnB1dChyLGUpO2Eub25zdWNjZXNzPSgpPT50KGEucmVzdWx0KSxhLm9uZXJyb3I9KCk9Pm8oYS5lcnJvcik7fWNhdGNoKGUpe28oZSk7fX07fSkpfWFzeW5jIGZldGNoQW5kQ2FjaGVGaWxlKGUscil7Y29uc3QgdD1hd2FpdCBmZXRjaChlKSxvPWF3YWl0IHQuYXJyYXlCdWZmZXIoKTtyZXR1cm4gYXdhaXQgdGhpcy5zYXZlRmlsZVRvSW5kZXhlZERCKHIsbyksb319CgpjbGFzcyBXb3JrZXJOYXRpdmV7Y29uc3RydWN0b3IoKXt0aGlzLnJlYWR5PSExO3RoaXMuaW5kZXhlZERCTWFuYWdlcj1uZXcgSW5kZXhlZERCTWFuYWdlcigib25pcml4LXNkayIsImZpbGVzIiksdGhpcy5pbmRleGVkREJNYW5hZ2VyLmdldEZpbGVGcm9tSW5kZXhlZERCKCJTREtfMS42LjEzIikudGhlbigoYXN5bmMgZT0+e2xldCB0PVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2VdLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSkpO2NvbnN0e2RlZmF1bHQ6YX09YXdhaXQgaW1wb3J0KC8qIHdlYnBhY2tJZ25vcmU6IHRydWUsIHdlYnBhY2tNb2RlOiAibGF6eSIgKi90KSxyPWF3YWl0IGEoKTt0aGlzLm5hdGl2ZVNESz1yLHRoaXMuZnJvbUJ1ZmZlcj10aGlzLm5hdGl2ZVNESy5fbWFsbG9jKDIyZTUpLHRoaXMudG9CdWZmZXI9dGhpcy5uYXRpdmVTREsuX21hbGxvYygyMmU1KSx0aGlzLnJlYWR5PSEwLHBvc3RNZXNzYWdlKCJyZWFkeSIpO30pKTt9c3RhcnQoKXthZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwoYXN5bmMgZT0+e2lmKCF0aGlzLnJlYWR5KXJldHVybjtjb25zdCB0PWUuZGF0YSxhPXQuZnJvbSxyPXQudG87dGhpcy5uYXRpdmVTREsuSEVBUEYzMi5zZXQoYSx0aGlzLmZyb21CdWZmZXIvNCksdGhpcy5uYXRpdmVTREsuSEVBUEYzMi5zZXQocix0aGlzLnRvQnVmZmVyLzQpO2xldCBzPXRoaXMubmF0aXZlU0RLLl9PWF9NYXRjaCh0aGlzLmZyb21CdWZmZXIsdGhpcy50b0J1ZmZlcix0LmR0eXBlKTtwb3N0TWVzc2FnZShuZXcgRmxvYXQzMkFycmF5KHRoaXMucmVhZE1hdGNoaW5nRGF0YSh0aGlzLm5hdGl2ZVNESy5IRUFQRjMyLHMvNCkpKTt9KSk7fXJlYWRNYXRjaGluZ0RhdGEoZSx0KXtsZXQgYT10LHI9W10scz1lW2FdO3IucHVzaChzKSxhKys7Zm9yKGxldCB0PTA7dDxzO3QrKylyLnB1c2goZVthXSksci5wdXNoKGVbYSsxXSksYSs9MjtyZXR1cm4gcn19Y29uc3Qgd29ya2VyPW5ldyBXb3JrZXJOYXRpdmU7d29ya2VyLnN0YXJ0KCk7Cg==")],{type:"application/javascript"});this.workers[l]=new Worker(/* webpackIgnore: true, webpackMode: "lazy" */URL.createObjectURL(b),{type:"module"}),this.callbacks[l]=Z,this.workers[l].addEventListener("message",(Z=>{this.callbacks[l](Z.data);}));}}replaceCallback(l,Z){this.workerExists(l)&&(this.callbacks[l]=Z);}sendDataToWorker(l,Z){this.workers[l].postMessage(Z);}async createWorkers(){return Promise.all([new Promise(((l,Z)=>{this.createExtractionWorker("extraction",(Z=>{"ready"===Z&&l();}));})),new Promise(((l,Z)=>{this.createMatchingWorker("matching",(Z=>{"ready"===Z&&l();}));}))])}}
50
50
 
51
- class WebXRManager{constructor(t,e,i,a){this.uiManager=t,this.nativeManager=e,this.deviceManager=i,this.workerManager=a;}async isWebXRSupported(){let t=!1;return navigator.xr&&(t=await navigator.xr.isSessionSupported("immersive-ar")),t}async init(t,e,i){this.onPose=e,this.onSessionEnd=i;const a=async()=>{const e=["hit-test"],i=["dom-overlay"];t&&i.push("camera-access");try{const t=await navigator.xr.requestSession("immersive-ar",{requiredFeatures:e,optionalFeatures:i,domOverlay:{root:document.body}});await this.onXRSessionStarted(t);}catch(t){throw new SensorsError(`error while initializing webXR API: ${t}`)}};window.navigator.userAgent.includes("OnirixPlayer")?await a():await this.uiManager.displayPermissionsDialog(a);}start(){this.started=!0,this.usingSpatial&&(this.relocating=!1,this.workerManager.replaceCallback("extraction",(t=>{if(!1===t)return void(this.relocating=!1);let e=this.nativeManager.loadExtractionData(t);this.candidates=Array.from(Array(e).keys()).reverse(),this.siftData=t.extraction,this.matchKeyframes();})),this.workerManager.replaceCallback("matching",(t=>{this.nativeManager.loadMatch(t),this.matchKeyframes();})));}matchKeyframes(){if(this.candidates.length>0){let t=this.candidates.pop();this.workerManager.sendDataToWorker("matching",new WorkerMatchingData(t,this.siftData,this.nativeManager.getCandidateData(t),this.nativeManager.extractionType()));}else this.nativeManager.spatialLocate(),this.relocating=!1;}async destroy(){this.xrSession&&(await this.xrSession.end(),this.xrSession=null,this.xrLastPose=null);}async onXRSessionStarted(t){let e=this.uiManager.renderCanvas.getContext("webgl2");e||(e=this.uiManager.renderCanvas.getContext("webgl")),e.getContextAttributes().xrCompatible||await e.makeXRCompatible(),this.xrContext=e,this.framebuffer=this.xrContext.createFramebuffer(),this.xrLayer=new XRWebGLLayer(t,this.xrContext),this.usingSpatial&&(navigator.userAgent.includes("OnirixPlayer")||(this.glBinding=new XRWebGLBinding(t,this.xrContext)),this.nativeManager.siftBuffer=this.nativeManager.nativeSDK._malloc(22e5),this.nativeManager.matchBuffer=this.nativeManager.nativeSDK._malloc(14e3),this.nativeManager.netvladBuffer=this.nativeManager.nativeSDK._malloc(32768)),t.updateRenderState({baseLayer:this.xrLayer}),this.xrLocalRefSpace=await t.requestReferenceSpace("local"),this.xrViewerRefSpace=await t.requestReferenceSpace("viewer"),this.xrHitTestSource=await t.requestHitTestSource({space:this.xrViewerRefSpace}),t.requestAnimationFrame(this.onXRFrame.bind(this)),window.navigator.userAgent.includes("WebXRViewer")?(window.addEventListener("click",(t=>{this.onTouch&&this.onTouch(this.getNormalizedTouchCoords(t));})),window.addEventListener("touchstart",(t=>{this.onTouchStart&&this.onTouchStart(this.getNormalizedTouchCoords(t));})),window.addEventListener("touchend",(t=>{this.onTouchEnd&&this.onTouchEnd(this.getNormalizedTouchCoords(t));}))):(t.addEventListener("select",(t=>{this.onTouch&&this.onTouch(this.getXRInputCoords(t));})),t.addEventListener("selectstart",(t=>{this.onTouchStart&&this.onTouchStart(this.getXRInputCoords(t));})),t.addEventListener("selectend",(t=>{this.onTouchEnd&&this.onTouchEnd(this.getXRInputCoords(t));}))),window.addEventListener("touchmove",(t=>{this.onTouchMove&&this.onTouchMove(this.getNormalizedTouchCoords(t));})),t.addEventListener("end",(()=>{this.onSessionEnd&&this.onSessionEnd();})),this.xrSession=t;}hasRelocated(){return this.usingSpatial&&this.nativeManager.xrTransform}needsRelocation(){return this.usingSpatial&&!this.hasRelocated()&&(null==this.lastRelocationTry||this.msSinceRelocation()>2500)}startRelocationTimer(){this.lastRelocationTry=new Date;}msSinceRelocation(){let t=new Date;return this.lastRelocationTry?t-this.lastRelocationTry:0}getCameraIntrinsics(t,e){const i=t,a=e.width,r=e.height;if(this.uiManager.isPortrait()){return [r/2*i[5]*Math.min(480/r,640/a),320,240]}return [r/2*i[5]*Math.min(640/r,480/a),320,240]}onXRFrame(t,e){let i=e.session;i.requestAnimationFrame(this.onXRFrame.bind(this));const a=e.getViewerPose(this.xrLocalRefSpace);if(a){if(this.needsRelocation()&&!this.relocating){let t,i,r;this.relocating=!0;const s=this.xrContext;this.nativeManager.lastXrPose=(new Matrix4).fromArray(a.views[0].transform.matrix).toArray(),(async()=>{if(navigator.userAgent.includes("OnirixPlayer")){const a=await e.getCameraImage();t=a.width,i=a.height;let[n,o,h]=this.nativeManager.getIntrinsics();Math.abs(n-a.focalLength)>1&&this.nativeManager.setIntrinsics(a.focalLength,320,240);const c=new Image;await new Promise((t=>{c.src=`data:image/jpeg;base64,${a.data}`,c.onload=()=>{t();};}));const d=s.createTexture();s.bindTexture(s.TEXTURE_2D,d),s.texImage2D(s.TEXTURE_2D,0,s.RGBA,s.RGBA,s.UNSIGNED_BYTE,c),r=d;}else {for(const e of a.views)e.camera&&(t=e.camera.width,i=e.camera.height,r=this.glBinding.getCameraImage(e.camera));if(!r)return}let n,o;this.cameraData||(this.cameraData=new Uint8ClampedArray(t*i*4)),s.bindTexture(s.TEXTURE_2D,r),s.bindFramebuffer(s.FRAMEBUFFER,this.framebuffer),s.framebufferTexture2D(s.FRAMEBUFFER,s.COLOR_ATTACHMENT0,s.TEXTURE_2D,r,0),s.readPixels(0,0,t,i,s.RGBA,s.UNSIGNED_BYTE,this.cameraData),this.uiManager.isPortrait()?(n=1,o=3):(n=2,o=0),console.log("Sending data to extraction worker!"),this.workerManager.sendDataToWorker("extraction",new WorkerExtractionData(this.cameraData,t,i,o,n,this.nativeManager.extractionType())),this.startRelocationTimer();})();}this.xrContext.bindFramebuffer(this.xrContext.FRAMEBUFFER,i.renderState.baseLayer.framebuffer);const t=a.views[0];let r=(new Matrix4).fromArray(t.transform.matrix);if(this.deviceManager.os===DeviceManager.OS.Android&&this.started&&this.lastPose&&!this.jumpPose){2*Math.acos(Math.abs((new Quaternion).setFromRotationMatrix(r).dot((new Quaternion).setFromRotationMatrix(this.lastPose))))>1&&(this.jumpPose=r);}if(this.jumpPose){const t=this.jumpPose.clone().invert().multiply(r);r=this.lastPose.clone().multiply(t);}else this.lastPose=r;this.hasRelocated()&&(r=(new Matrix4).fromArray(this.nativeManager.xrTransform.elements).multiply(r)),this.usingSpatial&&!this.hasRelocated()||this.onPose(r.toArray());const s=this.xrLayer.getViewport(t),n=s.width,o=s.height,h=null==this.xrLastPose||this.lastViewportWidth!=n||this.lastViewportHeight!=o;if(this.xrLastPose=a,this.lastViewportWidth=n,this.lastViewportHeight=o,h&&this.onResize&&this.onResize(),this.onHitTestResult){const t=e.getHitTestResults(this.xrHitTestSource);if(t.length>0){const e=t[0].getPose(this.xrLocalRefSpace),i=(new Matrix4).fromArray(e.transform.matrix),a=i.extractPosition(),s=((new Quaternion).setFromRotationMatrix(i),r.extractPosition()),n=Math.atan2(s.x-a.x,s.z-a.z),o={position:a,rotation:(new Quaternion).setFromEuler(new Euler(0,n,0))};this.onHitTestResult(o);}}}this.onFrame&&this.onFrame(e);}fitCanvasToXRViewport(){if(this.xrLastPose){const t=this.xrLastPose.views[0],e=this.xrLayer.getViewport(t);if((e.width>e.height&&window.innerWidth>window.innerHeight||e.width<=e.height&&window.innerWidth<=window.innerHeight)&&e.width*e.height>window.innerWidth*window.innerHeight)this.uiManager.renderCanvas.width=e.width,this.uiManager.renderCanvas.height=e.height;else {this.uiManager.renderCanvas.width=window.innerWidth;const t=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--sat"),10)||0,e=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--sab"),10)||0,i=window.innerHeight+t+e;this.uiManager.renderCanvas.height=i;}}}getCameraParameters(){let t=60,e=9/16;if(this.xrSession&&this.xrLastPose){const i=this.xrLastPose.views[0].projectionMatrix;e=this.uiManager.renderCanvas.width/this.uiManager.renderCanvas.height,t=radToDeg(2*Math.atan(1/i[5]));}return {fov:t,aspect:e}}getXRLayer(){return this.xrLayer}getXRInputCoords(t){const e=t.inputSource.gamepad.axes;return new Vector2(e[0],-e[1])}getNormalizedTouchCoords(t){const e=new Vector2;return e.x=t.touches[0].clientX/window.innerWidth*2-1,e.y=-t.touches[0].clientY/window.innerHeight*2+1,e}setResizeListener(t){this.onResize=t;}setTouchListener(t){this.onTouch=t;}setTouchStartListener(t){this.onTouchStart=t;}setTouchMoveListener(t){this.onTouchMove=t;}setTouchEndListener(t){this.onTouchEnd=t;}setSessionEndListener(t){this.onSessionEnd=t;}setHitTestListener(t){this.onHitTestResult=t;}setFrameListener(t){this.onFrame=t;}}
51
+ class WebXRManager{constructor(e,t,a,i){this.uiManager=e,this.nativeManager=t,this.deviceManager=a,this.workerManager=i;}async isWebXRSupported(){let e=!1;return navigator.xr&&(e=await navigator.xr.isSessionSupported("immersive-ar")),e}async init(e,t,a){this.onPose=t,this.onSessionEnd=a;const i=async()=>{const t=["hit-test"],a=["dom-overlay"];e&&a.push("camera-access");try{const e=await navigator.xr.requestSession("immersive-ar",{requiredFeatures:t,optionalFeatures:a,domOverlay:{root:document.body}});await this.onXRSessionStarted(e);}catch(e){throw new SensorsError(`error while initializing webXR API: ${e}`)}};window.navigator.userAgent.includes("OnirixPlayer")?await i():await this.uiManager.displayPermissionsDialog(i);}start(){this.started=!0,this.usingSpatial&&(this.relocating=!1,this.workerManager.replaceCallback("extraction",(e=>{if(!1===e)return void(this.relocating=!1);let t=this.nativeManager.loadExtractionData(e);this.candidates=Array.from(Array(t).keys()).reverse(),this.siftData=e.extraction,this.matchKeyframes();})),this.workerManager.replaceCallback("matching",(e=>{this.nativeManager.loadMatch(e),this.matchKeyframes();})));}matchKeyframes(){if(this.candidates.length>0){let e=this.candidates.pop();this.workerManager.sendDataToWorker("matching",new WorkerMatchingData(e,this.siftData,this.nativeManager.getCandidateData(e),this.nativeManager.extractionType()));}else this.nativeManager.spatialLocate(),this.relocating=!1;}async destroy(){this.xrSession&&(await this.xrSession.end(),this.xrSession=null,this.xrLastPose=null);}async onXRSessionStarted(e){let t=this.uiManager.renderCanvas.getContext("webgl2");t||(t=this.uiManager.renderCanvas.getContext("webgl")),t.getContextAttributes().xrCompatible||await t.makeXRCompatible(),this.xrContext=t,this.framebuffer=this.xrContext.createFramebuffer(),this.xrLayer=new XRWebGLLayer(e,this.xrContext),this.usingSpatial&&(navigator.userAgent.includes("OnirixPlayer")||(this.glBinding=new XRWebGLBinding(e,this.xrContext)),this.nativeManager.siftBuffer=this.nativeManager.nativeSDK._malloc(22e5),this.nativeManager.matchBuffer=this.nativeManager.nativeSDK._malloc(14e3),this.nativeManager.netvladBuffer=this.nativeManager.nativeSDK._malloc(32768)),e.updateRenderState({baseLayer:this.xrLayer}),this.xrLocalRefSpace=await e.requestReferenceSpace("local"),this.xrViewerRefSpace=await e.requestReferenceSpace("viewer"),this.xrHitTestSource=await e.requestHitTestSource({space:this.xrViewerRefSpace}),e.requestAnimationFrame(this.onXRFrame.bind(this)),window.navigator.userAgent.includes("WebXRViewer")?(this.uiManager.renderCanvas.addEventListener("click",(e=>{this.onTouch&&this.onTouch(this.getNormalizedTouchCoords(e));})),this.uiManager.renderCanvas.addEventListener("touchstart",(e=>{this.onTouchStart&&this.onTouchStart(this.getNormalizedTouchCoords(e));})),this.uiManager.renderCanvas.addEventListener("touchend",(e=>{this.onTouchEnd&&this.onTouchEnd(this.getNormalizedTouchCoords(e));}))):(e.addEventListener("select",(e=>{this.onTouch&&this.onTouch(this.getXRInputCoords(e));})),e.addEventListener("selectstart",(e=>{this.onTouchStart&&this.onTouchStart(this.getXRInputCoords(e));})),e.addEventListener("selectend",(e=>{this.onTouchEnd&&this.onTouchEnd(this.getXRInputCoords(e));}))),this.uiManager.renderCanvas.addEventListener("touchmove",(e=>{this.onTouchMove&&this.onTouchMove(this.getNormalizedTouchCoords(e));})),e.addEventListener("end",(()=>{this.onSessionEnd&&this.onSessionEnd();})),this.xrSession=e;}hasRelocated(){return this.usingSpatial&&this.nativeManager.xrTransform}needsRelocation(){return this.usingSpatial&&!this.hasRelocated()&&(null==this.lastRelocationTry||this.msSinceRelocation()>2500)}startRelocationTimer(){this.lastRelocationTry=new Date;}msSinceRelocation(){let e=new Date;return this.lastRelocationTry?e-this.lastRelocationTry:0}resizeTexture(e,t,a,i,r,n){const s=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,s),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0);const o=e.createTexture();e.bindTexture(e.TEXTURE_2D,o),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,r,n,0,e.RGBA,e.UNSIGNED_BYTE,null),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR);const h=e.createFramebuffer();return e.bindFramebuffer(e.FRAMEBUFFER,h),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,o,0),e.bindFramebuffer(e.READ_FRAMEBUFFER,s),e.bindFramebuffer(e.DRAW_FRAMEBUFFER,h),e.blitFramebuffer(0,0,a,i,0,0,r,n,e.COLOR_BUFFER_BIT,e.LINEAR),o}getCameraIntrinsics(e,t){const a=e,i=t.width,r=t.height;if(this.uiManager.isPortrait()){return [r/2*a[5]*Math.min(480/r,640/i),320,240]}return [r/2*a[5]*Math.min(640/r,480/i),320,240]}onXRFrame(e,t){let a=t.session;a.requestAnimationFrame(this.onXRFrame.bind(this));const i=t.getViewerPose(this.xrLocalRefSpace);if(i){if(this.needsRelocation()&&!this.relocating){let e,a,r;this.relocating=!0;const n=this.xrContext;this.nativeManager.lastXrPose=(new Matrix4).fromArray(i.views[0].transform.matrix).toArray(),(async()=>{let s,o,h,c,d;if(navigator.userAgent.includes("OnirixPlayer")){const i=await t.getCameraImage();e=i.width,a=i.height;let[c,d,u]=this.nativeManager.getIntrinsics();Math.abs(c-i.focalLength)>1&&this.nativeManager.setIntrinsics(i.focalLength,320,240);const g=new Image;await new Promise((e=>{g.src=`data:image/jpeg;base64,${i.data}`,g.onload=()=>{e();};})),s=n.getParameter(n.READ_FRAMEBUFFER_BINDING),o=n.getParameter(n.DRAW_FRAMEBUFFER_BINDING),h=n.getParameter(n.TEXTURE_BINDING_2D);const l=n.createTexture();n.bindTexture(n.TEXTURE_2D,l),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,n.RGBA,n.UNSIGNED_BYTE,g),r=l;}else {s=n.getParameter(n.READ_FRAMEBUFFER_BINDING),o=n.getParameter(n.DRAW_FRAMEBUFFER_BINDING),h=n.getParameter(n.TEXTURE_BINDING_2D);for(const t of i.views)t.camera&&(e=t.camera.width,a=t.camera.height,r=this.glBinding.getCameraImage(t.camera));if(!r)return}this.uiManager.isPortrait()?(c=640/a,d=480/e):(c=480/a,d=640/e);let u,g,l=Math.max(c,d);r=this.resizeTexture(n,r,e,a,e*l,a*l),e*=l,a*=l,this.cameraData||(this.cameraData=new Uint8ClampedArray(e*a*4)),n.bindTexture(n.TEXTURE_2D,r),n.bindFramebuffer(n.FRAMEBUFFER,this.framebuffer),n.framebufferTexture2D(n.FRAMEBUFFER,n.COLOR_ATTACHMENT0,n.TEXTURE_2D,r,0),n.readPixels(0,0,e,a,n.RGBA,n.UNSIGNED_BYTE,this.cameraData),n.bindFramebuffer(n.READ_FRAMEBUFFER,s),n.bindFramebuffer(n.DRAW_FRAMEBUFFER,o),n.bindTexture(n.TEXTURE_2D,h),this.uiManager.isPortrait()?(u=1,g=3):(u=2,g=0),console.log("Sending data to extraction worker!"),this.workerManager.sendDataToWorker("extraction",new WorkerExtractionData(this.cameraData,e,a,g,u,this.nativeManager.extractionType())),this.startRelocationTimer();})();}this.xrContext.bindFramebuffer(this.xrContext.FRAMEBUFFER,a.renderState.baseLayer.framebuffer);const e=i.views[0];let r=(new Matrix4).fromArray(e.transform.matrix);if(this.deviceManager.os===DeviceManager.OS.Android&&this.started&&this.lastPose&&!this.jumpPose){2*Math.acos(Math.abs((new Quaternion).setFromRotationMatrix(r).dot((new Quaternion).setFromRotationMatrix(this.lastPose))))>1&&(this.jumpPose=r);}if(this.jumpPose){const e=this.jumpPose.clone().invert().multiply(r);r=this.lastPose.clone().multiply(e);}else this.lastPose=r;this.hasRelocated()&&(r=(new Matrix4).fromArray(this.nativeManager.xrTransform.elements).multiply(r)),this.usingSpatial&&!this.hasRelocated()||this.onPose(r.toArray());const n=this.xrLayer.getViewport(e),s=n.width,o=n.height,h=null==this.xrLastPose||this.lastViewportWidth!=s||this.lastViewportHeight!=o;if(this.xrLastPose=i,this.lastViewportWidth=s,this.lastViewportHeight=o,h&&this.onResize&&this.onResize(),this.onHitTestResult){const e=t.getHitTestResults(this.xrHitTestSource);if(e.length>0){const t=e[0].getPose(this.xrLocalRefSpace),a=(new Matrix4).fromArray(t.transform.matrix),i=a.extractPosition(),n=((new Quaternion).setFromRotationMatrix(a),r.extractPosition()),s=Math.atan2(n.x-i.x,n.z-i.z),o={position:i,rotation:(new Quaternion).setFromEuler(new Euler(0,s,0))};this.onHitTestResult(o);}}}this.onFrame&&this.onFrame(t);}fitCanvasToXRViewport(){if(this.xrLastPose){const e=this.xrLastPose.views[0],t=this.xrLayer.getViewport(e);if((t.width>t.height&&window.innerWidth>window.innerHeight||t.width<=t.height&&window.innerWidth<=window.innerHeight)&&t.width*t.height>window.innerWidth*window.innerHeight)this.uiManager.renderCanvas.width=t.width,this.uiManager.renderCanvas.height=t.height;else {this.uiManager.renderCanvas.width=window.innerWidth;const e=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--sat"),10)||0,t=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--sab"),10)||0,a=window.innerHeight+e+t;this.uiManager.renderCanvas.height=a;}}}getCameraParameters(){let e=60,t=9/16;if(this.xrSession&&this.xrLastPose){const a=this.xrLastPose.views[0].projectionMatrix;t=this.uiManager.renderCanvas.width/this.uiManager.renderCanvas.height,e=radToDeg(2*Math.atan(1/a[5]));}return {fov:e,aspect:t}}getXRLayer(){return this.xrLayer}getXRInputCoords(e){const t=e.inputSource.gamepad.axes;return new Vector2(t[0],-t[1])}getNormalizedTouchCoords(e){const t=new Vector2,a=this.uiManager.renderCanvas.getBoundingClientRect();return null!=e.clientX?(t.x=(e.clientX-a.left)/a.width*2-1,t.y=-(e.clientY-a.top)/a.height*2+1):e.touches[0]?(t.x=e.touches[0].clientX/window.innerWidth*2-1,t.y=-e.touches[0].clientY/window.innerHeight*2+1):(t.x=e.changedTouches[0].clientX/window.innerWidth*2-1,t.y=-e.changedTouches[0].clientY/window.innerHeight*2+1),t}setResizeListener(e){this.onResize=e;}setTouchListener(e){this.onTouch=e;}setTouchStartListener(e){this.onTouchStart=e;}setTouchMoveListener(e){this.onTouchMove=e;}setTouchEndListener(e){this.onTouchEnd=e;}setSessionEndListener(e){this.onSessionEnd=e;}setHitTestListener(e){this.onHitTestResult=e;}setFrameListener(e){this.onFrame=e;}}
52
52
 
53
53
  class EventManager{constructor(){this.eventListeners={},this.eventListenerCount=0;}stop(){this.eventListeners={},this.eventListenerCount=0;}addEventListener(e,t){this.eventListeners[e]||(this.eventListeners[e]=[]);const n=this.eventListenerCount++;return this.eventListeners[e].push({id:n,func:t}),n}triggerEvent(e,t){this.eventListeners[e]&&this.eventListeners[e].map((e=>e.func(t)));}removeEventListener(e){for(let t of Object.keys(this.eventListeners))for(let n=0;n<t.length;n++)if(t[n].id===e){t.splice(n,1);break}}}
54
54
 
55
55
  class IndexedDBManager{constructor(e,r){this.dbName=e,this.storeName=r;}async getFromCacheOrFetch(e,r){let t=null;try{t=await this.getFileFromIndexedDB(e);}catch(e){console.log("An error occurred while trying to get element from indexedDB.");}return t||(t=await this.fetchAndCacheFile(r,e)),new Uint8Array(t)}async getFileFromIndexedDB(e){return new Promise(((r,t)=>{const o=indexedDB.open(this.dbName);o.onerror=()=>t(o.error),o.onsuccess=()=>{const s=o.result.transaction(this.storeName,"readonly").objectStore(this.storeName).get(e);s.onsuccess=()=>r(s.result),s.onerror=()=>t(s.error);},o.onupgradeneeded=e=>{e.target.result.createObjectStore(this.storeName);};}))}async saveFileToIndexedDB(e,r){return new Promise(((t,o)=>{const s=indexedDB.open(this.dbName);s.onerror=()=>o(s.error),s.onupgradeneeded=e=>{e.target.result.createObjectStore(this.storeName);},s.onsuccess=()=>{try{const n=s.result.transaction(this.storeName,"readwrite"),a=n.objectStore(this.storeName).put(r,e);a.onsuccess=()=>t(a.result),a.onerror=()=>o(a.error);}catch(e){o(e);}};}))}async fetchAndCacheFile(e,r){const t=await fetch(e),o=await t.arrayBuffer();return await this.saveFileToIndexedDB(r,o),o}}
56
56
 
57
- class OnirixSDK{constructor(e){this.authToken=e,this.deviceManager=new DeviceManager,this.indexedDBManager=new IndexedDBManager("onirix-sdk","files"),this.uiManager=new UIManager,this.workerManager=new WorkerManager,this.nativeManager=new NativeManager(this.uiManager,this.deviceManager,this.workerManager,this.indexedDBManager),this.cameraManager=new CameraManager(this.uiManager),this.webXRManager=new WebXRManager(this.uiManager,this.nativeManager,this.deviceManager,this.workerManager),this.imuManager=new IMUManager(this.uiManager,this.deviceManager),this.eventManager=new EventManager;}async init(e){this.started=!1,e.visualDebug&&(this.initVisualDebug(),e.debug=!0);const t=this.readConfig(e);this.mode=t.mode,this.debug=t.debug;const a=this.mode==TrackingMode.Spatial||t.cameraAccess;switch(await this.nativeManager.init(this.authToken,t),t.renderCanvas?(this.uiManager.setRenderCanvas(t.renderCanvas),this.usingProvidedCanvas=!0):(this.uiManager.createRenderCanvas(),this.usingProvidedCanvas=!1),this.mode){case TrackingMode.Surface:const e=await this.webXRManager.isWebXRSupported();t.disableWorldTracking||!e&&!t.disableWebXR&&t.disableSLAM?(this.surfaceMode=SurfaceMode.Gyroscope,await this.imuManager.init(this.onRotation.bind(this),this.onAcceleration.bind(this),this.onHitTestResult.bind(this)),this.imuManager.start()):t.disableWebXR||!e?(this.surfaceMode=SurfaceMode.SLAM,await this.imuManager.init(this.onRotation.bind(this),this.onAcceleration.bind(this),this.onHitTestResult.bind(this)),this.imuManager.start()):(this.surfaceMode=SurfaceMode.WebXR,await this.webXRManager.init(a,this.onPose.bind(this),(()=>this.stop())),this.webXRManager.setTouchListener(this.onTouch.bind(this)),this.webXRManager.setTouchStartListener(this.onTouchStart.bind(this)),this.webXRManager.setTouchMoveListener(this.onTouchMove.bind(this)),this.webXRManager.setTouchEndListener(this.onTouchEnd.bind(this)),this.webXRManager.setSessionEndListener(this.onSessionEnd.bind(this)),this.webXRManager.setHitTestListener(this.onHitTestResult.bind(this)),this.webXRManager.setResizeListener(this.onResize.bind(this)),this.webXRManager.setFrameListener(this.onFrame.bind(this)),this.webXRManager.start(),this.usingWebXR=!0);break;case TrackingMode.Image:case TrackingMode.QRCode:break;case TrackingMode.Spatial:{const e=await this.webXRManager.isWebXRSupported();t.disableWebXR||!e?(this.surfaceMode=SurfaceMode.SLAM,await this.imuManager.init(this.onRotation.bind(this),this.onAcceleration.bind(this),this.onHitTestResult.bind(this)),this.imuManager.start(),this.nativeManager.siftBuffer=this.nativeManager.nativeSDK._malloc(22e5),this.nativeManager.matchBuffer=this.nativeManager.nativeSDK._malloc(14e3),this.nativeManager.netvladBuffer=this.nativeManager.nativeSDK._malloc(32768),this.extractingIdx=1,this.workerManager.replaceCallback("extraction",(e=>{let t=this.nativeManager.loadExtractionData(e,this.extractingIdx);this.candidates=Array.from(Array(t).keys()).reverse(),this.siftData=e.extraction,this.matchKeyframes();})),this.workerManager.replaceCallback("matching",(e=>{this.nativeManager.loadMatch(e),this.matchKeyframes();}))):(this.surfaceMode=SurfaceMode.WebXR,this.usingWebXR=!0,this.webXRManager.usingSpatial=!0,await this.webXRManager.init(a,this.onPose.bind(this),(()=>this.stop())),this.webXRManager.setTouchListener(this.onTouch.bind(this)),this.webXRManager.setTouchStartListener(this.onTouchStart.bind(this)),this.webXRManager.setTouchMoveListener(this.onTouchMove.bind(this)),this.webXRManager.setTouchEndListener(this.onTouchEnd.bind(this)),this.webXRManager.setSessionEndListener(this.onSessionEnd.bind(this)),this.webXRManager.setHitTestListener(this.onHitTestResult.bind(this)),this.webXRManager.setResizeListener(this.onResize.bind(this)),this.webXRManager.setFrameListener(this.onFrame.bind(this)),this.webXRManager.start(),this.webXRManager.startRelocationTimer());}}if(this.surfaceMode!==SurfaceMode.WebXR){await this.cameraManager.startCamera(t.highResolutionCamera),this.uiManager.setTouchListener(this.onTouch.bind(this)),this.uiManager.setTouchStartListener(this.onTouchStart.bind(this)),this.uiManager.setTouchMoveListener(this.onTouchMove.bind(this)),this.uiManager.setTouchEndListener(this.onTouchEnd.bind(this)),this.frameLoop=!0;const e=()=>{this.frameLoop&&(this.onFrame(null),requestAnimationFrame(e));};requestAnimationFrame(e);}return this.onResize(),window.addEventListener("resize",(e=>this.onResize())),this.uiManager.renderCanvas}async start(){switch(this.started=!0,this.mode){case TrackingMode.Surface:switch(this.surfaceMode){case SurfaceMode.Gyroscope:this.imuManager.start();break;case SurfaceMode.SLAM:this.nativeManager.startSLAM((e=>{this.onPose(e);}),this.debug?this.onKeyFrame.bind(this):null,this.onStatusChange.bind(this)),this.processLoop();break;case SurfaceMode.WebXR:this.webXRManager.start();}break;case TrackingMode.Image:this.nativeManager.startImageTracking(this.onDetected.bind(this),this.onPose.bind(this),this.onLost.bind(this)),this.processLoop();break;case TrackingMode.QRCode:this.nativeManager.startQRCodeTracking(this.onDetected.bind(this),this.onPose.bind(this),this.onLost.bind(this)),this.processLoop();break;case TrackingMode.Spatial:this.nativeManager.startSpatialTracking(this.onDetected.bind(this),this.onPose.bind(this),this.usingWebXR),this.processLoop();}}async stop(){switch(this.mode){case TrackingMode.Surface:switch(this.surfaceMode){case SurfaceMode.Gyroscope:this.imuManager.stop();break;case SurfaceMode.SLAM:this.nativeManager.stopSLAM();}break;case TrackingMode.Image:this.nativeManager.stopImageTracking();break;case TrackingMode.QRCode:this.nativeManager.stopQRCodeTracking();break;case TrackingMode.Spatial:this.nativeManager.stopSpatialTracking();}this.started=!1;}matchKeyframes(){if(this.candidates.length>0){let e=this.candidates.pop();this.workerManager.sendDataToWorker("matching",new WorkerMatchingData(e,this.siftData,this.nativeManager.getCandidateData(e),this.nativeManager.extractionType()));}else this.nativeManager.loadKeyframePose(this.extractingIdx),this.extractingIdx++,this.locating=!1;}async destroy(){this.eventManager.stop(),this.nativeManager.destroy(),this.surfaceMode!==SurfaceMode.WebXR?this.cameraManager.stopCamera():this.webXRManager.destroy(),this.usingProvidedCanvas||this.uiManager.renderCanvas.remove(),this.frameLoop=!1;}readConfig(e){if(!e)throw new InternalError("A config object must be provided.");if(!e.mode)throw new InternalError("'mode' is a required parameter.");if(e.mode<=0||e.mode>4)throw new InternalError("Selected mode is not a valid tracking mode.");return 4==e.mode&&e.sceneOid,Object.assign(DefaultConfig,e)}onCameraFrame(){if(this.started){const e=this.uiManager.getVideoData();if(e){if(this.mode===TrackingMode.Spatial&&!this.locating){if(this.nativeManager.numSLAMKeyframes()>this.extractingIdx&&!this.nativeManager.spatialLocated){this.locating=!0;let e=this.nativeManager.getSLAMKeyframe(this.extractingIdx);this.workerManager.sendDataToWorker("extraction",new WorkerExtractionData(e,640,480,0,0,this.nativeManager.extractionType()));}}this.nativeManager.processFrame(e);}const t=this.uiManager.getVideoElement();t&&t.requestVideoFrameCallback(this.onCameraFrame.bind(this));}}processLoop(){this.onCameraFrame();}getCameraParameters(){return this.usingWebXR?this.webXRManager.getCameraParameters():this.uiManager.getCameraParameters()}getXRLayer(){return this.usingWebXR?this.webXRManager.getXRLayer():null}getXRParams(){return this.usingWebXR?{xrSession:this.webXRManager.xrSession,xrLocalRefSpace:this.webXRManager.xrLocalRefSpace,xrViewerRefSpace:this.webXRManager.xrViewerRefSpace}:null}getCameraFeed(){return this.uiManager.getVideoElement()}getSurfaceMode(){return this.surfaceMode}async addImage(e,t){const a=await(i=e,new Promise(((e,t)=>{const a=new Image;a.crossOrigin="Anonymous",a.addEventListener("load",(()=>e(a))),a.addEventListener("error",(e=>t(e))),a.src=i;})));var i;const n=document.createElement("canvas");n.width=640,n.height=480;const s=n.getContext("2d");s.drawImage(a,0,0);const r=s.getImageData(0,0,640,480).data;this.nativeManager.addImage(t,r);}initVisualDebug(){let e=document.createElement("div");e.style.position="fixed",e.style.top="1em",e.style.left="1em",e.style.padding="0.5em",e.style.width="75vw",e.style.height="50vh",e.style.borderRadius="0.25em",e.style.background="black",e.style.color="white",e.style.opacity="0.5",e.style.fontSize="0.75em",e.style.fontFamily="monospace, monospace",e.style.overflow="auto",e.style.zIndex=999999,e.style.pointerEvents="none",document.body.appendChild(e);let t=document.createElement("button");t.innerHTML="Share",t.style.position="fixed",t.style.top="calc(1em + 50vh + 2em)",t.style.left="1em",t.style.opacity="0.5",t.style.zIndex=9999999,document.body.appendChild(t);const a=(e,t,a)=>{const i=console[e];console[e]=(...e)=>{i.apply(console,e);const n=document.createElement("div");n.textContent=e.join(" "),a&&(n.style.color=a),t.appendChild(n),n.scrollIntoView();};};a("log",e),a("info",e),a("warn",e,"orange"),a("error",e,"red"),t.onclick=async()=>{await navigator.share({text:[...e.children].map((e=>e.innerHTML)).join("\n")});};}onPose(e){this.eventManager.triggerEvent(Events.OnPose,e);}onKeyFrame(){this.eventManager.triggerEvent(Events.OnKeyFrame);}onStatusChange(e){this.eventManager.triggerEvent(Events.OnStatusChange,e);}onDetected(e){this.eventManager.triggerEvent(Events.OnDetected,e);}onLost(e){this.eventManager.triggerEvent(Events.OnLost,e);}onResize(){this.surfaceMode===SurfaceMode.WebXR?this.webXRManager.fitCanvasToXRViewport():this.uiManager.fitVideoToScreen(),this.eventManager.triggerEvent(Events.OnResize);}onTouch(e){this.eventManager.triggerEvent(Events.OnTouch,e);}onTouchStart(e){this.eventManager.triggerEvent(Events.OnTouchStart,e);}onTouchEnd(e){this.eventManager.triggerEvent(Events.OnTouchEnd,e);}onTouchMove(e){this.eventManager.triggerEvent(Events.OnTouchMove,e);}onSessionEnd(){this.eventManager.triggerEvent(Events.OnSessionEnd);}onHitTestResult(e){this.eventManager.triggerEvent(Events.OnHitTestResult,e);}onAcceleration(e){if((this.mode===TrackingMode.Spatial||this.surfaceMode===SurfaceMode.SLAM)&&this.started){let t=e;this.uiManager.isPortrait()||(t.x*=-1,t.y*=-1),t.z*=-1;const a=t.toArray().concat(0);this.nativeManager.nativeSDK.HEAPF64.set(a,this.nativeManager.nativeSDK.imuAccData/8),this.nativeManager.nativeSDK._OX_ProcessIMUAcceleration(this.nativeManager.nativeSDK.imuAccData);}}onRotation(e){if(this.surfaceMode===SurfaceMode.Gyroscope||this.surfaceMode===SurfaceMode.SLAM&&!this.started){let t=new Matrix4;t.setRotation(e),this.onPose(t.toArray());}else if(this.mode===TrackingMode.Spatial||this.surfaceMode===SurfaceMode.SLAM){let t=e;this.uiManager.isPortrait()&&t.multiply(mat3RotationZ90CW),this.nativeManager.nativeSDK.HEAPF64.set(t.toArray(),this.nativeManager.nativeSDK.imuRotData/8),this.nativeManager.nativeSDK._OX_ProcessIMURotation(this.nativeManager.nativeSDK.imuRotData);}}onFrame(e){this.eventManager.triggerEvent(Events.OnFrame,e);}subscribe(e,t){return this.eventManager.addEventListener(e,t)}unsubscribe(e){this.eventManager.removeEventListener(e);}getSLAMMap(){return this.nativeManager.getSLAMMap()}getSLAMTrackingPoints(){return this.nativeManager.getSLAMTrackingPoints()}raycast(e,t,a,i,n,s){return this.nativeManager.raycast(e,t,a,i,n,s)}}OnirixSDK.TrackingMode=TrackingMode,OnirixSDK.Events=Events;
57
+ class OnirixSDK{constructor(e){this.authToken=e,this.deviceManager=new DeviceManager,this.indexedDBManager=new IndexedDBManager("onirix-sdk","files"),this.uiManager=new UIManager,this.workerManager=new WorkerManager,this.nativeManager=new NativeManager(this.uiManager,this.deviceManager,this.workerManager,this.indexedDBManager),this.cameraManager=new CameraManager(this.uiManager,this.deviceManager),this.webXRManager=new WebXRManager(this.uiManager,this.nativeManager,this.deviceManager,this.workerManager),this.imuManager=new IMUManager(this.uiManager,this.deviceManager),this.eventManager=new EventManager;}async init(e){this.started=!1,e.visualDebug&&(this.initVisualDebug(),e.debug=!0);const t=this.readConfig(e);this.mode=t.mode,this.debug=t.debug;const a=this.mode==TrackingMode.Spatial||t.cameraAccess;switch(await this.nativeManager.init(this.authToken,t),t.renderCanvas?(this.uiManager.setRenderCanvas(t.renderCanvas),this.usingProvidedCanvas=!0):(this.uiManager.createRenderCanvas(),this.usingProvidedCanvas=!1),this.mode){case TrackingMode.Surface:const e=await this.webXRManager.isWebXRSupported();t.disableWorldTracking||!e&&!t.disableWebXR&&t.disableSLAM?(this.surfaceMode=SurfaceMode.Gyroscope,await this.imuManager.init(this.onRotation.bind(this),this.onAcceleration.bind(this),this.onHitTestResult.bind(this)),this.imuManager.start()):t.disableWebXR||!e?(this.surfaceMode=SurfaceMode.SLAM,await this.imuManager.init(this.onRotation.bind(this),this.onAcceleration.bind(this),this.onHitTestResult.bind(this)),this.imuManager.start()):(this.surfaceMode=SurfaceMode.WebXR,await this.webXRManager.init(a,this.onPose.bind(this),(()=>this.stop())),this.webXRManager.setTouchListener(this.onTouch.bind(this)),this.webXRManager.setTouchStartListener(this.onTouchStart.bind(this)),this.webXRManager.setTouchMoveListener(this.onTouchMove.bind(this)),this.webXRManager.setTouchEndListener(this.onTouchEnd.bind(this)),this.webXRManager.setSessionEndListener(this.onSessionEnd.bind(this)),this.webXRManager.setHitTestListener(this.onHitTestResult.bind(this)),this.webXRManager.setResizeListener(this.onResize.bind(this)),this.webXRManager.setFrameListener(this.onFrame.bind(this)),this.webXRManager.start(),this.usingWebXR=!0);break;case TrackingMode.Image:case TrackingMode.QRCode:break;case TrackingMode.Spatial:{const e=await this.webXRManager.isWebXRSupported();t.disableWebXR||!e?(this.surfaceMode=SurfaceMode.SLAM,await this.imuManager.init(this.onRotation.bind(this),this.onAcceleration.bind(this),this.onHitTestResult.bind(this)),this.imuManager.start(),this.nativeManager.siftBuffer=this.nativeManager.nativeSDK._malloc(22e5),this.nativeManager.matchBuffer=this.nativeManager.nativeSDK._malloc(14e3),this.nativeManager.netvladBuffer=this.nativeManager.nativeSDK._malloc(32768),this.extractingIdx=1,this.workerManager.replaceCallback("extraction",(e=>{let t=this.nativeManager.loadExtractionData(e,this.extractingIdx);this.candidates=Array.from(Array(t).keys()).reverse(),this.siftData=e.extraction,this.matchKeyframes();})),this.workerManager.replaceCallback("matching",(e=>{this.nativeManager.loadMatch(e),this.matchKeyframes();}))):(this.surfaceMode=SurfaceMode.WebXR,this.usingWebXR=!0,this.webXRManager.usingSpatial=!0,await this.webXRManager.init(a,this.onPose.bind(this),(()=>this.stop())),this.webXRManager.setTouchListener(this.onTouch.bind(this)),this.webXRManager.setTouchStartListener(this.onTouchStart.bind(this)),this.webXRManager.setTouchMoveListener(this.onTouchMove.bind(this)),this.webXRManager.setTouchEndListener(this.onTouchEnd.bind(this)),this.webXRManager.setSessionEndListener(this.onSessionEnd.bind(this)),this.webXRManager.setHitTestListener(this.onHitTestResult.bind(this)),this.webXRManager.setResizeListener(this.onResize.bind(this)),this.webXRManager.setFrameListener(this.onFrame.bind(this)),this.webXRManager.start(),this.webXRManager.startRelocationTimer());}}if(this.surfaceMode!==SurfaceMode.WebXR){await this.cameraManager.startCamera(t.highResolutionCamera),this.uiManager.setTouchListener(this.onTouch.bind(this)),this.uiManager.setTouchStartListener(this.onTouchStart.bind(this)),this.uiManager.setTouchMoveListener(this.onTouchMove.bind(this)),this.uiManager.setTouchEndListener(this.onTouchEnd.bind(this)),this.frameLoop=!0;const e=()=>{this.frameLoop&&(this.onFrame(null),requestAnimationFrame(e));};requestAnimationFrame(e);}return this.onResize(),window.addEventListener("resize",(e=>this.onResize())),this.uiManager.renderCanvas}async start(){switch(this.started=!0,this.mode){case TrackingMode.Surface:switch(this.surfaceMode){case SurfaceMode.Gyroscope:this.imuManager.start();break;case SurfaceMode.SLAM:this.nativeManager.startSLAM((e=>{this.onPose(e);}),this.debug?this.onKeyFrame.bind(this):null,this.onStatusChange.bind(this)),this.processLoop();break;case SurfaceMode.WebXR:this.webXRManager.start();}break;case TrackingMode.Image:this.nativeManager.startImageTracking(this.onDetected.bind(this),this.onPose.bind(this),this.onLost.bind(this)),this.processLoop();break;case TrackingMode.QRCode:this.nativeManager.startQRCodeTracking(this.onDetected.bind(this),this.onPose.bind(this),this.onLost.bind(this)),this.processLoop();break;case TrackingMode.Spatial:this.nativeManager.startSpatialTracking(this.onDetected.bind(this),this.onPose.bind(this),this.usingWebXR),this.processLoop();}}async stop(){switch(this.mode){case TrackingMode.Surface:switch(this.surfaceMode){case SurfaceMode.Gyroscope:this.imuManager.stop();break;case SurfaceMode.SLAM:this.nativeManager.stopSLAM();}break;case TrackingMode.Image:this.nativeManager.stopImageTracking();break;case TrackingMode.QRCode:this.nativeManager.stopQRCodeTracking();break;case TrackingMode.Spatial:this.nativeManager.stopSpatialTracking();}this.started=!1;}matchKeyframes(){if(this.candidates.length>0){let e=this.candidates.pop();this.workerManager.sendDataToWorker("matching",new WorkerMatchingData(e,this.siftData,this.nativeManager.getCandidateData(e),this.nativeManager.extractionType()));}else this.nativeManager.loadKeyframePose(this.extractingIdx),this.extractingIdx++,this.locating=!1;}async destroy(){this.eventManager.stop(),this.nativeManager.destroy(),this.surfaceMode!==SurfaceMode.WebXR?this.cameraManager.stopCamera():this.webXRManager.destroy(),this.usingProvidedCanvas||this.uiManager.renderCanvas.remove(),this.frameLoop=!1;}readConfig(e){if(!e)throw new InternalError("A config object must be provided.");if(!e.mode)throw new InternalError("'mode' is a required parameter.");if(e.mode<=0||e.mode>4)throw new InternalError("Selected mode is not a valid tracking mode.");return 4==e.mode&&e.sceneOid,Object.assign(DefaultConfig,e)}onCameraFrame(){if(this.started){const e=this.uiManager.getVideoData();if(e){if(this.mode===TrackingMode.Spatial&&!this.locating){if(this.nativeManager.numSLAMKeyframes()>this.extractingIdx&&!this.nativeManager.spatialLocated){this.locating=!0;let e=this.nativeManager.getSLAMKeyframe(this.extractingIdx);this.workerManager.sendDataToWorker("extraction",new WorkerExtractionData(e,640,480,0,0,this.nativeManager.extractionType()));}}this.nativeManager.processFrame(e);}const t=this.uiManager.getVideoElement();t&&t.requestVideoFrameCallback(this.onCameraFrame.bind(this));}}processLoop(){this.onCameraFrame();}getCameraParameters(){return this.usingWebXR?this.webXRManager.getCameraParameters():this.uiManager.getCameraParameters()}getXRLayer(){return this.usingWebXR?this.webXRManager.getXRLayer():null}getXRParams(){return this.usingWebXR?{xrSession:this.webXRManager.xrSession,xrLocalRefSpace:this.webXRManager.xrLocalRefSpace,xrViewerRefSpace:this.webXRManager.xrViewerRefSpace}:null}getCameraFeed(){return this.uiManager.getVideoElement()}getSurfaceMode(){return this.surfaceMode}async addImage(e,t){const a=await(i=e,new Promise(((e,t)=>{const a=new Image;a.crossOrigin="Anonymous",a.addEventListener("load",(()=>e(a))),a.addEventListener("error",(e=>t(e))),a.src=i;})));var i;const n=document.createElement("canvas");n.width=640,n.height=480;const s=n.getContext("2d");s.drawImage(a,0,0);const r=s.getImageData(0,0,640,480).data;this.nativeManager.addImage(t,r);}initVisualDebug(){let e=document.createElement("div");e.style.position="fixed",e.style.top="1em",e.style.left="1em",e.style.padding="0.5em",e.style.width="75vw",e.style.height="50vh",e.style.borderRadius="0.25em",e.style.background="black",e.style.color="white",e.style.opacity="0.5",e.style.fontSize="0.75em",e.style.fontFamily="monospace, monospace",e.style.overflow="auto",e.style.zIndex=999999,e.style.pointerEvents="none",document.body.appendChild(e);let t=document.createElement("button");t.innerHTML="Share",t.style.position="fixed",t.style.top="calc(1em + 50vh + 2em)",t.style.left="1em",t.style.opacity="0.5",t.style.zIndex=9999999,document.body.appendChild(t);const a=(e,t,a)=>{const i=console[e];console[e]=(...e)=>{i.apply(console,e);const n=document.createElement("div");n.textContent=e.join(" "),a&&(n.style.color=a),t.appendChild(n),t.scrollTop=t.scrollHeight;};};a("log",e),a("info",e),a("warn",e,"orange"),a("error",e,"red"),t.onclick=async()=>{await navigator.share({text:[...e.children].map((e=>e.innerHTML)).join("\n")});};}onPose(e){this.eventManager.triggerEvent(Events.OnPose,e);}onKeyFrame(){this.eventManager.triggerEvent(Events.OnKeyFrame);}onStatusChange(e){this.eventManager.triggerEvent(Events.OnStatusChange,e);}onDetected(e){this.eventManager.triggerEvent(Events.OnDetected,e);}onLost(e){this.eventManager.triggerEvent(Events.OnLost,e);}onResize(){this.surfaceMode===SurfaceMode.WebXR?this.webXRManager.fitCanvasToXRViewport():this.uiManager.fitVideoToScreen(),this.eventManager.triggerEvent(Events.OnResize);}onTouch(e){this.eventManager.triggerEvent(Events.OnTouch,e);}onTouchStart(e){this.eventManager.triggerEvent(Events.OnTouchStart,e);}onTouchEnd(e){this.eventManager.triggerEvent(Events.OnTouchEnd,e);}onTouchMove(e){this.eventManager.triggerEvent(Events.OnTouchMove,e);}onSessionEnd(){this.eventManager.triggerEvent(Events.OnSessionEnd);}onHitTestResult(e){this.eventManager.triggerEvent(Events.OnHitTestResult,e);}onAcceleration(e){if((this.mode===TrackingMode.Spatial||this.surfaceMode===SurfaceMode.SLAM)&&this.started){let t=e;this.uiManager.isPortrait()||(t.x*=-1,t.y*=-1),t.z*=-1;const a=t.toArray().concat(0);this.nativeManager.nativeSDK.HEAPF64.set(a,this.nativeManager.nativeSDK.imuAccData/8),this.nativeManager.nativeSDK._OX_ProcessIMUAcceleration(this.nativeManager.nativeSDK.imuAccData);}}onRotation(e){if(this.surfaceMode===SurfaceMode.Gyroscope||this.surfaceMode===SurfaceMode.SLAM&&!this.started){let t=new Matrix4;t.setRotation(e),this.onPose(t.toArray());}else if(this.mode===TrackingMode.Spatial||this.surfaceMode===SurfaceMode.SLAM){let t=e;this.uiManager.isPortrait()&&t.multiply(mat3RotationZ90CW),this.nativeManager.nativeSDK.HEAPF64.set(t.toArray(),this.nativeManager.nativeSDK.imuRotData/8),this.nativeManager.nativeSDK._OX_ProcessIMURotation(this.nativeManager.nativeSDK.imuRotData);}}onFrame(e){this.eventManager.triggerEvent(Events.OnFrame,e);}subscribe(e,t){return this.eventManager.addEventListener(e,t)}unsubscribe(e){this.eventManager.removeEventListener(e);}getSLAMMap(){return this.nativeManager.getSLAMMap()}getSLAMTrackingPoints(){return this.nativeManager.getSLAMTrackingPoints()}raycast(e,t,a,i,n,s){return this.nativeManager.raycast(e,t,a,i,n,s)}}OnirixSDK.TrackingMode=TrackingMode,OnirixSDK.Events=Events;
58
58
 
59
59
  export { OnirixSDK as default };