diff --git a/.gitmodules b/.gitmodules index 0397080ca..4edba0940 100644 --- a/.gitmodules +++ b/.gitmodules @@ -46,3 +46,9 @@ [submodule "plugins/objectdetector/node-moving-things-tracker"] path = plugins/objectdetector/node-moving-things-tracker url = ../../koush/node-moving-things-tracker.git +[submodule "plugins/tensorflow-lite/src/predict/sort_oh"] + path = plugins/tensorflow-lite/src/predict/sort_oh + url = https://github.com/nonocam/sort_oh.git +[submodule "plugins/tensorflow-lite/sort_oh"] + path = plugins/tensorflow-lite/sort_oh + url = https://github.com/nonocam/sort_oh.git diff --git a/common/src/rtc-signaling.ts b/common/src/rtc-signaling.ts index 46b555561..23e2c586b 100644 --- a/common/src/rtc-signaling.ts +++ b/common/src/rtc-signaling.ts @@ -71,6 +71,7 @@ export class BrowserSignalingSession implements RTCSignalingSession { }, }, screen: { + devicePixelRatio: window.devicePixelRatio, width: screen.width, height: screen.height, }, diff --git a/docker/install-scrypted-dependencies-mac.sh b/docker/install-scrypted-dependencies-mac.sh index d09e57cb2..55dffaefa 100755 --- a/docker/install-scrypted-dependencies-mac.sh +++ b/docker/install-scrypted-dependencies-mac.sh @@ -69,7 +69,7 @@ then fi RUN python$PYTHON_VERSION -m pip install --upgrade pip -RUN python$PYTHON_VERSION -m pip install aiofiles debugpy typing_extensions typing opencv-python +RUN python$PYTHON_VERSION -m pip install aiofiles debugpy typing_extensions typing opencv-python psutil echo "Installing Scrypted Launch Agent..." diff --git a/docker/template/Dockerfile.full.header b/docker/template/Dockerfile.full.header index 851e3c522..2ce241627 100644 --- a/docker/template/Dockerfile.full.header +++ b/docker/template/Dockerfile.full.header @@ -59,7 +59,7 @@ RUN apt-get -y install \ # python pip RUN python3 -m pip install --upgrade pip -RUN python3 -m pip install aiofiles debugpy typing_extensions typing +RUN python3 -m pip install aiofiles debugpy typing_extensions typing psutil ################################################################ # End section generated from template/Dockerfile.full.header diff --git a/docs/plugins/google-home/cast-receiver/js/main.js b/docs/plugins/google-home/cast-receiver/js/main.js index fe04f7430..c60d3303c 100644 --- a/docs/plugins/google-home/cast-receiver/js/main.js +++ b/docs/plugins/google-home/cast-receiver/js/main.js @@ -1,2 +1,2 @@ -(()=>{"use strict";var __webpack_modules__={636:(module,__webpack_exports__,__webpack_require__)=>{function startPeriodicGarbageCollection(){if(__webpack_require__.g.gc)try{const e=__webpack_require__.g;if(e.gc)return setInterval((()=>{e.gc()}),1e4)}catch(e){}else console.warn("rpc peer garbage collection not available: global.gc is not exposed.")}__webpack_require__.d(__webpack_exports__,{uD:()=>RpcPeer}),module=__webpack_require__.hmd(module);class RpcProxy{peer;entry;constructorName;proxyProps;proxyOneWayMethods;constructor(e,t,r,i,o){this.peer=e,this.entry=t,this.constructorName=r,this.proxyProps=i,this.proxyOneWayMethods=o}toPrimitive(){const e=this.peer;return`RpcProxy-${e.selfName}:${e.peerName}: ${this.constructorName}`}get(e,t,r){if(t===RpcPeer.PROPERTY_PROXY_ID)return this.entry.id;if("__proxy_constructor"===t)return this.constructorName;if("__proxy_peer"===t)return this.peer;if(t===RpcPeer.PROPERTY_PROXY_PROPERTIES)return this.proxyProps;if(t===RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS)return this.proxyOneWayMethods;if(t===RpcPeer.PROPERTY_JSON_DISABLE_SERIALIZATION||t===RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN)return;if("then"===t)return;if("constructor"===t)return;if(void 0!==this.proxyProps?.[t])return this.proxyProps?.[t];return RpcPeer.handleFunctionInvocations(this,e,t,r)||new Proxy((()=>t),this)}set(e,t,r,i){return t===RpcPeer.finalizerIdSymbol&&(this.entry.finalizerId=r),!0}apply(e,t,r){if(Object.isFrozen(this.peer.pendingResults))return Promise.reject(new RPCResultError(this.peer,"RpcPeer has been killed"));const i=e()||null,o=[],n={};for(const e of r||[])o.push(this.peer.serialize(e,n));const s={type:"apply",id:void 0,proxyId:this.entry.id,args:o,method:i};return this.proxyOneWayMethods?.includes?.(i)?(s.oneway=!0,this.peer.send(s,void 0,n),Promise.resolve()):this.peer.createPendingResult(((e,t)=>{s.id=e,this.peer.send(s,t,n)}))}}class RPCResultError extends Error{cause;constructor(e,t,r,i){super(`${e.selfName}:${e.peerName}: ${t}`),this.cause=r,i?.name&&(this.name=i?.name),i?.stack&&(this.stack=`${e.peerName}:${e.selfName}\n${r?.stack||i.stack}`)}}function compileFunction(code,params,options){params=params||[];const f=`(function(${params.join(",")}) {;${code};})`;return eval(f)}try{const e=FinalizationRegistry}catch(e){window.WeakRef=class{target;constructor(e){this.target=e}deref(){return this.target}},window.FinalizationRegistry=class{register(){}}}class RpcPeer{selfName;peerName;send;idCounter=1;params={};pendingResults={};proxyCounter=1;localProxied=new Map;localProxyMap={};remoteWeakProxies={};finalizers=new FinalizationRegistry((e=>this.finalize(e)));nameDeserializerMap=new Map;constructorSerializerMap=new Map;transportSafeArgumentTypes=RpcPeer.getDefaultTransportSafeArgumentTypes();killed;killedDeferred;static finalizerIdSymbol=Symbol("rpcFinalizerId");static isRpcProxy(e){return!!e?.[RpcPeer.PROPERTY_PROXY_ID]}static getDefaultTransportSafeArgumentTypes(){const e=new Set;return e.add(Number.name),e.add(String.name),e.add(Object.name),e.add(Boolean.name),e.add(Array.name),e}static handleFunctionInvocations(e,t,r,i){return"apply"===r?(r,i)=>e.apply(t,e,i):"call"===r?(r,...i)=>e.apply(t,e,i):"toString"===r||r===Symbol.toPrimitive?(t,...r)=>e.toPrimitive():void 0}static PROPERTY_PROXY_ID="__proxy_id";static PROPERTY_PROXY_ONEWAY_METHODS="__proxy_oneway_methods";static PROPERTY_JSON_DISABLE_SERIALIZATION="__json_disable_serialization";static PROPERTY_PROXY_PROPERTIES="__proxy_props";static PROPERTY_JSON_COPY_SERIALIZE_CHILDREN="__json_copy_serialize_children";static PROBED_PROPERTIES=new Set(["then","constructor","__proxy_id","__proxy_constructor","__proxy_peer",RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS,RpcPeer.PROPERTY_JSON_DISABLE_SERIALIZATION,RpcPeer.PROPERTY_PROXY_PROPERTIES,RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN]);constructor(e,t,r){this.selfName=e,this.peerName=t,this.send=r,this.killed=new Promise(((e,t)=>{this.killedDeferred={resolve:e,reject:t}}))}createPendingResult(e){if(Object.isFrozen(this.pendingResults))return Promise.reject(new RPCResultError(this,"RpcPeer has been killed"));const t=new Promise(((t,r)=>{const i=(this.idCounter++).toString();this.pendingResults[i]={resolve:t,reject:r},e(i,(e=>r(new RPCResultError(this,e.message,e))))}));return t.catch((()=>{})),t}kill(e){const t=new RPCResultError(this,e||"peer was killed");this.killedDeferred.reject(t);for(const e of Object.values(this.pendingResults))e.reject(t);this.pendingResults=Object.freeze({}),this.params=Object.freeze({}),this.remoteWeakProxies=Object.freeze({}),this.localProxyMap=Object.freeze({}),this.localProxied.clear()}addSerializer(e,t,r){this.nameDeserializerMap.set(t,r),this.constructorSerializerMap.set(e,t)}finalize(e){delete this.remoteWeakProxies[e.id];const t={__local_proxy_id:e.id,__local_proxy_finalizer_id:e.finalizerId,type:"finalize"};this.send(t)}async getParam(e){return this.createPendingResult(((t,r)=>{const i={id:t,type:"param",param:e};this.send(i,r)}))}evalLocal(e,t,r){const i=Object.assign({},this.params,r);let o;try{o=module.require("vm").compileFunction}catch(e){o=compileFunction}return o(e,Object.keys(i),{filename:t})(...Object.values(i))}createErrorResult(e,t){e.stack=t.stack||"no stack",e.result=t.name||"no name",e.message=t.message||"no message"}deserialize(e,t){if(!e)return e;if(e[RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN]){const r={};for(const[i,o]of Object.entries(e))r[i]=this.deserialize(o,t);return r}const{__remote_proxy_id:r,__remote_proxy_finalizer_id:i,__local_proxy_id:o,__remote_constructor_name:n,__serialized_value:s,__remote_proxy_props:a,__remote_proxy_oneway_methods:c}=e;if(r){let e=this.remoteWeakProxies[r]?.deref();return e||(e=this.newProxy(r,n,a,c)),e[RpcPeer.finalizerIdSymbol]=i,e}if(o){const e=this.localProxyMap[o];if(!e)throw new RPCResultError(this,`invalid local proxy id ${o}`);return e}const _=this.nameDeserializerMap.get(n);return _?_.deserialize(s,t):e}serialize(e,t){if(!0===e?.[RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN]){const r={};for(const[i,o]of Object.entries(e))r[i]=this.serialize(o,t);return r}if(!e||!e[RpcPeer.PROPERTY_JSON_DISABLE_SERIALIZATION]&&this.transportSafeArgumentTypes.has(e.constructor?.name))return e;let r=e.__proxy_constructor||e.constructor?.name?.toString(),i=this.localProxied.get(e);if(i){const t=(this.proxyCounter++).toString();return i.finalizerId=t,{__remote_proxy_id:i.id,__remote_proxy_finalizer_id:t,__remote_constructor_name:r,__remote_proxy_props:e?.[RpcPeer.PROPERTY_PROXY_PROPERTIES],__remote_proxy_oneway_methods:e?.[RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS]}}const{__proxy_id:o,__proxy_peer:n}=e;if(o&&n===this)return{__local_proxy_id:o};const s=this.constructorSerializerMap.get(e.constructor);if(s){r=s;const i=this.nameDeserializerMap.get(s);if(!i)throw new Error("serializer not found for "+s);const o=i.serialize(e,t);return{__remote_proxy_id:void 0,__remote_proxy_finalizer_id:void 0,__remote_constructor_name:r,__remote_proxy_props:e?.[RpcPeer.PROPERTY_PROXY_PROPERTIES],__remote_proxy_oneway_methods:e?.[RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS],__serialized_value:o}}const a=(this.proxyCounter++).toString();return i={id:a,finalizerId:a},this.localProxied.set(e,i),this.localProxyMap[a]=e,{__remote_proxy_id:a,__remote_proxy_finalizer_id:a,__remote_constructor_name:r,__remote_proxy_props:e?.[RpcPeer.PROPERTY_PROXY_PROPERTIES],__remote_proxy_oneway_methods:e?.[RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS]}}newProxy(e,t,r,i){const o={id:e,finalizerId:void 0},n=new RpcProxy(this,o,t,r,i),s=new Proxy("Function"===t||"AsyncFunction"===t?function(){}:n,n),a=new WeakRef(s);return this.remoteWeakProxies[e]=a,this.finalizers.register(n,o),s}async handleMessage(e,t){try{switch(e.type){case"param":{const t=e,r={},i={type:"result",id:t.id,result:this.serialize(this.params[t.param],r)};this.send(i,void 0,r);break}case"apply":{const r=e,i={type:"result",id:r.id||""},o={};try{const e=this.localProxyMap[r.proxyId];if(!e)throw new Error(`proxy id ${r.proxyId} not found`);const n=[];for(const e of r.args||[])n.push(this.deserialize(e,t));let s;if(r.method){if(!e[r.method])throw new Error(`target ${e?.constructor?.name} does not have method ${r.method}`);s=await e[r.method](...n)}else s=await e(...n);i.result=this.serialize(s,o)}catch(e){this.createErrorResult(i,e)}r.oneway||this.send(i,void 0,o);break}case"result":{const r=e,i=this.pendingResults[r.id];if(delete this.pendingResults[r.id],!i)throw new Error(`unknown result ${r.id}`);if(r.message||r.stack){const e=new RPCResultError(this,r.message||"no message",void 0,{name:r.result,stack:r.stack});return void i.reject(e)}i.resolve(this.deserialize(r.result,t));break}case"finalize":{const t=e,r=this.localProxyMap[t.__local_proxy_id];if(r){const e=this.localProxied.get(r);if(t.__local_proxy_finalizer_id&&t.__local_proxy_finalizer_id!==e?.finalizerId)break;delete this.localProxyMap[t.__local_proxy_id],this.localProxied.delete(r)}break}default:throw new Error(`unknown rpc message type ${e.type}`)}}catch(e){return void console.error("unhandled rpc error",this.peerName,e)}}}function getEvalSource(){return`\n (() => {\n ${RpcProxy}\n\n ${RpcPeer}\n \n return {\n RpcPeer,\n RpcProxy,\n };\n })();\n `}}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var r=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e](r,r.exports,__webpack_require__),r.loaded=!0,r.exports}__webpack_require__.d=(e,t)=>{for(var r in t)__webpack_require__.o(t,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var __webpack_exports__={};(()=>{var e=__webpack_require__(636);class t{finished=!1;resolve;reject;promise=new Promise(((e,t)=>{this.resolve=t=>{this.finished=!0,e(t)},this.reject=e=>{this.finished=!0,t(e)}}))}function r(){try{return navigator.userAgent}catch(e){}}function i(e){return new Promise((t=>{e.addEventListener("iceconnectionstatechange",(()=>{o(e)&&t(e.iceConnectionState)}))}))}function o(e){return"disconnected"===e.iceConnectionState||"failed"===e.iceConnectionState||"closed"===e.iceConnectionState}class n{pc;pcDeferred=new t;dcDeferred=new t;microphone;micEnabled=!1;onPeerConnection;options={userAgent:r(),capabilities:{audio:RTCRtpReceiver.getCapabilities?.("audio")||{codecs:void 0,headerExtensions:void 0},video:RTCRtpReceiver.getCapabilities?.("video")||{codecs:void 0,headerExtensions:void 0}},screen:{width:screen.width,height:screen.height}};constructor(){}async getOptions(){return this.options}async setMicrophone(e){if(this.microphone&&e&&!this.micEnabled){this.micEnabled=!0;const e=await navigator.mediaDevices.getUserMedia({video:!1,audio:!0});await this.microphone.replaceTrack(e.getTracks()[0])}this.microphone.track.enabled=e}close(){this.pcDeferred.promise.then((e=>{for(const t of e.getTransceivers()||[])try{t.sender?.track?.stop?.()}catch(e){}e.close()})).catch((()=>{})),this.pcDeferred.reject(new Error("iceConnectionState "+this.pc?.iceConnectionState))}async createPeerConnection(e){if(this.pc)return;const t=this.pc=new RTCPeerConnection(e.configuration);if(this.pcDeferred.resolve(t),await(this.onPeerConnection?.(t)),t.addEventListener("iceconnectionstatechange",(()=>{console.log("iceConnectionState",t.iceConnectionState),console.log("connectionState",t.connectionState),o(t)&&this.close()})),e.datachannel){const r=t.createDataChannel(e.datachannel.label,e.datachannel.dict);r.binaryType="arraybuffer",this.dcDeferred.resolve(r)}if(e.audio){const r=t.addTransceiver("audio",e.audio);"sendrecv"!==e.audio.direction&&"sendonly"!==e.audio.direction||(this.microphone=r.sender)}if(e.video)if("sendrecv"===e.video.direction||"sendonly"===e.video.direction)try{const e=await navigator.mediaDevices.getUserMedia({video:!0});for(const r of e.getTracks())t.addTrack(r)}catch(e){}else t.addTransceiver("video",e.video)}async createLocalDescription(e,t,r){await this.createPeerConnection(t);const i=new Promise((e=>{this.pc.onicecandidate=t=>{t.candidate?r?.(JSON.parse(JSON.stringify(t.candidate))):e(void 0)},this.pc.onicegatheringstatechange=()=>{"complete"===this.pc.iceGatheringState&&e(void 0)}})),o=e=>({type:e.type,sdp:e.sdp});if("offer"===e){let e=await this.pc.createOffer({offerToReceiveAudio:!!t.audio,offerToReceiveVideo:!!t.video});const n=this.pc.setLocalDescription(e);return r||(await n,await i,e=await this.pc.createOffer({offerToReceiveAudio:!!t.audio,offerToReceiveVideo:!!t.video})),o(e)}{let e=await this.pc.createAnswer();const t=this.pc.setLocalDescription(e);return r||(await t,await i,e=this.pc.currentLocalDescription||e),o(e)}}async setRemoteDescription(e,t){await this.createPeerConnection(t),await this.pc.setRemoteDescription(e)}async addIceCandidate(e){await this.pc.addIceCandidate(e)}async endSession(){}}document.addEventListener("DOMContentLoaded",(function(t){const r=new cast.framework.CastReceiverOptions;r.disableIdleTimeout=!0,cast.framework.CastReceiverContext.getInstance().start(r);const o=cast.framework.CastReceiverContext.getInstance().getPlayerManager(),s=document.getElementById("media");let a;o.setMessageInterceptor(cast.framework.messages.MessageType.LOAD,(t=>{console.log(t);const r=t.media.entity||t.media.contentId,o=t.credentials??t.media.customData.token,c=new URL(r),_=c.pathname,d={};for(const[e,t]of new URLSearchParams(c.search))d[e]=t;const p={path:_,query:d},l=eio(`wss://${c.host}`,p);return l.on("open",(async()=>{l.send(JSON.stringify({token:o}));const t=new e.uD("cast-receiver","host",((e,t)=>{try{l.send(JSON.stringify(e))}catch(e){t?.(e)}}));l.on("message",(e=>{t.handleMessage(JSON.parse(e))}));const r=new n,c=()=>{console.log("cleanup"),l.close(),r.pcDeferred.promise.then((e=>e.close()))};a?.(),a=c,l.on("close",(()=>{console.log("socket io connection close event"),c()})),r.onPeerConnection=async e=>{i(e).then(c);const t=new MediaStream(e.getReceivers().map((e=>e.track)));e.ontrack=e=>t.addTrack(e.track),s.srcObject=t,function(e){return new Promise(((t,r)=>{"connected"!==e.iceConnectionState?(e.addEventListener("iceconnectionstatechange",(()=>{"connected"===e.iceConnectionState&&t(void 0)})),i(e).then((e=>r(new Error(e))))):t(void 0)}))}(e).then((()=>{l.removeAllListeners()}))},t.params.session=r})),null}))}))})()})(); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QU1DLEVBQWMsSUFBSUMsWUFBWXJILEVBQUdzSCxlQUFlQyxLQUFLalMsR0FBYUEsRUFBU29NLFNBQ2pGMUIsRUFBR3dILFFBQVVuVCxHQUFLK1MsRUFBWXJFLFNBQVMxTyxFQUFFcU4sT0FDekNWLEVBQU15RyxVQUFZTCxFRGhEM0IsU0FBd0NwSCxHQUMzQyxPQUFPLElBQUlySixTQUFRLENBQUNlLEVBQVNkLEtBQ0ssY0FBMUJvSixFQUFHRyxvQkFJUEgsRUFBR0MsaUJBQWlCLDRCQUE0QixLQUNkLGNBQTFCRCxFQUFHRyxvQkFDSHpJLE9BQVE1QixFQUFVLElBRTFCaUssRUFBNEJDLEdBQUk0QixNQUFLOEYsR0FBVTlRLEVBQU8sSUFBSWdCLE1BQU04UCxPQVA1RGhRLE9BQVE1QixFQU82RCxHQUVqRixDQ3FDZ0I2UixDQUErQjNILEdBQzFCNEIsTUFBSyxLQUNOK0UsRUFBT2lCLG9CQUFvQixHQUU3QixFQUVOYixFQUFRMU8sT0FBZ0IsUUFBSTZPLENBQU8sSUFFaEMsSUFBSSxHQUduQixHIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vZGlzdC9zZXJ2ZXIvc3JjL3JwYy5qcyIsIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2hhcm1vbnkgbW9kdWxlIGRlY29yYXRvciIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly8vLi9kaXN0L2NvbW1vbi9zcmMvZGVmZXJyZWQuanMiLCJ3ZWJwYWNrOi8vLy4vZGlzdC9jb21tb24vc3JjL3J0Yy1zaWduYWxpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vZGlzdC9kb2NzL3BsdWdpbnMvZ29vZ2xlLWhvbWUvY2FzdC1yZWNlaXZlci9zcmMvY2FzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gc3RhcnRQZXJpb2RpY0dhcmJhZ2VDb2xsZWN0aW9uKCkge1xuICAgIGlmICghZ2xvYmFsLmdjKSB7XG4gICAgICAgIGNvbnNvbGUud2FybigncnBjIHBlZXIgZ2FyYmFnZSBjb2xsZWN0aW9uIG5vdCBhdmFpbGFibGU6IGdsb2JhbC5nYyBpcyBub3QgZXhwb3NlZC4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBnID0gZ2xvYmFsO1xuICAgICAgICBpZiAoZy5nYykge1xuICAgICAgICAgICAgcmV0dXJuIHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICBnLmdjKCk7XG4gICAgICAgICAgICB9LCAxMDAwMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICB9XG59XG5jbGFzcyBScGNQcm94eSB7XG4gICAgcGVlcjtcbiAgICBlbnRyeTtcbiAgICBjb25zdHJ1Y3Rvck5hbWU7XG4gICAgcHJveHlQcm9wcztcbiAgICBwcm94eU9uZVdheU1ldGhvZHM7XG4gICAgY29uc3RydWN0b3IocGVlciwgZW50cnksIGNvbnN0cnVjdG9yTmFtZSwgcHJveHlQcm9wcywgcHJveHlPbmVXYXlNZXRob2RzKSB7XG4gICAgICAgIHRoaXMucGVlciA9IHBlZXI7XG4gICAgICAgIHRoaXMuZW50cnkgPSBlbnRyeTtcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvck5hbWUgPSBjb25zdHJ1Y3Rvck5hbWU7XG4gICAgICAgIHRoaXMucHJveHlQcm9wcyA9IHByb3h5UHJvcHM7XG4gICAgICAgIHRoaXMucHJveHlPbmVXYXlNZXRob2RzID0gcHJveHlPbmVXYXlNZXRob2RzO1xuICAgIH1cbiAgICB0b1ByaW1pdGl2ZSgpIHtcbiAgICAgICAgY29uc3QgcGVlciA9IHRoaXMucGVlcjtcbiAgICAgICAgcmV0dXJuIGBScGNQcm94eS0ke3BlZXIuc2VsZk5hbWV9OiR7cGVlci5wZWVyTmFtZX06ICR7dGhpcy5jb25zdHJ1Y3Rvck5hbWV9YDtcbiAgICB9XG4gICAgZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYgKHAgPT09IFJwY1BlZXIuUFJPUEVSVFlfUFJPWFlfSUQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbnRyeS5pZDtcbiAgICAgICAgaWYgKHAgPT09ICdfX3Byb3h5X2NvbnN0cnVjdG9yJylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yTmFtZTtcbiAgICAgICAgaWYgKHAgPT09ICdfX3Byb3h5X3BlZXInKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGVlcjtcbiAgICAgICAgaWYgKHAgPT09IFJwY1BlZXIuUFJPUEVSVFlfUFJPWFlfUFJPUEVSVElFUylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3h5UHJvcHM7XG4gICAgICAgIGlmIChwID09PSBScGNQZWVyLlBST1BFUlRZX1BST1hZX09ORVdBWV9NRVRIT0RTKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJveHlPbmVXYXlNZXRob2RzO1xuICAgICAgICBpZiAocCA9PT0gUnBjUGVlci5QUk9QRVJUWV9KU09OX0RJU0FCTEVfU0VSSUFMSVpBVElPTiB8fCBwID09PSBScGNQZWVyLlBST1BFUlRZX0pTT05fQ09QWV9TRVJJQUxJWkVfQ0hJTERSRU4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmIChwID09PSAndGhlbicpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmIChwID09PSAnY29uc3RydWN0b3InKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5wcm94eVByb3BzPy5bcF0gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3h5UHJvcHM/LltwXTtcbiAgICAgICAgY29uc3QgaGFuZGxlZCA9IFJwY1BlZXIuaGFuZGxlRnVuY3Rpb25JbnZvY2F0aW9ucyh0aGlzLCB0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgaWYgKGhhbmRsZWQpXG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlZDtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eSgoKSA9PiBwLCB0aGlzKTtcbiAgICB9XG4gICAgc2V0KHRhcmdldCwgcCwgdmFsdWUsIHJlY2VpdmVyKSB7XG4gICAgICAgIGlmIChwID09PSBScGNQZWVyLmZpbmFsaXplcklkU3ltYm9sKVxuICAgICAgICAgICAgdGhpcy5lbnRyeS5maW5hbGl6ZXJJZCA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXBwbHkodGFyZ2V0LCB0aGlzQXJnLCBhcmdBcnJheSkge1xuICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuKHRoaXMucGVlci5wZW5kaW5nUmVzdWx0cykpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFJQQ1Jlc3VsdEVycm9yKHRoaXMucGVlciwgJ1JwY1BlZXIgaGFzIGJlZW4ga2lsbGVkJykpO1xuICAgICAgICAvLyBycGMgb2JqZWN0cyBjYW4gYmUgZnVuY3Rpb25zLiBpZiB0aGUgZnVuY3Rpb24gaXMgYSBvbmV3YXkgbWV0aG9kLFxuICAgICAgICAvLyBpdCB3aWxsIGhhdmUgYSBudWxsIGluIHRoZSBvbmV3YXkgbWV0aG9kIGxpc3QuIHRoaXMgaXMgYmVjYXVzZVxuICAgICAgICAvLyB1bmRlZmluZWQgaXMgbm90IEpTT04gc2VyaWFsaXphYmxlLlxuICAgICAgICBjb25zdCBtZXRob2QgPSB0YXJnZXQoKSB8fCBudWxsO1xuICAgICAgICBjb25zdCBhcmdzID0gW107XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb25Db250ZXh0ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIChhcmdBcnJheSB8fCBbXSkpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaCh0aGlzLnBlZXIuc2VyaWFsaXplKGFyZywgc2VyaWFsaXphdGlvbkNvbnRleHQpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBycGNBcHBseSA9IHtcbiAgICAgICAgICAgIHR5cGU6IFwiYXBwbHlcIixcbiAgICAgICAgICAgIGlkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwcm94eUlkOiB0aGlzLmVudHJ5LmlkLFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMucHJveHlPbmVXYXlNZXRob2RzPy5pbmNsdWRlcz8uKG1ldGhvZCkpIHtcbiAgICAgICAgICAgIHJwY0FwcGx5Lm9uZXdheSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnBlZXIuc2VuZChycGNBcHBseSwgdW5kZWZpbmVkLCBzZXJpYWxpemF0aW9uQ29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGVlci5jcmVhdGVQZW5kaW5nUmVzdWx0KChpZCwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBycGNBcHBseS5pZCA9IGlkO1xuICAgICAgICAgICAgdGhpcy5wZWVyLnNlbmQocnBjQXBwbHksIHJlamVjdCwgc2VyaWFsaXphdGlvbkNvbnRleHQpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyB0b2RvOiBlcnJvciBjb25zdHJ1Y3RvciBhZGRzIGEgXCJjYXVzZVwiIHZhcmlhYmxlIGluIENocm9tZSA5MywgTm9kZSB2Pz9cbmV4cG9ydCBjbGFzcyBSUENSZXN1bHRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjYXVzZTtcbiAgICBjb25zdHJ1Y3RvcihwZWVyLCBtZXNzYWdlLCBjYXVzZSwgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihgJHtwZWVyLnNlbGZOYW1lfToke3BlZXIucGVlck5hbWV9OiAke21lc3NhZ2V9YCk7XG4gICAgICAgIHRoaXMuY2F1c2UgPSBjYXVzZTtcbiAgICAgICAgaWYgKG9wdGlvbnM/Lm5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG9wdGlvbnM/Lm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LnN0YWNrKSB7XG4gICAgICAgICAgICB0aGlzLnN0YWNrID0gYCR7cGVlci5wZWVyTmFtZX06JHtwZWVyLnNlbGZOYW1lfVxcbiR7Y2F1c2U/LnN0YWNrIHx8IG9wdGlvbnMuc3RhY2t9YDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXBpbGVGdW5jdGlvbihjb2RlLCBwYXJhbXMsIG9wdGlvbnMpIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwgW107XG4gICAgY29uc3QgZiA9IGAoZnVuY3Rpb24oJHtwYXJhbXMuam9pbignLCcpfSkgezske2NvZGV9O30pYDtcbiAgICByZXR1cm4gZXZhbChmKTtcbn1cbnRyeSB7XG4gICAgY29uc3QgZnIgPSBGaW5hbGl6YXRpb25SZWdpc3RyeTtcbn1cbmNhdGNoIChlKSB7XG4gICAgd2luZG93LldlYWtSZWYgPSBjbGFzcyBXZWFrUmVmIHtcbiAgICAgICAgdGFyZ2V0O1xuICAgICAgICBjb25zdHJ1Y3Rvcih0YXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIGRlcmVmKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICB3aW5kb3cuRmluYWxpemF0aW9uUmVnaXN0cnkgPSBjbGFzcyBGaW5hbGl6YXRpb25SZWdpc3RyeSB7XG4gICAgICAgIHJlZ2lzdGVyKCkge1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydCBjbGFzcyBScGNQZWVyIHtcbiAgICBzZWxmTmFtZTtcbiAgICBwZWVyTmFtZTtcbiAgICBzZW5kO1xuICAgIGlkQ291bnRlciA9IDE7XG4gICAgcGFyYW1zID0ge307XG4gICAgcGVuZGluZ1Jlc3VsdHMgPSB7fTtcbiAgICBwcm94eUNvdW50ZXIgPSAxO1xuICAgIGxvY2FsUHJveGllZCA9IG5ldyBNYXAoKTtcbiAgICBsb2NhbFByb3h5TWFwID0ge307XG4gICAgcmVtb3RlV2Vha1Byb3hpZXMgPSB7fTtcbiAgICBmaW5hbGl6ZXJzID0gbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KGVudHJ5ID0+IHRoaXMuZmluYWxpemUoZW50cnkpKTtcbiAgICBuYW1lRGVzZXJpYWxpemVyTWFwID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0cnVjdG9yU2VyaWFsaXplck1hcCA9IG5ldyBNYXAoKTtcbiAgICB0cmFuc3BvcnRTYWZlQXJndW1lbnRUeXBlcyA9IFJwY1BlZXIuZ2V0RGVmYXVsdFRyYW5zcG9ydFNhZmVBcmd1bWVudFR5cGVzKCk7XG4gICAga2lsbGVkO1xuICAgIGtpbGxlZERlZmVycmVkO1xuICAgIHN0YXRpYyBmaW5hbGl6ZXJJZFN5bWJvbCA9IFN5bWJvbCgncnBjRmluYWxpemVySWQnKTtcbiAgICBzdGF0aWMgaXNScGNQcm94eSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gISF2YWx1ZT8uW1JwY1BlZXIuUFJPUEVSVFlfUFJPWFlfSURdO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0RGVmYXVsdFRyYW5zcG9ydFNhZmVBcmd1bWVudFR5cGVzKCkge1xuICAgICAgICBjb25zdCBqc29uU2VyaWFsaXphYmxlID0gbmV3IFNldCgpO1xuICAgICAgICBqc29uU2VyaWFsaXphYmxlLmFkZChOdW1iZXIubmFtZSk7XG4gICAgICAgIGpzb25TZXJpYWxpemFibGUuYWRkKFN0cmluZy5uYW1lKTtcbiAgICAgICAganNvblNlcmlhbGl6YWJsZS5hZGQoT2JqZWN0Lm5hbWUpO1xuICAgICAgICBqc29uU2VyaWFsaXphYmxlLmFkZChCb29sZWFuLm5hbWUpO1xuICAgICAgICBqc29uU2VyaWFsaXphYmxlLmFkZChBcnJheS5uYW1lKTtcbiAgICAgICAgcmV0dXJuIGpzb25TZXJpYWxpemFibGU7XG4gICAgfVxuICAgIHN0YXRpYyBoYW5kbGVGdW5jdGlvbkludm9jYXRpb25zKHRoaXosIHRhcmdldCwgcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYgKHAgPT09ICdhcHBseScpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpc0FyZywgYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGl6LmFwcGx5KHRhcmdldCwgdGhpeiwgYXJncyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHAgPT09ICdjYWxsJykge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzQXJnLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXouYXBwbHkodGFyZ2V0LCB0aGl6LCBhcmdzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocCA9PT0gJ3RvU3RyaW5nJyB8fCBwID09PSBTeW1ib2wudG9QcmltaXRpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpc0FyZywgLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGl6LnRvUHJpbWl0aXZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBQUk9QRVJUWV9QUk9YWV9JRCA9ICdfX3Byb3h5X2lkJztcbiAgICBzdGF0aWMgUFJPUEVSVFlfUFJPWFlfT05FV0FZX01FVEhPRFMgPSAnX19wcm94eV9vbmV3YXlfbWV0aG9kcyc7XG4gICAgc3RhdGljIFBST1BFUlRZX0pTT05fRElTQUJMRV9TRVJJQUxJWkFUSU9OID0gJ19fanNvbl9kaXNhYmxlX3NlcmlhbGl6YXRpb24nO1xuICAgIHN0YXRpYyBQUk9QRVJUWV9QUk9YWV9QUk9QRVJUSUVTID0gJ19fcHJveHlfcHJvcHMnO1xuICAgIHN0YXRpYyBQUk9QRVJUWV9KU09OX0NPUFlfU0VSSUFMSVpFX0NISUxEUkVOID0gJ19fanNvbl9jb3B5X3NlcmlhbGl6ZV9jaGlsZHJlbic7XG4gICAgc3RhdGljIFBST0JFRF9QUk9QRVJUSUVTID0gbmV3IFNldChbXG4gICAgICAgICd0aGVuJyxcbiAgICAgICAgJ2NvbnN0cnVjdG9yJyxcbiAgICAgICAgJ19fcHJveHlfaWQnLFxuICAgICAgICAnX19wcm94eV9jb25zdHJ1Y3RvcicsXG4gICAgICAgICdfX3Byb3h5X3BlZXInLFxuICAgICAgICBScGNQZWVyLlBST1BFUlRZX1BST1hZX09ORVdBWV9NRVRIT0RTLFxuICAgICAgICBScGNQZWVyLlBST1BFUlRZX0pTT05fRElTQUJMRV9TRVJJQUxJWkFUSU9OLFxuICAgICAgICBScGNQZWVyLlBST1BFUlRZX1BST1hZX1BST1BFUlRJRVMsXG4gICAgICAgIFJwY1BlZXIuUFJPUEVSVFlfSlNPTl9DT1BZX1NFUklBTElaRV9DSElMRFJFTixcbiAgICBdKTtcbiAgICBjb25zdHJ1Y3RvcihzZWxmTmFtZSwgcGVlck5hbWUsIHNlbmQpIHtcbiAgICAgICAgdGhpcy5zZWxmTmFtZSA9IHNlbGZOYW1lO1xuICAgICAgICB0aGlzLnBlZXJOYW1lID0gcGVlck5hbWU7XG4gICAgICAgIHRoaXMuc2VuZCA9IHNlbmQ7XG4gICAgICAgIHRoaXMua2lsbGVkID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5raWxsZWREZWZlcnJlZCA9IHsgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjcmVhdGVQZW5kaW5nUmVzdWx0KGNiKSB7XG4gICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4odGhpcy5wZW5kaW5nUmVzdWx0cykpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFJQQ1Jlc3VsdEVycm9yKHRoaXMsICdScGNQZWVyIGhhcyBiZWVuIGtpbGxlZCcpKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gKHRoaXMuaWRDb3VudGVyKyspLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdSZXN1bHRzW2lkXSA9IHsgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICAgICAgICBjYihpZCwgZSA9PiByZWplY3QobmV3IFJQQ1Jlc3VsdEVycm9yKHRoaXMsIGUubWVzc2FnZSwgZSkpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHRvZG86IG1ha2UgdGhpcyBhbiBvcHRpb24gc28gcnBjIGRvZXNuJ3QgbnVrZSB0aGUgcHJvY2VzcyBpZiB1bmNhdWdodD9cbiAgICAgICAgcHJvbWlzZS5jYXRjaCgoKSA9PiB7IH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAga2lsbChtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFJQQ1Jlc3VsdEVycm9yKHRoaXMsIG1lc3NhZ2UgfHwgJ3BlZXIgd2FzIGtpbGxlZCcpO1xuICAgICAgICB0aGlzLmtpbGxlZERlZmVycmVkLnJlamVjdChlcnJvcik7XG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIE9iamVjdC52YWx1ZXModGhpcy5wZW5kaW5nUmVzdWx0cykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGVuZGluZ1Jlc3VsdHMgPSBPYmplY3QuZnJlZXplKHt9KTtcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuZnJlZXplKHt9KTtcbiAgICAgICAgdGhpcy5yZW1vdGVXZWFrUHJveGllcyA9IE9iamVjdC5mcmVlemUoe30pO1xuICAgICAgICB0aGlzLmxvY2FsUHJveHlNYXAgPSBPYmplY3QuZnJlZXplKHt9KTtcbiAgICAgICAgdGhpcy5sb2NhbFByb3hpZWQuY2xlYXIoKTtcbiAgICB9XG4gICAgLy8gbmVlZCBhIG5hbWUvY29uc3RydWN0b3IgbWFwIGR1ZSB0byBiYWJlbCBuYW1lIG1hbmdsaW5nPyBmaXggc29tZWhvdz9cbiAgICBhZGRTZXJpYWxpemVyKGN0ciwgbmFtZSwgc2VyaWFsaXplcikge1xuICAgICAgICB0aGlzLm5hbWVEZXNlcmlhbGl6ZXJNYXAuc2V0KG5hbWUsIHNlcmlhbGl6ZXIpO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdG9yU2VyaWFsaXplck1hcC5zZXQoY3RyLCBuYW1lKTtcbiAgICB9XG4gICAgZmluYWxpemUoZW50cnkpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMucmVtb3RlV2Vha1Byb3hpZXNbZW50cnkuaWRdO1xuICAgICAgICBjb25zdCBycGNGaW5hbGl6ZSA9IHtcbiAgICAgICAgICAgIF9fbG9jYWxfcHJveHlfaWQ6IGVudHJ5LmlkLFxuICAgICAgICAgICAgX19sb2NhbF9wcm94eV9maW5hbGl6ZXJfaWQ6IGVudHJ5LmZpbmFsaXplcklkLFxuICAgICAgICAgICAgdHlwZTogJ2ZpbmFsaXplJyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zZW5kKHJwY0ZpbmFsaXplKTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0UGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUGVuZGluZ1Jlc3VsdCgoaWQsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwYXJhbScsXG4gICAgICAgICAgICAgICAgcGFyYW0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zZW5kKHBhcmFtTWVzc2FnZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGV2YWxMb2NhbChzY3JpcHQsIGZpbGVuYW1lLCBjb2VyY2VkUGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucGFyYW1zLCBjb2VyY2VkUGFyYW1zKTtcbiAgICAgICAgbGV0IGNvbXBpbGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBwcmV2ZW50IGJ1bmRsZXJzIGZyb20gdHJ5aW5nIHRvIGluY2x1ZGUgbm9uLWV4aXN0ZW50IHZtIG1vZHVsZS5cbiAgICAgICAgICAgIGNvbXBpbGUgPSBtb2R1bGVbYHJlcXVpcmVgXSgndm0nKS5jb21waWxlRnVuY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbXBpbGUgPSBjb21waWxlRnVuY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZiA9IGNvbXBpbGUoc2NyaXB0LCBPYmplY3Qua2V5cyhwYXJhbXMpLCB7XG4gICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZiguLi5PYmplY3QudmFsdWVzKHBhcmFtcykpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNyZWF0ZUVycm9yUmVzdWx0KHJlc3VsdCwgZSkge1xuICAgICAgICByZXN1bHQuc3RhY2sgPSBlLnN0YWNrIHx8ICdubyBzdGFjayc7XG4gICAgICAgIHJlc3VsdC5yZXN1bHQgPSBlLm5hbWUgfHwgJ25vIG5hbWUnO1xuICAgICAgICByZXN1bHQubWVzc2FnZSA9IGUubWVzc2FnZSB8fCAnbm8gbWVzc2FnZSc7XG4gICAgfVxuICAgIGRlc2VyaWFsaXplKHZhbHVlLCBkZXNlcmlhbGl6YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIGNvbnN0IGNvcHlTZXJpYWxpemVDaGlsZHJlbiA9IHZhbHVlW1JwY1BlZXIuUFJPUEVSVFlfSlNPTl9DT1BZX1NFUklBTElaRV9DSElMRFJFTl07XG4gICAgICAgIGlmIChjb3B5U2VyaWFsaXplQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldFtrZXldID0gdGhpcy5kZXNlcmlhbGl6ZSh2YWwsIGRlc2VyaWFsaXphdGlvbkNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IF9fcmVtb3RlX3Byb3h5X2lkLCBfX3JlbW90ZV9wcm94eV9maW5hbGl6ZXJfaWQsIF9fbG9jYWxfcHJveHlfaWQsIF9fcmVtb3RlX2NvbnN0cnVjdG9yX25hbWUsIF9fc2VyaWFsaXplZF92YWx1ZSwgX19yZW1vdGVfcHJveHlfcHJvcHMsIF9fcmVtb3RlX3Byb3h5X29uZXdheV9tZXRob2RzIH0gPSB2YWx1ZTtcbiAgICAgICAgaWYgKF9fcmVtb3RlX3Byb3h5X2lkKSB7XG4gICAgICAgICAgICBsZXQgcHJveHkgPSB0aGlzLnJlbW90ZVdlYWtQcm94aWVzW19fcmVtb3RlX3Byb3h5X2lkXT8uZGVyZWYoKTtcbiAgICAgICAgICAgIGlmICghcHJveHkpXG4gICAgICAgICAgICAgICAgcHJveHkgPSB0aGlzLm5ld1Byb3h5KF9fcmVtb3RlX3Byb3h5X2lkLCBfX3JlbW90ZV9jb25zdHJ1Y3Rvcl9uYW1lLCBfX3JlbW90ZV9wcm94eV9wcm9wcywgX19yZW1vdGVfcHJveHlfb25ld2F5X21ldGhvZHMpO1xuICAgICAgICAgICAgcHJveHlbUnBjUGVlci5maW5hbGl6ZXJJZFN5bWJvbF0gPSBfX3JlbW90ZV9wcm94eV9maW5hbGl6ZXJfaWQ7XG4gICAgICAgICAgICByZXR1cm4gcHJveHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9fbG9jYWxfcHJveHlfaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IHRoaXMubG9jYWxQcm94eU1hcFtfX2xvY2FsX3Byb3h5X2lkXTtcbiAgICAgICAgICAgIGlmICghcmV0KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSUENSZXN1bHRFcnJvcih0aGlzLCBgaW52YWxpZCBsb2NhbCBwcm94eSBpZCAke19fbG9jYWxfcHJveHlfaWR9YCk7XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlc2VyaWFsaXplciA9IHRoaXMubmFtZURlc2VyaWFsaXplck1hcC5nZXQoX19yZW1vdGVfY29uc3RydWN0b3JfbmFtZSk7XG4gICAgICAgIGlmIChkZXNlcmlhbGl6ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoX19zZXJpYWxpemVkX3ZhbHVlLCBkZXNlcmlhbGl6YXRpb25Db250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHNlcmlhbGl6ZSh2YWx1ZSwgc2VyaWFsaXphdGlvbkNvbnRleHQpIHtcbiAgICAgICAgaWYgKHZhbHVlPy5bUnBjUGVlci5QUk9QRVJUWV9KU09OX0NPUFlfU0VSSUFMSVpFX0NISUxEUkVOXSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29uc3QgcmV0ID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0W2tleV0gPSB0aGlzLnNlcmlhbGl6ZSh2YWwsIHNlcmlhbGl6YXRpb25Db250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF2YWx1ZSB8fCAoIXZhbHVlW1JwY1BlZXIuUFJPUEVSVFlfSlNPTl9ESVNBQkxFX1NFUklBTElaQVRJT05dICYmIHRoaXMudHJhbnNwb3J0U2FmZUFyZ3VtZW50VHlwZXMuaGFzKHZhbHVlLmNvbnN0cnVjdG9yPy5uYW1lKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgX19yZW1vdGVfY29uc3RydWN0b3JfbmFtZSA9IHZhbHVlLl9fcHJveHlfY29uc3RydWN0b3IgfHwgdmFsdWUuY29uc3RydWN0b3I/Lm5hbWU/LnRvU3RyaW5nKCk7XG4gICAgICAgIGxldCBwcm94aWVkRW50cnkgPSB0aGlzLmxvY2FsUHJveGllZC5nZXQodmFsdWUpO1xuICAgICAgICBpZiAocHJveGllZEVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBfX3JlbW90ZV9wcm94eV9maW5hbGl6ZXJfaWQgPSAodGhpcy5wcm94eUNvdW50ZXIrKykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHByb3hpZWRFbnRyeS5maW5hbGl6ZXJJZCA9IF9fcmVtb3RlX3Byb3h5X2ZpbmFsaXplcl9pZDtcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IHtcbiAgICAgICAgICAgICAgICBfX3JlbW90ZV9wcm94eV9pZDogcHJveGllZEVudHJ5LmlkLFxuICAgICAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X2ZpbmFsaXplcl9pZCxcbiAgICAgICAgICAgICAgICBfX3JlbW90ZV9jb25zdHJ1Y3Rvcl9uYW1lLFxuICAgICAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X3Byb3BzOiB2YWx1ZT8uW1JwY1BlZXIuUFJPUEVSVFlfUFJPWFlfUFJPUEVSVElFU10sXG4gICAgICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfb25ld2F5X21ldGhvZHM6IHZhbHVlPy5bUnBjUGVlci5QUk9QRVJUWV9QUk9YWV9PTkVXQVlfTUVUSE9EU10sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IF9fcHJveHlfaWQsIF9fcHJveHlfcGVlciB9ID0gdmFsdWU7XG4gICAgICAgIGlmIChfX3Byb3h5X2lkICYmIF9fcHJveHlfcGVlciA9PT0gdGhpcykge1xuICAgICAgICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICAgICAgICAgIF9fbG9jYWxfcHJveHlfaWQ6IF9fcHJveHlfaWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXJpYWxpemVyTWFwTmFtZSA9IHRoaXMuY29uc3RydWN0b3JTZXJpYWxpemVyTWFwLmdldCh2YWx1ZS5jb25zdHJ1Y3Rvcik7XG4gICAgICAgIGlmIChzZXJpYWxpemVyTWFwTmFtZSkge1xuICAgICAgICAgICAgX19yZW1vdGVfY29uc3RydWN0b3JfbmFtZSA9IHNlcmlhbGl6ZXJNYXBOYW1lO1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplciA9IHRoaXMubmFtZURlc2VyaWFsaXplck1hcC5nZXQoc2VyaWFsaXplck1hcE5hbWUpO1xuICAgICAgICAgICAgaWYgKCFzZXJpYWxpemVyKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2VyaWFsaXplciBub3QgZm91bmQgZm9yICcgKyBzZXJpYWxpemVyTWFwTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gc2VyaWFsaXplci5zZXJpYWxpemUodmFsdWUsIHNlcmlhbGl6YXRpb25Db250ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IHtcbiAgICAgICAgICAgICAgICBfX3JlbW90ZV9wcm94eV9pZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X2ZpbmFsaXplcl9pZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIF9fcmVtb3RlX2NvbnN0cnVjdG9yX25hbWUsXG4gICAgICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfcHJvcHM6IHZhbHVlPy5bUnBjUGVlci5QUk9QRVJUWV9QUk9YWV9QUk9QRVJUSUVTXSxcbiAgICAgICAgICAgICAgICBfX3JlbW90ZV9wcm94eV9vbmV3YXlfbWV0aG9kczogdmFsdWU/LltScGNQZWVyLlBST1BFUlRZX1BST1hZX09ORVdBWV9NRVRIT0RTXSxcbiAgICAgICAgICAgICAgICBfX3NlcmlhbGl6ZWRfdmFsdWU6IHNlcmlhbGl6ZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBfX3JlbW90ZV9wcm94eV9pZCA9ICh0aGlzLnByb3h5Q291bnRlcisrKS50b1N0cmluZygpO1xuICAgICAgICBwcm94aWVkRW50cnkgPSB7XG4gICAgICAgICAgICBpZDogX19yZW1vdGVfcHJveHlfaWQsXG4gICAgICAgICAgICBmaW5hbGl6ZXJJZDogX19yZW1vdGVfcHJveHlfaWQsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubG9jYWxQcm94aWVkLnNldCh2YWx1ZSwgcHJveGllZEVudHJ5KTtcbiAgICAgICAgdGhpcy5sb2NhbFByb3h5TWFwW19fcmVtb3RlX3Byb3h5X2lkXSA9IHZhbHVlO1xuICAgICAgICBjb25zdCByZXQgPSB7XG4gICAgICAgICAgICBfX3JlbW90ZV9wcm94eV9pZCxcbiAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X2ZpbmFsaXplcl9pZDogX19yZW1vdGVfcHJveHlfaWQsXG4gICAgICAgICAgICBfX3JlbW90ZV9jb25zdHJ1Y3Rvcl9uYW1lLFxuICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfcHJvcHM6IHZhbHVlPy5bUnBjUGVlci5QUk9QRVJUWV9QUk9YWV9QUk9QRVJUSUVTXSxcbiAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X29uZXdheV9tZXRob2RzOiB2YWx1ZT8uW1JwY1BlZXIuUFJPUEVSVFlfUFJPWFlfT05FV0FZX01FVEhPRFNdLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICBuZXdQcm94eShwcm94eUlkLCBwcm94eUNvbnN0cnVjdG9yTmFtZSwgcHJveHlQcm9wcywgcHJveHlPbmVXYXlNZXRob2RzKSB7XG4gICAgICAgIGNvbnN0IGxvY2FsUHJveGllZEVudHJ5ID0ge1xuICAgICAgICAgICAgaWQ6IHByb3h5SWQsXG4gICAgICAgICAgICBmaW5hbGl6ZXJJZDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBycGMgPSBuZXcgUnBjUHJveHkodGhpcywgbG9jYWxQcm94aWVkRW50cnksIHByb3h5Q29uc3RydWN0b3JOYW1lLCBwcm94eVByb3BzLCBwcm94eU9uZVdheU1ldGhvZHMpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBwcm94eUNvbnN0cnVjdG9yTmFtZSA9PT0gJ0Z1bmN0aW9uJyB8fCBwcm94eUNvbnN0cnVjdG9yTmFtZSA9PT0gJ0FzeW5jRnVuY3Rpb24nID8gZnVuY3Rpb24gKCkgeyB9IDogcnBjO1xuICAgICAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIHJwYyk7XG4gICAgICAgIGNvbnN0IHdlYWtyZWYgPSBuZXcgV2Vha1JlZihwcm94eSk7XG4gICAgICAgIHRoaXMucmVtb3RlV2Vha1Byb3hpZXNbcHJveHlJZF0gPSB3ZWFrcmVmO1xuICAgICAgICB0aGlzLmZpbmFsaXplcnMucmVnaXN0ZXIocnBjLCBsb2NhbFByb3hpZWRFbnRyeSk7XG4gICAgICAgIHJldHVybiBwcm94eTtcbiAgICB9XG4gICAgYXN5bmMgaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBkZXNlcmlhbGl6YXRpb25Db250ZXh0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3BhcmFtJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBycGNQYXJhbSA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb25Db250ZXh0ID0ge307XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZXN1bHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJwY1BhcmFtLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB0aGlzLnNlcmlhbGl6ZSh0aGlzLnBhcmFtc1tycGNQYXJhbS5wYXJhbV0sIHNlcmlhbGl6YXRpb25Db250ZXh0KVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbmQocmVzdWx0LCB1bmRlZmluZWQsIHNlcmlhbGl6YXRpb25Db250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2FwcGx5Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBycGNBcHBseSA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZXN1bHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJwY0FwcGx5LmlkIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uQ29udGV4dCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5sb2NhbFByb3h5TWFwW3JwY0FwcGx5LnByb3h5SWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBwcm94eSBpZCAke3JwY0FwcGx5LnByb3h5SWR9IG5vdCBmb3VuZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgKHJwY0FwcGx5LmFyZ3MgfHwgW10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKHRoaXMuZGVzZXJpYWxpemUoYXJnLCBkZXNlcmlhbGl6YXRpb25Db250ZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnBjQXBwbHkubWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWV0aG9kID0gdGFyZ2V0W3JwY0FwcGx5Lm1ldGhvZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXRob2QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdGFyZ2V0ICR7dGFyZ2V0Py5jb25zdHJ1Y3Rvcj8ubmFtZX0gZG9lcyBub3QgaGF2ZSBtZXRob2QgJHtycGNBcHBseS5tZXRob2R9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhd2FpdCB0YXJnZXRbcnBjQXBwbHkubWV0aG9kXSguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXdhaXQgdGFyZ2V0KC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc3VsdCA9IHRoaXMuc2VyaWFsaXplKHZhbHVlLCBzZXJpYWxpemF0aW9uQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ2ZhaWx1cmUnLCBycGNBcHBseS5tZXRob2QsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVFcnJvclJlc3VsdChyZXN1bHQsIGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghcnBjQXBwbHkub25ld2F5KVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kKHJlc3VsdCwgdW5kZWZpbmVkLCBzZXJpYWxpemF0aW9uQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdyZXN1bHQnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJwY1Jlc3VsdCA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gdGhpcy5wZW5kaW5nUmVzdWx0c1tycGNSZXN1bHQuaWRdO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVzdWx0c1tycGNSZXN1bHQuaWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlZmVycmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIHJlc3VsdCAke3JwY1Jlc3VsdC5pZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJwY1Jlc3VsdC5tZXNzYWdlIHx8IHJwY1Jlc3VsdC5zdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBSUENSZXN1bHRFcnJvcih0aGlzLCBycGNSZXN1bHQubWVzc2FnZSB8fCAnbm8gbWVzc2FnZScsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHJwY1Jlc3VsdC5yZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2s6IHJwY1Jlc3VsdC5zdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUodGhpcy5kZXNlcmlhbGl6ZShycGNSZXN1bHQucmVzdWx0LCBkZXNlcmlhbGl6YXRpb25Db250ZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdmaW5hbGl6ZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnBjRmluYWxpemUgPSBtZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbCA9IHRoaXMubG9jYWxQcm94eU1hcFtycGNGaW5hbGl6ZS5fX2xvY2FsX3Byb3h5X2lkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbFByb3hpZWRFbnRyeSA9IHRoaXMubG9jYWxQcm94aWVkLmdldChsb2NhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBhIGZpbmFsaXplciBpZCBpcyBzcGVjaWZpZWQsIGl0IG11c3QgbWF0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnBjRmluYWxpemUuX19sb2NhbF9wcm94eV9maW5hbGl6ZXJfaWQgJiYgcnBjRmluYWxpemUuX19sb2NhbF9wcm94eV9maW5hbGl6ZXJfaWQgIT09IGxvY2FsUHJveGllZEVudHJ5Py5maW5hbGl6ZXJJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubG9jYWxQcm94eU1hcFtycGNGaW5hbGl6ZS5fX2xvY2FsX3Byb3h5X2lkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxQcm94aWVkLmRlbGV0ZShsb2NhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBycGMgbWVzc2FnZSB0eXBlICR7bWVzc2FnZS50eXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmhhbmRsZWQgcnBjIGVycm9yJywgdGhpcy5wZWVyTmFtZSwgZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZhbFNvdXJjZSgpIHtcbiAgICByZXR1cm4gYFxuICAgICgoKSA9PiB7XG4gICAgICAgICR7UnBjUHJveHl9XG5cbiAgICAgICAgJHtScGNQZWVyfVxuICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgUnBjUGVlcixcbiAgICAgICAgICAgIFJwY1Byb3h5LFxuICAgICAgICB9O1xuICAgIH0pKCk7XG4gICAgYDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJwYy5qcy5tYXAiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHRsb2FkZWQ6IGZhbHNlLFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcblx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18uaG1kID0gKG1vZHVsZSkgPT4ge1xuXHRtb2R1bGUgPSBPYmplY3QuY3JlYXRlKG1vZHVsZSk7XG5cdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgJ2V4cG9ydHMnLCB7XG5cdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRzZXQ6ICgpID0+IHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignRVMgTW9kdWxlcyBtYXkgbm90IGFzc2lnbiBtb2R1bGUuZXhwb3J0cyBvciBleHBvcnRzLiosIFVzZSBFU00gZXhwb3J0IHN5bnRheCwgaW5zdGVhZDogJyArIG1vZHVsZS5pZCk7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIG1vZHVsZTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsImV4cG9ydCBjbGFzcyBEZWZlcnJlZCB7XG4gICAgZmluaXNoZWQgPSBmYWxzZTtcbiAgICByZXNvbHZlO1xuICAgIHJlamVjdDtcbiAgICBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmUgPSB2ID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVzb2x2ZSh2KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yZWplY3QgPSBlID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9O1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVmZXJyZWQuanMubWFwIiwiaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tIFwiLi9kZWZlcnJlZFwiO1xuZnVuY3Rpb24gZ2V0VXNlckFnZW50KCkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgIH1cbn1cbi8vIGNvbm5lY3Rpb25TdGF0ZSBpcyBub3QgaW1wbGVtZW50ZWQgaW4gZmlyZWZveD8gc28gd2F0Y2ggaWNlQ29ubmVjdGlvblN0YXRlIGluc3RlYWQuLi5cbmV4cG9ydCBmdW5jdGlvbiB3YWl0UGVlckNvbm5lY3Rpb25JY2VDb25uZWN0ZWQocGMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBpZiAocGMuaWNlQ29ubmVjdGlvblN0YXRlID09PSAnY29ubmVjdGVkJykge1xuICAgICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBjLmFkZEV2ZW50TGlzdGVuZXIoJ2ljZWNvbm5lY3Rpb25zdGF0ZWNoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmIChwYy5pY2VDb25uZWN0aW9uU3RhdGUgPT09ICdjb25uZWN0ZWQnKVxuICAgICAgICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdhaXRQZWVySWNlQ29ubmVjdGlvbkNsb3NlZChwYykudGhlbihyZWFzb24gPT4gcmVqZWN0KG5ldyBFcnJvcihyZWFzb24pKSk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gd2FpdFBlZXJJY2VDb25uZWN0aW9uQ2xvc2VkKHBjKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBwYy5hZGRFdmVudExpc3RlbmVyKCdpY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNQZWVyQ29ubmVjdGlvbkNsb3NlZChwYykpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHBjLmljZUNvbm5lY3Rpb25TdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUGVlckNvbm5lY3Rpb25DbG9zZWQocGMpIHtcbiAgICByZXR1cm4gcGMuaWNlQ29ubmVjdGlvblN0YXRlID09PSAnZGlzY29ubmVjdGVkJ1xuICAgICAgICB8fCBwYy5pY2VDb25uZWN0aW9uU3RhdGUgPT09ICdmYWlsZWQnXG4gICAgICAgIHx8IHBjLmljZUNvbm5lY3Rpb25TdGF0ZSA9PT0gJ2Nsb3NlZCc7XG59XG5mdW5jdGlvbiBzaWxlbmNlKCkge1xuICAgIGxldCBjdHggPSBuZXcgQXVkaW9Db250ZXh0KCksIG9zY2lsbGF0b3IgPSBjdHguY3JlYXRlT3NjaWxsYXRvcigpO1xuICAgIGNvbnN0IGRlc3QgPSBjdHguY3JlYXRlTWVkaWFTdHJlYW1EZXN0aW5hdGlvbigpO1xuICAgIG9zY2lsbGF0b3IuY29ubmVjdChkZXN0KTtcbiAgICBvc2NpbGxhdG9yLnN0YXJ0KCk7XG4gICAgY29uc3QgcmV0ID0gZGVzdC5zdHJlYW0uZ2V0QXVkaW9UcmFja3MoKVswXTtcbiAgICByZXQuZW5hYmxlZCA9IGZhbHNlO1xuICAgIHJldHVybiByZXQ7XG59XG5leHBvcnQgY2xhc3MgQnJvd3NlclNpZ25hbGluZ1Nlc3Npb24ge1xuICAgIHBjO1xuICAgIHBjRGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcbiAgICBkY0RlZmVycmVkID0gbmV3IERlZmVycmVkKCk7XG4gICAgbWljcm9waG9uZTtcbiAgICBtaWNFbmFibGVkID0gZmFsc2U7XG4gICAgb25QZWVyQ29ubmVjdGlvbjtcbiAgICBvcHRpb25zID0ge1xuICAgICAgICB1c2VyQWdlbnQ6IGdldFVzZXJBZ2VudCgpLFxuICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAgIGF1ZGlvOiBSVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXM/LignYXVkaW8nKSB8fCB7XG4gICAgICAgICAgICAgICAgY29kZWNzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgaGVhZGVyRXh0ZW5zaW9uczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZpZGVvOiBSVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXM/LigndmlkZW8nKSB8fCB7XG4gICAgICAgICAgICAgICAgY29kZWNzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgaGVhZGVyRXh0ZW5zaW9uczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2NyZWVuOiB7XG4gICAgICAgICAgICB3aWR0aDogc2NyZWVuLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBzY3JlZW4uaGVpZ2h0LFxuICAgICAgICB9LFxuICAgIH07XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgfVxuICAgIGFzeW5jIGdldE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnM7XG4gICAgfVxuICAgIGFzeW5jIHNldE1pY3JvcGhvbmUoZW5hYmxlZCkge1xuICAgICAgICBpZiAodGhpcy5taWNyb3Bob25lICYmIGVuYWJsZWQgJiYgIXRoaXMubWljRW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5taWNFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGRvaW5nIHNlbmRyZWN2IG9uIHNhZmFyaSByZXF1aXJlcyBhIG1pYyBiZSBhdHRhY2hlZCwgb3IgaXQgZmFpbHMgdG8gY29ubmVjdC5cbiAgICAgICAgICAgIGNvbnN0IG1pYyA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgdmlkZW86IGZhbHNlLCBhdWRpbzogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWljcm9waG9uZS5yZXBsYWNlVHJhY2sobWljLmdldFRyYWNrcygpWzBdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1pY3JvcGhvbmUudHJhY2suZW5hYmxlZCA9IGVuYWJsZWQ7XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLnBjRGVmZXJyZWQucHJvbWlzZS50aGVuKHBjID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBwYy5nZXRUcmFuc2NlaXZlcnMoKSB8fCBbXSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHQuc2VuZGVyPy50cmFjaz8uc3RvcD8uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGMuY2xvc2UoKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7IH0pO1xuICAgICAgICB0aGlzLnBjRGVmZXJyZWQucmVqZWN0KG5ldyBFcnJvcignaWNlQ29ubmVjdGlvblN0YXRlICcgKyB0aGlzLnBjPy5pY2VDb25uZWN0aW9uU3RhdGUpKTtcbiAgICB9XG4gICAgYXN5bmMgY3JlYXRlUGVlckNvbm5lY3Rpb24oc2V0dXApIHtcbiAgICAgICAgaWYgKHRoaXMucGMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IGNoZWNrQ29ubiA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdpY2VDb25uZWN0aW9uU3RhdGUnLCBwYy5pY2VDb25uZWN0aW9uU3RhdGUpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Nvbm5lY3Rpb25TdGF0ZScsIHBjLmNvbm5lY3Rpb25TdGF0ZSk7XG4gICAgICAgICAgICBpZiAoaXNQZWVyQ29ubmVjdGlvbkNsb3NlZChwYykpXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwYyA9IHRoaXMucGMgPSBuZXcgUlRDUGVlckNvbm5lY3Rpb24oc2V0dXAuY29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMucGNEZWZlcnJlZC5yZXNvbHZlKHBjKTtcbiAgICAgICAgYXdhaXQgdGhpcy5vblBlZXJDb25uZWN0aW9uPy4ocGMpO1xuICAgICAgICAvLyBwYy5hZGRFdmVudExpc3RlbmVyKCdjb25uZWN0aW9uc3RhdGVjaGFuZ2UnLCBjaGVja0Nvbm4pO1xuICAgICAgICBwYy5hZGRFdmVudExpc3RlbmVyKCdpY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UnLCBjaGVja0Nvbm4pO1xuICAgICAgICAvLyBwYy5hZGRFdmVudExpc3RlbmVyKCdpY2VnYXRoZXJpbmdzdGF0ZWNoYW5nZScsIGV2ID0+IGNvbnNvbGUubG9nKCdpY2VHYXRoZXJpbmdTdGF0ZScsIHBjLmljZUdhdGhlcmluZ1N0YXRlKSlcbiAgICAgICAgLy8gcGMuYWRkRXZlbnRMaXN0ZW5lcignc2lnbmFsaW5nc3RhdGVjaGFuZ2UnLCBldiA9PiBjb25zb2xlLmxvZygnc2lnbmFsaW5nU3RhdGUnLCBwYy5zaWduYWxpbmdTdGF0ZSkpXG4gICAgICAgIC8vIHBjLmFkZEV2ZW50TGlzdGVuZXIoJ2ljZWNhbmRpZGF0ZWVycm9yJywgZXYgPT4gY29uc29sZS5sb2coJ2ljZWNhbmRpZGF0ZWVycm9yJykpXG4gICAgICAgIGlmIChzZXR1cC5kYXRhY2hhbm5lbCkge1xuICAgICAgICAgICAgY29uc3QgZGMgPSBwYy5jcmVhdGVEYXRhQ2hhbm5lbChzZXR1cC5kYXRhY2hhbm5lbC5sYWJlbCwgc2V0dXAuZGF0YWNoYW5uZWwuZGljdCk7XG4gICAgICAgICAgICBkYy5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICAgICAgICAgIHRoaXMuZGNEZWZlcnJlZC5yZXNvbHZlKGRjKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2V0dXAuYXVkaW8pIHtcbiAgICAgICAgICAgIGNvbnN0IGF1ZGlvID0gcGMuYWRkVHJhbnNjZWl2ZXIoJ2F1ZGlvJywgc2V0dXAuYXVkaW8pO1xuICAgICAgICAgICAgaWYgKHNldHVwLmF1ZGlvLmRpcmVjdGlvbiA9PT0gJ3NlbmRyZWN2JyB8fCBzZXR1cC5hdWRpby5kaXJlY3Rpb24gPT09ICdzZW5kb25seScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1pY3JvcGhvbmUgPSBhdWRpby5zZW5kZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHVwLnZpZGVvKSB7XG4gICAgICAgICAgICBpZiAoc2V0dXAudmlkZW8uZGlyZWN0aW9uID09PSAnc2VuZHJlY3YnIHx8IHNldHVwLnZpZGVvLmRpcmVjdGlvbiA9PT0gJ3NlbmRvbmx5Jykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvaW5nIHNlbmRyZWN2IG9uIHNhZmFyaSByZXF1aXJlcyBhIG1pYyBiZSBhdHRhY2hlZCwgb3IgaXQgZmFpbHMgdG8gY29ubmVjdC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoeyB2aWRlbzogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0cmFjayBvZiBjYW1lcmEuZ2V0VHJhY2tzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBjLmFkZFRyYWNrKHRyYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB3aGF0IG5vd1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHBjLmFkZFRyYW5zY2VpdmVyKCd2aWRlbycsIHNldHVwLnZpZGVvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBjcmVhdGVMb2NhbERlc2NyaXB0aW9uKHR5cGUsIHNldHVwLCBzZW5kSWNlQ2FuZGlkYXRlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlUGVlckNvbm5lY3Rpb24oc2V0dXApO1xuICAgICAgICBjb25zdCBnYXRoZXJpbmdQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBjLm9uaWNlY2FuZGlkYXRlID0gZXYgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChldi5jYW5kaWRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJsb2NhbCBjYW5kaWRhdGVcIiwgZXYuY2FuZGlkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgc2VuZEljZUNhbmRpZGF0ZT8uKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXYuY2FuZGlkYXRlKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnBjLm9uaWNlZ2F0aGVyaW5nc3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGMuaWNlR2F0aGVyaW5nU3RhdGUgPT09ICdjb21wbGV0ZScpXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0b0Rlc2NyaXB0aW9uID0gKGluaXQpID0+IHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdsb2NhbCBkZXNjcmlwdGlvbicsIGluaXQuc2RwKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogaW5pdC50eXBlLFxuICAgICAgICAgICAgICAgIHNkcDogaW5pdC5zZHAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICBpZiAodHlwZSA9PT0gJ29mZmVyJykge1xuICAgICAgICAgICAgbGV0IG9mZmVyID0gYXdhaXQgdGhpcy5wYy5jcmVhdGVPZmZlcih7XG4gICAgICAgICAgICAgICAgb2ZmZXJUb1JlY2VpdmVBdWRpbzogISFzZXR1cC5hdWRpbyxcbiAgICAgICAgICAgICAgICBvZmZlclRvUmVjZWl2ZVZpZGVvOiAhIXNldHVwLnZpZGVvLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBzZXQgPSB0aGlzLnBjLnNldExvY2FsRGVzY3JpcHRpb24ob2ZmZXIpO1xuICAgICAgICAgICAgaWYgKHNlbmRJY2VDYW5kaWRhdGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvRGVzY3JpcHRpb24ob2ZmZXIpO1xuICAgICAgICAgICAgYXdhaXQgc2V0O1xuICAgICAgICAgICAgYXdhaXQgZ2F0aGVyaW5nUHJvbWlzZTtcbiAgICAgICAgICAgIG9mZmVyID0gYXdhaXQgdGhpcy5wYy5jcmVhdGVPZmZlcih7XG4gICAgICAgICAgICAgICAgb2ZmZXJUb1JlY2VpdmVBdWRpbzogISFzZXR1cC5hdWRpbyxcbiAgICAgICAgICAgICAgICBvZmZlclRvUmVjZWl2ZVZpZGVvOiAhIXNldHVwLnZpZGVvLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdG9EZXNjcmlwdGlvbihvZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgYW5zd2VyID0gYXdhaXQgdGhpcy5wYy5jcmVhdGVBbnN3ZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IHNldCA9IHRoaXMucGMuc2V0TG9jYWxEZXNjcmlwdGlvbihhbnN3ZXIpO1xuICAgICAgICAgICAgaWYgKHNlbmRJY2VDYW5kaWRhdGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvRGVzY3JpcHRpb24oYW5zd2VyKTtcbiAgICAgICAgICAgIGF3YWl0IHNldDtcbiAgICAgICAgICAgIGF3YWl0IGdhdGhlcmluZ1Byb21pc2U7XG4gICAgICAgICAgICBhbnN3ZXIgPSB0aGlzLnBjLmN1cnJlbnRMb2NhbERlc2NyaXB0aW9uIHx8IGFuc3dlcjtcbiAgICAgICAgICAgIHJldHVybiB0b0Rlc2NyaXB0aW9uKGFuc3dlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgc2V0UmVtb3RlRGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIHNldHVwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlUGVlckNvbm5lY3Rpb24oc2V0dXApO1xuICAgICAgICBhd2FpdCB0aGlzLnBjLnNldFJlbW90ZURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3JlbW90ZSBkZXNjcmlwdGlvbicsIGRlc2NyaXB0aW9uLnNkcCk7XG4gICAgfVxuICAgIGFzeW5jIGFkZEljZUNhbmRpZGF0ZShjYW5kaWRhdGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wYy5hZGRJY2VDYW5kaWRhdGUoY2FuZGlkYXRlKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJyZW1vdGUgY2FuZGlkYXRlXCIsIGNhbmRpZGF0ZSk7XG4gICAgfVxuICAgIGFzeW5jIGVuZFNlc3Npb24oKSB7XG4gICAgfVxufVxuZnVuY3Rpb24gbG9nU2VuZENhbmRpZGF0ZShjb25zb2xlLCB0eXBlLCBzZXNzaW9uKSB7XG4gICAgcmV0dXJuIGFzeW5jIChjYW5kaWRhdGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGAke3R5cGV9IHRyaWNrbGVkIGNhbmRpZGF0ZTpgLCBjYW5kaWRhdGUuc2RwTUxpbmVJbmRleCwgY2FuZGlkYXRlLmNhbmRpZGF0ZSk7XG4gICAgICAgICAgICBhd2FpdCBzZXNzaW9uLmFkZEljZUNhbmRpZGF0ZShjYW5kaWRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdhZGRJY2VDYW5kaWRhdGUgZXJyb3InLCBlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ2FuZGlkYXRlUXVldWUoY29uc29sZSwgdHlwZSwgc2Vzc2lvbikge1xuICAgIGxldCByZWFkeSA9IGZhbHNlO1xuICAgIGxldCBjYW5kaWRhdGVRdWV1ZSA9IFtdO1xuICAgIGNvbnN0IGxzID0gbG9nU2VuZENhbmRpZGF0ZShjb25zb2xlLCB0eXBlLCBzZXNzaW9uKTtcbiAgICBjb25zdCBxdWV1ZVNlbmRDYW5kaWRhdGUgPSBhc3luYyAoY2FuZGlkYXRlKSA9PiB7XG4gICAgICAgIGlmICghcmVhZHkpXG4gICAgICAgICAgICBjYW5kaWRhdGVRdWV1ZS5wdXNoKGNhbmRpZGF0ZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxzKGNhbmRpZGF0ZSk7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBmbHVzaCgpIHtcbiAgICAgICAgICAgIHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZVF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgbHMoY2FuZGlkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbmRpZGF0ZVF1ZXVlID0gW107XG4gICAgICAgIH0sXG4gICAgICAgIHF1ZXVlU2VuZENhbmRpZGF0ZSxcbiAgICB9O1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3RSVENTaWduYWxpbmdDbGllbnRzKGNvbnNvbGUsIG9mZmVyQ2xpZW50LCBvZmZlclNldHVwLCBhbnN3ZXJDbGllbnQsIGFuc3dlclNldHVwKSB7XG4gICAgY29uc3Qgb2ZmZXJPcHRpb25zID0gYXdhaXQgb2ZmZXJDbGllbnQuZ2V0T3B0aW9ucygpO1xuICAgIGNvbnN0IGFuc3dlck9wdGlvbnMgPSBhd2FpdCBhbnN3ZXJDbGllbnQuZ2V0T3B0aW9ucygpO1xuICAgIGNvbnN0IGRpc2FibGVUcmlja2xlID0gb2ZmZXJPcHRpb25zPy5kaXNhYmxlVHJpY2tsZSB8fCBhbnN3ZXJPcHRpb25zPy5kaXNhYmxlVHJpY2tsZTtcbiAgICBpZiAob2ZmZXJPcHRpb25zPy5vZmZlciAmJiBhbnN3ZXJPcHRpb25zPy5vZmZlcilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCb3RoIFJUQyBjbGllbnRzIGhhdmUgb2ZmZXJzIGFuZCBjYW4gbm90IG5lZ290aWF0ZS4gQ29uc2lkZXIgaW1wbGVtZW50aW5nIHRoaXMgaW4gQHNjcnlwdGVkL3dlYnJ0Yy4nKTtcbiAgICBpZiAob2ZmZXJPcHRpb25zPy5yZXF1aXJlc09mZmVyICYmIGFuc3dlck9wdGlvbnMucmVxdWlyZXNPZmZlcilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCb3RoIFJUQyBjbGllbnRzIHJlcXVpcmUgb2ZmZXJzIGFuZCBjYW4gbm90IG5lZ290aWF0ZS4nKTtcbiAgICBvZmZlclNldHVwLnR5cGUgPSAnb2ZmZXInO1xuICAgIGFuc3dlclNldHVwLnR5cGUgPSAnYW5zd2VyJztcbiAgICBjb25zdCBhbnN3ZXJRdWV1ZSA9IGNyZWF0ZUNhbmRpZGF0ZVF1ZXVlKGNvbnNvbGUsICdvZmZlcicsIGFuc3dlckNsaWVudCk7XG4gICAgY29uc3Qgb2ZmZXJRdWV1ZSA9IGNyZWF0ZUNhbmRpZGF0ZVF1ZXVlKGNvbnNvbGUsICdhbnN3ZXInLCBvZmZlckNsaWVudCk7XG4gICAgY29uc3Qgb2ZmZXIgPSBhd2FpdCBvZmZlckNsaWVudC5jcmVhdGVMb2NhbERlc2NyaXB0aW9uKCdvZmZlcicsIG9mZmVyU2V0dXAsIGRpc2FibGVUcmlja2xlID8gdW5kZWZpbmVkIDogYW5zd2VyUXVldWUucXVldWVTZW5kQ2FuZGlkYXRlKTtcbiAgICBjb25zb2xlLmxvZygnb2ZmZXIgc2RwJywgb2ZmZXIuc2RwKTtcbiAgICBhd2FpdCBhbnN3ZXJDbGllbnQuc2V0UmVtb3RlRGVzY3JpcHRpb24ob2ZmZXIsIGFuc3dlclNldHVwKTtcbiAgICBhbnN3ZXJRdWV1ZS5mbHVzaCgpO1xuICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGFuc3dlckNsaWVudC5jcmVhdGVMb2NhbERlc2NyaXB0aW9uKCdhbnN3ZXInLCBhbnN3ZXJTZXR1cCwgZGlzYWJsZVRyaWNrbGUgPyB1bmRlZmluZWQgOiBvZmZlclF1ZXVlLnF1ZXVlU2VuZENhbmRpZGF0ZSk7XG4gICAgY29uc29sZS5sb2coJ2Fuc3dlciBzZHAnLCBhbnN3ZXIuc2RwKTtcbiAgICBhd2FpdCBvZmZlckNsaWVudC5zZXRSZW1vdGVEZXNjcmlwdGlvbihhbnN3ZXIsIG9mZmVyU2V0dXApO1xuICAgIG9mZmVyUXVldWUuZmx1c2goKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJ0Yy1zaWduYWxpbmcuanMubWFwIiwiaW1wb3J0IHsgUnBjUGVlciB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NlcnZlci9zcmMvcnBjJztcbmltcG9ydCB7IEJyb3dzZXJTaWduYWxpbmdTZXNzaW9uLCB3YWl0UGVlckNvbm5lY3Rpb25JY2VDb25uZWN0ZWQsIHdhaXRQZWVySWNlQ29ubmVjdGlvbkNsb3NlZCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbW1vbi9zcmMvcnRjLXNpZ25hbGluZyc7XG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBjb25zdCBvcHRpb25zID0gbmV3IGNhc3QuZnJhbWV3b3JrLkNhc3RSZWNlaXZlck9wdGlvbnMoKTtcbiAgICBvcHRpb25zLmRpc2FibGVJZGxlVGltZW91dCA9IHRydWU7XG4gICAgY2FzdC5mcmFtZXdvcmsuQ2FzdFJlY2VpdmVyQ29udGV4dC5nZXRJbnN0YW5jZSgpLnN0YXJ0KG9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbnRleHQgPSBjYXN0LmZyYW1ld29yay5DYXN0UmVjZWl2ZXJDb250ZXh0LmdldEluc3RhbmNlKCk7XG4gICAgY29uc3QgcGxheWVyTWFuYWdlciA9IGNvbnRleHQuZ2V0UGxheWVyTWFuYWdlcigpO1xuICAgIGNvbnN0IHZpZGVvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lZGlhJyk7XG4gICAgbGV0IHByZXZpb3VzQ2xlYW51cDtcbiAgICAvLyBpbnRlcmNlcHQgdGhlIExPQUQgcmVxdWVzdCB0byBiZSBhYmxlIHRvIHJlYWQgaW4gYSBjb250ZW50SWQgYW5kIGdldCBkYXRhXG4gICAgY29uc3QgaW50ZXJjZXB0b3IgPSAobG9hZFJlcXVlc3REYXRhKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGxvYWRSZXF1ZXN0RGF0YSk7XG4gICAgICAgIGNvbnN0IGVpb1VybCA9IGxvYWRSZXF1ZXN0RGF0YS5tZWRpYS5lbnRpdHkgfHwgbG9hZFJlcXVlc3REYXRhLm1lZGlhLmNvbnRlbnRJZDtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBsb2FkUmVxdWVzdERhdGEuY3JlZGVudGlhbHMgPz8gbG9hZFJlcXVlc3REYXRhLm1lZGlhLmN1c3RvbURhdGEudG9rZW47XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoZWlvVXJsKTtcbiAgICAgICAgY29uc3QgZW5kcG9pbnRQYXRoID0gdXJsLnBhdGhuYW1lO1xuICAgICAgICBjb25zdCBxdWVyeSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpKSB7XG4gICAgICAgICAgICBxdWVyeVtrXSA9IHY7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHBhdGg6IGVuZHBvaW50UGF0aCxcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzb2NrZXQgPSBlaW8oYHdzczovLyR7dXJsLmhvc3R9YCwgb3B0aW9ucyk7XG4gICAgICAgIHNvY2tldC5vbignb3BlbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB0b2tlbixcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGNvbnN0IHJwY1BlZXIgPSBuZXcgUnBjUGVlcignY2FzdC1yZWNlaXZlcicsICdob3N0JywgKG1lc3NhZ2UsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0Py4oZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzb2NrZXQub24oJ21lc3NhZ2UnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHJwY1BlZXIuaGFuZGxlTWVzc2FnZShKU09OLnBhcnNlKGRhdGEpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBCcm93c2VyU2lnbmFsaW5nU2Vzc2lvbigpO1xuICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY2xlYW51cCcpO1xuICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHNlc3Npb24ucGNEZWZlcnJlZC5wcm9taXNlLnRoZW4ocGMgPT4gcGMuY2xvc2UoKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcHJldmlvdXNDbGVhbnVwPy4oKTtcbiAgICAgICAgICAgIHByZXZpb3VzQ2xlYW51cCA9IGNsZWFudXA7XG4gICAgICAgICAgICBzb2NrZXQub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzb2NrZXQgaW8gY29ubmVjdGlvbiBjbG9zZSBldmVudCcpO1xuICAgICAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2Vzc2lvbi5vblBlZXJDb25uZWN0aW9uID0gYXN5bmMgKHBjKSA9PiB7XG4gICAgICAgICAgICAgICAgd2FpdFBlZXJJY2VDb25uZWN0aW9uQ2xvc2VkKHBjKS50aGVuKGNsZWFudXApO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhU3RyZWFtID0gbmV3IE1lZGlhU3RyZWFtKHBjLmdldFJlY2VpdmVycygpLm1hcCgocmVjZWl2ZXIpID0+IHJlY2VpdmVyLnRyYWNrKSk7XG4gICAgICAgICAgICAgICAgcGMub250cmFjayA9IGUgPT4gbWVkaWFTdHJlYW0uYWRkVHJhY2soZS50cmFjayk7XG4gICAgICAgICAgICAgICAgdmlkZW8uc3JjT2JqZWN0ID0gbWVkaWFTdHJlYW07XG4gICAgICAgICAgICAgICAgd2FpdFBlZXJDb25uZWN0aW9uSWNlQ29ubmVjdGVkKHBjKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcnBjUGVlci5wYXJhbXNbJ3Nlc3Npb24nXSA9IHNlc3Npb247XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIHBsYXllck1hbmFnZXIuc2V0TWVzc2FnZUludGVyY2VwdG9yKGNhc3QuZnJhbWV3b3JrLm1lc3NhZ2VzLk1lc3NhZ2VUeXBlLkxPQUQsIGludGVyY2VwdG9yKTtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2FzdC5qcy5tYXAiXSwibmFtZXMiOlsic3RhcnRQZXJpb2RpY0dhcmJhZ2VDb2xsZWN0aW9uIiwiZyIsImdjIiwic2V0SW50ZXJ2YWwiLCJlIiwiY29uc29sZSIsIndhcm4iLCJScGNQcm94eSIsInBlZXIiLCJlbnRyeSIsImNvbnN0cnVjdG9yTmFtZSIsInByb3h5UHJvcHMiLCJwcm94eU9uZVdheU1ldGhvZHMiLCJjb25zdHJ1Y3RvciIsInRoaXMiLCJ0b1ByaW1pdGl2ZSIsInNlbGZOYW1lIiwicGVlck5hbWUiLCJnZXQiLCJ0YXJnZXQiLCJwIiwicmVjZWl2ZXIiLCJScGNQZWVyIiwiUFJPUEVSVFlfUFJPWFlfSUQiLCJpZCIsIlBST1BFUlRZX1BST1hZX1BST1BFUlRJRVMiLCJQUk9QRVJUWV9QUk9YWV9PTkVXQVlfTUVUSE9EUyIsIlBST1BFUlRZX0pTT05fRElTQUJMRV9TRVJJQUxJWkFUSU9OIiwiUFJPUEVSVFlfSlNPTl9DT1BZX1NFUklBTElaRV9DSElMRFJFTiIsInVuZGVmaW5lZCIsImhhbmRsZUZ1bmN0aW9uSW52b2NhdGlvbnMiLCJQcm94eSIsInNldCIsInZhbHVlIiwiZmluYWxpemVySWRTeW1ib2wiLCJmaW5hbGl6ZXJJZCIsImFwcGx5IiwidGhpc0FyZyIsImFyZ0FycmF5IiwiT2JqZWN0IiwiaXNGcm96ZW4iLCJwZW5kaW5nUmVzdWx0cyIsIlByb21pc2UiLCJyZWplY3QiLCJSUENSZXN1bHRFcnJvciIsIm1ldGhvZCIsImFyZ3MiLCJzZXJpYWxpemF0aW9uQ29udGV4dCIsImFyZyIsInB1c2giLCJzZXJpYWxpemUiLCJycGNBcHBseSIsInR5cGUiLCJwcm94eUlkIiwiaW5jbHVkZXMiLCJvbmV3YXkiLCJzZW5kIiwicmVzb2x2ZSIsImNyZWF0ZVBlbmRpbmdSZXN1bHQiLCJFcnJvciIsImNhdXNlIiwibWVzc2FnZSIsIm9wdGlvbnMiLCJzdXBlciIsIm5hbWUiLCJzdGFjayIsImNvbXBpbGVGdW5jdGlvbiIsImNvZGUiLCJwYXJhbXMiLCJmIiwiam9pbiIsImV2YWwiLCJmciIsIkZpbmFsaXphdGlvblJlZ2lzdHJ5Iiwid2luZG93IiwiV2Vha1JlZiIsImRlcmVmIiwicmVnaXN0ZXIiLCJpZENvdW50ZXIiLCJwcm94eUNvdW50ZXIiLCJsb2NhbFByb3hpZWQiLCJNYXAiLCJsb2NhbFByb3h5TWFwIiwicmVtb3RlV2Vha1Byb3hpZXMiLCJmaW5hbGl6ZXJzIiwiZmluYWxpemUiLCJuYW1lRGVzZXJpYWxpemVyTWFwIiwiY29uc3RydWN0b3JTZXJpYWxpemVyTWFwIiwidHJhbnNwb3J0U2FmZUFyZ3VtZW50VHlwZXMiLCJnZXREZWZhdWx0VHJhbnNwb3J0U2FmZUFyZ3VtZW50VHlwZXMiLCJraWxsZWQiLCJraWxsZWREZWZlcnJlZCIsInN0YXRpYyIsIlN5bWJvbCIsImpzb25TZXJpYWxpemFibGUiLCJTZXQiLCJhZGQiLCJOdW1iZXIiLCJTdHJpbmciLCJCb29sZWFuIiwiQXJyYXkiLCJ0aGl6IiwiY2IiLCJwcm9taXNlIiwidG9TdHJpbmciLCJjYXRjaCIsImtpbGwiLCJlcnJvciIsInJlc3VsdCIsInZhbHVlcyIsImZyZWV6ZSIsImNsZWFyIiwiYWRkU2VyaWFsaXplciIsImN0ciIsInNlcmlhbGl6ZXIiLCJycGNGaW5hbGl6ZSIsIl9fbG9jYWxfcHJveHlfaWQiLCJfX2xvY2FsX3Byb3h5X2ZpbmFsaXplcl9pZCIsImFzeW5jIiwicGFyYW0iLCJwYXJhbU1lc3NhZ2UiLCJldmFsTG9jYWwiLCJzY3JpcHQiLCJmaWxlbmFtZSIsImNvZXJjZWRQYXJhbXMiLCJhc3NpZ24iLCJjb21waWxlIiwibW9kdWxlIiwia2V5cyIsImNyZWF0ZUVycm9yUmVzdWx0IiwiZGVzZXJpYWxpemUiLCJkZXNlcmlhbGl6YXRpb25Db250ZXh0IiwicmV0Iiwia2V5IiwidmFsIiwiZW50cmllcyIsIl9fcmVtb3RlX3Byb3h5X2lkIiwiX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkIiwiX19yZW1vdGVfY29uc3RydWN0b3JfbmFtZSIsIl9fc2VyaWFsaXplZF92YWx1ZSIsIl9fcmVtb3RlX3Byb3h5X3Byb3BzIiwiX19yZW1vdGVfcHJveHlfb25ld2F5X21ldGhvZHMiLCJwcm94eSIsIm5ld1Byb3h5IiwiZGVzZXJpYWxpemVyIiwiaGFzIiwiX19wcm94eV9jb25zdHJ1Y3RvciIsInByb3hpZWRFbnRyeSIsIl9fcHJveHlfaWQiLCJfX3Byb3h5X3BlZXIiLCJzZXJpYWxpemVyTWFwTmFtZSIsInNlcmlhbGl6ZWQiLCJwcm94eUNvbnN0cnVjdG9yTmFtZSIsImxvY2FsUHJveGllZEVudHJ5IiwicnBjIiwid2Vha3JlZiIsInJwY1BhcmFtIiwicnBjUmVzdWx0IiwiZGVmZXJyZWQiLCJsb2NhbCIsImRlbGV0ZSIsImdldEV2YWxTb3VyY2UiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJleHBvcnRzIiwibG9hZGVkIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsImQiLCJkZWZpbml0aW9uIiwibyIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdsb2JhbFRoaXMiLCJGdW5jdGlvbiIsImhtZCIsImNyZWF0ZSIsImNoaWxkcmVuIiwib2JqIiwicHJvcCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIkRlZmVycmVkIiwiZmluaXNoZWQiLCJ2IiwiZ2V0VXNlckFnZW50IiwibmF2aWdhdG9yIiwidXNlckFnZW50Iiwid2FpdFBlZXJJY2VDb25uZWN0aW9uQ2xvc2VkIiwicGMiLCJhZGRFdmVudExpc3RlbmVyIiwiaXNQZWVyQ29ubmVjdGlvbkNsb3NlZCIsImljZUNvbm5lY3Rpb25TdGF0ZSIsIkJyb3dzZXJTaWduYWxpbmdTZXNzaW9uIiwicGNEZWZlcnJlZCIsImRjRGVmZXJyZWQiLCJtaWNyb3Bob25lIiwibWljRW5hYmxlZCIsIm9uUGVlckNvbm5lY3Rpb24iLCJjYXBhYmlsaXRpZXMiLCJhdWRpbyIsIlJUQ1J0cFJlY2VpdmVyIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiY29kZWNzIiwiaGVhZGVyRXh0ZW5zaW9ucyIsInZpZGVvIiwic2NyZWVuIiwid2lkdGgiLCJoZWlnaHQiLCJlbmFibGVkIiwibWljIiwibWVkaWFEZXZpY2VzIiwiZ2V0VXNlck1lZGlhIiwicmVwbGFjZVRyYWNrIiwiZ2V0VHJhY2tzIiwidHJhY2siLCJjbG9zZSIsInRoZW4iLCJ0IiwiZ2V0VHJhbnNjZWl2ZXJzIiwic2VuZGVyIiwic3RvcCIsInNldHVwIiwiUlRDUGVlckNvbm5lY3Rpb24iLCJjb25maWd1cmF0aW9uIiwibG9nIiwiY29ubmVjdGlvblN0YXRlIiwiZGF0YWNoYW5uZWwiLCJkYyIsImNyZWF0ZURhdGFDaGFubmVsIiwibGFiZWwiLCJkaWN0IiwiYmluYXJ5VHlwZSIsImFkZFRyYW5zY2VpdmVyIiwiZGlyZWN0aW9uIiwiY2FtZXJhIiwiYWRkVHJhY2siLCJzZW5kSWNlQ2FuZGlkYXRlIiwiY3JlYXRlUGVlckNvbm5lY3Rpb24iLCJnYXRoZXJpbmdQcm9taXNlIiwib25pY2VjYW5kaWRhdGUiLCJldiIsImNhbmRpZGF0ZSIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsIm9uaWNlZ2F0aGVyaW5nc3RhdGVjaGFuZ2UiLCJpY2VHYXRoZXJpbmdTdGF0ZSIsInRvRGVzY3JpcHRpb24iLCJpbml0Iiwic2RwIiwib2ZmZXIiLCJjcmVhdGVPZmZlciIsIm9mZmVyVG9SZWNlaXZlQXVkaW8iLCJvZmZlclRvUmVjZWl2ZVZpZGVvIiwic2V0TG9jYWxEZXNjcmlwdGlvbiIsImFuc3dlciIsImNyZWF0ZUFuc3dlciIsImN1cnJlbnRMb2NhbERlc2NyaXB0aW9uIiwiZGVzY3JpcHRpb24iLCJzZXRSZW1vdGVEZXNjcmlwdGlvbiIsImFkZEljZUNhbmRpZGF0ZSIsImRvY3VtZW50IiwiZXZlbnQiLCJjYXN0IiwiZnJhbWV3b3JrIiwiQ2FzdFJlY2VpdmVyT3B0aW9ucyIsImRpc2FibGVJZGxlVGltZW91dCIsIkNhc3RSZWNlaXZlckNvbnRleHQiLCJnZXRJbnN0YW5jZSIsInN0YXJ0IiwicGxheWVyTWFuYWdlciIsImdldFBsYXllck1hbmFnZXIiLCJnZXRFbGVtZW50QnlJZCIsInByZXZpb3VzQ2xlYW51cCIsInNldE1lc3NhZ2VJbnRlcmNlcHRvciIsIm1lc3NhZ2VzIiwiTWVzc2FnZVR5cGUiLCJMT0FEIiwibG9hZFJlcXVlc3REYXRhIiwiZWlvVXJsIiwibWVkaWEiLCJlbnRpdHkiLCJjb250ZW50SWQiLCJ0b2tlbiIsImNyZWRlbnRpYWxzIiwiY3VzdG9tRGF0YSIsInVybCIsIlVSTCIsImVuZHBvaW50UGF0aCIsInBhdGhuYW1lIiwicXVlcnkiLCJrIiwiVVJMU2VhcmNoUGFyYW1zIiwic2VhcmNoIiwicGF0aCIsInNvY2tldCIsImVpbyIsImhvc3QiLCJvbiIsInJwY1BlZXIiLCJkYXRhIiwiaGFuZGxlTWVzc2FnZSIsInNlc3Npb24iLCJjbGVhbnVwIiwibWVkaWFTdHJlYW0iLCJNZWRpYVN0cmVhbSIsImdldFJlY2VpdmVycyIsIm1hcCIsIm9udHJhY2siLCJzcmNPYmplY3QiLCJyZWFzb24iLCJ3YWl0UGVlckNvbm5lY3Rpb25JY2VDb25uZWN0ZWQiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +(()=>{"use strict";var __webpack_modules__={636:(module,__webpack_exports__,__webpack_require__)=>{function startPeriodicGarbageCollection(){let e;__webpack_require__.g.gc||console.warn("rpc peer garbage collection not available: global.gc is not exposed.");try{e=__webpack_require__.g}catch(e){}let t=0;return setInterval((()=>{const r=Date.now(),i=r-t,o=RpcPeer.remotesCreated;RpcPeer.remotesCreated=0;const n=RpcPeer.remotesCollected;RpcPeer.remotesCollected=0,(o||n||i>3e5)&&(t=r,e?.gc?.())}),1e4)}__webpack_require__.d(__webpack_exports__,{uD:()=>RpcPeer}),module=__webpack_require__.hmd(module);class RpcProxy{peer;entry;constructorName;proxyProps;proxyOneWayMethods;constructor(e,t,r,i,o){this.peer=e,this.entry=t,this.constructorName=r,this.proxyProps=i,this.proxyOneWayMethods=o}toPrimitive(){const e=this.peer;return`RpcProxy-${e.selfName}:${e.peerName}: ${this.constructorName}`}get(e,t,r){if(t===RpcPeer.PROPERTY_PROXY_ID)return this.entry.id;if("__proxy_constructor"===t)return this.constructorName;if("__proxy_peer"===t)return this.peer;if(t===RpcPeer.PROPERTY_PROXY_PROPERTIES)return this.proxyProps;if(t===RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS)return this.proxyOneWayMethods;if(t===RpcPeer.PROPERTY_JSON_DISABLE_SERIALIZATION||t===RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN)return;if("then"===t)return;if("constructor"===t)return;if(void 0!==this.proxyProps?.[t])return this.proxyProps?.[t];return RpcPeer.handleFunctionInvocations(this,e,t,r)||new Proxy((()=>t),this)}set(e,t,r,i){return t===RpcPeer.finalizerIdSymbol?this.entry.finalizerId=r:(this.proxyProps||={},this.proxyProps[t]=r),!0}apply(e,t,r){if(Object.isFrozen(this.peer.pendingResults))return Promise.reject(new RPCResultError(this.peer,"RpcPeer has been killed"));const i=e()||null,o=[],n={};for(const e of r||[])o.push(this.peer.serialize(e,n));const s={type:"apply",id:void 0,proxyId:this.entry.id,args:o,method:i};return this.proxyOneWayMethods?.includes?.(i)?(s.oneway=!0,null===i&&delete s.method,this.peer.send(s,void 0,n),Promise.resolve()):this.peer.createPendingResult(((e,t)=>{s.id=e,this.peer.send(s,t,n)}))}}class RPCResultError extends Error{cause;constructor(e,t,r,i){super(`${e.selfName}:${e.peerName}: ${t}`),this.cause=r,i?.name&&(this.name=i?.name),i?.stack&&(this.stack=`${e.peerName}:${e.selfName}\n${r?.stack||i.stack}`)}}function compileFunction(code,params,options){params=params||[];const f=`(function(${params.join(",")}) {;${code};})`;return eval(f)}try{const e=FinalizationRegistry}catch(e){window.WeakRef=class{target;constructor(e){this.target=e}deref(){return this.target}},window.FinalizationRegistry=class{register(){}}}class RpcPeer{selfName;peerName;send;idCounter=1;params={};pendingResults={};proxyCounter=1;localProxied=new Map;localProxyMap={};remoteWeakProxies={};finalizers=new FinalizationRegistry((e=>this.finalize(e)));nameDeserializerMap=new Map;constructorSerializerMap=new Map;transportSafeArgumentTypes=RpcPeer.getDefaultTransportSafeArgumentTypes();killed;killedDeferred;tags={};static finalizerIdSymbol=Symbol("rpcFinalizerId");static remotesCollected=0;static remotesCreated=0;static activeRpcPeer;static isRpcProxy(e){return!!e?.[RpcPeer.PROPERTY_PROXY_ID]}static getDefaultTransportSafeArgumentTypes(){const e=new Set;return e.add(Number.name),e.add(String.name),e.add(Object.name),e.add(Boolean.name),e.add(Array.name),e}static handleFunctionInvocations(e,t,r,i){return"apply"===r?(r,i)=>e.apply(t,e,i):"call"===r?(r,...i)=>e.apply(t,e,i):"toString"===r||r===Symbol.toPrimitive?(t,...r)=>e.toPrimitive():void 0}static PROPERTY_PROXY_ID="__proxy_id";static PROPERTY_PROXY_ONEWAY_METHODS="__proxy_oneway_methods";static PROPERTY_JSON_DISABLE_SERIALIZATION="__json_disable_serialization";static PROPERTY_PROXY_PROPERTIES="__proxy_props";static PROPERTY_JSON_COPY_SERIALIZE_CHILDREN="__json_copy_serialize_children";static PROBED_PROPERTIES=new Set(["then","constructor","__proxy_id","__proxy_constructor","__proxy_peer",RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS,RpcPeer.PROPERTY_JSON_DISABLE_SERIALIZATION,RpcPeer.PROPERTY_PROXY_PROPERTIES,RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN]);constructor(e,t,r){this.selfName=e,this.peerName=t,this.send=r,this.killed=new Promise(((e,t)=>{this.killedDeferred={resolve:e,reject:t}})),this.killed.catch((()=>{}))}createPendingResult(e){if(Object.isFrozen(this.pendingResults))return Promise.reject(new RPCResultError(this,"RpcPeer has been killed"));const t=new Promise(((t,r)=>{const i=(this.idCounter++).toString();this.pendingResults[i]={resolve:t,reject:r},e(i,(e=>r(new RPCResultError(this,e.message,e))))}));return t.catch((()=>{})),t}kill(e){const t=new RPCResultError(this,e||"peer was killed");this.killedDeferred.reject(t);for(const e of Object.values(this.pendingResults))e.reject(t);this.pendingResults=Object.freeze({}),this.params=Object.freeze({}),this.remoteWeakProxies=Object.freeze({}),this.localProxyMap=Object.freeze({}),this.localProxied.clear()}addSerializer(e,t,r){this.nameDeserializerMap.set(t,r),this.constructorSerializerMap.set(e,t)}finalize(e){RpcPeer.remotesCollected++,delete this.remoteWeakProxies[e.id];const t={__local_proxy_id:e.id,__local_proxy_finalizer_id:e.finalizerId,type:"finalize"};this.send(t)}async getParam(e){return this.createPendingResult(((t,r)=>{const i={id:t,type:"param",param:e};this.send(i,r)}))}evalLocal(e,t,r){const i=Object.assign({},this.params,r);let o;try{o=module.require("vm").compileFunction}catch(e){o=compileFunction}return o(e,Object.keys(i),{filename:t})(...Object.values(i))}createErrorResult(e,t){e.stack=t.stack||"no stack",e.result=t.name||"no name",e.message=t.message||"no message"}deserialize(e,t){if(!e)return e;if(e[RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN]){const r={};for(const[i,o]of Object.entries(e))r[i]=this.deserialize(o,t);return r}const{__remote_proxy_id:r,__remote_proxy_finalizer_id:i,__local_proxy_id:o,__remote_constructor_name:n,__serialized_value:s,__remote_proxy_props:a,__remote_proxy_oneway_methods:c}=e;if(r){let e=this.remoteWeakProxies[r]?.deref();e||(e=this.newProxy(r,n,a,c)),e[RpcPeer.finalizerIdSymbol]=i;const o=this.nameDeserializerMap.get(n);return o?o.deserialize(e,t):e}if(o){const e=this.localProxyMap[o];if(!e)throw new RPCResultError(this,`invalid local proxy id ${o}`);return e}const _=this.nameDeserializerMap.get(n);return _?_.deserialize(s,t):e}serialize(e,t){if(!0===e?.[RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN]){const r={};for(const[i,o]of Object.entries(e))r[i]=this.serialize(o,t);return r}if(!e||!e[RpcPeer.PROPERTY_JSON_DISABLE_SERIALIZATION]&&this.transportSafeArgumentTypes.has(e.constructor?.name))return e;let r=e.__proxy_constructor||e.constructor?.name?.toString(),i=this.localProxied.get(e);if(i){const t=(this.proxyCounter++).toString();return i.finalizerId=t,{__remote_proxy_id:i.id,__remote_proxy_finalizer_id:t,__remote_constructor_name:r,__remote_proxy_props:e?.[RpcPeer.PROPERTY_PROXY_PROPERTIES],__remote_proxy_oneway_methods:e?.[RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS]}}const{__proxy_id:o,__proxy_peer:n}=e;if(o&&n===this)return{__local_proxy_id:o};const s=this.constructorSerializerMap.get(e.constructor);if(s){r=s;const i=this.nameDeserializerMap.get(s);if(!i)throw new Error("serializer not found for "+s);const o=i.serialize(e,t);return{__remote_proxy_id:void 0,__remote_proxy_finalizer_id:void 0,__remote_constructor_name:r,__remote_proxy_props:e?.[RpcPeer.PROPERTY_PROXY_PROPERTIES],__remote_proxy_oneway_methods:e?.[RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS],__serialized_value:o}}const a=(this.proxyCounter++).toString();return i={id:a,finalizerId:a},this.localProxied.set(e,i),this.localProxyMap[a]=e,{__remote_proxy_id:a,__remote_proxy_finalizer_id:a,__remote_constructor_name:r,__remote_proxy_props:e?.[RpcPeer.PROPERTY_PROXY_PROPERTIES],__remote_proxy_oneway_methods:e?.[RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS]}}newProxy(e,t,r,i){RpcPeer.remotesCreated++;const o={id:e,finalizerId:void 0},n=new RpcProxy(this,o,t,r,i),s=new Proxy("Function"===t||"AsyncFunction"===t?function(){}:n,n),a=new WeakRef(s);return this.remoteWeakProxies[e]=a,this.finalizers.register(n,o),s}handleMessage(e,t){try{RpcPeer.activeRpcPeer=this,this.handleMessageInternal(e,t)}finally{RpcPeer.activeRpcPeer=void 0}}async handleMessageInternal(e,t){if(!Object.isFrozen(this.pendingResults))try{switch(e.type){case"param":{const t=e,r={},i={type:"result",id:t.id,result:this.serialize(this.params[t.param],r)};this.send(i,void 0,r);break}case"apply":{const r=e,i={type:"result",id:r.id||""},o={};try{const e=this.localProxyMap[r.proxyId];if(!e)throw new Error(`proxy id ${r.proxyId} not found`);const n=[];for(const e of r.args||[])n.push(this.deserialize(e,t));let s;if(r.method){if(!e[r.method])throw new Error(`target ${e?.constructor?.name} does not have method ${r.method}`);s=await e[r.method](...n)}else s=await e(...n);i.result=this.serialize(s,o)}catch(e){this.createErrorResult(i,e)}r.oneway||this.send(i,void 0,o);break}case"result":{const r=e,i=this.pendingResults[r.id];if(delete this.pendingResults[r.id],!i)throw new Error(`unknown result ${r.id}`);if(r.message||r.stack){const e=new RPCResultError(this,r.message||"no message",void 0,{name:r.result,stack:r.stack});return void i.reject(e)}i.resolve(this.deserialize(r.result,t));break}case"finalize":{const t=e,r=this.localProxyMap[t.__local_proxy_id];if(r){const e=this.localProxied.get(r);if(t.__local_proxy_finalizer_id&&t.__local_proxy_finalizer_id!==e?.finalizerId)break;delete this.localProxyMap[t.__local_proxy_id],this.localProxied.delete(r)}break}default:throw new Error(`unknown rpc message type ${e.type}`)}}catch(e){return void console.error("unhandled rpc error",this.peerName,e)}}}function getEvalSource(){return`\n (() => {\n ${RpcProxy}\n\n ${RpcPeer}\n \n return {\n RpcPeer,\n RpcProxy,\n };\n })();\n `}}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var r=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e](r,r.exports,__webpack_require__),r.loaded=!0,r.exports}__webpack_require__.d=(e,t)=>{for(var r in t)__webpack_require__.o(t,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var __webpack_exports__={};(()=>{var e=__webpack_require__(636);class t{finished=!1;resolve;reject;promise=new Promise(((e,t)=>{this.resolve=t=>{this.finished=!0,e(t)},this.reject=e=>{this.finished=!0,t(e)}}))}function r(){try{return navigator.userAgent}catch(e){}}function i(e){return new Promise((t=>{e.addEventListener("iceconnectionstatechange",(()=>{o(e)&&t(e.iceConnectionState)}))}))}function o(e){return"disconnected"===e.iceConnectionState||"failed"===e.iceConnectionState||"closed"===e.iceConnectionState}class n{pc;pcDeferred=new t;dcDeferred=new t;microphone;micEnabled=!1;onPeerConnection;options={userAgent:r(),capabilities:{audio:RTCRtpReceiver.getCapabilities?.("audio")||{codecs:void 0,headerExtensions:void 0},video:RTCRtpReceiver.getCapabilities?.("video")||{codecs:void 0,headerExtensions:void 0}},screen:{devicePixelRatio:window.devicePixelRatio,width:screen.width,height:screen.height}};constructor(){}async getOptions(){return this.options}async setMicrophone(e){if(this.microphone&&e&&!this.micEnabled){this.micEnabled=!0;const e=await navigator.mediaDevices.getUserMedia({video:!1,audio:!0});await this.microphone.replaceTrack(e.getTracks()[0])}this.microphone.track.enabled=e}close(){this.pcDeferred.promise.then((e=>{for(const t of e.getTransceivers()||[])try{t.sender?.track?.stop?.()}catch(e){}e.close()})).catch((()=>{})),this.pcDeferred.reject(new Error("iceConnectionState "+this.pc?.iceConnectionState))}async createPeerConnection(e){if(this.pc)return;const t=this.pc=new RTCPeerConnection(e.configuration);if(this.pcDeferred.resolve(t),await(this.onPeerConnection?.(t)),t.addEventListener("iceconnectionstatechange",(()=>{console.log("iceConnectionState",t.iceConnectionState),console.log("connectionState",t.connectionState),o(t)&&this.close()})),e.datachannel){const r=t.createDataChannel(e.datachannel.label,e.datachannel.dict);r.binaryType="arraybuffer",this.dcDeferred.resolve(r)}if(e.audio){let r;r=e.getUserMediaSafariHack&&navigator.userAgent.includes("Safari")&&!navigator.userAgent.includes("Chrome")?t.addTransceiver("audio",{...e.audio,streams:[await navigator.mediaDevices.getUserMedia({audio:!0})]}):t.addTransceiver("audio",e.audio),"sendrecv"!==e.audio.direction&&"sendonly"!==e.audio.direction||(this.microphone=r.sender)}if(e.video)if("sendrecv"===e.video.direction||"sendonly"===e.video.direction)try{const e=await navigator.mediaDevices.getUserMedia({video:!0});for(const r of e.getTracks())t.addTrack(r)}catch(e){}else t.addTransceiver("video",e.video)}async createLocalDescription(e,t,r){await this.createPeerConnection(t);const i=new Promise((e=>{this.pc.onicecandidate=t=>{t.candidate?r?.(JSON.parse(JSON.stringify(t.candidate))):e(void 0)},this.pc.onicegatheringstatechange=()=>{"complete"===this.pc.iceGatheringState&&e(void 0)}})),o=e=>({type:e.type,sdp:e.sdp});if("offer"===e){let e=await this.pc.createOffer({offerToReceiveAudio:!!t.audio,offerToReceiveVideo:!!t.video});const n=this.pc.setLocalDescription(e);return r||(await n,await i,e=await this.pc.createOffer({offerToReceiveAudio:!!t.audio,offerToReceiveVideo:!!t.video})),o(e)}{let e=await this.pc.createAnswer();const t=this.pc.setLocalDescription(e);return r||(await t,await i,e=this.pc.currentLocalDescription||e),o(e)}}async setRemoteDescription(e,t){await this.createPeerConnection(t),await this.pc.setRemoteDescription(e)}async addIceCandidate(e){await this.pc.addIceCandidate(e)}async endSession(){}}document.addEventListener("DOMContentLoaded",(function(t){const r=new cast.framework.CastReceiverOptions;r.disableIdleTimeout=!0,cast.framework.CastReceiverContext.getInstance().start(r);const o=cast.framework.CastReceiverContext.getInstance().getPlayerManager(),s=document.getElementById("media");let a;o.setMessageInterceptor(cast.framework.messages.MessageType.LOAD,(t=>{console.log(t);const r=t.media.entity||t.media.contentId,o=t.credentials??t.media.customData.token,c=new URL(r),_=c.pathname,d={};for(const[e,t]of new URLSearchParams(c.search))d[e]=t;const l={path:_,query:d},p=eio(`wss://${c.host}`,l);return p.on("open",(async()=>{p.send(JSON.stringify({token:o}));const t=new e.uD("cast-receiver","host",((e,t)=>{try{p.send(JSON.stringify(e))}catch(e){t?.(e)}}));p.on("message",(e=>{t.handleMessage(JSON.parse(e))}));const r=new n;r.options.screen.width=1280,r.options.screen.height=720,r.options.screen.devicePixelRatio=1;const c=()=>{console.log("cleanup"),p.close(),r.pcDeferred.promise.then((e=>e.close()))};a?.(),a=c,p.on("close",(()=>{console.log("socket io connection close event"),c()})),r.onPeerConnection=async e=>{i(e).then(c);const t=new MediaStream(e.getReceivers().map((e=>e.track)));e.ontrack=e=>t.addTrack(e.track),s.srcObject=t,function(e){return new Promise(((t,r)=>{"connected"!==e.iceConnectionState?(e.addEventListener("iceconnectionstatechange",(()=>{"connected"===e.iceConnectionState&&t(void 0)})),i(e).then((e=>r(new Error(e))))):t(void 0)}))}(e).then((()=>{p.removeAllListeners()}))},t.params.session=r})),null}))}))})()})(); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNyQyxNQUFNQyxFQUFjLElBQUlDLFlBQVl2SCxFQUFHd0gsZUFBZUMsS0FBS3RTLEdBQWFBLEVBQVN3TSxTQUNqRjNCLEVBQUcwSCxRQUFVOVQsR0FBSzBULEVBQVlwRSxTQUFTdFAsRUFBRStOLE9BQ3pDWCxFQUFNMkcsVUFBWUwsRURyRDNCLFNBQXdDdEgsR0FDM0MsT0FBTyxJQUFJekosU0FBUSxDQUFDZSxFQUFTZCxLQUNLLGNBQTFCd0osRUFBR0csb0JBSVBILEVBQUdDLGlCQUFpQiw0QkFBNEIsS0FDZCxjQUExQkQsRUFBR0csb0JBQ0g3SSxPQUFRNUIsRUFBVSxJQUUxQnFLLEVBQTRCQyxHQUFJNkIsTUFBSytGLEdBQVVwUixFQUFPLElBQUlnQixNQUFNb1EsT0FQNUR0USxPQUFRNUIsRUFPNkQsR0FFakYsQ0MwQ2dCbVMsQ0FBK0I3SCxHQUMxQjZCLE1BQUssS0FDTmlGLEVBQU9nQixvQkFBb0IsR0FFN0IsRUFFTlosRUFBUWpQLE9BQWdCLFFBQUltUCxDQUFPLElBRWhDLElBQUksR0FHbkIsRyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL2Rpc3Qvc2VydmVyL3NyYy9ycGMuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9oYXJtb255IG1vZHVsZSBkZWNvcmF0b3IiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vLy4vZGlzdC9jb21tb24vc3JjL2RlZmVycmVkLmpzIiwid2VicGFjazovLy8uL2Rpc3QvY29tbW9uL3NyYy9ydGMtc2lnbmFsaW5nLmpzIiwid2VicGFjazovLy8uL2Rpc3QvZG9jcy9wbHVnaW5zL2dvb2dsZS1ob21lL2Nhc3QtcmVjZWl2ZXIvc3JjL2Nhc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0UGVyaW9kaWNHYXJiYWdlQ29sbGVjdGlvbigpIHtcbiAgICBpZiAoIWdsb2JhbC5nYykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ3JwYyBwZWVyIGdhcmJhZ2UgY29sbGVjdGlvbiBub3QgYXZhaWxhYmxlOiBnbG9iYWwuZ2MgaXMgbm90IGV4cG9zZWQuJyk7XG4gICAgfVxuICAgIGxldCBnO1xuICAgIHRyeSB7XG4gICAgICAgIGcgPSBnbG9iYWw7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgfVxuICAgIC8vIHBlcmlvZGljYWxseSBzZWUgaWYgbmV3IG9iamVjdHMgd2VyZSBjcmVhdGVkIG9yIGZpbmFsaXplZCxcbiAgICAvLyBhbmQgY29sbGVjdCBnYyBpZiBzby5cbiAgICBsZXQgbGFzdENvbGxlY3Rpb24gPSAwO1xuICAgIHJldHVybiBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHNpbmNlTGFzdENvbGxlY3Rpb24gPSBub3cgLSBsYXN0Q29sbGVjdGlvbjtcbiAgICAgICAgY29uc3QgcmVtb3Rlc0NyZWF0ZWQgPSBScGNQZWVyLnJlbW90ZXNDcmVhdGVkO1xuICAgICAgICBScGNQZWVyLnJlbW90ZXNDcmVhdGVkID0gMDtcbiAgICAgICAgY29uc3QgcmVtb3Rlc0NvbGxlY3RlZCA9IFJwY1BlZXIucmVtb3Rlc0NvbGxlY3RlZDtcbiAgICAgICAgUnBjUGVlci5yZW1vdGVzQ29sbGVjdGVkID0gMDtcbiAgICAgICAgaWYgKHJlbW90ZXNDcmVhdGVkIHx8IHJlbW90ZXNDb2xsZWN0ZWQgfHwgc2luY2VMYXN0Q29sbGVjdGlvbiA+IDUgKiA2MCAqIDEwMDApIHtcbiAgICAgICAgICAgIGxhc3RDb2xsZWN0aW9uID0gbm93O1xuICAgICAgICAgICAgZz8uZ2M/LigpO1xuICAgICAgICB9XG4gICAgfSwgMTAwMDApO1xufVxuY2xhc3MgUnBjUHJveHkge1xuICAgIHBlZXI7XG4gICAgZW50cnk7XG4gICAgY29uc3RydWN0b3JOYW1lO1xuICAgIHByb3h5UHJvcHM7XG4gICAgcHJveHlPbmVXYXlNZXRob2RzO1xuICAgIGNvbnN0cnVjdG9yKHBlZXIsIGVudHJ5LCBjb25zdHJ1Y3Rvck5hbWUsIHByb3h5UHJvcHMsIHByb3h5T25lV2F5TWV0aG9kcykge1xuICAgICAgICB0aGlzLnBlZXIgPSBwZWVyO1xuICAgICAgICB0aGlzLmVudHJ5ID0gZW50cnk7XG4gICAgICAgIHRoaXMuY29uc3RydWN0b3JOYW1lID0gY29uc3RydWN0b3JOYW1lO1xuICAgICAgICB0aGlzLnByb3h5UHJvcHMgPSBwcm94eVByb3BzO1xuICAgICAgICB0aGlzLnByb3h5T25lV2F5TWV0aG9kcyA9IHByb3h5T25lV2F5TWV0aG9kcztcbiAgICB9XG4gICAgdG9QcmltaXRpdmUoKSB7XG4gICAgICAgIGNvbnN0IHBlZXIgPSB0aGlzLnBlZXI7XG4gICAgICAgIHJldHVybiBgUnBjUHJveHktJHtwZWVyLnNlbGZOYW1lfToke3BlZXIucGVlck5hbWV9OiAke3RoaXMuY29uc3RydWN0b3JOYW1lfWA7XG4gICAgfVxuICAgIGdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKSB7XG4gICAgICAgIGlmIChwID09PSBScGNQZWVyLlBST1BFUlRZX1BST1hZX0lEKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW50cnkuaWQ7XG4gICAgICAgIGlmIChwID09PSAnX19wcm94eV9jb25zdHJ1Y3RvcicpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvck5hbWU7XG4gICAgICAgIGlmIChwID09PSAnX19wcm94eV9wZWVyJylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBlZXI7XG4gICAgICAgIGlmIChwID09PSBScGNQZWVyLlBST1BFUlRZX1BST1hZX1BST1BFUlRJRVMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm94eVByb3BzO1xuICAgICAgICBpZiAocCA9PT0gUnBjUGVlci5QUk9QRVJUWV9QUk9YWV9PTkVXQVlfTUVUSE9EUylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3h5T25lV2F5TWV0aG9kcztcbiAgICAgICAgaWYgKHAgPT09IFJwY1BlZXIuUFJPUEVSVFlfSlNPTl9ESVNBQkxFX1NFUklBTElaQVRJT04gfHwgcCA9PT0gUnBjUGVlci5QUk9QRVJUWV9KU09OX0NPUFlfU0VSSUFMSVpFX0NISUxEUkVOKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAocCA9PT0gJ3RoZW4nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAocCA9PT0gJ2NvbnN0cnVjdG9yJylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMucHJveHlQcm9wcz8uW3BdICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm94eVByb3BzPy5bcF07XG4gICAgICAgIGNvbnN0IGhhbmRsZWQgPSBScGNQZWVyLmhhbmRsZUZ1bmN0aW9uSW52b2NhdGlvbnModGhpcywgdGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICAgIGlmIChoYW5kbGVkKVxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoKCkgPT4gcCwgdGhpcyk7XG4gICAgfVxuICAgIHNldCh0YXJnZXQsIHAsIHZhbHVlLCByZWNlaXZlcikge1xuICAgICAgICBpZiAocCA9PT0gUnBjUGVlci5maW5hbGl6ZXJJZFN5bWJvbCkge1xuICAgICAgICAgICAgdGhpcy5lbnRyeS5maW5hbGl6ZXJJZCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm94eVByb3BzIHx8PSB7fTtcbiAgICAgICAgICAgIHRoaXMucHJveHlQcm9wc1twXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBhcHBseSh0YXJnZXQsIHRoaXNBcmcsIGFyZ0FycmF5KSB7XG4gICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4odGhpcy5wZWVyLnBlbmRpbmdSZXN1bHRzKSlcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgUlBDUmVzdWx0RXJyb3IodGhpcy5wZWVyLCAnUnBjUGVlciBoYXMgYmVlbiBraWxsZWQnKSk7XG4gICAgICAgIC8vIHJwYyBvYmplY3RzIGNhbiBiZSBmdW5jdGlvbnMuIGlmIHRoZSBmdW5jdGlvbiBpcyBhIG9uZXdheSBtZXRob2QsXG4gICAgICAgIC8vIGl0IHdpbGwgaGF2ZSBhIG51bGwgaW4gdGhlIG9uZXdheSBtZXRob2QgbGlzdC4gdGhpcyBpcyBiZWNhdXNlXG4gICAgICAgIC8vIHVuZGVmaW5lZCBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUuXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IHRhcmdldCgpIHx8IG51bGw7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbXTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbkNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgKGFyZ0FycmF5IHx8IFtdKSkge1xuICAgICAgICAgICAgYXJncy5wdXNoKHRoaXMucGVlci5zZXJpYWxpemUoYXJnLCBzZXJpYWxpemF0aW9uQ29udGV4dCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJwY0FwcGx5ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJhcHBseVwiLFxuICAgICAgICAgICAgaWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByb3h5SWQ6IHRoaXMuZW50cnkuaWQsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5wcm94eU9uZVdheU1ldGhvZHM/LmluY2x1ZGVzPy4obWV0aG9kKSkge1xuICAgICAgICAgICAgcnBjQXBwbHkub25ld2F5ID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGEgb25ld2F5IGNhbGxhYmxlIG9iamVjdCBkb2Vzbid0IG5lZWQgdG8gYmUgaW4gdGhlIEpTT04gcGF5bG9hZC5cbiAgICAgICAgICAgIGlmIChtZXRob2QgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgZGVsZXRlIHJwY0FwcGx5Lm1ldGhvZDtcbiAgICAgICAgICAgIHRoaXMucGVlci5zZW5kKHJwY0FwcGx5LCB1bmRlZmluZWQsIHNlcmlhbGl6YXRpb25Db250ZXh0KTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wZWVyLmNyZWF0ZVBlbmRpbmdSZXN1bHQoKGlkLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHJwY0FwcGx5LmlkID0gaWQ7XG4gICAgICAgICAgICB0aGlzLnBlZXIuc2VuZChycGNBcHBseSwgcmVqZWN0LCBzZXJpYWxpemF0aW9uQ29udGV4dCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIHRvZG86IGVycm9yIGNvbnN0cnVjdG9yIGFkZHMgYSBcImNhdXNlXCIgdmFyaWFibGUgaW4gQ2hyb21lIDkzLCBOb2RlIHY/P1xuZXhwb3J0IGNsYXNzIFJQQ1Jlc3VsdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNhdXNlO1xuICAgIGNvbnN0cnVjdG9yKHBlZXIsIG1lc3NhZ2UsIGNhdXNlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGAke3BlZXIuc2VsZk5hbWV9OiR7cGVlci5wZWVyTmFtZX06ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICAgICAgICBpZiAob3B0aW9ucz8ubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gb3B0aW9ucz8ubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8uc3RhY2spIHtcbiAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBgJHtwZWVyLnBlZXJOYW1lfToke3BlZXIuc2VsZk5hbWV9XFxuJHtjYXVzZT8uc3RhY2sgfHwgb3B0aW9ucy5zdGFja31gO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcGlsZUZ1bmN0aW9uKGNvZGUsIHBhcmFtcywgb3B0aW9ucykge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCBbXTtcbiAgICBjb25zdCBmID0gYChmdW5jdGlvbigke3BhcmFtcy5qb2luKCcsJyl9KSB7OyR7Y29kZX07fSlgO1xuICAgIHJldHVybiBldmFsKGYpO1xufVxudHJ5IHtcbiAgICBjb25zdCBmciA9IEZpbmFsaXphdGlvblJlZ2lzdHJ5O1xufVxuY2F0Y2ggKGUpIHtcbiAgICB3aW5kb3cuV2Vha1JlZiA9IGNsYXNzIFdlYWtSZWYge1xuICAgICAgICB0YXJnZXQ7XG4gICAgICAgIGNvbnN0cnVjdG9yKHRhcmdldCkge1xuICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZGVyZWYoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YXJnZXQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHdpbmRvdy5GaW5hbGl6YXRpb25SZWdpc3RyeSA9IGNsYXNzIEZpbmFsaXphdGlvblJlZ2lzdHJ5IHtcbiAgICAgICAgcmVnaXN0ZXIoKSB7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0IGNsYXNzIFJwY1BlZXIge1xuICAgIHNlbGZOYW1lO1xuICAgIHBlZXJOYW1lO1xuICAgIHNlbmQ7XG4gICAgaWRDb3VudGVyID0gMTtcbiAgICBwYXJhbXMgPSB7fTtcbiAgICBwZW5kaW5nUmVzdWx0cyA9IHt9O1xuICAgIHByb3h5Q291bnRlciA9IDE7XG4gICAgbG9jYWxQcm94aWVkID0gbmV3IE1hcCgpO1xuICAgIGxvY2FsUHJveHlNYXAgPSB7fTtcbiAgICByZW1vdGVXZWFrUHJveGllcyA9IHt9O1xuICAgIGZpbmFsaXplcnMgPSBuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoZW50cnkgPT4gdGhpcy5maW5hbGl6ZShlbnRyeSkpO1xuICAgIG5hbWVEZXNlcmlhbGl6ZXJNYXAgPSBuZXcgTWFwKCk7XG4gICAgY29uc3RydWN0b3JTZXJpYWxpemVyTWFwID0gbmV3IE1hcCgpO1xuICAgIHRyYW5zcG9ydFNhZmVBcmd1bWVudFR5cGVzID0gUnBjUGVlci5nZXREZWZhdWx0VHJhbnNwb3J0U2FmZUFyZ3VtZW50VHlwZXMoKTtcbiAgICBraWxsZWQ7XG4gICAga2lsbGVkRGVmZXJyZWQ7XG4gICAgdGFncyA9IHt9O1xuICAgIHN0YXRpYyBmaW5hbGl6ZXJJZFN5bWJvbCA9IFN5bWJvbCgncnBjRmluYWxpemVySWQnKTtcbiAgICBzdGF0aWMgcmVtb3Rlc0NvbGxlY3RlZCA9IDA7XG4gICAgc3RhdGljIHJlbW90ZXNDcmVhdGVkID0gMDtcbiAgICBzdGF0aWMgYWN0aXZlUnBjUGVlcjtcbiAgICBzdGF0aWMgaXNScGNQcm94eSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gISF2YWx1ZT8uW1JwY1BlZXIuUFJPUEVSVFlfUFJPWFlfSURdO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0RGVmYXVsdFRyYW5zcG9ydFNhZmVBcmd1bWVudFR5cGVzKCkge1xuICAgICAgICBjb25zdCBqc29uU2VyaWFsaXphYmxlID0gbmV3IFNldCgpO1xuICAgICAgICBqc29uU2VyaWFsaXphYmxlLmFkZChOdW1iZXIubmFtZSk7XG4gICAgICAgIGpzb25TZXJpYWxpemFibGUuYWRkKFN0cmluZy5uYW1lKTtcbiAgICAgICAganNvblNlcmlhbGl6YWJsZS5hZGQoT2JqZWN0Lm5hbWUpO1xuICAgICAgICBqc29uU2VyaWFsaXphYmxlLmFkZChCb29sZWFuLm5hbWUpO1xuICAgICAgICBqc29uU2VyaWFsaXphYmxlLmFkZChBcnJheS5uYW1lKTtcbiAgICAgICAgcmV0dXJuIGpzb25TZXJpYWxpemFibGU7XG4gICAgfVxuICAgIHN0YXRpYyBoYW5kbGVGdW5jdGlvbkludm9jYXRpb25zKHRoaXosIHRhcmdldCwgcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYgKHAgPT09ICdhcHBseScpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpc0FyZywgYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGl6LmFwcGx5KHRhcmdldCwgdGhpeiwgYXJncyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHAgPT09ICdjYWxsJykge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzQXJnLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXouYXBwbHkodGFyZ2V0LCB0aGl6LCBhcmdzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocCA9PT0gJ3RvU3RyaW5nJyB8fCBwID09PSBTeW1ib2wudG9QcmltaXRpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpc0FyZywgLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGl6LnRvUHJpbWl0aXZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBQUk9QRVJUWV9QUk9YWV9JRCA9ICdfX3Byb3h5X2lkJztcbiAgICBzdGF0aWMgUFJPUEVSVFlfUFJPWFlfT05FV0FZX01FVEhPRFMgPSAnX19wcm94eV9vbmV3YXlfbWV0aG9kcyc7XG4gICAgc3RhdGljIFBST1BFUlRZX0pTT05fRElTQUJMRV9TRVJJQUxJWkFUSU9OID0gJ19fanNvbl9kaXNhYmxlX3NlcmlhbGl6YXRpb24nO1xuICAgIHN0YXRpYyBQUk9QRVJUWV9QUk9YWV9QUk9QRVJUSUVTID0gJ19fcHJveHlfcHJvcHMnO1xuICAgIHN0YXRpYyBQUk9QRVJUWV9KU09OX0NPUFlfU0VSSUFMSVpFX0NISUxEUkVOID0gJ19fanNvbl9jb3B5X3NlcmlhbGl6ZV9jaGlsZHJlbic7XG4gICAgc3RhdGljIFBST0JFRF9QUk9QRVJUSUVTID0gbmV3IFNldChbXG4gICAgICAgICd0aGVuJyxcbiAgICAgICAgJ2NvbnN0cnVjdG9yJyxcbiAgICAgICAgJ19fcHJveHlfaWQnLFxuICAgICAgICAnX19wcm94eV9jb25zdHJ1Y3RvcicsXG4gICAgICAgICdfX3Byb3h5X3BlZXInLFxuICAgICAgICBScGNQZWVyLlBST1BFUlRZX1BST1hZX09ORVdBWV9NRVRIT0RTLFxuICAgICAgICBScGNQZWVyLlBST1BFUlRZX0pTT05fRElTQUJMRV9TRVJJQUxJWkFUSU9OLFxuICAgICAgICBScGNQZWVyLlBST1BFUlRZX1BST1hZX1BST1BFUlRJRVMsXG4gICAgICAgIFJwY1BlZXIuUFJPUEVSVFlfSlNPTl9DT1BZX1NFUklBTElaRV9DSElMRFJFTixcbiAgICBdKTtcbiAgICBjb25zdHJ1Y3RvcihzZWxmTmFtZSwgcGVlck5hbWUsIHNlbmQpIHtcbiAgICAgICAgdGhpcy5zZWxmTmFtZSA9IHNlbGZOYW1lO1xuICAgICAgICB0aGlzLnBlZXJOYW1lID0gcGVlck5hbWU7XG4gICAgICAgIHRoaXMuc2VuZCA9IHNlbmQ7XG4gICAgICAgIHRoaXMua2lsbGVkID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5raWxsZWREZWZlcnJlZCA9IHsgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmtpbGxlZC5jYXRjaCgoKSA9PiB7IH0pO1xuICAgIH1cbiAgICBjcmVhdGVQZW5kaW5nUmVzdWx0KGNiKSB7XG4gICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4odGhpcy5wZW5kaW5nUmVzdWx0cykpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFJQQ1Jlc3VsdEVycm9yKHRoaXMsICdScGNQZWVyIGhhcyBiZWVuIGtpbGxlZCcpKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gKHRoaXMuaWRDb3VudGVyKyspLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdSZXN1bHRzW2lkXSA9IHsgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICAgICAgICBjYihpZCwgZSA9PiByZWplY3QobmV3IFJQQ1Jlc3VsdEVycm9yKHRoaXMsIGUubWVzc2FnZSwgZSkpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHRvZG86IG1ha2UgdGhpcyBhbiBvcHRpb24gc28gcnBjIGRvZXNuJ3QgbnVrZSB0aGUgcHJvY2VzcyBpZiB1bmNhdWdodD9cbiAgICAgICAgcHJvbWlzZS5jYXRjaCgoKSA9PiB7IH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gICAga2lsbChtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFJQQ1Jlc3VsdEVycm9yKHRoaXMsIG1lc3NhZ2UgfHwgJ3BlZXIgd2FzIGtpbGxlZCcpO1xuICAgICAgICB0aGlzLmtpbGxlZERlZmVycmVkLnJlamVjdChlcnJvcik7XG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIE9iamVjdC52YWx1ZXModGhpcy5wZW5kaW5nUmVzdWx0cykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGVuZGluZ1Jlc3VsdHMgPSBPYmplY3QuZnJlZXplKHt9KTtcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuZnJlZXplKHt9KTtcbiAgICAgICAgdGhpcy5yZW1vdGVXZWFrUHJveGllcyA9IE9iamVjdC5mcmVlemUoe30pO1xuICAgICAgICB0aGlzLmxvY2FsUHJveHlNYXAgPSBPYmplY3QuZnJlZXplKHt9KTtcbiAgICAgICAgdGhpcy5sb2NhbFByb3hpZWQuY2xlYXIoKTtcbiAgICB9XG4gICAgLy8gbmVlZCBhIG5hbWUvY29uc3RydWN0b3IgbWFwIGR1ZSB0byBiYWJlbCBuYW1lIG1hbmdsaW5nPyBmaXggc29tZWhvdz9cbiAgICBhZGRTZXJpYWxpemVyKGN0ciwgbmFtZSwgc2VyaWFsaXplcikge1xuICAgICAgICB0aGlzLm5hbWVEZXNlcmlhbGl6ZXJNYXAuc2V0KG5hbWUsIHNlcmlhbGl6ZXIpO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdG9yU2VyaWFsaXplck1hcC5zZXQoY3RyLCBuYW1lKTtcbiAgICB9XG4gICAgZmluYWxpemUoZW50cnkpIHtcbiAgICAgICAgUnBjUGVlci5yZW1vdGVzQ29sbGVjdGVkKys7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnJlbW90ZVdlYWtQcm94aWVzW2VudHJ5LmlkXTtcbiAgICAgICAgY29uc3QgcnBjRmluYWxpemUgPSB7XG4gICAgICAgICAgICBfX2xvY2FsX3Byb3h5X2lkOiBlbnRyeS5pZCxcbiAgICAgICAgICAgIF9fbG9jYWxfcHJveHlfZmluYWxpemVyX2lkOiBlbnRyeS5maW5hbGl6ZXJJZCxcbiAgICAgICAgICAgIHR5cGU6ICdmaW5hbGl6ZScsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2VuZChycGNGaW5hbGl6ZSk7XG4gICAgfVxuICAgIGFzeW5jIGdldFBhcmFtKHBhcmFtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVBlbmRpbmdSZXN1bHQoKGlkLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtTWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICB0eXBlOiAncGFyYW0nLFxuICAgICAgICAgICAgICAgIHBhcmFtLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuc2VuZChwYXJhbU1lc3NhZ2UsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBldmFsTG9jYWwoc2NyaXB0LCBmaWxlbmFtZSwgY29lcmNlZFBhcmFtcykge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnBhcmFtcywgY29lcmNlZFBhcmFtcyk7XG4gICAgICAgIGxldCBjb21waWxlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gcHJldmVudCBidW5kbGVycyBmcm9tIHRyeWluZyB0byBpbmNsdWRlIG5vbi1leGlzdGVudCB2bSBtb2R1bGUuXG4gICAgICAgICAgICBjb21waWxlID0gbW9kdWxlW2ByZXF1aXJlYF0oJ3ZtJykuY29tcGlsZUZ1bmN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb21waWxlID0gY29tcGlsZUZ1bmN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGYgPSBjb21waWxlKHNjcmlwdCwgT2JqZWN0LmtleXMocGFyYW1zKSwge1xuICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGYoLi4uT2JqZWN0LnZhbHVlcyhwYXJhbXMpKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjcmVhdGVFcnJvclJlc3VsdChyZXN1bHQsIGUpIHtcbiAgICAgICAgcmVzdWx0LnN0YWNrID0gZS5zdGFjayB8fCAnbm8gc3RhY2snO1xuICAgICAgICByZXN1bHQucmVzdWx0ID0gZS5uYW1lIHx8ICdubyBuYW1lJztcbiAgICAgICAgcmVzdWx0Lm1lc3NhZ2UgPSBlLm1lc3NhZ2UgfHwgJ25vIG1lc3NhZ2UnO1xuICAgIH1cbiAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgZGVzZXJpYWxpemF0aW9uQ29udGV4dCkge1xuICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICBjb25zdCBjb3B5U2VyaWFsaXplQ2hpbGRyZW4gPSB2YWx1ZVtScGNQZWVyLlBST1BFUlRZX0pTT05fQ09QWV9TRVJJQUxJWkVfQ0hJTERSRU5dO1xuICAgICAgICBpZiAoY29weVNlcmlhbGl6ZUNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCByZXQgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXRba2V5XSA9IHRoaXMuZGVzZXJpYWxpemUodmFsLCBkZXNlcmlhbGl6YXRpb25Db250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBfX3JlbW90ZV9wcm94eV9pZCwgX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkLCBfX2xvY2FsX3Byb3h5X2lkLCBfX3JlbW90ZV9jb25zdHJ1Y3Rvcl9uYW1lLCBfX3NlcmlhbGl6ZWRfdmFsdWUsIF9fcmVtb3RlX3Byb3h5X3Byb3BzLCBfX3JlbW90ZV9wcm94eV9vbmV3YXlfbWV0aG9kcyB9ID0gdmFsdWU7XG4gICAgICAgIGlmIChfX3JlbW90ZV9wcm94eV9pZCkge1xuICAgICAgICAgICAgbGV0IHByb3h5ID0gdGhpcy5yZW1vdGVXZWFrUHJveGllc1tfX3JlbW90ZV9wcm94eV9pZF0/LmRlcmVmKCk7XG4gICAgICAgICAgICBpZiAoIXByb3h5KVxuICAgICAgICAgICAgICAgIHByb3h5ID0gdGhpcy5uZXdQcm94eShfX3JlbW90ZV9wcm94eV9pZCwgX19yZW1vdGVfY29uc3RydWN0b3JfbmFtZSwgX19yZW1vdGVfcHJveHlfcHJvcHMsIF9fcmVtb3RlX3Byb3h5X29uZXdheV9tZXRob2RzKTtcbiAgICAgICAgICAgIHByb3h5W1JwY1BlZXIuZmluYWxpemVySWRTeW1ib2xdID0gX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkO1xuICAgICAgICAgICAgY29uc3QgZGVzZXJpYWxpemVyID0gdGhpcy5uYW1lRGVzZXJpYWxpemVyTWFwLmdldChfX3JlbW90ZV9jb25zdHJ1Y3Rvcl9uYW1lKTtcbiAgICAgICAgICAgIGlmIChkZXNlcmlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKHByb3h5LCBkZXNlcmlhbGl6YXRpb25Db250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm94eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX19sb2NhbF9wcm94eV9pZCkge1xuICAgICAgICAgICAgY29uc3QgcmV0ID0gdGhpcy5sb2NhbFByb3h5TWFwW19fbG9jYWxfcHJveHlfaWRdO1xuICAgICAgICAgICAgaWYgKCFyZXQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJQQ1Jlc3VsdEVycm9yKHRoaXMsIGBpbnZhbGlkIGxvY2FsIHByb3h5IGlkICR7X19sb2NhbF9wcm94eV9pZH1gKTtcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVzZXJpYWxpemVyID0gdGhpcy5uYW1lRGVzZXJpYWxpemVyTWFwLmdldChfX3JlbW90ZV9jb25zdHJ1Y3Rvcl9uYW1lKTtcbiAgICAgICAgaWYgKGRlc2VyaWFsaXplcikge1xuICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShfX3NlcmlhbGl6ZWRfdmFsdWUsIGRlc2VyaWFsaXphdGlvbkNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgc2VyaWFsaXplKHZhbHVlLCBzZXJpYWxpemF0aW9uQ29udGV4dCkge1xuICAgICAgICBpZiAodmFsdWU/LltScGNQZWVyLlBST1BFUlRZX0pTT05fQ09QWV9TRVJJQUxJWkVfQ0hJTERSRU5dID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCByZXQgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXRba2V5XSA9IHRoaXMuc2VyaWFsaXplKHZhbCwgc2VyaWFsaXphdGlvbkNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhbHVlIHx8ICghdmFsdWVbUnBjUGVlci5QUk9QRVJUWV9KU09OX0RJU0FCTEVfU0VSSUFMSVpBVElPTl0gJiYgdGhpcy50cmFuc3BvcnRTYWZlQXJndW1lbnRUeXBlcy5oYXModmFsdWUuY29uc3RydWN0b3I/Lm5hbWUpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBfX3JlbW90ZV9jb25zdHJ1Y3Rvcl9uYW1lID0gdmFsdWUuX19wcm94eV9jb25zdHJ1Y3RvciB8fCB2YWx1ZS5jb25zdHJ1Y3Rvcj8ubmFtZT8udG9TdHJpbmcoKTtcbiAgICAgICAgbGV0IHByb3hpZWRFbnRyeSA9IHRoaXMubG9jYWxQcm94aWVkLmdldCh2YWx1ZSk7XG4gICAgICAgIGlmIChwcm94aWVkRW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IF9fcmVtb3RlX3Byb3h5X2ZpbmFsaXplcl9pZCA9ICh0aGlzLnByb3h5Q291bnRlcisrKS50b1N0cmluZygpO1xuICAgICAgICAgICAgcHJveGllZEVudHJ5LmZpbmFsaXplcklkID0gX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkO1xuICAgICAgICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X2lkOiBwcm94aWVkRW50cnkuaWQsXG4gICAgICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkLFxuICAgICAgICAgICAgICAgIF9fcmVtb3RlX2NvbnN0cnVjdG9yX25hbWUsXG4gICAgICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfcHJvcHM6IHZhbHVlPy5bUnBjUGVlci5QUk9QRVJUWV9QUk9YWV9QUk9QRVJUSUVTXSxcbiAgICAgICAgICAgICAgICBfX3JlbW90ZV9wcm94eV9vbmV3YXlfbWV0aG9kczogdmFsdWU/LltScGNQZWVyLlBST1BFUlRZX1BST1hZX09ORVdBWV9NRVRIT0RTXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgX19wcm94eV9pZCwgX19wcm94eV9wZWVyIH0gPSB2YWx1ZTtcbiAgICAgICAgaWYgKF9fcHJveHlfaWQgJiYgX19wcm94eV9wZWVyID09PSB0aGlzKSB7XG4gICAgICAgICAgICBjb25zdCByZXQgPSB7XG4gICAgICAgICAgICAgICAgX19sb2NhbF9wcm94eV9pZDogX19wcm94eV9pZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZXJNYXBOYW1lID0gdGhpcy5jb25zdHJ1Y3RvclNlcmlhbGl6ZXJNYXAuZ2V0KHZhbHVlLmNvbnN0cnVjdG9yKTtcbiAgICAgICAgaWYgKHNlcmlhbGl6ZXJNYXBOYW1lKSB7XG4gICAgICAgICAgICBfX3JlbW90ZV9jb25zdHJ1Y3Rvcl9uYW1lID0gc2VyaWFsaXplck1hcE5hbWU7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVyID0gdGhpcy5uYW1lRGVzZXJpYWxpemVyTWFwLmdldChzZXJpYWxpemVyTWFwTmFtZSk7XG4gICAgICAgICAgICBpZiAoIXNlcmlhbGl6ZXIpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXJpYWxpemVyIG5vdCBmb3VuZCBmb3IgJyArIHNlcmlhbGl6ZXJNYXBOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSwgc2VyaWFsaXphdGlvbkNvbnRleHQpO1xuICAgICAgICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X2lkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgX19yZW1vdGVfY29uc3RydWN0b3JfbmFtZSxcbiAgICAgICAgICAgICAgICBfX3JlbW90ZV9wcm94eV9wcm9wczogdmFsdWU/LltScGNQZWVyLlBST1BFUlRZX1BST1hZX1BST1BFUlRJRVNdLFxuICAgICAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X29uZXdheV9tZXRob2RzOiB2YWx1ZT8uW1JwY1BlZXIuUFJPUEVSVFlfUFJPWFlfT05FV0FZX01FVEhPRFNdLFxuICAgICAgICAgICAgICAgIF9fc2VyaWFsaXplZF92YWx1ZTogc2VyaWFsaXplZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IF9fcmVtb3RlX3Byb3h5X2lkID0gKHRoaXMucHJveHlDb3VudGVyKyspLnRvU3RyaW5nKCk7XG4gICAgICAgIHByb3hpZWRFbnRyeSA9IHtcbiAgICAgICAgICAgIGlkOiBfX3JlbW90ZV9wcm94eV9pZCxcbiAgICAgICAgICAgIGZpbmFsaXplcklkOiBfX3JlbW90ZV9wcm94eV9pZCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5sb2NhbFByb3hpZWQuc2V0KHZhbHVlLCBwcm94aWVkRW50cnkpO1xuICAgICAgICB0aGlzLmxvY2FsUHJveHlNYXBbX19yZW1vdGVfcHJveHlfaWRdID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IHJldCA9IHtcbiAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X2lkLFxuICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkOiBfX3JlbW90ZV9wcm94eV9pZCxcbiAgICAgICAgICAgIF9fcmVtb3RlX2NvbnN0cnVjdG9yX25hbWUsXG4gICAgICAgICAgICBfX3JlbW90ZV9wcm94eV9wcm9wczogdmFsdWU/LltScGNQZWVyLlBST1BFUlRZX1BST1hZX1BST1BFUlRJRVNdLFxuICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfb25ld2F5X21ldGhvZHM6IHZhbHVlPy5bUnBjUGVlci5QUk9QRVJUWV9QUk9YWV9PTkVXQVlfTUVUSE9EU10sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIG5ld1Byb3h5KHByb3h5SWQsIHByb3h5Q29uc3RydWN0b3JOYW1lLCBwcm94eVByb3BzLCBwcm94eU9uZVdheU1ldGhvZHMpIHtcbiAgICAgICAgUnBjUGVlci5yZW1vdGVzQ3JlYXRlZCsrO1xuICAgICAgICBjb25zdCBsb2NhbFByb3hpZWRFbnRyeSA9IHtcbiAgICAgICAgICAgIGlkOiBwcm94eUlkLFxuICAgICAgICAgICAgZmluYWxpemVySWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcnBjID0gbmV3IFJwY1Byb3h5KHRoaXMsIGxvY2FsUHJveGllZEVudHJ5LCBwcm94eUNvbnN0cnVjdG9yTmFtZSwgcHJveHlQcm9wcywgcHJveHlPbmVXYXlNZXRob2RzKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcHJveHlDb25zdHJ1Y3Rvck5hbWUgPT09ICdGdW5jdGlvbicgfHwgcHJveHlDb25zdHJ1Y3Rvck5hbWUgPT09ICdBc3luY0Z1bmN0aW9uJyA/IGZ1bmN0aW9uICgpIHsgfSA6IHJwYztcbiAgICAgICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0LCBycGMpO1xuICAgICAgICBjb25zdCB3ZWFrcmVmID0gbmV3IFdlYWtSZWYocHJveHkpO1xuICAgICAgICB0aGlzLnJlbW90ZVdlYWtQcm94aWVzW3Byb3h5SWRdID0gd2Vha3JlZjtcbiAgICAgICAgdGhpcy5maW5hbGl6ZXJzLnJlZ2lzdGVyKHJwYywgbG9jYWxQcm94aWVkRW50cnkpO1xuICAgICAgICByZXR1cm4gcHJveHk7XG4gICAgfVxuICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSwgZGVzZXJpYWxpemF0aW9uQ29udGV4dCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgUnBjUGVlci5hY3RpdmVScGNQZWVyID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTWVzc2FnZUludGVybmFsKG1lc3NhZ2UsIGRlc2VyaWFsaXphdGlvbkNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgUnBjUGVlci5hY3RpdmVScGNQZWVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGhhbmRsZU1lc3NhZ2VJbnRlcm5hbChtZXNzYWdlLCBkZXNlcmlhbGl6YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4odGhpcy5wZW5kaW5nUmVzdWx0cykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3BhcmFtJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBycGNQYXJhbSA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb25Db250ZXh0ID0ge307XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZXN1bHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJwY1BhcmFtLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB0aGlzLnNlcmlhbGl6ZSh0aGlzLnBhcmFtc1tycGNQYXJhbS5wYXJhbV0sIHNlcmlhbGl6YXRpb25Db250ZXh0KVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbmQocmVzdWx0LCB1bmRlZmluZWQsIHNlcmlhbGl6YXRpb25Db250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2FwcGx5Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBycGNBcHBseSA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZXN1bHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJwY0FwcGx5LmlkIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uQ29udGV4dCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5sb2NhbFByb3h5TWFwW3JwY0FwcGx5LnByb3h5SWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBwcm94eSBpZCAke3JwY0FwcGx5LnByb3h5SWR9IG5vdCBmb3VuZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgKHJwY0FwcGx5LmFyZ3MgfHwgW10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKHRoaXMuZGVzZXJpYWxpemUoYXJnLCBkZXNlcmlhbGl6YXRpb25Db250ZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnBjQXBwbHkubWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWV0aG9kID0gdGFyZ2V0W3JwY0FwcGx5Lm1ldGhvZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXRob2QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdGFyZ2V0ICR7dGFyZ2V0Py5jb25zdHJ1Y3Rvcj8ubmFtZX0gZG9lcyBub3QgaGF2ZSBtZXRob2QgJHtycGNBcHBseS5tZXRob2R9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhd2FpdCB0YXJnZXRbcnBjQXBwbHkubWV0aG9kXSguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXdhaXQgdGFyZ2V0KC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc3VsdCA9IHRoaXMuc2VyaWFsaXplKHZhbHVlLCBzZXJpYWxpemF0aW9uQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ2ZhaWx1cmUnLCBycGNBcHBseS5tZXRob2QsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVFcnJvclJlc3VsdChyZXN1bHQsIGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghcnBjQXBwbHkub25ld2F5KVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kKHJlc3VsdCwgdW5kZWZpbmVkLCBzZXJpYWxpemF0aW9uQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdyZXN1bHQnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJwY1Jlc3VsdCA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gdGhpcy5wZW5kaW5nUmVzdWx0c1tycGNSZXN1bHQuaWRdO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVzdWx0c1tycGNSZXN1bHQuaWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlZmVycmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIHJlc3VsdCAke3JwY1Jlc3VsdC5pZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJwY1Jlc3VsdC5tZXNzYWdlIHx8IHJwY1Jlc3VsdC5zdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBSUENSZXN1bHRFcnJvcih0aGlzLCBycGNSZXN1bHQubWVzc2FnZSB8fCAnbm8gbWVzc2FnZScsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHJwY1Jlc3VsdC5yZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2s6IHJwY1Jlc3VsdC5zdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUodGhpcy5kZXNlcmlhbGl6ZShycGNSZXN1bHQucmVzdWx0LCBkZXNlcmlhbGl6YXRpb25Db250ZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdmaW5hbGl6ZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnBjRmluYWxpemUgPSBtZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbCA9IHRoaXMubG9jYWxQcm94eU1hcFtycGNGaW5hbGl6ZS5fX2xvY2FsX3Byb3h5X2lkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbFByb3hpZWRFbnRyeSA9IHRoaXMubG9jYWxQcm94aWVkLmdldChsb2NhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBhIGZpbmFsaXplciBpZCBpcyBzcGVjaWZpZWQsIGl0IG11c3QgbWF0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnBjRmluYWxpemUuX19sb2NhbF9wcm94eV9maW5hbGl6ZXJfaWQgJiYgcnBjRmluYWxpemUuX19sb2NhbF9wcm94eV9maW5hbGl6ZXJfaWQgIT09IGxvY2FsUHJveGllZEVudHJ5Py5maW5hbGl6ZXJJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubG9jYWxQcm94eU1hcFtycGNGaW5hbGl6ZS5fX2xvY2FsX3Byb3h5X2lkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxQcm94aWVkLmRlbGV0ZShsb2NhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBycGMgbWVzc2FnZSB0eXBlICR7bWVzc2FnZS50eXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmhhbmRsZWQgcnBjIGVycm9yJywgdGhpcy5wZWVyTmFtZSwgZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZhbFNvdXJjZSgpIHtcbiAgICByZXR1cm4gYFxuICAgICgoKSA9PiB7XG4gICAgICAgICR7UnBjUHJveHl9XG5cbiAgICAgICAgJHtScGNQZWVyfVxuICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgUnBjUGVlcixcbiAgICAgICAgICAgIFJwY1Byb3h5LFxuICAgICAgICB9O1xuICAgIH0pKCk7XG4gICAgYDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJwYy5qcy5tYXAiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHRsb2FkZWQ6IGZhbHNlLFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcblx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18uaG1kID0gKG1vZHVsZSkgPT4ge1xuXHRtb2R1bGUgPSBPYmplY3QuY3JlYXRlKG1vZHVsZSk7XG5cdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgJ2V4cG9ydHMnLCB7XG5cdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRzZXQ6ICgpID0+IHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignRVMgTW9kdWxlcyBtYXkgbm90IGFzc2lnbiBtb2R1bGUuZXhwb3J0cyBvciBleHBvcnRzLiosIFVzZSBFU00gZXhwb3J0IHN5bnRheCwgaW5zdGVhZDogJyArIG1vZHVsZS5pZCk7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIG1vZHVsZTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsImV4cG9ydCBjbGFzcyBEZWZlcnJlZCB7XG4gICAgZmluaXNoZWQgPSBmYWxzZTtcbiAgICByZXNvbHZlO1xuICAgIHJlamVjdDtcbiAgICBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmUgPSB2ID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVzb2x2ZSh2KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yZWplY3QgPSBlID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9O1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVmZXJyZWQuanMubWFwIiwiaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tIFwiLi9kZWZlcnJlZFwiO1xuZnVuY3Rpb24gZ2V0VXNlckFnZW50KCkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgIH1cbn1cbi8vIGNvbm5lY3Rpb25TdGF0ZSBpcyBub3QgaW1wbGVtZW50ZWQgaW4gZmlyZWZveD8gc28gd2F0Y2ggaWNlQ29ubmVjdGlvblN0YXRlIGluc3RlYWQuLi5cbmV4cG9ydCBmdW5jdGlvbiB3YWl0UGVlckNvbm5lY3Rpb25JY2VDb25uZWN0ZWQocGMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBpZiAocGMuaWNlQ29ubmVjdGlvblN0YXRlID09PSAnY29ubmVjdGVkJykge1xuICAgICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBjLmFkZEV2ZW50TGlzdGVuZXIoJ2ljZWNvbm5lY3Rpb25zdGF0ZWNoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmIChwYy5pY2VDb25uZWN0aW9uU3RhdGUgPT09ICdjb25uZWN0ZWQnKVxuICAgICAgICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdhaXRQZWVySWNlQ29ubmVjdGlvbkNsb3NlZChwYykudGhlbihyZWFzb24gPT4gcmVqZWN0KG5ldyBFcnJvcihyZWFzb24pKSk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gd2FpdFBlZXJJY2VDb25uZWN0aW9uQ2xvc2VkKHBjKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBwYy5hZGRFdmVudExpc3RlbmVyKCdpY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNQZWVyQ29ubmVjdGlvbkNsb3NlZChwYykpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHBjLmljZUNvbm5lY3Rpb25TdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUGVlckNvbm5lY3Rpb25DbG9zZWQocGMpIHtcbiAgICByZXR1cm4gcGMuaWNlQ29ubmVjdGlvblN0YXRlID09PSAnZGlzY29ubmVjdGVkJ1xuICAgICAgICB8fCBwYy5pY2VDb25uZWN0aW9uU3RhdGUgPT09ICdmYWlsZWQnXG4gICAgICAgIHx8IHBjLmljZUNvbm5lY3Rpb25TdGF0ZSA9PT0gJ2Nsb3NlZCc7XG59XG5mdW5jdGlvbiBzaWxlbmNlKCkge1xuICAgIGxldCBjdHggPSBuZXcgQXVkaW9Db250ZXh0KCksIG9zY2lsbGF0b3IgPSBjdHguY3JlYXRlT3NjaWxsYXRvcigpO1xuICAgIGNvbnN0IGRlc3QgPSBjdHguY3JlYXRlTWVkaWFTdHJlYW1EZXN0aW5hdGlvbigpO1xuICAgIG9zY2lsbGF0b3IuY29ubmVjdChkZXN0KTtcbiAgICBvc2NpbGxhdG9yLnN0YXJ0KCk7XG4gICAgY29uc3QgcmV0ID0gZGVzdC5zdHJlYW0uZ2V0QXVkaW9UcmFja3MoKVswXTtcbiAgICByZXQuZW5hYmxlZCA9IGZhbHNlO1xuICAgIHJldHVybiByZXQ7XG59XG5leHBvcnQgY2xhc3MgQnJvd3NlclNpZ25hbGluZ1Nlc3Npb24ge1xuICAgIHBjO1xuICAgIHBjRGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcbiAgICBkY0RlZmVycmVkID0gbmV3IERlZmVycmVkKCk7XG4gICAgbWljcm9waG9uZTtcbiAgICBtaWNFbmFibGVkID0gZmFsc2U7XG4gICAgb25QZWVyQ29ubmVjdGlvbjtcbiAgICBvcHRpb25zID0ge1xuICAgICAgICB1c2VyQWdlbnQ6IGdldFVzZXJBZ2VudCgpLFxuICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAgIGF1ZGlvOiBSVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXM/LignYXVkaW8nKSB8fCB7XG4gICAgICAgICAgICAgICAgY29kZWNzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgaGVhZGVyRXh0ZW5zaW9uczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZpZGVvOiBSVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXM/LigndmlkZW8nKSB8fCB7XG4gICAgICAgICAgICAgICAgY29kZWNzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgaGVhZGVyRXh0ZW5zaW9uczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2NyZWVuOiB7XG4gICAgICAgICAgICBkZXZpY2VQaXhlbFJhdGlvOiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgICAgIHdpZHRoOiBzY3JlZW4ud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHNjcmVlbi5oZWlnaHQsXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG4gICAgYXN5bmMgZ2V0T3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucztcbiAgICB9XG4gICAgYXN5bmMgc2V0TWljcm9waG9uZShlbmFibGVkKSB7XG4gICAgICAgIGlmICh0aGlzLm1pY3JvcGhvbmUgJiYgZW5hYmxlZCAmJiAhdGhpcy5taWNFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLm1pY0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gZG9pbmcgc2VuZHJlY3Ygb24gc2FmYXJpIHJlcXVpcmVzIGEgbWljIGJlIGF0dGFjaGVkLCBvciBpdCBmYWlscyB0byBjb25uZWN0LlxuICAgICAgICAgICAgY29uc3QgbWljID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoeyB2aWRlbzogZmFsc2UsIGF1ZGlvOiB0cnVlIH0pO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5taWNyb3Bob25lLnJlcGxhY2VUcmFjayhtaWMuZ2V0VHJhY2tzKClbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWljcm9waG9uZS50cmFjay5lbmFibGVkID0gZW5hYmxlZDtcbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMucGNEZWZlcnJlZC5wcm9taXNlLnRoZW4ocGMgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIHBjLmdldFRyYW5zY2VpdmVycygpIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdC5zZW5kZXI/LnRyYWNrPy5zdG9wPy4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYy5jbG9zZSgpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IHsgfSk7XG4gICAgICAgIHRoaXMucGNEZWZlcnJlZC5yZWplY3QobmV3IEVycm9yKCdpY2VDb25uZWN0aW9uU3RhdGUgJyArIHRoaXMucGM/LmljZUNvbm5lY3Rpb25TdGF0ZSkpO1xuICAgIH1cbiAgICBhc3luYyBjcmVhdGVQZWVyQ29ubmVjdGlvbihzZXR1cCkge1xuICAgICAgICBpZiAodGhpcy5wYylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgY2hlY2tDb25uID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2ljZUNvbm5lY3Rpb25TdGF0ZScsIHBjLmljZUNvbm5lY3Rpb25TdGF0ZSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnY29ubmVjdGlvblN0YXRlJywgcGMuY29ubmVjdGlvblN0YXRlKTtcbiAgICAgICAgICAgIGlmIChpc1BlZXJDb25uZWN0aW9uQ2xvc2VkKHBjKSlcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBjID0gdGhpcy5wYyA9IG5ldyBSVENQZWVyQ29ubmVjdGlvbihzZXR1cC5jb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5wY0RlZmVycmVkLnJlc29sdmUocGMpO1xuICAgICAgICBhd2FpdCB0aGlzLm9uUGVlckNvbm5lY3Rpb24/LihwYyk7XG4gICAgICAgIC8vIHBjLmFkZEV2ZW50TGlzdGVuZXIoJ2Nvbm5lY3Rpb25zdGF0ZWNoYW5nZScsIGNoZWNrQ29ubik7XG4gICAgICAgIHBjLmFkZEV2ZW50TGlzdGVuZXIoJ2ljZWNvbm5lY3Rpb25zdGF0ZWNoYW5nZScsIGNoZWNrQ29ubik7XG4gICAgICAgIC8vIHBjLmFkZEV2ZW50TGlzdGVuZXIoJ2ljZWdhdGhlcmluZ3N0YXRlY2hhbmdlJywgZXYgPT4gY29uc29sZS5sb2coJ2ljZUdhdGhlcmluZ1N0YXRlJywgcGMuaWNlR2F0aGVyaW5nU3RhdGUpKVxuICAgICAgICAvLyBwYy5hZGRFdmVudExpc3RlbmVyKCdzaWduYWxpbmdzdGF0ZWNoYW5nZScsIGV2ID0+IGNvbnNvbGUubG9nKCdzaWduYWxpbmdTdGF0ZScsIHBjLnNpZ25hbGluZ1N0YXRlKSlcbiAgICAgICAgLy8gcGMuYWRkRXZlbnRMaXN0ZW5lcignaWNlY2FuZGlkYXRlZXJyb3InLCBldiA9PiBjb25zb2xlLmxvZygnaWNlY2FuZGlkYXRlZXJyb3InKSlcbiAgICAgICAgaWYgKHNldHVwLmRhdGFjaGFubmVsKSB7XG4gICAgICAgICAgICBjb25zdCBkYyA9IHBjLmNyZWF0ZURhdGFDaGFubmVsKHNldHVwLmRhdGFjaGFubmVsLmxhYmVsLCBzZXR1cC5kYXRhY2hhbm5lbC5kaWN0KTtcbiAgICAgICAgICAgIGRjLmJpbmFyeVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgICAgICAgICAgdGhpcy5kY0RlZmVycmVkLnJlc29sdmUoZGMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR1cC5hdWRpbykge1xuICAgICAgICAgICAgbGV0IGF1ZGlvO1xuICAgICAgICAgICAgaWYgKHNldHVwLmdldFVzZXJNZWRpYVNhZmFyaUhhY2sgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmNsdWRlcygnU2FmYXJpJykgJiYgIW5hdmlnYXRvci51c2VyQWdlbnQuaW5jbHVkZXMoJ0Nocm9tZScpKSB7XG4gICAgICAgICAgICAgICAgLy8gb2ZmZXJpbmcgYSBzZW5kcmVjdiBvbiBzYWZhcmkgcmVxdWlyZXMgYSBtaWMgYmUgYXR0YWNoZWQgZm9yIHJpbmcgd2VicnRjLCBvciBpdCBmYWlscyB0byBzdHJlYW0/XG4gICAgICAgICAgICAgICAgLy8gZXZlbiBpZiBhIHNpbGVudCB0cmFjayBpcyB1c2VkLi4uXG4gICAgICAgICAgICAgICAgYXVkaW8gPSBwYy5hZGRUcmFuc2NlaXZlcignYXVkaW8nLCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnNldHVwLmF1ZGlvLFxuICAgICAgICAgICAgICAgICAgICBzdHJlYW1zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhdWRpbyA9IHBjLmFkZFRyYW5zY2VpdmVyKCdhdWRpbycsIHNldHVwLmF1ZGlvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZXR1cC5hdWRpby5kaXJlY3Rpb24gPT09ICdzZW5kcmVjdicgfHwgc2V0dXAuYXVkaW8uZGlyZWN0aW9uID09PSAnc2VuZG9ubHknKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taWNyb3Bob25lID0gYXVkaW8uc2VuZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR1cC52aWRlbykge1xuICAgICAgICAgICAgaWYgKHNldHVwLnZpZGVvLmRpcmVjdGlvbiA9PT0gJ3NlbmRyZWN2JyB8fCBzZXR1cC52aWRlby5kaXJlY3Rpb24gPT09ICdzZW5kb25seScpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmEgPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IHZpZGVvOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRyYWNrIG9mIGNhbWVyYS5nZXRUcmFja3MoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGMuYWRkVHJhY2sodHJhY2spO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdoYXQgbm93XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGMuYWRkVHJhbnNjZWl2ZXIoJ3ZpZGVvJywgc2V0dXAudmlkZW8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGNyZWF0ZUxvY2FsRGVzY3JpcHRpb24odHlwZSwgc2V0dXAsIHNlbmRJY2VDYW5kaWRhdGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVQZWVyQ29ubmVjdGlvbihzZXR1cCk7XG4gICAgICAgIGNvbnN0IGdhdGhlcmluZ1Byb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMucGMub25pY2VjYW5kaWRhdGUgPSBldiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2LmNhbmRpZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImxvY2FsIGNhbmRpZGF0ZVwiLCBldi5jYW5kaWRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBzZW5kSWNlQ2FuZGlkYXRlPy4oSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShldi5jYW5kaWRhdGUpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMucGMub25pY2VnYXRoZXJpbmdzdGF0ZWNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYy5pY2VHYXRoZXJpbmdTdGF0ZSA9PT0gJ2NvbXBsZXRlJylcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHRvRGVzY3JpcHRpb24gPSAoaW5pdCkgPT4ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2xvY2FsIGRlc2NyaXB0aW9uJywgaW5pdC5zZHApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBpbml0LnR5cGUsXG4gICAgICAgICAgICAgICAgc2RwOiBpbml0LnNkcCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0eXBlID09PSAnb2ZmZXInKSB7XG4gICAgICAgICAgICBsZXQgb2ZmZXIgPSBhd2FpdCB0aGlzLnBjLmNyZWF0ZU9mZmVyKHtcbiAgICAgICAgICAgICAgICBvZmZlclRvUmVjZWl2ZUF1ZGlvOiAhIXNldHVwLmF1ZGlvLFxuICAgICAgICAgICAgICAgIG9mZmVyVG9SZWNlaXZlVmlkZW86ICEhc2V0dXAudmlkZW8sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHNldCA9IHRoaXMucGMuc2V0TG9jYWxEZXNjcmlwdGlvbihvZmZlcik7XG4gICAgICAgICAgICBpZiAoc2VuZEljZUNhbmRpZGF0ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9EZXNjcmlwdGlvbihvZmZlcik7XG4gICAgICAgICAgICBhd2FpdCBzZXQ7XG4gICAgICAgICAgICBhd2FpdCBnYXRoZXJpbmdQcm9taXNlO1xuICAgICAgICAgICAgb2ZmZXIgPSBhd2FpdCB0aGlzLnBjLmNyZWF0ZU9mZmVyKHtcbiAgICAgICAgICAgICAgICBvZmZlclRvUmVjZWl2ZUF1ZGlvOiAhIXNldHVwLmF1ZGlvLFxuICAgICAgICAgICAgICAgIG9mZmVyVG9SZWNlaXZlVmlkZW86ICEhc2V0dXAudmlkZW8sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0b0Rlc2NyaXB0aW9uKG9mZmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhbnN3ZXIgPSBhd2FpdCB0aGlzLnBjLmNyZWF0ZUFuc3dlcigpO1xuICAgICAgICAgICAgY29uc3Qgc2V0ID0gdGhpcy5wYy5zZXRMb2NhbERlc2NyaXB0aW9uKGFuc3dlcik7XG4gICAgICAgICAgICBpZiAoc2VuZEljZUNhbmRpZGF0ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9EZXNjcmlwdGlvbihhbnN3ZXIpO1xuICAgICAgICAgICAgYXdhaXQgc2V0O1xuICAgICAgICAgICAgYXdhaXQgZ2F0aGVyaW5nUHJvbWlzZTtcbiAgICAgICAgICAgIGFuc3dlciA9IHRoaXMucGMuY3VycmVudExvY2FsRGVzY3JpcHRpb24gfHwgYW5zd2VyO1xuICAgICAgICAgICAgcmV0dXJuIHRvRGVzY3JpcHRpb24oYW5zd2VyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBzZXRSZW1vdGVEZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgc2V0dXApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVQZWVyQ29ubmVjdGlvbihzZXR1cCk7XG4gICAgICAgIGF3YWl0IHRoaXMucGMuc2V0UmVtb3RlRGVzY3JpcHRpb24oZGVzY3JpcHRpb24pO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygncmVtb3RlIGRlc2NyaXB0aW9uJywgZGVzY3JpcHRpb24uc2RwKTtcbiAgICB9XG4gICAgYXN5bmMgYWRkSWNlQ2FuZGlkYXRlKGNhbmRpZGF0ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnBjLmFkZEljZUNhbmRpZGF0ZShjYW5kaWRhdGUpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInJlbW90ZSBjYW5kaWRhdGVcIiwgY2FuZGlkYXRlKTtcbiAgICB9XG4gICAgYXN5bmMgZW5kU2Vzc2lvbigpIHtcbiAgICB9XG59XG5mdW5jdGlvbiBsb2dTZW5kQ2FuZGlkYXRlKGNvbnNvbGUsIHR5cGUsIHNlc3Npb24pIHtcbiAgICByZXR1cm4gYXN5bmMgKGNhbmRpZGF0ZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7dHlwZX0gdHJpY2tsZWQgY2FuZGlkYXRlOmAsIGNhbmRpZGF0ZS5zZHBNTGluZUluZGV4LCBjYW5kaWRhdGUuY2FuZGlkYXRlKTtcbiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24uYWRkSWNlQ2FuZGlkYXRlKGNhbmRpZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2FkZEljZUNhbmRpZGF0ZSBlcnJvcicsIGUpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDYW5kaWRhdGVRdWV1ZShjb25zb2xlLCB0eXBlLCBzZXNzaW9uKSB7XG4gICAgbGV0IHJlYWR5ID0gZmFsc2U7XG4gICAgbGV0IGNhbmRpZGF0ZVF1ZXVlID0gW107XG4gICAgY29uc3QgbHMgPSBsb2dTZW5kQ2FuZGlkYXRlKGNvbnNvbGUsIHR5cGUsIHNlc3Npb24pO1xuICAgIGNvbnN0IHF1ZXVlU2VuZENhbmRpZGF0ZSA9IGFzeW5jIChjYW5kaWRhdGUpID0+IHtcbiAgICAgICAgaWYgKCFyZWFkeSlcbiAgICAgICAgICAgIGNhbmRpZGF0ZVF1ZXVlLnB1c2goY2FuZGlkYXRlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbHMoY2FuZGlkYXRlKTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIGZsdXNoKCkge1xuICAgICAgICAgICAgcmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlUXVldWUpIHtcbiAgICAgICAgICAgICAgICBscyhjYW5kaWRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FuZGlkYXRlUXVldWUgPSBbXTtcbiAgICAgICAgfSxcbiAgICAgICAgcXVldWVTZW5kQ2FuZGlkYXRlLFxuICAgIH07XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29ubmVjdFJUQ1NpZ25hbGluZ0NsaWVudHMoY29uc29sZSwgb2ZmZXJDbGllbnQsIG9mZmVyU2V0dXAsIGFuc3dlckNsaWVudCwgYW5zd2VyU2V0dXApIHtcbiAgICBjb25zdCBvZmZlck9wdGlvbnMgPSBhd2FpdCBvZmZlckNsaWVudC5nZXRPcHRpb25zKCk7XG4gICAgY29uc3QgYW5zd2VyT3B0aW9ucyA9IGF3YWl0IGFuc3dlckNsaWVudC5nZXRPcHRpb25zKCk7XG4gICAgY29uc3QgZGlzYWJsZVRyaWNrbGUgPSBvZmZlck9wdGlvbnM/LmRpc2FibGVUcmlja2xlIHx8IGFuc3dlck9wdGlvbnM/LmRpc2FibGVUcmlja2xlO1xuICAgIGlmIChvZmZlck9wdGlvbnM/Lm9mZmVyICYmIGFuc3dlck9wdGlvbnM/Lm9mZmVyKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JvdGggUlRDIGNsaWVudHMgaGF2ZSBvZmZlcnMgYW5kIGNhbiBub3QgbmVnb3RpYXRlLiBDb25zaWRlciBpbXBsZW1lbnRpbmcgdGhpcyBpbiBAc2NyeXB0ZWQvd2VicnRjLicpO1xuICAgIGlmIChvZmZlck9wdGlvbnM/LnJlcXVpcmVzT2ZmZXIgJiYgYW5zd2VyT3B0aW9ucy5yZXF1aXJlc09mZmVyKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JvdGggUlRDIGNsaWVudHMgcmVxdWlyZSBvZmZlcnMgYW5kIGNhbiBub3QgbmVnb3RpYXRlLicpO1xuICAgIG9mZmVyU2V0dXAudHlwZSA9ICdvZmZlcic7XG4gICAgYW5zd2VyU2V0dXAudHlwZSA9ICdhbnN3ZXInO1xuICAgIGNvbnN0IGFuc3dlclF1ZXVlID0gY3JlYXRlQ2FuZGlkYXRlUXVldWUoY29uc29sZSwgJ29mZmVyJywgYW5zd2VyQ2xpZW50KTtcbiAgICBjb25zdCBvZmZlclF1ZXVlID0gY3JlYXRlQ2FuZGlkYXRlUXVldWUoY29uc29sZSwgJ2Fuc3dlcicsIG9mZmVyQ2xpZW50KTtcbiAgICBjb25zdCBvZmZlciA9IGF3YWl0IG9mZmVyQ2xpZW50LmNyZWF0ZUxvY2FsRGVzY3JpcHRpb24oJ29mZmVyJywgb2ZmZXJTZXR1cCwgZGlzYWJsZVRyaWNrbGUgPyB1bmRlZmluZWQgOiBhbnN3ZXJRdWV1ZS5xdWV1ZVNlbmRDYW5kaWRhdGUpO1xuICAgIGNvbnNvbGUubG9nKCdvZmZlciBzZHAnLCBvZmZlci5zZHApO1xuICAgIGF3YWl0IGFuc3dlckNsaWVudC5zZXRSZW1vdGVEZXNjcmlwdGlvbihvZmZlciwgYW5zd2VyU2V0dXApO1xuICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGFuc3dlckNsaWVudC5jcmVhdGVMb2NhbERlc2NyaXB0aW9uKCdhbnN3ZXInLCBhbnN3ZXJTZXR1cCwgZGlzYWJsZVRyaWNrbGUgPyB1bmRlZmluZWQgOiBvZmZlclF1ZXVlLnF1ZXVlU2VuZENhbmRpZGF0ZSk7XG4gICAgY29uc29sZS5sb2coJ2Fuc3dlciBzZHAnLCBhbnN3ZXIuc2RwKTtcbiAgICBhd2FpdCBvZmZlckNsaWVudC5zZXRSZW1vdGVEZXNjcmlwdGlvbihhbnN3ZXIsIG9mZmVyU2V0dXApO1xuICAgIG9mZmVyUXVldWUuZmx1c2goKTtcbiAgICBhbnN3ZXJRdWV1ZS5mbHVzaCgpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnRjLXNpZ25hbGluZy5qcy5tYXAiLCJpbXBvcnQgeyBScGNQZWVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2VydmVyL3NyYy9ycGMnO1xuaW1wb3J0IHsgQnJvd3NlclNpZ25hbGluZ1Nlc3Npb24sIHdhaXRQZWVyQ29ubmVjdGlvbkljZUNvbm5lY3RlZCwgd2FpdFBlZXJJY2VDb25uZWN0aW9uQ2xvc2VkIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tbW9uL3NyYy9ydGMtc2lnbmFsaW5nJztcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBuZXcgY2FzdC5mcmFtZXdvcmsuQ2FzdFJlY2VpdmVyT3B0aW9ucygpO1xuICAgIG9wdGlvbnMuZGlzYWJsZUlkbGVUaW1lb3V0ID0gdHJ1ZTtcbiAgICBjYXN0LmZyYW1ld29yay5DYXN0UmVjZWl2ZXJDb250ZXh0LmdldEluc3RhbmNlKCkuc3RhcnQob3B0aW9ucyk7XG4gICAgY29uc3QgY29udGV4dCA9IGNhc3QuZnJhbWV3b3JrLkNhc3RSZWNlaXZlckNvbnRleHQuZ2V0SW5zdGFuY2UoKTtcbiAgICBjb25zdCBwbGF5ZXJNYW5hZ2VyID0gY29udGV4dC5nZXRQbGF5ZXJNYW5hZ2VyKCk7XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVkaWEnKTtcbiAgICBsZXQgcHJldmlvdXNDbGVhbnVwO1xuICAgIC8vIGludGVyY2VwdCB0aGUgTE9BRCByZXF1ZXN0IHRvIGJlIGFibGUgdG8gcmVhZCBpbiBhIGNvbnRlbnRJZCBhbmQgZ2V0IGRhdGFcbiAgICBjb25zdCBpbnRlcmNlcHRvciA9IChsb2FkUmVxdWVzdERhdGEpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2cobG9hZFJlcXVlc3REYXRhKTtcbiAgICAgICAgY29uc3QgZWlvVXJsID0gbG9hZFJlcXVlc3REYXRhLm1lZGlhLmVudGl0eSB8fCBsb2FkUmVxdWVzdERhdGEubWVkaWEuY29udGVudElkO1xuICAgICAgICBjb25zdCB0b2tlbiA9IGxvYWRSZXF1ZXN0RGF0YS5jcmVkZW50aWFscyA/PyBsb2FkUmVxdWVzdERhdGEubWVkaWEuY3VzdG9tRGF0YS50b2tlbjtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChlaW9VcmwpO1xuICAgICAgICBjb25zdCBlbmRwb2ludFBhdGggPSB1cmwucGF0aG5hbWU7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIG5ldyBVUkxTZWFyY2hQYXJhbXModXJsLnNlYXJjaCkpIHtcbiAgICAgICAgICAgIHF1ZXJ5W2tdID0gdjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgcGF0aDogZW5kcG9pbnRQYXRoLFxuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHNvY2tldCA9IGVpbyhgd3NzOi8vJHt1cmwuaG9zdH1gLCBvcHRpb25zKTtcbiAgICAgICAgc29ja2V0Lm9uKCdvcGVuJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIHRva2VuLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY29uc3QgcnBjUGVlciA9IG5ldyBScGNQZWVyKCdjYXN0LXJlY2VpdmVyJywgJ2hvc3QnLCAobWVzc2FnZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3Q/LihlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNvY2tldC5vbignbWVzc2FnZScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcnBjUGVlci5oYW5kbGVNZXNzYWdlKEpTT04ucGFyc2UoZGF0YSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gbmV3IEJyb3dzZXJTaWduYWxpbmdTZXNzaW9uKCk7XG4gICAgICAgICAgICAvLyBuZXN0IGh1YiBkZXZpY2VzIGxpZSBhYm91dCB0aGVpciBjYXBhYmlsdGllcywgc3VjaCBhc1xuICAgICAgICAgICAgLy8gcmVwb3J0aW5nIHRoYXQgdGhleSBzdXBwb3J0IDRrIGFuZCBoMjY0IGhpZ2guXG4gICAgICAgICAgICBzZXNzaW9uLm9wdGlvbnMuc2NyZWVuLndpZHRoID0gMTI4MDtcbiAgICAgICAgICAgIHNlc3Npb24ub3B0aW9ucy5zY3JlZW4uaGVpZ2h0ID0gNzIwO1xuICAgICAgICAgICAgc2Vzc2lvbi5vcHRpb25zLnNjcmVlbi5kZXZpY2VQaXhlbFJhdGlvID0gMTtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NsZWFudXAnKTtcbiAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBzZXNzaW9uLnBjRGVmZXJyZWQucHJvbWlzZS50aGVuKHBjID0+IHBjLmNsb3NlKCkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHByZXZpb3VzQ2xlYW51cD8uKCk7XG4gICAgICAgICAgICBwcmV2aW91c0NsZWFudXAgPSBjbGVhbnVwO1xuICAgICAgICAgICAgc29ja2V0Lm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc29ja2V0IGlvIGNvbm5lY3Rpb24gY2xvc2UgZXZlbnQnKTtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlc3Npb24ub25QZWVyQ29ubmVjdGlvbiA9IGFzeW5jIChwYykgPT4ge1xuICAgICAgICAgICAgICAgIHdhaXRQZWVySWNlQ29ubmVjdGlvbkNsb3NlZChwYykudGhlbihjbGVhbnVwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtZWRpYVN0cmVhbSA9IG5ldyBNZWRpYVN0cmVhbShwYy5nZXRSZWNlaXZlcnMoKS5tYXAoKHJlY2VpdmVyKSA9PiByZWNlaXZlci50cmFjaykpO1xuICAgICAgICAgICAgICAgIHBjLm9udHJhY2sgPSBlID0+IG1lZGlhU3RyZWFtLmFkZFRyYWNrKGUudHJhY2spO1xuICAgICAgICAgICAgICAgIHZpZGVvLnNyY09iamVjdCA9IG1lZGlhU3RyZWFtO1xuICAgICAgICAgICAgICAgIHdhaXRQZWVyQ29ubmVjdGlvbkljZUNvbm5lY3RlZChwYylcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJwY1BlZXIucGFyYW1zWydzZXNzaW9uJ10gPSBzZXNzaW9uO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBwbGF5ZXJNYW5hZ2VyLnNldE1lc3NhZ2VJbnRlcmNlcHRvcihjYXN0LmZyYW1ld29yay5tZXNzYWdlcy5NZXNzYWdlVHlwZS5MT0FELCBpbnRlcmNlcHRvcik7XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhc3QuanMubWFwIl0sIm5hbWVzIjpbInN0YXJ0UGVyaW9kaWNHYXJiYWdlQ29sbGVjdGlvbiIsImciLCJnYyIsImNvbnNvbGUiLCJ3YXJuIiwiZSIsImxhc3RDb2xsZWN0aW9uIiwic2V0SW50ZXJ2YWwiLCJub3ciLCJEYXRlIiwic2luY2VMYXN0Q29sbGVjdGlvbiIsInJlbW90ZXNDcmVhdGVkIiwiUnBjUGVlciIsInJlbW90ZXNDb2xsZWN0ZWQiLCJScGNQcm94eSIsInBlZXIiLCJlbnRyeSIsImNvbnN0cnVjdG9yTmFtZSIsInByb3h5UHJvcHMiLCJwcm94eU9uZVdheU1ldGhvZHMiLCJjb25zdHJ1Y3RvciIsInRoaXMiLCJ0b1ByaW1pdGl2ZSIsInNlbGZOYW1lIiwicGVlck5hbWUiLCJnZXQiLCJ0YXJnZXQiLCJwIiwicmVjZWl2ZXIiLCJQUk9QRVJUWV9QUk9YWV9JRCIsImlkIiwiUFJPUEVSVFlfUFJPWFlfUFJPUEVSVElFUyIsIlBST1BFUlRZX1BST1hZX09ORVdBWV9NRVRIT0RTIiwiUFJPUEVSVFlfSlNPTl9ESVNBQkxFX1NFUklBTElaQVRJT04iLCJQUk9QRVJUWV9KU09OX0NPUFlfU0VSSUFMSVpFX0NISUxEUkVOIiwidW5kZWZpbmVkIiwiaGFuZGxlRnVuY3Rpb25JbnZvY2F0aW9ucyIsIlByb3h5Iiwic2V0IiwidmFsdWUiLCJmaW5hbGl6ZXJJZFN5bWJvbCIsImZpbmFsaXplcklkIiwiYXBwbHkiLCJ0aGlzQXJnIiwiYXJnQXJyYXkiLCJPYmplY3QiLCJpc0Zyb3plbiIsInBlbmRpbmdSZXN1bHRzIiwiUHJvbWlzZSIsInJlamVjdCIsIlJQQ1Jlc3VsdEVycm9yIiwibWV0aG9kIiwiYXJncyIsInNlcmlhbGl6YXRpb25Db250ZXh0IiwiYXJnIiwicHVzaCIsInNlcmlhbGl6ZSIsInJwY0FwcGx5IiwidHlwZSIsInByb3h5SWQiLCJpbmNsdWRlcyIsIm9uZXdheSIsInNlbmQiLCJyZXNvbHZlIiwiY3JlYXRlUGVuZGluZ1Jlc3VsdCIsIkVycm9yIiwiY2F1c2UiLCJtZXNzYWdlIiwib3B0aW9ucyIsInN1cGVyIiwibmFtZSIsInN0YWNrIiwiY29tcGlsZUZ1bmN0aW9uIiwiY29kZSIsInBhcmFtcyIsImYiLCJqb2luIiwiZXZhbCIsImZyIiwiRmluYWxpemF0aW9uUmVnaXN0cnkiLCJ3aW5kb3ciLCJXZWFrUmVmIiwiZGVyZWYiLCJyZWdpc3RlciIsImlkQ291bnRlciIsInByb3h5Q291bnRlciIsImxvY2FsUHJveGllZCIsIk1hcCIsImxvY2FsUHJveHlNYXAiLCJyZW1vdGVXZWFrUHJveGllcyIsImZpbmFsaXplcnMiLCJmaW5hbGl6ZSIsIm5hbWVEZXNlcmlhbGl6ZXJNYXAiLCJjb25zdHJ1Y3RvclNlcmlhbGl6ZXJNYXAiLCJ0cmFuc3BvcnRTYWZlQXJndW1lbnRUeXBlcyIsImdldERlZmF1bHRUcmFuc3BvcnRTYWZlQXJndW1lbnRUeXBlcyIsImtpbGxlZCIsImtpbGxlZERlZmVycmVkIiwidGFncyIsInN0YXRpYyIsIlN5bWJvbCIsImpzb25TZXJpYWxpemFibGUiLCJTZXQiLCJhZGQiLCJOdW1iZXIiLCJTdHJpbmciLCJCb29sZWFuIiwiQXJyYXkiLCJ0aGl6IiwiY2F0Y2giLCJjYiIsInByb21pc2UiLCJ0b1N0cmluZyIsImtpbGwiLCJlcnJvciIsInJlc3VsdCIsInZhbHVlcyIsImZyZWV6ZSIsImNsZWFyIiwiYWRkU2VyaWFsaXplciIsImN0ciIsInNlcmlhbGl6ZXIiLCJycGNGaW5hbGl6ZSIsIl9fbG9jYWxfcHJveHlfaWQiLCJfX2xvY2FsX3Byb3h5X2ZpbmFsaXplcl9pZCIsImFzeW5jIiwicGFyYW0iLCJwYXJhbU1lc3NhZ2UiLCJldmFsTG9jYWwiLCJzY3JpcHQiLCJmaWxlbmFtZSIsImNvZXJjZWRQYXJhbXMiLCJhc3NpZ24iLCJjb21waWxlIiwibW9kdWxlIiwia2V5cyIsImNyZWF0ZUVycm9yUmVzdWx0IiwiZGVzZXJpYWxpemUiLCJkZXNlcmlhbGl6YXRpb25Db250ZXh0IiwicmV0Iiwia2V5IiwidmFsIiwiZW50cmllcyIsIl9fcmVtb3RlX3Byb3h5X2lkIiwiX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkIiwiX19yZW1vdGVfY29uc3RydWN0b3JfbmFtZSIsIl9fc2VyaWFsaXplZF92YWx1ZSIsIl9fcmVtb3RlX3Byb3h5X3Byb3BzIiwiX19yZW1vdGVfcHJveHlfb25ld2F5X21ldGhvZHMiLCJwcm94eSIsIm5ld1Byb3h5IiwiZGVzZXJpYWxpemVyIiwiaGFzIiwiX19wcm94eV9jb25zdHJ1Y3RvciIsInByb3hpZWRFbnRyeSIsIl9fcHJveHlfaWQiLCJfX3Byb3h5X3BlZXIiLCJzZXJpYWxpemVyTWFwTmFtZSIsInNlcmlhbGl6ZWQiLCJwcm94eUNvbnN0cnVjdG9yTmFtZSIsImxvY2FsUHJveGllZEVudHJ5IiwicnBjIiwid2Vha3JlZiIsImhhbmRsZU1lc3NhZ2UiLCJhY3RpdmVScGNQZWVyIiwiaGFuZGxlTWVzc2FnZUludGVybmFsIiwicnBjUGFyYW0iLCJycGNSZXN1bHQiLCJkZWZlcnJlZCIsImxvY2FsIiwiZGVsZXRlIiwiZ2V0RXZhbFNvdXJjZSIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsImV4cG9ydHMiLCJsb2FkZWQiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwiZCIsImRlZmluaXRpb24iLCJvIiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2xvYmFsVGhpcyIsIkZ1bmN0aW9uIiwiaG1kIiwiY3JlYXRlIiwiY2hpbGRyZW4iLCJvYmoiLCJwcm9wIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiRGVmZXJyZWQiLCJmaW5pc2hlZCIsInYiLCJnZXRVc2VyQWdlbnQiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJ3YWl0UGVlckljZUNvbm5lY3Rpb25DbG9zZWQiLCJwYyIsImFkZEV2ZW50TGlzdGVuZXIiLCJpc1BlZXJDb25uZWN0aW9uQ2xvc2VkIiwiaWNlQ29ubmVjdGlvblN0YXRlIiwiQnJvd3NlclNpZ25hbGluZ1Nlc3Npb24iLCJwY0RlZmVycmVkIiwiZGNEZWZlcnJlZCIsIm1pY3JvcGhvbmUiLCJtaWNFbmFibGVkIiwib25QZWVyQ29ubmVjdGlvbiIsImNhcGFiaWxpdGllcyIsImF1ZGlvIiwiUlRDUnRwUmVjZWl2ZXIiLCJnZXRDYXBhYmlsaXRpZXMiLCJjb2RlY3MiLCJoZWFkZXJFeHRlbnNpb25zIiwidmlkZW8iLCJzY3JlZW4iLCJkZXZpY2VQaXhlbFJhdGlvIiwid2lkdGgiLCJoZWlnaHQiLCJlbmFibGVkIiwibWljIiwibWVkaWFEZXZpY2VzIiwiZ2V0VXNlck1lZGlhIiwicmVwbGFjZVRyYWNrIiwiZ2V0VHJhY2tzIiwidHJhY2siLCJjbG9zZSIsInRoZW4iLCJ0IiwiZ2V0VHJhbnNjZWl2ZXJzIiwic2VuZGVyIiwic3RvcCIsInNldHVwIiwiUlRDUGVlckNvbm5lY3Rpb24iLCJjb25maWd1cmF0aW9uIiwibG9nIiwiY29ubmVjdGlvblN0YXRlIiwiZGF0YWNoYW5uZWwiLCJkYyIsImNyZWF0ZURhdGFDaGFubmVsIiwibGFiZWwiLCJkaWN0IiwiYmluYXJ5VHlwZSIsImdldFVzZXJNZWRpYVNhZmFyaUhhY2siLCJhZGRUcmFuc2NlaXZlciIsInN0cmVhbXMiLCJkaXJlY3Rpb24iLCJjYW1lcmEiLCJhZGRUcmFjayIsInNlbmRJY2VDYW5kaWRhdGUiLCJjcmVhdGVQZWVyQ29ubmVjdGlvbiIsImdhdGhlcmluZ1Byb21pc2UiLCJvbmljZWNhbmRpZGF0ZSIsImV2IiwiY2FuZGlkYXRlIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5Iiwib25pY2VnYXRoZXJpbmdzdGF0ZWNoYW5nZSIsImljZUdhdGhlcmluZ1N0YXRlIiwidG9EZXNjcmlwdGlvbiIsImluaXQiLCJzZHAiLCJvZmZlciIsImNyZWF0ZU9mZmVyIiwib2ZmZXJUb1JlY2VpdmVBdWRpbyIsIm9mZmVyVG9SZWNlaXZlVmlkZW8iLCJzZXRMb2NhbERlc2NyaXB0aW9uIiwiYW5zd2VyIiwiY3JlYXRlQW5zd2VyIiwiY3VycmVudExvY2FsRGVzY3JpcHRpb24iLCJkZXNjcmlwdGlvbiIsInNldFJlbW90ZURlc2NyaXB0aW9uIiwiYWRkSWNlQ2FuZGlkYXRlIiwiZG9jdW1lbnQiLCJldmVudCIsImNhc3QiLCJmcmFtZXdvcmsiLCJDYXN0UmVjZWl2ZXJPcHRpb25zIiwiZGlzYWJsZUlkbGVUaW1lb3V0IiwiQ2FzdFJlY2VpdmVyQ29udGV4dCIsImdldEluc3RhbmNlIiwic3RhcnQiLCJwbGF5ZXJNYW5hZ2VyIiwiZ2V0UGxheWVyTWFuYWdlciIsImdldEVsZW1lbnRCeUlkIiwicHJldmlvdXNDbGVhbnVwIiwic2V0TWVzc2FnZUludGVyY2VwdG9yIiwibWVzc2FnZXMiLCJNZXNzYWdlVHlwZSIsIkxPQUQiLCJsb2FkUmVxdWVzdERhdGEiLCJlaW9VcmwiLCJtZWRpYSIsImVudGl0eSIsImNvbnRlbnRJZCIsInRva2VuIiwiY3JlZGVudGlhbHMiLCJjdXN0b21EYXRhIiwidXJsIiwiVVJMIiwiZW5kcG9pbnRQYXRoIiwicGF0aG5hbWUiLCJxdWVyeSIsImsiLCJVUkxTZWFyY2hQYXJhbXMiLCJzZWFyY2giLCJwYXRoIiwic29ja2V0IiwiZWlvIiwiaG9zdCIsIm9uIiwicnBjUGVlciIsImRhdGEiLCJzZXNzaW9uIiwiY2xlYW51cCIsIm1lZGlhU3RyZWFtIiwiTWVkaWFTdHJlYW0iLCJnZXRSZWNlaXZlcnMiLCJtYXAiLCJvbnRyYWNrIiwic3JjT2JqZWN0IiwicmVhc29uIiwid2FpdFBlZXJDb25uZWN0aW9uSWNlQ29ubmVjdGVkIiwicmVtb3ZlQWxsTGlzdGVuZXJzIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/docs/plugins/google-home/cast-receiver/src/cast.ts b/docs/plugins/google-home/cast-receiver/src/cast.ts index f613e496e..37fda71f1 100644 --- a/docs/plugins/google-home/cast-receiver/src/cast.ts +++ b/docs/plugins/google-home/cast-receiver/src/cast.ts @@ -53,6 +53,12 @@ document.addEventListener("DOMContentLoaded", function (event) { }); const session = new BrowserSignalingSession(); + // nest hub devices lie about their capabilties, such as + // reporting that they support 4k and h264 high. + // this causes high res streams to fail to load. + session.options.screen.width = 1280; + session.options.screen.height = 720; + session.options.screen.devicePixelRatio = 1; const cleanup = () => { console.log('cleanup'); diff --git a/external/werift b/external/werift index 571c19a84..f1cf69407 160000 --- a/external/werift +++ b/external/werift @@ -1 +1 @@ -Subproject commit 571c19a8473984c5350d430a6eb5be99b6249206 +Subproject commit f1cf694073e02fc4c5ebad966de6d97d1f822a81 diff --git a/plugins/alexa/package-lock.json b/plugins/alexa/package-lock.json index 2311d4370..a43ab55ee 100644 --- a/plugins/alexa/package-lock.json +++ b/plugins/alexa/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/alexa", - "version": "0.0.19", + "version": "0.0.20", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/alexa", - "version": "0.0.19", + "version": "0.0.20", "dependencies": { "@types/node": "^16.6.1", "alexa-smarthome-ts": "^0.0.1", diff --git a/plugins/alexa/package.json b/plugins/alexa/package.json index 1f76b338b..682a01d36 100644 --- a/plugins/alexa/package.json +++ b/plugins/alexa/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/alexa", - "version": "0.0.19", + "version": "0.0.20", "scripts": { "scrypted-setup-project": "scrypted-setup-project", "prescrypted-setup-project": "scrypted-package-json", diff --git a/plugins/alexa/src/types/camera.ts b/plugins/alexa/src/types/camera.ts index 025aa936f..1f9a71d9e 100644 --- a/plugins/alexa/src/types/camera.ts +++ b/plugins/alexa/src/types/camera.ts @@ -50,7 +50,7 @@ addSupportedType(ScryptedDeviceType.Camera, { capabilities } }, - async reportState(device: ScryptedDevice & MotionSensor): Promise{ + async reportState(device: ScryptedDevice & MotionSensor): Promise { return { type: 'state', namespace: 'Alexa', @@ -110,6 +110,12 @@ export class AlexaSignalingSession implements RTCSignalingSession { sdp: this.directive.payload.offer.value, }, disableTrickle: true, + // this could be a low resolution screen, no way of knowing, so never send a + // 1080p+ stream. + screen: { + width: 1280, + height: 720, + } } } diff --git a/plugins/bticino/src/main.ts b/plugins/bticino/src/main.ts index 5e5e0d582..328570c99 100644 --- a/plugins/bticino/src/main.ts +++ b/plugins/bticino/src/main.ts @@ -326,7 +326,7 @@ export class SipCamProvider extends ScryptedDeviceBase implements DeviceProvider } } - async releaseDevice(id: string, nativeId: string, device: any): Promise { + async releaseDevice(id: string, nativeId: string): Promise { } async createDevice(settings: DeviceCreatorSettings): Promise { diff --git a/plugins/chromecast/README.md b/plugins/chromecast/README.md index c996e9d75..388878ffc 100644 --- a/plugins/chromecast/README.md +++ b/plugins/chromecast/README.md @@ -1,15 +1,5 @@ -# Send video, audio, and text to speech notifications to Chromecast and Google Home devices +# Chromecast Plugin for Scrypted. -## npm commands - * npm run scrypted-webpack - * npm run scrypted-deploy - * npm run scrypted-debug +Send media to Chromecast and Google Home devices. -## scrypted distribution via npm - 1. Ensure package.json is set up properly for publishing on npm. - 2. npm publish - -## Visual Studio Code configuration - -* If using a remote server, edit [.vscode/settings.json](blob/master/.vscode/settings.json) to specify the IP Address of the Scrypted server. -* Launch Scrypted Debugger from the launch menu. +Scrypted Cloud setup is required for live streams. diff --git a/plugins/chromecast/package-lock.json b/plugins/chromecast/package-lock.json index aa0c7ff80..bbe55fcb5 100644 --- a/plugins/chromecast/package-lock.json +++ b/plugins/chromecast/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/chromecast", - "version": "0.1.53", + "version": "0.1.55", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/chromecast", - "version": "0.1.53", + "version": "0.1.55", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { diff --git a/plugins/chromecast/package.json b/plugins/chromecast/package.json index f5be19b08..c97d6de70 100644 --- a/plugins/chromecast/package.json +++ b/plugins/chromecast/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/chromecast", - "version": "0.1.53", + "version": "0.1.55", "description": "Send video, audio, and text to speech notifications to Chromecast and Google Home devices", "author": "Scrypted", "license": "Apache-2.0", @@ -30,7 +30,8 @@ "DeviceProvider" ], "pluginDependencies": [ - "@scrypted/webrtc" + "@scrypted/webrtc", + "@scrypted/cloud" ] }, "dependencies": { diff --git a/plugins/chromecast/src/main.ts b/plugins/chromecast/src/main.ts index a23cd0181..60676b8cb 100644 --- a/plugins/chromecast/src/main.ts +++ b/plugins/chromecast/src/main.ts @@ -201,7 +201,15 @@ class CastDevice extends ScryptedDeviceBase implements MediaPlayer, Refresh, Eng const engineio = await endpointManager.getPublicLocalEndpoint(this.nativeId) + 'engine.io/'; const mo = await mediaManager.createMediaObject(Buffer.from(engineio), ScryptedMimeTypes.LocalUrl); - const cameraStreamAuthToken = await mediaManager.convertMediaObjectToUrl(mo, ScryptedMimeTypes.LocalUrl); + let cameraStreamAuthToken: string; + + try { + cameraStreamAuthToken= await mediaManager.convertMediaObjectToUrl(mo, ScryptedMimeTypes.LocalUrl); + } + catch (e) { + this.log.a('Streaming failed. Install and set up Scrypted Cloud to cast this media type.'); + throw e; + } const castMedia: any = { contentId: cameraStreamAuthToken, @@ -550,7 +558,7 @@ class CastDeviceProvider extends ScryptedDeviceBase implements DeviceProvider { return ret; } - async releaseDevice(id: string, nativeId: string, device: any): Promise { + async releaseDevice(id: string, nativeId: string): Promise { } diff --git a/plugins/core/ui/package-lock.json b/plugins/core/ui/package-lock.json index 732b7952e..74df8a441 100644 --- a/plugins/core/ui/package-lock.json +++ b/plugins/core/ui/package-lock.json @@ -137,21 +137,22 @@ }, "../../../sdk": { "name": "@scrypted/sdk", - "version": "0.2.39", + "version": "0.2.55", "license": "ISC", "dependencies": { - "@babel/preset-typescript": "^7.16.7", + "@babel/preset-typescript": "^7.18.6", "adm-zip": "^0.4.13", "axios": "^0.21.4", - "babel-loader": "^8.2.3", + "babel-loader": "^9.1.0", "babel-plugin-const-enum": "^1.1.0", "esbuild": "^0.15.9", "ncp": "^2.0.0", "raw-loader": "^4.0.2", "rimraf": "^3.0.2", "tmp": "^0.2.1", - "typescript": "^4.9.3", - "webpack": "^5.74.0", + "ts-loader": "^9.4.2", + "typescript": "^4.9.4", + "webpack": "^5.75.0", "webpack-bundle-analyzer": "^4.5.0" }, "bin": { @@ -164,7 +165,7 @@ "scrypted-webpack": "bin/scrypted-webpack.js" }, "devDependencies": { - "@types/node": "^18.11.9", + "@types/node": "^18.11.18", "@types/stringify-object": "^4.0.0", "stringify-object": "^3.3.0", "ts-node": "^10.4.0", @@ -173,7 +174,7 @@ }, "../../../sdk/types": { "name": "@scrypted/types", - "version": "0.2.36", + "version": "0.2.52", "license": "ISC", "devDependencies": { "@types/rimraf": "^3.0.2", @@ -1967,7 +1968,7 @@ }, "node_modules/@fortawesome/fontawesome-common-types": { "version": "6.2.1", - "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-common-types/-/6.2.1/fontawesome-common-types-6.2.1.tgz", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/6.2.1/fontawesome-common-types-6.2.1.tgz", "integrity": "sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ==", "engines": { "node": ">=6" @@ -1975,7 +1976,7 @@ }, "node_modules/@fortawesome/fontawesome-free": { "version": "6.2.1", - "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-free/-/6.2.1/fontawesome-free-6.2.1.tgz", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/6.2.1/fontawesome-free-6.2.1.tgz", "integrity": "sha512-viouXhegu/TjkvYQoiRZK3aax69dGXxgEjpvZW81wIJdxm5Fnvp3VVIP4VHKqX4SvFw6qpmkILkD4RJWAdrt7A==", "engines": { "node": ">=6" @@ -1983,7 +1984,7 @@ }, "node_modules/@fortawesome/fontawesome-svg-core": { "version": "6.2.1", - "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-svg-core/-/6.2.1/fontawesome-svg-core-6.2.1.tgz", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/6.2.1/fontawesome-svg-core-6.2.1.tgz", "integrity": "sha512-HELwwbCz6C1XEcjzyT1Jugmz2NNklMrSPjZOWMlc+ZsHIVk+XOvOXLGGQtFBwSyqfJDNgRq4xBCwWOaZ/d9DEA==", "dependencies": { "@fortawesome/fontawesome-common-types": "6.2.1" @@ -1994,7 +1995,7 @@ }, "node_modules/@fortawesome/free-brands-svg-icons": { "version": "6.2.1", - "resolved": "https://npm.fontawesome.com/@fortawesome/free-brands-svg-icons/-/6.2.1/free-brands-svg-icons-6.2.1.tgz", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/6.2.1/free-brands-svg-icons-6.2.1.tgz", "integrity": "sha512-L8l4MfdHPmZlJ72PvzdfwOwbwcCAL0vx48tJRnI6u1PJXh+j2f3yDoKyQgO3qjEsgD5Fr2tQV/cPP8F/k6aUig==", "dependencies": { "@fortawesome/fontawesome-common-types": "6.2.1" @@ -2005,7 +2006,7 @@ }, "node_modules/@fortawesome/free-regular-svg-icons": { "version": "6.2.1", - "resolved": "https://npm.fontawesome.com/@fortawesome/free-regular-svg-icons/-/6.2.1/free-regular-svg-icons-6.2.1.tgz", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/6.2.1/free-regular-svg-icons-6.2.1.tgz", "integrity": "sha512-wiqcNDNom75x+pe88FclpKz7aOSqS2lOivZeicMV5KRwOAeypxEYWAK/0v+7r+LrEY30+qzh8r2XDaEHvoLsMA==", "dependencies": { "@fortawesome/fontawesome-common-types": "6.2.1" @@ -2016,7 +2017,7 @@ }, "node_modules/@fortawesome/free-solid-svg-icons": { "version": "6.2.1", - "resolved": "https://npm.fontawesome.com/@fortawesome/free-solid-svg-icons/-/6.2.1/free-solid-svg-icons-6.2.1.tgz", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/6.2.1/free-solid-svg-icons-6.2.1.tgz", "integrity": "sha512-oKuqrP5jbfEPJWTij4sM+/RvgX+RMFwx3QZCZcK9PrBDgxC35zuc7AOFsyMjMd/PIFPeB2JxyqDr5zs/DZFPPw==", "dependencies": { "@fortawesome/fontawesome-common-types": "6.2.1" @@ -22535,17 +22536,17 @@ }, "@fortawesome/fontawesome-common-types": { "version": "6.2.1", - "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-common-types/-/6.2.1/fontawesome-common-types-6.2.1.tgz", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/6.2.1/fontawesome-common-types-6.2.1.tgz", "integrity": "sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ==" }, "@fortawesome/fontawesome-free": { "version": "6.2.1", - "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-free/-/6.2.1/fontawesome-free-6.2.1.tgz", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/6.2.1/fontawesome-free-6.2.1.tgz", "integrity": "sha512-viouXhegu/TjkvYQoiRZK3aax69dGXxgEjpvZW81wIJdxm5Fnvp3VVIP4VHKqX4SvFw6qpmkILkD4RJWAdrt7A==" }, "@fortawesome/fontawesome-svg-core": { "version": "6.2.1", - "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-svg-core/-/6.2.1/fontawesome-svg-core-6.2.1.tgz", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/6.2.1/fontawesome-svg-core-6.2.1.tgz", "integrity": "sha512-HELwwbCz6C1XEcjzyT1Jugmz2NNklMrSPjZOWMlc+ZsHIVk+XOvOXLGGQtFBwSyqfJDNgRq4xBCwWOaZ/d9DEA==", "requires": { "@fortawesome/fontawesome-common-types": "6.2.1" @@ -22553,7 +22554,7 @@ }, "@fortawesome/free-brands-svg-icons": { "version": "6.2.1", - "resolved": "https://npm.fontawesome.com/@fortawesome/free-brands-svg-icons/-/6.2.1/free-brands-svg-icons-6.2.1.tgz", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/6.2.1/free-brands-svg-icons-6.2.1.tgz", "integrity": "sha512-L8l4MfdHPmZlJ72PvzdfwOwbwcCAL0vx48tJRnI6u1PJXh+j2f3yDoKyQgO3qjEsgD5Fr2tQV/cPP8F/k6aUig==", "requires": { "@fortawesome/fontawesome-common-types": "6.2.1" @@ -22561,7 +22562,7 @@ }, "@fortawesome/free-regular-svg-icons": { "version": "6.2.1", - "resolved": "https://npm.fontawesome.com/@fortawesome/free-regular-svg-icons/-/6.2.1/free-regular-svg-icons-6.2.1.tgz", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/6.2.1/free-regular-svg-icons-6.2.1.tgz", "integrity": "sha512-wiqcNDNom75x+pe88FclpKz7aOSqS2lOivZeicMV5KRwOAeypxEYWAK/0v+7r+LrEY30+qzh8r2XDaEHvoLsMA==", "requires": { "@fortawesome/fontawesome-common-types": "6.2.1" @@ -22569,7 +22570,7 @@ }, "@fortawesome/free-solid-svg-icons": { "version": "6.2.1", - "resolved": "https://npm.fontawesome.com/@fortawesome/free-solid-svg-icons/-/6.2.1/free-solid-svg-icons-6.2.1.tgz", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/6.2.1/free-solid-svg-icons-6.2.1.tgz", "integrity": "sha512-oKuqrP5jbfEPJWTij4sM+/RvgX+RMFwx3QZCZcK9PrBDgxC35zuc7AOFsyMjMd/PIFPeB2JxyqDr5zs/DZFPPw==", "requires": { "@fortawesome/fontawesome-common-types": "6.2.1" @@ -22800,12 +22801,12 @@ "@scrypted/sdk": { "version": "file:../../../sdk", "requires": { - "@babel/preset-typescript": "^7.16.7", - "@types/node": "^18.11.9", + "@babel/preset-typescript": "^7.18.6", + "@types/node": "^18.11.18", "@types/stringify-object": "^4.0.0", "adm-zip": "^0.4.13", "axios": "^0.21.4", - "babel-loader": "^8.2.3", + "babel-loader": "^9.1.0", "babel-plugin-const-enum": "^1.1.0", "esbuild": "^0.15.9", "ncp": "^2.0.0", @@ -22813,10 +22814,11 @@ "rimraf": "^3.0.2", "stringify-object": "^3.3.0", "tmp": "^0.2.1", + "ts-loader": "^9.4.2", "ts-node": "^10.4.0", "typedoc": "^0.23.21", - "typescript": "^4.9.3", - "webpack": "^5.74.0", + "typescript": "^4.9.4", + "webpack": "^5.75.0", "webpack-bundle-analyzer": "^4.5.0" } }, diff --git a/plugins/core/ui/src/common/DevicePicker.vue b/plugins/core/ui/src/common/DevicePicker.vue index feb41243a..0e1656764 100644 --- a/plugins/core/ui/src/common/DevicePicker.vue +++ b/plugins/core/ui/src/common/DevicePicker.vue @@ -1,6 +1,6 @@