@rongcloud/plugin-call 5.2.4 → 5.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.umd.js DELETED
@@ -1,5 +0,0 @@
1
- (function(O,C){typeof exports=="object"&&typeof module<"u"?C(exports,require("@rongcloud/engine"),require("@rongcloud/plugin-rtc")):typeof define=="function"&&define.amd?define(["exports","@rongcloud/engine","@rongcloud/plugin-rtc"],C):(O=typeof globalThis<"u"?globalThis:O||self,C(O.RCCall={},O.RCEngine,O.RCRTC))})(this,function(O,C,T){"use strict";var Ae=Object.defineProperty;var Ue=(O,C,T)=>C in O?Ae(O,C,{enumerable:!0,configurable:!0,writable:!0,value:T}):O[C]=T;var f=(O,C,T)=>(Ue(O,typeof C!="symbol"?C+"":C,T),T);const oe=s=>{const e="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ+/".split(""),t=e.length+1;let i=+s;const n=[];do{const o=i%t;i=(i-o)/t,n.unshift(e[o])}while(i);return n.join("")},re=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,s=>{const e=Math.random()*16|0;return(s==="x"?e:e&3|8).toString(16)}),q=()=>{let s=re();return s=`${s.replace(/-/g,"")}0`,s=parseInt(s,16),s=oe(s),s.length>22&&(s=s.slice(0,22)),s},X=()=>{const s=Math.floor(Math.random()*1e3);let e=q();return e=e.replace(/\//g,"0"),[e,Date.now(),s].join("_")},ae=(s,e)=>setTimeout(s,e),Z=new C.EventEmitter,Y=s=>{const e="RCCallDeviceId";let t=s.sessionStorage.getItem(e);return t||(t=q(),s.sessionStorage.setItem(e,t)),t};var b=(s=>(s[s.OUTGOING=1]="OUTGOING",s[s.INCOMING=2]="INCOMING",s[s.RINGING=3]="RINGING",s[s.CONNECTED=4]="CONNECTED",s[s.IDLE=5]="IDLE",s[s.ACCEPTED=6]="ACCEPTED",s))(b||{}),l=(s=>(s[s.SUCCESS=1e4]="SUCCESS",s[s.STATE_MACHINE_EXIT=53200]="STATE_MACHINE_EXIT",s[s.SEND_MSG_ERROR=53201]="SEND_MSG_ERROR",s[s.REJECTED_BY_BLACKLIST=53202]="REJECTED_BY_BLACKLIST",s[s.NOT_IN_GROUP=53203]="NOT_IN_GROUP",s[s.GET_LOCAL_AUDIO_TRACK_ERROR=53301]="GET_LOCAL_AUDIO_TRACK_ERROR",s[s.GET_LOCAL_VIDEO_TRACK_ERROR=53302]="GET_LOCAL_VIDEO_TRACK_ERROR",s[s.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR=53303]="GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR",s[s.JOIN_ROOM_ERROR=53304]="JOIN_ROOM_ERROR",s[s.AUDIO_PUBLISH_ERROR=53305]="AUDIO_PUBLISH_ERROR",s[s.VIDEO_PUBLISH_ERROR=53306]="VIDEO_PUBLISH_ERROR",s[s.AUDIO_AND_VIDEO_PUBLISH_ERROR=53307]="AUDIO_AND_VIDEO_PUBLISH_ERROR",s[s.QUERY_JOINED_USER_INFO_ERROR=53308]="QUERY_JOINED_USER_INFO_ERROR",s[s.MISSING_VIDEO_TRACK_ERROR=53309]="MISSING_VIDEO_TRACK_ERROR",s[s.UNPUBLISH_VIDEO_ERROR=53310]="UNPUBLISH_VIDEO_ERROR",s[s.CONVERSATION_NOT_GROUP_ERROR=53311]="CONVERSATION_NOT_GROUP_ERROR",s[s.NOT_IN_ROOM_ERROR=53312]="NOT_IN_ROOM_ERROR",s[s.PARAM_ERROR=53313]="PARAM_ERROR",s))(l||{}),d=(s=>(s[s.CANCEL=1]="CANCEL",s[s.REJECT=2]="REJECT",s[s.HANGUP=3]="HANGUP",s[s.BUSY_LINE=4]="BUSY_LINE",s[s.NO_RESPONSE=5]="NO_RESPONSE",s[s.ENGINE_UNSUPPORTED=6]="ENGINE_UNSUPPORTED",s[s.NETWORK_ERROR=7]="NETWORK_ERROR",s[s.GET_MEDIA_RESOURCES_ERROR=8]="GET_MEDIA_RESOURCES_ERROR",s[s.PUBLISH_ERROR=9]="PUBLISH_ERROR",s[s.SUBSCRIBE_ERROR=10]="SUBSCRIBE_ERROR",s[s.REMOTE_CANCEL=11]="REMOTE_CANCEL",s[s.REMOTE_REJECT=12]="REMOTE_REJECT",s[s.REMOTE_HANGUP=13]="REMOTE_HANGUP",s[s.REMOTE_BUSY_LINE=14]="REMOTE_BUSY_LINE",s[s.REMOTE_NO_RESPONSE=15]="REMOTE_NO_RESPONSE",s[s.REMOTE_ENGINE_UNSUPPORTED=16]="REMOTE_ENGINE_UNSUPPORTED",s[s.REMOTE_NETWORK_ERROR=17]="REMOTE_NETWORK_ERROR",s[s.REMOTE_GET_MEDIA_RESOURCE_ERROR=18]="REMOTE_GET_MEDIA_RESOURCE_ERROR",s[s.REMOTE_PUBLISH_ERROR=19]="REMOTE_PUBLISH_ERROR",s[s.REMOTE_SUBSCRIBE_ERROR=20]="REMOTE_SUBSCRIBE_ERROR",s[s.OTHER_CLIENT_JOINED_CALL=21]="OTHER_CLIENT_JOINED_CALL",s[s.OTHER_CLIENT_IN_CALL=22]="OTHER_CLIENT_IN_CALL",s[s.KICKED_BY_SERVER=23]="KICKED_BY_SERVER",s[s.ACCEPT_SYSTEM_CALL=24]="ACCEPT_SYSTEM_CALL",s[s.REMOTE_OTHER_CLIENT_JOINED_CALL=31]="REMOTE_OTHER_CLIENT_JOINED_CALL",s[s.REMOTE_OTHER_CLIENT_IN_CALL=32]="REMOTE_OTHER_CLIENT_IN_CALL",s[s.REMOTE_KICKED_BY_SERVER=33]="REMOTE_KICKED_BY_SERVER",s[s.REMOTE_ACCEPT_SYSTEM_CALL=34]="REMOTE_ACCEPT_SYSTEM_CALL",s[s.ACCEPT_BY_OTHER_CLIENT=101]="ACCEPT_BY_OTHER_CLIENT",s[s.HANGUP_BY_OTHER_CLIENT=102]="HANGUP_BY_OTHER_CLIENT",s[s.ADDED_TO_BLACKLIST=103]="ADDED_TO_BLACKLIST",s[s.SERVICE_NOT_OPENED=104]="SERVICE_NOT_OPENED",s))(d||{});const V={[1]:11,[2]:12,[3]:13,[4]:14,[5]:15,[6]:16,[7]:17,[8]:18,[9]:19,[10]:20,[21]:31,[22]:32,[23]:33,[15]:5,[24]:34};var R=(s=>(s.VCInvite="RC:VCInvite",s.VCRinging="RC:VCRinging",s.VCAccept="RC:VCAccept",s.VCHangup="RC:VCHangup",s.VCModifyMem="RC:VCModifyMem",s.VCModifyMedia="RC:VCModifyMedia",s))(R||{}),p=(s=>(s[s.WAITING=0]="WAITING",s[s.KEEPING=1]="KEEPING",s[s.END=2]="END",s))(p||{}),m=(s=>(s[s.NONE=0]="NONE",s[s.WAITING=1]="WAITING",s[s.KEEPING=2]="KEEPING",s))(m||{}),G=(s=>(s[s.RCCallRoomTypeNormalCall=0]="RCCallRoomTypeNormalCall",s[s.RCCallRoomTypeAcrossCall=7]="RCCallRoomTypeAcrossCall",s))(G||{});let $=class{constructor(e,t){f(this,"_timerId",0);f(this,"_startTime",0);e&&(this._timerId=ae(()=>{e()},t)),this._startTime=Date.now()}stop(){clearTimeout(this._timerId);const e=Date.now();let t=e-this._startTime;return this._startTime===0&&(t=0),{startTime:this._startTime,endTime:e,duration:t}}reset(){this._startTime=0}};class F{constructor(e,t,i,n,o,r,a,h,c){f(this,"_sessionState",null);f(this,"_userInfo",{});f(this,"_userTimers",{});f(this,"_watchers");f(this,"_callTimeout",60*1e3);f(this,"_beginTimestamp",0);f(this,"_endTimestamp",0);f(this,"_endReason",null);f(this,"_callerId",null);f(this,"_inviterId",null);f(this,"_isCrossAppkey",!1);f(this,"_hungupPushConfig");this._context=e,this._runtime=t,this._logger=i,this._callMsgHandler=n,this._channelId=o,this._conversationType=r,this._targetId=a,this._mediaType=h,this._callId=c,this._callMsgHandler.registerStateMachineEvent(this._callId,"onRinging",this._onRinging.bind(this)),this._callMsgHandler.registerStateMachineEvent(this._callId,"onAccept",this._onAccept.bind(this)),this._callMsgHandler.registerStateMachineEvent(this._callId,"onMediaModify",this._onMediaModify.bind(this)),this._callMsgHandler.registerStateMachineEvent(this._callId,"onHungup",this._onHungup.bind(this))}_getTimeout(e){let t=this._context.getServerTime()-e;t<0&&(t=500);const i=this._callTimeout-t;return this._logger.warn("_",`_getTimeout -> timeout: ${i}`),i}_clearTimerById(e){this._logger.debug("_",`[RCCallStateMachine] before _clearTimerById -> userId: ${e} userTimers: ${JSON.stringify(this._userTimers)}`),this._userTimers[e]&&(this._userTimers[e].stop(),delete this._userTimers[e]),this._logger.debug("_",`[RCCallStateMachine] after _clearTimerById -> userTimers: ${JSON.stringify(this._userTimers)}`)}_notifyStateChange(e,t){var i;this._logger.warn("_",`[RCCallStateMachine] notifyStateChange -> info: ${JSON.stringify({state:e,reason:t})}`),this._endReason=t||null,this._sessionState!==e&&(this._sessionState=e,(i=this._watchers)==null||i.onStateChange({state:e,reason:t})),e===p.END&&(Z.emit("onStateMachineClose",this._callId),this._callMsgHandler.unregisterStateMachineEvent(this._callId))}_notifyUserStateChange(e,t){var i;this._logger.warn("_",`[RCCallStateMachine] notifyUserStateChange -> info: ${JSON.stringify({user:e,reason:t})}`),(i=this._watchers)==null||i.onUserStateChange({user:e,reason:t})}_otherClientHandle(e){const{senderUserId:t,content:{user:i,reason:n},messageType:o}=e;this._userInfo[t]={userId:t,state:m.NONE,isCaller:!1,isRemote:!1};for(const a in this._userTimers)this._clearTimerById(a);let r=d.ACCEPT_BY_OTHER_CLIENT;o===R.VCHangup&&(n===d.BUSY_LINE?r=d.OTHER_CLIENT_IN_CALL:n===d.NO_RESPONSE?r=d.NO_RESPONSE:r=d.HANGUP_BY_OTHER_CLIENT),Object.assign(this._userInfo[t],i),this._notifyUserStateChange(this._userInfo[t],r),this._notifyStateChange(p.END,r)}_isRemoteInvalidMsg(e,t){return!this._userInfo[e]||!this._userInfo[e].deviceId||!t?!1:this._userInfo[e].state===m.KEEPING&&this._userInfo[e].deviceId!==t}_onRinging(e){const{senderUserId:t,content:{user:i,deviceId:n}}=e,o=this._isCrossAppkey?t.split("_")[1]:t;if(this._isRemoteInvalidMsg(o,n)){this._logger.debug("_","[RCCallStateMachine] onRinging -> not the remote device that is currently talking");return}this._context.getCurrentId()!==o&&this._watchers.onRinging({userId:o,...i})}_onAccept(e){const{senderUserId:t,content:{user:i,deviceId:n},sentTime:o}=e,r=this._isCrossAppkey?t.split("_")[1]:t,a=this._context.getCurrentId();if(this._isRemoteInvalidMsg(r,n)){this._logger.debug("_","[RCCallStateMachine] _onAccept -> not the remote device that is currently talking");return}if(a===r){this._otherClientHandle(e);return}this._userTimers[r]&&this._clearTimerById(r),(this._conversationType===C.ConversationType.PRIVATE?[a,r]:[r]).forEach(c=>{const _=c===a;this._userInfo[c]={userId:c,state:m.KEEPING,isCaller:_,isRemote:_,deviceId:_?Y(this._runtime):n},_||(this._beginTimestamp=Date.now(),Object.assign(this._userInfo[r],i)),this._notifyUserStateChange(this._userInfo[c])}),this.getCallerId()===a&&this._notifyStateChange(p.KEEPING),this._watchers.onAccept({userId:r})}_onMediaModify(e){const{senderUserId:t,content:{mediaType:i,user:n,deviceId:o}}=e;if(this._isRemoteInvalidMsg(t,o)){this._logger.debug("_","[RCCallStateMachine] _onMediaModify -> not the remote device that is currently talking");return}this._context.getCurrentId()!==t&&(this._mediaType=i,this._watchers.onMediaModify({sender:{userId:t,...n},mediaType:i}))}_onHungup(e){const{senderUserId:t,content:i}=e,n=this._isCrossAppkey?t.split("_")[1]:t,{reason:o,user:r,deviceId:a}=i,h=this._context.getCurrentId();if(this._isRemoteInvalidMsg(n,a)){this._logger.debug("_","[RCCallStateMachine] _onHungup -> not the remote device that is currently talking");return}if(h===n){this._otherClientHandle(e);return}if(this._sessionState===p.END){this._logger.info("_",`[RCCallStateMachine] Invalid hang up message, current room status has ended -> sessionState: ${this._sessionState}`);return}this._userInfo[n]&&(this._userInfo[n].state=m.NONE,this._endTimestamp=Date.now(),Object.assign(this._userInfo[n],r),this._notifyUserStateChange(this._userInfo[n],V[o]),delete this._userInfo[n]),V[o]===d.REMOTE_CANCEL?this.getRemoteUserIds().length<1&&this._clearTimerById(h):this.getInviterId()===h?this._clearTimerById(n):this.getRemoteUserIds().length<1&&this._clearTimerById(h);const c=Object.keys(this._userInfo).length<2,_=this._inviterId===n,u=Object.values(this._userInfo).every(M=>M.state!==m.KEEPING);(c||_&&u)&&this._notifyStateChange(p.END,V[o]),this._watchers.onHungup({userId:n,...r},V[o])}registerEventListener(e){this._watchers=e}__onInvite(e){const{senderUserId:t,content:i,sentTime:n}=e,{inviteUserIds:o,user:r,deviceId:a,roomType:h}=i;let c;h===G.RCCallRoomTypeAcrossCall?([,c]=t.split("_"),this._watchers.crossAppkey(!0),this._isCrossAppkey=!0):c=t;const _=this._context.getCurrentId();if(this._isRemoteInvalidMsg(c,a)){this._logger.debug("_","[RCCallStateMachine] __onInvite -> not the remote device that is currently talking");return}if(_===c)return;this._callerId=this._inviterId=c;const u=[t,...o];this._callMsgHandler.sendRinging({conversationType:this._conversationType,targetId:this._targetId,channelId:this._channelId,callId:this._callId,userIds:u.filter(g=>this._isCrossAppkey?g.split("_")[1]!==_:g!==_)});const M=this._isCrossAppkey?[o[0].split("_")[1]]:o;[c,...M].forEach(g=>{this._userInfo[g]={userId:g,state:m.WAITING,isCaller:g===c,isRemote:g!==_},g===c&&Object.assign(this._userInfo[g],r,{deviceId:a}),this._notifyUserStateChange(this._userInfo[g]),g!==c&&(this._userTimers[g]=new $(()=>{const N=g===_?d.NO_RESPONSE:d.REMOTE_NO_RESPONSE;g===_?this._hungupHandle(N):(this._userInfo[g]&&(this._userInfo[g].state=m.NONE),this._notifyUserStateChange(this._userInfo[g]),this._watchers.onHungup(this._userInfo[g],N),delete this._userInfo[g])},this._getTimeout(n)))}),this._notifyStateChange(p.WAITING)}__onMemberModify(e){const{senderUserId:t,content:i,sentTime:n}=e,{user:o,existedUserPofiles:r,caller:a,deviceId:h,inviteUserIds:c,mediaType:_}=i,u=this._context.getCurrentId();if(this._isRemoteInvalidMsg(t,h)){this._logger.debug("_","[RCCallStateMachine] __onMemberModify -> not the remote device that is currently talking");return}if(u===t)return;if(this._callerId=a,this._inviterId=t,c.forEach(E=>{r.push({userId:E,mediaType:_,callStatus:b.INCOMING})}),c.includes(u)){const E=[];r.forEach(g=>{g.userId!==u&&E.push(g.userId)}),this._callMsgHandler.sendRinging({conversationType:this._conversationType,targetId:this._targetId,channelId:this._channelId,callId:this._callId,userIds:E}),this._notifyStateChange(p.WAITING)}else this._watchers.onMemberModify({sender:{userId:t,...o},invitedUsers:c.map(E=>({userId:E}))});r.forEach(E=>{const{userId:g,callStatus:N}=E;if(N!==b.IDLE&&(this._userInfo[g]={userId:g,state:N!==b.CONNECTED?m.WAITING:m.KEEPING,isCaller:t===g,isRemote:u!==g},g===t&&Object.assign(this._userInfo[g],o,{deviceId:h}),this._notifyUserStateChange(this._userInfo[g]),N!==b.CONNECTED&&!this._userTimers[g])){if(!c.includes(g))return;this._userTimers[g]=new $(()=>{this._userInfo[g]&&(this._userInfo[g].state=m.NONE);const L=g===u?d.NO_RESPONSE:d.REMOTE_NO_RESPONSE;this._notifyUserStateChange(this._userInfo[g],L);try{this._watchers.onHungup(this._userInfo[g],L)}catch(S){this._logger.error("_",`[RCCallStateMachine] call onhungup error -> ${S==null?void 0:S.stack}`)}delete this._userInfo[g],(Object.keys(this._userInfo).length<2||g===u)&&this._notifyStateChange(p.END,L)},this._getTimeout(n))}})}__handleInviteInSession(){this._logger.info("_","StateMachine -> __handleInviteInSession");for(const e in this._userInfo)this._userInfo[e].state&&(this._userInfo[e].state=m.NONE),this._notifyUserStateChange(this._userInfo[e]),this._clearTimerById(e);this._notifyStateChange(p.END,d.BUSY_LINE),this._callMsgHandler.sendHungup({channelId:this._channelId,conversationType:this._conversationType,targetId:this._targetId,callId:this._callId,reason:d.BUSY_LINE,userIds:this.getRemoteUserIds()})}async __call(e,t="",i,n=!1){this._logger.debug("_",`[RCCallStateMachine] invite -> userIds: ${JSON.stringify(e)}`);const o=this._callerId=this._inviterId=this._context.getCurrentId(),{code:r,message:a}=await this._callMsgHandler.sendInvite({roomType:n?G.RCCallRoomTypeAcrossCall:G.RCCallRoomTypeNormalCall,channelId:this._channelId,conversationType:this._conversationType,targetId:this._targetId,callId:this._callId,extra:t,pushConfig:i,mediaType:this._mediaType,inviteUserIds:e.filter(h=>h!==o)});if(this._isCrossAppkey=n,r===l.SUCCESS){const{sentTime:h}=a;(n?[o,e[0].split("_")[1]]:[o,...e]).forEach(_=>{const u=_===o;this._userInfo[_]={userId:_,state:m.WAITING,isCaller:u,isRemote:!u},this._notifyUserStateChange(this._userInfo[_]),u||(this._userTimers[_]=new $(()=>{this._userInfo[_]&&(this._userInfo[_].state=m.NONE),this._notifyUserStateChange(this._userInfo[_],d.REMOTE_NO_RESPONSE),this._watchers.onHungup(this._userInfo[_],d.REMOTE_NO_RESPONSE),delete this._userInfo[_],Object.keys(this._userInfo).length<2&&this._notifyStateChange(p.END,d.REMOTE_NO_RESPONSE),this.getRemoteUserIds().length===0&&this._userInfo[o].state!==m.KEEPING&&this._hungupHandle(d.REMOTE_NO_RESPONSE)},this._getTimeout(h)))}),this._notifyStateChange(p.WAITING)}else{const h=r===l.REJECTED_BY_BLACKLIST?d.ADDED_TO_BLACKLIST:d.NETWORK_ERROR;this._notifyStateChange(p.END,h)}return{code:r}}async accept(){this._logger.debug("_","[RCCallStateMachine] accept");const e=this._context.getCurrentId(),{code:t,message:i}=await this._callMsgHandler.sendAccept({channelId:this._channelId,conversationType:this._conversationType,targetId:this._targetId,callId:this._callId,mediaType:this._mediaType,userIds:this.getRemoteUserIds()});if(this._clearTimerById(e),t===l.SUCCESS)this._userInfo[e]&&(this._userInfo[e].state=m.KEEPING),this._beginTimestamp=Date.now(),this._notifyUserStateChange(this._userInfo[e]),this._notifyStateChange(p.KEEPING);else{this._userInfo[e]&&(this._userInfo[e].state=m.NONE),this._notifyUserStateChange(this._userInfo[e]);const n=t===l.REJECTED_BY_BLACKLIST?d.ADDED_TO_BLACKLIST:d.NETWORK_ERROR;this._notifyStateChange(p.END,n)}return{code:t}}async invite(e,t={}){if(this._conversationType!==C.ConversationType.GROUP)return{code:l.CONVERSATION_NOT_GROUP_ERROR};this._logger.debug("_",`[RCCallStateMachine] invite -> userIds: ${JSON.stringify(e)}`);const i=this._context.getCurrentId(),n=Object.keys(this._userInfo),o=n.map(_=>{let u=b.CONNECTED;return(e.includes(_)||this._userInfo[_].state===m.WAITING)&&(u=b.RINGING),{userId:_,mediaType:this._mediaType,callStatus:u,mediaId:_}}),{extra:r="",pushConfig:a}=t,{code:h,message:c}=await this._callMsgHandler.sendMemeberModify({channelId:this._channelId,conversationType:this._conversationType,targetId:this._targetId,callId:this._callId,extra:r,pushConfig:a,mediaType:this._mediaType,inviteUserIds:e.filter(_=>_!==i),callerId:this.getCallerId(),existedUserPofiles:o,directionalUserIdList:[...n,...e].filter(_=>_!==i)});if(h===l.SUCCESS){const{sentTime:_}=c;e.forEach(u=>{this._userInfo[u]={userId:u,state:m.WAITING,isCaller:!1,isRemote:!0},this._notifyUserStateChange(this._userInfo[u]),this._userTimers[u]=new $(()=>{this._userInfo[u]&&(this._userInfo[u].state=m.NONE),this._notifyUserStateChange(this._userInfo[u],d.REMOTE_NO_RESPONSE),this._watchers.onHungup(this._userInfo[u],d.REMOTE_NO_RESPONSE),delete this._userInfo[u],Object.keys(this._userInfo).length<2&&this._notifyStateChange(p.END,d.REMOTE_NO_RESPONSE)},this._getTimeout(_))})}else e.forEach(_=>{this._userInfo[_]={userId:_,state:m.NONE,isCaller:!1,isRemote:!0};const u=h===l.REJECTED_BY_BLACKLIST?d.ADDED_TO_BLACKLIST:d.NETWORK_ERROR;this._notifyUserStateChange(this._userInfo[_],u)});return{code:h}}async _hungupHandle(e){const t=this._context.getCurrentId();let i=l.SUCCESS;const n={channelId:this._channelId,conversationType:this._conversationType,targetId:this._targetId,callId:this._callId,reason:e,userIds:this.getRemoteUserIds(),pushConfig:this._hungupPushConfig};if(e===d.OTHER_CLIENT_JOINED_CALL)this._callMsgHandler.sendHungup(n);else{const{code:o}=await this._callMsgHandler.sendHungup(n);i=o}this._endTimestamp=Date.now();for(const o in this._userInfo)this._userInfo[o].state=m.NONE,o===t?this._notifyUserStateChange(this._userInfo[o],e):this._notifyUserStateChange(this._userInfo[o]),delete this._userInfo[o];return Object.keys(this._userInfo).length<2&&this._notifyStateChange(p.END,e),{code:i}}async hungup(){this._logger.debug("_","[RCCallStateMachine] hungup");const e=this._context.getCurrentId();let t=d.HANGUP;Object.keys(this._userTimers).length>0&&(this._userInfo[e].isCaller?t=d.CANCEL:this._userInfo[e].state===m.WAITING&&(t=d.REJECT));for(const i in this._userTimers)this._clearTimerById(i);return this._hungupHandle(t)}async changeMediaType(e){this._logger.debug("_",`[RCCallStateMachine] changeMediaType -> mediaType: ${e}`);const{code:t}=await this._callMsgHandler.sendMediaModify({channelId:this._channelId,conversationType:this._conversationType,targetId:this._targetId,callId:this._callId,mediaType:e,userIds:this.getRemoteUserIds()});return t===l.SUCCESS&&(this._mediaType=e),{code:t}}userJoin(e){this._logger.debug("_",`[RCCallStateMachine] userJoin -> userIds: ${JSON.stringify(e)}`),setTimeout(()=>{e.forEach(t=>{const i=this._userInfo[t];i&&i.state!==m.KEEPING&&(i.state=m.KEEPING,this._notifyUserStateChange(i)),this._sessionState!==p.KEEPING&&this._notifyStateChange(p.KEEPING),this._clearTimerById(t)})},300)}userLeave(e){this._logger.debug("_",`[RCCallStateMachine] userLeave -> userIds: ${JSON.stringify(e)}`),setTimeout(()=>{e.forEach(t=>{const i=this._userInfo[t];i&&i.state!==m.NONE&&(i.state=m.NONE,this._notifyUserStateChange(i,d.REMOTE_HANGUP),this._watchers.onHungup(i,d.REMOTE_HANGUP),delete this._userInfo[t]),new $(()=>{const n=this.getRemoteUsers();n.length===1&&n[0].state===1&&this._hungupHandle(d.REMOTE_NETWORK_ERROR)},6e4),Object.keys(this._userInfo).length<2&&this._sessionState!==p.END&&(this._endTimestamp=Date.now(),this._notifyStateChange(p.END,d.REMOTE_HANGUP))})},300)}close(e){this._hungupHandle(e)}setHungupPushConfig(e){this._hungupPushConfig=e}getCallId(){return this._callId}getChannelId(){return this._channelId}getTargetId(){return this._targetId}getConversationType(){return this._conversationType}getRemoteUserIds(){return Object.keys(this._userInfo).filter(i=>this._context.getCurrentId()!==i)}getRemoteUsers(){const e=[],t=this._context.getCurrentId();for(const i in this._userInfo){const{userId:n}=this._userInfo[i];n!==t&&e.push(this._userInfo[i])}return e}getState(){return this._sessionState===null?p.END:this._sessionState}getUserState(e){var t;return(t=this._userInfo[e])==null?void 0:t.state}getCallerId(){return this._callerId}getInviterId(){return this._inviterId}getMediaType(){return this._mediaType}getSummary(){const e=this._beginTimestamp,t=this._endTimestamp;let i=0;t>e&&e!==0&&(i=t-e);const n={conversationType:this._conversationType,channelId:this._channelId,targetId:this._targetId,mediaType:this._mediaType,beginTimestamp:e,endTimestamp:t,duration:i,endReason:this._endReason};return this._logger.debug("_",`[RCCallStateMachine] getSummary -> summary: ${JSON.stringify(n)}`),n}}var y=(s=>(s[s.AUDIO=1]="AUDIO",s[s.AUDIO_VIDEO=2]="AUDIO_VIDEO",s))(y||{}),Q=(s=>(s[s.ADD=1]="ADD",s[s.REMOVE=2]="REMOVE",s))(Q||{}),w=(s=>(s.WEB="Web",s.IOS="iOS",s.ANDROID="Android",s))(w||{});class le{constructor(e,t,i){f(this,"_messages",[]);f(this,"_channelId");f(this,"_conversationType");f(this,"_targetId");f(this,"_mediaType");f(this,"_callId");f(this,"_callerId");f(this,"_inviterId");f(this,"_endReason");f(this,"_beginTimestamp",0);f(this,"_endTimestamp",0);this._context=e,this._logger=t,this._onRecord=i}_doInvite(e){const t=this._context.getCurrentId(),{channelId:i,conversationType:n,targetId:o,senderUserId:r,content:a}=e,{callId:h,mediaType:c}=a;this._channelId=i,this._conversationType=n,this._targetId=o,this._callId=h,this._mediaType=c;const _=r===t;this._inviterId=r,this._endReason=d.REMOTE_NO_RESPONSE,this._canGenRecord()}_doMemberModify(e){this._doInvite(e)}_doRinging(e){this._canGenRecord()}_doAccept(e){this._endReason=d.HANGUP,this._beginTimestamp=e.sentTime,this._canGenRecord()}_doHungup(e){const{content:t,sentTime:i,senderUserId:n}=e,{reason:o}=t,r=this._context.getCurrentId(),a=n===r;this._endReason=a?o:V[o],this._endTimestamp=i,this._canGenRecord()}_doMediaModify(e){const{content:t}=e,{mediaType:i}=t;this._mediaType=i,this._canGenRecord()}_canGenRecord(){if(this._messages.length===0){let e=0;[d.HANGUP,d.REMOTE_HANGUP,d.OTHER_CLIENT_JOINED_CALL,d.REMOTE_OTHER_CLIENT_JOINED_CALL,d.KICKED_BY_SERVER,d.REMOTE_KICKED_BY_SERVER,d.ACCEPT_SYSTEM_CALL,d.REMOTE_ACCEPT_SYSTEM_CALL].includes(this._endReason)&&(e=this._endTimestamp-this._beginTimestamp),this._onRecord({channelId:this._channelId,conversationType:this._conversationType,targetId:this._targetId,callId:this._callId,inviterId:this._inviterId,mediaType:this._mediaType,endReason:this._endReason,beginTimestamp:this._beginTimestamp,endTimestamp:this._endTimestamp,duration:e})}}onRecvOfflineMsgs(e){this._messages=e;do{const t=this._messages.shift(),{messageType:i,content:{callId:n}}=t;switch(i){case R.VCInvite:this._doInvite(t);break;case R.VCRinging:this._doRinging(t);break;case R.VCAccept:this._doAccept(t);break;case R.VCModifyMem:this._doMemberModify(t);break;case R.VCModifyMedia:this._doMediaModify(t);break;case R.VCHangup:this._doHungup(t);break;default:this._logger.debug("_",`[OfflineRecorder] onRecvOfflineMsgs -> unexpected message: ${JSON.stringify(t)}`);break}}while(this._messages.length>0)}}const ce=["RC:VCAccept","RC:VCRinging","RC:VCSummary","RC:VCHangup","RC:VCInvite","RC:VCModifyMedia","RC:VCModifyMem"],_e={[C.ErrorCode.REJECTED_BY_BLACKLIST]:l.REJECTED_BY_BLACKLIST,[C.ErrorCode.NOT_IN_GROUP]:l.NOT_IN_GROUP};class he extends C.EventEmitter{constructor(t,i,n,o=60*1e3,r){super();f(this,"_watchers",{});f(this,"_userInfo",{});f(this,"_msgBufferList",[]);f(this,"_hadHandleMsgTimer",!1);f(this,"_offlineRecorder");f(this,"_deviceId","");this._context=t,this._runtime=i,this._logger=n,this._offlineMsgItv=o,this._getStateMachine=r,this._deviceId=Y(i),this._context.onmessage=this._onMessage.bind(this),this._offlineRecorder=new le(this._context,this._logger,a=>{this._logger.info("_",`[CallMessageHandler] offlineRecorder -> ${JSON.stringify(a)}`),this._watchers.onOfflineRecord&&this._watchers.onOfflineRecord(a)})}_onMessage(t){if(ce.includes(t.messageType)){this._logger.debug("_",`[CallMessageHandler] _onMessage -> call message: ${JSON.stringify(t)}`);try{const n=Date.now(),{sentTime:o}=t;let r=0;this._msgBufferList.forEach(({msg:{sentTime:a}},h)=>{o>=a&&(r=h+1)}),this._msgBufferList.splice(r,0,{markTime:n,msg:t}),this._logger.warn("_",`onMessage -> msgBufferList: ${this._msgBufferList.length}`)}catch(n){this._logger.error("_",`[CallMessageHandler] splice buffer msg error -> ${n.message}`)}return this._handleBufferMsgs(),!0}return!1}_onRecvOnlineCallMsg(t){this._logger.info("_",`onMessage -> _onRecvOnlineCallMsg: ${t.messageType}`);const{content:{callId:i}}=t;switch(t.messageType){case R.VCInvite:this._watchers.onInvite&&this._watchers.onInvite(t);break;case R.VCRinging:super.emit(`${i}onRinging`,t);break;case R.VCAccept:super.emit(`${i}onAccept`,t);break;case R.VCModifyMem:this._watchers.onInvite&&this._watchers.onInvite(t);break;case R.VCModifyMedia:super.emit(`${i}onMediaModify`,t);break;case R.VCHangup:super.emit(`${i}onHungup`,t);break;default:this._logger.warn("_",`[CallMessageHandler] onRecvOnlineCallMsg -> unexpected message: ${JSON.stringify(t)}`);break}}_handleBufferMsgs(){if(this._msgBufferList.length===0||this._hadHandleMsgTimer){this._logger.warn("_","_handleBufferMsgs return");return}this._hadHandleMsgTimer=!0,setTimeout(()=>{const t=Date.now(),i=this._msgBufferList.filter(n=>t-n.markTime>=200);if(this._logger.debug("_",`[CallMessageHandler] handleBufferMsgs -> lists over 200ms : ${JSON.stringify(i.map(({msg:{messageUId:n,isOffLineMessage:o,content:{callId:r}}})=>({messageUId:n,isOffLineMessage:o,callId:r})))}`),i.length===0){this._hadHandleMsgTimer=!1,this._handleBufferMsgs();return}if(i[0].msg.isOffLineMessage){let n=this._msgBufferList.filter(o=>o.msg.isOffLineMessage);do{const{conversationType:o,messageType:r,sentTime:a,senderUserId:h,content:{callId:c,inviteUserIds:_}}=n[0].msg,u=[R.VCInvite,R.VCModifyMem].includes(r),M=this._context.getServerTime()-a,E=M<this._offlineMsgItv;if(E||this._logger.warn("_",`offline msg delayTime: ${M}ms`),u){const g=[];for(let S=0;S<n.length;S++){const A=n[S].msg,{content:{callId:U}}=A;if(c===U)g.push(A);else break}if(this._logger.warn("_",`taskMsgList length: ${g.length}`),g.length>0){const S=this._msgBufferList.findIndex(U=>U.msg.messageUId===g[g.length-1].messageUId);this._msgBufferList=this._msgBufferList.slice(S+1);const A=n.findIndex(U=>U.msg.messageUId===g[g.length-1].messageUId);n=n.slice(A+1)}const N=(()=>{if(o!==C.ConversationType.PRIVATE)return!1;const S=g.length===1,A=g.every(U=>[R.VCInvite,R.VCModifyMedia,R.VCRinging].includes(U.messageType));return S||A})(),L=(()=>{if(o!==C.ConversationType.GROUP)return!1;let S=!1,A=!0,U=[h,..._],v=!1;for(let D=0;D<g.length;D++){const{senderUserId:I,messageType:k}=g[D];if(k===R.VCHangup&&I===this._context.getCurrentId())break;k===R.VCHangup&&(v=h===I,U=U.filter(H=>I!==H)),k===R.VCAccept&&(A=!1)}return!(A&&v)&&U.length>1&&(S=!0),S})();E&&(N||L)&&g.forEach(this._onRecvOnlineCallMsg,this),this._offlineRecorder.onRecvOfflineMsgs(g)}else E&&this._getStateMachine(c)?this._onRecvOnlineCallMsg(n[0].msg):this._logger.debug("_",`[CallMessageHandler] unexcepted offline msg -> ${JSON.stringify(n[0].msg)}`),n.shift(),this._msgBufferList.shift()}while(n.length>0)}else{i.forEach(({msg:o})=>{this._onRecvOnlineCallMsg(o)});const n=i.length;this._msgBufferList.splice(0,n),this._logger.debug("_",`timer online msg handle -> delCount: ${n} msgBufferList: ${this._msgBufferList.length}`)}this._hadHandleMsgTimer=!1,this._handleBufferMsgs()},20)}registerEventListener(t){Object.assign(this._watchers,t)}registerStateMachineEvent(t,i,n){const o=t+i;super.on(o,n)}unregisterStateMachineEvent(t){["onRinging","onAccept","onHungup","onMediaModify"].forEach(i=>{const n=t+i;super.removeAll(n)})}registerUserInfo(t){this._userInfo=t}async _sendCallMessage(t){this._logger.debug("_",`CallMessageHandler] sendCallMesage -> message: ${JSON.stringify(t)}`);const{channelId:i,conversationType:n,targetId:o,content:r,messageType:a,directionalUserIdList:h,pushConfig:c}=t,_={channelId:i,messageType:a,content:r,directionalUserIdList:h};if([R.VCInvite,R.VCModifyMem,R.VCHangup].includes(a)){const E=c||{pushTitle:"",pushContent:"",pushData:""};E.androidConfig=Object.assign((c==null?void 0:c.androidConfig)||{},{categoryHW:"VOIP",categoryVivo:"IM"}),E.iOSConfig=Object.assign(E.iOSConfig||{},{apnsCollapseId:r.callId}),E.disablePushTitle=!1,E.forceShowDetailContent=!1,_.pushConfig=E}const{code:u,data:M}=await this._context.sendMessage(n,o,_);return u!==C.ErrorCode.SUCCESS?(this._logger.error("_",`CallMessageHandler] sendCallMesage error -> code: ${u}`),{code:_e[u]||l.SEND_MSG_ERROR}):{code:l.SUCCESS,message:M}}async sendInvite(t){const{roomType:i,channelId:n,conversationType:o,targetId:r,callId:a,mediaType:h,inviteUserIds:c,extra:_,pushConfig:u}=t;this._logger.warn("_","CallMessageHandler] sendCallMesage sendInvite",JSON.stringify(t)),this._watchers.sendAccept&&this._watchers.sendAccept({callId:a});const M={platform:w.WEB,deviceId:this._deviceId,callId:a,roomType:i,extra:_,engineType:4,channelInfo:{Id:a,Key:""},mediaType:h,inviteUserIds:c,observerUserIds:[],user:this._userInfo};return u&&(u.pushData=JSON.stringify({mediaType:h,userIdList:c,callId:a})),this._sendCallMessage({channelId:n,conversationType:o,targetId:r,content:M,messageType:R.VCInvite,directionalUserIdList:o===C.ConversationType.GROUP?c:[r],pushConfig:u})}async sendMemeberModify(t){const{channelId:i,conversationType:n,targetId:o,callId:r,mediaType:a,inviteUserIds:h,callerId:c,existedUserPofiles:_,directionalUserIdList:u,extra:M,pushConfig:E}=t,g={platform:w.WEB,deviceId:this._deviceId,callId:r,extra:M,engineType:4,channelInfo:{Id:r,Key:""},mediaType:a,inviteUserIds:h,observerUserIds:[],user:this._userInfo,caller:c,modifyMemType:Q.ADD,existedUserPofiles:_};return E&&(E.pushData=JSON.stringify({mediaType:a,userIdList:h,callId:r})),this._sendCallMessage({channelId:i,conversationType:n,targetId:o,content:g,messageType:R.VCModifyMem,directionalUserIdList:u,pushConfig:E})}sendRinging(t){const{channelId:i,conversationType:n,targetId:o,callId:r,userIds:a}=t,h={platform:w.WEB,deviceId:this._deviceId,callId:r,user:this._userInfo};return this._sendCallMessage({channelId:i,conversationType:n,targetId:o,content:h,messageType:R.VCRinging,directionalUserIdList:a})}sendAccept(t){const{channelId:i,conversationType:n,targetId:o,callId:r,mediaType:a,userIds:h}=t,c={platform:w.WEB,deviceId:this._deviceId,callId:r,mediaType:a,user:this._userInfo};return this._sendCallMessage({channelId:i,conversationType:n,targetId:o,content:c,messageType:R.VCAccept,directionalUserIdList:h})}sendHungup(t){const{channelId:i,conversationType:n,targetId:o,callId:r,reason:a,userIds:h,pushConfig:c}=t,_={platform:w.WEB,deviceId:this._deviceId,callId:r,reason:a,user:this._userInfo};return c&&(c.pushData=JSON.stringify({callId:r,reason:a})),this._sendCallMessage({channelId:i,conversationType:n,targetId:o,content:_,messageType:R.VCHangup,pushConfig:c,directionalUserIdList:h})}sendMediaModify(t){const{channelId:i,conversationType:n,targetId:o,callId:r,mediaType:a,userIds:h}=t,c={platform:w.WEB,deviceId:this._deviceId,callId:r,mediaType:a,user:this._userInfo};return this._sendCallMessage({channelId:i,conversationType:n,targetId:o,content:c,messageType:R.VCModifyMedia,directionalUserIdList:h})}}var P=(s=>(s.ZH="zh",s.EN="en",s))(P||{});const de={PushTitle:{AUDIO:"You have a voice call",VIDEO:"You have a video call"}},ge={PushTitle:{AUDIO:"您有一条音频通话",VIDEO:"您有一条视频通话"}};class ee{static set(e){this._lang=e}static get(){return this._lang===P.EN?de:ge}}f(ee,"_lang",P.ZH);class ue{constructor(e,t,i,n,o){f(this,"_stateMachine",{});f(this,"_callMsgHandler");this._context=e,this._runtime=t,this._logger=i,this._watchers=n,this._options=o,this._logger.warn("_","RCCallEngine Version: 5.2.4 CommitId: 0a7b424ef05373eeea5ff3c35af1286656a750fd"),Y(t),this._callMsgHandler=new he(this._context,this._runtime,this._logger,this._options.offlineMsgItv,this._getStateMachine.bind(this)),this._callMsgHandler.registerEventListener({onInvite:this._onInvite.bind(this),sendAccept:this._handleSendAccept.bind(this),onOfflineRecord:this._watchers.onOfflineRecord}),Z.on("onStateMachineClose",r=>{delete this._stateMachine[r]}),ee.set(o.lang)}_onInvite(e){const{channelId:t,conversationType:i,targetId:n,content:o,messageType:r,senderUserId:a,pushConfig:h}=e;this._logger.warn("_",`RCCallEngine _onInvite:targetId ${n} senderUserId: ${a}`);const{mediaType:c,callId:_,extra:u,roomType:M}=o;let E;M!==G.RCCallRoomTypeAcrossCall?E=a:[,E]=a.split("_");const g=this._context.getCurrentId();if(this._context.getCurrentId()===E||r===R.VCModifyMem&&o.existedUserPofiles.some(S=>S.userId===g)&&!this._stateMachine[_])return;this._stateMachine[_]?r===R.VCModifyMem&&this._stateMachine[_].__onMemberModify(e):(this._stateMachine[_]=new F(this._context,this._runtime,this._logger,this._callMsgHandler,t,i,n,c,_),this._logger.info("_",`[RCCallEngine] RCCallStateMachine successfully created -> callId: ${_}`),r===R.VCInvite?this._stateMachine[_].__onInvite(e):r===R.VCModifyMem&&this._stateMachine[_].__onMemberModify(e),this._watchers.onInvite(this._stateMachine[_],u),Object.keys(this._stateMachine).filter(S=>_!==S).length>0&&!this._options.isAllowAcceptNewCall&&this._stateMachine[_].__handleInviteInSession())}_handleSendAccept(e){if(this._options.isAllowAcceptNewCall){const{callId:t}=e;for(const i in this._stateMachine)t!==i&&(this._stateMachine[i].hungup(),delete this._stateMachine[i])}}_getStateMachine(e){return this._stateMachine[e]}registerUserInfo(e){this._logger.debug("_",`[RCCallEngine] registerUserInfo -> userInfo: ${JSON.stringify(e)}`),this._callMsgHandler.registerUserInfo(e)}async call(e,t,i,n="",o,r=!1){this._logger.debug("_",`[RCCallEngine] call -> args: ${JSON.stringify({channelId:e,targetId:t,mediaType:i,extra:n,pushConfig:o})}`);const a=X();if(Object.keys(this._stateMachine).length>0)return{code:l.STATE_MACHINE_EXIT};this._stateMachine[a]=new F(this._context,this._runtime,this._logger,this._callMsgHandler,e,C.ConversationType.PRIVATE,t,i,a);const{code:c}=await this._stateMachine[a].__call([t],n,o,r);return c===l.SUCCESS?{code:l.SUCCESS,stateMachine:this._stateMachine[a]}:{code:c}}async callInGroup(e,t,i,n,o="",r){this._logger.debug("_",`[RCCallEngine] callInGroup -> args: ${JSON.stringify({channelId:e,targetId:t,mediaType:i})}`);const a=X();if(Object.keys(this._stateMachine).length>0)return{code:l.STATE_MACHINE_EXIT};this._stateMachine[a]=new F(this._context,this._runtime,this._logger,this._callMsgHandler,e,C.ConversationType.GROUP,t,i,a);const{code:c}=await this._stateMachine[a].__call(n,o,r);return c===l.SUCCESS?{code:l.SUCCESS,stateMachine:this._stateMachine[a]}:{code:c}}destroy(){this._logger.debug("_","[RCCallEngine] destroy"),this._stateMachine={}}}var x=(s=>(s[s.CALLER=1]="CALLER",s[s.CALLEE=2]="CALLEE",s))(x||{});class fe{constructor(){f(this,"list",{})}on(e,t){return(this.list[e]||(this.list[e]=[])).push(t),this}once(e,t){const i=n=>{this.off(e,i),t.call(this,n)};i.fun=t,this.on(e,i)}off(e,t){const i=this.list[e];if(!i)return!1;if(!t)i&&(i.length=0);else{let n;for(let o=0,{length:r}=i;o<r;o++)if(n=i[o],n===t||n.fun===t){i.splice(o,1);break}}}emit(e,t){const i=[...this.list[e]];if(!i||i.length===0)return!1;i.forEach(n=>{n.call(this,t)})}}const B=new fe;function Ce(s){return Object.values(P).includes(s)}function Ie(s){return Object.values(C.RTCJoinType).includes(s)}function Re(s){return[C.LogL.DEBUG,C.LogL.INFO,C.LogL.WARN,C.LogL.ERROR].includes(s)}const Ee=s=>{if(!s)return{result:!1,msg:"Initialization missing parameter -> options"};if(typeof s!="object")return{result:!1,msg:"Initialization options must be an object"};const e=["rtcClient","onSession","onSessionClose"],t=Object.keys(s),i=[];return e.forEach(n=>{t.includes(n)||i.push(n)}),i.length?{result:!1,msg:`Initialization missing parameter -> "${i.join(",")}"`}:typeof s.rtcClient!="object"?{result:!1,msg:"Initialization 'rtcClient' parameter must be of type 'object'"}:typeof s.onSession!="function"?{result:!1,msg:"Initialization 'onSession' parameter must be of type 'function'"}:typeof s.onSessionClose!="function"?{result:!1,msg:"Initialization 'onSessionClose' parameter must be of type 'function'"}:typeof s.isAllowSubscribeRetry<"u"&&typeof s.isAllowSubscribeRetry!="boolean"?{result:!1,msg:"Initialization 'isAllowSubscribeRetry' parameter must be of type 'boolean'"}:typeof s.isAllowPublishRetry<"u"&&typeof s.isAllowPublishRetry!="boolean"?{result:!1,msg:"Initialization 'isAllowPublishRetry' parameter must be of type 'boolean'"}:typeof s.isOffCameraWhenVideoDisable<"u"&&typeof s.isOffCameraWhenVideoDisable!="boolean"?{result:!1,msg:"Initialization 'isOffCameraWhenVideoDisable' parameter must be of type 'boolean'"}:typeof s.joinType<"u"&&!Ie(s.joinType)?{result:!1,msg:"Initialization 'joinType' parameter must be of type correct type"}:typeof s.isAllowDemotionGetStream<"u"&&typeof s.isAllowDemotionGetStream!="boolean"?{result:!1,msg:"Initialization 'isAllowDemotionGetStream' parameter must be of type 'boolean'"}:typeof s.lang<"u"&&!Ce(s.lang)?{result:!1,msg:"Initialization 'lang' parameter must be of type correct type"}:typeof s.logOutputLevel<"u"&&!Re(s.logOutputLevel)?{result:!1,msg:"Initialization 'logOutputLevel' parameter must be of type correct type"}:{result:!0}},j=s=>{if(!s)return{result:!1,msg:"missing parameter -> listener"};if(typeof s!="object")return{result:!1,msg:"listener must be an object"};const e=["onRinging","onAccept","onHungup","onTrackReady"],t=Object.keys(s),i=[];return e.forEach(n=>{t.includes(n)||i.push(n)}),i.length?{result:!1,msg:`missing parameter -> "${i.join(",")}"`}:typeof s.onRinging!="function"?{result:!1,msg:"'onRinging' parameter must be of type 'function'"}:typeof s.onAccept!="function"?{result:!1,msg:"'onAccept' parameter must be of type 'function'"}:typeof s.onHungup!="function"?{result:!1,msg:"'onHungup' parameter must be of type 'function'"}:typeof s.onTrackReady!="function"?{result:!1,msg:"'onTrackReady' parameter must be of type 'function'"}:{result:!0}},te=s=>s&&typeof s=="string"?{result:!0}:{result:!1,msg:"'targetId' parameter is required, must be of type 'string'"},se=s=>s===y.AUDIO||s===y.AUDIO_VIDEO?{result:!0}:{result:!1,msg:"'mediaType' parameter is required, must be of type 'RCCallMediaType'"},z=s=>typeof s=="string"?{result:!0}:{result:!1,msg:"'extra' parameter must be of type 'string'"},J=s=>{const e=["pushTitle","pushContent","pushData","iOSConfig","androidConfig","disablePushTitle","templateId"];if(!Object.keys(s).every(a=>e.includes(a)))return{code:l.PARAM_ERROR,errorMsg:`right key: ${e.join(",")}`};for(let a=0;a<e.length;a++){const h=e[a];if(h==="disablePushTitle"){if(!C.isUndefined(s[h])&&!C.isBoolean(s[h]))return{code:l.PARAM_ERROR,errorMsg:`${h} type is boolean`}}else if((h==="pushTitle"||h==="templateId")&&s[h]&&!C.isString(s[h]))return{code:l.PARAM_ERROR,errorMsg:`${h} type is string`}}const{iOSConfig:i,androidConfig:n}=s,o=Te(i||{});if(o.code!==l.SUCCESS)return o;const r=me(n||{});return r.code!==l.SUCCESS?r:{code:l.SUCCESS}},Te=s=>{const{threadId:e,richMediaUri:t}=s||{};return e&&!C.isString(e)?{code:l.PARAM_ERROR,errorMsg:"iOSConfig.threadId type is string"}:t&&!C.isString(t)?{code:l.PARAM_ERROR,errorMsg:"iOSConfig.richMediaUri type is string"}:{code:l.SUCCESS}},me=s=>{const e=["notificationId","channelIdMi","miLargeIconUrl","channelIdHW","categoryHW","importanceHW","imageUrlHW","channelIdOPPO","typeVivo","categoryVivo","fcmChannelId","fcmCollapseKey","fcmImageUrl","importanceHonor","imageUrlHonor"];if(!Object.keys(s).every(i=>e.includes(i)))return{code:l.PARAM_ERROR,errorMsg:`right key: ${e.join(",")}`};for(let i=0;i<e.length;i++){const n=e[i];if(n==="importanceHW"||n==="importanceHonor"){if(s[n]&&s[n]!=="LOW"&&s[n]!=="NORMAL")return{code:l.PARAM_ERROR,errorMsg:`androidConfig.${n} value is NORMAL|LOW`}}else if(s[n]&&!C.isString(s[n]))return{code:l.PARAM_ERROR,errorMsg:`androidConfig.${n} type is string`}}return{code:l.SUCCESS}},ie=s=>Array.isArray(s)?s.length?s.every(e=>typeof e=="string"&&e.length>0)?{result:!0}:{result:!1,msg:"'userIds' parameter is required"}:{result:!1,msg:"'userIds' parameter is required, must be of type 'string[]'"}:{result:!1,msg:"'userIds' parameter is required, must be of type 'string[]'"};function Se(s){return["FPS_10","FPS_15","FPS_24","FPS_30"].includes(s)}const pe=s=>!!T.RCResolution[s],Oe=s=>s&&s.audio&&typeof s.audio.micphoneId<"u"&&typeof s.audio.micphoneId!="string"?{result:!1,msg:"'constraints.audio.micphoneId' must be of type 'string'"}:s&&s.audio&&typeof s.audio.sampleRate<"u"&&typeof s.audio.sampleRate!="number"?{result:!1,msg:"'constraints.audio.sampleRate' must be of type 'number'"}:s&&s.video&&typeof s.video.cameraId<"u"&&typeof s.video.cameraId!="string"?{result:!1,msg:"'constraints.video.cameraId' must be of type 'string'"}:s&&s.video&&typeof s.video.frameRate<"u"&&typeof s.video.frameRate!="string"?{result:!1,msg:"'constraints.video.frameRate' must be of type 'string'"}:s&&s.video&&typeof s.video.frameRate<"u"&&!Se(s.video.frameRate)?{result:!1,msg:"'frameRate' value is out of range"}:s&&s.video&&typeof s.video.resolution<"u"&&typeof s.video.resolution!="string"?{result:!1,msg:"'constraints.video.frameRate' must be of type 'string'"}:s&&s.video&&typeof s.video.resolution<"u"&&!pe(s.video.resolution)?{result:!1,msg:"'resolution' value is out of range"}:s&&s.video&&(!s.video.frameRate||!s.video.resolution)?{result:!1,msg:"'resolution' and 'resolution' is required"}:{result:!0},ye=(s,e)=>setTimeout(s,e);class Me{constructor(e,t){f(this,"_timerId",0);f(this,"_startTime",0);e&&(this._timerId=ye(()=>{e()},t)),this._startTime=Date.now()}stop(){clearTimeout(this._timerId);const e=Date.now();let t=e-this._startTime;return this._startTime===0&&(t=0),{startTime:this._startTime,endTime:e,duration:t}}reset(){this._startTime=0}}class W{constructor(e,t,i,n={}){f(this,"_room");f(this,"_listener",null);f(this,"_RETRYCOUNT",2);f(this,"joinRoomTimer",null);this._stateMachine=e,this._rtcClient=t,this._logger=i,this._options=n,this._stateMachine.registerEventListener({onUserStateChange:({user:o,reason:r})=>{this._logger.info("_",`[RCCallSession onUserStateChange] userId->${o==null?void 0:o.userId} state->${o==null?void 0:o.state} reason->${r}`)},onStateChange:async o=>{const{state:r,reason:a}=o;if(this._logger.info("_",`[RCCallSession onStateChange] : state->${r} reason->${a}`),r===p.KEEPING){const h=this._stateMachine.getCallId();this._logger.info("_",`[RCCallSession onStateChange] roomId: ${h}`);try{await this._joinRoom(h)}catch(c){this._exceptionClose(d.NETWORK_ERROR),this._logger.error("_",`[RCCallSession onStateChange] joinRoom throw exception roomId -> ${h}`),console.error(c)}}else if(r===p.END){if(!this._room){this._options.localTracks&&this._destroyTracks(this._options.localTracks);const h=this._stateMachine.getSummary();B.emit("sessionClose",{session:this,summaryInfo:h});return}this._options.localTracks&&this._destroyTracks(this._options.localTracks),this._logger.info("_","[RCCallSession onStateChange] localTracks destroyed"),this._leaveRoom(),this._room=null}},onRinging:o=>{this._logger.info("_",`[RCCallSession onRinging]sender: sender.userId -> ${o.userId}`);try{this._listener.onRinging(o,this)}catch(r){this._logger.error("_","[RCCallSession onRinging] method exception -> onRinging"),console.error(r)}},onAccept:o=>{this._logger.info("_",`[RCCallSession onAccept]sender: sender.userId -> ${o.userId}`);try{this._listener.onAccept(o,this)}catch(r){this._logger.error("_","[RCCallSession onAccept] method exception -> onAccept"),console.error(r)}},onHungup:(o,r)=>{this._logger.info("_",`[RCCallSession onHungup]sender: sender.userId -> ${o.userId} reason->${r}`);try{this._listener.onHungup(o,r,this)}catch(a){this._logger.error("_","[RCCallSession onHungup] method exception -> onHungup"),console.error(a)}},onMemberModify:({sender:o,invitedUsers:r})=>{this._logger.info("_",`[RCCallSession onMemberModify] sender.userId -> ${o.userId}`);try{this._listener.onMemberModify(o,r,this)}catch(a){this._logger.error("_","[RCCallSession onMemberModify] method exception -> onMemberModify"),console.error(a)}},onMediaModify:({sender:o,mediaType:r})=>{this._logger.info("_",`[RCCallSession onMediaModify]sender: sender.userId -> ${o.userId} mediaType: ${r}`),r===y.AUDIO&&this._setMediaTypeToAudio();try{this._listener.onMediaModify(o,r,this)}catch(a){this._logger.error("_","[RCCallSession onMediaModify] method exception -> onMediaModify"),console.error(a)}},crossAppkey:o=>{this._logger.info("_",`[RCCallSession crossAppkey] 是否跨 appkey: ${o}`),this._options.isCrossAppkey=o}}),this._stateMachine.setHungupPushConfig(this._options.hungupPushConfig||{pushTitle:"",pushContent:""})}async _joinRoom(e){let t;try{this._options.isCrossAppkey?t=await this._rtcClient.joinCrossRTCRoom(e,this._options.joinType):t=await this._rtcClient.joinRTCRoom(e,this._options.joinType);const{code:i,userIds:n,room:o}=t;if(i!==T.RCRTCCode.SUCCESS)return i===T.RCRTCCode.NOT_OPEN_VIDEO_AUDIO_SERVER&&this._exceptionClose(d.SERVICE_NOT_OPENED),i===T.RCRTCCode.SIGNAL_JOIN_RTC_ROOM_REFUSED?this._exceptionClose(d.OTHER_CLIENT_IN_CALL):this._exceptionClose(d.NETWORK_ERROR),this._logger.info("_",`[RCCallClient _joinRoom] join room failed: roomId -> ${e} RCRTCCode -> ${i}`),{code:l.JOIN_ROOM_ERROR};if(this._stateMachine.getConversationType()===C.ConversationType.GROUP&&this._stateMachine.userJoin([this._rtcClient.getCurrentId()]),this._stateMachine.getState()===p.END)return await this._rtcClient.leaveRoom(o),this._room=null,{code:l.SUCCESS};n.length<1&&(this.joinRoomTimer=new Me(()=>{this._exceptionClose(d.REMOTE_NETWORK_ERROR)},6e4)),this._room=o}catch(i){return this._exceptionClose(d.NETWORK_ERROR),this._logger.error("_",`[RCCallSession _joinRoom] _rtcClient.joinRTCRoom throw exception roomId -> ${e}`),console.error(i),{code:l.JOIN_ROOM_ERROR}}this._registerRoomEventListener(),this._registerReportListener();try{await this._subscribeInRoomRemoteTrack()}catch(i){return this._exceptionClose(d.SUBSCRIBE_ERROR),this._logger.error("_",`[RCCallSession _joinRoom] _subscribeInRoomRemoteTrack Exception roomId -> ${e}`),console.error(i),{code:l.JOIN_ROOM_ERROR}}try{await this._publish()}catch(i){return this._exceptionClose(d.PUBLISH_ERROR),this._logger.error("_",`[RCCallSession _joinRoom] _publish Exception roomId -> ${e}`),console.error(i),{code:l.JOIN_ROOM_ERROR}}return{code:l.SUCCESS}}async _subscribeInRoomRemoteTrack(){const e=this._room.getRemoteTracks();if(e.length){const{code:t}=await this._subscribeRetry(e,this._options.isAllowSubscribeRetry,this._RETRYCOUNT);t!==T.RCRTCCode.SUCCESS&&(this._exceptionClose(d.SUBSCRIBE_ERROR),this._logger.error("_",`[RCCallSession _subscribeInRoomRemoteTrack] Resource subscription failed roomId -> ${this._stateMachine.getCallId()} RTC code -> ${t}`))}}async _subscribeRetry(e,t=!1,i=0){const{code:n}=await this._room.subscribe(e);if(n!==T.RCRTCCode.SUCCESS){try{this._listener.onTrackSubscribeFail&&this._listener.onTrackSubscribeFail(n,this)}catch(o){this._logger.error("_","[RCCallSession] _listener.onTrackSubscribeFail exception"),console.error(o)}if(!t)return{code:n};if(i>0)return i--,this._subscribeRetry(e,t,i)}return{code:n}}async _publish(){const e=this._options.localTracks,{code:t}=await this._publishRetry(e,this._options.isAllowPublishRetry,this._RETRYCOUNT);if(t!==T.RCRTCCode.SUCCESS){this._exceptionClose(d.PUBLISH_ERROR),this._logger.info("_",`[RCCallSession _publist] Resource publishing failed: roomId -> ${this._stateMachine.getCallId()} RCRTCCode -> ${t}`);return}this._options.produceType===x.CALLEE&&this._notifyTrackReady(e)}async _publishRetry(e,t=!1,i=0){const{code:n}=await this._room.publish(e);if(n!==T.RCRTCCode.SUCCESS){try{this._listener.onTrackPublishFail&&this._listener.onTrackPublishFail(n,this)}catch(o){this._logger.error("_","[RCCallSession] _listener.onTrackPublishFail exception"),console.error(o)}if(!t)return{code:n};if(i>0)return i--,this._publishRetry(e,t,i)}return{code:n}}async _leaveRoom(){try{const e=await this._rtcClient.leaveRoom(this._room);this._logger.info("_",`[RCCallSession _leaveRoom] Successfully exited the room code: ${e.code}`)}catch(e){this._logger.error("_","[RCCallSession _leaveRoom] leaveRoom throw exception"),console.error(e)}finally{const e=this._stateMachine.getSummary();B.emit("sessionClose",{session:this,summaryInfo:e})}}_exceptionClose(e){this._options.localTracks&&this._destroyTracks(this._options.localTracks),this._stateMachine.close(e)}registerSessionListener(e){const t=j(e);if(!t.result)throw new Error(`[RCCallSession registerSessionListener] ${t.msg}`);this._listener={...e}}async _getLocalTrackCore(e,t){if(e===y.AUDIO){const{code:o,track:r}=await this._rtcClient.createMicrophoneAudioTrack("RongCloudRTC",t&&t.audio&&{...t.audio});return o!==T.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallSession _getLocalTrackCore] get Audio local tracks failed RCT code -> ${o}`),{code:l.GET_LOCAL_AUDIO_TRACK_ERROR}):(this._logger.info("_","[RCCallSession _getLocalTrackCore] successfully get Audio local tracks"),{code:l.SUCCESS,tracks:[r]})}const{code:i,tracks:n}=await this._rtcClient.createMicrophoneAndCameraTracks("RongCloudRTC",t&&{...t});return i!==T.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallSession _getLocalTrackCore] get Audio and Video local tracks failed RCT code -> ${i}`),{code:l.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR}):(this._logger.info("_","[RCCallSession _getLocalTrackCore] successfully get audio and video local tracks"),{code:l.SUCCESS,tracks:n})}async _getLocalTrack(e,t){if(this._options.isAllowDemotionGetStream&&e===y.AUDIO_VIDEO){const{code:o,tracks:r}=await this._getLocalTrackCore(y.AUDIO_VIDEO,t);if(o!==l.SUCCESS){const{code:a,tracks:h}=await this._getLocalTrackCore(y.AUDIO,t);return a!==l.SUCCESS?(this._exceptionClose(d.GET_MEDIA_RESOURCES_ERROR),{code:a}):{code:a,tracks:h}}return{code:o,tracks:r}}const{code:i,tracks:n}=await this._getLocalTrackCore(e,t);return i!==l.SUCCESS?(this._exceptionClose(d.GET_MEDIA_RESOURCES_ERROR),{code:i}):{code:i,tracks:n}}async changeAudioDevice(e){const t=[],i=[],{code:n,track:o}=await this._rtcClient.createMicrophoneAudioTrack("RongCloudRTC",e);if(n!==T.RCRTCCode.SUCCESS)return this._logger.error("_",`[RCCallSession changeDevice] get local Audio tracks failed RCTLib code -> ${n}`),{code:l.GET_LOCAL_AUDIO_TRACK_ERROR};if(this._options.localTracks&&this._options.localTracks.forEach(r=>{r.isAudioTrack()||i.push(r)}),t.push(o),i.push(o),this._options.localTracks=i,this._notifyTrackReady(t),this._room){const{code:r}=await this._room.publish(t);if(r!==T.RCRTCCode.SUCCESS)return{code:l.AUDIO_PUBLISH_ERROR}}return{code:l.SUCCESS}}async invite(e,t={}){const{extra:i=""}=t,n=this._options.callPushConfig?this._options.callPushConfig:t.pushConfig,o=[ie(e),z(i)];if(n){const{code:c,errorMsg:_}=J(n);if(c!==l.SUCCESS)return this._logger.error("_",`[RCCallSession invite] param error, errorMsg: ${_}`),{code:c}}const r=[];if(!o.every(c=>(!c.result&&r.push(c.msg),c.result)))throw new Error(`[RCCallClient invite] ${r.join(`
2
- `)}`);const{code:h}=await this._stateMachine.invite(e,{extra:i,pushConfig:n});return{code:h}}async accept(e){const t=Oe(e);if(!t.result)throw new Error(`[RCCallSession accept] ${t.msg}`);B.emit("hungupOtherSession",{session:this});const i=this._stateMachine.getMediaType(),{code:n,tracks:o}=await this._getLocalTrack(i,e);if(n!==l.SUCCESS)return{code:n};this._options.localTracks=o;const{code:r}=await this._stateMachine.accept();return r!==l.SUCCESS?(this._logger.error("_",`[RCCallSession accept]Send accept message failed -> code: ${r}`),{code:r}):{code:r}}async hungup(){return this._stateMachine.hungup()}async _changeMediaType(e){const{code:t}=await this._stateMachine.changeMediaType(e);return t!==l.SUCCESS&&this._logger.error("_",`[RCCallSession _changeMediaType] change media type fail code-> ${t}`),{code:t}}_getLocalVideoTracks(){let e=[];return this._room&&this._options.localTracks&&(e=this._options.localTracks.filter(t=>t.isVideoTrack())),e}_getLocalAudioTracks(){let e=[];return this._room&&this._options.localTracks&&(e=this._options.localTracks.filter(t=>t.isAudioTrack())),e}async _setMediaTypeToAudioAndVideo(){const{code:e,track:t}=await this._rtcClient.createCameraVideoTrack();if(e!==T.RCRTCCode.SUCCESS)return{code:l.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR};const{code:i}=await this._room.publish([t]);if(i!==T.RCRTCCode.SUCCESS){this._logger.error("_",`[RCCallSession _enableVideo] Resource publishing failed: RCRTCCode -> ${e}`);return}this._notifyTrackReady([t]),this._changeMediaType(y.AUDIO_VIDEO)}async _setMediaTypeToAudio(){const e=this._getLocalVideoTracks();if(e.length){e.forEach(i=>{i.mute()});const{code:t}=await this._room.unpublish(e);t!==T.RCRTCCode.SUCCESS&&this._logger.error("_",`[RCCallSession disableVideo] unpublish failed -> ${t}`),this._destroyTracks(e)}}async descendAbility(){const{code:e}=await this._changeMediaType(y.AUDIO);return e===l.SUCCESS&&this._setMediaTypeToAudio(),{code:e}}async disableVideoTrack(){if(!this._room)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${l.NOT_IN_ROOM_ERROR}`),{code:l.NOT_IN_ROOM_ERROR};const e=this._getLocalVideoTracks();if(!e.length)return this._logger.error("_",`[RCCallSession disableVideoTrack] Room missing video track -> ${l.MISSING_VIDEO_TRACK_ERROR}`),{code:l.MISSING_VIDEO_TRACK_ERROR};if(e.forEach(i=>{i.mute()}),!this._options.isOffCameraWhenVideoDisable)return{code:l.SUCCESS};const{code:t}=await this._room.unpublish(e);return t!==T.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallSession disableVideo] unpublish failed -> ${t}`),{code:l.UNPUBLISH_VIDEO_ERROR}):(e.forEach(i=>{i.destroy()}),{code:l.SUCCESS})}async enableVideoTrack(){if(!this._room)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${l.NOT_IN_ROOM_ERROR}`),{code:l.NOT_IN_ROOM_ERROR};if(!this._options.isOffCameraWhenVideoDisable){const o=this._getLocalVideoTracks();return o.length?(o.forEach(r=>{r.unmute()}),{code:l.SUCCESS}):(this._logger.error("_",`[RCCallSession EnableVideoTrack] Room missing video track -> ${l.MISSING_VIDEO_TRACK_ERROR}`),{code:l.MISSING_VIDEO_TRACK_ERROR})}const{code:e,track:t}=await this._rtcClient.createCameraVideoTrack();if(e!==T.RCRTCCode.SUCCESS)return this._logger.error("_",`[RCCallSession EnableVideoTrack] Get Resource failed: RCRTCCode -> ${e}`),{code:l.GET_LOCAL_VIDEO_TRACK_ERROR};const i=[];this._options.localTracks&&this._options.localTracks.forEach(o=>{o.isVideoTrack()?o.destroy():i.push(o)}),i.push(t),this._options.localTracks=i,t.mute();const{code:n}=await this._room.publish([t]);return n!==T.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallSession EnableVideoTrack] Resource publishing failed: RCRTCCode -> ${e}`),{code:l.VIDEO_PUBLISH_ERROR}):(t.unmute(),this._notifyTrackReady([t]),{code:l.SUCCESS})}async disableAudioTrack(){if(!this._room)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${l.NOT_IN_ROOM_ERROR}`),{code:l.NOT_IN_ROOM_ERROR};this._getLocalAudioTracks().forEach(t=>{t.mute()})}async enableAudioTrack(){if(!this._room)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${l.NOT_IN_ROOM_ERROR}`),{code:l.NOT_IN_ROOM_ERROR};const e=this._getLocalAudioTracks();if(!e.length)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${l.MISSING_VIDEO_TRACK_ERROR}`),{code:l.MISSING_VIDEO_TRACK_ERROR};e.forEach(t=>{t.unmute()})}_destroyTracks(e){e.forEach(t=>{t.destroy()})}_notifyTrackReady(e){e.forEach(t=>{try{this._listener.onTrackReady(t,this)}catch(i){this._logger.error("_","[RCCallSession _notifyTrackReady] _listener onTrackReady exception"),console.error(i)}})}_registerRoomEventListener(){this._room.registerRoomEventListener({onKickOff:(e,t)=>{const i=this._rtcClient.getCurrentId();this._stateMachine.userLeave([i]),e?(t===T.RCKickReason.SERVER_KICK&&this._exceptionClose(d.KICKED_BY_SERVER),t===T.RCKickReason.OTHER_KICK&&this._exceptionClose(d.OTHER_CLIENT_JOINED_CALL)):this._exceptionClose(d.NETWORK_ERROR)},onMessageReceive(e,t,i,n){},onRoomAttributeChange(e,t){},onAudioMuteChange:e=>{this._logger.info("_",`[RCCallSession onAudioMuteChange] userId->${e.getUserId()} muted -> ${e.isOwnerMuted()}`);const t={userId:e.getUserId(),muted:e.isOwnerMuted(),kind:"audio",trackId:e.getTrackId()};try{this._listener.onAudioMuteChange(t,this)}catch(i){this._logger.error("_","[RCCallSession onAudioMuteChange] Missing listening method -> onTrackMuteChange"),console.error(i)}},onVideoMuteChange:e=>{this._logger.info("_",`[RCCallSession onVideoMuteChange]userId->${e.getUserId()} muted -> ${e.isOwnerMuted()}`);const t={userId:e.getUserId(),muted:e.isOwnerMuted(),kind:"video",trackId:e.getTrackId()};try{this._listener.onVideoMuteChange(t,this)}catch(i){this._logger.error("_","[RCCallSession onVideoMuteChange] Missing listening method -> onVideoMuteChange"),console.error(i)}},onTrackPublish:async e=>{if(this._room){const{code:t}=await this._room.subscribe(e);t!==T.RCRTCCode.SUCCESS&&this._logger.error("_",`[RCCallSession onTrackPublish] subscribe failed RTCCode ->${t}`)}},onTrackUnpublish:e=>{},onTrackReady:e=>{this._stateMachine.getMediaType()===y.AUDIO&&e.isVideoTrack()||this._notifyTrackReady([e])},onUserJoin:e=>{this.joinRoomTimer&&this.joinRoomTimer.stop(),this._stateMachine.userJoin(e)},onUserLeave:e=>{this._logger.info("_",`[RCCallSession onUserLeave] listening onUserLeave userIds -> ${e==null?void 0:e.join(",")}`),this._stateMachine.userLeave(e)},onPing:e=>{this._logger.info("_",`[RCCallSession onPing]${e}`);try{this._listener.onPing&&this._listener.onPing(e,this)}catch(t){this._logger.error("_","[RCCallSession onPing] listening onPing exception"),console.error(t)}}})}_registerReportListener(){this._room.registerReportListener({onStateReport:e=>{try{this._listener.onRTCStateReport&&this._listener.onRTCStateReport(e,this)}catch(t){this._logger.error("_","[RCCallSession onStateReport] listener onStateReport exception"),console.error(t)}},onICEConnectionStateChange:e=>{try{this._listener.onICEConnectionStateChange&&this._listener.onICEConnectionStateChange(e,this)}catch(t){this._logger.error("_","[RCCallSession onICEConnectionStateChange] onICEConnectionStateChange exception"),console.error(t)}}})}getSessionId(){return this._stateMachine.getCallId()}getRTCSessionId(){return this._room?this._room.getSessionId():null}getTargetId(){return this._stateMachine.getTargetId()}getConversationType(){return this._stateMachine.getConversationType()}getChannelId(){return this._stateMachine.getChannelId()}getRemoteUsers(){return this._stateMachine.getRemoteUsers()}getUsers(){return this._stateMachine.getRemoteUsers()}getUserState(e){if(!e||typeof e!="string")throw new Error("userId is required, must be of type 'string'");return this._stateMachine.getUserState(e)}getState(){return this._stateMachine.getState()}getCallerId(){return this._stateMachine.getCallerId()}getMediaType(){return this._stateMachine.getMediaType()}}class ne{constructor(e,t,i,n){f(this,"_rtcClient");f(this,"_callEngine");f(this,"_options");f(this,"_sessionList",[]);f(this,"_callPushConfig");f(this,"_hungupPushConfig");this._context=e,this._runtime=t,this._logger=i,this._rtcClient=n.rtcClient,this._options={isAllowPublishRetry:!1,isAllowSubscribeRetry:!1,isOffCameraWhenVideoDisable:!0,joinType:C.RTCJoinType.COEXIST,isAllowDemotionGetStream:!1,lang:P.ZH,...n},this._callEngine=new ue(this._context,t,this._logger,{onInvite:this._onInvite.bind(this),onOfflineRecord:this._onOfflineRecord.bind(this)},{lang:this._options.lang||P.ZH}),B.on("sessionClose",({session:o,summaryInfo:r})=>{this._removeSession(o);try{this._options.onSessionClose(o,r)}catch(a){this._logger.error("_","[RCCCallClient] options.onSessionClose exception"),console.log(a)}}),B.on("hungupOtherSession",({session:o})=>{const r=o.getSessionId();this._logger.info("_",`[RCCallClient hungupOtherSession] sessionId ready to accept -> ${r}`),this._logger.info("_",`[RCCallClient hungupOtherSession] sessionList ->${this._sessionList.map(h=>h.getSessionId()).join(",")}`);let a=0;for(;this._sessionList.length>1;)this._sessionList[a].getSessionId()!==r?(this._sessionList[a].hungup(),this._sessionList.splice(a,1)):a++;this._logger.info("_",`[RCCallClient hungupOtherSession] current sessionList length ->${this._sessionList.length}`)})}_onInvite(e,t){this._logger.info("_","[RCCallClient _onInvite] Received invite message");const i=new W(e,this._rtcClient,this._logger,{isAllowSubscribeRetry:this._options.isAllowSubscribeRetry,isAllowPublishRetry:this._options.isAllowPublishRetry,isOffCameraWhenVideoDisable:this._options.isOffCameraWhenVideoDisable,joinType:this._options.joinType,isAllowDemotionGetStream:this._options.isAllowDemotionGetStream,produceType:x.CALLEE,callPushConfig:this._callPushConfig,hungupPushConfig:this._hungupPushConfig});this._logger.info("_","[RCCallClient _onInvite] Received invite message, successfully created session"),this._sessionList.push(i);try{this._options.onSession(i,t)}catch(n){this._logger.error("_","[RCCallClient _options.onSession] onSession exception"),console.log(n)}if(i._listener){const n=j(i._listener);if(!n.result)throw new Error(n.msg)}else throw this._logger.error("_","[RCCallClient _options.onSession] session Must Have Listener"),new Error("[RCCallSession _options.onSession] session Must Have Listener")}_onOfflineRecord(e){try{this._options.onOfflineRecord&&this._options.onOfflineRecord(e)}catch(t){this._logger.error("_","[RCCallClient _options.onOfflineRecord] onOfflineRecord exception"),console.log(t)}}registerUserInfo(e={}){this._callEngine.registerUserInfo(e),this._logger.info("_","[RCCallClient registerUserInfo] successfully register user info data")}async startCrossCall({targetId:e,mediaType:t=y.AUDIO,listener:i,constraints:n,channelId:o="",extra:r="",pushTitle:a="",pushContent:h="",bitrate:c}){return this.__call({targetId:e,mediaType:t,listener:i,constraints:n,channelId:o,extra:r,pushTitle:a,pushContent:h,bitrate:c,isCrossAppkey:!0})}async call({targetId:e,mediaType:t=y.AUDIO,listener:i,constraints:n,channelId:o="",extra:r="",pushTitle:a="",pushContent:h="",bitrate:c}){return this.__call({targetId:e,mediaType:t,listener:i,constraints:n,channelId:o,extra:r,pushTitle:a,pushContent:h,bitrate:c})}async __call({targetId:e,mediaType:t=y.AUDIO,listener:i,constraints:n,channelId:o="",extra:r="",pushTitle:a="",pushContent:h="",bitrate:c,isCrossAppkey:_=!1}){const u=this._callPushConfig?this._callPushConfig:{pushTitle:a,pushContent:h};this._logger.info("_",`[RCCallClient call] extra->${r} pushConfig->${JSON.stringify(u)}`);const M=[te(e),se(t),j(i),z(r)],E=[];if(!M.every(I=>(!I.result&&E.push(I.msg),I.result)))throw new Error(`[RCCallClient call] ${E.join(`
3
- `)}`);const{code:N,errorMsg:L}=J(u);if(N!==l.SUCCESS)return this._logger.error("_",`[RCCallClient call] param error, errorMsg: ${L}`),{code:N};let S=[];const{code:A,tracks:U}=await this._getLocalTrack(t,n);if(A!==l.SUCCESS)return{code:A};S=U,S.forEach(I=>{var k,H,K;I.isAudioTrack()&&(c!=null&&c.audio)&&I.setBitrate(c==null?void 0:c.audio),I.isVideoTrack()&&(c!=null&&c.video)&&I.setBitrate((k=c==null?void 0:c.video)==null?void 0:k.max,(H=c==null?void 0:c.video)==null?void 0:H.min,(K=c==null?void 0:c.video)==null?void 0:K.start),i.onTrackReady(I)});const{code:v,stateMachine:D}=await this._callEngine.call(o,e,t,r,u,_);if(v===l.SUCCESS&&D){this._logger.info("_","[RCCallClient call] successfully created state machine");const I=new W(D,this._rtcClient,this._logger,{localTracks:S,isAllowSubscribeRetry:this._options.isAllowSubscribeRetry,isAllowPublishRetry:this._options.isAllowPublishRetry,isOffCameraWhenVideoDisable:this._options.isOffCameraWhenVideoDisable,joinType:this._options.joinType,isAllowDemotionGetStream:this._options.isAllowDemotionGetStream,produceType:x.CALLER,isCrossAppkey:_,callPushConfig:this._callPushConfig,hungupPushConfig:this._hungupPushConfig});return I.registerSessionListener(i),this._sessionList.push(I),this._logger.info("_",`[RCCallClient call] successfully created session object, sessionId: ${I.getSessionId()}`),{code:v,session:I}}return this._logger.error("_",`[RCCallClient call] call failed code ->: ${v}`),S.forEach(I=>{I.mute(),I.destroy()}),{code:v}}async callInGroup({targetId:e,userIds:t,mediaType:i=y.AUDIO,listener:n,constraints:o,channelId:r="",extra:a="",pushTitle:h="",pushContent:c="",bitrate:_}){const u=this._callPushConfig?this._callPushConfig:{pushTitle:h,pushContent:c},M=[te(e),ie(t),se(i),j(n),z(a)],E=[];if(!M.every(I=>(!I.result&&E.push(I.msg),I.result)))throw new Error(`[RCCallClient callInGroup] ${E.join(`
4
- `)}`);const{code:N,errorMsg:L}=J(u);if(N!==l.SUCCESS)return this._logger.error("_",`[RCCallClient call] param error, errorMsg: ${L}`),{code:N};let S=[];const{code:A,tracks:U}=await this._getLocalTrack(i,o);if(A!==l.SUCCESS)return{code:A};S=U,S.forEach(I=>{var k,H,K;I.isAudioTrack()&&(_!=null&&_.audio)&&I.setBitrate(_==null?void 0:_.audio),I.isVideoTrack()&&(_!=null&&_.video)&&I.setBitrate((k=_==null?void 0:_.video)==null?void 0:k.max,(H=_==null?void 0:_.video)==null?void 0:H.min,(K=_==null?void 0:_.video)==null?void 0:K.start),n.onTrackReady(I)});const{code:v,stateMachine:D}=await this._callEngine.callInGroup(r,e,i,t,a,u);if(v===l.SUCCESS&&D){this._logger.info("_","[RCCallClient callInGroup] successfully created state machine");const I=new W(D,this._rtcClient,this._logger,{localTracks:S,isAllowSubscribeRetry:this._options.isAllowSubscribeRetry,isAllowPublishRetry:this._options.isAllowPublishRetry,isOffCameraWhenVideoDisable:this._options.isOffCameraWhenVideoDisable,joinType:this._options.joinType,isAllowDemotionGetStream:this._options.isAllowDemotionGetStream,produceType:x.CALLER,callPushConfig:this._callPushConfig,hungupPushConfig:this._hungupPushConfig});return I.registerSessionListener(n),this._sessionList.push(I),this._logger.info("_",`[RCCallClient callInGroup] successfully created session object, sessionId: ${I.getSessionId()}`),{code:v,session:I}}return this._logger.info("_",`[RCCallClient callInGroup] callInGroup failed code -> ${v}`),S.forEach(I=>{I.mute(),I.destroy()}),{code:v}}async _getLocalTrackCore(e,t){if(e===y.AUDIO){const{code:o,track:r}=await this._rtcClient.createMicrophoneAudioTrack("RongCloudRTC",t&&t.audio&&{...t.audio});return o!==T.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallClient _getTrack] get Audio local tracks failed RCT code -> ${o}`),{code:l.GET_LOCAL_AUDIO_TRACK_ERROR}):(this._logger.info("_","[RCCallClient _getTrack] successfully get Audio local tracks"),{code:l.SUCCESS,tracks:[r]})}const{code:i,tracks:n}=await this._rtcClient.createMicrophoneAndCameraTracks("RongCloudRTC",t&&{...t});return i!==T.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallClient _getTrack] get Audio and Video local tracks failed RCT code -> ${i}`),{code:l.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR}):(this._logger.info("_","[RCCallClient _getTrack] successfully get audio and video local tracks"),{code:l.SUCCESS,tracks:n})}async _getLocalTrack(e,t){if(this._options.isAllowDemotionGetStream&&e===y.AUDIO_VIDEO){const{code:o,tracks:r}=await this._getLocalTrackCore(y.AUDIO_VIDEO,t);if(o!==l.SUCCESS){const{code:a,tracks:h}=await this._getLocalTrackCore(y.AUDIO,t);return a!==l.SUCCESS?{code:a}:{code:a,tracks:h}}return{code:o,tracks:r}}const{code:i,tracks:n}=await this._getLocalTrackCore(e,t);return i!==l.SUCCESS?{code:i}:{code:i,tracks:n}}_removeSession(e){const t=e.getSessionId();this._sessionList=this._sessionList.filter(i=>i.getSessionId()!==t)}async getJoinedRoomInfo(){const{code:e,data:t}=await this._context.getRTCJoinedUserInfo(this._context.getCurrentId());return e!==C.ErrorCode.SUCCESS?(this._logger.error("_",`getJoinedUserInfo error code: ${e}`),{code:l.QUERY_JOINED_USER_INFO_ERROR}):{code:l.SUCCESS,data:t}}setPushConfig(e,t){const i=[e,t].map(n=>J(n));for(const{code:n,errorMsg:o}of i)if(n!==l.SUCCESS)return this._logger.error("_",`[RCCallClient setPushConfig] param error, errorMsg: ${o}`),{code:n};this._callPushConfig=e,this._hungupPushConfig=t}}C.VersionManage.add("plugin-call","5.2.4");const Ne={tag:"RCCall",verify(s){return s.tag==="browser"},setup(s,e,t){const i=Ee(t);if(!i.result)throw new Error(`[RCCallLib installer steup]${i.msg}`);if(!C.VersionManage.validEngine("5.9.0"))throw new Error(`The current engine version '${C.VersionManage.getInfo().engine}' error, plugin-call required engine version at least '5.9.0'.`);const n=s.createLogger("RCCall","RTC");return t.logOutputLevel&&n.setOutputLevel(t.logOutputLevel),typeof t.logLevel<"u"&&n.warn("_","The 'logLevel' parameter is deprecated, please use 'logOutputLevel' instead."),n.warn("_","RCCall Version: 5.2.4, Commit: 0a7b424ef05373eeea5ff3c35af1286656a750fd"),new ne(s,e,n,t)}};O.RCCallClient=ne,O.RCCallEndReason=d,O.RCCallErrorCode=l,O.RCCallLanguage=P,O.RCCallMediaType=y,O.RCCallSession=W,O.RCCallSessionState=p,O.RCCallUserState=m,O.installer=Ne,Object.defineProperty(O,Symbol.toStringTag,{value:"Module"})});
5
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9lbmdpbmUvaGVscGVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvTXNnQ2FsbFN0YXR1cy50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbENvZGUudHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxFbmRSZWFzb24udHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ2FsbFVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1JDQ3Jvc3NDYWxsVHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL1RpbWVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvU3RhdGVNYWNoaW5lLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvUkNDYWxsTWVkaWFUeXBlLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvZW51bXMvTWVtYmVyTW9kaWZ5VHlwZS50cyIsIi4uLy4uLy4uL2VuZ2luZS9jb3JlL2VudW1zL1BsYXRmb3JtLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvT2ZmbGluZVJlY29yZGVyLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvTWVzc2FnZUhhbmRsZXIudHMiLCIuLi8uLi8uLi9lbmdpbmUvY29yZS9lbnVtcy9SQ0NhbGxMYW5nLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL2VuLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL3poLnRzIiwiLi4vLi4vLi4vZW5naW5lL2NvcmUvbG9jYWxlL2luZGV4LnRzIiwiLi4vLi4vLi4vZW5naW5lL2luZGV4LnRzIiwiLi4vLi4vLi4vc3JjL2VudW1zLnRzIiwiLi4vLi4vLi4vc3JjL3V0aWxzLnRzIiwiLi4vLi4vLi4vc3JjL2V2ZW50RW1pdHRlci50cyIsIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uLnRzIiwiLi4vLi4vLi4vc3JjL2hlbHBlci50cyIsIi4uLy4uLy4uL3NyYy90aW1lci50cyIsIi4uLy4uLy4uL3NyYy9SQ0NhbGxTZXNzaW9uLnRzIiwiLi4vLi4vLi4vc3JjL1JDQ2FsbENsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIElSdW50aW1lIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuXG5jb25zdCBzdHJpbmcxMHRvNjQgPSAobnVtYmVyOiBudW1iZXIpID0+IHtcbiAgY29uc3QgY2hhcnMgPSAnMDEyMzQ1Njc4OWFiY2RlZmdoaWdrbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJR0tMTU5PUFFSU1RVVldYWVorLycuc3BsaXQoJycpO1xuICBjb25zdCByYWRpeCA9IGNoYXJzLmxlbmd0aCArIDE7XG4gIGxldCBxdXRpZW50ID0gK251bWJlcjtcbiAgY29uc3QgYXJyID0gW107XG4gIGRvIHtcbiAgICBjb25zdCBtb2QgPSBxdXRpZW50ICUgcmFkaXg7XG4gICAgcXV0aWVudCA9IChxdXRpZW50IC0gbW9kKSAvIHJhZGl4O1xuICAgIGFyci51bnNoaWZ0KGNoYXJzW21vZF0pO1xuICB9IHdoaWxlIChxdXRpZW50KTtcbiAgcmV0dXJuIGFyci5qb2luKCcnKTtcbn07XG5cbmNvbnN0IGdldFVVSUQgPSAoKSA9PiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gIGNvbnN0IHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwO1xuICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcbiAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xufSk7XG5cbi8qIOiOt+WPliAyMiDkvY3nmoQgVVVJRCAqL1xuZXhwb3J0IGNvbnN0IGdldFVVSUQyMiA9ICgpID0+IHtcbiAgbGV0IHV1aWQ6IHN0cmluZyB8IG51bWJlciA9IGdldFVVSUQoKTtcbiAgdXVpZCA9IGAke3V1aWQucmVwbGFjZSgvLS9nLCAnJyl9MGA7XG4gIHV1aWQgPSBwYXJzZUludCh1dWlkLCAxNik7XG4gIHV1aWQgPSBzdHJpbmcxMHRvNjQodXVpZCk7XG4gIGlmICh1dWlkLmxlbmd0aCA+IDIyKSB7XG4gICAgdXVpZCA9IHV1aWQuc2xpY2UoMCwgMjIpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcblxuLyoqXG4gKiDnlJ/miJDpmo/mnLogaWQg5a2X56ym5LiyXG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVJhbmRvbUlkID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApO1xuICBsZXQgdXVpZCA9IGdldFVVSUQyMigpO1xuICB1dWlkID0gdXVpZC5yZXBsYWNlKC9cXC8vZywgJzAnKTtcbiAgY29uc3QgaW5mbyA9IFt1dWlkLCBEYXRlLm5vdygpLCByYW5kb21dO1xuICByZXR1cm4gaW5mby5qb2luKCdfJyk7XG59O1xuXG5leHBvcnQgY29uc3QgdGltZXJTZXRUaW1lb3V0ID0gKGZ1bmM6IEZ1bmN0aW9uLCB0aW1lb3V0OiBudW1iZXIpOiBudW1iZXIgPT4gc2V0VGltZW91dChmdW5jLCB0aW1lb3V0KSBhcyBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCB0aW1lckludGVydmFsID0gKGZ1bjogRnVuY3Rpb24sIGl0djogbnVtYmVyKTogbnVtYmVyID0+IHNldEludGVydmFsKGZ1biwgaXR2KSBhcyBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCBldmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbi8qKlxuICogY2FsbCBkZXZpY2VJZCDlrZjlgqjlnKggc2Vzc2lvblN0b3JhZ2Ug5LitXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDYWxsRGV2aWNlSWQgPSAocnVudGltZTogSVJ1bnRpbWUpID0+IHtcbiAgY29uc3Qga2V5ID0gJ1JDQ2FsbERldmljZUlkJztcbiAgbGV0IHV1aWQgPSBydW50aW1lLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgaWYgKCF1dWlkKSB7XG4gICAgdXVpZCA9IGdldFVVSUQyMigpO1xuICAgIHJ1bnRpbWUuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIHV1aWQpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcbiIsIi8qKlxuICog5rOo6YeKXG4gKiBUT0RPXG4gKi9cbmV4cG9ydCBlbnVtIE1zZ0NhbGxTdGF0dXMge1xuICBPVVRHT0lORyA9IDEsIC8vIHdhaXRpbmdcbiAgSU5DT01JTkcsIC8vIHdhaXRpbmdcbiAgUklOR0lORywgLy8gd2FpdGluZ1xuICBDT05ORUNURUQsIC8vIGtlZXBpbmdcbiAgSURMRSwgLy8gZW5kXG4gIEFDQ0VQVEVEIC8vIHdhaXRpbmdcbn1cbiIsIi8qKlxuICog6ZSZ6K+v56CB77yM5LiO56e75Yqo56uv5a+56b2QXG4gKiBAZGVzY3JpcHRpb25cbiAqIDEuIGA1MTAwMCAtIDUxOTk5YCDkuLogQW5kcm9pZCDkuJPnlKjmrrVcbiAqIDIuIGA1MjAwMCAtIDUyOTk5YCDkuLogaU9TIOS4k+eUqOautVxuICogMy4gYDUzMDAwIC0gNTMxOTlgIOS4uiBXZWIgUlRDIOS4k+eUqOautVxuICogNC4gYDUzMjAwIC0gNTM0OTlgIOS4uiBXZWIgQ2FsbExpYiDkuJPnlKjmrrVcbiAqICogIGA1MzIwMCAtIDUzMjk5YCDkuLogV2ViIENhbGxFbmdpbmUg5LiT55So56uvXG4gKiAqICBgNTMzMDAgLSA1MzQ5OWAg5Li6IFdlYiBDYWxsIOS4k+eUqOerr1xuICogNS4gYDUzNTAwIC0gNTM5OTlgIOS4uiBXZWIg5L+d55WZ5q61XG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbEVycm9yQ29kZSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1MgPSAxMDAwMCxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+adn+eahOeKtuaAgeaculxuICAgKi9cbiAgU1RBVEVfTUFDSElORV9FWElUID0gNTMyMDAsXG4gIC8qKlxuICAgKiDlj5HpgIEgSU0g5raI5oGv5aSx6LSlXG4gICAqL1xuICBTRU5EX01TR19FUlJPUiA9IDUzMjAxLFxuICAvKipcbiAgICog6KKr5a+55pa55Yqg5YWl6buR5ZCN5Y2VXG4gICAqL1xuICBSRUpFQ1RFRF9CWV9CTEFDS0xJU1QgPSA1MzIwMixcbiAgLyoqXG4gICAqIOW9k+WJjeeUqOaIt+S4jeWGjee+pOe7hOS4rVxuICAgKi9cbiAgTk9UX0lOX0dST1VQID0gNTMyMDMsXG5cbiAgLyoqXG4gICAqIENhbGwg55u45YWzXG4gICAqL1xuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfQVVESU9fVFJBQ0tfRVJST1IgPSA1MzMwMSxcblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6KeG6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfVklERU9fVFJBQ0tfRVJST1IgPSA1MzMwMixcblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6Z+z6KeG6aKR5rWB5aSx6LSlXG4gICAqL1xuICBHRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SID0gNTMzMDMsXG5cbiAgLyoqXG4gICAqIOWKoOWFpeaIv+mXtOWksei0pVxuICAgKi9cbiAgSk9JTl9ST09NX0VSUk9SID0gNTMzMDQsXG5cbiAgLyoqXG4gICAqIOWPkeW4g+mfs+mikeWksei0pVxuICAgKi9cbiAgQVVESU9fUFVCTElTSF9FUlJPUiA9IDUzMzA1LFxuXG4gIC8qKlxuICAgKiDlj5HluIPop4bpopHlpLHotKVcbiAgICovXG4gIFZJREVPX1BVQkxJU0hfRVJST1IgPSA1MzMwNixcblxuICAvKipcbiAgICog5Y+R5biD6Z+z6KeG6aKR5aSx6LSlXG4gICAqL1xuICBBVURJT19BTkRfVklERU9fUFVCTElTSF9FUlJPUiA9IDUzMzA3LFxuXG4gIC8qKlxuICAgKiDmn6Xor6LmiL/pl7TnlKjmiLfkv6Hmga/lpLHotKVcbiAgICovXG4gIFFVRVJZX0pPSU5FRF9VU0VSX0lORk9fRVJST1IgPSA1MzMwOCxcblxuICAvKipcbiAgICog56aB55So5ZCv55So6KeG6aKR5pe277yM5oi/6Ze05YaF57y65bCR6KeG6aKR5rWBXG4gICAqL1xuICBNSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SID0gNTMzMDksXG5cbiAgLyoqXG4gICAqIOWPlua2iOWPkeW4g+inhumikeWksei0pVxuICAgKi9cbiAgVU5QVUJMSVNIX1ZJREVPX0VSUk9SID0gNTMzMTAsXG5cbiAgLyoqXG4gICAqIOS8muivneS4jeaYr+e+pOe7hFxuICAgKi9cbiAgQ09OVkVSU0FUSU9OX05PVF9HUk9VUF9FUlJPUiA9IDUzMzExLFxuXG4gIC8qKlxuICAqIOS4jeWcqHJvb23kuK3npoHnlKjpn7Pop4bpopFcbiAgKi9cbiAgTk9UX0lOX1JPT01fRVJST1IgPSA1MzMxMixcblxuICAvKipcbiAgICog5Y+C5pWw6ZSZ6K+vXG4gICAqL1xuICBQQVJBTV9FUlJPUiA9IDUzMzEzXG59XG4iLCIvKipcbiAqIOaMguaWreWOn+WboFxuICogQGRlc2NyaXB0aW9uXG4gKiDmoLnmja7ljp/mnIkgSGFuZ3VwUmVhc29uIOiuvuiuoe+8jOW3seaWueWOn+WboOS4juWvueaWueWOn+WboOacieebuOW3riAxMCDnmoTlt67ot50uXG4gKiDnjrDmnInmnKzlnLDljp/lm6Dlj5blgLzojIPlm7Q6IDEgfiAxMCwg6L+c56uv5Y6f5Zug5Y+W5YC86IyD5Zu0OiAxMSB+IDIwLlxuICog5Li65L6/5LqOIEhhbmd1cFJlYXNvbiDmianlsZXvvIzkv53nlZkgMTAwIOS7peWGheeahOWPluWAvC5cbiAqIOmcgOimgeWGjeasoeaJqeWxleaXtu+8jOW3seaWueWOn+WboOS9v+eUqDogMjEgfiAzMCwg5a+55bqU5a+55pa55Y6f5Zug5L2/55SoOiAzMSB+IDQwLFxuICog5Lul5q2k57G75o6o77yMXG4gKiDlt7Hmlrnljp/lm6Dkvb/nlKg6IDQxIH4gNTAsIOWvueaWueWOn+WboOS9v+eUqDogNTEgfiA2MCxcbiAqIOW3seaWueWOn+WboOS9v+eUqDogNjEgfiA3MCwg5a+55pa55Y6f5Zug5L2/55SoOiA3MSB+IDgwLFxuICog5bex5pa55Y6f5Zug5L2/55SoOiA3MSB+IDkwLCDlr7nmlrnljp/lm6Dkvb/nlKg6IDkxIH4gMTAwLlxuICpcbiAqIOWQhOW5s+WPsOeLrOacieWtl+auteiMg+WbtFxuICogQW5kcm9pZCAyMDEgfiAyOTlcbiAqIGlPUyAgICAgMzAxIH4gMzk5XG4gKiBXZWIgICAgIDQwMSB+IDQ5OVxuICog6K+m57uG5paH5qGj77yaaHR0cHM6Ly9naXRib29rLnJvbmdjbG91ZC5uZXQvcnRjLWRvY3MvIy9ydGMtY2xpZW50L2lvcy9hbmFseXNpcy9jYWxsbGliL0hhbmd1cFJlYXNvblxuICovXG5leHBvcnQgZW51bSBSQ0NhbGxFbmRSZWFzb24ge1xuICAvKipcbiAgICog5bex5pa55Y+W5raI5bey5Y+R5Ye655qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBDQU5DRUwgPSAxLFxuICAvKipcbiAgICog5bex5pa55ouS57ud5pS25Yiw55qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBSRUpFQ1QgPSAyLFxuICAvKipcbiAgICog5bex5pa55oyC5patXG4gICAqL1xuICBIQU5HVVAgPSAzLFxuICAvKipcbiAgICog5bex5pa55b+Z56KMXG4gICAqL1xuICBCVVNZX0xJTkUgPSA0LFxuICAvKipcbiAgICog5bex5pa55pyq5o6l5ZCsXG4gICAqL1xuICBOT19SRVNQT05TRSA9IDUsXG4gIC8qKlxuICAgKiDlt7HmlrnkuI3mlK/mjIHlvZPliY3pn7Pop4bpopHlvJXmk45cbiAgICovXG4gIEVOR0lORV9VTlNVUFBPUlRFRCA9IDYsXG4gIC8qKlxuICAgKiDlt7HmlrnnvZHnu5zplJnor69cbiAgICovXG4gIE5FVFdPUktfRVJST1IgPSA3LFxuICAvKipcbiAgICog5bex5pa55pGE5YOP5aS06LWE5rqQ6I635Y+W5aSx6LSl77yM5Y+v6IO95piv5p2D6ZmQ5Y6f5ZugXG4gICAqL1xuICBHRVRfTUVESUFfUkVTT1VSQ0VTX0VSUk9SID0gOCxcbiAgLyoqXG4gICAqIOW3seaWuei1hOa6kOWPkeW4g+Wksei0pVxuICAgKi9cbiAgUFVCTElTSF9FUlJPUiA9IDksXG4gIC8qKlxuICAgKiDlt7HmlrnorqLpmIXotYTmupDlpLHotKVcbiAgICovXG4gIFNVQlNDUklCRV9FUlJPUiA9IDEwLFxuICAvKipcbiAgICog5a+55pa55Y+W5raI5Y+R5Ye655qE6YCa6K+d6K+35rGCXG4gICAqL1xuICBSRU1PVEVfQ0FOQ0VMID0gMTEsXG4gIC8qKlxuICAgKiDlr7nmlrnmi5Lnu53mlLbliLDnmoTpgJror53or7fmsYJcbiAgICovXG4gIFJFTU9URV9SRUpFQ1QgPSAxMixcbiAgLyoqXG4gICAqIOmAmuivnei/h+eoi+S4reWvueaWueaMguaWrVxuICAgKi9cbiAgUkVNT1RFX0hBTkdVUCA9IDEzLFxuICAvKipcbiAgICog5a+55pa55b+Z56KMXG4gICAqL1xuICBSRU1PVEVfQlVTWV9MSU5FID0gMTQsXG4gIC8qKlxuICAgKiDlr7nmlrnmnKrmjqXlkKxcbiAgICovXG4gIFJFTU9URV9OT19SRVNQT05TRSA9IDE1LFxuICAvKipcbiAgICog5a+55pa55byV5pOO5LiN5pSv5oyBXG4gICAqL1xuICBSRU1PVEVfRU5HSU5FX1VOU1VQUE9SVEVEID0gMTYsXG4gIC8qKlxuICAgKiDlr7nmlrnnvZHnu5zplJnor69cbiAgICovXG4gIFJFTU9URV9ORVRXT1JLX0VSUk9SID0gMTcsXG4gIC8qKlxuICAgKiDlr7nmlrnmkYTlg4/lpLTotYTmupDojrflj5blpLHotKXvvIzlj6/og73mmK/mnYPpmZDljp/lm6BcbiAgICovXG4gIFJFTU9URV9HRVRfTUVESUFfUkVTT1VSQ0VfRVJST1IgPSAxOCxcbiAgLyoqXG4gICAqIOi/nOerr+i1hOa6kOWPkeW4g+Wksei0pVxuICAgKi9cbiAgUkVNT1RFX1BVQkxJU0hfRVJST1IgPSAxOSxcbiAgLyoqXG4gICAqIOi/nOerr+iuoumYhei1hOa6kOWksei0pVxuICAgKi9cbiAgUkVNT1RFX1NVQlNDUklCRV9FUlJPUiA9IDIwLFxuICAvKipcbiAgICog5bex5pa55YW25LuW56uv5bey5Yqg5YWl5paw6YCa6K+dXG4gICAqL1xuICBPVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwgPSAyMSxcbiAgLyoqXG4gICAqIOW3seaWueWFtuS7luerr+W3suWcqOmAmuivneS4rVxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0lOX0NBTEwgPSAyMixcbiAgLyoqXG4gICAqIOW3seaWueiiq+emgeatoumAmuivnVxuICAgKi9cbiAgS0lDS0VEX0JZX1NFUlZFUiA9IDIzLFxuICAvKipcbiAgICog5bex5pa55o6l5ZCs57O757uf6YCa6K+d77yI56e75Yqo56uv54m55pyJ77yJXG4gICovXG4gIEFDQ0VQVF9TWVNURU1fQ0FMTCA9IDI0LFxuICAvKipcbiAgICog6L+c56uv5YW25LuW56uv5bey5Yqg5YWl5paw6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMID0gMzEsXG4gIC8qKlxuICAgKiDov5znq6/lhbbku5bnq6/lt7LlnKjpgJror53kuK1cbiAgICovXG4gIFJFTU9URV9PVEhFUl9DTElFTlRfSU5fQ0FMTCA9IDMyLFxuICAvKipcbiAgICog6L+c56uv6KKr56aB5q2i6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfS0lDS0VEX0JZX1NFUlZFUiA9IDMzLFxuICAvKipcbiAgICog6L+c56uv5o6l5ZCs57O757uf6YCa6K+d77yI56e75Yqo56uv54m55pyJ77yJXG4gICovXG4gIFJFTU9URV9BQ0NFUFRfU1lTVEVNX0NBTEwgPSAzNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+aOpeWQrFxuICAgKi9cbiAgQUNDRVBUX0JZX09USEVSX0NMSUVOVCA9IDEwMSxcbiAgLyoqXG4gICAqIOWFtuS7luerr+aMguaWrVxuICAgKi9cbiAgSEFOR1VQX0JZX09USEVSX0NMSUVOVCA9IDEwMixcbiAgLyoqXG4gICAqIOW3seaWueiiq+WvueaWueWKoOWFpem7keWQjeWNlVxuICAgKi9cbiAgQURERURfVE9fQkxBQ0tMSVNUID0gMTAzLFxuICAvKipcbiAgICog6Z+z6KeG6aKR5pyN5Yqh5pyq5byA6YCaXG4gICAqL1xuICBTRVJWSUNFX05PVF9PUEVORUQgPSAxMDRcbn1cblxuLyoqXG4gKiDlt7Hmlrnljp/lm6DovazkuLrlr7nmlrnljp/lm6BcbiAqL1xuZXhwb3J0IGNvbnN0IENhbGxSZW1vdGVFbmRSZWFzb246IHsgW2tleTogbnVtYmVyXTogUkNDYWxsRW5kUmVhc29uIH0gPSB7XG4gIFtSQ0NhbGxFbmRSZWFzb24uQ0FOQ0VMXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9DQU5DRUwsXG4gIFtSQ0NhbGxFbmRSZWFzb24uUkVKRUNUXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9SRUpFQ1QsXG4gIFtSQ0NhbGxFbmRSZWFzb24uSEFOR1VQXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVAsXG4gIFtSQ0NhbGxFbmRSZWFzb24uQlVTWV9MSU5FXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9CVVNZX0xJTkUsXG4gIFtSQ0NhbGxFbmRSZWFzb24uTk9fUkVTUE9OU0VdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFLFxuICBbUkNDYWxsRW5kUmVhc29uLkVOR0lORV9VTlNVUFBPUlRFRF06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfRU5HSU5FX1VOU1VQUE9SVEVELFxuICBbUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1JdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05FVFdPUktfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uR0VUX01FRElBX1JFU09VUkNFU19FUlJPUl06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfR0VUX01FRElBX1JFU09VUkNFX0VSUk9SLFxuICBbUkNDYWxsRW5kUmVhc29uLlBVQkxJU0hfRVJST1JdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX1BVQkxJU0hfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uU1VCU0NSSUJFX0VSUk9SXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9TVUJTQ1JJQkVfRVJST1IsXG4gIFtSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMXTogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwsXG4gIFtSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTExdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX09USEVSX0NMSUVOVF9JTl9DQUxMLFxuICBbUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVJdOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0tJQ0tFRF9CWV9TRVJWRVIsXG4gIFtSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFXTogUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFLFxuICBbUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9TWVNURU1fQ0FMTF06IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfQUNDRVBUX1NZU1RFTV9DQUxMLFxufTtcbiIsImV4cG9ydCBlbnVtIFJDQ2FsbE1lc3NhZ2VUeXBlIHtcbiAgLyoqXG4gICAqIOmCgOivt+a2iOaBr1xuICAgKi9cbiAgVkNJbnZpdGUgPSAnUkM6VkNJbnZpdGUnLFxuICAvKipcbiAgICog5ZON6ZOD5raI5oGvXG4gICAqL1xuICBWQ1JpbmdpbmcgPSAnUkM6VkNSaW5naW5nJyxcbiAgLyoqXG4gICAqIOaOpeWQrOa2iOaBr1xuICAgKi9cbiAgVkNBY2NlcHQgPSAnUkM6VkNBY2NlcHQnLFxuICAvKipcbiAgICog5oyC5pat5raI5oGvXG4gICAqL1xuICBWQ0hhbmd1cCA9ICdSQzpWQ0hhbmd1cCcsXG4gIC8qKlxuICAgKiDnvqTlkbzkuK0g5Lq65ZGY5Y+Y5pu05raI5oGvXG4gICAqL1xuICBWQ01vZGlmeU1lbSA9ICdSQzpWQ01vZGlmeU1lbScsXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovkv67mlLnmtojmga9cbiAgICovXG4gIFZDTW9kaWZ5TWVkaWEgPSAnUkM6VkNNb2RpZnlNZWRpYScsXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxTZXNzaW9uU3RhdGUge1xuICAvKipcbiAgICog562J5b6F5bu656uL6L+e5o6lXG4gICAqL1xuICBXQUlUSU5HLFxuICAvKipcbiAgICog5Lya6K+d57u05oyB5LitXG4gICAqL1xuICBLRUVQSU5HLFxuICAvKipcbiAgICog5Lya6K+d5bey57uT5p2fXG4gICAqL1xuICBFTkRcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFVzZXJTdGF0ZSB7XG4gIC8qKlxuICAgKiDnlKjmiLfkuI3lrZjlnKjkuo7pgJror53kuK1cbiAgICovXG4gIE5PTkUgPSAwLFxuICAvKipcbiAgICog562J5b6F5o6l5ZCsXG4gICAqL1xuICBXQUlUSU5HLFxuICAvKipcbiAgICog6YCa6K+d5LitXG4gICAqL1xuICBLRUVQSU5HLFxufVxuIiwiZXhwb3J0IGVudW0gUkNDcm9zc0NhbGxUeXBlIHtcbiAgLyohXG4gIOWQjEFwcOmAmuivnVxuICAqL1xuICBSQ0NhbGxSb29tVHlwZU5vcm1hbENhbGwgPSAwLFxuICAvKiFcbiAg6LeoQXBw6YCa6K+dXG4gICovXG4gIFJDQ2FsbFJvb21UeXBlQWNyb3NzQ2FsbCA9IDdcbn1cbiIsImltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4uL2hlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBUaW1lciB7XG4gIHByaXZhdGUgX3RpbWVySWQ6IG51bWJlciA9IDBcblxuICBwcml2YXRlIF9zdGFydFRpbWU6IG51bWJlciA9IDBcblxuICBjb25zdHJ1Y3RvcihjYWxsYmFjazogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcikge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5fdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHN0b3AoKToge1xuICAgIHN0YXJ0VGltZTogbnVtYmVyLFxuICAgIGVuZFRpbWU6IG51bWJlcixcbiAgICBkdXJhdGlvbjogbnVtYmVyXG4gICAgfSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVySWQpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IGR1cmF0aW9uID0gZW5kVGltZSAtIHRoaXMuX3N0YXJ0VGltZTtcbiAgICBpZiAodGhpcy5fc3RhcnRUaW1lID09PSAwKSB7XG4gICAgICBkdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lLFxuICAgICAgZW5kVGltZSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH07XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSAwO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb252ZXJzYXRpb25UeXBlLCBJTG9nZ2VyLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgZXZlbnRFbWl0dGVyLCBnZXRDYWxsRGV2aWNlSWQgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHsgTXNnQ2FsbFN0YXR1cyB9IGZyb20gJy4vZW51bXMvTXNnQ2FsbFN0YXR1cyc7XG5pbXBvcnQgeyBSQ0NhbGxFcnJvckNvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbENvZGUnO1xuaW1wb3J0IHsgQ2FsbFJlbW90ZUVuZFJlYXNvbiwgUkNDYWxsRW5kUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxFbmRSZWFzb24nO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVzc2FnZVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFNlc3Npb25TdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbFVzZXJTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsVXNlclN0YXRlJztcbmltcG9ydCB7XG4gIElFeGlzdGVkVXNlclBvZmlsZXMsIElIdW5ndXBNc2dDb250ZW50LCBJSW52aXRlTXNnQ29udGVudCwgSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQsIElSaW5naW5nTXNnQ29udGVudCxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lNZXNzYWdlSGFuZGxlcic7XG5pbXBvcnQge1xuICBJQ2FsbFN0YXRlTWFjaGluZVdhdGNoZXJzLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSVVzZXJEYXRhLCBJVXNlclByb2ZpbGUsIElJbnZpdGVPcHRpb25zLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVN0YXRlTWFjaGluZSc7XG5pbXBvcnQgeyBDYWxsTWVzc2FnZUhhbmRsZXIgfSBmcm9tICcuL01lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IFJDQ3Jvc3NDYWxsVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDcm9zc0NhbGxUeXBlJztcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSAnLi9UaW1lcic7XG5pbXBvcnQgeyBJUHVzaENvbmZpZyB9IGZyb20gJy4uLy4uL3NyYy9pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgUkNDYWxsU3RhdGVNYWNoaW5lIHtcbiAgLyoqXG4gICAqIOaIv+mXtOeKtuaAgVxuICAgKi9cbiAgcHJpdmF0ZSBfc2Vzc2lvblN0YXRlOiBSQ0NhbGxTZXNzaW9uU3RhdGUgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiDnlKjmiLfnirbmgIHlj4rkv6Hmga9cbiAgICovXG4gIHByaXZhdGUgX3VzZXJJbmZvOiB7IFt1c2VySWQ6IHN0cmluZ106IElVc2VyRGF0YSB9ID0ge31cblxuICAvKipcbiAgICog55So5oi36K6h5pe25Zmo5pig5bCEXG4gICAqL1xuICBwcml2YXRlIF91c2VyVGltZXJzOiB7IFt1c2VySWQ6IHN0cmluZ106IFRpbWVyIH0gPSB7fVxuXG4gIC8qKlxuICAgKiDnm5HlkKzlmahcbiAgICovXG4gIHByaXZhdGUgX3dhdGNoZXJzITogSUNhbGxTdGF0ZU1hY2hpbmVXYXRjaGVyc1xuXG4gIC8qKlxuICAgKiDlkbzlj6votoXml7bml7bpl7QgKOWNleS9je+8muavq+enkilcbiAgICovXG4gIHByaXZhdGUgX2NhbGxUaW1lb3V0OiBudW1iZXIgPSA2MCAqIDEwMDBcblxuICAvKipcbiAgICog6YCa6K+d5bu656uL5byA5aeL5pe26Ze0XG4gICAqL1xuICBwcml2YXRlIF9iZWdpblRpbWVzdGFtcDogbnVtYmVyID0gMFxuXG4gIC8qKlxuICAgKiDpgJror53nu5PmnZ/ml7bpl7RcbiAgICovXG4gIHByaXZhdGUgX2VuZFRpbWVzdGFtcDogbnVtYmVyID0gMFxuXG4gIC8qKlxuICAgKiDpgJror53nu5PmnZ/ljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX2VuZFJlYXNvbjogUkNDYWxsRW5kUmVhc29uIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICog5Li75Y+rIElEXG4gICAqIOWPkei1t+mCgOivt+S4uuW9k+WJjeeUqOaItyBJRFxuICAgKiDmlLbliLDpgoDor7fkuLogc2VuZGVyVXNlcklkXG4gICAqIOaUtuWIsOS6uuWRmOWPmOabtOmCgOivt+S4uua2iOaBr+S9k+S4rSBjYWxsZXJJZFxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbGVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOW9k+asoemAmuivnemCgOivt+iAhSBJRFxuICAgKiDlj5HotbfpgoDor7fkuLrlvZPliY3nlKjmiLcgSUTjgIHmlLbliLDpgoDor7fkuLogc2VuZGVyVXNlcklk44CB5pS25Yiw5Lq65ZGY5Y+Y5pu06YKA6K+35Li65raI5oGv5L2T5LitIHNlbmRlclVzZXJJZFxuICAgKi9cbiAgcHJpdmF0ZSBfaW52aXRlcklkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiDmmK/lkKbmmK/ot6ggYXBwa2V5XG4gICAqL1xuICBwcml2YXRlIF9pc0Nyb3NzQXBwa2V5OiBib29sZWFuID0gZmFsc2VcblxuICBwcml2YXRlIF9odW5ndXBQdXNoQ29uZmlnPzogSVB1c2hDb25maWdcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsTXNnSGFuZGxlcjogQ2FsbE1lc3NhZ2VIYW5kbGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5uZWxJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnZlcnNhdGlvblR5cGU6IENvbnZlcnNhdGlvblR5cGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIF9tZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsSWQ6IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvblJpbmdpbmcnLCB0aGlzLl9vblJpbmdpbmcuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvbkFjY2VwdCcsIHRoaXMuX29uQWNjZXB0LmJpbmQodGhpcykpO1xuICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQodGhpcy5fY2FsbElkLCAnb25NZWRpYU1vZGlmeScsIHRoaXMuX29uTWVkaWFNb2RpZnkuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudCh0aGlzLl9jYWxsSWQsICdvbkh1bmd1cCcsIHRoaXMuX29uSHVuZ3VwLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluagoeato+WQjui2heaXtuaXtumXtFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0VGltZW91dChzZW50VGltZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgZGVsYXlUaW1lID0gdGhpcy5fY29udGV4dC5nZXRTZXJ2ZXJUaW1lKCkgLSBzZW50VGltZTtcbiAgICBpZiAoZGVsYXlUaW1lIDwgMCkge1xuICAgICAgZGVsYXlUaW1lID0gNTAwOyAvLyDlgYforr7lu7bov5/ml7bpl7TkuLogNTAwIG1zXG4gICAgfVxuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLl9jYWxsVGltZW91dCAtIGRlbGF5VGltZTtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBfZ2V0VGltZW91dCAtPiB0aW1lb3V0OiAke3RpbWVvdXR9YCk7XG4gICAgcmV0dXJuIHRpbWVvdXQ7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhclRpbWVyQnlJZCh1c2VySWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBiZWZvcmUgX2NsZWFyVGltZXJCeUlkICAtPiB1c2VySWQ6ICR7dXNlcklkfSB1c2VyVGltZXJzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3VzZXJUaW1lcnMpfWApO1xuICAgIGlmICh0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0pIHtcbiAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXS5zdG9wKCk7XG4gICAgICBkZWxldGUgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdO1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gYWZ0ZXIgX2NsZWFyVGltZXJCeUlkIC0+IHVzZXJUaW1lcnM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5fdXNlclRpbWVycyl9YCk7XG4gIH1cblxuICAvKipcbiAgICog6YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu05Y+K5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlTdGF0ZUNoYW5nZShzdGF0ZTogUkNDYWxsU2Vzc2lvblN0YXRlLCByZWFzb24/OiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBub3RpZnlTdGF0ZUNoYW5nZSAtPiBpbmZvOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgIHN0YXRlLCByZWFzb24sXG4gICAgfSl9YCk7XG5cbiAgICB0aGlzLl9lbmRSZWFzb24gPSByZWFzb24gfHwgbnVsbDtcbiAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgdGhpcy5fc2Vzc2lvblN0YXRlID0gc3RhdGU7XG4gICAgICB0aGlzLl93YXRjaGVycz8ub25TdGF0ZUNoYW5nZSh7IHN0YXRlLCByZWFzb24gfSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgLy8g5b2T54q25oCB5py657uT5p2f5pe277yM6ZyA5ZyoIENhbGxFbmdpbmUg5riF6ZmkXG4gICAgICBldmVudEVtaXR0ZXIuZW1pdCgnb25TdGF0ZU1hY2hpbmVDbG9zZScsIHRoaXMuX2NhbGxJZCk7XG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci51bnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQodGhpcy5fY2FsbElkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu05Y+K5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodXNlcjogSVVzZXJEYXRhLCByZWFzb24/OiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSBub3RpZnlVc2VyU3RhdGVDaGFuZ2UgLT4gaW5mbzogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VyLCByZWFzb24sXG4gICAgfSl9YCk7XG4gICAgdGhpcy5fd2F0Y2hlcnM/Lm9uVXNlclN0YXRlQ2hhbmdlKHsgdXNlciwgcmVhc29uIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb3RoZXJDbGllbnRIYW5kbGUobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkLCBjb250ZW50OiB7IHVzZXI6IHVzZXJQcm9maWxlLCByZWFzb246IGh1bmd1cFJlYXNvbiB9LCBtZXNzYWdlVHlwZSB9ID0gbWVzc2FnZTtcbiAgICB0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdID0ge1xuICAgICAgdXNlcklkOiBzZW5kZXJVc2VySWQsXG4gICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLk5PTkUsXG4gICAgICBpc0NhbGxlcjogZmFsc2UsXG4gICAgICBpc1JlbW90ZTogZmFsc2UsXG4gICAgfTtcbiAgICAvLyDlpJrnq6/mjqXlkKzjgIHlpJrnq6/mi5Lnu53vvIzmuIXpmaTmlLbliLDpgoDor7flkI7otbfnmoTorqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VyVGltZXJzKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZCh1c2VySWQpO1xuICAgIH1cbiAgICAvLyDlhbbku5bnq6/mjqXlkKxcbiAgICBsZXQgZW5kUmVhc29uID0gUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9CWV9PVEhFUl9DTElFTlQ7XG4gICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCkge1xuICAgICAgaWYgKGh1bmd1cFJlYXNvbiA9PT0gUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSkge1xuICAgICAgICBlbmRSZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0lOX0NBTEw7XG4gICAgICB9IGVsc2UgaWYgKGh1bmd1cFJlYXNvbiA9PT0gUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFKSB7XG4gICAgICAgIGVuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5OT19SRVNQT05TRTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVBfQllfT1RIRVJfQ0xJRU5UO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyDmt7vliqDnlKjmiLfnroDopoHkv6Hmga9cbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0sIDxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUpO1xuICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCBlbmRSZWFzb24pO1xuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZFJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog5q2j5Zyo6YCa6K+d5Lit77yM5LiU5LiN5piv5b2T5YmN5bey5o6l6YCa55So5oi36K6+5aSH77yIZGV2aWNlSWTvvInlj5HmnaXnmoTmtojmga9cbiAgKi9cbiAgcHJpdmF0ZSBfaXNSZW1vdGVJbnZhbGlkTXNnKHJlbW90ZVVzZXJJZDogc3RyaW5nLCBtc2dEZXZpY2VJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl91c2VySW5mb1tyZW1vdGVVc2VySWRdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl91c2VySW5mb1tyZW1vdGVVc2VySWRdLmRldmljZUlkIHx8ICFtc2dEZXZpY2VJZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICgodGhpcy5fdXNlckluZm9bcmVtb3RlVXNlcklkXS5zdGF0ZSA9PT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcgJiYgdGhpcy5fdXNlckluZm9bcmVtb3RlVXNlcklkXS5kZXZpY2VJZCAhPT0gbXNnRGV2aWNlSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9vblJpbmdpbmcobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkOiBzdWlkLCBjb250ZW50OiB7IHVzZXI6IHVzZXJQcm9maWxlLCBkZXZpY2VJZCB9IH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHNlbmRlclVzZXJJZCA9IHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPyBzdWlkLnNwbGl0KCdfJylbMV0gOiBzdWlkO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBvblJpbmdpbmcgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICByZXR1cm47IC8vIOWkmuerr+WkhOeQhlxuICAgIH1cbiAgICB0aGlzLl93YXRjaGVycy5vblJpbmdpbmcoeyB1c2VySWQ6IHNlbmRlclVzZXJJZCwgLi4uPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQWNjZXB0KG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudDogeyB1c2VyOiB1c2VyUHJvZmlsZSwgZGV2aWNlSWQ6IHNlbmRlckRldmljZUlkIH0sIHNlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHNlbmRlclVzZXJJZCA9IHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPyBzdWlkLnNwbGl0KCdfJylbMV0gOiBzdWlkO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBzZW5kZXJEZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfb25BY2NlcHQgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHRoaXMuX290aGVyQ2xpZW50SGFuZGxlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOe+pOe7hOmAmuivneaXtu+8miBB44CBQiDpgJror50gQemCgOivt0MsIEPlkIzmhI/mjqXlkKzvvIzov5nml7ZC5rKh5pyJQ+eahHVzZXJJZOWvueW6lOeahOiuoeaXtuWZqO+8jOaJgOS7pei/memHjOWIpOaWreS4gOS4i1xuICAgIGlmICh0aGlzLl91c2VyVGltZXJzW3NlbmRlclVzZXJJZF0pIHtcbiAgICAgIC8vIOa4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQoc2VuZGVyVXNlcklkKTtcbiAgICB9XG5cbiAgICAvLyDkv67mlLnlubbpgJrnn6XmiL/pl7TkurrlkZjnirbmgIFcbiAgICBjb25zdCBpZHMgPSAodGhpcy5fY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5QUklWQVRFKSA/IFtjdXJyZW50VXNlcklkLCBzZW5kZXJVc2VySWRdIDogW3NlbmRlclVzZXJJZF07XG4gICAgaWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgY29uc3QgaXNDdXJyZW50VXNlcklkID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLktFRVBJTkcsXG4gICAgICAgIGlzQ2FsbGVyOiBpc0N1cnJlbnRVc2VySWQsXG4gICAgICAgIGlzUmVtb3RlOiBpc0N1cnJlbnRVc2VySWQsXG4gICAgICAgIGRldmljZUlkOiBpc0N1cnJlbnRVc2VySWQgPyBnZXRDYWxsRGV2aWNlSWQodGhpcy5fcnVudGltZSkgOiBzZW5kZXJEZXZpY2VJZCxcbiAgICAgIH07XG4gICAgICBpZiAoIWlzQ3VycmVudFVzZXJJZCkge1xuICAgICAgICB0aGlzLl9iZWdpblRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIC8vIOa3u+WKoOeUqOaIt+eugOimgeS/oeaBr1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0sIDxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmdldENhbGxlcklkKCkgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5LRUVQSU5HKTtcbiAgICB9XG4gICAgLy8g5oqb5Ye6b25BY2NlcHTml7bnirbmgIHlt7Lnu4/lsLHnu6pcbiAgICB0aGlzLl93YXRjaGVycy5vbkFjY2VwdCh7IHVzZXJJZDogc2VuZGVyVXNlcklkIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25NZWRpYU1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzZW5kZXJVc2VySWQsIGNvbnRlbnQ6IHsgbWVkaWFUeXBlLCB1c2VyOiB1c2VyUHJvZmlsZSwgZGV2aWNlSWQgfSB9ID0gbWVzc2FnZTtcbiAgICAvLyDmraPlnKjpgJror53kuK3vvIzov5znq6/lpJrnq6/lj5HnmoTmtojmga/nm7TmjqXov4fmu6RcbiAgICBpZiAodGhpcy5faXNSZW1vdGVJbnZhbGlkTXNnKHNlbmRlclVzZXJJZCwgZGV2aWNlSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCAnW1JDQ2FsbFN0YXRlTWFjaGluZV0gX29uTWVkaWFNb2RpZnkgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSA9PT0gc2VuZGVyVXNlcklkKSB7IC8vIOWkmuerr+WkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOabtOaWsCBtZWRpYVR5cGVcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgdGhpcy5fd2F0Y2hlcnMub25NZWRpYU1vZGlmeSh7XG4gICAgICBzZW5kZXI6IHsgdXNlcklkOiBzZW5kZXJVc2VySWQsIC4uLjxJVXNlclByb2ZpbGU+dXNlclByb2ZpbGUgfSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uSHVuZ3VwKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudCB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCBzZW5kZXJVc2VySWQgPSB0aGlzLl9pc0Nyb3NzQXBwa2V5ID8gc3VpZC5zcGxpdCgnXycpWzFdIDogc3VpZDtcbiAgICBjb25zdCB7IHJlYXNvbiwgdXNlcjogdXNlclByb2ZpbGUsIGRldmljZUlkIH0gPSBjb250ZW50IGFzIElIdW5ndXBNc2dDb250ZW50O1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOato+WcqOmAmuivneS4re+8jOi/nOerr+Wkmuerr+WPkeeahOa2iOaBr+ebtOaOpei/h+a7pFxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfb25IdW5ndXAgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7IC8vIOWkmuerr+WkhOeQhiDmipvlh7rlpJrnq6/lt7LlpITnkIYgcmVhc29uXG4gICAgICB0aGlzLl9vdGhlckNsaWVudEhhbmRsZShtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EKSB7XG4gICAgICAvLyDlpoLmnpzlt7HmlrnmiL/pl7TnirbmgIHlt7Lnu5PmnZ/vvIzlho3mlLbliLAgaHVuZ3VwIOa2iOaBr+S4jeWGjeWkhOeQhlxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gSW52YWxpZCBoYW5nIHVwIG1lc3NhZ2UsIGN1cnJlbnQgcm9vbSBzdGF0dXMgaGFzIGVuZGVkIC0+IHNlc3Npb25TdGF0ZTogJHt0aGlzLl9zZXNzaW9uU3RhdGV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF0pIHtcbiAgICAgIC8vIOS/ruaUueWGheWtmOaAgeaVsOaNruW5tumAmuefpVxuICAgICAgdGhpcy5fdXNlckluZm9bc2VuZGVyVXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FO1xuICAgICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIC8vIOa3u+WKoOeUqOaIt+eugOimgeS/oeaBr1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCA8SVVzZXJQcm9maWxlPnVzZXJQcm9maWxlKTtcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLCBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl0pO1xuICAgICAgZGVsZXRlIHRoaXMuX3VzZXJJbmZvW3NlbmRlclVzZXJJZF07XG4gICAgfVxuXG4gICAgLy8gdGltZXIg5riF6ZmkXG4gICAgaWYgKENhbGxSZW1vdGVFbmRSZWFzb25bcmVhc29uXSA9PT0gUkNDYWxsRW5kUmVhc29uLlJFTU9URV9DQU5DRUwpIHtcbiAgICAgIC8vIOi/nOerr+WPlua2iOmAmuivne+8jOayoeaciei/nOerr+eUqOaIt++8jOa4hemZpOW3seerr+eahOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgICAgdGhpcy5nZXRSZW1vdGVVc2VySWRzKCkubGVuZ3RoIDwgMSAmJiB0aGlzLl9jbGVhclRpbWVyQnlJZChjdXJyZW50VXNlcklkKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SW52aXRlcklkKCkgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgIC8vIOi/nOerr+aLkue7neOAgeW/meeijOOAgeacquaOpeWQrOetie+8jOmAmui/h+iHquW3seaYr+WQpuaYr+S4u+WPq+adpeWIpOaWreimgea4hemZpOWRvOWPq+i2heaXtuiuoeaXtuWZqCDmiJYg5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZChzZW5kZXJVc2VySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKS5sZW5ndGggPCAxICYmIHRoaXMuX2NsZWFyVGltZXJCeUlkKGN1cnJlbnRVc2VySWQpO1xuICAgIH1cblxuICAgIC8vIOaIv+mXtOS6uuWRmOS/oeaBr+WwkeS6juS4pOS4qu+8jOmAmuefpeaIv+mXtOeKtuaAgee7k+adn1xuICAgIGNvbnN0IGlzTGVzc1RoYW5Ud28gPSBPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMjtcbiAgICAvLyDnvqTlkbzkuK3pgoDor7fogIXmjILmlq3vvIjpnZ7lkbzlj6vlj5HotbfogIXvvInkuJTmiL/pl7TkuK3ooqvpgoDor7fogIXpg73mnKrmjqXlkKzvvIzpgJrnn6XmiL/pl7TnirbmgIHnu5PmnZ9cbiAgICBjb25zdCBpc0ludml0ZVVzZXIgPSB0aGlzLl9pbnZpdGVySWQgPT09IHNlbmRlclVzZXJJZDtcbiAgICBjb25zdCBpc05vT25lQW5zd2VyZWQgPSBPYmplY3QudmFsdWVzKHRoaXMuX3VzZXJJbmZvKS5ldmVyeSgodXNlcikgPT4gdXNlci5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgIGlmIChpc0xlc3NUaGFuVHdvIHx8IChpc0ludml0ZVVzZXIgJiYgaXNOb09uZUFuc3dlcmVkKSkge1xuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgQ2FsbFJlbW90ZUVuZFJlYXNvbltyZWFzb25dKTtcbiAgICB9XG5cbiAgICAvLyDmipvlh7ogb25IdW5ndXAg5pe254q25oCB5bey57uP5bCx57uqXG4gICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAoeyB1c2VySWQ6IHNlbmRlclVzZXJJZCwgLi4uPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSB9LCBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOS6i+S7tuebkeWQrFxuICAgKiBAcGFyYW1zIHdhdGNoZXJzXG4gICAqL1xuICByZWdpc3RlckV2ZW50TGlzdGVuZXIod2F0Y2hlcnM6IElDYWxsU3RhdGVNYWNoaW5lV2F0Y2hlcnMpIHtcbiAgICB0aGlzLl93YXRjaGVycyA9IHdhdGNoZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCBpbnZpdGUg5raI5oGv5pe254q25oCB5py65pu05paw77yIQ2FsbEVuZ2luZSDlhoXpg6josIPnlKjvvIlcbiAgICogQHBhcmFtIG1lc3NhZ2Ug5o6l5pS25raI5oGvXG4gICAqL1xuICBfX29uSW52aXRlKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogc3VpZCwgY29udGVudCwgc2VudFRpbWUgfSA9IG1lc3NhZ2U7XG4gICAgY29uc3Qge1xuICAgICAgaW52aXRlVXNlcklkczogaW5pZHMsIHVzZXI6IHVzZXJQcm9maWxlLCBkZXZpY2VJZCwgcm9vbVR5cGUsXG4gICAgfSA9IGNvbnRlbnQgYXMgSUludml0ZU1zZ0NvbnRlbnQ7XG4gICAgLy8g5aSE55CG6LeoIGFwcGtleSDpgoDor7cgc2VuZGVyVXNlcklkIOW4puaciSBhcHBrZXkg5LiO5pys5ZywIGN1cnJlbnRVc2VySWQg5Yy56YWN6Zeu6aKYXG4gICAgLy8g5ZCM5pe26K6w5b2V5pys5Zyw5piv5ZCm5Li66LeoIGFwcGtleSDnirbmgIFcbiAgICBsZXQgc2VuZGVyVXNlcklkOiBzdHJpbmc7XG4gICAgaWYgKHJvb21UeXBlID09PSBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVBY3Jvc3NDYWxsKSB7XG4gICAgICBbLCBzZW5kZXJVc2VySWRdID0gc3VpZC5zcGxpdCgnXycpO1xuICAgICAgdGhpcy5fd2F0Y2hlcnMuY3Jvc3NBcHBrZXkodHJ1ZSk7XG4gICAgICB0aGlzLl9pc0Nyb3NzQXBwa2V5ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZGVyVXNlcklkID0gc3VpZDtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgLy8g5q2j5Zyo6YCa6K+d5Lit77yM6L+c56uv5aSa56uv5Y+R55qE5raI5oGv55u05o6l6L+H5rukXG4gICAgaWYgKHRoaXMuX2lzUmVtb3RlSW52YWxpZE1zZyhzZW5kZXJVc2VySWQsIGRldmljZUlkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxTdGF0ZU1hY2hpbmVdIF9fb25JbnZpdGUgLT4gbm90IHRoZSByZW1vdGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IHRhbGtpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsZXJJZCA9IHRoaXMuX2ludml0ZXJJZCA9IHNlbmRlclVzZXJJZDtcbiAgICBjb25zdCB1c2VySWRMaXN0ID0gW3N1aWQsIC4uLmluaWRzXTtcbiAgICAvLyDmlLbliLDpgoDor7flkI7vvIzlhoXpg6jlm57lupTlk43pk4Pmtojmga8sIHVzZXJJZHMg5Lyg6Zmk6Ieq5bex55qE5omA5pyJ5Lq6XG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZFJpbmdpbmcoe1xuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICB1c2VySWRzOiB1c2VySWRMaXN0LmZpbHRlcigoaWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ3Jvc3NBcHBrZXkpIHtcbiAgICAgICAgICByZXR1cm4gaWQuc3BsaXQoJ18nKVsxXSAhPT0gY3VycmVudFVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWQgIT09IGN1cnJlbnRVc2VySWQ7XG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGludml0ZVVzZXJJZHMgPSB0aGlzLl9pc0Nyb3NzQXBwa2V5ID8gW2luaWRzWzBdLnNwbGl0KCdfJylbMV1dIDogaW5pZHM7XG5cbiAgICAvLyDlkIzmraXmnKzlnLDnlKjmiLfliJfooajpnIDopoHkvb/nlKjmi4bliIblkI7nmoQgVXNlcklkIOS/neivgeacrOWcsOWFtuS7luaWueazleWMuemFjSB1c2VyaWRcbiAgICBjb25zdCBhbGxVc2VySWRzID0gW3NlbmRlclVzZXJJZCwgLi4uaW52aXRlVXNlcklkc107XG5cbiAgICAvLyDkv67mlLnlubbpgJrnn6XmiL/pl7TkurrlkZjnirbmgIFcbiAgICBhbGxVc2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLldBSVRJTkcsXG4gICAgICAgIGlzQ2FsbGVyOiB1c2VySWQgPT09IHNlbmRlclVzZXJJZCxcbiAgICAgICAgaXNSZW1vdGU6IHVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCxcbiAgICAgIH07XG4gICAgICBpZiAodXNlcklkID09PSBzZW5kZXJVc2VySWQpIHtcbiAgICAgICAgLy8g57uZIHNlbmRlclVzZXIg5re75Yqg55So5oi3566A6KaB5L+h5oGv5Y+KIGRldmljZUlkXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlckluZm9bdXNlcklkXSwgPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSwgeyBkZXZpY2VJZCB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgIC8vIOe7meaJgOacieiiq+mCgOivt+S6uuWQr+WKqOaOpeWQrOiuoeaXtuWZqFxuICAgICAgaWYgKHVzZXJJZCAhPT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVhc29uID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkID8gUkNDYWxsRW5kUmVhc29uLk5PX1JFU1BPTlNFIDogUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRTtcbiAgICAgICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7IC8vIOe+pOiBiuS4reW3seaWuei2heaXtumcgOWPkemAgeaMguaWrVxuICAgICAgICAgICAgdGhpcy5faHVuZ3VwSGFuZGxlKHJlYXNvbik7XG4gICAgICAgICAgfSBlbHNlIHsgLy8g5YW25LuW5Lq65ZGY6LaF5pe25Y+q6YCa55+l5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdICYmICh0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLk5PTkUpO1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgcmVhc29uKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIOaIv+mXtOeKtuaAgemAmuefpVxuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5XQUlUSU5HKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAgbWVtYmVyTW9kaWZ5IOa2iOaBr+aXtueKtuaAgeacuuabtOaWsO+8iENhbGxFbmdpbmUg5YaF6YOo6LCD55So77yJXG4gICAqIEBwYXJhbSBtZXNzYWdlIOaOpeaUtua2iOaBr1xuICAgKi9cbiAgX19vbk1lbWJlck1vZGlmeShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzZW5kZXJVc2VySWQsIGNvbnRlbnQsIHNlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHtcbiAgICAgIHVzZXI6IHVzZXJQcm9maWxlLCBleGlzdGVkVXNlclBvZmlsZXMsIGNhbGxlciwgZGV2aWNlSWQsIGludml0ZVVzZXJJZHMsIG1lZGlhVHlwZSxcbiAgICB9ID0gY29udGVudCBhcyBJTWVtYmVyTW9kaWZ5TXNnQ29udGVudDtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDmraPlnKjpgJror53kuK3vvIzov5znq6/lpJrnq6/lj5HnmoTmtojmga/nm7TmjqXov4fmu6RcbiAgICAvLyB0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdICYmICF0aGlzLl91c2VySW5mb1tzZW5kZXJVc2VySWRdLmRldmljZUlkICYmICFkZXZpY2VJZCAmJlxuICAgIGlmICh0aGlzLl9pc1JlbW90ZUludmFsaWRNc2coc2VuZGVyVXNlcklkLCBkZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBfX29uTWVtYmVyTW9kaWZ5IC0+IG5vdCB0aGUgcmVtb3RlIGRldmljZSB0aGF0IGlzIGN1cnJlbnRseSB0YWxraW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50VXNlcklkID09PSBzZW5kZXJVc2VySWQpIHtcbiAgICAgIC8vIOWkmuerr+WkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jYWxsZXJJZCA9IGNhbGxlcjtcbiAgICB0aGlzLl9pbnZpdGVySWQgPSBzZW5kZXJVc2VySWQ7XG4gICAgaW52aXRlVXNlcklkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgZXhpc3RlZFVzZXJQb2ZpbGVzLnB1c2goeyB1c2VySWQ6IGlkLCBtZWRpYVR5cGUsIGNhbGxTdGF0dXM6IE1zZ0NhbGxTdGF0dXMuSU5DT01JTkcgfSk7XG4gICAgfSk7XG4gICAgLy8g5bex5pa554q25oCB5Li6IE5PTkUgKOacquWtmOWcqOW3seaWueeUqOaIt+S/oeaBrykg6K+05piO6Ieq5bex5Li66KKr6YKA6K+36ICFLCDpnIDlj5HpgIEgcmluZ2luZ1xuICAgIGNvbnN0IGlzTmV3SW52aXRlZFVzZXIgPSBpbnZpdGVVc2VySWRzLmluY2x1ZGVzKGN1cnJlbnRVc2VySWQpO1xuICAgIGlmIChpc05ld0ludml0ZWRVc2VyKSB7XG4gICAgICBjb25zdCBuZWVkUmluZ2luZ1VzZXJJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMuZm9yRWFjaCgodXNlckluZm8pID0+IHtcbiAgICAgICAgaWYgKHVzZXJJbmZvLnVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICAgIG5lZWRSaW5naW5nVXNlcklkcy5wdXNoKHVzZXJJbmZvLnVzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZFJpbmdpbmcoe1xuICAgICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgICAgdXNlcklkczogbmVlZFJpbmdpbmdVc2VySWRzLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOiiq+mCgOivt+iAhemAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLldBSVRJTkcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDlt7LlnKjpgJror53mtYHnqIvkuK3nlKjmiLfvvIzmipvlh7rkurrlkZjlj5jmm7Tnm5HlkKxcbiAgICAgIHRoaXMuX3dhdGNoZXJzLm9uTWVtYmVyTW9kaWZ5KHtcbiAgICAgICAgc2VuZGVyOiB7IHVzZXJJZDogc2VuZGVyVXNlcklkLCAuLi51c2VyUHJvZmlsZSB9LFxuICAgICAgICBpbnZpdGVkVXNlcnM6IGludml0ZVVzZXJJZHMubWFwKChpZCkgPT4gKHsgdXNlcklkOiBpZCB9KSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyDmm7TmlrDlhajph4/nlKjmiLfnirbmgIFcbiAgICBleGlzdGVkVXNlclBvZmlsZXMuZm9yRWFjaCgodXNlckluZm8pID0+IHtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCBjYWxsU3RhdHVzIH0gPSB1c2VySW5mbztcbiAgICAgIC8vIOS6uuWRmOS4uue7k+adn+eKtuaAgeaXtu+8jOS4jeWGjeabtOaWsFxuICAgICAgaWYgKGNhbGxTdGF0dXMgPT09IE1zZ0NhbGxTdGF0dXMuSURMRSkgcmV0dXJuO1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogY2FsbFN0YXR1cyAhPT0gTXNnQ2FsbFN0YXR1cy5DT05ORUNURUQgPyBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORyA6IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HLFxuICAgICAgICBpc0NhbGxlcjogc2VuZGVyVXNlcklkID09PSB1c2VySWQsXG4gICAgICAgIGlzUmVtb3RlOiBjdXJyZW50VXNlcklkICE9PSB1c2VySWQsXG4gICAgICB9O1xuICAgICAgLy8g57uZIHNlbmRlclVzZXIg5re75Yqg55So5oi3566A6KaB5L+h5oGvIOWPiiBkZXZpY2VJZFxuICAgICAgaWYgKHVzZXJJZCA9PT0gc2VuZGVyVXNlcklkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlckluZm9bdXNlcklkXSwgPElVc2VyUHJvZmlsZT51c2VyUHJvZmlsZSwgeyBkZXZpY2VJZCB9KTtcbiAgICAgIH1cbiAgICAgIC8vIOmAmuefpeS6uuWRmOWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgLy8g6Zmk5LqGIGNhbGxNc2dTdGF0dXMuY29ubmVjdGVkICzlhbbku5bkurrpg73otbforqHml7blmahcblxuICAgICAgaWYgKGNhbGxTdGF0dXMgIT09IE1zZ0NhbGxTdGF0dXMuQ09OTkVDVEVEICYmICF0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0pIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOS7hee7meiiq+mCgOivt+aIkOWRmOWQr+WKqOWumuaXtuWZqFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKCFpbnZpdGVVc2VySWRzLmluY2x1ZGVzKHVzZXJJZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8g5ZCv5Yqo6K6h5pe25ZmoXG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgLy8g5ZG85Y+r6LaF5pe25aSE55CG54q25oCB44CB5bm26YCa55+lIGNhbGwg5bGCXG4gICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICBjb25zdCByZWFzb24gPSB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQgPyBSQ0NhbGxFbmRSZWFzb24uTk9fUkVTUE9OU0UgOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFO1xuICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCByZWFzb24pO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7bmnKrmjqXmipvlh7pvbkh1bmd1cFxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgcmVhc29uKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gY2FsbCBvbmh1bmd1cCBlcnJvciAtPiAke2Vycm9yPy5zdGFja31gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICAvLyDmiL/pl7TkurrlkZjkv6Hmga/lsJHkuo7kuKTkuKog5oiWIOacquaOpeWQrOeahOaYr+iHquW3se+8jOmAmuefpeaIv+mXtOeKtuaAgee7k+adn1xuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMiB8fCB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIHJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLl9nZXRUaW1lb3V0KHNlbnRUaW1lKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5aSE55CG5bey5pyJIHNlc3Npb24g77yM5LiN5YWB6K645YaN5o6l5ZCs5paw5Lya6K+d5oOF5Ya1XG4gICAqL1xuICBfX2hhbmRsZUludml0ZUluU2Vzc2lvbigpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdTdGF0ZU1hY2hpbmUgLT4gX19oYW5kbGVJbnZpdGVJblNlc3Npb24nKTtcbiAgICAvLyDkv67mlLnmiYDmnInnlKjmiLfnirbmgIHlubbmipvlh7rvvIzmuIXnqbrorqHml7blmahcbiAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLl91c2VySW5mbykge1xuICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgIC8vIOWwhuW3suWtmOWcqOeahOiuoeaXtuWZqOmDvea4heaOiVxuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICB9XG4gICAgLy8g55u05o6l57uI5q2i5b2T5YmNIHNlc3Npb24g54q25oCBXG4gICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSk7XG4gICAgLy8g5Y+R6YCB5oyC5pat5raI5oGv77yM5bm25pC65bimIOW3seaWueW/meeijCDljp/lm6BcbiAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSHVuZ3VwKHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgcmVhc29uOiBSQ0NhbGxFbmRSZWFzb24uQlVTWV9MSU5FLFxuICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Li75Yqo5ZG85Y+rIChDYWxsRW5naW5lIOWGhemDqOiwg+eUqClcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+355So5oi3IElEIOWIl+ihqFxuICAgKiBAcGFyYW0gZXh0cmEg5raI5oGv55qE5omp5bGV5L+h5oGvXG4gICAqIEBwYXJhbSBwdXNoQ29uZmlnIOenu+WKqOerr+aOqOmAgemFjee9rlxuICAgKi9cbiAgYXN5bmMgX19jYWxsKHVzZXJJZHM6IHN0cmluZ1tdLCBleHRyYTogc3RyaW5nID0gJycsIHB1c2hDb25maWc6IElQdXNoQ29uZmlnLCBpc0Nyb3NzQXBwa2V5ID0gZmFsc2UpIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gaW52aXRlIC0+IHVzZXJJZHM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCk7XG4gICAgLy8g5Y+R6YCB6YKA6K+35raI5oGvXG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NhbGxlcklkID0gdGhpcy5faW52aXRlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7IGNvZGUsIG1lc3NhZ2UgfSA9IGF3YWl0IHRoaXMuX2NhbGxNc2dIYW5kbGVyLnNlbmRJbnZpdGUoe1xuICAgICAgcm9vbVR5cGU6IGlzQ3Jvc3NBcHBrZXkgPyBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVBY3Jvc3NDYWxsIDogUkNDcm9zc0NhbGxUeXBlLlJDQ2FsbFJvb21UeXBlTm9ybWFsQ2FsbCxcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgZXh0cmEsXG4gICAgICBwdXNoQ29uZmlnLFxuICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICBpbnZpdGVVc2VySWRzOiB1c2VySWRzLmZpbHRlcigoaWQpID0+IGlkICE9PSBjdXJyZW50VXNlcklkKSxcbiAgICB9KTtcblxuICAgIHRoaXMuX2lzQ3Jvc3NBcHBrZXkgPSBpc0Nyb3NzQXBwa2V5O1xuXG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICBjb25zdCB7IHNlbnRUaW1lIH0gPSBtZXNzYWdlITtcblxuICAgICAgLyoqXG4gICAgICAgKiDot6ggYXBwa2V5IOS7heWtmOWcqOWNleiBiu+8jOWvueerryB1c2VySWQg6ZyA5Y+W5LiL5YiS57q/5ZCO6Z2i55qE6YOo5YiGXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGlkcyA9IGlzQ3Jvc3NBcHBrZXkgPyBbY3VycmVudFVzZXJJZCwgLi4uW3VzZXJJZHNbMF0uc3BsaXQoJ18nKVsxXV1dIDogW2N1cnJlbnRVc2VySWQsIC4uLnVzZXJJZHNdO1xuXG4gICAgICAvLyDpgY3ljobmm7TmlrDmiL/pl7TmiYDmnInkurrlkZjnirbmgIHjgIHlubbnu5nooqvlj6vlkK/liqjorqHml7blmahcbiAgICAgIGlkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgY29uc3QgaXNDYWxsZXIgPSB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQ7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0gPSB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHN0YXRlOiBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORyxcbiAgICAgICAgICBpc0NhbGxlcixcbiAgICAgICAgICBpc1JlbW90ZTogIWlzQ2FsbGVyLFxuICAgICAgICB9O1xuICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuXG4gICAgICAgIC8vIOWQr+WKqOWRvOWPq+i2heaXtuiuoeaXtuWZqFxuICAgICAgICBpZiAoIWlzQ2FsbGVyKSB7XG4gICAgICAgICAgdGhpcy5fdXNlclRpbWVyc1t1c2VySWRdID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICAgIC8vIOWRvOWPq+i2heaXtuWkhOeQhueKtuaAgeOAgeW5tumAmuefpSBjYWxsIOWxglxuICAgICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuXG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7bmnKrmjqXmipvlh7pvbkh1bmd1cFxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25IdW5ndXAodGhpcy5fdXNlckluZm9bdXNlcklkXSwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAgICAgLy8g5oi/6Ze05Lq65ZGY5L+h5oGv5bCR5LqO5Lik5Liq77yM6YCa55+l5oi/6Ze054q25oCBXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDov5znq6/kurrlkZjlpKfkuo4gMSDkuJTlt7HmlrnkuI3kuLrmraPlnKjpgJror53ml7bvvIzlj5HpgIEgaHVuZ3VwLCDlkYror4nov5znq6/oh6rlt7HpgIDlh7rpgJror51cbiAgICAgICAgICAgIGNvbnN0IGlzTmVlZFNlbmRIdW5ndXAgPSB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKS5sZW5ndGggPT09IDAgJiYgKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdLnN0YXRlICE9PSBSQ0NhbGxVc2VyU3RhdGUuS0VFUElORyk7XG4gICAgICAgICAgICBpZiAoaXNOZWVkU2VuZEh1bmd1cCkge1xuICAgICAgICAgICAgICB0aGlzLl9odW5ndXBIYW5kbGUoUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuV0FJVElORyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVuZENvZGUgPSBjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuUkVKRUNURURfQllfQkxBQ0tMSVNUID8gUkNDYWxsRW5kUmVhc29uLkFEREVEX1RPX0JMQUNLTElTVCA6IFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SO1xuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgZW5kQ29kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaOpeWQrFxuICAgKi9cbiAgYXN5bmMgYWNjZXB0KCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBhY2NlcHQnKTtcblxuICAgIC8vIOWPkemAgeaOpeWQrOa2iOaBr1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEFjY2VwdCh7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgfSk7XG5cbiAgICAvLyDmuIXpmaTmjqXlkKzotoXml7borqHml7blmahcbiAgICB0aGlzLl9jbGVhclRpbWVyQnlJZChjdXJyZW50VXNlcklkKTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIGNvbnN0IHsgc2VudFRpbWUgfSA9IG1lc3NhZ2UhO1xuICAgICAgdGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0gJiYgKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgICAgdGhpcy5fYmVnaW5UaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0pO1xuICAgICAgLy8g5L+u5pS55bm26YCa55+lIGNhbGwg5bGC5oi/6Ze054q25oCB5Y+Y5pu0XG4gICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdICYmICh0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdKTtcbiAgICAgIC8vIOS/ruaUueW5tumAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgY29uc3QgZW5kUmVhc29uID0gY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCA/IFJDQ2FsbEVuZFJlYXNvbi5BRERFRF9UT19CTEFDS0xJU1QgOiBSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUjtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZFJlYXNvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOe+pOWRvOWPq+S4ree7p+e7remCgOivt1xuICAgKiBAcGFyYW0gdXNlcklkcyDooqvpgoDor7fnlKjmiLcgSUQg5YiX6KGoXG4gICAqL1xuICBhc3luYyBpbnZpdGUodXNlcklkczogc3RyaW5nW10sIG9wdGlvbnM6IElJbnZpdGVPcHRpb25zID0ge30pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBpZiAodGhpcy5fY29udmVyc2F0aW9uVHlwZSAhPT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkNPTlZFUlNBVElPTl9OT1RfR1JPVVBfRVJST1IgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gaW52aXRlIC0+IHVzZXJJZHM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCk7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgZXhpc3RlZFVzZXJJZHMgPSBPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbyk7XG4gICAgY29uc3QgZXhpc3RlZFVzZXJQb2ZpbGVzOiBJRXhpc3RlZFVzZXJQb2ZpbGVzW10gPSBleGlzdGVkVXNlcklkcy5tYXAoKHVzZXJJZCkgPT4ge1xuICAgICAgbGV0IGNhbGxTdGF0dXMgPSBNc2dDYWxsU3RhdHVzLkNPTk5FQ1RFRDtcbiAgICAgIC8vIOWMheWQq+iiq+mCgOivt+iAhe+8jOaIluiAheeUqOaIt+eKtuaAgeS4uiB3YXRpbmcg5pe277yM54q25oCB5Li6IOWTjemTg1xuICAgICAgaWYgKHVzZXJJZHMuaW5jbHVkZXModXNlcklkKSB8fCB0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID09PSBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORykge1xuICAgICAgICBjYWxsU3RhdHVzID0gTXNnQ2FsbFN0YXR1cy5SSU5HSU5HO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgICAgY2FsbFN0YXR1cyxcbiAgICAgICAgbWVkaWFJZDogdXNlcklkLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgZXh0cmEgPSAnJywgcHVzaENvbmZpZyB9ID0gb3B0aW9ucztcblxuICAgIC8vIOWPkemAgeS6uuWRmOWPmOabtOa2iOaBr1xuICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZE1lbWViZXJNb2RpZnkoe1xuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICBleHRyYSxcbiAgICAgIHB1c2hDb25maWcsXG4gICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgIC8vIOmZpOiHquW3se+8jOWFtuS7luaJgOacieS6uuWdh+mcgOaUtuWIsCBtb2RpZnkg5raI5oGv77yM5Lul5q2k5pu05paw54q25oCBXG4gICAgICBpbnZpdGVVc2VySWRzOiB1c2VySWRzLmZpbHRlcigoaWQpID0+IGlkICE9PSBjdXJyZW50VXNlcklkKSxcbiAgICAgIGNhbGxlcklkOiB0aGlzLmdldENhbGxlcklkKCksXG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMsXG4gICAgICBkaXJlY3Rpb25hbFVzZXJJZExpc3Q6IFsuLi5leGlzdGVkVXNlcklkcywgLi4udXNlcklkc10uZmlsdGVyKChpZCkgPT4gaWQgIT09IGN1cnJlbnRVc2VySWQpLFxuICAgIH0pO1xuXG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICBjb25zdCB7IHNlbnRUaW1lIH0gPSBtZXNzYWdlITtcbiAgICAgIC8vIOS/ruaUueiiq+mCgOivt+S6uueKtuaAge+8jOW5tumAmuefpVxuICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSA9IHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc3RhdGU6IFJDQ2FsbFVzZXJTdGF0ZS5XQUlUSU5HLFxuICAgICAgICAgIGlzQ2FsbGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1JlbW90ZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgICAgLy8g5ZCv5Yqo5ZG85Y+r6K6h5pe25ZmoXG4gICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgLy8g5ZG85Y+r6LaF5pe25aSE55CG54q25oCB44CB5bm26YCa55+lIGNhbGwg5bGCXG4gICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bdXNlcklkXSwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG5cbiAgICAgICAgICAvLyDlkbzlj6votoXml7bmnKrmjqXmipvlh7pvbkh1bmd1cFxuICAgICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSHVuZ3VwKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuXG4gICAgICAgICAgZGVsZXRlIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF07XG4gICAgICAgICAgLy8g5oi/6Ze05Lq65ZGY5L+h5oGv5bCR5LqO5Lik5Liq77yM6YCa55+l5oi/6Ze054q25oCBXG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3VzZXJJbmZvKS5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuRU5ELCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX2dldFRpbWVvdXQoc2VudFRpbWUpKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDpgJrnn6XkurrlkZjlj5jmm7RcbiAgICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0gPSB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHN0YXRlOiBSQ0NhbGxVc2VyU3RhdGUuTk9ORSxcbiAgICAgICAgICBpc0NhbGxlcjogZmFsc2UsXG4gICAgICAgICAgaXNSZW1vdGU6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuXG4gICAgICAgIGNvbnN0IGVuZFJlYXNvbiA9IGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5SRUpFQ1RFRF9CWV9CTEFDS0xJU1QgPyBSQ0NhbGxFbmRSZWFzb24uQURERURfVE9fQkxBQ0tMSVNUIDogUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1I7XG4gICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCBlbmRSZWFzb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfaHVuZ3VwSGFuZGxlKHJlYXNvbjogUkNDYWxsRW5kUmVhc29uKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgLy8g5Y+R6YCB5oyC5pat57G75Z6L5raI5oGvXG4gICAgbGV0IGNvZGUgPSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUztcblxuICAgIGNvbnN0IGhhbmd1cFBhcmFtcyA9IHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgcmVhc29uLFxuICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgICBwdXNoQ29uZmlnOiB0aGlzLl9odW5ndXBQdXNoQ29uZmlnLFxuICAgIH07XG5cbiAgICBpZiAocmVhc29uID09PSBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMKSB7XG4gICAgICAvLyDlt7Hnq6/ooqvlpJrnq6/liqDlhaUgUlRDIOaIv+mXtOaMpOaOieWQju+8jOS4jeWGjeetieWPkeaMguaWrea2iOaBr+eahOe7k+aenO+8jOmYsuatoui1sCB1c2VyTGVhdmUg5a+86Ie05oyC5pat5Y6f5Zug5LiN5YeG56GuXG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSHVuZ3VwKGhhbmd1cFBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgY29kZTogbXNnQ29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEh1bmd1cChoYW5ndXBQYXJhbXMpO1xuICAgICAgY29kZSA9IG1zZ0NvZGU7XG4gICAgfVxuXG4gICAgdGhpcy5fZW5kVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAvLyDmm7TmlrDpgJror53kurrlkZjnirbmgIHjgIHpgJror53nu5PmnZ/ml7bpl7Qg5bm26YCa55+lXG4gICAgZm9yIChjb25zdCB1c2VySWQgaW4gdGhpcy5fdXNlckluZm8pIHtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORTtcbiAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIHJlYXNvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bdXNlcklkXSk7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pLmxlbmd0aCA8IDIpIHtcbiAgICAgIC8vIOa4heepuuWGheWtmOaAgeaVsOaNru+8jOW5tumAmuefpVxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgcmVhc29uKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5oyC5patXG4gICAqL1xuICBhc3luYyBodW5ndXAoKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgJ1tSQ0NhbGxTdGF0ZU1hY2hpbmVdIGh1bmd1cCcpO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOm7mOiupOaMguaWrSByZWFzb24g5Li66YCa6K+d6L+H56iL5Lit77yM5bex5pa55q2j5bi45Y+W5raI6YCa6K+dXG4gICAgbGV0IHJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVA7XG4gICAgLyoqXG4gICAgICog6Iul6LaF5pe26K6h5pe25Zmo5a2Y5ZyoLCDlt7HmlrnkuLogY2FsbGVyIOWOn+WboOS4uuW3seaWueWPlua2iOmAmuivnSxcbiAgICAgKiDlt7HmlrnkuLogY2FsbGVlIOS4lOacqui/m+WFpemAmuivneS4re+8jOWOn+WboOS4uuW3seaWueaLkue7nemAmuivnVxuICAgICAqL1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VyVGltZXJzKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0uaXNDYWxsZXIpIHtcbiAgICAgICAgcmVhc29uID0gUkNDYWxsRW5kUmVhc29uLkNBTkNFTDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0uc3RhdGUgPT09IFJDQ2FsbFVzZXJTdGF0ZS5XQUlUSU5HKSB7XG4gICAgICAgIHJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5SRUpFQ1Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g5riF6Zmk5omA5pyJ6LaF5pe26K6h5pe25ZmoXG4gICAgZm9yIChjb25zdCB1c2VySWQgaW4gdGhpcy5fdXNlclRpbWVycykge1xuICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2h1bmd1cEhhbmRsZShyZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIOS/ruaUuemAmuivneWqkuS9k+exu+Wei1xuICAgKiBAcGFyYW0gbWVkaWFUeXBlIFJDQ2FsbE1lZGlhVHlwZS5BVURJTyDmlLnkuLrpn7PpopHpgJror50gfCBSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8g5pS55Li66Z+z6KeG6aKR6YCa6K+dXG4gICAqL1xuICBhc3luYyBjaGFuZ2VNZWRpYVR5cGUobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gY2hhbmdlTWVkaWFUeXBlIC0+IG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kTWVkaWFNb2RpZnkoe1xuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB1c2VySWRzOiB0aGlzLmdldFJlbW90ZVVzZXJJZHMoKSxcbiAgICB9KTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX21lZGlhVHlwZSA9IG1lZGlhVHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOeUqOaIt+WKoOWFpemAmuivneihpeWBv+acuuWItu+8iHJ0YyB1c2VySm9pbiDkuovku7bop6blj5HvvIlcbiAgICog5Li75Y+r5ZG85Y+r5ZCO77yM5pyq5pS25Yiw6KKr5Y+rIGFjY2VwdCDmtojmga/vvIzkvYbmlLbliLDkuoYgdXNlckpvaW4g5ZCM5qC36KGl5YG/5pu05paw55So5oi344CB5oi/6Ze054q25oCB44CB5ZG85Y+r6K6h5pe25ZmoXG4gICAqL1xuICB1c2VySm9pbih1c2VySWRzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsU3RhdGVNYWNoaW5lXSB1c2VySm9pbiAtPiB1c2VySWRzOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWApO1xuICAgIC8vIOW7tui/nyAzMDBtcyDpmLLmraIgdXNlckppb24g5ZKMIGFjY2VwdCDmtojmga/pg73mnInnmoTmg4XlhrXkuIvvvIwgdXNlckpvaW4g5q+UIGFjY2VwdCDlhYjliLBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJJbmZvID0gdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgLy8g5pu05paw5Lq65ZGY54q25oCBICgvLyDnvqTnu4TpgJror53ml7bvvJogQeWQkULjgIFD5Y+R6LW36YCa6K+dIELlhYjmjqXlkKzvvIxD5ZCO5o6l5ZCs77yM6L+Z5pe2QuayoeaciUPnmoR1c2VySWTlr7nlupTnmoRfdXNlckluZm/vvIzmiYDku6Xov5nph4zliKTmlq3kuIDkuIspXG4gICAgICAgIGlmICh1c2VySW5mbyAmJiB1c2VySW5mby5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpIHtcbiAgICAgICAgICB1c2VySW5mby5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HO1xuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh1c2VySW5mbyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5pu05paw5oi/6Ze054q25oCBXG4gICAgICAgIGlmICh0aGlzLl9zZXNzaW9uU3RhdGUgIT09IFJDQ2FsbFNlc3Npb25TdGF0ZS5LRUVQSU5HKSB7XG4gICAgICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLktFRVBJTkcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIOWBnOatouW5tua4hemZpOWRvOWPq+iuoeaXtuWZqFxuICAgICAgICB0aGlzLl9jbGVhclRpbWVyQnlJZCh1c2VySWQpO1xuICAgICAgfSk7XG4gICAgfSwgMzAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnlKjmiLfnprvlvIDpgJror53ooaXlgb/mnLrliLbvvIhydGMgdXNlckxlYXZl44CBa2lja09mZiDkuovku7bop6blj5HvvIlcbiAgICog6YCa6K+d5Lit6L+c56uv55So5oi35oyC5pat77yM5oyC5pat5raI5oGv5pyq5Yiw77yM5L2G5piv55uR5ZCs5YiwIHJ0YyB1c2VyTGVhdmUg5ZCM5qC36KGl5YG/5pu05paw55So5oi344CB5oi/6Ze054q25oCBXG4gICAqL1xuICB1c2VyTGVhdmUodXNlcklkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gdXNlckxlYXZlIC0+IHVzZXJJZHM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCk7XG4gICAgLy8g5bu26L+fIDMwMG1zIOmYsuatoiB1c2VyTGVhdmUg5ZKMIGh1bmd1cCDmtojmga/pg73mnInnmoTmg4XlhrXkuIvvvIx1c2VyTGVhdmUg5q+UIGh1bmd1cCDlhYjliLBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJJbmZvID0gdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgLy8g5pu05paw5Lq65ZGY54q25oCBXG4gICAgICAgIGlmICh1c2VySW5mbyAmJiB1c2VySW5mby5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLk5PTkUpIHtcbiAgICAgICAgICB1c2VySW5mby5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FO1xuICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh1c2VySW5mbywgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVApO1xuICAgICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSHVuZ3VwKHVzZXJJbmZvLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0hBTkdVUCk7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF07XG4gICAgICAgIH1cbiAgICAgICAgLy8g5Li75Y+r5pa5576k6IGK6YKA6K+36KKr5Y+r5pa55ZCO56a757q/77yM5Li75Y+r5pa55q2k5pe25Li6562J5b6F54q25oCB5ZCO5LiN5YaN5LiK57q/77yM6KKr5Y+r5pa55o6l5ZCs5ZCO5oyC5pat6Iez5Ymp5L2Z5LiA5Lq65pe2562J5b6F5LiA5YiG6ZKf5ZCO5oyC5patXG4gICAgICAgIGNvbnN0IHJlbW90ZVVzZXJzVGltZXIgPSBuZXcgVGltZXIoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbW90ZVVzZXJzID0gdGhpcy5nZXRSZW1vdGVVc2VycygpO1xuICAgICAgICAgIC8vIOi/nOerr+WPquacieS4gOS4queUqOaIt+S4lOaYr+etieW+heeKtuaAge+8jOetieW+heS4gOWIhumSn+WQjuaMguaWrVxuICAgICAgICAgIGlmIChyZW1vdGVVc2Vycy5sZW5ndGggPT09IDEgJiYgcmVtb3RlVXNlcnNbMF0uc3RhdGUgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2h1bmd1cEhhbmRsZShSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05FVFdPUktfRVJST1IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgNjAwMDApO1xuICAgICAgICAvLyDmm7TmlrDmiL/pl7TnirbmgIFcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3VzZXJJbmZvKS5sZW5ndGggPCAyICYmIHRoaXMuX3Nlc3Npb25TdGF0ZSAhPT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgICAgIHRoaXMuX2VuZFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCAzMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwg5bGC5bex5pa55byC5bi45aSx6LSl5ZCO6LCD55So55qE5pa55rOVXG4gICAqIOinpuWPkeaXtuacuu+8mumfs+inhumikeacjeWKoeW8guW4uOOAgeiOt+WPlui1hOa6kOWksei0peOAgeWKoOWFpSBSVEMg5oi/6Ze05aSx6LSl44CB5Y+R5biDfOiuoumYheWksei0pVxuICAgKi9cbiAgY2xvc2UocmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pIHtcbiAgICB0aGlzLl9odW5ndXBIYW5kbGUocmVhc29uKTtcbiAgfVxuXG4gIHNldEh1bmd1cFB1c2hDb25maWcocHVzaENvbmZpZzogSVB1c2hDb25maWcpIHtcbiAgICB0aGlzLl9odW5ndXBQdXNoQ29uZmlnID0gcHVzaENvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53llK/kuIDmoIfor4ZcbiAgICovXG4gIGdldENhbGxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jYWxsSWQ7XG4gIH1cblxuICAvKipcbiAgICog5aSa57uE57uHIElEXG4gICAqL1xuICBnZXRDaGFubmVsSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbm5lbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIOebruaghyBJRO+8jOWNleWRvOWvueaWueS6uuWRmCBJZCwg576k5ZG8576k57uEIElkXG4gICAqL1xuICBnZXRUYXJnZXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YXJnZXRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bkvJror53nsbvlnotcbiAgICovXG4gIGdldENvbnZlcnNhdGlvblR5cGUoKTogQ29udmVyc2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnZlcnNhdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6L+c56uv5oiQ5ZGYIElEIOWIl+ihqFxuICAgKi9cbiAgZ2V0UmVtb3RlVXNlcklkcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYWxsVXNlcklkcyA9IE9iamVjdC5rZXlzKHRoaXMuX3VzZXJJbmZvKTtcbiAgICBjb25zdCByZW1vdGVVc2VySWRzID0gYWxsVXNlcklkcy5maWx0ZXIoKGlkKSA9PiB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpICE9PSBpZCk7XG4gICAgcmV0dXJuIHJlbW90ZVVzZXJJZHM7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6L+c56uv5oiQ5ZGY5L+h5oGv5YiX6KGoXG4gICAqL1xuICBnZXRSZW1vdGVVc2VycygpOiBJVXNlckRhdGFbXSB7XG4gICAgY29uc3QgcmVtb3RlVXNlcjogSVVzZXJEYXRhW10gPSBbXTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBmb3IgKGNvbnN0IHVpZCBpbiB0aGlzLl91c2VySW5mbykge1xuICAgICAgY29uc3QgeyB1c2VySWQgfSA9IHRoaXMuX3VzZXJJbmZvW3VpZF07XG4gICAgICBpZiAodXNlcklkICE9PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgIHJlbW90ZVVzZXIucHVzaCh0aGlzLl91c2VySW5mb1t1aWRdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlbW90ZVVzZXI7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5oi/6Ze054q25oCBXG4gICAqL1xuICBnZXRTdGF0ZSgpOiBSQ0NhbGxTZXNzaW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uU3RhdGUgPT09IG51bGwgPyBSQ0NhbGxTZXNzaW9uU3RhdGUuRU5EIDogdGhpcy5fc2Vzc2lvblN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluS6uuWRmOeKtuaAgVxuICAgKi9cbiAgZ2V0VXNlclN0YXRlKHVzZXJJZDogc3RyaW5nKTogUkNDYWxsVXNlclN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlckluZm9bdXNlcklkXT8uc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Lya6K+d5Y+R6LW36ICFIElkXG4gICAqL1xuICBnZXRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jYWxsZXJJZCE7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5b2T5qyh5Lya6K+d6YKA6K+36ICFIElkXG4gICAqL1xuICBnZXRJbnZpdGVySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faW52aXRlcklkITtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3pgJror53lqpLkvZPnsbvlnotcbiAgICovXG4gIGdldE1lZGlhVHlwZSgpOiBSQ0NhbGxNZWRpYVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9tZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5oyC5pat5ZCO5Y+v6LCD55SoXG4gICAqL1xuICBnZXRTdW1tYXJ5KCk6IElFbmRTdW1tYXJ5IHtcbiAgICAvLyDpgJror53ml7bpl7TorqHnrpdcbiAgICBjb25zdCBiZWdpblRpbWVzdGFtcCA9IHRoaXMuX2JlZ2luVGltZXN0YW1wO1xuICAgIGNvbnN0IGVuZFRpbWVzdGFtcCA9IHRoaXMuX2VuZFRpbWVzdGFtcDtcbiAgICBsZXQgZHVyYXRpb24gPSAwO1xuICAgIGlmIChlbmRUaW1lc3RhbXAgPiBiZWdpblRpbWVzdGFtcCAmJiBiZWdpblRpbWVzdGFtcCAhPT0gMCkge1xuICAgICAgZHVyYXRpb24gPSBlbmRUaW1lc3RhbXAgLSBiZWdpblRpbWVzdGFtcDtcbiAgICB9XG5cbiAgICBjb25zdCBzdW1tYXJ5ID0ge1xuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICBiZWdpblRpbWVzdGFtcCxcbiAgICAgIGVuZFRpbWVzdGFtcCxcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgZW5kUmVhc29uOiB0aGlzLl9lbmRSZWFzb24hLFxuICAgIH07XG5cbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gZ2V0U3VtbWFyeSAtPiBzdW1tYXJ5OiAke0pTT04uc3RyaW5naWZ5KHN1bW1hcnkpfWApO1xuICAgIHJldHVybiBzdW1tYXJ5O1xuICB9XG59XG4iLCIvKipcbiAqIOmAmuivneWqkuS9k+exu+Wei1xuICovXG5leHBvcnQgZW51bSBSQ0NhbGxNZWRpYVR5cGUge1xuICAvKipcbiAgICog6Z+z6aKR6YCa6K+dXG4gICAqL1xuICBBVURJTyA9IDEsXG4gIC8qKlxuICAgKiDop4bpopHpgJror51cbiAgICovXG4gIEFVRElPX1ZJREVPXG59XG4iLCJleHBvcnQgZW51bSBNZW1iZXJNb2RpZnlUeXBlIHtcbiAgQUREID0gMSxcbiAgUkVNT1ZFXG59XG4iLCIvKipcbiAqIOW5s+WPsFxuICovXG5leHBvcnQgZW51bSBQbGF0Zm9ybSB7XG4gIFdFQiA9ICdXZWInLFxuICBJT1MgPSAnaU9TJyxcbiAgQU5EUk9JRCA9ICdBbmRyb2lkJ1xufVxuIiwiaW1wb3J0IHtcbiAgQ29udmVyc2F0aW9uVHlwZSwgSUxvZ2dlciwgSVJlY2VpdmVkTWVzc2FnZSwgUlRDUGx1Z2luQ29udGV4dCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgQ2FsbFJlbW90ZUVuZFJlYXNvbiwgUkNDYWxsRW5kUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxFbmRSZWFzb24nO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsTWVzc2FnZVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IElIdW5ndXBNc2dDb250ZW50LCBJSW52aXRlTXNnQ29udGVudCwgSU1lZGlhTW9kaWZ5TXNnQ29udGVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9JTWVzc2FnZUhhbmRsZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIElPZmZsaW5lUmVjb3JkIHtcbiAgY2hhbm5lbElkOiBzdHJpbmcsXG4gIGNvbnZlcnNhdGlvblR5cGU6IENvbnZlcnNhdGlvblR5cGUsXG4gIHRhcmdldElkOiBzdHJpbmcsXG4gIG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLFxuICBjYWxsSWQ6IHN0cmluZyxcbiAgaW52aXRlcklkOiBzdHJpbmcsXG4gIGVuZFJlYXNvbjogUkNDYWxsRW5kUmVhc29uLFxuICBiZWdpblRpbWVzdGFtcDogbnVtYmVyLFxuICBlbmRUaW1lc3RhbXA6IG51bWJlcixcbiAgZHVyYXRpb246IG51bWJlclxufVxuXG4vKipcbiAqIOemu+e6v+mAmuivneiusOW9leWZqFxuICovXG5leHBvcnQgY2xhc3MgT2ZmbGluZVJlY29yZGVyIHtcbiAgcHJpdmF0ZSBfbWVzc2FnZXM6IElSZWNlaXZlZE1lc3NhZ2VbXSB8IFtdID0gW11cblxuICBwcml2YXRlIF9jaGFubmVsSWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9jb252ZXJzYXRpb25UeXBlITogQ29udmVyc2F0aW9uVHlwZVxuXG4gIHByaXZhdGUgX3RhcmdldElkITogc3RyaW5nXG5cbiAgcHJpdmF0ZSBfbWVkaWFUeXBlITogUkNDYWxsTWVkaWFUeXBlXG5cbiAgcHJpdmF0ZSBfY2FsbElkITogc3RyaW5nXG5cbiAgcHJpdmF0ZSBfY2FsbGVySWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9pbnZpdGVySWQhOiBzdHJpbmdcblxuICBwcml2YXRlIF9lbmRSZWFzb24hOiBSQ0NhbGxFbmRSZWFzb25cblxuICBwcml2YXRlIF9iZWdpblRpbWVzdGFtcDogbnVtYmVyID0gMFxuXG4gIHByaXZhdGUgX2VuZFRpbWVzdGFtcDogbnVtYmVyID0gMFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBJTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uUmVjb3JkOiAocmVjb3JkOiBJT2ZmbGluZVJlY29yZCkgPT4gdm9pZCxcbiAgKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiDliLAgaW52aXRlIHwgbWVtYmVyTW9kaWZ5IOe7k+adn1xuICAgKiDljp/lm6DmoLnmja7lt7HmlrnmmK/lkKbkuLrkuLvlj6vvvIzkuLvlj6vkuLrov5znq6/mnKrmjqXlkKwg6KKr5Y+r6KKr5bex56uv5pyq5o6l5ZCsXG4gICAqL1xuICBwcml2YXRlIF9kb0ludml0ZShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgc2VuZGVyVXNlcklkLCBjb250ZW50LFxuICAgIH0gPSBtZXNzYWdlO1xuICAgIGNvbnN0IHsgY2FsbElkLCBtZWRpYVR5cGUgfSA9IGNvbnRlbnQgYXMgSUludml0ZU1zZ0NvbnRlbnQ7XG4gICAgdGhpcy5fY2hhbm5lbElkID0gY2hhbm5lbElkITtcbiAgICB0aGlzLl9jb252ZXJzYXRpb25UeXBlID0gY29udmVyc2F0aW9uVHlwZTtcbiAgICB0aGlzLl90YXJnZXRJZCA9IHRhcmdldElkO1xuICAgIHRoaXMuX2NhbGxJZCA9IGNhbGxJZDtcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgY29uc3QgaXNDYWxsZXIgPSBzZW5kZXJVc2VySWQgPT09IGN1cnJlbnRVc2VySWQ7XG4gICAgdGhpcy5faW52aXRlcklkID0gc2VuZGVyVXNlcklkO1xuICAgIHRoaXMuX2VuZFJlYXNvbiA9IGlzQ2FsbGVyID8gUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSA6IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0U7XG4gICAgdGhpcy5fY2FuR2VuUmVjb3JkKCk7XG4gIH1cblxuICAvKipcbiAgICog5YiwIGludml0ZSB8IG1lbWJlck1vZGlmeSDnu5PmnZ9cbiAgICog5Y6f5Zug5qC55o2u5bex5pa55piv5ZCm5Li65Li75Y+r77yM5Li75Y+r5Li66L+c56uv5pyq5o6l5ZCsIOiiq+WPq+iiq+W3seerr+acquaOpeWQrFxuICAgKi9cbiAgcHJpdmF0ZSBfZG9NZW1iZXJNb2RpZnkobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIHRoaXMuX2RvSW52aXRlKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIOeUqCBpbnZpdGUgfCBtZW1iZXJNb2RpZnkg6K6h566X55qE56a757q/6K6w5b2VXG4gICAqL1xuICBwcml2YXRlIF9kb1JpbmdpbmcobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIHRoaXMuX2NhbkdlblJlY29yZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIsCBhY2NlcHQg6K+05piO6YCa6K+d5bey5bu656uLXG4gICAqIOWOn+WboOm7mOiupOW3seaWueato+W4uOaMguaWrVxuICAgKi9cbiAgcHJpdmF0ZSBfZG9BY2NlcHQobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIHRoaXMuX2VuZFJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVA7XG4gICAgdGhpcy5fYmVnaW5UaW1lc3RhbXAgPSBtZXNzYWdlLnNlbnRUaW1lO1xuICAgIHRoaXMuX2NhbkdlblJlY29yZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIsCBodW5ndXAg6K+05piO5Li65q2j5bi45oyC5patXG4gICAqIOWOn+WboOWPlua2iOaBr+S9k+mHjOaMguaWreWOn+WboFxuICAgKi9cbiAgcHJpdmF0ZSBfZG9IdW5ndXAobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgY29udGVudCwgc2VudFRpbWUsIHNlbmRlclVzZXJJZCB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCB7IHJlYXNvbiB9ID0gY29udGVudCBhcyBJSHVuZ3VwTXNnQ29udGVudDtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCBpc1NlbGZTZW5kID0gc2VuZGVyVXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgIHRoaXMuX2VuZFJlYXNvbiA9IGlzU2VsZlNlbmQgPyByZWFzb24gOiBDYWxsUmVtb3RlRW5kUmVhc29uW3JlYXNvbl07XG4gICAgdGhpcy5fZW5kVGltZXN0YW1wID0gc2VudFRpbWU7XG5cbiAgICB0aGlzLl9jYW5HZW5SZWNvcmQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj6rkv67mlLnpgJror53nsbvlnotcbiAgICovXG4gIHByaXZhdGUgX2RvTWVkaWFNb2RpZnkobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgY29udGVudCB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCB7IG1lZGlhVHlwZSB9ID0gY29udGVudCBhcyBJTWVkaWFNb2RpZnlNc2dDb250ZW50O1xuICAgIHRoaXMuX21lZGlhVHlwZSA9IG1lZGlhVHlwZTtcbiAgICB0aGlzLl9jYW5HZW5SZWNvcmQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhbkdlblJlY29yZCgpIHtcbiAgICBpZiAodGhpcy5fbWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBsZXQgZHVyYXRpb24gPSAwO1xuICAgICAgY29uc3QgaXNOZWVkRHVyYXRpb25SZWFzb24gPSBbXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5IQU5HVVAsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfSEFOR1VQLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX09USEVSX0NMSUVOVF9KT0lORURfQ0FMTCxcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVIsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfS0lDS0VEX0JZX1NFUlZFUixcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLkFDQ0VQVF9TWVNURU1fQ0FMTCxcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9BQ0NFUFRfU1lTVEVNX0NBTEwsXG4gICAgICBdLmluY2x1ZGVzKHRoaXMuX2VuZFJlYXNvbik7XG4gICAgICBpZiAoaXNOZWVkRHVyYXRpb25SZWFzb24pIHtcbiAgICAgICAgZHVyYXRpb24gPSB0aGlzLl9lbmRUaW1lc3RhbXAgLSB0aGlzLl9iZWdpblRpbWVzdGFtcDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX29uUmVjb3JkKHtcbiAgICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICAgIGludml0ZXJJZDogdGhpcy5faW52aXRlcklkLFxuICAgICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgICAgZW5kUmVhc29uOiB0aGlzLl9lbmRSZWFzb24sXG4gICAgICAgIGJlZ2luVGltZXN0YW1wOiB0aGlzLl9iZWdpblRpbWVzdGFtcCxcbiAgICAgICAgZW5kVGltZXN0YW1wOiB0aGlzLl9lbmRUaW1lc3RhbXAsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25SZWN2T2ZmbGluZU1zZ3MobWVzc2FnZXM6IElSZWNlaXZlZE1lc3NhZ2VbXSkge1xuICAgIHRoaXMuX21lc3NhZ2VzID0gbWVzc2FnZXM7XG4gICAgZG8ge1xuICAgICAgY29uc3QgbXNnID0gdGhpcy5fbWVzc2FnZXMuc2hpZnQoKSE7XG4gICAgICBjb25zdCB7IG1lc3NhZ2VUeXBlLCBjb250ZW50OiB7IGNhbGxJZCB9IH0gPSBtc2c7XG4gICAgICBzd2l0Y2ggKG1lc3NhZ2VUeXBlKSB7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNJbnZpdGU6XG4gICAgICAgICAgdGhpcy5fZG9JbnZpdGUobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ1Jpbmdpbmc6XG4gICAgICAgICAgdGhpcy5fZG9SaW5naW5nKG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNBY2NlcHQ6XG4gICAgICAgICAgdGhpcy5fZG9BY2NlcHQobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbTpcbiAgICAgICAgICB0aGlzLl9kb01lbWJlck1vZGlmeShtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVkaWE6XG4gICAgICAgICAgdGhpcy5fZG9NZWRpYU1vZGlmeShtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwOlxuICAgICAgICAgIHRoaXMuX2RvSHVuZ3VwKG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtPZmZsaW5lUmVjb3JkZXJdIG9uUmVjdk9mZmxpbmVNc2dzIC0+IHVuZXhwZWN0ZWQgbWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShtc2cpfWApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKHRoaXMuX21lc3NhZ2VzLmxlbmd0aCA+IDApO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb252ZXJzYXRpb25UeXBlLCBFcnJvckNvZGUsIEV2ZW50RW1pdHRlciwgSUxvZ2dlciwgSVB1c2hDb25maWcgYXMgSUVuZ2luZVB1c2hDb25maWcsIElSZWNlaXZlZE1lc3NhZ2UsIElSdW50aW1lLCBJU2VuZE1zZ09wdGlvbnMsIFJUQ1BsdWdpbkNvbnRleHQsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IE1lbWJlck1vZGlmeVR5cGUgfSBmcm9tICcuL2VudW1zL01lbWJlck1vZGlmeVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsRXJyb3JDb2RlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxDb2RlJztcbmltcG9ydCB7IFJDQ2FsbE1lc3NhZ2VUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZSc7XG5pbXBvcnQgeyBJVXNlclByb2ZpbGUgfSBmcm9tICcuL2ludGVyZmFjZXMvSVN0YXRlTWFjaGluZSc7XG5pbXBvcnQge1xuICBJQWNjZXB0TXNnQ29udGVudCwgSUFjY2VwdE1zZ09wdGlvbnMsIElDYWxsTXNnT3B0aW9uLCBJSHVuZ3VwTXNnQ29udGVudCwgSUh1bmd1cE1zZ09wdGlvbnMsXG4gIElJbnZpdGVNc2dDb250ZW50LCBJSW52aXRlTXNnT3B0aW9ucywgSU1lZGlhTW9kaWZ5TXNnQ29udGVudCwgSU1lZGlhTW9kaWZ5TXNnT3B0aW9ucywgSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQsXG4gIElNZW1iZXJNb2RpZnlNc2dPcHRpb25zLCBJTXNnTGlzdGVuZXIsIElSaW5naW5nTXNnQ29udGVudCwgSVJpbmdpbmdNc2dPcHRpb25zLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSU1lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnLi9lbnVtcy9QbGF0Zm9ybSc7XG5pbXBvcnQgeyBnZXRDYWxsRGV2aWNlSWQgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHsgSU9mZmxpbmVSZWNvcmQsIE9mZmxpbmVSZWNvcmRlciB9IGZyb20gJy4vT2ZmbGluZVJlY29yZGVyJztcbmltcG9ydCB7IFJDQ2FsbFN0YXRlTWFjaGluZSB9IGZyb20gJy4uJztcblxuY29uc3QgY2FsbE1zZ1R5cGVzID0gWydSQzpWQ0FjY2VwdCcsICdSQzpWQ1JpbmdpbmcnLCAnUkM6VkNTdW1tYXJ5JywgJ1JDOlZDSGFuZ3VwJywgJ1JDOlZDSW52aXRlJywgJ1JDOlZDTW9kaWZ5TWVkaWEnLCAnUkM6VkNNb2RpZnlNZW0nXTtcblxudHlwZSBNc2dMaXN0ZW5lcktleXMgPSBrZXlvZiBJTXNnTGlzdGVuZXJcblxuaW50ZXJmYWNlIElNc2dCdWZmZXJJdGVtIHtcbiAgbWFya1RpbWU6IG51bWJlcixcbiAgbXNnOiBJUmVjZWl2ZWRNZXNzYWdlXG59XG5cbmNvbnN0IEVuZ2luZUVycm9yQ29kZVRvQ2FsbEVycm9yQ29kZTogeyBba2V5OiBudW1iZXJdOiBSQ0NhbGxFcnJvckNvZGUgfSA9IHtcbiAgW0Vycm9yQ29kZS5SRUpFQ1RFRF9CWV9CTEFDS0xJU1RdOiBSQ0NhbGxFcnJvckNvZGUuUkVKRUNURURfQllfQkxBQ0tMSVNULFxuICBbRXJyb3JDb2RlLk5PVF9JTl9HUk9VUF06IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fR1JPVVAsXG59O1xuXG4vKipcbiAqIOa2iOaBr+aOpeaUtuWkhOeQhjog5Zyo57q/5raI5oGv44CB56a757q/5raI5oGvXG4gKiDlj5HpgIHmtojmga/lpITnkIY6IOWPkemAgeS4jeWQjOexu+Wei+a2iOaBr+WwgeijhVxuICovXG5leHBvcnQgY2xhc3MgQ2FsbE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSBfd2F0Y2hlcnM6IElNc2dMaXN0ZW5lciA9IHt9XG5cbiAgcHJpdmF0ZSBfdXNlckluZm86IElVc2VyUHJvZmlsZSA9IHt9XG5cbiAgcHJpdmF0ZSBfbXNnQnVmZmVyTGlzdDogSU1zZ0J1ZmZlckl0ZW1bXSA9IFtdXG5cbiAgcHJpdmF0ZSBfaGFkSGFuZGxlTXNnVGltZXI6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIHByaXZhdGUgX29mZmxpbmVSZWNvcmRlciE6IE9mZmxpbmVSZWNvcmRlclxuXG4gIHByaXZhdGUgX2RldmljZUlkOiBzdHJpbmcgPSAnJ1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBJTG9nZ2VyLFxuICAgIC8qKlxuICAgICAqIOemu+e6v+a2iOaBr+WkhOeQhuaXtumXtOmXtOmalFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29mZmxpbmVNc2dJdHY6IG51bWJlciA9IDYwICogMTAwMCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9nZXRTdGF0ZU1hY2hpbmU6IChjYWxsSWQ6IHN0cmluZykgPT4gUkNDYWxsU3RhdGVNYWNoaW5lIHwgbnVsbCxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBkZXZpY2VJZFxuICAgIHRoaXMuX2RldmljZUlkID0gZ2V0Q2FsbERldmljZUlkKF9ydW50aW1lKTtcbiAgICAvLyDlpITnkIbmtojmga/mlLblj5FcbiAgICB0aGlzLl9jb250ZXh0Lm9ubWVzc2FnZSA9IHRoaXMuX29uTWVzc2FnZS5iaW5kKHRoaXMpO1xuICAgIC8vIOWkhOeQhuemu+e6v+a2iOaBr+iusOW9lVxuICAgIHRoaXMuX29mZmxpbmVSZWNvcmRlciA9IG5ldyBPZmZsaW5lUmVjb3JkZXIodGhpcy5fY29udGV4dCwgdGhpcy5fbG9nZ2VyLCAocmVjb3JkOiBJT2ZmbGluZVJlY29yZCkgPT4ge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gb2ZmbGluZVJlY29yZGVyIC0+ICR7SlNPTi5zdHJpbmdpZnkocmVjb3JkKX1gKTtcbiAgICAgIHRoaXMuX3dhdGNoZXJzLm9uT2ZmbGluZVJlY29yZCAmJiB0aGlzLl93YXRjaGVycy5vbk9mZmxpbmVSZWNvcmQocmVjb3JkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uTWVzc2FnZShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3QgaXNDYWxsTXNnID0gY2FsbE1zZ1R5cGVzLmluY2x1ZGVzKG1lc3NhZ2UubWVzc2FnZVR5cGUpO1xuICAgIGlmIChpc0NhbGxNc2cpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbQ2FsbE1lc3NhZ2VIYW5kbGVyXSBfb25NZXNzYWdlIC0+IGNhbGwgbWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShtZXNzYWdlKX1gKTtcbiAgICAgIC8vIOmAmui/h+mBjeWOhiBidWZmZXJMaXN0IOafpeaJvuimgeaPkuWFpeeahOiKgueCuVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWFya1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCB7IHNlbnRUaW1lOiBjdXJyZW50TXNnU2VudFRpbWUgfSA9IG1lc3NhZ2U7XG4gICAgICAgIGxldCBpbnNlcnRJbmRleCA9IDA7XG4gICAgICAgIC8vIOmcgOmBjeWOhuaVsOe7hOWFqOmDqOmhue+8jOaVheS9v+eUqCBmb3JFYWNoLCBmaW5kSW5kZXgg5om+5Yiw56ys5LiA5Liq56ym5ZCI5p2h5Lu255qE5bCx5Lya57uI5q2iXG4gICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3QuZm9yRWFjaCgoeyBtc2c6IHsgc2VudFRpbWUgfSB9LCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChjdXJyZW50TXNnU2VudFRpbWUgPj0gc2VudFRpbWUpIHtcbiAgICAgICAgICAgIC8vIGluc2VydEluZGV4IOmcgOS4uuW9k+WJjeespuWQiOadoeS7tuWFg+e0oOeahOWQjuS4gOS9je+8jOaVhSArMVxuICAgICAgICAgICAgaW5zZXJ0SW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbXNnQnVmZmVyTGlzdC5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIHtcbiAgICAgICAgICBtYXJrVGltZSxcbiAgICAgICAgICBtc2c6IG1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBvbk1lc3NhZ2UgLT4gbXNnQnVmZmVyTGlzdDogJHt0aGlzLl9tc2dCdWZmZXJMaXN0Lmxlbmd0aH1gKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbQ2FsbE1lc3NhZ2VIYW5kbGVyXSBzcGxpY2UgYnVmZmVyIG1zZyBlcnJvciAtPiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIOWQr+WKqOa2iOaBr+WkhOeQhlxuICAgICAgdGhpcy5faGFuZGxlQnVmZmVyTXNncygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlnKjnur/mtojmga/mipvnu5nnirbmgIHmnLrlpITnkIZcbiAgICovXG4gIHByaXZhdGUgX29uUmVjdk9ubGluZUNhbGxNc2cobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYG9uTWVzc2FnZSAtPiBfb25SZWN2T25saW5lQ2FsbE1zZzogJHttZXNzYWdlLm1lc3NhZ2VUeXBlfWApO1xuICAgIGNvbnN0IHsgY29udGVudDogeyBjYWxsSWQgfSB9ID0gbWVzc2FnZTtcbiAgICAvLyDlnKjnur/mtojmga/nm7TmjqXmipvlh7pcbiAgICBzd2l0Y2ggKG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNJbnZpdGU6XG4gICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlICYmIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlKG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNSaW5naW5nOlxuICAgICAgICBzdXBlci5lbWl0KGAke2NhbGxJZH1vblJpbmdpbmdgLCBtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDQWNjZXB0OlxuICAgICAgICBzdXBlci5lbWl0KGAke2NhbGxJZH1vbkFjY2VwdGAsIG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW06XG4gICAgICAgIC8vIOaUtuWIsOS6uuWRmOWPmOabtOaKm+WHuiBvbkludml0ZSDnlJ/miJDnirbmgIHmnLrlrp7kvotcbiAgICAgICAgdGhpcy5fd2F0Y2hlcnMub25JbnZpdGUgJiYgdGhpcy5fd2F0Y2hlcnMub25JbnZpdGUobWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lZGlhOlxuICAgICAgICBzdXBlci5lbWl0KGAke2NhbGxJZH1vbk1lZGlhTW9kaWZ5YCwgbWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cDpcbiAgICAgICAgc3VwZXIuZW1pdChgJHtjYWxsSWR9b25IdW5ndXBgLCBtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBbQ2FsbE1lc3NhZ2VIYW5kbGVyXSBvblJlY3ZPbmxpbmVDYWxsTXNnIC0+IHVuZXhwZWN0ZWQgbWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShtZXNzYWdlKX1gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOa2iOaBryBidWZmZXIg5YiX6KGo5aSE55CG6YC76L6RXG4gICAqIDHjgIHmr48gMjBtcyDmo4Dmn6XkuIDmrKEgYnVmZmVyIGxpc3RcbiAgICogMuOAgeWPluWHuuW3sue7j+W7tui/nyAyMDAg55qE5raI5oGv5YiX6KGo6L+b6KGM5raI6LS5IHwg5peg5bu26L+fIDIwMG1zIOWGhea2iOaBr+ebtOaOpemAkuW9klxuICAgKiAz44CB5raI6LS55YiG5Li6IOemu+e6v+a2iOaBr+a2iOi0uemAu+i+keOAgeWcqOe6v+a2iOaBr+a2iOi0uemAu+i+ke+8jOa2iOi0ueWQjumAkuW9klxuICAqL1xuICBwcml2YXRlIF9oYW5kbGVCdWZmZXJNc2dzKCkge1xuICAgIC8vIOa2iOaBryBidWZmZXIg5YiX6KGo6ZW/5bqm5Li6IDAg5pe25Yqg6ZSBXG4gICAgaWYgKHRoaXMuX21zZ0J1ZmZlckxpc3QubGVuZ3RoID09PSAwIHx8IHRoaXMuX2hhZEhhbmRsZU1zZ1RpbWVyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignXycsICdfaGFuZGxlQnVmZmVyTXNncyByZXR1cm4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g6ZyA6KaB5Yqg6ZSB77yM5pS25Yiw5aSa5qyh5raI5oGv5ZCO77yM5Y+v6IO95Lya6LW35aSa5LiqIHRpbWVyXG4gICAgdGhpcy5faGFkSGFuZGxlTXNnVGltZXIgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8g5Y+W5Ye65aSn5LqOIDIwMCBtcyDmtojmga/liJfooahcbiAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGJ1ZmZlcnMgPSB0aGlzLl9tc2dCdWZmZXJMaXN0LmZpbHRlcigoaXRlbSkgPT4gY3VycmVudFRpbWUgLSBpdGVtLm1hcmtUaW1lID49IDIwMCk7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gaGFuZGxlQnVmZmVyTXNncyAtPiBsaXN0cyBvdmVyIDIwMG1zIDogJHtKU09OLnN0cmluZ2lmeShidWZmZXJzLm1hcCgoeyBtc2c6IHsgbWVzc2FnZVVJZCwgaXNPZmZMaW5lTWVzc2FnZSwgY29udGVudDogeyBjYWxsSWQgfSB9IH0pID0+ICh7IG1lc3NhZ2VVSWQsIGlzT2ZmTGluZU1lc3NhZ2UsIGNhbGxJZCB9KSkpfWApO1xuICAgICAgaWYgKGJ1ZmZlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIOayoeacieW7tui/nyAyMDBtcyDnmoTmtojmga/vvIzmtojotLnpgLvovpHop6PplIHlubbpgJLlvZLmiafooYxcbiAgICAgICAgdGhpcy5faGFkSGFuZGxlTXNnVGltZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faGFuZGxlQnVmZmVyTXNncygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChidWZmZXJzWzBdLm1zZy5pc09mZkxpbmVNZXNzYWdlKSB7XG4gICAgICAgIC8vIOW9k+esrOS4gOadoea2iOaBr+S4uuemu+e6v+a2iOaBr+aXtu+8jOebtOaOpeS7jiBidWZmZXIg5Lit5Y+W5Ye65omA5pyJ56a757q/5raI5oGv77yM6L+b6KGM5raI5oGvXG4gICAgICAgIGxldCBvZmZsaW5lQnVmZmVycyA9IHRoaXMuX21zZ0J1ZmZlckxpc3QuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm1zZy5pc09mZkxpbmVNZXNzYWdlKTtcblxuICAgICAgICAvLyDnprvnur/mtojmga/lpITnkIbpgLvovpFcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvblR5cGUsIG1lc3NhZ2VUeXBlLCBzZW50VGltZSwgc2VuZGVyVXNlcklkLCBjb250ZW50OiB7IGNhbGxJZDogaW52aXRlQ2FsbElkLCBpbnZpdGVVc2VySWRzIH0sXG4gICAgICAgICAgfSA9IG9mZmxpbmVCdWZmZXJzWzBdLm1zZztcblxuICAgICAgICAgIGNvbnN0IGlzSW52aXRlTXNnVHlwZSA9IFtSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW1dLmluY2x1ZGVzKG1lc3NhZ2VUeXBlIGFzIFJDQ2FsbE1lc3NhZ2VUeXBlKTtcblxuICAgICAgICAgIC8vIOiuoeeul+W9k+WJjeaXtumXtOS4jua2iOaBr+WPkemAgeaXtumXtOW3rlxuICAgICAgICAgIGNvbnN0IGRlbGF5VGltZSA9IHRoaXMuX2NvbnRleHQuZ2V0U2VydmVyVGltZSgpIC0gc2VudFRpbWU7XG4gICAgICAgICAgY29uc3QgaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYgPSBkZWxheVRpbWUgPCB0aGlzLl9vZmZsaW5lTXNnSXR2O1xuXG4gICAgICAgICAgaWYgKCFpc0xlc3NUaGFuT2ZmbGluZU1zZ0l0dikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgb2ZmbGluZSBtc2cgZGVsYXlUaW1lOiAke2RlbGF5VGltZX1tc2ApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc0ludml0ZU1zZ1R5cGUpIHsgLy8g5Y+W5Ye655qE56ys5LiA5p2h5raI5oGv5Li6IGludml0ZSB8IG1lbU1vZGlmeVxuICAgICAgICAgICAgLy8g5Y+W5Ye655u45ZCMIENhbGxJZCDmtojmga/liJfooahcbiAgICAgICAgICAgIGNvbnN0IHRhc2tNc2dMaXN0OiBJUmVjZWl2ZWRNZXNzYWdlW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2ZmbGluZUJ1ZmZlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IG9mZmxpbmVCdWZmZXJzW2ldLm1zZztcbiAgICAgICAgICAgICAgY29uc3QgeyBjb250ZW50OiB7IGNhbGxJZDogb3RoZXJDYWxsSWQgfSB9ID0gaXRlbTtcbiAgICAgICAgICAgICAgaWYgKGludml0ZUNhbGxJZCA9PT0gb3RoZXJDYWxsSWQpIHtcbiAgICAgICAgICAgICAgICB0YXNrTXNnTGlzdC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGB0YXNrTXNnTGlzdCBsZW5ndGg6ICR7dGFza01zZ0xpc3QubGVuZ3RofWApO1xuXG4gICAgICAgICAgICBpZiAodGFza01zZ0xpc3QubGVuZ3RoID4gMCkgeyAvLyDpmLLmraIgdGFza01zZ0xpc3Qg5Li6IDBcbiAgICAgICAgICAgICAgLy8g5om+5Ye6IG1zZ0J1ZmZlckxpc3Qg5Lit5bey5raI6LS555qE5raI5oGv5pyA5aSnIGluZGV4XG4gICAgICAgICAgICAgIGNvbnN0IGRlbEluZGV4ID0gdGhpcy5fbXNnQnVmZmVyTGlzdC5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0ubXNnLm1lc3NhZ2VVSWQgPT09IHRhc2tNc2dMaXN0W3Rhc2tNc2dMaXN0Lmxlbmd0aCAtIDFdLm1lc3NhZ2VVSWQpO1xuICAgICAgICAgICAgICAvLyDliKDpmaTmtojotLnov4cgbXNnQnVmZmVyTGlzdCDnmoTmtojmga9cbiAgICAgICAgICAgICAgdGhpcy5fbXNnQnVmZmVyTGlzdCA9IHRoaXMuX21zZ0J1ZmZlckxpc3Quc2xpY2UoZGVsSW5kZXggKyAxKTtcblxuICAgICAgICAgICAgICAvLyDmib7lh7ogb2ZmbGluZU1zZ3Mg5Lit5bey5raI6LS555qE5raI5oGv5pyA5aSnIGluZGV4XG4gICAgICAgICAgICAgIGNvbnN0IGRlbE9mZmxpbmVJbmRleCA9IG9mZmxpbmVCdWZmZXJzLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5tc2cubWVzc2FnZVVJZCA9PT0gdGFza01zZ0xpc3RbdGFza01zZ0xpc3QubGVuZ3RoIC0gMV0ubWVzc2FnZVVJZCk7XG4gICAgICAgICAgICAgIC8vIOWIoOmZpOa2iOi0uei/hyBvZmZsaW5lQnVmZmVycyDnmoTmtojmga9cbiAgICAgICAgICAgICAgb2ZmbGluZUJ1ZmZlcnMgPSBvZmZsaW5lQnVmZmVycy5zbGljZShkZWxPZmZsaW5lSW5kZXggKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICog5Y2V6IGK5pyq57uT5p2f6YCa6K+d5Yik5patXG4gICAgICAgICAgICAgKiDlpoLmnpzmtojmga/lnKggNjBzIOWGhe+8jOWIpOaWreaYr+WQpuacquaIkOWvue+8iOWPquaciSBpbnZpdGUg5oiW5Y+q5pyJIGludml0ZSDmiJYgcmluZ2luZyDmiJDlr7nmipvnu5kg56a757q/6K6w5b2V5Zmo77yM5pyq5oiQ5a+55oqb57uZ54q25oCB5py6XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGlzVW5maW5pc2hlZFByaXZhdGVDYWxsOiBib29sZWFuID0gKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNvbnZlcnNhdGlvblR5cGUgIT09IENvbnZlcnNhdGlvblR5cGUuUFJJVkFURSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBjb25zdCBpc09ubHlJbnZpdGUgPSB0YXNrTXNnTGlzdC5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICAgIGNvbnN0IGhhc0ludml0ZUFuZFJpbmdpbmcgPSB0YXNrTXNnTGlzdC5ldmVyeSgoaXRlbSkgPT4gW1JDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlLCBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lZGlhLCBSQ0NhbGxNZXNzYWdlVHlwZS5WQ1JpbmdpbmddLmluY2x1ZGVzKGl0ZW0ubWVzc2FnZVR5cGUgYXMgUkNDYWxsTWVzc2FnZVR5cGUpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGlzT25seUludml0ZSB8fCBoYXNJbnZpdGVBbmRSaW5naW5nO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICog576k6IGK5pyq57uT5p2f6YCa6K+d5Yik5patXG4gICAgICAgICAgICAgKiDpgJrov4cgbGlzdCDkuK0gaW52aXRlIOWSjCBtZW1iZXJNb2RpZnkg5raI5oGv5Lit5Y+W5Ye65omA5pyJ5Y+C5LiO6YCa6K+d55qEIHVzZXJJZFxuICAgICAgICAgICAgICog6YGN5Y6GIGxpc3Qg5om+5Ye65omA5pyJIGhhbmd1cCDnmoQgc2VuZFVzZXJJZFxuICAgICAgICAgICAgICogICAgIOaAu+S6uuaVsCAtIOaMguaWreS6uuaVsCA+IDEgIOS4lOWJqeS9meS6uuaVsOWMheWQq+iHquW3se+8jOiupOS4uumAmuivneacquaMguaWrei/m+eKtuaAgeaculxuICAgICAgICAgICAgICogICAgIOaAu+S6uuaVsCAtIOaMguaWreS6uuaVsCA8PSAxIOmAmuivneaMguaWre+8jOi/m+emu+e6v+a2iOaBr+WkhOeQhuWZqFxuICAgICAgICAgICAgICogICAgIOS4u+WPq+ebtOaOpeaMguaWreS4lOWFtuS7luS6uuacquaOpeWQrOebtOaOpei/m+emu+e6v+WkhOeQhuWZqFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBpc1VuZmluaXNoZWRHcnBDYWxsOiBib29sZWFuID0gKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNvbnZlcnNhdGlvblR5cGUgIT09IENvbnZlcnNhdGlvblR5cGUuR1JPVVApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgbGV0IGlzVW5maW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICBsZXQgbm9PbmVBY2NlcHQgPSB0cnVlO1xuICAgICAgICAgICAgICBsZXQgYWxsVXNlcklkcyA9IFtzZW5kZXJVc2VySWQsIC4uLmludml0ZVVzZXJJZHNdO1xuICAgICAgICAgICAgICBsZXQgaXNDYWxsZXJIdW5ndXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXNrTXNnTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgc2VuZGVyVXNlcklkOiB0YXNrTXNnU2VuZGVyVXNlcklkLCBtZXNzYWdlVHlwZSB9ID0gdGFza01zZ0xpc3RbaV07XG4gICAgICAgICAgICAgICAgLy8g5Y+q6KaB6Ieq5bex5oyC5pat55u05o6l6Lez5Ye65b6q546v77yM6L+b56a757q/5raI5oGvXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCAmJiB0YXNrTXNnU2VuZGVyVXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKSB7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8g5om+5Ye65omA5pyJ5oyC5pat55qE5Lq65ZGY77yM5Lul5Y+K6YCa6K+d5Y+R6LW36ICF5piv5ZCm5oyC5patXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCkge1xuICAgICAgICAgICAgICAgICAgaXNDYWxsZXJIdW5ndXAgPSBzZW5kZXJVc2VySWQgPT09IHRhc2tNc2dTZW5kZXJVc2VySWQ7XG4gICAgICAgICAgICAgICAgICBhbGxVc2VySWRzID0gYWxsVXNlcklkcy5maWx0ZXIoKGlkKSA9PiB0YXNrTXNnU2VuZGVyVXNlcklkICE9PSBpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIOWIpOaWreaYr+WQpuaXoOS6uuaOpeWQrFxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVHlwZSA9PT0gUkNDYWxsTWVzc2FnZVR5cGUuVkNBY2NlcHQpIHtcbiAgICAgICAgICAgICAgICAgIG5vT25lQWNjZXB0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIOS4jeaYr+S4u+WPq+aMguaWreS4lOaXoOS6uuaOpeWQrO+8jOS4lOWJqeS9meS6uuaVsOWkp+S6jiAxXG4gICAgICAgICAgICAgIGlmICghKG5vT25lQWNjZXB0ICYmIGlzQ2FsbGVySHVuZ3VwKSAmJiBhbGxVc2VySWRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBpc1VuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBpc1VuZmluaXNoZWQ7XG4gICAgICAgICAgICB9KSgpO1xuXG4gICAgICAgICAgICBpZiAoaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYgJiYgKGlzVW5maW5pc2hlZFByaXZhdGVDYWxsIHx8IGlzVW5maW5pc2hlZEdycENhbGwpKSB7XG4gICAgICAgICAgICAgIHRhc2tNc2dMaXN0LmZvckVhY2godGhpcy5fb25SZWN2T25saW5lQ2FsbE1zZywgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vZmZsaW5lUmVjb3JkZXIub25SZWN2T2ZmbGluZU1zZ3ModGFza01zZ0xpc3QpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYgJiYgdGhpcy5fZ2V0U3RhdGVNYWNoaW5lKGludml0ZUNhbGxJZCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fb25SZWN2T25saW5lQ2FsbE1zZyhvZmZsaW5lQnVmZmVyc1swXS5tc2cpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtDYWxsTWVzc2FnZUhhbmRsZXJdIHVuZXhjZXB0ZWQgb2ZmbGluZSBtc2cgLT4gJHtKU09OLnN0cmluZ2lmeShvZmZsaW5lQnVmZmVyc1swXS5tc2cpfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmbGluZUJ1ZmZlcnMuc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3Quc2hpZnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKG9mZmxpbmVCdWZmZXJzLmxlbmd0aCA+IDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5Zyo57q/5raI5oGv5aSE55CG6YC76L6RXG4gICAgICAgIGJ1ZmZlcnMuZm9yRWFjaCgoeyBtc2cgfSkgPT4ge1xuICAgICAgICAgIHRoaXMuX29uUmVjdk9ubGluZUNhbGxNc2cobXNnISk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyDmib7lh7ogbXNnQnVmZmVyTGlzdCDkuK3lt7LmtojotLnnmoTmtojmga/mnIDlpKcgaW5kZXhcbiAgICAgICAgY29uc3QgZGVsQ291bnQgPSBidWZmZXJzLmxlbmd0aDtcbiAgICAgICAgLy8g5Yig6Zmk5raI6LS56L+H55qE5raI5oGvXG4gICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3Quc3BsaWNlKDAsIGRlbENvdW50KTtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYHRpbWVyIG9ubGluZSBtc2cgaGFuZGxlIC0+IGRlbENvdW50OiAke2RlbENvdW50fSBtc2dCdWZmZXJMaXN0OiAke3RoaXMuX21zZ0J1ZmZlckxpc3QubGVuZ3RofWApO1xuICAgICAgfVxuICAgICAgdGhpcy5faGFkSGFuZGxlTXNnVGltZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2hhbmRsZUJ1ZmZlck1zZ3MoKTtcbiAgICB9LCAyMCk7XG4gIH1cblxuICByZWdpc3RlckV2ZW50TGlzdGVuZXIobGlzdGVuZXI6IElNc2dMaXN0ZW5lcikge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5fd2F0Y2hlcnMsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQoY2FsbElkOiBzdHJpbmcsIGZ1bmNOYW1lOiBNc2dMaXN0ZW5lcktleXMsIGV2ZW50OiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICBjb25zdCBldmVudFR5cGUgPSBjYWxsSWQgKyBmdW5jTmFtZTtcbiAgICBzdXBlci5vbihldmVudFR5cGUsIGV2ZW50KTtcbiAgfVxuXG4gIHVucmVnaXN0ZXJTdGF0ZU1hY2hpbmVFdmVudChjYWxsSWQ6IHN0cmluZykge1xuICAgIFsnb25SaW5naW5nJywgJ29uQWNjZXB0JywgJ29uSHVuZ3VwJywgJ29uTWVkaWFNb2RpZnknXS5mb3JFYWNoKChmdW5jTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZXZlbnRUeXBlID0gY2FsbElkICsgZnVuY05hbWU7XG4gICAgICBzdXBlci5yZW1vdmVBbGwoZXZlbnRUeXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlZ2lzdGVyVXNlckluZm8odXNlckluZm86IElVc2VyUHJvZmlsZSkge1xuICAgIHRoaXMuX3VzZXJJbmZvID0gdXNlckluZm87XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCBIElNIOa2iOaBr1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2VuZENhbGxNZXNzYWdlKG9wdGlvbnM6IElDYWxsTXNnT3B0aW9uKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgbWVzc2FnZT86IElSZWNlaXZlZE1lc3NhZ2UgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBDYWxsTWVzc2FnZUhhbmRsZXJdIHNlbmRDYWxsTWVzYWdlIC0+IG1lc3NhZ2U6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9YCk7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY29udGVudCwgbWVzc2FnZVR5cGUsIGRpcmVjdGlvbmFsVXNlcklkTGlzdCwgcHVzaENvbmZpZyxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBzZW5kT3B0czogSVNlbmRNc2dPcHRpb25zID0ge1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgbWVzc2FnZVR5cGUsXG4gICAgICBjb250ZW50LFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0LFxuICAgIH07XG5cbiAgICBpZiAoW1JDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlLCBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNIYW5ndXBdLmluY2x1ZGVzKG1lc3NhZ2VUeXBlKSkge1xuICAgICAgY29uc3QgbmV3UHVzaENvbmZpZyA9IHB1c2hDb25maWcgfHwgeyBwdXNoVGl0bGU6ICcnLCBwdXNoQ29udGVudDogJycsIHB1c2hEYXRhOiAnJyB9O1xuICAgICAgbmV3UHVzaENvbmZpZy5hbmRyb2lkQ29uZmlnID0gT2JqZWN0LmFzc2lnbihwdXNoQ29uZmlnPy5hbmRyb2lkQ29uZmlnIHx8IHt9LCB7XG4gICAgICAgIGNhdGVnb3J5SFc6ICdWT0lQJyxcbiAgICAgICAgY2F0ZWdvcnlWaXZvOiAnSU0nLFxuICAgICAgfSk7XG4gICAgICBuZXdQdXNoQ29uZmlnLmlPU0NvbmZpZyA9IE9iamVjdC5hc3NpZ24obmV3UHVzaENvbmZpZy5pT1NDb25maWcgfHwge30sIHtcbiAgICAgICAgYXBuc0NvbGxhcHNlSWQ6IGNvbnRlbnQuY2FsbElkLFxuICAgICAgfSk7XG4gICAgICBuZXdQdXNoQ29uZmlnLmRpc2FibGVQdXNoVGl0bGUgPSBmYWxzZTtcbiAgICAgIG5ld1B1c2hDb25maWcuZm9yY2VTaG93RGV0YWlsQ29udGVudCA9IGZhbHNlO1xuICAgICAgc2VuZE9wdHMucHVzaENvbmZpZyA9IG5ld1B1c2hDb25maWcgYXMgSUVuZ2luZVB1c2hDb25maWc7XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgZGF0YTogbWVzc2FnZSB9ID0gYXdhaXQgdGhpcy5fY29udGV4dC5zZW5kTWVzc2FnZShjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgc2VuZE9wdHMpO1xuICAgIGlmIChjb2RlICE9PSBFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYENhbGxNZXNzYWdlSGFuZGxlcl0gc2VuZENhbGxNZXNhZ2UgZXJyb3IgLT4gY29kZTogJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogRW5naW5lRXJyb3JDb2RlVG9DYWxsRXJyb3JDb2RlW2NvZGVdIHx8IFJDQ2FsbEVycm9yQ29kZS5TRU5EX01TR19FUlJPUixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCBtZXNzYWdlIH07XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCB6YKA6K+35raI5oGvXG4gICAqL1xuICBhc3luYyBzZW5kSW52aXRlKG9wdGlvbnM6IElJbnZpdGVNc2dPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgcm9vbVR5cGUsIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgbWVkaWFUeXBlLCBpbnZpdGVVc2VySWRzLCBleHRyYSwgcHVzaENvbmZpZyxcbiAgICB9ID0gb3B0aW9ucztcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsICdDYWxsTWVzc2FnZUhhbmRsZXJdIHNlbmRDYWxsTWVzYWdlIHNlbmRJbnZpdGUnLCBKU09OLnN0cmluZ2lmeShvcHRpb25zKSk7XG4gICAgdGhpcy5fd2F0Y2hlcnMuc2VuZEFjY2VwdCAmJiB0aGlzLl93YXRjaGVycy5zZW5kQWNjZXB0KHsgY2FsbElkIH0pO1xuICAgIGNvbnN0IGNvbnRlbnQ6IElJbnZpdGVNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHJvb21UeXBlLFxuICAgICAgZXh0cmEsXG4gICAgICBlbmdpbmVUeXBlOiA0LFxuICAgICAgY2hhbm5lbEluZm86IHsgSWQ6IGNhbGxJZCwgS2V5OiAnJyB9LFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgaW52aXRlVXNlcklkcyxcbiAgICAgIG9ic2VydmVyVXNlcklkczogW10sXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuXG4gICAgaWYgKHB1c2hDb25maWcpIHtcbiAgICAgIHB1c2hDb25maWcucHVzaERhdGEgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgdXNlcklkTGlzdDogaW52aXRlVXNlcklkcyxcbiAgICAgICAgY2FsbElkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsTWVzc2FnZSh7XG4gICAgICBjaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWVzc2FnZVR5cGU6IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiBjb252ZXJzYXRpb25UeXBlID09PSBDb252ZXJzYXRpb25UeXBlLkdST1VQID8gaW52aXRlVXNlcklkcyA6IFt0YXJnZXRJZF0sXG4gICAgICBwdXNoQ29uZmlnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeS6uuWRmOWPmOabtOa2iOaBr1xuICAgKi9cbiAgYXN5bmMgc2VuZE1lbWViZXJNb2RpZnkob3B0aW9uczogSU1lbWJlck1vZGlmeU1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIG1lZGlhVHlwZSwgaW52aXRlVXNlcklkcywgY2FsbGVySWQsXG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMsIGRpcmVjdGlvbmFsVXNlcklkTGlzdCwgZXh0cmEsIHB1c2hDb25maWcsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSU1lbWJlck1vZGlmeU1zZ0NvbnRlbnQgPSB7XG4gICAgICBwbGF0Zm9ybTogUGxhdGZvcm0uV0VCLCAvLyBUT0RPIOS4jiBJTSDkuIDoh7RcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIGV4dHJhLFxuICAgICAgZW5naW5lVHlwZTogNCxcbiAgICAgIGNoYW5uZWxJbmZvOiB7IElkOiBjYWxsSWQsIEtleTogJycgfSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGludml0ZVVzZXJJZHMsXG4gICAgICBvYnNlcnZlclVzZXJJZHM6IFtdLFxuICAgICAgdXNlcjogdGhpcy5fdXNlckluZm8sXG4gICAgICBjYWxsZXI6IGNhbGxlcklkLFxuICAgICAgbW9kaWZ5TWVtVHlwZTogTWVtYmVyTW9kaWZ5VHlwZS5BREQsXG4gICAgICBleGlzdGVkVXNlclBvZmlsZXMsXG4gICAgfTtcblxuICAgIGlmIChwdXNoQ29uZmlnKSB7XG4gICAgICBwdXNoQ29uZmlnLnB1c2hEYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIHVzZXJJZExpc3Q6IGludml0ZVVzZXJJZHMsXG4gICAgICAgIGNhbGxJZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxNZXNzYWdlKHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtZXNzYWdlVHlwZTogUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0sXG4gICAgICBkaXJlY3Rpb25hbFVzZXJJZExpc3QsXG4gICAgICBwdXNoQ29uZmlnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeWTjemTg+a2iOaBr1xuICAgKi9cbiAgc2VuZFJpbmdpbmcob3B0aW9uczogSVJpbmdpbmdNc2dPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY2FsbElkLCB1c2VySWRzLFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNvbnRlbnQ6IElSaW5naW5nTXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICB1c2VyOiB0aGlzLl91c2VySW5mbyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ1JpbmdpbmcsXG4gICAgICBkaXJlY3Rpb25hbFVzZXJJZExpc3Q6IHVzZXJJZHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCB5ZCM5oSP5o6l5ZCs5raI5oGvXG4gICAqL1xuICBzZW5kQWNjZXB0KG9wdGlvbnM6IElBY2NlcHRNc2dPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY2FsbElkLCBtZWRpYVR5cGUsIHVzZXJJZHMsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSUFjY2VwdE1zZ0NvbnRlbnQgPSB7XG4gICAgICBwbGF0Zm9ybTogUGxhdGZvcm0uV0VCLFxuICAgICAgZGV2aWNlSWQ6IHRoaXMuX2RldmljZUlkLFxuICAgICAgY2FsbElkLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgdXNlcjogdGhpcy5fdXNlckluZm8sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxNZXNzYWdlKHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtZXNzYWdlVHlwZTogUkNDYWxsTWVzc2FnZVR5cGUuVkNBY2NlcHQsXG4gICAgICBkaXJlY3Rpb25hbFVzZXJJZExpc3Q6IHVzZXJJZHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCB5oyC5pat5raI5oGvXG4gICAqL1xuICBzZW5kSHVuZ3VwKG9wdGlvbnM6IElIdW5ndXBNc2dPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY2FsbElkLCByZWFzb24sIHVzZXJJZHMsIHB1c2hDb25maWcsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY29udGVudDogSUh1bmd1cE1zZ0NvbnRlbnQgPSB7XG4gICAgICBwbGF0Zm9ybTogUGxhdGZvcm0uV0VCLFxuICAgICAgZGV2aWNlSWQ6IHRoaXMuX2RldmljZUlkLFxuICAgICAgY2FsbElkLFxuICAgICAgcmVhc29uLFxuICAgICAgdXNlcjogdGhpcy5fdXNlckluZm8sXG4gICAgfTtcblxuICAgIGlmIChwdXNoQ29uZmlnKSB7XG4gICAgICBwdXNoQ29uZmlnLnB1c2hEYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjYWxsSWQsIHJlYXNvbixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cCxcbiAgICAgIHB1c2hDb25maWcsXG4gICAgICBkaXJlY3Rpb25hbFVzZXJJZExpc3Q6IHVzZXJJZHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Y+R6YCB5aqS5L2T5Y+Y5pu05raI5oGvXG4gICAqL1xuICBzZW5kTWVkaWFNb2RpZnkob3B0aW9uczogSU1lZGlhTW9kaWZ5TXNnT3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgbWVkaWFUeXBlLCB1c2VySWRzLFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNvbnRlbnQ6IElNZWRpYU1vZGlmeU1zZ0NvbnRlbnQgPSB7XG4gICAgICBwbGF0Zm9ybTogUGxhdGZvcm0uV0VCLFxuICAgICAgZGV2aWNlSWQ6IHRoaXMuX2RldmljZUlkLFxuICAgICAgY2FsbElkLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgdXNlcjogdGhpcy5fdXNlckluZm8sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxNZXNzYWdlKHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtZXNzYWdlVHlwZTogUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZWRpYSxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogdXNlcklkcyxcbiAgICB9KTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gUkNDYWxsTGFuZ3VhZ2Uge1xuICBaSCA9ICd6aCcsXG4gIEVOID0gJ2VuJ1xufVxuIiwiZXhwb3J0IGNvbnN0IEVOID0ge1xuICBQdXNoVGl0bGU6IHtcbiAgICBBVURJTzogJ1lvdSBoYXZlIGEgdm9pY2UgY2FsbCcsXG4gICAgVklERU86ICdZb3UgaGF2ZSBhIHZpZGVvIGNhbGwnLFxuICB9LFxufTtcbiIsImV4cG9ydCBjb25zdCBaSCA9IHtcbiAgUHVzaFRpdGxlOiB7XG4gICAgQVVESU86ICfmgqjmnInkuIDmnaHpn7PpopHpgJror50nLFxuICAgIFZJREVPOiAn5oKo5pyJ5LiA5p2h6KeG6aKR6YCa6K+dJyxcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBSQ0NhbGxMYW5ndWFnZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbExhbmcnO1xuaW1wb3J0IHsgRU4gfSBmcm9tICcuL2VuJztcbmltcG9ydCB7IFpIIH0gZnJvbSAnLi96aCc7XG5cbi8qKlxuICogQ2FsbEVuZ2luZSDlhajlsYDor63oqIDorr7nva7vvIzlvZPliY3ku4XmlK/mjIHkuK3jgIHoi7HmlodcbiAqL1xuZXhwb3J0IGNsYXNzIExvY2FsIHtcbiAgc3RhdGljIF9sYW5nOiBSQ0NhbGxMYW5ndWFnZSA9IFJDQ2FsbExhbmd1YWdlLlpIXG5cbiAgc3RhdGljIHNldChsYW5nOiBSQ0NhbGxMYW5ndWFnZSkge1xuICAgIHRoaXMuX2xhbmcgPSBsYW5nO1xuICB9XG5cbiAgc3RhdGljIGdldCgpIHtcbiAgICBpZiAodGhpcy5fbGFuZyA9PT0gUkNDYWxsTGFuZ3VhZ2UuRU4pIHtcbiAgICAgIHJldHVybiBFTjtcbiAgICB9XG4gICAgcmV0dXJuIFpIO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBCYXNpY0xvZ2dlciwgQ29udmVyc2F0aW9uVHlwZSwgSVJlY2VpdmVkTWVzc2FnZSwgSVJ1bnRpbWUsIFJUQ1BsdWdpbkNvbnRleHQsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFN0YXRlTWFjaGluZSB9IGZyb20gJy4vY29yZS9TdGF0ZU1hY2hpbmUnO1xuaW1wb3J0IHtcbiAgSUNhbGxTdGF0ZU1hY2hpbmVXYXRjaGVycywgSUVuZFN1bW1hcnksIElJbnZpdGVkVXNlcnMsIElNZWRpYU1vZGlmeUluZm8sIElNZW1iZXJNb2RpZnlJbmZvLCBJU2VuZGVySW5mbywgSVN0YXRlQ2hhbmdlSW5mbywgSVVzZXJQcm9maWxlLCBJVXNlclN0YXRlQ2hhbmdlSW5mbywgSVVzZXJEYXRhLCBJSW52aXRlT3B0aW9ucyxcbn0gZnJvbSAnLi9jb3JlL2ludGVyZmFjZXMvSVN0YXRlTWFjaGluZSc7XG5pbXBvcnQgeyBSQ0NhbGxFcnJvckNvZGUgfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsQ29kZSc7XG5pbXBvcnQgeyBSQ0NhbGxVc2VyU3RhdGUgfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsVXNlclN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbFNlc3Npb25TdGF0ZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxTZXNzaW9uU3RhdGUnO1xuaW1wb3J0IHsgUkNDYWxsRW5kUmVhc29uIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbEVuZFJlYXNvbic7XG5pbXBvcnQgeyBSQ0NhbGxNZWRpYVR5cGUgfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsTWVkaWFUeXBlJztcbmltcG9ydCB7IENhbGxNZXNzYWdlSGFuZGxlciB9IGZyb20gJy4vY29yZS9NZXNzYWdlSGFuZGxlcic7XG5pbXBvcnQgeyBldmVudEVtaXR0ZXIsIGdlbmVyYXRlUmFuZG9tSWQsIGdldENhbGxEZXZpY2VJZCB9IGZyb20gJy4vaGVscGVyJztcbmltcG9ydCB7IFJDQ2FsbExhbmd1YWdlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbExhbmcnO1xuaW1wb3J0IHsgSUNhbGxFbmdpbmVPcHRpb25zLCBJQ2FsbEVuZ2luZVdhdGNoZXJzIH0gZnJvbSAnLi9jb3JlL2ludGVyZmFjZXMvSUNhbGxFbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsTWVzc2FnZVR5cGUgfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsTWVzc2FnZVR5cGUnO1xuaW1wb3J0IHsgSUludml0ZU1zZ0NvbnRlbnQgfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9JTWVzc2FnZUhhbmRsZXInO1xuaW1wb3J0IHsgTG9jYWwgfSBmcm9tICcuL2NvcmUvbG9jYWxlJztcbmltcG9ydCB7IElPZmZsaW5lUmVjb3JkIH0gZnJvbSAnLi9jb3JlL09mZmxpbmVSZWNvcmRlcic7XG5pbXBvcnQgeyBSQ0Nyb3NzQ2FsbFR5cGUgfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDcm9zc0NhbGxUeXBlJztcbmltcG9ydCB7IElQdXNoQ29uZmlnIH0gZnJvbSAnLi4vc3JjL2ludGVyZmFjZSc7XG5cbmNsYXNzIFJDQ2FsbEVuZ2luZSB7XG4gIHByaXZhdGUgX3N0YXRlTWFjaGluZTogeyBbY2FsbElkOiBzdHJpbmddOiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfSA9IHt9XG5cbiAgcHJpdmF0ZSBfY2FsbE1zZ0hhbmRsZXI6IENhbGxNZXNzYWdlSGFuZGxlclxuXG4gIC8qKlxuICAgKiDliJ3lp4vljJZcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIGVuZ2luZSBQbGd1aW5Db250ZXh0IOWunuS+i1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsXG4gICAgLyoqXG4gICAgICog6L+Q6KGM5pe255u45YWzXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgLyoqXG4gICAgICogZW5naW5lIOaXpeW/l+aooeWdl+WunuS+i++8jOeUsSBDYWxsTGliIOWxguWIneWni+WMllxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgLyoqXG4gICAgICog55uR5ZCs5pa55rOVXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfd2F0Y2hlcnM6IElDYWxsRW5naW5lV2F0Y2hlcnMsXG4gICAgLyoqXG4gICAgICog5YW25LuW6YWN572u6aG5XG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uczogSUNhbGxFbmdpbmVPcHRpb25zLFxuICApIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybignXycsIGBSQ0NhbGxFbmdpbmUgVmVyc2lvbjogJHtfX1ZFUlNJT05fX30gQ29tbWl0SWQ6ICR7X19DT01NSVRfSURfX31gKTtcbiAgICAvLyDorr7nva4gRGV2aWNlSWRcbiAgICBnZXRDYWxsRGV2aWNlSWQoX3J1bnRpbWUpO1xuICAgIC8vIOebkeWQrCBJTSDmtojmga9cbiAgICB0aGlzLl9jYWxsTXNnSGFuZGxlciA9IG5ldyBDYWxsTWVzc2FnZUhhbmRsZXIodGhpcy5fY29udGV4dCwgdGhpcy5fcnVudGltZSwgdGhpcy5fbG9nZ2VyLCB0aGlzLl9vcHRpb25zLm9mZmxpbmVNc2dJdHYsIHRoaXMuX2dldFN0YXRlTWFjaGluZS5iaW5kKHRoaXMpKTtcbiAgICAvLyDms6jlhozmtojmga/mqKHlnZfnm5HlkKxcbiAgICB0aGlzLl9jYWxsTXNnSGFuZGxlci5yZWdpc3RlckV2ZW50TGlzdGVuZXIoe1xuICAgICAgb25JbnZpdGU6IHRoaXMuX29uSW52aXRlLmJpbmQodGhpcyksXG4gICAgICBzZW5kQWNjZXB0OiB0aGlzLl9oYW5kbGVTZW5kQWNjZXB0LmJpbmQodGhpcyksXG4gICAgICBvbk9mZmxpbmVSZWNvcmQ6IHRoaXMuX3dhdGNoZXJzLm9uT2ZmbGluZVJlY29yZCxcbiAgICB9KTtcbiAgICAvLyDnm5HlkKznirbmgIHmnLrlhbPpl61cbiAgICBldmVudEVtaXR0ZXIub24oJ29uU3RhdGVNYWNoaW5lQ2xvc2UnLCAoY2FsbElkOiBzdHJpbmcpID0+IHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXTtcbiAgICB9KTtcbiAgICAvLyDorr7nva7or63oqIBcbiAgICBMb2NhbC5zZXQoX29wdGlvbnMubGFuZyk7XG4gIH1cblxuICBwcml2YXRlIF9vbkludml0ZShtc2c6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjb250ZW50LCBtZXNzYWdlVHlwZSwgc2VuZGVyVXNlcklkOiBzdWlkLCBwdXNoQ29uZmlnLFxuICAgIH0gPSBtc2c7XG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgUkNDYWxsRW5naW5lIF9vbkludml0ZTp0YXJnZXRJZCAke3RhcmdldElkfSBzZW5kZXJVc2VySWQ6ICR7c3VpZH1gKTtcbiAgICBjb25zdCB7XG4gICAgICBtZWRpYVR5cGUsIGNhbGxJZCwgZXh0cmEsIHJvb21UeXBlLFxuICAgIH0gPSBjb250ZW50IGFzIElJbnZpdGVNc2dDb250ZW50O1xuICAgIGxldCBzZW5kZXJVc2VySWQ6IHN0cmluZztcbiAgICBpZiAocm9vbVR5cGUgIT09IFJDQ3Jvc3NDYWxsVHlwZS5SQ0NhbGxSb29tVHlwZUFjcm9zc0NhbGwpIHtcbiAgICAgIHNlbmRlclVzZXJJZCA9IHN1aWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIFssIHNlbmRlclVzZXJJZF0gPSBzdWlkLnNwbGl0KCdfJyk7XG4gICAgfVxuICAgIGNvbnN0IGNydFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgaWYgKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkgPT09IHNlbmRlclVzZXJJZCkgeyAvLyDlpJrnq6/lpITnkIZcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnvqTogYrpgJror53mnInlhbbku5bnq6/lpITnkIbml7bvvIzkuI3lho3lpITnkIbmraTpgJror53kuK3nmoTpgoDor7fmtojmga9cbiAgICAgKiDmnaHku7YxOiDmraTkurrlt7LooqvpgoDor7fpgJror51cbiAgICAgKiDmnaHku7YyOiDmnKznq6/ml6DmraTpgJror53nmoTnirbmgIHmnLpcbiAgICAgKi9cbiAgICBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtKSB7XG4gICAgICBjb25zdCBpc0tlZXBpbmcgPSBjb250ZW50LmV4aXN0ZWRVc2VyUG9maWxlcy5zb21lKChpdGVtOiB7IHVzZXJJZDogc3RyaW5nIH0pID0+IChpdGVtLnVzZXJJZCA9PT0gY3J0VXNlcklkKSk7XG4gICAgICBpZiAoaXNLZWVwaW5nICYmICF0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGVNYWNoaW5lID0gdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF07XG4gICAgaWYgKCFzdGF0ZU1hY2hpbmUpIHtcbiAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdID0gbmV3IFJDQ2FsbFN0YXRlTWFjaGluZShcbiAgICAgICAgdGhpcy5fY29udGV4dCxcbiAgICAgICAgdGhpcy5fcnVudGltZSxcbiAgICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlcixcbiAgICAgICAgY2hhbm5lbElkISxcbiAgICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgY2FsbElkLFxuICAgICAgKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxFbmdpbmVdIFJDQ2FsbFN0YXRlTWFjaGluZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCAtPiBjYWxsSWQ6ICR7Y2FsbElkfWApO1xuXG4gICAgICBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlKSB7XG4gICAgICAgIC8vIOeKtuaAgeacuuWGhemDqOWkhOeQhiBpbnZpdGUg5raI5oGvXG4gICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fb25JbnZpdGUobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtKSB7XG4gICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fb25NZW1iZXJNb2RpZnkobXNnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlKHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLCBleHRyYSk7XG5cbiAgICAgIGNvbnN0IGhhc090aGVyU3RhdGVNYWNoaW5lID0gT2JqZWN0LmtleXModGhpcy5fc3RhdGVNYWNoaW5lKS5maWx0ZXIoKG90aGVyQ2FsbElkKSA9PiBjYWxsSWQgIT09IG90aGVyQ2FsbElkKS5sZW5ndGggPiAwO1xuICAgICAgaWYgKGhhc090aGVyU3RhdGVNYWNoaW5lICYmICEodGhpcy5fb3B0aW9ucy5pc0FsbG93QWNjZXB0TmV3Q2FsbCB8fCBmYWxzZSkpIHtcbiAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0uX19oYW5kbGVJbnZpdGVJblNlc3Npb24oKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSkge1xuICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0uX19vbk1lbWJlck1vZGlmeShtc2cpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlhYHorrjmjqXlkKzmlrDnmoTpgJror53ml7bvvIzmjqXlkKzlrozmlrDnmoTpgJror53lkI7vvIzmjILmlq3lhbbku5bpgJror51cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZVNlbmRBY2NlcHQoaW5mbzogeyBjYWxsSWQ6IHN0cmluZyB9KSB7XG4gICAgaWYgKHRoaXMuX29wdGlvbnMuaXNBbGxvd0FjY2VwdE5ld0NhbGwpIHtcbiAgICAgIGNvbnN0IHsgY2FsbElkIH0gPSBpbmZvO1xuICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9zdGF0ZU1hY2hpbmUpIHtcbiAgICAgICAgaWYgKGNhbGxJZCAhPT0gaWQpIHtcbiAgICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbaWRdLmh1bmd1cCgpO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLl9zdGF0ZU1hY2hpbmVbaWRdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg6I635Y+W54q25oCB5py6XG4gICovXG4gIHByaXZhdGUgX2dldFN0YXRlTWFjaGluZShjYWxsSWQ6IHN0cmluZyk6IFJDQ2FsbFN0YXRlTWFjaGluZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhoznlKjmiLfkv6Hmga8sIOWPkemAgSBjYWxsIOa2iOaBr+aXtueUqOaIt+S/oeaBr+aQuuW4plxuICAgKi9cbiAgcmVnaXN0ZXJVc2VySW5mbyh1c2VySW5mbzogSVVzZXJQcm9maWxlKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxFbmdpbmVdIHJlZ2lzdGVyVXNlckluZm8gLT4gdXNlckluZm86ICR7SlNPTi5zdHJpbmdpZnkodXNlckluZm8pfWApO1xuXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJVc2VySW5mbyh1c2VySW5mbyk7XG4gIH1cblxuICAvKipcbiAgICog5Y2V5ZG8XG4gICAqIEBwYXJhbSBjaGFubmVsSWQg57uE57uHIElEXG4gICAqIEBwYXJhbSB0YXJnZXRJZCAg5a+55pa5IElEXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUg5aqS5L2T57G75Z6LXG4gICAqIEBwYXJhbSBleHRyYSDmtojmga/mianlsZXkv6Hmga9cbiAgICogQHBhcmFtIHB1c2hDb25maWcg5o6o6YCB6YWN572uXG4gICAqL1xuICBhc3luYyBjYWxsKFxuICAgIGNoYW5uZWxJZDogc3RyaW5nLFxuICAgIHRhcmdldElkOiBzdHJpbmcsXG4gICAgbWVkaWFUeXBlOiBudW1iZXIsXG4gICAgZXh0cmE6IHN0cmluZyA9ICcnLFxuICAgIHB1c2hDb25maWc6IElQdXNoQ29uZmlnLFxuICAgIGlzQ3Jvc3NBcHBrZXkgPSBmYWxzZSxcbiAgKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc3RhdGVNYWNoaW5lPzogUkNDYWxsU3RhdGVNYWNoaW5lIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbEVuZ2luZV0gY2FsbCAtPiBhcmdzOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgIGNoYW5uZWxJZCwgdGFyZ2V0SWQsIG1lZGlhVHlwZSwgZXh0cmEsIHB1c2hDb25maWcsXG4gICAgfSl9YCk7XG4gICAgY29uc3QgY2FsbElkID0gZ2VuZXJhdGVSYW5kb21JZCgpO1xuICAgIGNvbnN0IGhhc1N0YXRlTWFjaGluZSA9IE9iamVjdC5rZXlzKHRoaXMuX3N0YXRlTWFjaGluZSkubGVuZ3RoID4gMDtcbiAgICBpZiAoaGFzU3RhdGVNYWNoaW5lKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1RBVEVfTUFDSElORV9FWElUIH07XG4gICAgfVxuICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdID0gbmV3IFJDQ2FsbFN0YXRlTWFjaGluZShcbiAgICAgIHRoaXMuX2NvbnRleHQsXG4gICAgICB0aGlzLl9ydW50aW1lLFxuICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIsXG4gICAgICBjaGFubmVsSWQsXG4gICAgICBDb252ZXJzYXRpb25UeXBlLlBSSVZBVEUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGNhbGxJZCxcbiAgICApO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0uX19jYWxsKFt0YXJnZXRJZF0sIGV4dHJhLCBwdXNoQ29uZmlnLCBpc0Nyb3NzQXBwa2V5KTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLFxuICAgICAgICBzdGF0ZU1hY2hpbmU6IHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOe+pOWRvFxuICAgKiBAcGFyYW0gY2hhbm5lbElkIOe7hOe7hyBJRFxuICAgKiBAcGFyYW0gdGFyZ2V0SWQgIOe+pOe7hCBJRFxuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOWqkuS9k+exu+Wei1xuICAgKiBAcGFyYW0gdXNlcklkcyDooqvpgoDor7fkurrlkZjliJfooahcbiAgICogQHBhcmFtIGV4dHJhIOa2iOaBr+aJqeWxleS/oeaBr1xuICAgKiBAcGFyYW0gcHVzaENvbmZpZyDmjqjpgIHphY3nva5cbiAgICovXG4gIGFzeW5jIGNhbGxJbkdyb3VwKFxuICAgIGNoYW5uZWxJZDogc3RyaW5nLFxuICAgIHRhcmdldElkOiBzdHJpbmcsXG4gICAgbWVkaWFUeXBlOiBudW1iZXIsXG4gICAgdXNlcklkczogc3RyaW5nW10sXG4gICAgZXh0cmE6IHN0cmluZyA9ICcnLFxuICAgIHB1c2hDb25maWc6IElQdXNoQ29uZmlnLFxuICApOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzdGF0ZU1hY2hpbmU/OiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsRW5naW5lXSBjYWxsSW5Hcm91cCAtPiBhcmdzOiAke0pTT04uc3RyaW5naWZ5KHsgY2hhbm5lbElkLCB0YXJnZXRJZCwgbWVkaWFUeXBlIH0pfWApO1xuICAgIGNvbnN0IGNhbGxJZCA9IGdlbmVyYXRlUmFuZG9tSWQoKTtcbiAgICBjb25zdCBoYXNTdGF0ZU1hY2hpbmUgPSBPYmplY3Qua2V5cyh0aGlzLl9zdGF0ZU1hY2hpbmUpLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc1N0YXRlTWFjaGluZSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNUQVRFX01BQ0hJTkVfRVhJVCB9O1xuICAgIH1cbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSA9IG5ldyBSQ0NhbGxTdGF0ZU1hY2hpbmUoXG4gICAgICB0aGlzLl9jb250ZXh0LFxuICAgICAgdGhpcy5fcnVudGltZSxcbiAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLFxuICAgICAgY2hhbm5lbElkLFxuICAgICAgQ29udmVyc2F0aW9uVHlwZS5HUk9VUCxcbiAgICAgIHRhcmdldElkLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgY2FsbElkLFxuICAgICk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX2NhbGwodXNlcklkcywgZXh0cmEsIHB1c2hDb25maWcpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsXG4gICAgICAgIHN0YXRlTWFjaGluZTogdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6ZSA5q+B5b2T5YmN55qE54q25oCB5py6XG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsRW5naW5lXSBkZXN0cm95Jyk7XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lID0ge307XG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgUkNDYWxsRW5naW5lLFxuICBSQ0NhbGxTdGF0ZU1hY2hpbmUsIFJDQ2FsbEVycm9yQ29kZSxcbiAgUkNDYWxsVXNlclN0YXRlLFxuICBSQ0NhbGxTZXNzaW9uU3RhdGUsXG4gIFJDQ2FsbEVuZFJlYXNvbixcbiAgUkNDYWxsTWVkaWFUeXBlLFxuICBSQ0NhbGxMYW5ndWFnZSxcbn07XG5cbmV4cG9ydCB0eXBlIHtcbiAgSUNhbGxTdGF0ZU1hY2hpbmVXYXRjaGVycywgSUVuZFN1bW1hcnksXG4gIElDYWxsRW5naW5lV2F0Y2hlcnMsXG4gIElVc2VyU3RhdGVDaGFuZ2VJbmZvLFxuICBJU3RhdGVDaGFuZ2VJbmZvLFxuICBJU2VuZGVySW5mbyxcbiAgSU1lbWJlck1vZGlmeUluZm8sXG4gIElNZWRpYU1vZGlmeUluZm8sXG4gIElJbnZpdGVkVXNlcnMsXG4gIElVc2VyRGF0YSxcbiAgSVVzZXJQcm9maWxlLFxuICBJT2ZmbGluZVJlY29yZCxcbiAgSUludml0ZU9wdGlvbnMsXG59O1xuIiwiLyoqXG4gKiDkuqfnlJ9zZXNzaW9u55qE5Zy65pmvXG4gKi9cbmV4cG9ydCBlbnVtIFByb2R1Y2VUeXBlcyB7XG4gIC8qKlxuICAgKiDkuLvlj6tcbiAgICovXG4gIENBTExFUiA9IDEsXG5cbiAgLyoqXG4gICAqIOiiq+WPq1xuICAgKi9cbiAgQ0FMTEVFID0gMlxufVxuIiwiY2xhc3MgRXZlbnRFbWl0dGVyIHtcbiAgcHJpdmF0ZSBsaXN0OiB7W3Byb3BOYW1lOiBzdHJpbmddOiBhbnlbXX0gPSB7fVxuXG4gIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBmdW46KGRhdGE/OmFueSk9PnZvaWQpIHtcbiAgICAodGhpcy5saXN0W2V2ZW50XSB8fCAodGhpcy5saXN0W2V2ZW50XSA9IFtdKSkucHVzaChmdW4pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIG9uY2UoZXZlbnQ6IHN0cmluZywgZnVuOihkYXRhPzphbnkpPT52b2lkKSB7XG4gICAgY29uc3Qgb24gPSAoZGF0YT86YW55KSA9PiB7XG4gICAgICB0aGlzLm9mZihldmVudCwgb24pO1xuICAgICAgZnVuLmNhbGwodGhpcywgZGF0YSk7XG4gICAgfTtcbiAgICBvbi5mdW4gPSBmdW47XG4gICAgdGhpcy5vbihldmVudCwgb24pO1xuICB9XG5cbiAgcHVibGljIG9mZihldmVudDogc3RyaW5nLCBmdW4/OihkYXRhPzphbnkpPT52b2lkKSB7XG4gICAgY29uc3QgZnVucyA9IHRoaXMubGlzdFtldmVudF07XG4gICAgaWYgKCFmdW5zKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghZnVuKSB7XG4gICAgICAvLyDlpoLmnpzmsqHmnInkvKAgZm4g55qE6K+d77yM5bCx5Lya5bCGIGV2ZW50IOWAvOWvueW6lOe8k+WtmOWIl+ihqOS4reeahCBmdW4g6YO95riF56m6XG4gICAgICBmdW5zICYmIChmdW5zLmxlbmd0aCA9IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDoi6XmnIkgZnVu77yM6YGN5Y6G57yT5a2Y5YiX6KGo77yM55yL55yL5Lyg5YWl55qEIGZuIOS4juWTquS4quWHveaVsOebuOWQjO+8jOWmguaenOebuOWQjOWwseebtOaOpeS7jue8k+WtmOWIl+ihqOS4reWIoOaOieWNs+WPr1xuICAgICAgbGV0IGNiO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIHsgbGVuZ3RoIH0gPSBmdW5zOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2IgPSBmdW5zW2ldO1xuICAgICAgICBpZiAoY2IgPT09IGZ1biB8fCBjYi5mdW4gPT09IGZ1bikge1xuICAgICAgICAgIGZ1bnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgZGF0YT86YW55KSB7XG4gICAgLy8g56ys5LiA5Liq5Y+C5pWw5piv5a+55bqU55qEIGV2ZW50IOWAvO+8jOebtOaOpeeUqOaVsOe7hOeahCBzaGlmdCDmlrnms5Xlj5blh7pcbiAgICBjb25zdCBmdW5zID0gWy4uLnRoaXMubGlzdFtldmVudF1dO1xuXG4gICAgLy8g5aaC5p6c57yT5a2Y5YiX6KGo6YeM5rKh5pyJIGZ1biDlsLHov5Tlm54gZmFsc2VcbiAgICBpZiAoIWZ1bnMgfHwgZnVucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8g6YGN5Y6GIGV2ZW50IOWAvOWvueW6lOeahOe8k+WtmOWIl+ihqO+8jOS+neasoeaJp+ihjCBmblxuICAgIGZ1bnMuZm9yRWFjaCgoZnVuKSA9PiB7XG4gICAgICBmdW4uY2FsbCh0aGlzLCBkYXRhKTtcbiAgICB9KTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgRXZlbnRFbWl0dGVyLFxufTtcbiIsImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgRXZlbnRFbWl0dGVyKCk7XG4iLCJpbXBvcnQge1xuICBSVENKb2luVHlwZSwgTG9nTCwgaXNVbmRlZmluZWQsIGlzQm9vbGVhbiwgaXNTdHJpbmcsIElpT1NQdXNoQ29uZmlnLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxFcnJvckNvZGUsIFJDQ2FsbExhbmd1YWdlLCBSQ0NhbGxNZWRpYVR5cGUgfSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHsgUkNSZXNvbHV0aW9uIH0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcblxuaW1wb3J0IHtcbiAgSVNlc3Npb25MaXN0ZW5lciwgSVJDQ2FsbEluaXRPcHRpb25zLCBJVmFsaWRhdGlvblJlc3VsdCwgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsIElQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmZ1bmN0aW9uIGlzTGFuZ3VhZ2UodmFsOiBzdHJpbmcpIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IE9iamVjdC52YWx1ZXMoUkNDYWxsTGFuZ3VhZ2UpO1xuICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHZhbCk7XG59XG5cbmZ1bmN0aW9uIGlzSm9pblR5cGUodmFsOiBudW1iZXIpIHtcbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhSVENKb2luVHlwZSkgYXMgbnVtYmVyW107XG4gIHJldHVybiB2YWx1ZXMuaW5jbHVkZXModmFsKTtcbn1cblxuZnVuY3Rpb24gaXNMb2dMZXZlbCh2YWw6IG51bWJlcikge1xuICByZXR1cm4gW0xvZ0wuREVCVUcsIExvZ0wuSU5GTywgTG9nTC5XQVJOLCBMb2dMLkVSUk9SXS5pbmNsdWRlcyh2YWwpO1xufVxuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMgPSAob3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBtaXNzaW5nIHBhcmFtZXRlciAtPiBvcHRpb25zJyB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JyB9O1xuICB9XG4gIGNvbnN0IGtleU5hbWVzOiBzdHJpbmdbXSA9IFsncnRjQ2xpZW50JywgJ29uU2Vzc2lvbicsICdvblNlc3Npb25DbG9zZSddO1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICBjb25zdCBtaXNzaW5nS2V5czogc3RyaW5nW10gPSBbXTtcblxuICAvLyDmoKHpqozloavpobnmmK/lkKbpg73ljIXlkKvvvIzlpoLmnpzlk6rkuKrkuI3ljIXlkKvlsLHmlLbpm4botbfmnaVcbiAga2V5TmFtZXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgbWlzc2luZ0tleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8g5aaC5p6c57y65bCR5b+F5aGr55qE55uR5ZCs5Ye95pWw5oiW5a+56LGhXG4gIGlmIChtaXNzaW5nS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6IGBJbml0aWFsaXphdGlvbiBtaXNzaW5nIHBhcmFtZXRlciAtPiBcIiR7bWlzc2luZ0tleXMuam9pbignLCcpfVwiYCB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5ydGNDbGllbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwncnRjQ2xpZW50XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnb2JqZWN0XFwnJyB9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5vblNlc3Npb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdvblNlc3Npb25cXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMub25TZXNzaW9uQ2xvc2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdvblNlc3Npb25DbG9zZVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqGaXNBbGxvd1N1YnNjcmliZVJldHJ5IOS9huS4jeaYr2Jvb2xlYW7nsbvlnotcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5ICE9PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdpc0FsbG93U3Vic2NyaWJlUmV0cnlcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdib29sZWFuXFwnJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqG77yM5L2G5LiN5pivYm9vbGVhbuexu+Wei1xuICBpZiAodHlwZW9mIG9wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNBbGxvd1B1Ymxpc2hSZXRyeVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Jvb2xlYW5cXCcnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9ib29sZWFu57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnYm9vbGVhblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr1JUQ0pvaW5UeXBl55qE5p6a5Li+XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5qb2luVHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzSm9pblR5cGUob3B0aW9ucy5qb2luVHlwZSEpKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnam9pblR5cGVcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBjb3JyZWN0IHR5cGUnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9ib29sZWFu57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnYm9vbGVhblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr1JDQ2FsbExhbmd1YWdl55qE5p6a5Li+XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5sYW5nICE9PSAndW5kZWZpbmVkJyAmJiAhaXNMYW5ndWFnZShvcHRpb25zLmxhbmchKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2xhbmdcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBjb3JyZWN0IHR5cGUnIH07XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwgIT09ICd1bmRlZmluZWQnICYmICFpc0xvZ0xldmVsKG9wdGlvbnMubG9nT3V0cHV0TGV2ZWwhKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2xvZ091dHB1dExldmVsXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgY29ycmVjdCB0eXBlJyB9O1xuICB9XG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xufTtcblxuLyoqXG4gKiDmoKHpqoxyZWdpc3RlclNlc3Npb25MaXN0ZW5lcuWPguaVsFxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVMaXN0ZW5lciA9IChsaXN0ZW5lcjogSVNlc3Npb25MaXN0ZW5lcik6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKCFsaXN0ZW5lcikge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ21pc3NpbmcgcGFyYW1ldGVyIC0+IGxpc3RlbmVyJyB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnbGlzdGVuZXIgbXVzdCBiZSBhbiBvYmplY3QnIH07XG4gIH1cbiAgY29uc3Qga2V5TmFtZXM6IHN0cmluZ1tdID0gWydvblJpbmdpbmcnLCAnb25BY2NlcHQnLCAnb25IdW5ndXAnLCAnb25UcmFja1JlYWR5J107XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMobGlzdGVuZXIpO1xuICBjb25zdCBtaXNzaW5nS2V5czogc3RyaW5nW10gPSBbXTtcbiAga2V5TmFtZXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgbWlzc2luZ0tleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfSk7XG4gIGlmIChtaXNzaW5nS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6IGBtaXNzaW5nIHBhcmFtZXRlciAtPiBcIiR7bWlzc2luZ0tleXMuam9pbignLCcpfVwiYCB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIub25SaW5naW5nICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnb25SaW5naW5nXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vbkFjY2VwdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ29uQWNjZXB0XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vbkh1bmd1cCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ29uSHVuZ3VwXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lci5vblRyYWNrUmVhZHkgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdvblRyYWNrUmVhZHlcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVRhcmdldElkID0gKHRhcmdldElkOiBzdHJpbmcpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICh0YXJnZXRJZCAmJiB0eXBlb2YgdGFyZ2V0SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwndGFyZ2V0SWRcXCcgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTWVkaWFUeXBlID0gKG1lZGlhVHlwZTogbnVtYmVyKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8gfHwgbWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdtZWRpYVR5cGVcXCcgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBtdXN0IGJlIG9mIHR5cGUgXFwnUkNDYWxsTWVkaWFUeXBlXFwnJyB9O1xufTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUV4dHJhID0gKGV4dHJhOiBzdHJpbmcpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICh0eXBlb2YgZXh0cmEgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnZXh0cmFcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG59O1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaFRpdGxlID0gKHB1c2hUaXRsZTogc3RyaW5nKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAodHlwZW9mIHB1c2hUaXRsZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdwdXNoVGl0bGVcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG59O1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaENvbnRlbnQgPSAocHVzaENvbnRlbnQ6IHN0cmluZyk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKHR5cGVvZiBwdXNoQ29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdwdXNoQ29udGVudFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbn07XG5cbi8qKlxuICog5qCh6aqMIHB1c2hDb25maWdcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaENvbmZpZyA9IChwdXNoQ29uZmlnOiBJUHVzaENvbmZpZykgPT4ge1xuICBjb25zdCBwdXNoQ29uZmlnS2V5cyA9IFsncHVzaFRpdGxlJywgJ3B1c2hDb250ZW50JywgJ3B1c2hEYXRhJywgJ2lPU0NvbmZpZycsICdhbmRyb2lkQ29uZmlnJywgJ2Rpc2FibGVQdXNoVGl0bGUnLCAndGVtcGxhdGVJZCddO1xuICBjb25zdCBrZXlJc1JpZ2h0ID0gT2JqZWN0LmtleXMocHVzaENvbmZpZykuZXZlcnkoKGtleSkgPT4gcHVzaENvbmZpZ0tleXMuaW5jbHVkZXMoa2V5KSk7XG4gIGlmICgha2V5SXNSaWdodCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuUEFSQU1fRVJST1IsXG4gICAgICBlcnJvck1zZzogYHJpZ2h0IGtleTogJHtwdXNoQ29uZmlnS2V5cy5qb2luKCcsJyl9YCxcbiAgICB9O1xuICB9XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHB1c2hDb25maWdLZXlzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGtleSA9IHB1c2hDb25maWdLZXlzW2luZGV4XTtcbiAgICAvKipcbiAgICAgKiDmoKHpqowgYm9vbGVhbiDnsbvlnotcbiAgICAgKi9cbiAgICBpZiAoa2V5ID09PSAnZGlzYWJsZVB1c2hUaXRsZScpIHtcbiAgICAgIGlmICghaXNVbmRlZmluZWQocHVzaENvbmZpZ1trZXldKSAmJiAhaXNCb29sZWFuKHB1c2hDb25maWdba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuUEFSQU1fRVJST1IsXG4gICAgICAgICAgZXJyb3JNc2c6IGAke2tleX0gdHlwZSBpcyBib29sZWFuYCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3B1c2hUaXRsZSdcbiAgICAgIHx8IGtleSA9PT0gJ3RlbXBsYXRlSWQnKSB7XG4gICAgICAvKipcbiAgICAgICAqIOagoemqjCBzdHJpbmcg57G75Z6LXG4gICAgICAgKi9cbiAgICAgIGlmIChwdXNoQ29uZmlnW2tleV0gJiYgIWlzU3RyaW5nKHB1c2hDb25maWdba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuUEFSQU1fRVJST1IsXG4gICAgICAgICAgZXJyb3JNc2c6IGAke2tleX0gdHlwZSBpcyBzdHJpbmdgLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCB7IGlPU0NvbmZpZywgYW5kcm9pZENvbmZpZyB9ID0gcHVzaENvbmZpZztcblxuICAvKipcbiAgICog5qCh6aqMIGlPU0NvbmZpZ1xuICAgKi9cbiAgY29uc3QgdmFsaWRhdGVJT1NDb25maWdSZXMgPSB2YWxpZGF0ZUlPU0NvbmZpZyhpT1NDb25maWcgfHwge30pO1xuICBpZiAodmFsaWRhdGVJT1NDb25maWdSZXMuY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVJT1NDb25maWdSZXM7XG4gIH1cblxuICAvKipcbiAgICog5qCh6aqMIGFuZHJvaWRDb25maWdcbiAgICovXG4gIGNvbnN0IHZhbGlkYXRlQW5kcm9pZENvbmZpZ1JlcyA9IHZhbGlkYXRlQW5kcm9pZENvbmZpZyhhbmRyb2lkQ29uZmlnIHx8IHt9KTtcbiAgaWYgKHZhbGlkYXRlQW5kcm9pZENvbmZpZ1Jlcy5jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgIHJldHVybiB2YWxpZGF0ZUFuZHJvaWRDb25maWdSZXM7XG4gIH1cblxuICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xufTtcblxuY29uc3QgdmFsaWRhdGVJT1NDb25maWcgPSAoaU9TQ29uZmlnOiBJaU9TUHVzaENvbmZpZykgPT4ge1xuICBjb25zdCB7IHRocmVhZElkLCByaWNoTWVkaWFVcmkgfSA9IGlPU0NvbmZpZyB8fCB7fTtcbiAgaWYgKHRocmVhZElkICYmICFpc1N0cmluZyh0aHJlYWRJZCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgZXJyb3JNc2c6ICdpT1NDb25maWcudGhyZWFkSWQgdHlwZSBpcyBzdHJpbmcnLFxuICAgIH07XG4gIH1cblxuICBpZiAocmljaE1lZGlhVXJpICYmICFpc1N0cmluZyhyaWNoTWVkaWFVcmkpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5QQVJBTV9FUlJPUixcbiAgICAgIGVycm9yTXNnOiAnaU9TQ29uZmlnLnJpY2hNZWRpYVVyaSB0eXBlIGlzIHN0cmluZycsXG4gICAgfTtcbiAgfVxuICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xufTtcblxuY29uc3QgdmFsaWRhdGVBbmRyb2lkQ29uZmlnID0gKGFuZHJvaWRDb25maWc6IGFueSkgPT4ge1xuICBjb25zdCBhbmRyb2lkQ29uZmlnS2V5cyA9IFsnbm90aWZpY2F0aW9uSWQnLCAnY2hhbm5lbElkTWknLCAnbWlMYXJnZUljb25VcmwnLCAnY2hhbm5lbElkSFcnLCAnY2F0ZWdvcnlIVycsICdpbXBvcnRhbmNlSFcnLCAnaW1hZ2VVcmxIVycsICdjaGFubmVsSWRPUFBPJywgJ3R5cGVWaXZvJywgJ2NhdGVnb3J5Vml2bycsICdmY21DaGFubmVsSWQnLCAnZmNtQ29sbGFwc2VLZXknLCAnZmNtSW1hZ2VVcmwnLCAnaW1wb3J0YW5jZUhvbm9yJywgJ2ltYWdlVXJsSG9ub3InXTtcbiAgY29uc3Qga2V5SXNSaWdodCA9IE9iamVjdC5rZXlzKGFuZHJvaWRDb25maWcpLmV2ZXJ5KChrZXkpID0+IGFuZHJvaWRDb25maWdLZXlzLmluY2x1ZGVzKGtleSkpO1xuICBpZiAoIWtleUlzUmlnaHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgZXJyb3JNc2c6IGByaWdodCBrZXk6ICR7YW5kcm9pZENvbmZpZ0tleXMuam9pbignLCcpfWAsXG4gICAgfTtcbiAgfVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhbmRyb2lkQ29uZmlnS2V5cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBrZXkgPSBhbmRyb2lkQ29uZmlnS2V5c1tpbmRleF07XG4gICAgaWYgKGtleSA9PT0gJ2ltcG9ydGFuY2VIVycgfHwga2V5ID09PSAnaW1wb3J0YW5jZUhvbm9yJykge1xuICAgICAgaWYgKGFuZHJvaWRDb25maWdba2V5XSAmJiBhbmRyb2lkQ29uZmlnW2tleV0gIT09ICdMT1cnICYmIGFuZHJvaWRDb25maWdba2V5XSAhPT0gJ05PUk1BTCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuUEFSQU1fRVJST1IsXG4gICAgICAgICAgZXJyb3JNc2c6IGBhbmRyb2lkQ29uZmlnLiR7a2V5fSB2YWx1ZSBpcyBOT1JNQUx8TE9XYCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFuZHJvaWRDb25maWdba2V5XSAmJiAhaXNTdHJpbmcoYW5kcm9pZENvbmZpZ1trZXldKSkge1xuICAgICAgLyoqXG4gICAgICAgKiDmoKHpqowgc3RyaW5nIOexu+Wei1xuICAgICAgICovXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuUEFSQU1fRVJST1IsXG4gICAgICAgIGVycm9yTXNnOiBgYW5kcm9pZENvbmZpZy4ke2tleX0gdHlwZSBpcyBzdHJpbmdgLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVVzZXJJZHMgPSAodXNlcklkczogc3RyaW5nW10pOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh1c2VySWRzKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ3VzZXJJZHNcXCcgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nW11cXCcnIH07XG4gIH1cbiAgaWYgKCF1c2VySWRzLmxlbmd0aCkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ3VzZXJJZHNcXCcgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nW11cXCcnIH07XG4gIH1cbiAgaWYgKCF1c2VySWRzLmV2ZXJ5KChzdHIpID0+IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnICYmIHN0ci5sZW5ndGggPiAwKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ3VzZXJJZHNcXCcgcGFyYW1ldGVyIGlzIHJlcXVpcmVkJyB9O1xuICB9XG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xufTtcblxuZnVuY3Rpb24gaXNSQ0ZyYW1lUmF0ZSh2YWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBhcnJzID0gWydGUFNfMTAnLCAnRlBTXzE1JywgJ0ZQU18yNCcsICdGUFNfMzAnXTtcbiAgcmV0dXJuIGFycnMuaW5jbHVkZXModmFsKTtcbn1cblxuY29uc3QgaXNWYWxpZFJlc29sdXRpb24gPSAocmVzb2x1dGlvbj86IFJDUmVzb2x1dGlvbik6IGJvb2xlYW4gPT4gISFSQ1Jlc29sdXRpb25bcmVzb2x1dGlvbiFdO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVNZWRpYVN0cmVhbUNvbnN0cmFpbnRzID0gKGNvbnN0cmFpbnRzOiBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLmF1ZGlvICYmIHR5cGVvZiBjb25zdHJhaW50cy5hdWRpby5taWNwaG9uZUlkICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc3RyYWludHMuYXVkaW8ubWljcGhvbmVJZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdjb25zdHJhaW50cy5hdWRpby5taWNwaG9uZUlkXFwnIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG4gIH1cbiAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLmF1ZGlvICYmIHR5cGVvZiBjb25zdHJhaW50cy5hdWRpby5zYW1wbGVSYXRlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc3RyYWludHMuYXVkaW8uc2FtcGxlUmF0ZSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdjb25zdHJhaW50cy5hdWRpby5zYW1wbGVSYXRlXFwnIG11c3QgYmUgb2YgdHlwZSBcXCdudW1iZXJcXCcnIH07XG4gIH1cbiAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLnZpZGVvICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5jYW1lcmFJZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmNhbWVyYUlkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLnZpZGVvLmNhbWVyYUlkXFwnIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG4gIH1cbiAgLy8gaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLnZpZGVvICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5mYWNlTW9kZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWQgIT09ICd1c2VyJyAmJiBjb25zdHJhaW50cy52aWRlby5mYWNlTW9kZSAhPT0gJ2Vudmlyb25tZW50Jykge1xuICAvLyAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLnZpZGVvLmNhbWVyYUlkXFwnIG11c3QgYmUgIFxcJ3VzZXJcXCcgb3IgXFwnZW52aXJvbm1lbnRcXCcnIH1cbiAgLy8gfVxuXG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2NvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZVxcJyBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xuICB9XG5cbiAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLnZpZGVvICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUgIT09ICd1bmRlZmluZWQnICYmICFpc1JDRnJhbWVSYXRlKGNvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZSkpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdmcmFtZVJhdGVcXCcgdmFsdWUgaXMgb3V0IG9mIHJhbmdlJyB9O1xuICB9XG5cbiAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLnZpZGVvICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5yZXNvbHV0aW9uICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8ucmVzb2x1dGlvbiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGVcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbiAgfVxuXG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8ucmVzb2x1dGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzVmFsaWRSZXNvbHV0aW9uKGNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24pKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwncmVzb2x1dGlvblxcJyB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UnIH07XG4gIH1cbiAgaWYgKGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLnZpZGVvICYmICghY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlIHx8ICFjb25zdHJhaW50cy52aWRlby5yZXNvbHV0aW9uKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ3Jlc29sdXRpb25cXCcgYW5kIFxcJ3Jlc29sdXRpb25cXCcgaXMgcmVxdWlyZWQnIH07XG4gIH1cblxuICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbn07XG4iLCJleHBvcnQgY29uc3QgdGltZXJTZXRUaW1lb3V0ID0gKGZ1bmM6IEZ1bmN0aW9uLCB0aW1lb3V0OiBudW1iZXIpOiBudW1iZXIgPT4gc2V0VGltZW91dChmdW5jLCB0aW1lb3V0KSBhcyBudW1iZXI7XG4iLCJpbXBvcnQgeyB0aW1lclNldFRpbWVvdXQgfSBmcm9tICcuL2hlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBUaW1lciB7XG4gIHByaXZhdGUgX3RpbWVySWQ6IG51bWJlciA9IDBcblxuICBwcml2YXRlIF9zdGFydFRpbWU6IG51bWJlciA9IDBcblxuICBjb25zdHJ1Y3RvcihjYWxsYmFjazogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcikge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5fdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHN0b3AoKToge1xuICAgIHN0YXJ0VGltZTogbnVtYmVyLFxuICAgIGVuZFRpbWU6IG51bWJlcixcbiAgICBkdXJhdGlvbjogbnVtYmVyXG4gICAgfSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVySWQpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IGR1cmF0aW9uID0gZW5kVGltZSAtIHRoaXMuX3N0YXJ0VGltZTtcbiAgICBpZiAodGhpcy5fc3RhcnRUaW1lID09PSAwKSB7XG4gICAgICBkdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lLFxuICAgICAgZW5kVGltZSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH07XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSAwO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb252ZXJzYXRpb25UeXBlLCBJTG9nZ2VyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHtcbiAgSU1lZGlhTW9kaWZ5SW5mbyxcbiAgSU1lbWJlck1vZGlmeUluZm8sXG4gIElTZW5kZXJJbmZvLFxuICBJU3RhdGVDaGFuZ2VJbmZvLFxuICBJVXNlckRhdGEsXG4gIElVc2VyU3RhdGVDaGFuZ2VJbmZvLFxuICBJSW52aXRlT3B0aW9ucyxcbiAgUkNDYWxsRW5kUmVhc29uLFxuICBSQ0NhbGxFcnJvckNvZGUsXG4gIFJDQ2FsbE1lZGlhVHlwZSxcbiAgUkNDYWxsU2Vzc2lvblN0YXRlLFxuICBSQ0NhbGxTdGF0ZU1hY2hpbmUsXG4gIFJDQ2FsbFVzZXJTdGF0ZSxcbn0gZnJvbSAnQHJjLWVtYmVkL2NhbGwtZW5naW5lJztcbmltcG9ydCB7XG4gIElSQ1JUQ1N0YXRlUmVwb3J0LFxuICBSQ0tpY2tSZWFzb24sXG4gIFJDTG9jYWxUcmFjayxcbiAgUkNSZW1vdGVBdWRpb1RyYWNrLFxuICBSQ1JlbW90ZVRyYWNrLFxuICBSQ1JlbW90ZVZpZGVvVHJhY2ssXG4gIFJDUlRDQ2xpZW50LFxuICBSQ1JUQ0NvZGUsXG4gIFJDUlRDUGluZ1Jlc3VsdCxcbiAgUkNSVENSb29tLFxuICBJTWljcGhvbmVBdWRpb1Byb2ZpbGUsXG59IGZyb20gJ0Byb25nY2xvdWQvcGx1Z2luLXJ0Yyc7XG5cbmltcG9ydCB7IFByb2R1Y2VUeXBlcyB9IGZyb20gJy4vZW51bXMnO1xuXG5pbXBvcnQge1xuICBJRGV2aWNlQ2hhbmdlUGFyYW1zLFxuICBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyxcbiAgSU11dGVVc2VyLFxuICBJUkNDYWxsU2Vzc2lvbk9wdGlvbnMsXG4gIElTZXNzaW9uTGlzdGVuZXIsXG4gIElWYWxpZGF0aW9uUmVzdWx0LFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgZXZlbnRFbWl0dGVyIGZyb20gJy4vZXZlbnRFbWl0dGVyJztcbmltcG9ydCB7XG4gIHZhbGlkYXRlTGlzdGVuZXIsIHZhbGlkYXRlTWVkaWFTdHJlYW1Db25zdHJhaW50cywgdmFsaWRhdGVVc2VySWRzLCB2YWxpZGF0ZUV4dHJhLCB2YWxpZGF0ZVB1c2hUaXRsZSwgdmFsaWRhdGVQdXNoQ29udGVudCwgdmFsaWRhdGVQdXNoQ29uZmlnLFxufSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHsgVGltZXIgfSBmcm9tICcuL3RpbWVyJztcblxuZXhwb3J0IGNsYXNzIFJDQ2FsbFNlc3Npb24ge1xuICAvKipcbiAgICogUlRD5oi/6Ze05a6e5L6LXG4gICAqL1xuICBwcml2YXRlIF9yb29tITogUkNSVENSb29tXG5cbiAgLyoqXG4gICAqIOeUqOaIt+S8oOi/m+adpeeahCDlr7lzZXNzaW9u55qE55uR5ZCsICjopoHlnKhSQ0NhbGxDbGllbnTnmoRfb25JbnZpdGXph4zliKTmlq3vvIzopoHmsYLmiafooYzlroxvblNlc3Npb27lv4Xpobvms6jlhoxzZXNzaW9u55qE55uR5ZCs77yM5omA5Lul6L+Z6YeM5pivcHVibGljKVxuICAgKi9cbiAgcHVibGljIF9saXN0ZW5lcjogSVNlc3Npb25MaXN0ZW5lciB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIFJUQ+iuoumYheOAgeWPkeW4g+mHjeivleeahOasoeaVsFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfUkVUUllDT1VOVDogbnVtYmVyID0gMlxuXG4gIC8qKlxuICAgKiDliqDlhaXmiL/pl7Tlrprml7blmahcbiAgICovXG5cbiAgcHJpdmF0ZSBqb2luUm9vbVRpbWVyOiBhbnkgPSBudWxsXG5cbiAgY29uc3RydWN0b3IoXG5cbiAgICAvKipcbiAgICAgKiDnirbmgIHmnLrlrp7kvotcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zdGF0ZU1hY2hpbmU6IFJDQ2FsbFN0YXRlTWFjaGluZSxcblxuICAgIC8qKlxuICAgICAqIHJ0Y+WunuS+i1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J0Y0NsaWVudDogUkNSVENDbGllbnQsXG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IElMb2dnZXIsXG5cbiAgICAvKipcbiAgICAgKiBzZXNzaW9u55qE5YW25a6D6YCJ6aG5XG4gICAgICovXG4gICAgcHJpdmF0ZSBfb3B0aW9uczogSVJDQ2FsbFNlc3Npb25PcHRpb25zID0ge30sXG5cbiAgKSB7XG4gICAgLy8g55uR5ZCs54q25oCB5py6XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLnJlZ2lzdGVyRXZlbnRMaXN0ZW5lcih7XG4gICAgICAvKipcbiAgICAgICAqIOeUqOaIt+eKtuaAgeWPmOabtFxuICAgICAgICogQHBhcmFtIGluZm9cbiAgICAgICAqL1xuICAgICAgb25Vc2VyU3RhdGVDaGFuZ2U6ICh7IHVzZXIsIHJlYXNvbiB9OiBJVXNlclN0YXRlQ2hhbmdlSW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblVzZXJTdGF0ZUNoYW5nZV0gdXNlcklkLT4ke3VzZXI/LnVzZXJJZH0gc3RhdGUtPiR7dXNlcj8uc3RhdGV9IHJlYXNvbi0+JHtyZWFzb259YCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgICogQHBhcmFtXG4gICAgICAgKi9cbiAgICAgIG9uU3RhdGVDaGFuZ2U6IGFzeW5jIChpbmZvOiBJU3RhdGVDaGFuZ2VJbmZvKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RhdGUsIHJlYXNvbiB9ID0gaW5mbztcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25TdGF0ZUNoYW5nZV0gOiBzdGF0ZS0+JHtzdGF0ZX0gcmVhc29uLT4ke3JlYXNvbn1gKTtcblxuICAgICAgICAvLyDlpoLmnpzlnKjpgJror53kuK3vvIzlsLHliqDmiL/pl7RcbiAgICAgICAgaWYgKHN0YXRlID09PSBSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORykge1xuICAgICAgICAgIGNvbnN0IHJvb21JZDogc3RyaW5nID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxJZCgpO1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uU3RhdGVDaGFuZ2VdIHJvb21JZDogJHtyb29tSWR9YCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOWKoOaIv+mXtFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fam9pblJvb20ocm9vbUlkKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1IpO1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uU3RhdGVDaGFuZ2VdIGpvaW5Sb29tIHRocm93IGV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiAg5Lul5LiL5LiJ5p2h5Y+q6KaB5ruh6Laz5LiA5p2h77yM54q25oCB5Lya5Y+Y5oiQUkNDYWxsU2Vzc2lvblN0YXRlLkVORFxuICAgICAgICAgICAqICAx44CB5pys56uv55So5oi36Ieq5bex5Li75Yqo5oyC5patXG4gICAgICAgICAgICogIDLjgIHmnI3liqHnq6/miormnKznq6/nlKjmiLfouKLlh7pSVEPmiL/pl7RcbiAgICAgICAgICAgKiAgM+OAgeaIv+mXtOmHjOWwj+S6jjLkuKrkurpcbiAgICAgICAgICAgKi9cbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgICAgIC8vIOi/mOacquWKoOWFpeaIv+mXtOWwseaMguaWrVxuICAgICAgICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgICAgICAgLy8g6ZSA5q+B5pys5Zyw5rWB77yM5YWz6Zet5pGE5YOP5aS0XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX2Rlc3Ryb3lUcmFja3ModGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyk7XG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5SW5mbyA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRTdW1tYXJ5KCk7XG4gICAgICAgICAgICBldmVudEVtaXR0ZXIuZW1pdCgnc2Vzc2lvbkNsb3NlJywgeyBzZXNzaW9uOiB0aGlzLCBzdW1tYXJ5SW5mbyB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX2Rlc3Ryb3lUcmFja3ModGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyk7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25TdGF0ZUNoYW5nZV0gbG9jYWxUcmFja3MgZGVzdHJveWVkJyk7XG4gICAgICAgICAgdGhpcy5fbGVhdmVSb29tKCk7XG4gICAgICAgICAgdGhpcy5fcm9vbSA9IG51bGwgYXMgdW5rbm93biBhcyBSQ1JUQ1Jvb207XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICog5pS25Yiw5ZON6ZODXG4gICAgICAgKiBAcGFyYW0gc2VuZGVyIOWPkei1t+eUqOaIt+S/oeaBr1xuICAgICAgICovXG4gICAgICBvblJpbmdpbmc6IChzZW5kZXI6IElTZW5kZXJJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uUmluZ2luZ11zZW5kZXI6IHNlbmRlci51c2VySWQgLT4gJHtzZW5kZXIudXNlcklkfWApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8g6YCa55+l55So5oi35ZON6ZODXG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uUmluZ2luZyhzZW5kZXIsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvblJpbmdpbmddIG1ldGhvZCBleGNlcHRpb24gLT4gb25SaW5naW5nJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICAgKiDlvZPov5znq6/nlKjmiLflkIzmhI/mjqXlkKxcbiAgICAgICAgICovXG4gICAgICBvbkFjY2VwdDogKHNlbmRlcjogSVNlbmRlckluZm8pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25BY2NlcHRdc2VuZGVyOiBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XmnKznq6/vvIzov5znq6/nlKjmiLflt7LmjqXlkKxcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25BY2NlcHQoc2VuZGVyLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25BY2NlcHRdIG1ldGhvZCBleGNlcHRpb24gLT4gb25BY2NlcHQnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgICAqIOW9k+aciei/nOerr+eUqOaIt+aMguaWrVxuICAgICAgICAgKi9cbiAgICAgIG9uSHVuZ3VwOiAoc2VuZGVyOiBJU2VuZGVySW5mbywgcmVhc29uOiBSQ0NhbGxFbmRSZWFzb24pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25IdW5ndXBdc2VuZGVyOiBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH0gcmVhc29uLT4ke3JlYXNvbn1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XmnKznq6/vvIzov5znq6/nlKjmiLflt7LmjILmlq1cbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25IdW5ndXAoc2VuZGVyLCByZWFzb24sIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbkh1bmd1cF0gbWV0aG9kIGV4Y2VwdGlvbiAtPiBvbkh1bmd1cCcpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOS6uuWRmOWPmOabtFxuICAgICAgICogQHBhcmFtIHNlbmRlciDlj5HotbfnlKjmiLfkv6Hmga9cbiAgICAgICAqL1xuICAgICAgb25NZW1iZXJNb2RpZnk6ICh7IHNlbmRlciwgaW52aXRlZFVzZXJzIH06IElNZW1iZXJNb2RpZnlJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uTWVtYmVyTW9kaWZ5XSBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyDpgJrnn6XnlKjmiLfkurrlkZjlj5jmm7RcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25NZW1iZXJNb2RpZnkoc2VuZGVyLCBpbnZpdGVkVXNlcnMsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbk1lbWJlck1vZGlmeV0gbWV0aG9kIGV4Y2VwdGlvbiAtPiBvbk1lbWJlck1vZGlmeScpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOmAmuivneexu+Wei+WPmOabtCAo6YCa6K+d6ZmN57qnKVxuICAgICAgICogQHBhcmFtIHNlbmRlciDlj5HotbfnlKjmiLfkv6Hmga9cbiAgICAgICAqL1xuICAgICAgb25NZWRpYU1vZGlmeTogKHsgc2VuZGVyLCBtZWRpYVR5cGUgfTogSU1lZGlhTW9kaWZ5SW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvbk1lZGlhTW9kaWZ5XXNlbmRlcjogc2VuZGVyLnVzZXJJZCAtPiAke3NlbmRlci51c2VySWR9IG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCk7XG4gICAgICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJTykge1xuICAgICAgICAgIC8vIOi/nOerr+aUtuWIsOmAmuivnemZjee6p+mAmuefpeWQju+8jOi/nOerr+aJp+ihjOmZjee6p+mAmuivnSjkuI3lj5Hmtojmga8pXG4gICAgICAgICAgdGhpcy5fc2V0TWVkaWFUeXBlVG9BdWRpbygpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uTWVkaWFNb2RpZnkoc2VuZGVyLCBtZWRpYVR5cGUsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvbk1lZGlhTW9kaWZ5XSBtZXRob2QgZXhjZXB0aW9uIC0+IG9uTWVkaWFNb2RpZnknKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICog5piv5ZCm6LeoYXBwa2V5XG4gICAgICAgKiBAcGFyYW0gc2VuZGVyIOWPkei1t+eUqOaIt+S/oeaBr1xuICAgICAgICovXG4gICAgICBjcm9zc0FwcGtleTogKGlzQ3Jvc3NBcHBrZXk6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gY3Jvc3NBcHBrZXldIOaYr+WQpui3qCBhcHBrZXk6ICR7aXNDcm9zc0FwcGtleX1gKTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5pc0Nyb3NzQXBwa2V5ID0gaXNDcm9zc0FwcGtleTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiDorr7nva7mjILmlq3nmoTmjqjpgIHkv6Hmga9cbiAgICAgKi9cbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmUuc2V0SHVuZ3VwUHVzaENvbmZpZyh0aGlzLl9vcHRpb25zLmh1bmd1cFB1c2hDb25maWcgfHwgeyBwdXNoVGl0bGU6ICcnLCBwdXNoQ29udGVudDogJycgfSk7XG4gIH1cblxuICAvKipcbiAgICogIOWKoOWFpeaIv+mXtFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfam9pblJvb20ocm9vbUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBsZXQgY2FsbEJhY2s7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWKoOaIv+mXtFxuICAgICAgaWYgKHRoaXMuX29wdGlvbnMuaXNDcm9zc0FwcGtleSkge1xuICAgICAgICBjYWxsQmFjayA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5qb2luQ3Jvc3NSVENSb29tKHJvb21JZCwgdGhpcy5fb3B0aW9ucy5qb2luVHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsQmFjayA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5qb2luUlRDUm9vbShyb29tSWQsIHRoaXMuX29wdGlvbnMuam9pblR5cGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGNvZGUsIHVzZXJJZHMsIHJvb20gfSA9IGNhbGxCYWNrO1xuXG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgLy8g5aaC5p6c6Z+z6KeG6aKR5pyN5Yqh5pyq5byA6YCaXG4gICAgICAgIGlmIChjb2RlID09PSBSQ1JUQ0NvZGUuTk9UX09QRU5fVklERU9fQVVESU9fU0VSVkVSKSB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlNFUlZJQ0VfTk9UX09QRU5FRCk7XG4gICAgICAgICAgLy8g5bex5pa55YW25LuW56uv5bey5Zyo6YCa6K+d5LitXG4gICAgICAgIH0gaWYgKGNvZGUgPT09IFJDUlRDQ29kZS5TSUdOQUxfSk9JTl9SVENfUk9PTV9SRUZVU0VEKSB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk9USEVSX0NMSUVOVF9JTl9DQUxMKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IF9qb2luUm9vbV0gam9pbiByb29tIGZhaWxlZDogcm9vbUlkIC0+ICR7cm9vbUlkfSBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuSk9JTl9ST09NX0VSUk9SIH07XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICog576k6IGK5pys56uv5Yqg5YWl5oi/6Ze05ZCO77yM5pu05paw5Lq65ZGY54q25oCB5Li66YCa6K+d5LitXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvblR5cGUgPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q29udmVyc2F0aW9uVHlwZSgpO1xuICAgICAgY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCAmJiB0aGlzLl9zdGF0ZU1hY2hpbmUudXNlckpvaW4oW3RoaXMuX3J0Y0NsaWVudC5nZXRDdXJyZW50SWQoKV0pO1xuXG4gICAgICAvKipcbiAgICAgICAqIOmSiOWvueengeacieS6kSBAcm9uZ2Nsb3VkL3BsdWdpbi1ydGNANS4xLjEwLWVudGVycHJpc2UuNyDlop7liqDooaXkuIHvvIxcbiAgICAgICAqIOengeacieS6keWNh+WujCBSVEMgc2RrIOeJiOacrOWQjuWIoOaOieatpOihpeS4gVxuICAgICAgICog5Yqg5a6M5oi/6Ze05ZCO77yM5a+55pa55oyC5pat5LqG77yM6ZyA6YCA5Ye65oi/6Ze0XG4gICAgICAgKi9cbiAgICAgIGlmICh0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0U3RhdGUoKSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCkge1xuICAgICAgICBhd2FpdCB0aGlzLl9ydGNDbGllbnQubGVhdmVSb29tKHJvb20hKTtcbiAgICAgICAgdGhpcy5fcm9vbSA9IG51bGwgYXMgdW5rbm93biBhcyBSQ1JUQ1Jvb207XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gICAgICB9XG5cbiAgICAgIC8vIOiiq+WPq+aWueWKoOWFpeaIv+mXtOaIkOWKn++8jOS9huS4u+WPq+aWueWcqOWKoOWFpeaIv+mXtOWJjeemu+e6v1xuICAgICAgaWYgKHVzZXJJZHMhLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhpcy5qb2luUm9vbVRpbWVyID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05FVFdPUktfRVJST1IpO1xuICAgICAgICB9LCA2MDAwMCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yb29tID0gcm9vbSBhcyBSQ1JUQ1Jvb207XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfam9pblJvb21dIF9ydGNDbGllbnQuam9pblJUQ1Jvb20gdGhyb3cgZXhjZXB0aW9uIHJvb21JZCAtPiAke3Jvb21JZH1gKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkpPSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOaIv+mXtOS4iuazqOWGjOebkeWQrOS6i+S7tlxuICAgIHRoaXMuX3JlZ2lzdGVyUm9vbUV2ZW50TGlzdGVuZXIoKTtcblxuICAgIC8vIOazqOWGjOaIv+mXtOi0qOmHj+aVsOaNruebkeWQrOWZqFxuICAgIHRoaXMuX3JlZ2lzdGVyUmVwb3J0TGlzdGVuZXIoKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyDorqLpmIXov5znqIvnmoTmtYHvvIzmiorov5znqIvnmoTmtYHmipvnu5nnlKjmiLdcbiAgICAgIGF3YWl0IHRoaXMuX3N1YnNjcmliZUluUm9vbVJlbW90ZVRyYWNrKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIOe7k+adn+mAmuivnXNlc3Npb25cbiAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5TVUJTQ1JJQkVfRVJST1IpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9qb2luUm9vbV0gX3N1YnNjcmliZUluUm9vbVJlbW90ZVRyYWNrIEV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5KT0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8g5b6A5oi/6Ze06YeM5Y+R5biD5pys5Zyw6LWE5rqQXG4gICAgICBhd2FpdCB0aGlzLl9wdWJsaXNoKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIOe7k+adn+mAmuivnXNlc3Npb25cbiAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5QVUJMSVNIX0VSUk9SKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfam9pblJvb21dIF9wdWJsaXNoIEV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5KT0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiAo5Yid5aeL5YyW5oi/6Ze055qE5pe25YCZKSDorqLpmIXov5znqIvnmoTmtYHvvIzmiorov5znqIvnmoTmtYHmipvnu5nnlKjmiLdcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3N1YnNjcmliZUluUm9vbVJlbW90ZVRyYWNrKCkge1xuICAgIC8vIOiOt+WPluaJgOaciei/nOeoi+W3suWPkeW4g+eahOmfs+inhumikei1hOa6kOWIl+ihqFxuICAgIGNvbnN0IHRyYWNrczogUkNSZW1vdGVUcmFja1tdID0gdGhpcy5fcm9vbS5nZXRSZW1vdGVUcmFja3MoKTtcbiAgICBpZiAodHJhY2tzLmxlbmd0aCkge1xuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdWJzY3JpYmVSZXRyeSh0cmFja3MsIHRoaXMuX29wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5LCB0aGlzLl9SRVRSWUNPVU5UKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uU1VCU0NSSUJFX0VSUk9SKTtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9zdWJzY3JpYmVJblJvb21SZW1vdGVUcmFja10gUmVzb3VyY2Ugc3Vic2NyaXB0aW9uIGZhaWxlZCByb29tSWQgLT4gJHt0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2FsbElkKCl9IFJUQyBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Y+v5Lul6YeN6K+V55qE6K6i6ZiFXG4gICAqIEBwYXJhbSBwYXJhbXMudHJhY2tzIHRyYWNrc1xuICAgKiBAcGFyYW0gcGFyYW1zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSDmmK/lkKblhYHorrjph43or5VcbiAgICogQHBhcmFtIHBhcmFtcy5jb3VudCDlhYHorrjph43or5XnmoTmrKHmlbBcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3N1YnNjcmliZVJldHJ5KHRyYWNrczogUkNSZW1vdGVUcmFja1tdLCBpc0FsbG93U3Vic2NyaWJlUmV0cnk6IGJvb2xlYW4gPSBmYWxzZSwgY291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPHsgY29kZTogUkNSVENDb2RlIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20uc3Vic2NyaWJlKHRyYWNrcyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9saXN0ZW5lciEub25UcmFja1N1YnNjcmliZUZhaWwgJiYgdGhpcy5fbGlzdGVuZXIhLm9uVHJhY2tTdWJzY3JpYmVGYWlsKGNvZGUsIHRoaXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uXSBfbGlzdGVuZXIub25UcmFja1N1YnNjcmliZUZhaWwgZXhjZXB0aW9uJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICAvLyDlpoLmnpzkuI3lhYHorrjph43or5XvvIznm7TmjqXov5Tlm55cbiAgICAgIGlmICghaXNBbGxvd1N1YnNjcmliZVJldHJ5KSB7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgY291bnQtLTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZVJldHJ5KHRyYWNrcywgaXNBbGxvd1N1YnNjcmliZVJldHJ5LCBjb3VudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HluIPmnKzlnLDotYTmupDnmoTpgLvovpFcbiAgICpcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3B1Ymxpc2goKSB7XG4gICAgY29uc3QgdHJhY2tzID0gdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyE7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9wdWJsaXNoUmV0cnkodHJhY2tzLCB0aGlzLl9vcHRpb25zLmlzQWxsb3dQdWJsaXNoUmV0cnksIHRoaXMuX1JFVFJZQ09VTlQpO1xuXG4gICAgLy8g6Iul6LWE5rqQ5Y+R5biD5aSx6LSlXG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uUFVCTElTSF9FUlJPUik7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBfcHVibGlzdF0gUmVzb3VyY2UgcHVibGlzaGluZyBmYWlsZWQ6IHJvb21JZCAtPiAke3RoaXMuX3N0YXRlTWFjaGluZS5nZXRDYWxsSWQoKX0gUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDlpoLmnpzmmK/kuLvliqjlj5HotbfnmoTlkbzlj6vvvIzlt7Lmj5DliY3mipvlh7rkuobotYTmupAsIOiiq+WKqOWRvOWPq++8jOi/memHjOaJjemcgOimgeaKm+WHulxuICAgIGlmICh0aGlzLl9vcHRpb25zLnByb2R1Y2VUeXBlID09PSBQcm9kdWNlVHlwZXMuQ0FMTEVFKSB7XG4gICAgICAvLyDlkJHlpJbmipvlh7rmnKzlnLDmtYEsIOmAmuefpeS4muWKoeWxgnRyYWNrUmVhZHlcbiAgICAgIHRoaXMuX25vdGlmeVRyYWNrUmVhZHkodHJhY2tzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Y+v5Lul6YeN6K+V55qE5Y+R5biDXG4gICAqIEBwYXJhbSBwYXJhbXMudHJhY2tzIHRyYWNrc1xuICAgKiBAcGFyYW0gcGFyYW1zLmlzQWxsb3dQdWJsaXNoUmV0cnkg5piv5ZCm5YWB6K646YeN6K+VXG4gICAqIEBwYXJhbSBwYXJhbXMuY291bnQg5YWB6K646YeN6K+V55qE5qyh5pWwXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9wdWJsaXNoUmV0cnkodHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSwgaXNBbGxvd1B1Ymxpc2hSZXRyeTogYm9vbGVhbiA9IGZhbHNlLCBjb3VudDogbnVtYmVyID0gMCk6IFByb21pc2U8eyBjb2RlOiBSQ1JUQ0NvZGUgfT4ge1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKHRyYWNrcyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9saXN0ZW5lciEub25UcmFja1B1Ymxpc2hGYWlsICYmIHRoaXMuX2xpc3RlbmVyIS5vblRyYWNrUHVibGlzaEZhaWwoY29kZSwgdGhpcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb25dIF9saXN0ZW5lci5vblRyYWNrUHVibGlzaEZhaWwgZXhjZXB0aW9uJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICAvLyDlpoLmnpzkuI3lhYHorrjph43or5XvvIznm7TmjqXov5Tlm55cbiAgICAgIGlmICghaXNBbGxvd1B1Ymxpc2hSZXRyeSkge1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgIGNvdW50LS07XG4gICAgICAgIHJldHVybiB0aGlzLl9wdWJsaXNoUmV0cnkodHJhY2tzLCBpc0FsbG93UHVibGlzaFJldHJ5LCBjb3VudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgIDlh7rmiL/pl7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2xlYXZlUm9vbSgpIHtcbiAgICB0cnkge1xuICAgICAgLy8g6YCA5Ye65oi/6Ze0XG4gICAgICBjb25zdCBjYWxsQmFjayA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5sZWF2ZVJvb20odGhpcy5fcm9vbSk7XG4gICAgICAvLyDmiJDlip/pgIDlh7rmiL/pl7TvvIzop6blj5FSQ0NhbGxDbGllbnTlrp7kvovkuIrnmoRvblNlc3Npb25DbG9zZeebkeWQrO+8jOaKm+e7meeUqOaIt+S/oeaBr1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2xlYXZlUm9vbV0gU3VjY2Vzc2Z1bGx5IGV4aXRlZCB0aGUgcm9vbSBjb2RlOiAke2NhbGxCYWNrLmNvZGV9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBfbGVhdmVSb29tXSBsZWF2ZVJvb20gdGhyb3cgZXhjZXB0aW9uJyk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3Qgc3VtbWFyeUluZm8gPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0U3VtbWFyeSgpO1xuICAgICAgZXZlbnRFbWl0dGVyLmVtaXQoJ3Nlc3Npb25DbG9zZScsIHsgc2Vzc2lvbjogdGhpcywgc3VtbWFyeUluZm8gfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWHuueOsOW8guW4uOWQjuimgeWkhOeQhueahOmAu+i+kSxcbiAgICogQHBhcmFtIGVuZFJlYXNvbiDljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX2V4Y2VwdGlvbkNsb3NlKGVuZFJlYXNvbjogUkNDYWxsRW5kUmVhc29uKSB7XG4gICAgLy8g6ZSA5q+B5pys5Zyw5rWBXG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9kZXN0cm95VHJhY2tzKHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MpO1xuXG4gICAgLy8g57uT5p2f54q25oCB5py6XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLmNsb3NlKGVuZFJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog55So5oi36LCD55So55qE77yM5rOo5YaMc2Vzc2lvbuS4iueahOebkeWQrFxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyU2Vzc2lvbkxpc3RlbmVyKGxpc3RlbmVyOiBJU2Vzc2lvbkxpc3RlbmVyKTogdm9pZCB7XG4gICAgLy8g5YWI5qCh6aqMbGlzdGVuZXIsIOWmguaenOS4jemAmui/h++8jOS8mnRyb3cgZXJyb3JcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgIGlmICghY29uY2x1c2lvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbFNlc3Npb24gcmVnaXN0ZXJTZXNzaW9uTGlzdGVuZXJdICR7Y29uY2x1c2lvbi5tc2d9YCk7XG4gICAgfVxuICAgIHRoaXMuX2xpc3RlbmVyID0geyAuLi5saXN0ZW5lciB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiwg1JUQyBBUEkg6I635b6X5pys5Zyw5rWBXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9nZXRMb2NhbFRyYWNrQ29yZShtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSwgY29uc3RyYWludHM/OiBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHRyYWNrcz86IFJDTG9jYWxUcmFja1tdIH0+IHtcbiAgICAvLyDmo4DmtYvmmK/lkKbog73lpJ/ojrflvpfmnKzlnLDmtYFcbiAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8pIHtcbiAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQXVkaW9UcmFjaygnUm9uZ0Nsb3VkUlRDJywgY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgeyAuLi5jb25zdHJhaW50cy5hdWRpbyB9KTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2dldExvY2FsVHJhY2tDb3JlXSBnZXQgQXVkaW8gbG9jYWwgdHJhY2tzIGZhaWxlZCBSQ1QgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fVFJBQ0tfRVJST1IgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIF9nZXRMb2NhbFRyYWNrQ29yZV0gc3VjY2Vzc2Z1bGx5IGdldCBBdWRpbyBsb2NhbCB0cmFja3MnKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCB0cmFja3M6IFt0cmFjayFdIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUFuZENhbWVyYVRyYWNrcygnUm9uZ0Nsb3VkUlRDJywgY29uc3RyYWludHMgJiYgeyAuLi5jb25zdHJhaW50cyB9KTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfZ2V0TG9jYWxUcmFja0NvcmVdIGdldCBBdWRpbyBhbmQgVmlkZW8gbG9jYWwgdHJhY2tzIGZhaWxlZCBSQ1QgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX0FORF9WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsU2Vzc2lvbiBfZ2V0TG9jYWxUcmFja0NvcmVdIHN1Y2Nlc3NmdWxseSBnZXQgYXVkaW8gYW5kIHZpZGVvIGxvY2FsIHRyYWNrcycpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCB0cmFja3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2dldExvY2FsVHJhY2sobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUsIGNvbnN0cmFpbnRzPzogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCB0cmFja3M/OiBSQ0xvY2FsVHJhY2tbXSB9PiB7XG4gICAgLy8g5bm25LiU5piv6I635b6X6Z+z6KeG6aKRLCDlubbkuJQg77yI5aaC5p6c6I635b6X6Z+z6KeG6aKR5LiN5oiQ5Yqf77yM5YWB6K646ZmN57qn6I635b6X6Z+z6aKR77yJXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtICYmIG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPKSB7XG4gICAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUoUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPLCBjb25zdHJhaW50cyk7XG5cbiAgICAgIC8vIOWmguaenOmfs+inhumikeS4jeiDveiOt+W+l++8jOWwsemZjee6p+iOt+W+l+mfs+mikVxuICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShSQ0NhbGxNZWRpYVR5cGUuQVVESU8sIGNvbnN0cmFpbnRzKTtcbiAgICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgICAgLy8g6I635Y+W6LWE5rqQ5aSx6LSl77yM6ZyA6KaB6LCD54q25oCB5py6c3RhdGUg5Li6IGVuZFxuICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5HRVRfTUVESUFfUkVTT1VSQ0VTX0VSUk9SKTtcbiAgICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY29kZSwgdHJhY2tzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjb2RlLCB0cmFja3MgfTtcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShtZWRpYVR5cGUsIGNvbnN0cmFpbnRzKTtcbiAgICBpZiAoX2NvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICAvLyDojrflj5botYTmupDlpLHotKXvvIzpnIDopoHosIPnirbmgIHmnLpzdGF0ZSDkuLogZW5kXG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uR0VUX01FRElBX1JFU09VUkNFU19FUlJPUik7XG5cbiAgICAgIHJldHVybiB7IGNvZGU6IF9jb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3mm7TmjaLpn7PpopHorr7lpIdcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjaGFuZ2VBdWRpb0RldmljZShhdWRpb0NvbnN0cmFpbnRzPzogSU1pY3Bob25lQXVkaW9Qcm9maWxlKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgLy8g5paw6K6+5aSH55qEdHJhY2tcbiAgICBjb25zdCByZWNlbnRUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICAvLyDmlbTnkIblkI7nmoTmnKzlnLB0cmFja1xuICAgIGNvbnN0IGxvY2FsVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQXVkaW9UcmFjaygnUm9uZ0Nsb3VkUlRDJywgYXVkaW9Db25zdHJhaW50cyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gY2hhbmdlRGV2aWNlXSBnZXQgbG9jYWwgQXVkaW8gdHJhY2tzIGZhaWxlZCBSQ1RMaWIgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIGlmICh0cmFjay5pc0F1ZGlvVHJhY2soKSkge1xuICAgICAgICAvLyDkuYvliY3nmoTpn7PpopHpg73plIDmr4HvvIzvvIhSVENMaWIgU0RL5YaF6YOo5Lya5ZyoIGFkZExvY2FsVHJhY2sg5riF55CG5ZCM57G75Z6L6L2o6YGT5pWw5o2u77yM5omA5Lul6L+Z6YeM5rOo6YeK5o6J77yJXG4gICAgICAgIC8vIHRyYWNrLmRlc3Ryb3koKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5Y+q5oqK5LmL5YmN55qE6KeG6aKR55WZ5LiLXG4gICAgICAgIGxvY2FsVHJhY2tzLnB1c2godHJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVjZW50VHJhY2tzLnB1c2godHJhY2shKTtcblxuICAgIC8vIOWKoOS4iuacrOWcsOaWsOS6p+eUn+eahOmfs+mikVxuICAgIGxvY2FsVHJhY2tzLnB1c2godHJhY2shKTtcbiAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzID0gbG9jYWxUcmFja3M7XG4gICAgLy8g6YCa55+l5Lia5Yqh5bGCdHJhY2tSZWFkeVxuICAgIHRoaXMuX25vdGlmeVRyYWNrUmVhZHkocmVjZW50VHJhY2tzKTtcblxuICAgIC8vIOWmguaenOW9k+WJjeW3suWKoOWFpeaIv+mXtO+8jOWPkeW4g+aWsOa1gVxuICAgIGlmICh0aGlzLl9yb29tKSB7XG4gICAgICAvLyDlj5HluIPmlrDmtYFcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKHJlY2VudFRyYWNrcyk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkFVRElPX1BVQkxJU0hfRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnvqTlkbzlj6vkuK3nu6fnu63pgoDor7dcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+355So5oi3IElEIOWIl+ihqFxuICAgKiBAcGFyYW0gb3B0aW9ucy5leHRyYSDmtojmga/nmoTmianlsZXkv6Hmga9cbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg5bqf5byDIG9wdGlvbnMucHVzaFRpdGxlIOmAmuefpeeahOagh+mimFxuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDlup/lvIMgb3B0aW9ucy5wdXNoQ29udGVudCDpgJrnn6XlhoXlrrlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbnZpdGUodXNlcklkczogc3RyaW5nW10sIG9wdGlvbnM6IElJbnZpdGVPcHRpb25zID0ge30pOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCB7IGV4dHJhID0gJycgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgcHVzaENvbmZpZyA9IHRoaXMuX29wdGlvbnMuY2FsbFB1c2hDb25maWcgPyB0aGlzLl9vcHRpb25zLmNhbGxQdXNoQ29uZmlnIDogb3B0aW9ucy5wdXNoQ29uZmlnO1xuICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0W10gPSBbdmFsaWRhdGVVc2VySWRzKHVzZXJJZHMpLCB2YWxpZGF0ZUV4dHJhKGV4dHJhKV07XG4gICAgaWYgKHB1c2hDb25maWcpIHtcbiAgICAgIGNvbnN0IHsgY29kZSwgZXJyb3JNc2cgfSA9IHZhbGlkYXRlUHVzaENvbmZpZyhwdXNoQ29uZmlnKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gaW52aXRlXSBwYXJhbSBlcnJvciwgZXJyb3JNc2c6ICR7ZXJyb3JNc2d9YCk7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVzdWx0ID0gY29uY2x1c2lvbi5ldmVyeSgob2JqOiBJVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgIW9iai5yZXN1bHQgJiYgbWVzc2FnZXMucHVzaChvYmoubXNnISk7XG4gICAgICByZXR1cm4gb2JqLnJlc3VsdDtcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxDbGllbnQgaW52aXRlXSAke21lc3NhZ2VzLmpvaW4oJ1xcbicpfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc3RhdGVNYWNoaW5lLmludml0ZSh1c2VySWRzLCB7XG4gICAgICBleHRyYSwgcHVzaENvbmZpZyxcbiAgICB9KTtcbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5ZCM5oSP5o6l5ZCsXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWNjZXB0KGNvbnN0cmFpbnRzPzogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlTWVkaWFTdHJlYW1Db25zdHJhaW50cyhjb25zdHJhaW50cyEpO1xuICAgIGlmICghY29uY2x1c2lvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbFNlc3Npb24gYWNjZXB0XSAke2NvbmNsdXNpb24ubXNnfWApO1xuICAgIH1cblxuICAgIC8vIOaOpeWQrOS5i+WJje+8jOWFiOaMguaWreW9k+WJjeS5i+WklueahHNlc3Npb27vvIznjrDpmLbmrrXkuI3lhYHorrjnlKjmiLflhYjmi6nmjqXlkKxzZXNzaW9u77yM5LqL5YWI5Lya5Zyo54q25oCB5py65YaF6YOo5oyC5pat77yM6L+Z6YeM5oqb5Ye65Y6777yM5Lya5riF55CG5YW25a6D55qEc2Vlc2lvblxuICAgIGV2ZW50RW1pdHRlci5lbWl0KCdodW5ndXBPdGhlclNlc3Npb24nLCB7IHNlc3Npb246IHRoaXMgfSk7XG4gICAgY29uc3QgbWVkaWFUeXBlID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldE1lZGlhVHlwZSgpO1xuICAgIGNvbnN0IHsgY29kZTogX2NvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFjayhtZWRpYVR5cGUsIGNvbnN0cmFpbnRzKTtcbiAgICBpZiAoX2NvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBfY29kZSB9O1xuICAgIH1cbiAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzID0gdHJhY2tzO1xuXG4gICAgLy8g5Y+R6YCB5o6l5ZCs55qE5raI5oGvXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmUuYWNjZXB0KCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gYWNjZXB0XVNlbmQgYWNjZXB0IG1lc3NhZ2UgZmFpbGVkIC0+IGNvZGU6ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaMguaWrVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGh1bmd1cCgpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlOyB9PiB7XG4gICAgLy8gY29uc3Qgc3VtbWFyeUluZm8gPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0U3VtbWFyeSgpXG4gICAgLy8gZXZlbnRFbWl0dGVyLmVtaXQoJ3Nlc3Npb25DbG9zZScsIHsgc2Vzc2lvbjogdGhpcywgc3VtbWFyeUluZm8gfSlcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmh1bmd1cCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneWqkuS9k+WPmOabtFxuICAgKiAgQHBhcmFtIG1lZGlhVHlwZSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8g5pS55Li66Z+z6aKR6YCa6K+dIHwgUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPIOaUueS4uumfs+inhumikemAmuivnVxuICAgKi9cbiAgcHVibGljIGFzeW5jIF9jaGFuZ2VNZWRpYVR5cGUobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N0YXRlTWFjaGluZS5jaGFuZ2VNZWRpYVR5cGUobWVkaWFUeXBlKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfY2hhbmdlTWVkaWFUeXBlXSBjaGFuZ2UgbWVkaWEgdHlwZSBmYWlsIGNvZGUtPiAke2NvZGV9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfmnKzlnLDop4bpopFcbiAgICovXG4gIHByaXZhdGUgX2dldExvY2FsVmlkZW9UcmFja3MoKTogUkNMb2NhbFRyYWNrW10ge1xuICAgIGxldCBsb2NhbFZpZGVvVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIGxvY2FsVmlkZW9UcmFja3M7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzKSB7XG4gICAgICBsb2NhbFZpZGVvVHJhY2tzID0gdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc1ZpZGVvVHJhY2soKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbFZpZGVvVHJhY2tzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+W+l+acrOWcsOmfs+mikVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0TG9jYWxBdWRpb1RyYWNrcygpOiBSQ0xvY2FsVHJhY2tbXSB7XG4gICAgbGV0IGxvY2FsQXVkaW90cmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICByZXR1cm4gbG9jYWxBdWRpb3RyYWNrcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MpIHtcbiAgICAgIGxvY2FsQXVkaW90cmFja3MgPSB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzLmZpbHRlcigodHJhY2spID0+IHRyYWNrLmlzQXVkaW9UcmFjaygpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsQXVkaW90cmFja3M7XG4gIH1cblxuICAvKipcbiAgICog5oqK6YCa6K+d55qETWVkaWFUeXBl5Y2H57qn5Yiw6Z+z6KeG6aKRXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zZXRNZWRpYVR5cGVUb0F1ZGlvQW5kVmlkZW8oKSB7XG4gICAgLy8g6I635b6X5pys56uv6KeG6aKR6LWE5rqQXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZUNhbWVyYVZpZGVvVHJhY2soKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g5Y+R5biD5pys56uv6KeG6aKR6LWE5rqQXG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKFt0cmFjayFdKTtcblxuICAgIC8vIOiLpei1hOa6kOWPkeW4g+Wksei0pVxuICAgIGlmIChfY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfZW5hYmxlVmlkZW9dIFJlc291cmNlIHB1Ymxpc2hpbmcgZmFpbGVkOiBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOmAmuefpeS4muWKoeWxgnRyYWNrUmVhZHlcbiAgICB0aGlzLl9ub3RpZnlUcmFja1JlYWR5KFt0cmFjayFdKTtcblxuICAgIC8vIOWPkea2iOaBr1xuICAgIHRoaXMuX2NoYW5nZU1lZGlhVHlwZShSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8pO1xuICB9XG5cbiAgLyoqXG4gICAqIOaKiumAmuivneeahE1lZGlhVHlwZemZjee6p+WIsOmfs+mikVxuICAgKiBAcGFyYW0gaXNTZW5kTWVzc3NhZ2Ug5piv5ZCm6ZyA6KaB5Y+R5raI5oGvLCDpu5jorqTlj5Hmtojmga9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3NldE1lZGlhVHlwZVRvQXVkaW8oKSB7XG4gICAgY29uc3QgdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IHRoaXMuX2dldExvY2FsVmlkZW9UcmFja3MoKTtcbiAgICBpZiAodHJhY2tzLmxlbmd0aCkge1xuICAgICAgLy8g56aB55So6KeG6aKRXG4gICAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgICB0cmFjay5tdXRlKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8g5Y+W5raI5Y+R5biD6KeG6aKRXG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20udW5wdWJsaXNoKHRyYWNrcyk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVWaWRlb10gdW5wdWJsaXNoIGZhaWxlZCAtPiAke2NvZGV9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIOWFs+mXreaRhOWDj+WktFxuICAgICAgdGhpcy5fZGVzdHJveVRyYWNrcyh0cmFja3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53pmY3nuqfvvIznm67liY3pnIDmsYLlj6rlgZrpgJror53pmY3nuqfvvIzpn7Pop4bpopHlj6/ku6XpmY3nuqfkuLrpn7PpopHvvIzpn7PpopHkuI3og73ljYfliLDpn7Pop4bpopEsIOWPkea2iOaBr+aIkOWKn+aJjeeul+mZjee6p+aIkOWKn1xuICAgKlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlc2NlbmRBYmlsaXR5KCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2hhbmdlTWVkaWFUeXBlKFJDQ2FsbE1lZGlhVHlwZS5BVURJTyk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9zZXRNZWRpYVR5cGVUb0F1ZGlvKCk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjop4bpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc2FibGVWaWRlb1RyYWNrKCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVBdWRpb1RyYWNrXSBSb29tIG1pc3NpbmcgYXVkaW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFja3M6IFJDTG9jYWxUcmFja1tdID0gdGhpcy5fZ2V0TG9jYWxWaWRlb1RyYWNrcygpO1xuICAgIGlmICghdHJhY2tzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVWaWRlb1RyYWNrXSBSb29tIG1pc3NpbmcgdmlkZW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5NSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g56aB55So6KeG6aKRXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIHRyYWNrLm11dGUoKTtcbiAgICB9KTtcblxuICAgIC8vIOWmguaenOS4jemcgOWFs+mXreaRhOWDj+WktFxuICAgIGlmICghdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgLy8g5Y+W5raI5Y+R5biD6KeG6aKRXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnVucHVibGlzaCh0cmFja3MpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVWaWRlb10gdW5wdWJsaXNoIGZhaWxlZCAtPiAke2NvZGV9YCk7XG5cbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5VTlBVQkxJU0hfVklERU9fRVJST1IgfTtcbiAgICB9XG5cbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgLy8g5YWz6Zet5pGE5YOP5aS0XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWQr+eUqOinhumikXRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5hYmxlVmlkZW9UcmFjaygpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g5aaC5p6c5LiN6ZyA5YWz6Zet5pGE5YOP5aS0XG4gICAgaWYgKCF0aGlzLl9vcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSkge1xuICAgICAgY29uc3QgdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IHRoaXMuX2dldExvY2FsVmlkZW9UcmFja3MoKTtcbiAgICAgIGlmICghdHJhY2tzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gRW5hYmxlVmlkZW9UcmFja10gUm9vbSBtaXNzaW5nIHZpZGVvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk1JU1NJTkdfVklERU9fVFJBQ0tfRVJST1J9YCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5NSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgICB9XG5cbiAgICAgIC8vIOWQr+eUqOinhumikVxuICAgICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgICAgdHJhY2sudW5tdXRlKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgLy8g6I635b6X5pys56uv6KeG6aKR6LWE5rqQXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZUNhbWVyYVZpZGVvVHJhY2soKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBFbmFibGVWaWRlb1RyYWNrXSBHZXQgUmVzb3VyY2UgZmFpbGVkOiBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cbiAgICBjb25zdCBsb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcbiAgICB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzICYmIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgaWYgKHRyYWNrLmlzVmlkZW9UcmFjaygpKSB7XG4gICAgICAgIC8vIOS5i+WJjeeahOinhumikemDvemUgOavgVxuICAgICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDlj6rnlZnkuIvkuYvliY3nmoTpn7PpopFcbiAgICAgICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDliqDkuIrmnKzlnLDmlrDkuqfnlJ/nmoTop4bpopFcbiAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrISk7XG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyA9IGxvY2FsVHJhY2tzO1xuXG4gICAgLy8g5Li65LqG6Kem5Y+R5a+55pa555qEb25WaWRlb011dGVDaGFuZ2Ug5YWI56aB55SoXG4gICAgdHJhY2shLm11dGUoKTtcblxuICAgIC8vIOWPkeW4g+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20ucHVibGlzaChbdHJhY2shXSk7XG5cbiAgICAvLyDoi6XotYTmupDlj5HluIPlpLHotKVcbiAgICBpZiAoX2NvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gRW5hYmxlVmlkZW9UcmFja10gUmVzb3VyY2UgcHVibGlzaGluZyBmYWlsZWQ6IFJDUlRDQ29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuVklERU9fUFVCTElTSF9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWQr+eUqFxuICAgIHRyYWNrIS51bm11dGUoKTtcblxuICAgIC8vIOmAmuefpeS4muWKoeWxgnRyYWNrUmVhZHlcbiAgICB0aGlzLl9ub3RpZnlUcmFja1JlYWR5KFt0cmFjayFdKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOemgeeUqOmfs+mikXRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzYWJsZUF1ZGlvVHJhY2soKSB7XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZUF1ZGlvVHJhY2tdIFJvb20gbWlzc2luZyBhdWRpbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbEF1ZGlvVHJhY2tzKCk7XG5cbiAgICAvLyDnpoHnlKjpn7PpopFcbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjaykgPT4ge1xuICAgICAgdHJhY2subXV0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWQr+eUqOmfs+mikXRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5hYmxlQXVkaW9UcmFjaygpIHtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IHRoaXMuX2dldExvY2FsQXVkaW9UcmFja3MoKTtcblxuICAgIGlmICghdHJhY2tzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVBdWRpb1RyYWNrXSBSb29tIG1pc3NpbmcgYXVkaW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5NSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g5ZCv55So6Z+z6aKRXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIHRyYWNrLnVubXV0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOmUgOavgeacrOWcsOa1gVxuICAgKi9cbiAgcHJpdmF0ZSBfZGVzdHJveVRyYWNrcyh0cmFja3M6IFJDTG9jYWxUcmFja1tdKSB7XG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkJHlpJbmipvlh7rmnKzlnLDmtYFcbiAgICovXG4gIHByaXZhdGUgX25vdGlmeVRyYWNrUmVhZHkodHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSB8IFJDUmVtb3RlVHJhY2tbXSkge1xuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrIHwgUkNSZW1vdGVUcmFjaykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uVHJhY2tSZWFkeSh0cmFjaywgdGhpcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gX25vdGlmeVRyYWNrUmVhZHldIF9saXN0ZW5lciBvblRyYWNrUmVhZHkgZXhjZXB0aW9uJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOaIv+mXtOS4iuazqOWGjOS6i+S7tlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJSb29tRXZlbnRMaXN0ZW5lcigpIHtcbiAgICB0aGlzLl9yb29tLnJlZ2lzdGVyUm9vbUV2ZW50TGlzdGVuZXIoXG4gICAgICB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDmnKznq6/ooqvouKLlh7rmiL/pl7Tml7bop6blj5FcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIOiiq+i4ouWHuuaIv+mXtOWPr+iDveaYr+eUseS6juacjeWKoeerr+i2heWHuuS4gOWumuaXtumXtOacquiDveaUtuWIsCBydGNQaW5nIOa2iOaBr++8jOaJgOS7peiupOS4uuW3seaWueemu+e6v+OAglxuICAgICAgICAgKiDlj6bkuIDnp43lj6/og73mmK/lt7HmlrkgcnRjUGluZyDlpLHotKXmrKHmlbDotoXlh7rkuIrpmZDvvIzmlYXogIzkuLvliqjmlq3nur9cbiAgICAgICAgICogQHBhcmFtIGJ5U2VydmVyXG4gICAgICAgICAqIOW9k+WAvOS4uiBmYWxzZSDml7bvvIzor7TmmI7mnKznq68gcnRjUGluZyDotoXml7ZcbiAgICAgICAgICog5b2T5YC85Li6IHRydWUg5pe277yM6K+05piO5pys56uv5pS25Yiw6KKr6Lii5Ye65oi/6Ze06YCa55+lXG4gICAgICAgICAqL1xuICAgICAgICBvbktpY2tPZmY6IChieVNlcnZlcjogYm9vbGVhbiwgc3RhdGU/OiBSQ0tpY2tSZWFzb24gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VXNlcklkOiBzdHJpbmcgPSB0aGlzLl9ydGNDbGllbnQuZ2V0Q3VycmVudElkKCk7XG4gICAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lLnVzZXJMZWF2ZShbY3VycmVudFVzZXJJZF0pO1xuXG4gICAgICAgICAgaWYgKCFieVNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUgPT09IFJDS2lja1JlYXNvbi5TRVJWRVJfS0lDSykge1xuICAgICAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uS0lDS0VEX0JZX1NFUlZFUik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUgPT09IFJDS2lja1JlYXNvbi5PVEhFUl9LSUNLKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaOpeaUtuWIsOaIv+mXtOS/oeS7pOaXtuWbnuiwg++8jOeUqOaIt+WPr+mAmui/h+aIv+mXtOWunuS+i+eahCBgc2VuZE1lc3NhZ2UobmFtZSwgY29udGVudClgIOaOpeWPo+WPkemAgeS/oeS7pFxuICAgICAgICAgKiBAcGFyYW0gbmFtZSDkv6Hku6TlkI1cbiAgICAgICAgICogQHBhcmFtIGNvbnRlbnQg5L+h5Luk5YaF5a65XG4gICAgICAgICAqIEBwYXJhbSBzZW5kZXJVc2VySWQg5Y+R6YCB6ICFIElkXG4gICAgICAgICAqIEBwYXJhbSBtZXNzYWdlVUlkIOa2iOaBr+WUr+S4gOagh+ivhlxuICAgICAgICAgKi9cbiAgICAgICAgb25NZXNzYWdlUmVjZWl2ZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IGFueSwgc2VuZGVyVXNlcklkOiBzdHJpbmcsIG1lc3NhZ2VVSWQ6IHN0cmluZykge1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog55uR5ZCs5oi/6Ze05bGe5oCn5Y+Y5pu06YCa55+lXG4gICAgICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICAgICAqIEBwYXJhbSBjb250ZW50XG4gICAgICAgICAqL1xuICAgICAgICBvblJvb21BdHRyaWJ1dGVDaGFuZ2UobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpIHtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOWPkeW4g+iAheemgeeUqC/lkK/nlKjpn7PpopFcbiAgICAgICAgICogQHBhcmFtIGF1ZGlvVHJhY2sgUkNSZW1vdGVBdWRpb1RyYWNrIOexu+WunuS+i1xuICAgICAgICAgKi9cbiAgICAgICAgb25BdWRpb011dGVDaGFuZ2U6IChhdWRpb1RyYWNrOiBSQ1JlbW90ZUF1ZGlvVHJhY2spID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvbkF1ZGlvTXV0ZUNoYW5nZV0gdXNlcklkLT4ke2F1ZGlvVHJhY2suZ2V0VXNlcklkKCl9IG11dGVkIC0+ICR7YXVkaW9UcmFjay5pc093bmVyTXV0ZWQoKX1gKTtcbiAgICAgICAgICBjb25zdCBtdXRlVXNlcjogSU11dGVVc2VyID0ge1xuICAgICAgICAgICAgdXNlcklkOiBhdWRpb1RyYWNrLmdldFVzZXJJZCgpLFxuICAgICAgICAgICAgbXV0ZWQ6IGF1ZGlvVHJhY2suaXNPd25lck11dGVkKCksXG4gICAgICAgICAgICBraW5kOiAnYXVkaW8nLFxuICAgICAgICAgICAgdHJhY2tJZDogYXVkaW9UcmFjay5nZXRUcmFja0lkKCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8g6YCa55+l57uZ5Lia5YqhXG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25BdWRpb011dGVDaGFuZ2UobXV0ZVVzZXIsIHRoaXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25BdWRpb011dGVDaGFuZ2VdIE1pc3NpbmcgbGlzdGVuaW5nIG1ldGhvZCAtPiBvblRyYWNrTXV0ZUNoYW5nZScpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog5Y+R5biD6ICF56aB55SoL+WQr+eUqOinhumikVxuICAgICAgICAgKiBAcGFyYW0gdmlkZW9UcmFjayBSQ1JlbW90ZVZpZGVvVHJhY2sg57G75a6e5L6L5a+56LGhXG4gICAgICAgICAqL1xuICAgICAgICBvblZpZGVvTXV0ZUNoYW5nZTogKHZpZGVvVHJhY2s6IFJDUmVtb3RlVmlkZW9UcmFjaykgPT4ge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uVmlkZW9NdXRlQ2hhbmdlXXVzZXJJZC0+JHt2aWRlb1RyYWNrLmdldFVzZXJJZCgpfSBtdXRlZCAtPiAke3ZpZGVvVHJhY2suaXNPd25lck11dGVkKCl9YCk7XG4gICAgICAgICAgY29uc3QgbXV0ZVVzZXI6IElNdXRlVXNlciA9IHtcbiAgICAgICAgICAgIHVzZXJJZDogdmlkZW9UcmFjay5nZXRVc2VySWQoKSxcbiAgICAgICAgICAgIG11dGVkOiB2aWRlb1RyYWNrLmlzT3duZXJNdXRlZCgpLFxuICAgICAgICAgICAga2luZDogJ3ZpZGVvJyxcbiAgICAgICAgICAgIHRyYWNrSWQ6IHZpZGVvVHJhY2suZ2V0VHJhY2tJZCgpLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8g6YCa55+l57uZ5Lia5YqhXG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25WaWRlb011dGVDaGFuZ2UobXV0ZVVzZXIsIHRoaXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25WaWRlb011dGVDaGFuZ2VdIE1pc3NpbmcgbGlzdGVuaW5nIG1ldGhvZCAtPiBvblZpZGVvTXV0ZUNoYW5nZScpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog5oi/6Ze05YaF5YW25LuW55So5oi35paw5Y+R5biD6LWE5rqQ5pe26Kem5Y+RXG4gICAgICAgICAqIOWmgumcgOiOt+WPluWKoOWFpeaIv+mXtOS5i+WJjeaIv+mXtOWGheafkOS4queUqOaIt+WPkeW4g+eahOi1hOa6kOWIl+ihqO+8jOWPr+S9v+eUqCByb29tLmdldFJlbW90ZVRyYWNrc0J5VXNlcklkKCd1c2VySWQnKSDojrflj5ZcbiAgICAgICAgICogQHBhcmFtIHRyYWNrcyDmlrDlj5HluIPnmoTpn7PovajkuI7op4bovajmlbDmja7liJfooajvvIzljIXlkKvmlrDlj5HluIPnmoQgUkNSZW1vdGVBdWRpb1RyYWNrIOS4jiBSQ1JlbW90ZVZpZGVvVHJhY2sg5a6e5L6LXG4gICAgICAgICAqL1xuICAgICAgICBvblRyYWNrUHVibGlzaDogYXN5bmMgKHRyYWNrczogUkNSZW1vdGVUcmFja1tdKSA9PiB7XG4gICAgICAgICAgLy8g6YCA5Ye65oi/6Ze05ZCO77yM6L+Y5Lya6LWw5Yiw6L+Z77yf77yf77yM5omA5Lul5Yik5pat5LiA5LiL77yM5rKh5pyJcm9vbeS4jeaJp+ihjOiuoumYhVxuICAgICAgICAgIGlmICh0aGlzLl9yb29tKSB7XG4gICAgICAgICAgICAvLyDmjInkuJrliqHpnIDmsYLpgInmi6npnIDopoHorqLpmIXotYTmupDvvIzpgJrov4cgcm9vbS5zdWJzY3JpYmUg5o6l5Y+j6L+b6KGM6K6i6ZiFXG4gICAgICAgICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20uc3Vic2NyaWJlKHRyYWNrcyk7XG4gICAgICAgICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uVHJhY2tQdWJsaXNoXSBzdWJzY3JpYmUgZmFpbGVkIFJUQ0NvZGUgLT4ke2NvZGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog5oi/6Ze055So5oi35Y+W5raI5Y+R5biD6LWE5rqQXG4gICAgICAgICAqIEBwYXJhbSB0cmFja3Mg6KKr5Y+W5raI5Y+R5biD55qE6Z+z6L2o5LiO6KeG6L2o5pWw5o2u5YiX6KGoXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiDlvZPotYTmupDooqvlj5bmtojlj5HluIPml7bvvIxTREsg5YaF6YOo5Lya5Y+W5raI5a+555u45YWz6LWE5rqQ55qE6K6i6ZiF77yM5Lia5Yqh5bGC5LuF6ZyA5aSE55CGIFVJIOS4muWKoVxuICAgICAgICAgKi9cbiAgICAgICAgb25UcmFja1VucHVibGlzaDogKHRyYWNrczogUkNSZW1vdGVUcmFja1tdKSA9PiB7XG5cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOiuoumYheeahOmfs+inhumikea1gemAmumBk+W3suW7uueriywgdHJhY2sg5bey5Y+v5Lul6L+b6KGM5pKt5pS+XG4gICAgICAgICAqIEBwYXJhbSB0cmFjayBSQ1JlbW90ZVRyYWNrIOexu+WunuS+i1xuICAgICAgICAgKi9cbiAgICAgICAgb25UcmFja1JlYWR5OiAodHJhY2s6IFJDUmVtb3RlVHJhY2spID0+IHtcbiAgICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0TWVkaWFUeXBlKCk7XG5cbiAgICAgICAgICAvLyDmnInml7blr7nmlrnmsqHmnInpmY3nuqfmiJDlip/vvIzmiZTmipvov4fmnaXop4bpopHvvIzov5nml7bnmoTop4bpopHkuI3lr7nlpJbmipvlh7pcbiAgICAgICAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8gJiYgdHJhY2suaXNWaWRlb1RyYWNrKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyDmiafooYznlKjmiLfnmoRvblRyYWNrUmVhZHnnm5HlkKxcbiAgICAgICAgICB0aGlzLl9ub3RpZnlUcmFja1JlYWR5KFt0cmFja10pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICog5Lq65ZGY5Yqg5YWlXG4gICAgICAgICAqIEBwYXJhbSB1c2VySWRzIOWKoOWFpeeahOS6uuWRmCBpZCDliJfooahcbiAgICAgICAgICovXG4gICAgICAgIG9uVXNlckpvaW46ICh1c2VySWRzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICAgIC8vIOacieS6uuWKoOWFpea4hemZpOWumuaXtuWZqFxuICAgICAgICAgIGlmICh0aGlzLmpvaW5Sb29tVGltZXIpIHtcbiAgICAgICAgICAgIHRoaXMuam9pblJvb21UaW1lci5zdG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZS51c2VySm9pbih1c2VySWRzKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOS6uuWRmOmAgOWHulxuICAgICAgICAgKiBAcGFyYW0gdXNlcklkc1xuICAgICAgICAgKi9cbiAgICAgICAgb25Vc2VyTGVhdmU6ICh1c2VySWRzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uVXNlckxlYXZlXSBsaXN0ZW5pbmcgb25Vc2VyTGVhdmUgdXNlcklkcyAtPiAke3VzZXJJZHM/LmpvaW4oJywnKX1gKTtcbiAgICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmUudXNlckxlYXZlKHVzZXJJZHMpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUlRDIOavj+asoSBQaW5nIOe7k+aenFxuICAgICAgICAgKi9cbiAgICAgICAgb25QaW5nOiAocmVzdWx0OiBSQ1JUQ1BpbmdSZXN1bHQpID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblBpbmddJHtyZXN1bHR9YCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOmAmuefpee7meS4muWKoVxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uUGluZyAmJiB0aGlzLl9saXN0ZW5lciEub25QaW5nKHJlc3VsdCwgdGhpcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvblBpbmddIGxpc3RlbmluZyBvblBpbmcgZXhjZXB0aW9uJyk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog5rOo5YaM5oi/6Ze06LSo6YeP5pWw5o2u55uR5ZCs5ZmoXG4gICAqL1xuICBwcml2YXRlIF9yZWdpc3RlclJlcG9ydExpc3RlbmVyKCkge1xuICAgIC8vIOazqOWGjOaIv+mXtOi0qOmHj+aVsOaNruebkeWQrOWZqFxuICAgIHRoaXMuX3Jvb20ucmVnaXN0ZXJSZXBvcnRMaXN0ZW5lcih7XG4gICAgICAvKipcbiAgICAgICAqIOeUqOS6juaOpeaUtueKtuaAgeaVsOaNruaKpeWRilxuICAgICAgICogQHBhcmFtIHJlcG9ydFxuICAgICAgICovXG4gICAgICBvblN0YXRlUmVwb3J0OiAocmVwb3J0OiBJUkNSVENTdGF0ZVJlcG9ydCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblJUQ1N0YXRlUmVwb3J0ICYmIHRoaXMuX2xpc3RlbmVyIS5vblJUQ1N0YXRlUmVwb3J0KHJlcG9ydCwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uU3RhdGVSZXBvcnRdIGxpc3RlbmVyIG9uU3RhdGVSZXBvcnQgZXhjZXB0aW9uJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogfklDRSDov57mjqXnirbmgIHlj5jmm7TpgJrnn6V+XG4gICAgICAgKiBAc2luY2UgdmVyc2lvbiA1LjEuNVxuICAgICAgICovXG4gICAgICBvbklDRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZTogKHN0YXRlOiBSVENJY2VDb25uZWN0aW9uU3RhdGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25JQ0VDb25uZWN0aW9uU3RhdGVDaGFuZ2UgJiYgdGhpcy5fbGlzdGVuZXIhLm9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlKHN0YXRlLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25JQ0VDb25uZWN0aW9uU3RhdGVDaGFuZ2VdIG9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlIGV4Y2VwdGlvbicpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogIOmAmuivneWUr+S4gOagh+ivhlxuICAgKi9cbiAgcHVibGljIGdldFNlc3Npb25JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2FsbElkKCk7XG4gIH1cblxuICAvKipcbiAgICogIOiOt+WPluaIv+mXtOW9k+WJjeS8muivnSBJZO+8jOW9k+aIv+mXtOWGheW3suaXoOaIkOWRmOaXtuaIv+mXtOS8muWbnuaUtu+8jOmHjeaWsOWKoOWFpeaXtiBzZXNzaW9uSWQg5bCG5pu05paw77yMKOeUqOaIt+W9leWItui1hOa6kOeUqOeahClcbiAgICovXG4gIHB1YmxpYyBnZXRSVENTZXNzaW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb20gPyB0aGlzLl9yb29tLmdldFNlc3Npb25JZCgpIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiAg55uu5qCHIElE77yM5Y2V5ZG85a+55pa55Lq65ZGYIElkLCDnvqTlkbznvqTnu4QgSWRcbiAgICovXG4gIHB1YmxpYyBnZXRUYXJnZXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0VGFyZ2V0SWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAg6I635Y+W5Lya6K+d57G75Z6LXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29udmVyc2F0aW9uVHlwZSgpOiBDb252ZXJzYXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENvbnZlcnNhdGlvblR5cGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAg57uE57uHIElEXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2hhbm5lbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRDaGFubmVsSWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiL/pl7TkurrlkZjliJfooajvvIzkuI3ljIXlkKvmnKznq6/kv6Hmga9cbiAgICovXG4gIHB1YmxpYyBnZXRSZW1vdGVVc2VycygpOiBJVXNlckRhdGFbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRSZW1vdGVVc2VycygpO1xuICB9XG5cbiAgLyoqXG4gKiDmiL/pl7TkurrlkZjliJfooajvvIzkuI3ljIXlkKvmnKznq6/kv6Hmga9cbiAqL1xuICBwdWJsaWMgZ2V0VXNlcnMoKTogSVVzZXJEYXRhW10ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0UmVtb3RlVXNlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bkurrlkZjnirbmgIFcbiAgICovXG4gIHB1YmxpYyBnZXRVc2VyU3RhdGUodXNlcklkOiBzdHJpbmcpOiBSQ0NhbGxVc2VyU3RhdGUge1xuICAgIGlmICghdXNlcklkIHx8IHR5cGVvZiB1c2VySWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJJZCBpcyByZXF1aXJlZCwgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFVzZXJTdGF0ZSh1c2VySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlnNlc3Npb27nirbmgIFcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0ZSgpOiBSQ0NhbGxTZXNzaW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0U3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfkvJror53lj5HotbfogIVpZFxuICAgKi9cbiAgcHVibGljIGdldENhbGxlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRDYWxsZXJJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+W+l21lZGlhVHlwZVxuICAgKi9cbiAgcHVibGljIGdldE1lZGlhVHlwZSgpOiBSQ0NhbGxNZWRpYVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0TWVkaWFUeXBlKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIFJUQ1BsdWdpbkNvbnRleHQsIElSdW50aW1lLCBJUlRDSm9pbmVkSW5mbywgRXJyb3JDb2RlLCBSVENKb2luVHlwZSwgSUxvZ2dlciwgQmFzaWNMb2dnZXIsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIFJDQ2FsbEVuZ2luZSwgUkNDYWxsU3RhdGVNYWNoaW5lLCBSQ0NhbGxFcnJvckNvZGUsIFJDQ2FsbExhbmd1YWdlLCBSQ0NhbGxNZWRpYVR5cGUsIElPZmZsaW5lUmVjb3JkLFxufSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHsgUkNSVENDbGllbnQsIFJDUlRDQ29kZSwgUkNMb2NhbFRyYWNrIH0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcbmltcG9ydCB7XG4gIElSQ0NhbGxJbkdyb3VwUGFyYW1zLCBJUkNDYWxsSW5pdE9wdGlvbnMsIElSQ0NhbGxQYXJhbXMsIElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLCBJVmFsaWRhdGlvblJlc3VsdCwgSVB1c2hDb25maWcsXG59IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IFByb2R1Y2VUeXBlcyB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IGV2ZW50RW1pdHRlciBmcm9tICcuL2V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBSQ0NhbGxTZXNzaW9uIH0gZnJvbSAnLi9SQ0NhbGxTZXNzaW9uJztcbmltcG9ydCB7XG4gIHZhbGlkYXRlTGlzdGVuZXIsIHZhbGlkYXRlVGFyZ2V0SWQsIHZhbGlkYXRlTWVkaWFUeXBlLCB2YWxpZGF0ZVVzZXJJZHMsIHZhbGlkYXRlRXh0cmEsIHZhbGlkYXRlUHVzaENvbmZpZyxcbn0gZnJvbSAnLi92YWxpZGF0aW9uJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUkNDYWxsQ2xpZW50IHtcbiAgLyoqXG4gICAqIHJ0Y+WunuS+i1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcnRjQ2xpZW50OiBSQ1JUQ0NsaWVudFxuXG4gIC8qKlxuICAgKiBjYWxsRW5naW5l5bGC5a6e5L6LXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsRW5naW5lOiBSQ0NhbGxFbmdpbmVcblxuICAvKipcbiAgICog5YW25a6D5Y+C5pWwXG4gICAqL1xuICBwcml2YXRlIF9vcHRpb25zOiBJUkNDYWxsSW5pdE9wdGlvbnNcblxuICAvKipcbiAgICogc2Vzc2lvbuWIl+ihqFxuICAgKi9cbiAgcHJpdmF0ZSBfc2Vzc2lvbkxpc3Q6IFJDQ2FsbFNlc3Npb25bXSA9IFtdXG5cbiAgLyoqXG4gICAqIOenu+WKqOerr+WRvOWPq+aOqOmAgemFjee9rlxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbFB1c2hDb25maWc/OiBJUHVzaENvbmZpZ1xuXG4gIC8qKlxuICAgKiDnp7vliqjnq6/mjILmlq3mjqjpgIHphY3nva5cbiAgICovXG4gIHByaXZhdGUgX2h1bmd1cFB1c2hDb25maWc/OiBJUHVzaENvbmZpZ1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2NvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgICBfb3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zLFxuICApIHtcbiAgICB0aGlzLl9ydGNDbGllbnQgPSBfb3B0aW9ucy5ydGNDbGllbnQ7XG5cbiAgICB0aGlzLl9vcHRpb25zID0geyAvKipcbiAgICAgICAqIOaYr+WQpuWFgeiuuOWPkeW4g+mHjeivle+8jCDpu5jorqTkuI3lhYHorrhcbiAgICAgICAqL1xuICAgICAgaXNBbGxvd1B1Ymxpc2hSZXRyeTogZmFsc2UsXG5cbiAgICAgIC8qKlxuICAgICAgICog5piv5ZCm5YWB6K646K6i6ZiF6YeN6K+V77yM6buY6K6k5LiN5YWB6K64XG4gICAgICAgKi9cbiAgICAgIGlzQWxsb3dTdWJzY3JpYmVSZXRyeTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIOemgeeUqOinhumikeaXtuWFs+aRhOWDj+WktCwg6buY6K6k5YWz6ZetXG4gICAgICAgKi9cbiAgICAgIGlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZTogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogUlRDIOaIv+mXtOWKoOWFpeexu+Wei++8jOm7mOiupCAgIFJUQ0pvaW5UeXBlLkNPRVhJU1QgPSAyIOS4pOS4quiuvuWkh+WFseWtmFxuICAgICAgICogICAgIFJUQ0pvaW5UeXBlLktJQ0sgPSAwLOi4ouWJjeS4gOS4quiuvuWkh1xuICAgICAgICogICAgIFJUQ0pvaW5UeXBlLlJFRlVTRSA9IDEs5b2T5YmN5Yqg5YWl5ouS57udXG4gICAgICAgKiAgICAgUlRDSm9pblR5cGUuQ09FWElTVCA9IDIg5Lik5Liq6K6+5aSH5YWx5a2YXG4gICAgICAgKi9cbiAgICAgIGpvaW5UeXBlOiBSVENKb2luVHlwZS5DT0VYSVNULFxuXG4gICAgICAvKipcbiAgICAgICAqIOWFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOiOt+W+l+mfs+inhumikeS4jeaIkOWKnyDvvIzpmY3nuqfojrflvpfpn7PpopEsIOm7mOiupOS4jeWFgeiuuFxuICAgICAgICovXG4gICAgICBpc0FsbG93RGVtb3Rpb25HZXRTdHJlYW06IGZhbHNlLFxuXG4gICAgICAvKipcbiAgICAgICAqIOivreiogOiuvue9riAo5o6o6YCBKSwg5LiN5Lyg6buY6K6k5Li65Lit5paHXG4gICAgICAgKi9cbiAgICAgIGxhbmc6IFJDQ2FsbExhbmd1YWdlLlpILFxuICAgICAgLi4uX29wdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIOWIneWni+WMlmNhbGxFbmdpbmUsIOW5tuebkeWQrG9uSW52aXRlXG4gICAgdGhpcy5fY2FsbEVuZ2luZSA9IG5ldyBSQ0NhbGxFbmdpbmUodGhpcy5fY29udGV4dCwgX3J1bnRpbWUsIHRoaXMuX2xvZ2dlciwge1xuXG4gICAgICAvKipcbiAgICAgICAqIOebkeWQrOaUtuWIsGludml0ZVxuICAgICAgICovXG4gICAgICBvbkludml0ZTogdGhpcy5fb25JbnZpdGUuYmluZCh0aGlzKSxcblxuICAgICAgLyoqXG4gICAgICAgKiDnm5HlkKznprvnur/mtojmga/miqXlkYpcbiAgICAgICAqL1xuICAgICAgb25PZmZsaW5lUmVjb3JkOiB0aGlzLl9vbk9mZmxpbmVSZWNvcmQuYmluZCh0aGlzKSxcbiAgICB9LCB7XG5cbiAgICAgIC8qKlxuICAgICAgICog6K+t6KiA6K6+572uICjmjqjpgIEpLCDkuI3kvKDpu5jorqTkuLrkuK3mlodcbiAgICAgICAqL1xuICAgICAgbGFuZzogdGhpcy5fb3B0aW9ucy5sYW5nIHx8IFJDQ2FsbExhbmd1YWdlLlpILFxuXG4gICAgfSk7XG5cbiAgICBldmVudEVtaXR0ZXIub24oJ3Nlc3Npb25DbG9zZScsICh7IHNlc3Npb24sIHN1bW1hcnlJbmZvIH0pID0+IHtcbiAgICAgIC8vIOS7jnNlc3Npb25MaXN05Y675o6J6L+Z5Liq5YWz6Zet55qEc2Vzc2lvblxuICAgICAgdGhpcy5fcmVtb3ZlU2Vzc2lvbihzZXNzaW9uKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5vblNlc3Npb25DbG9zZShzZXNzaW9uLCBzdW1tYXJ5SW5mbyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ0NhbGxDbGllbnRdIG9wdGlvbnMub25TZXNzaW9uQ2xvc2UgZXhjZXB0aW9uJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOaOpeWQrOS5i+WJjeaMguaWreWFtuWug+eahHNlc3Npb25cbiAgICBldmVudEVtaXR0ZXIub24oJ2h1bmd1cE90aGVyU2Vzc2lvbicsICh7IHNlc3Npb24gfSkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBzZXNzaW9uLmdldFNlc3Npb25JZCgpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBodW5ndXBPdGhlclNlc3Npb25dIHNlc3Npb25JZCByZWFkeSB0byBhY2NlcHQgLT4gJHtpZH1gKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgaHVuZ3VwT3RoZXJTZXNzaW9uXSBzZXNzaW9uTGlzdCAtPiR7dGhpcy5fc2Vzc2lvbkxpc3QubWFwKChzZXMpID0+IHNlcy5nZXRTZXNzaW9uSWQoKSkuam9pbignLCcpfWApO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgd2hpbGUgKHRoaXMuX3Nlc3Npb25MaXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8g5aaC5p6c5LiO6KaB5o6l5ZCs55qEc2Vzc2lvbuS4jeS4gOiHtFxuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvbkxpc3RbaV0uZ2V0U2Vzc2lvbklkKCkgIT09IGlkKSB7XG4gICAgICAgICAgLy8g5oyC5patXG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbkxpc3RbaV0uaHVuZ3VwKCk7XG5cbiAgICAgICAgICAvLyDmjILmlq3lkI7liKDpmaRcbiAgICAgICAgICB0aGlzLl9zZXNzaW9uTGlzdC5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8g5aaC5p6c5piv6KaB5o6l5ZCs55qEc2Vzc2lvbu+8jOi3s+i/h+i/meS4que0ouW8le+8jOaJgOS7peWKoDFcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgaHVuZ3VwT3RoZXJTZXNzaW9uXSBjdXJyZW50IHNlc3Npb25MaXN0IGxlbmd0aCAtPiR7dGhpcy5fc2Vzc2lvbkxpc3QubGVuZ3RofWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOebkeWQrG9uSW52aXRlXG4gICAqL1xuICBwcml2YXRlIF9vbkludml0ZShzdGF0ZU1hY2hpbmU6IFJDQ2FsbFN0YXRlTWFjaGluZSwgZXh0cmE/OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IF9vbkludml0ZV0gUmVjZWl2ZWQgaW52aXRlIG1lc3NhZ2UnKTtcbiAgICBjb25zdCBzZXNzaW9uID0gbmV3IFJDQ2FsbFNlc3Npb24oc3RhdGVNYWNoaW5lLCB0aGlzLl9ydGNDbGllbnQsIHRoaXMuX2xvZ2dlciwge1xuXG4gICAgICAvLyDmmK/lkKblhYHorrjorqLpmIXph43or5VcbiAgICAgIGlzQWxsb3dTdWJzY3JpYmVSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93U3Vic2NyaWJlUmV0cnksXG5cbiAgICAgIC8vIOaYr+WQpuWFgeiuuOWPkeW4g+mHjeivlVxuICAgICAgaXNBbGxvd1B1Ymxpc2hSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93UHVibGlzaFJldHJ5LFxuXG4gICAgICAvKipcbiAgICAgICAqIOemgeeUqOinhumikeaXtuWFs+aRhOWDj+WktFxuICAgICAgICovXG4gICAgICBpc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGU6IHRoaXMuX29wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFJUQyDmiL/pl7TliqDlhaXnsbvlnotcbiAgICAgICAqL1xuICAgICAgam9pblR5cGU6IHRoaXMuX29wdGlvbnMuam9pblR5cGUsXG5cbiAgICAgIC8vIOWFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOiOt+W+l+mfs+inhumikeS4jeaIkOWKnyDvvIzpmY3nuqfojrflvpfpn7PpopEsIOm7mOiupOS4jeWFgeiuuFxuICAgICAgaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtOiB0aGlzLl9vcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSxcblxuICAgICAgLy8g5qCH5piO5piv6KKr5Y+r5Lqn55Sf55qEc2Vzc2lvblxuICAgICAgcHJvZHVjZVR5cGU6IFByb2R1Y2VUeXBlcy5DQUxMRUUsXG5cbiAgICAgIGNhbGxQdXNoQ29uZmlnOiB0aGlzLl9jYWxsUHVzaENvbmZpZyxcblxuICAgICAgaHVuZ3VwUHVzaENvbmZpZzogdGhpcy5faHVuZ3VwUHVzaENvbmZpZyxcbiAgICB9KTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IF9vbkludml0ZV0gUmVjZWl2ZWQgaW52aXRlIG1lc3NhZ2UsIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHNlc3Npb24nKTtcblxuICAgIC8qKlxuICAgICAqIOWmguaenOmAmuivneeahOaXtuWAmeS4jeWFgeiuuOaOpeWQrOaWsOeahOmAmuivne+8jOebtOaOpeaMguaWre+8jCDov5nkupvlt6XkvZzlnKhjYWxsRW5naW5l6YeM5a6M5oiQXG4gICAgICovXG4gICAgdGhpcy5fc2Vzc2lvbkxpc3QucHVzaChzZXNzaW9uKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyDmiafooYznlKjmiLdBUEnnmoTnm5HlkKxcbiAgICAgIHRoaXMuX29wdGlvbnMub25TZXNzaW9uKHNlc3Npb24sIGV4dHJhKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxDbGllbnQgX29wdGlvbnMub25TZXNzaW9uXSBvblNlc3Npb24gZXhjZXB0aW9uJyk7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuXG4gICAgLy8g5b+F6aG75Zyob25TZXNzaW9u6YeM5rOo5YaMc2Vzc2lvbuebkeWQrOS6i+S7tu+8jOi/memHjOajgOa1i+S4gOS4i+acieayoeacieazqOWGjFxuICAgIGlmIChzZXNzaW9uLl9saXN0ZW5lcikge1xuICAgICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZUxpc3RlbmVyKHNlc3Npb24uX2xpc3RlbmVyKTtcbiAgICAgIGlmICghY29uY2x1c2lvbi5yZXN1bHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbmNsdXNpb24ubXNnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxDbGllbnQgX29wdGlvbnMub25TZXNzaW9uXSBzZXNzaW9uIE11c3QgSGF2ZSBMaXN0ZW5lcicpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUkNDYWxsU2Vzc2lvbiAgX29wdGlvbnMub25TZXNzaW9uXSBzZXNzaW9uIE11c3QgSGF2ZSBMaXN0ZW5lcicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDnm5HlkKznprvnur/mtojmga/miqXlkYpcbiAgICogQHBhcmFtIHJlY29yZFxuICAgKi9cbiAgcHVibGljIF9vbk9mZmxpbmVSZWNvcmQocmVjb3JkOiBJT2ZmbGluZVJlY29yZCkge1xuICAgIHRyeSB7XG4gICAgICAvLyDmiafooYznlKjmiLdBUEnnmoTnm5HlkKxcbiAgICAgIHRoaXMuX29wdGlvbnMub25PZmZsaW5lUmVjb3JkICYmIHRoaXMuX29wdGlvbnMub25PZmZsaW5lUmVjb3JkKHJlY29yZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsQ2xpZW50IF9vcHRpb25zLm9uT2ZmbGluZVJlY29yZF0gb25PZmZsaW5lUmVjb3JkIGV4Y2VwdGlvbicpO1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhoznlKjmiLfkv6Hmga/jgILms6jlhozlkI7vvIzlnKjlj5HotbfpgoDor7fmiJbmjILmlq3nrYnmk43kvZzml7bvvIzkvJrlsIbor6Xkv6Hmga/kuIDlubblj5HpgIHnu5nlr7nnq69cbiAgICogQHBhcmFtIGluZm8ubmFtZSAgICAgICAg55So5oi35ZCN56ewXG4gICAqIEBwYXJhbSBpbmZvLnBvcnRyYWl0VXJpIOeUqOaIt+WktOWDj+S/oeaBr1xuICAgKiBAcGFyYW0gaW5mby5leHRyYSAgICAgICDpooTnlZnmi5PlsZXlrZfmrrVcbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclVzZXJJbmZvKGluZm86IHsgbmFtZT86IHN0cmluZzsgcG9ydHJhaXRVcmk/OiBzdHJpbmc7IGV4dHJhPzogc3RyaW5nOyB9ID0ge30pIHtcbiAgICB0aGlzLl9jYWxsRW5naW5lLnJlZ2lzdGVyVXNlckluZm8oaW5mbyk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCByZWdpc3RlclVzZXJJbmZvXSBzdWNjZXNzZnVsbHkgcmVnaXN0ZXIgdXNlciBpbmZvIGRhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAqIOi3qEFwcOWNleWRvO+8jFxi5Y+R6YCBaW52aXRl5raI5oGv77yM5Zue6LCD5Zue5p2l5o6l5pS2c3RhdGVNYWNoaW5lLCDlu7pzZXNzaW9uXG4gICogQHBhcmFtIHBhcmFtcy50YXJnZXRJZCDooqvlkbzlj6vkuIDmlrnnmoTnlKjmiLcgaWQg5b+F5aGrXG4gICogQHBhcmFtIHBhcmFtcy5tZWRpYVR5cGUg6Z+z6aKR5ZG85Y+rIG9yIOmfs+inhumikeWRvOWPqyAg5b+F5aGrXG4gICogQHBhcmFtIHBhcmFtcy5saXN0ZW5lciAoc2Vzc2lvbuS4iueahOebkeWQrCkg5b+F5aGrXG4gICogQHBhcmFtIHBhcmFtcy5jb25zdHJhaW50cyDojrflj5bpn7PpopHmiJbpn7Pop4bpopHotYTmupDml7bnmoTlj4LmlbAg5Y+v6YCJXG4gICogQHBhcmFtIHBhcmFtcy5jaGFubmVsSWQg57uE57uHIElkIOWPr+mAiVxuICAqIEBwYXJhbSBwYXJhbXMuZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvXG4gICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgKiBAcGFyYW0gcGFyYW1zLmJpdHJhdGUg6ZyA6KaB6K6+572u55qE56CB546H5Y+C5pWwXG4gICpcbiAgKi9cbiAgcHVibGljIGFzeW5jIHN0YXJ0Q3Jvc3NDYWxsKHtcbiAgICB0YXJnZXRJZCwgbWVkaWFUeXBlID0gUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCA9ICcnLCBleHRyYSA9ICcnLCBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJywgYml0cmF0ZSxcbiAgfTogSVJDQ2FsbFBhcmFtcyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHNlc3Npb24/OiBSQ0NhbGxTZXNzaW9uIH0+IHtcbiAgICByZXR1cm4gdGhpcy5fX2NhbGwoe1xuICAgICAgdGFyZ2V0SWQsIG1lZGlhVHlwZSwgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQsIGV4dHJhLCBwdXNoVGl0bGUsIHB1c2hDb250ZW50LCBiaXRyYXRlLCBpc0Nyb3NzQXBwa2V5OiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWNleWRvO+8jFxi5Y+R6YCBaW52aXRl5raI5oGv77yM5Zue6LCD5Zue5p2l5o6l5pS2c3RhdGVNYWNoaW5lLCDlu7pzZXNzaW9uXG4gICAqIEBwYXJhbSBwYXJhbXMudGFyZ2V0SWQg6KKr5ZG85Y+r5LiA5pa555qE55So5oi3IGlkIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLm1lZGlhVHlwZSDpn7PpopHlkbzlj6sgb3Ig6Z+z6KeG6aKR5ZG85Y+rICDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy5saXN0ZW5lciAoc2Vzc2lvbuS4iueahOebkeWQrCkg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMuY29uc3RyYWludHMg6I635Y+W6Z+z6aKR5oiW6Z+z6KeG6aKR6LWE5rqQ5pe255qE5Y+C5pWwIOWPr+mAiVxuICAgKiBAcGFyYW0gcGFyYW1zLmNoYW5uZWxJZCDnu4Tnu4cgSWQg5Y+v6YCJXG4gICAqIEBwYXJhbSBwYXJhbXMuZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaFRpdGxlIOmAmuefpeeahOagh+mimFxuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDniYjmnKzlup/lvIMgcGFyYW1zLnB1c2hDb250ZW50IOmAmuefpeeahOWGheWuuVxuICAgKiBAcGFyYW0gcGFyYW1zLmJpdHJhdGUg6ZyA6KaB6K6+572u55qE56CB546H5Y+C5pWwXG4gICAqXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2FsbCh7XG4gICAgdGFyZ2V0SWQsIG1lZGlhVHlwZSA9IFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQgPSAnJywgZXh0cmEgPSAnJywgcHVzaFRpdGxlID0gJycsIHB1c2hDb250ZW50ID0gJycsIGJpdHJhdGUsXG4gIH06IElSQ0NhbGxQYXJhbXMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzZXNzaW9uPzogUkNDYWxsU2Vzc2lvbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuX19jYWxsKHtcbiAgICAgIHRhcmdldElkLCBtZWRpYVR5cGUsIGxpc3RlbmVyLCBjb25zdHJhaW50cywgY2hhbm5lbElkLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCwgYml0cmF0ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX19jYWxsKHtcbiAgICB0YXJnZXRJZCwgbWVkaWFUeXBlID0gUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCA9ICcnLCBleHRyYSA9ICcnLCBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJywgYml0cmF0ZSwgaXNDcm9zc0FwcGtleSA9IGZhbHNlLFxuICB9OiBJUkNDYWxsUGFyYW1zKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc2Vzc2lvbj86IFJDQ2FsbFNlc3Npb24gfT4ge1xuICAgIGNvbnN0IHB1c2hDb25maWcgPSB0aGlzLl9jYWxsUHVzaENvbmZpZyA/IHRoaXMuX2NhbGxQdXNoQ29uZmlnIDogeyBwdXNoVGl0bGUsIHB1c2hDb250ZW50IH07XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsXSBleHRyYS0+JHtleHRyYX0gcHVzaENvbmZpZy0+JHtKU09OLnN0cmluZ2lmeShwdXNoQ29uZmlnKX1gKTtcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdFtdID0gW3ZhbGlkYXRlVGFyZ2V0SWQodGFyZ2V0SWQpLCB2YWxpZGF0ZU1lZGlhVHlwZShtZWRpYVR5cGUpLCB2YWxpZGF0ZUxpc3RlbmVyKGxpc3RlbmVyKSwgdmFsaWRhdGVFeHRyYShleHRyYSldO1xuICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNsdXNpb24uZXZlcnkoKG9iajogSVZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICFvYmoucmVzdWx0ICYmIG1lc3NhZ2VzLnB1c2gob2JqLm1zZyEpO1xuICAgICAgcmV0dXJuIG9iai5yZXN1bHQ7XG4gICAgfSk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JDQ2FsbENsaWVudCBjYWxsXSAke21lc3NhZ2VzLmpvaW4oJ1xcbicpfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZTogdmFsaWRhdGVQdXNoQ29kZSwgZXJyb3JNc2cgfSA9IHZhbGlkYXRlUHVzaENvbmZpZyhwdXNoQ29uZmlnKTtcbiAgICBpZiAodmFsaWRhdGVQdXNoQ29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsQ2xpZW50IGNhbGxdIHBhcmFtIGVycm9yLCBlcnJvck1zZzogJHtlcnJvck1zZ31gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IHZhbGlkYXRlUHVzaENvZGUgfTtcbiAgICB9XG5cbiAgICBsZXQgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2sobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgbG9jYWxUcmFja3MgPSB0cmFja3MhO1xuXG4gICAgbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIC8vIOiuvue9rueggeeOh1xuICAgICAgaWYgKHRyYWNrLmlzQXVkaW9UcmFjaygpICYmIGJpdHJhdGU/LmF1ZGlvKSB7XG4gICAgICAgIHRyYWNrLnNldEJpdHJhdGUoYml0cmF0ZT8uYXVkaW8pO1xuICAgICAgfVxuICAgICAgaWYgKHRyYWNrLmlzVmlkZW9UcmFjaygpICYmIGJpdHJhdGU/LnZpZGVvKSB7XG4gICAgICAgIHRyYWNrLnNldEJpdHJhdGUoYml0cmF0ZT8udmlkZW8/Lm1heCwgYml0cmF0ZT8udmlkZW8/Lm1pbiwgYml0cmF0ZT8udmlkZW8/LnN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIC8vIOWQkeWkluaKm+WHuuacrOWcsOa1gVxuICAgICAgbGlzdGVuZXIub25UcmFja1JlYWR5KHRyYWNrKTtcbiAgICB9KTtcblxuICAgIC8vIOiwg+eUqGNhbGxFbmdpbmXnmoRjYWxs6L+U5Zue5LiA5Liq54q25oCB5py655qE5a6e5L6LXG4gICAgY29uc3QgeyBjb2RlLCBzdGF0ZU1hY2hpbmUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuY2FsbChjaGFubmVsSWQsIHRhcmdldElkLCBtZWRpYVR5cGUsIGV4dHJhLCBwdXNoQ29uZmlnLCBpc0Nyb3NzQXBwa2V5KTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgJiYgc3RhdGVNYWNoaW5lKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IGNhbGxdIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHN0YXRlIG1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgUkNDYWxsU2Vzc2lvbihzdGF0ZU1hY2hpbmUsIHRoaXMuX3J0Y0NsaWVudCwgdGhpcy5fbG9nZ2VyLCB7XG4gICAgICAgIGxvY2FsVHJhY2tzLFxuXG4gICAgICAgIC8vIOaYr+WQpuWFgeiuuOiuoumYhemHjeivlVxuICAgICAgICBpc0FsbG93U3Vic2NyaWJlUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5LFxuXG4gICAgICAgIC8vIOaYr+WQpuWFgeiuuOiuoumYhemHjeivlVxuICAgICAgICBpc0FsbG93UHVibGlzaFJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dQdWJsaXNoUmV0cnksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIOemgeeUqOinhumikeaXtuWFs+aRhOWDj+WktFxuICAgICAgICAgKi9cbiAgICAgICAgaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlOiB0aGlzLl9vcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUlRDIOaIv+mXtOWKoOWFpeexu+Wei1xuICAgICAgICAgKi9cbiAgICAgICAgam9pblR5cGU6IHRoaXMuX29wdGlvbnMuam9pblR5cGUsXG5cbiAgICAgICAgLy8g5YWB6K646ZmN57qn6I635b6X5rWB77yM6I635b6X6Z+z6KeG6aKR5LiN5oiQ5YqfIO+8jOmZjee6p+iOt+W+l+mfs+mikSwg6buY6K6k5LiN5YWB6K64XG4gICAgICAgIGlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbTogdGhpcy5fb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0sXG5cbiAgICAgICAgLy8g5qCH5piO5piv5Li75Y+r5Lqn55Sf55qEc2Vzc2lvblxuICAgICAgICBwcm9kdWNlVHlwZTogUHJvZHVjZVR5cGVzLkNBTExFUixcblxuICAgICAgICBpc0Nyb3NzQXBwa2V5LFxuXG4gICAgICAgIGNhbGxQdXNoQ29uZmlnOiB0aGlzLl9jYWxsUHVzaENvbmZpZyxcblxuICAgICAgICBodW5ndXBQdXNoQ29uZmlnOiB0aGlzLl9odW5ndXBQdXNoQ29uZmlnLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHNlc3Npb27kuIrms6jlhoznm5HlkKzkuovku7ZcbiAgICAgIHNlc3Npb24ucmVnaXN0ZXJTZXNzaW9uTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gICAgICB0aGlzLl9zZXNzaW9uTGlzdC5wdXNoKHNlc3Npb24pO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsXSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzZXNzaW9uIG9iamVjdCwgc2Vzc2lvbklkOiAke3Nlc3Npb24uZ2V0U2Vzc2lvbklkKCl9YCk7XG4gICAgICByZXR1cm4geyBjb2RlLCBzZXNzaW9uIH07XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsQ2xpZW50IGNhbGxdIGNhbGwgZmFpbGVkIGNvZGUgLT46ICR7Y29kZX1gKTtcbiAgICBsb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgLy8g56aB55So6KeG6aKRXG4gICAgICB0cmFjay5tdXRlKCk7XG5cbiAgICAgIC8vIOWFs+mXreaRhOWDj+WktFxuICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkei1t+e+pOe7hOWRvOWPq1xuICAgKiBAcGFyYW0gcGFyYW1zLnRhcmdldElkIOe+pOe7hCBJZCDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy51c2VySWRzIOiiq+WRvOWPq+eahOe+pOWGheaIkOWRmCBJZCDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy5tZWRpYVR5cGUg6Z+z6aKR5ZG85Y+rIG9yIOmfs+inhumikeWRvOWPqyDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy5saXN0ZW5lciAoc2Vzc2lvbuS4iueahOebkeWQrCkg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMuY29uc3RyYWludHMg6I635Y+W6Z+z6aKR5oiW6Z+z6KeG6aKR6LWE5rqQ5pe255qE5Y+C5pWwIOWPr+mAiVxuICAgKiBAcGFyYW0gcGFyYW1zLmNoYW5uZWxJZCDnu4Tnu4cgSWQg5Y+v6YCJXG4gICAqIEBwYXJhbSBwYXJhbXMuZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvIOWPr+mAiVxuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDniYjmnKzlup/lvIMgcGFyYW1zLnB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICogQHBhcmFtIHBhcmFtcy5iaXRyYXRlIOmcgOimgeiuvue9rueahOeggeeOh+WPguaVsFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNhbGxJbkdyb3VwKHtcbiAgICB0YXJnZXRJZCwgdXNlcklkcywgbWVkaWFUeXBlID0gUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCA9ICcnLCBleHRyYSA9ICcnLCBwdXNoVGl0bGUgPSAnJywgcHVzaENvbnRlbnQgPSAnJywgYml0cmF0ZSxcbiAgfTogSVJDQ2FsbEluR3JvdXBQYXJhbXMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzZXNzaW9uPzogUkNDYWxsU2Vzc2lvbiB9PiB7XG4gICAgY29uc3QgcHVzaENvbmZpZyA9IHRoaXMuX2NhbGxQdXNoQ29uZmlnID8gdGhpcy5fY2FsbFB1c2hDb25maWcgOiB7IHB1c2hUaXRsZSwgcHVzaENvbnRlbnQgfTtcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdFtdID0gW3ZhbGlkYXRlVGFyZ2V0SWQodGFyZ2V0SWQpLCB2YWxpZGF0ZVVzZXJJZHModXNlcklkcyksIHZhbGlkYXRlTWVkaWFUeXBlKG1lZGlhVHlwZSksIHZhbGlkYXRlTGlzdGVuZXIobGlzdGVuZXIpLCB2YWxpZGF0ZUV4dHJhKGV4dHJhKV07XG4gICAgY29uc3QgbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVzdWx0ID0gY29uY2x1c2lvbi5ldmVyeSgob2JqOiBJVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgIW9iai5yZXN1bHQgJiYgbWVzc2FnZXMucHVzaChvYmoubXNnISk7XG4gICAgICByZXR1cm4gb2JqLnJlc3VsdDtcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxDbGllbnQgY2FsbEluR3JvdXBdICR7bWVzc2FnZXMuam9pbignXFxuJyl9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlOiB2YWxpZGF0ZVB1c2hDb2RlLCBlcnJvck1zZyB9ID0gdmFsaWRhdGVQdXNoQ29uZmlnKHB1c2hDb25maWcpO1xuICAgIGlmICh2YWxpZGF0ZVB1c2hDb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbF0gcGFyYW0gZXJyb3IsIGVycm9yTXNnOiAke2Vycm9yTXNnfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogdmFsaWRhdGVQdXNoQ29kZSB9O1xuICAgIH1cblxuICAgIGxldCBsb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcblxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFjayhtZWRpYVR5cGUsIGNvbnN0cmFpbnRzKTtcbiAgICBpZiAoX2NvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBfY29kZSB9O1xuICAgIH1cbiAgICBsb2NhbFRyYWNrcyA9IHRyYWNrcyE7XG5cbiAgICBsb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgLy8g6K6+572u56CB546HXG4gICAgICBpZiAodHJhY2suaXNBdWRpb1RyYWNrKCkgJiYgYml0cmF0ZT8uYXVkaW8pIHtcbiAgICAgICAgdHJhY2suc2V0Qml0cmF0ZShiaXRyYXRlPy5hdWRpbyk7XG4gICAgICB9XG4gICAgICBpZiAodHJhY2suaXNWaWRlb1RyYWNrKCkgJiYgYml0cmF0ZT8udmlkZW8pIHtcbiAgICAgICAgdHJhY2suc2V0Qml0cmF0ZShiaXRyYXRlPy52aWRlbz8ubWF4LCBiaXRyYXRlPy52aWRlbz8ubWluLCBiaXRyYXRlPy52aWRlbz8uc3RhcnQpO1xuICAgICAgfVxuICAgICAgLy8g5ZCR5aSW5oqb5Ye65pys5Zyw5rWBXG4gICAgICBsaXN0ZW5lci5vblRyYWNrUmVhZHkodHJhY2spO1xuICAgIH0pO1xuXG4gICAgLy8g5b6A57uE6YeM5Y+R5raI5oGvXG4gICAgY29uc3QgeyBjb2RlLCBzdGF0ZU1hY2hpbmUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuY2FsbEluR3JvdXAoY2hhbm5lbElkLCB0YXJnZXRJZCwgbWVkaWFUeXBlLCB1c2VySWRzLCBleHRyYSwgcHVzaENvbmZpZyk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTICYmIHN0YXRlTWFjaGluZSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBjYWxsSW5Hcm91cF0gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc3RhdGUgbWFjaGluZScpO1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBSQ0NhbGxTZXNzaW9uKHN0YXRlTWFjaGluZSwgdGhpcy5fcnRjQ2xpZW50LCB0aGlzLl9sb2dnZXIsIHtcbiAgICAgICAgbG9jYWxUcmFja3MsXG5cbiAgICAgICAgLy8g5piv5ZCm5YWB6K646K6i6ZiF6YeN6K+VXG4gICAgICAgIGlzQWxsb3dTdWJzY3JpYmVSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93U3Vic2NyaWJlUmV0cnksXG5cbiAgICAgICAgLy8g5piv5ZCm5YWB6K645Y+R5biD6YeN6K+VXG4gICAgICAgIGlzQWxsb3dQdWJsaXNoUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSxcblxuICAgICAgICAvKipcbiAgICAgICAgICog56aB55So6KeG6aKR5pe25YWz5pGE5YOP5aS0XG4gICAgICAgICAqL1xuICAgICAgICBpc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGU6IHRoaXMuX29wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSVEMg5oi/6Ze05Yqg5YWl57G75Z6LXG4gICAgICAgICAqL1xuICAgICAgICBqb2luVHlwZTogdGhpcy5fb3B0aW9ucy5qb2luVHlwZSxcblxuICAgICAgICAvLyDlhYHorrjpmY3nuqfojrflvpfmtYHvvIzojrflvpfpn7Pop4bpopHkuI3miJDlip8g77yM6ZmN57qn6I635b6X6Z+z6aKRLCDpu5jorqTkuI3lhYHorrhcbiAgICAgICAgaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtOiB0aGlzLl9vcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSxcblxuICAgICAgICAvLyDmoIfmmI7mmK/kuLvlj6vkuqfnlJ/nmoRzZXNzaW9uXG4gICAgICAgIHByb2R1Y2VUeXBlOiBQcm9kdWNlVHlwZXMuQ0FMTEVSLFxuXG4gICAgICAgIGNhbGxQdXNoQ29uZmlnOiB0aGlzLl9jYWxsUHVzaENvbmZpZyxcblxuICAgICAgICBodW5ndXBQdXNoQ29uZmlnOiB0aGlzLl9odW5ndXBQdXNoQ29uZmlnLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHNlc3Npb27kuIrms6jlhoznm5HlkKzkuovku7ZcbiAgICAgIHNlc3Npb24ucmVnaXN0ZXJTZXNzaW9uTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgdGhpcy5fc2Vzc2lvbkxpc3QucHVzaChzZXNzaW9uKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbEluR3JvdXBdIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHNlc3Npb24gb2JqZWN0LCBzZXNzaW9uSWQ6ICR7c2Vzc2lvbi5nZXRTZXNzaW9uSWQoKX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGUsIHNlc3Npb24gfTtcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsSW5Hcm91cF0gY2FsbEluR3JvdXAgZmFpbGVkIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgIGxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAvLyDnpoHnlKjop4bpopFcbiAgICAgIHRyYWNrLm11dGUoKTtcblxuICAgICAgLy8g5YWz6Zet5pGE5YOP5aS0XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6LCDUlRDIEFQSSDojrflvpfmnKzlnLDmtYFcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2dldExvY2FsVHJhY2tDb3JlKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLCBjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgdHJhY2tzPzogUkNMb2NhbFRyYWNrW10gfT4ge1xuICAgIC8vIOajgOa1i+aYr+WQpuiDveWkn+iOt+W+l+acrOWcsOa1gVxuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJTykge1xuICAgICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBdWRpb1RyYWNrKCdSb25nQ2xvdWRSVEMnLCBjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy5hdWRpbyAmJiB7IC4uLmNvbnN0cmFpbnRzLmF1ZGlvIH0pO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsQ2xpZW50IF9nZXRUcmFja10gZ2V0IEF1ZGlvIGxvY2FsIHRyYWNrcyBmYWlsZWQgUkNUIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX1RSQUNLX0VSUk9SIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IF9nZXRUcmFja10gc3VjY2Vzc2Z1bGx5IGdldCBBdWRpbyBsb2NhbCB0cmFja3MnKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCB0cmFja3M6IFt0cmFjayFdIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUFuZENhbWVyYVRyYWNrcygnUm9uZ0Nsb3VkUlRDJywgY29uc3RyYWludHMgJiYgeyAuLi5jb25zdHJhaW50cyB9KTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsQ2xpZW50IF9nZXRUcmFja10gZ2V0IEF1ZGlvIGFuZCBWaWRlbyBsb2NhbCB0cmFja3MgZmFpbGVkIFJDVCBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfQVVESU9fQU5EX1ZJREVPX1RSQUNLX0VSUk9SIH07XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgX2dldFRyYWNrXSBzdWNjZXNzZnVsbHkgZ2V0IGF1ZGlvIGFuZCB2aWRlbyBsb2NhbCB0cmFja3MnKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgdHJhY2tzIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9nZXRMb2NhbFRyYWNrKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLCBjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgdHJhY2tzPzogUkNMb2NhbFRyYWNrW10gfT4ge1xuICAgIC8vIOWmguaenOaYr+WFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOW5tuS4lOaYr+iOt+W+l+mfs+inhumikVxuICAgIGlmICh0aGlzLl9vcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSAmJiBtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTykge1xuICAgICAgY29uc3QgeyBjb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTywgY29uc3RyYWludHMpO1xuXG4gICAgICAvLyDlpoLmnpzpn7Pop4bpopHkuI3og73ojrflvpfvvIzlsLHpmY3nu4Tojrflvpfpn7PpopFcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUoUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBjb25zdHJhaW50cyk7XG4gICAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBjb2RlLCB0cmFja3MgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNvZGUsIHRyYWNrcyB9O1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKG1lZGlhVHlwZSwgY29uc3RyYWludHMpO1xuICAgIGlmIChfY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IF9jb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDku45zZXNzaW9uTGlzdOWIoOmZpOafkOS4qnNlc3Npb25cbiAgICovXG4gIHByaXZhdGUgX3JlbW92ZVNlc3Npb24oc2Vzc2lvbjogUkNDYWxsU2Vzc2lvbikge1xuICAgIGNvbnN0IGlkID0gc2Vzc2lvbi5nZXRTZXNzaW9uSWQoKTtcbiAgICB0aGlzLl9zZXNzaW9uTGlzdCA9IHRoaXMuX3Nlc3Npb25MaXN0LmZpbHRlcigoc2Vzc2lvbikgPT4gc2Vzc2lvbi5nZXRTZXNzaW9uSWQoKSAhPT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW3seaWueWFtuS7luerr+WKoOWFpemAmuivne+8iOW3suWKoOWFpSBSVEMg5oi/6Ze077yJ55qE55So5oi35L+h5oGvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Sm9pbmVkUm9vbUluZm8oKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgZGF0YT86IElSVENKb2luZWRJbmZvW10gfT4ge1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY29udGV4dC5nZXRSVENKb2luZWRVc2VySW5mbyh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKTtcbiAgICBpZiAoY29kZSAhPT0gRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBnZXRKb2luZWRVc2VySW5mbyBlcnJvciBjb2RlOiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuUVVFUllfSk9JTkVEX1VTRVJfSU5GT19FUlJPUiB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLCBkYXRhIH07XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5ZG85Y+r44CB5oyC5pat5o6o6YCB5pWw5o2uXG4gICAqIEBwYXJhbSBjYWxsUHVzaENvbmZpZyDlkbzlj6vmjqjpgIHphY3nva5cbiAgICogQHBhcmFtIGNhbGxQdXNoQ29uZmlnLnB1c2hUaXRsZSDlkbzlj6vmjqjpgIHmoIfpophcbiAgICogQHBhcmFtIGNhbGxQdXNoQ29uZmlnLnB1c2hDb250ZW50IOWRvOWPq+aOqOmAgeWGheWuuVxuICAgKiBAcGFyYW0gaHVuZ3VwUHVzaENvbmZpZyDmjILmlq3mjqjpgIHphY3nva5cbiAgICogQHBhcmFtIGh1bmd1cFB1c2hDb25maWcucHVzaFRpdGxlIOaMguaWreaOqOmAgeagh+mimFxuICAgKiBAcGFyYW0gaHVuZ3VwUHVzaENvbmZpZy5wdXNoQ29udGVudCDmjILmlq3mjqjpgIHlhoXlrrlcbiAgICovXG4gIHB1YmxpYyBzZXRQdXNoQ29uZmlnKGNhbGxQdXNoQ29uZmlnOiBJUHVzaENvbmZpZywgaHVuZ3VwUHVzaENvbmZpZzogSVB1c2hDb25maWcpIHtcbiAgICBjb25zdCB2YWxpZGF0ZVJlcyA9IFtjYWxsUHVzaENvbmZpZywgaHVuZ3VwUHVzaENvbmZpZ10ubWFwKChpdGVtKSA9PiB2YWxpZGF0ZVB1c2hDb25maWcoaXRlbSkpO1xuXG4gICAgZm9yIChjb25zdCB7IGNvZGUsIGVycm9yTXNnIH0gb2YgdmFsaWRhdGVSZXMpIHtcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbENsaWVudCBzZXRQdXNoQ29uZmlnXSBwYXJhbSBlcnJvciwgZXJyb3JNc2c6ICR7ZXJyb3JNc2d9YCk7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsUHVzaENvbmZpZyA9IGNhbGxQdXNoQ29uZmlnO1xuICAgIHRoaXMuX2h1bmd1cFB1c2hDb25maWcgPSBodW5ndXBQdXNoQ29uZmlnO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJUGx1Z2luR2VuZXJhdG9yLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCwgVmVyc2lvbk1hbmFnZSxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHtcbiAgUkNDYWxsRXJyb3JDb2RlLCBSQ0NhbGxMYW5ndWFnZSwgUkNDYWxsRW5kUmVhc29uLCBSQ0NhbGxNZWRpYVR5cGUsIFJDQ2FsbFVzZXJTdGF0ZSwgUkNDYWxsU2Vzc2lvblN0YXRlLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSVNlbmRlckluZm8sIElPZmZsaW5lUmVjb3JkLFxufSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHsgSVJDUlRDU3RhdGVSZXBvcnQgfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHtcbiAgSVJDQ2FsbEluaXRPcHRpb25zLCBJUkNDYWxsUGFyYW1zLCBJUkNDYWxsSW5Hcm91cFBhcmFtcywgSVNlc3Npb25MaXN0ZW5lciwgSU11dGVVc2VyLCBJTWVkaWFTdHJlYW1Db25zdHJhaW50cywgSURldmljZUNoYW5nZVBhcmFtcywgSVZhbGlkYXRpb25SZXN1bHQsIElQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgUkNDYWxsQ2xpZW50IGZyb20gJy4vUkNDYWxsQ2xpZW50JztcbmltcG9ydCB7IFJDQ2FsbFNlc3Npb24gfSBmcm9tICcuL1JDQ2FsbFNlc3Npb24nO1xuaW1wb3J0IHsgdmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuXG4vLyBwbHVnaW4tY2FsbCDniYjmnKzkuIrmiqVcblZlcnNpb25NYW5hZ2UuYWRkKCdwbHVnaW4tY2FsbCcsIF9fVkVSU0lPTl9fKTtcblxuY29uc3QgaW5zdGFsbGVyOiBJUGx1Z2luR2VuZXJhdG9yPFJDQ2FsbENsaWVudCwgSVJDQ2FsbEluaXRPcHRpb25zPiA9IHtcbiAgdGFnOiAnUkNDYWxsJyxcbiAgdmVyaWZ5KHJ1bnRpbWU6IElSdW50aW1lKSB7XG4gICAgcmV0dXJuIHJ1bnRpbWUudGFnID09PSAnYnJvd3Nlcic7XG4gIH0sXG4gIHNldHVwKGNvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsIHJ1bnRpbWU6IElSdW50aW1lLCBvcHRpb25zOiBJUkNDYWxsSW5pdE9wdGlvbnMpOiBSQ0NhbGxDbGllbnQge1xuICAgIC8vIOWFiOagoemqjOWPguaVsFxuICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMob3B0aW9ucyk7XG4gICAgaWYgKCFjb25jbHVzaW9uLnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsTGliIGluc3RhbGxlciBzdGV1cF0ke2NvbmNsdXNpb24ubXNnfWApO1xuICAgIH1cblxuICAgIC8vIOagoemqjOW9k+WJjeWuieijheeahCBlbmdpbmUg54mI5pys5piv5ZCm5Y+v55SoXG4gICAgaWYgKCFWZXJzaW9uTWFuYWdlLnZhbGlkRW5naW5lKF9fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fXykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGN1cnJlbnQgZW5naW5lIHZlcnNpb24gJyR7VmVyc2lvbk1hbmFnZS5nZXRJbmZvKCkuZW5naW5lfScgZXJyb3IsIHBsdWdpbi1jYWxsIHJlcXVpcmVkIGVuZ2luZSB2ZXJzaW9uIGF0IGxlYXN0ICcke19fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fX30nLmApO1xuICAgIH1cblxuICAgIGNvbnN0IGxvZ2dlciA9IGNvbnRleHQuY3JlYXRlTG9nZ2VyKCdSQ0NhbGwnLCAnUlRDJyk7XG4gICAgb3B0aW9ucy5sb2dPdXRwdXRMZXZlbCAmJiBsb2dnZXIuc2V0T3V0cHV0TGV2ZWwob3B0aW9ucy5sb2dPdXRwdXRMZXZlbCk7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMubG9nTGV2ZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsb2dnZXIud2FybignXycsICdUaGUgXFwnbG9nTGV2ZWxcXCcgcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgXFwnbG9nT3V0cHV0TGV2ZWxcXCcgaW5zdGVhZC4nKTtcbiAgICB9XG5cbiAgICBsb2dnZXIud2FybignXycsIGBSQ0NhbGwgVmVyc2lvbjogJHtfX1ZFUlNJT05fX30sIENvbW1pdDogJHtfX0NPTU1JVF9JRF9ffWApO1xuXG4gICAgcmV0dXJuIG5ldyBSQ0NhbGxDbGllbnQoY29udGV4dCwgcnVudGltZSwgbG9nZ2VyLCBvcHRpb25zKTtcbiAgfSxcbn07XG5cbmV4cG9ydCB7XG4gIGluc3RhbGxlcixcbiAgUkNDYWxsQ2xpZW50LFxuICBSQ0NhbGxTZXNzaW9uLFxuICBSQ0NhbGxMYW5ndWFnZSxcbiAgUkNDYWxsRXJyb3JDb2RlLFxuICBSQ0NhbGxFbmRSZWFzb24sXG4gIFJDQ2FsbE1lZGlhVHlwZSxcbiAgUkNDYWxsVXNlclN0YXRlLFxuICBSQ0NhbGxTZXNzaW9uU3RhdGUsXG59O1xuXG5leHBvcnQgdHlwZSB7XG4gIElFbmRTdW1tYXJ5LFxuICBJUkNDYWxsSW5pdE9wdGlvbnMsXG4gIElSQ0NhbGxQYXJhbXMsXG4gIElSQ0NhbGxJbkdyb3VwUGFyYW1zLFxuICBJU2Vzc2lvbkxpc3RlbmVyLFxuICBJU2VuZGVySW5mbyxcbiAgSU11dGVVc2VyLFxuICBJSW52aXRlZFVzZXJzLFxuICBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyxcbiAgSURldmljZUNoYW5nZVBhcmFtcyxcbiAgSU9mZmxpbmVSZWNvcmQsXG4gIElSQ1JUQ1N0YXRlUmVwb3J0LFxuICBJUHVzaENvbmZpZyxcbn07XG4iXSwibmFtZXMiOlsic3RyaW5nMTB0bzY0IiwibnVtYmVyIiwiY2hhcnMiLCJyYWRpeCIsInF1dGllbnQiLCJhcnIiLCJtb2QiLCJnZXRVVUlEIiwiYyIsInIiLCJnZXRVVUlEMjIiLCJ1dWlkIiwiZ2VuZXJhdGVSYW5kb21JZCIsInJhbmRvbSIsInRpbWVyU2V0VGltZW91dCIsImZ1bmMiLCJ0aW1lb3V0IiwiZXZlbnRFbWl0dGVyIiwiRXZlbnRFbWl0dGVyIiwiZ2V0Q2FsbERldmljZUlkIiwicnVudGltZSIsImtleSIsIk1zZ0NhbGxTdGF0dXMiLCJNc2dDYWxsU3RhdHVzMiIsIlJDQ2FsbEVycm9yQ29kZSIsIlJDQ2FsbEVuZFJlYXNvbiIsIkNhbGxSZW1vdGVFbmRSZWFzb24iLCJSQ0NhbGxNZXNzYWdlVHlwZSIsIlJDQ2FsbFNlc3Npb25TdGF0ZSIsIlJDQ2FsbFNlc3Npb25TdGF0ZTIiLCJSQ0NhbGxVc2VyU3RhdGUiLCJSQ0NhbGxVc2VyU3RhdGUyIiwiUkNDcm9zc0NhbGxUeXBlIiwiVGltZXIkMSIsImNhbGxiYWNrIiwiX19wdWJsaWNGaWVsZCIsImVuZFRpbWUiLCJkdXJhdGlvbiIsIlJDQ2FsbFN0YXRlTWFjaGluZSIsIl9jb250ZXh0IiwiX3J1bnRpbWUiLCJfbG9nZ2VyIiwiX2NhbGxNc2dIYW5kbGVyIiwiX2NoYW5uZWxJZCIsIl9jb252ZXJzYXRpb25UeXBlIiwiX3RhcmdldElkIiwiX21lZGlhVHlwZSIsIl9jYWxsSWQiLCJzZW50VGltZSIsImRlbGF5VGltZSIsInVzZXJJZCIsInN0YXRlIiwicmVhc29uIiwiX2EiLCJ1c2VyIiwibWVzc2FnZSIsInNlbmRlclVzZXJJZCIsInVzZXJQcm9maWxlIiwiaHVuZ3VwUmVhc29uIiwibWVzc2FnZVR5cGUiLCJlbmRSZWFzb24iLCJyZW1vdGVVc2VySWQiLCJtc2dEZXZpY2VJZCIsInN1aWQiLCJkZXZpY2VJZCIsInNlbmRlckRldmljZUlkIiwiY3VycmVudFVzZXJJZCIsIkNvbnZlcnNhdGlvblR5cGUiLCJpc0N1cnJlbnRVc2VySWQiLCJtZWRpYVR5cGUiLCJjb250ZW50IiwiaXNMZXNzVGhhblR3byIsImlzSW52aXRlVXNlciIsImlzTm9PbmVBbnN3ZXJlZCIsIndhdGNoZXJzIiwiaW5pZHMiLCJyb29tVHlwZSIsInVzZXJJZExpc3QiLCJpZCIsImludml0ZVVzZXJJZHMiLCJUaW1lciIsImV4aXN0ZWRVc2VyUG9maWxlcyIsImNhbGxlciIsIm5lZWRSaW5naW5nVXNlcklkcyIsInVzZXJJbmZvIiwiY2FsbFN0YXR1cyIsImVycm9yIiwidXNlcklkcyIsImV4dHJhIiwicHVzaENvbmZpZyIsImlzQ3Jvc3NBcHBrZXkiLCJjb2RlIiwiaXNDYWxsZXIiLCJlbmRDb2RlIiwib3B0aW9ucyIsImV4aXN0ZWRVc2VySWRzIiwiaGFuZ3VwUGFyYW1zIiwibXNnQ29kZSIsInJlbW90ZVVzZXJzIiwicmVtb3RlVXNlciIsInVpZCIsImJlZ2luVGltZXN0YW1wIiwiZW5kVGltZXN0YW1wIiwic3VtbWFyeSIsIlJDQ2FsbE1lZGlhVHlwZSIsIlJDQ2FsbE1lZGlhVHlwZTIiLCJNZW1iZXJNb2RpZnlUeXBlIiwiTWVtYmVyTW9kaWZ5VHlwZTIiLCJQbGF0Zm9ybSIsIk9mZmxpbmVSZWNvcmRlciIsIl9vblJlY29yZCIsImNoYW5uZWxJZCIsImNvbnZlcnNhdGlvblR5cGUiLCJ0YXJnZXRJZCIsImNhbGxJZCIsImlzU2VsZlNlbmQiLCJtZXNzYWdlcyIsIm1zZyIsImNhbGxNc2dUeXBlcyIsIkVuZ2luZUVycm9yQ29kZVRvQ2FsbEVycm9yQ29kZSIsIkVycm9yQ29kZSIsIkNhbGxNZXNzYWdlSGFuZGxlciIsIl9vZmZsaW5lTXNnSXR2IiwiX2dldFN0YXRlTWFjaGluZSIsInJlY29yZCIsIm1hcmtUaW1lIiwiY3VycmVudE1zZ1NlbnRUaW1lIiwiaW5zZXJ0SW5kZXgiLCJpbmRleCIsImN1cnJlbnRUaW1lIiwiYnVmZmVycyIsIml0ZW0iLCJtZXNzYWdlVUlkIiwiaXNPZmZMaW5lTWVzc2FnZSIsIm9mZmxpbmVCdWZmZXJzIiwiaW52aXRlQ2FsbElkIiwiaXNJbnZpdGVNc2dUeXBlIiwiaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYiLCJ0YXNrTXNnTGlzdCIsImkiLCJvdGhlckNhbGxJZCIsImRlbEluZGV4IiwiZGVsT2ZmbGluZUluZGV4IiwiaXNVbmZpbmlzaGVkUHJpdmF0ZUNhbGwiLCJpc09ubHlJbnZpdGUiLCJoYXNJbnZpdGVBbmRSaW5naW5nIiwiaXNVbmZpbmlzaGVkR3JwQ2FsbCIsImlzVW5maW5pc2hlZCIsIm5vT25lQWNjZXB0IiwiYWxsVXNlcklkcyIsImlzQ2FsbGVySHVuZ3VwIiwidGFza01zZ1NlbmRlclVzZXJJZCIsImRlbENvdW50IiwibGlzdGVuZXIiLCJmdW5jTmFtZSIsImV2ZW50IiwiZXZlbnRUeXBlIiwiZGlyZWN0aW9uYWxVc2VySWRMaXN0Iiwic2VuZE9wdHMiLCJuZXdQdXNoQ29uZmlnIiwiY2FsbGVySWQiLCJSQ0NhbGxMYW5ndWFnZSIsIkVOIiwiWkgiLCJMb2NhbCIsImxhbmciLCJSQ0NhbGxFbmdpbmUiLCJfd2F0Y2hlcnMiLCJfb3B0aW9ucyIsImNydFVzZXJJZCIsImluZm8iLCJQcm9kdWNlVHlwZXMiLCJmdW4iLCJvbiIsImRhdGEiLCJmdW5zIiwiY2IiLCJsZW5ndGgiLCJpc0xhbmd1YWdlIiwidmFsIiwiaXNKb2luVHlwZSIsIlJUQ0pvaW5UeXBlIiwiaXNMb2dMZXZlbCIsIkxvZ0wiLCJ2YWxpZGF0ZUNhbGxJbml0T3B0aW9ucyIsImtleU5hbWVzIiwia2V5cyIsIm1pc3NpbmdLZXlzIiwidmFsaWRhdGVMaXN0ZW5lciIsInZhbGlkYXRlVGFyZ2V0SWQiLCJ2YWxpZGF0ZU1lZGlhVHlwZSIsInZhbGlkYXRlRXh0cmEiLCJ2YWxpZGF0ZVB1c2hDb25maWciLCJwdXNoQ29uZmlnS2V5cyIsImlzVW5kZWZpbmVkIiwiaXNCb29sZWFuIiwiaXNTdHJpbmciLCJpT1NDb25maWciLCJhbmRyb2lkQ29uZmlnIiwidmFsaWRhdGVJT1NDb25maWdSZXMiLCJ2YWxpZGF0ZUlPU0NvbmZpZyIsInZhbGlkYXRlQW5kcm9pZENvbmZpZ1JlcyIsInZhbGlkYXRlQW5kcm9pZENvbmZpZyIsInRocmVhZElkIiwicmljaE1lZGlhVXJpIiwiYW5kcm9pZENvbmZpZ0tleXMiLCJ2YWxpZGF0ZVVzZXJJZHMiLCJzdHIiLCJpc1JDRnJhbWVSYXRlIiwiaXNWYWxpZFJlc29sdXRpb24iLCJyZXNvbHV0aW9uIiwiUkNSZXNvbHV0aW9uIiwidmFsaWRhdGVNZWRpYVN0cmVhbUNvbnN0cmFpbnRzIiwiY29uc3RyYWludHMiLCJSQ0NhbGxTZXNzaW9uIiwiX3N0YXRlTWFjaGluZSIsIl9ydGNDbGllbnQiLCJyb29tSWQiLCJzdW1tYXJ5SW5mbyIsInNlbmRlciIsImludml0ZWRVc2VycyIsImNhbGxCYWNrIiwicm9vbSIsIlJDUlRDQ29kZSIsInRyYWNrcyIsImlzQWxsb3dTdWJzY3JpYmVSZXRyeSIsImNvdW50IiwiaXNBbGxvd1B1Ymxpc2hSZXRyeSIsImNvbmNsdXNpb24iLCJ0cmFjayIsIl9jb2RlIiwiYXVkaW9Db25zdHJhaW50cyIsInJlY2VudFRyYWNrcyIsImxvY2FsVHJhY2tzIiwiZXJyb3JNc2ciLCJvYmoiLCJsb2NhbFZpZGVvVHJhY2tzIiwibG9jYWxBdWRpb3RyYWNrcyIsImJ5U2VydmVyIiwiUkNLaWNrUmVhc29uIiwibmFtZSIsImF1ZGlvVHJhY2siLCJtdXRlVXNlciIsInZpZGVvVHJhY2siLCJyZXN1bHQiLCJyZXBvcnQiLCJSQ0NhbGxDbGllbnQiLCJzZXNzaW9uIiwic2VzIiwic3RhdGVNYWNoaW5lIiwicHVzaFRpdGxlIiwicHVzaENvbnRlbnQiLCJiaXRyYXRlIiwidmFsaWRhdGVQdXNoQ29kZSIsIl9iIiwiX2MiLCJjYWxsUHVzaENvbmZpZyIsImh1bmd1cFB1c2hDb25maWciLCJ2YWxpZGF0ZVJlcyIsIlZlcnNpb25NYW5hZ2UiLCJpbnN0YWxsZXIiLCJjb250ZXh0IiwibG9nZ2VyIl0sIm1hcHBpbmdzIjoiMmdCQUVBLE1BQU1BLEdBQWdCQyxHQUFtQixDQUNqQyxNQUFBQyxFQUFRLG1FQUFtRSxNQUFNLEVBQUUsRUFDbkZDLEVBQVFELEVBQU0sT0FBUyxFQUM3QixJQUFJRSxFQUFVLENBQUNILEVBQ2YsTUFBTUksRUFBTSxDQUFBLEVBQ1QsRUFBQSxDQUNELE1BQU1DLEVBQU1GLEVBQVVELEVBQ3RCQyxHQUFXQSxFQUFVRSxHQUFPSCxFQUN4QkUsRUFBQSxRQUFRSCxFQUFNSSxDQUFHLENBQUMsUUFDZkYsR0FDRixPQUFBQyxFQUFJLEtBQUssRUFBRSxDQUNwQixFQUVNRSxHQUFVLElBQU0sdUNBQXVDLFFBQVEsUUFBVUMsR0FBTSxDQUNuRixNQUFNQyxFQUFJLEtBQUssT0FBTyxFQUFJLEdBQUssRUFFeEIsT0FER0QsSUFBTSxJQUFNQyxFQUFLQSxFQUFJ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