@rongcloud/plugin-call 5.2.5 → 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.cjs.js +9 -0
- package/dist/index.d.ts +26 -28
- package/dist/index.esm.js +9 -2597
- package/package.json +4 -4
- package/dist/index.umd.js +0 -5
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||{}),c=(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))(c||{}),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,l){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=l,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(l=>{const _=l===a;this._userInfo[l]={userId:l,state:m.KEEPING,isCaller:_,isRemote:_,deviceId:_?Y(this._runtime):n},_||(this._beginTimestamp=Date.now(),Object.assign(this._userInfo[r],i)),this._notifyUserStateChange(this._userInfo[l])}),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 l=Object.keys(this._userInfo).length<2,_=this._inviterId===n,u=Object.values(this._userInfo).every(M=>M.state!==m.KEEPING);(l||_&&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 l;h===G.RCCallRoomTypeAcrossCall?([,l]=t.split("_"),this._watchers.crossAppkey(!0),this._isCrossAppkey=!0):l=t;const _=this._context.getCurrentId();if(this._isRemoteInvalidMsg(l,a)){this._logger.debug("_","[RCCallStateMachine] __onInvite -> not the remote device that is currently talking");return}if(_===l)return;this._callerId=this._inviterId=l;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;[l,...M].forEach(g=>{this._userInfo[g]={userId:g,state:m.WAITING,isCaller:g===l,isRemote:g!==_},g===l&&Object.assign(this._userInfo[g],r,{deviceId:a}),this._notifyUserStateChange(this._userInfo[g]),g!==l&&(this._userTimers[g]=new $(()=>{const N=g===_?d.NO_RESPONSE:d.REMOTE_NO_RESPONSE;g===_?this._hungupHandle(N,!1):(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._clearTimerById(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:l,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,l.forEach(E=>{r.push({userId:E,mediaType:_,callStatus:b.INCOMING})}),l.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:l.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(!l.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._clearTimerById(g)},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===c.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===c.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===c.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===c.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:c.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:l}=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===c.SUCCESS){const{sentTime:_}=l;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===c.REJECTED_BY_BLACKLIST?d.ADDED_TO_BLACKLIST:d.NETWORK_ERROR;this._notifyUserStateChange(this._userInfo[_],u)});return{code:h}}async _hungupHandle(e,t=!0){const i=this._context.getCurrentId();let n=c.SUCCESS;if(t){const o={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(o);else{const{code:r}=await this._callMsgHandler.sendHungup(o);n=r}}this._endTimestamp=Date.now();for(const o in this._userInfo)this._userInfo[o].state=m.NONE,o===i?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:n}}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===c.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 ce{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:l}=a;this._channelId=i,this._conversationType=n,this._targetId=o,this._callId=h,this._mediaType=l;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 le=["RC:VCAccept","RC:VCRinging","RC:VCSummary","RC:VCHangup","RC:VCInvite","RC:VCModifyMedia","RC:VCModifyMem"],_e={[C.ErrorCode.REJECTED_BY_BLACKLIST]:c.REJECTED_BY_BLACKLIST,[C.ErrorCode.NOT_IN_GROUP]:c.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 ce(this._context,this._logger,a=>{this._logger.info("_",`[CallMessageHandler] offlineRecorder -> ${JSON.stringify(a)}`),this._watchers.onOfflineRecord&&this._watchers.onOfflineRecord(a)})}_onMessage(t){if(le.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:l,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(l===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(l)?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:l}=t,_={channelId:i,messageType:a,content:r,directionalUserIdList:h};if([R.VCInvite,R.VCModifyMem,R.VCHangup].includes(a)){const E=l||{pushTitle:"",pushContent:"",pushData:""};E.androidConfig=Object.assign((l==null?void 0:l.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]||c.SEND_MSG_ERROR}):{code:c.SUCCESS,message:M}}async sendInvite(t){const{roomType:i,channelId:n,conversationType:o,targetId:r,callId:a,mediaType:h,inviteUserIds:l,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:l,observerUserIds:[],user:this._userInfo};return u&&(u.pushData=JSON.stringify({mediaType:h,userIdList:l,callId:a})),this._sendCallMessage({channelId:n,conversationType:o,targetId:r,content:M,messageType:R.VCInvite,directionalUserIdList:o===C.ConversationType.GROUP?l:[r],pushConfig:u})}async sendMemeberModify(t){const{channelId:i,conversationType:n,targetId:o,callId:r,mediaType:a,inviteUserIds:h,callerId:l,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:l,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,l={platform:w.WEB,deviceId:this._deviceId,callId:r,mediaType:a,user:this._userInfo};return this._sendCallMessage({channelId:i,conversationType:n,targetId:o,content:l,messageType:R.VCAccept,directionalUserIdList:h})}sendHungup(t){const{channelId:i,conversationType:n,targetId:o,callId:r,reason:a,userIds:h,pushConfig:l}=t,_={platform:w.WEB,deviceId:this._deviceId,callId:r,reason:a,user:this._userInfo};return l&&(l.pushData=JSON.stringify({callId:r,reason:a})),this._sendCallMessage({channelId:i,conversationType:n,targetId:o,content:_,messageType:R.VCHangup,pushConfig:l,directionalUserIdList:h})}sendMediaModify(t){const{channelId:i,conversationType:n,targetId:o,callId:r,mediaType:a,userIds:h}=t,l={platform:w.WEB,deviceId:this._deviceId,callId:r,mediaType:a,user:this._userInfo};return this._sendCallMessage({channelId:i,conversationType:n,targetId:o,content:l,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.5 CommitId: 3580977730beafd1c85aff0653e30f8c75cff0cf"),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:l,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,l,_),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:c.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:l}=await this._stateMachine[a].__call([t],n,o,r);return l===c.SUCCESS?{code:c.SUCCESS,stateMachine:this._stateMachine[a]}:{code:l}}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:c.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:l}=await this._stateMachine[a].__call(n,o,r);return l===c.SUCCESS?{code:c.SUCCESS,stateMachine:this._stateMachine[a]}:{code:l}}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:c.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:c.PARAM_ERROR,errorMsg:`${h} type is boolean`}}else if((h==="pushTitle"||h==="templateId")&&s[h]&&!C.isString(s[h]))return{code:c.PARAM_ERROR,errorMsg:`${h} type is string`}}const{iOSConfig:i,androidConfig:n}=s,o=Te(i||{});if(o.code!==c.SUCCESS)return o;const r=me(n||{});return r.code!==c.SUCCESS?r:{code:c.SUCCESS}},Te=s=>{const{threadId:e,richMediaUri:t}=s||{};return e&&!C.isString(e)?{code:c.PARAM_ERROR,errorMsg:"iOSConfig.threadId type is string"}:t&&!C.isString(t)?{code:c.PARAM_ERROR,errorMsg:"iOSConfig.richMediaUri type is string"}:{code:c.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:c.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:c.PARAM_ERROR,errorMsg:`androidConfig.${n} value is NORMAL|LOW`}}else if(s[n]&&!C.isString(s[n]))return{code:c.PARAM_ERROR,errorMsg:`androidConfig.${n} type is string`}}return{code:c.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(l){this._exceptionClose(d.NETWORK_ERROR),this._logger.error("_",`[RCCallSession onStateChange] joinRoom throw exception roomId -> ${h}`),console.error(l)}}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:c.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:c.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:c.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:c.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:c.JOIN_ROOM_ERROR}}return{code:c.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:c.GET_LOCAL_AUDIO_TRACK_ERROR}):(this._logger.info("_","[RCCallSession _getLocalTrackCore] successfully get Audio local tracks"),{code:c.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:c.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR}):(this._logger.info("_","[RCCallSession _getLocalTrackCore] successfully get audio and video local tracks"),{code:c.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!==c.SUCCESS){const{code:a,tracks:h}=await this._getLocalTrackCore(y.AUDIO,t);return a!==c.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!==c.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:c.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:c.AUDIO_PUBLISH_ERROR}}return{code:c.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:l,errorMsg:_}=J(n);if(l!==c.SUCCESS)return this._logger.error("_",`[RCCallSession invite] param error, errorMsg: ${_}`),{code:l}}const r=[];if(!o.every(l=>(!l.result&&r.push(l.msg),l.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!==c.SUCCESS)return{code:n};this._options.localTracks=o;const{code:r}=await this._stateMachine.accept();return r!==c.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!==c.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:c.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===c.SUCCESS&&this._setMediaTypeToAudio(),{code:e}}async disableVideoTrack(){if(!this._room)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${c.NOT_IN_ROOM_ERROR}`),{code:c.NOT_IN_ROOM_ERROR};const e=this._getLocalVideoTracks();if(!e.length)return this._logger.error("_",`[RCCallSession disableVideoTrack] Room missing video track -> ${c.MISSING_VIDEO_TRACK_ERROR}`),{code:c.MISSING_VIDEO_TRACK_ERROR};if(e.forEach(i=>{i.mute()}),!this._options.isOffCameraWhenVideoDisable)return{code:c.SUCCESS};const{code:t}=await this._room.unpublish(e);return t!==T.RCRTCCode.SUCCESS?(this._logger.error("_",`[RCCallSession disableVideo] unpublish failed -> ${t}`),{code:c.UNPUBLISH_VIDEO_ERROR}):(e.forEach(i=>{i.destroy()}),{code:c.SUCCESS})}async enableVideoTrack(){if(!this._room)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${c.NOT_IN_ROOM_ERROR}`),{code:c.NOT_IN_ROOM_ERROR};if(!this._options.isOffCameraWhenVideoDisable){const o=this._getLocalVideoTracks();return o.length?(o.forEach(r=>{r.unmute()}),{code:c.SUCCESS}):(this._logger.error("_",`[RCCallSession EnableVideoTrack] Room missing video track -> ${c.MISSING_VIDEO_TRACK_ERROR}`),{code:c.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:c.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:c.VIDEO_PUBLISH_ERROR}):(t.unmute(),this._notifyTrackReady([t]),{code:c.SUCCESS})}async disableAudioTrack(){if(!this._room)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${c.NOT_IN_ROOM_ERROR}`),{code:c.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 -> ${c.NOT_IN_ROOM_ERROR}`),{code:c.NOT_IN_ROOM_ERROR};const e=this._getLocalAudioTracks();if(!e.length)return this._logger.error("_",`[RCCallSession disableAudioTrack] Room missing audio track -> ${c.MISSING_VIDEO_TRACK_ERROR}`),{code:c.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:l}){return this.__call({targetId:e,mediaType:t,listener:i,constraints:n,channelId:o,extra:r,pushTitle:a,pushContent:h,bitrate:l,isCrossAppkey:!0})}async call({targetId:e,mediaType:t=y.AUDIO,listener:i,constraints:n,channelId:o="",extra:r="",pushTitle:a="",pushContent:h="",bitrate:l}){return this.__call({targetId:e,mediaType:t,listener:i,constraints:n,channelId:o,extra:r,pushTitle:a,pushContent:h,bitrate:l})}async __call({targetId:e,mediaType:t=y.AUDIO,listener:i,constraints:n,channelId:o="",extra:r="",pushTitle:a="",pushContent:h="",bitrate:l,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!==c.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!==c.SUCCESS)return{code:A};S=U,S.forEach(I=>{var k,H,K;I.isAudioTrack()&&(l!=null&&l.audio)&&I.setBitrate(l==null?void 0:l.audio),I.isVideoTrack()&&(l!=null&&l.video)&&I.setBitrate((k=l==null?void 0:l.video)==null?void 0:k.max,(H=l==null?void 0:l.video)==null?void 0:H.min,(K=l==null?void 0:l.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===c.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:l="",bitrate:_}){const u=this._callPushConfig?this._callPushConfig:{pushTitle:h,pushContent:l},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!==c.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!==c.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===c.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:c.GET_LOCAL_AUDIO_TRACK_ERROR}):(this._logger.info("_","[RCCallClient _getTrack] successfully get Audio local tracks"),{code:c.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:c.GET_LOCAL_AUDIO_AND_VIDEO_TRACK_ERROR}):(this._logger.info("_","[RCCallClient _getTrack] successfully get audio and video local tracks"),{code:c.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!==c.SUCCESS){const{code:a,tracks:h}=await this._getLocalTrackCore(y.AUDIO,t);return a!==c.SUCCESS?{code:a}:{code:a,tracks:h}}return{code:o,tracks:r}}const{code:i,tracks:n}=await this._getLocalTrackCore(e,t);return i!==c.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:c.QUERY_JOINED_USER_INFO_ERROR}):{code:c.SUCCESS,data:t}}setPushConfig(e,t){const i=[e,t].map(n=>J(n));for(const{code:n,errorMsg:o}of i)if(n!==c.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.5");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.5, Commit: 3580977730beafd1c85aff0653e30f8c75cff0cf"),new ne(s,e,n,t)}};O.RCCallClient=ne,O.RCCallEndReason=d,O.RCCallErrorCode=c,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+pOiBiuS4reW3seaWuei2heaXtuaXoOmcgOWPkeaMguaWrea2iOaBr++8jOWPqumcgOS/ruaUueS6uuWRmOOAgemAmuivneaMguaWreeKtuaAgVxuICAgICAgICAgICAgdGhpcy5faHVuZ3VwSGFuZGxlKHJlYXNvbiwgZmFsc2UpO1xuICAgICAgICAgIH0gZWxzZSB7IC8vIOWFtuS7luS6uuWRmOi2heaXtuWPqumAmuefpeS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICAgICAgdGhpcy5fdXNlckluZm9bdXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKTtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcbiAgICAgICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSHVuZ3VwKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIHJlYXNvbik7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICog6LaF5pe25ZCO77yM5bqU5riF6Zmk5ZCv5Yqo55qE6LaF5pe25a6a5pe25ZmoXG4gICAgICAgICAgICovXG4gICAgICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIOaIv+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+adn1xuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMiB8fCB1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIHJlYXNvbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICog6LaF5pe25ZCO77yM5bqU5riF6Zmk5ZCv5Yqo55qE6LaF5pe25a6a5pe25ZmoXG4gICAgICAgICAgICovXG4gICAgICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICAgICAgfSwgdGhpcy5fZ2V0VGltZW91dChzZW50VGltZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWkhOeQhuW3suaciSBzZXNzaW9uIO+8jOS4jeWFgeiuuOWGjeaOpeWQrOaWsOS8muivneaDheWGtVxuICAgKi9cbiAgX19oYW5kbGVJbnZpdGVJblNlc3Npb24oKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnU3RhdGVNYWNoaW5lIC0+IF9faGFuZGxlSW52aXRlSW5TZXNzaW9uJyk7XG4gICAgLy8g5L+u5pS55omA5pyJ55So5oi354q25oCB5bm25oqb5Ye677yM5riF56m66K6h5pe25ZmoXG4gICAgZm9yIChjb25zdCB1c2VySWQgaW4gdGhpcy5fdXNlckluZm8pIHtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgJiYgKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORSk7XG4gICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bdXNlcklkXSk7XG4gICAgICAvLyDlsIblt7LlrZjlnKjnmoTorqHml7blmajpg73muIXmjolcbiAgICAgIHRoaXMuX2NsZWFyVGltZXJCeUlkKHVzZXJJZCk7XG4gICAgfVxuICAgIC8vIOebtOaOpee7iOatouW9k+WJjSBzZXNzaW9uIOeKtuaAgVxuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIFJDQ2FsbEVuZFJlYXNvbi5CVVNZX0xJTkUpO1xuICAgIC8vIOWPkemAgeaMguaWrea2iOaBr++8jOW5tuaQuuW4piDlt7Hmlrnlv5nnoowg5Y6f5ZugXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEh1bmd1cCh7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIHJlYXNvbjogUkNDYWxsRW5kUmVhc29uLkJVU1lfTElORSxcbiAgICAgIHVzZXJJZHM6IHRoaXMuZ2V0UmVtb3RlVXNlcklkcygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOS4u+WKqOWRvOWPqyAoQ2FsbEVuZ2luZSDlhoXpg6josIPnlKgpXG4gICAqIEBwYXJhbSB1c2VySWRzIOiiq+mCgOivt+eUqOaItyBJRCDliJfooahcbiAgICogQHBhcmFtIGV4dHJhIOa2iOaBr+eahOaJqeWxleS/oeaBr1xuICAgKiBAcGFyYW0gcHVzaENvbmZpZyDnp7vliqjnq6/mjqjpgIHphY3nva5cbiAgICovXG4gIGFzeW5jIF9fY2FsbCh1c2VySWRzOiBzdHJpbmdbXSwgZXh0cmE6IHN0cmluZyA9ICcnLCBwdXNoQ29uZmlnOiBJUHVzaENvbmZpZywgaXNDcm9zc0FwcGtleSA9IGZhbHNlKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxTdGF0ZU1hY2hpbmVdIGludml0ZSAtPiB1c2VySWRzOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWApO1xuICAgIC8vIOWPkemAgemCgOivt+a2iOaBr1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jYWxsZXJJZCA9IHRoaXMuX2ludml0ZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgeyBjb2RlLCBtZXNzYWdlIH0gPSBhd2FpdCB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSW52aXRlKHtcbiAgICAgIHJvb21UeXBlOiBpc0Nyb3NzQXBwa2V5ID8gUkNDcm9zc0NhbGxUeXBlLlJDQ2FsbFJvb21UeXBlQWNyb3NzQ2FsbCA6IFJDQ3Jvc3NDYWxsVHlwZS5SQ0NhbGxSb29tVHlwZU5vcm1hbENhbGwsXG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIGV4dHJhLFxuICAgICAgcHVzaENvbmZpZyxcbiAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgaW52aXRlVXNlcklkczogdXNlcklkcy5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gY3VycmVudFVzZXJJZCksXG4gICAgfSk7XG5cbiAgICB0aGlzLl9pc0Nyb3NzQXBwa2V5ID0gaXNDcm9zc0FwcGtleTtcblxuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgY29uc3QgeyBzZW50VGltZSB9ID0gbWVzc2FnZSE7XG5cbiAgICAgIC8qKlxuICAgICAgICog6LeoIGFwcGtleSDku4XlrZjlnKjljZXogYrvvIzlr7nnq68gdXNlcklkIOmcgOWPluS4i+WIkue6v+WQjumdoueahOmDqOWIhlxuICAgICAgICovXG4gICAgICBjb25zdCBpZHMgPSBpc0Nyb3NzQXBwa2V5ID8gW2N1cnJlbnRVc2VySWQsIC4uLlt1c2VySWRzWzBdLnNwbGl0KCdfJylbMV1dXSA6IFtjdXJyZW50VXNlcklkLCAuLi51c2VySWRzXTtcblxuICAgICAgLy8g6YGN5Y6G5pu05paw5oi/6Ze05omA5pyJ5Lq65ZGY54q25oCB44CB5bm257uZ6KKr5Y+r5ZCv5Yqo6K6h5pe25ZmoXG4gICAgICBpZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzQ2FsbGVyID0gdXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdID0ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLldBSVRJTkcsXG4gICAgICAgICAgaXNDYWxsZXIsXG4gICAgICAgICAgaXNSZW1vdGU6ICFpc0NhbGxlcixcbiAgICAgICAgfTtcbiAgICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdKTtcblxuICAgICAgICAvLyDlkK/liqjlkbzlj6votoXml7borqHml7blmahcbiAgICAgICAgaWYgKCFpc0NhbGxlcikge1xuICAgICAgICAgIHRoaXMuX3VzZXJUaW1lcnNbdXNlcklkXSA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgICAvLyDlkbzlj6votoXml7blpITnkIbnirbmgIHjgIHlubbpgJrnn6UgY2FsbCDlsYJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0gJiYgKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORSk7XG4gICAgICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFKTtcblxuICAgICAgICAgICAgLy8g5ZG85Y+r6LaF5pe25pyq5o6l5oqb5Ye6b25IdW5ndXBcbiAgICAgICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSHVuZ3VwKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlckluZm9bdXNlcklkXTtcbiAgICAgICAgICAgIC8vIOaIv+mXtOS6uuWRmOS/oeaBr+WwkeS6juS4pOS4qu+8jOmAmuefpeaIv+mXtOeKtuaAgVxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3VzZXJJbmZvKS5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6L+c56uv5Lq65ZGY5aSn5LqOIDEg5LiU5bex5pa55LiN5Li65q2j5Zyo6YCa6K+d5pe277yM5Y+R6YCBIGh1bmd1cCwg5ZGK6K+J6L+c56uv6Ieq5bex6YCA5Ye66YCa6K+dXG4gICAgICAgICAgICBjb25zdCBpc05lZWRTZW5kSHVuZ3VwID0gdGhpcy5nZXRSZW1vdGVVc2VySWRzKCkubGVuZ3RoID09PSAwICYmICh0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXS5zdGF0ZSAhPT0gUkNDYWxsVXNlclN0YXRlLktFRVBJTkcpO1xuICAgICAgICAgICAgaWYgKGlzTmVlZFNlbmRIdW5ndXApIHtcbiAgICAgICAgICAgICAgdGhpcy5faHVuZ3VwSGFuZGxlKFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHRoaXMuX2dldFRpbWVvdXQoc2VudFRpbWUpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIOmAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLldBSVRJTkcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlbmRDb2RlID0gY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCA/IFJDQ2FsbEVuZFJlYXNvbi5BRERFRF9UT19CTEFDS0xJU1QgOiBSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUjtcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIGVuZENvZGUpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjqXlkKxcbiAgICovXG4gIGFzeW5jIGFjY2VwdCgpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCAnW1JDQ2FsbFN0YXRlTWFjaGluZV0gYWNjZXB0Jyk7XG5cbiAgICAvLyDlj5HpgIHmjqXlkKzmtojmga9cbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7IGNvZGUsIG1lc3NhZ2UgfSA9IGF3YWl0IHRoaXMuX2NhbGxNc2dIYW5kbGVyLnNlbmRBY2NlcHQoe1xuICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQ6IHRoaXMuX3RhcmdldElkLFxuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICBtZWRpYVR5cGU6IHRoaXMuX21lZGlhVHlwZSxcbiAgICAgIHVzZXJJZHM6IHRoaXMuZ2V0UmVtb3RlVXNlcklkcygpLFxuICAgIH0pO1xuXG4gICAgLy8g5riF6Zmk5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQoY3VycmVudFVzZXJJZCk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICBjb25zdCB7IHNlbnRUaW1lIH0gPSBtZXNzYWdlITtcbiAgICAgIHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdICYmICh0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXS5zdGF0ZSA9IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HKTtcbiAgICAgIHRoaXMuX2JlZ2luVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdKTtcbiAgICAgIC8vIOS/ruaUueW5tumAmuefpSBjYWxsIOWxguaIv+mXtOeKtuaAgeWPmOabtFxuICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLktFRVBJTkcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXSAmJiAodGhpcy5fdXNlckluZm9bY3VycmVudFVzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORSk7XG4gICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1tjdXJyZW50VXNlcklkXSk7XG4gICAgICAvLyDkv67mlLnlubbpgJrnn6UgY2FsbCDlsYLmiL/pl7TnirbmgIHlj5jmm7RcbiAgICAgIGNvbnN0IGVuZFJlYXNvbiA9IGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5SRUpFQ1RFRF9CWV9CTEFDS0xJU1QgPyBSQ0NhbGxFbmRSZWFzb24uQURERURfVE9fQkxBQ0tMSVNUIDogUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1I7XG4gICAgICB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZShSQ0NhbGxTZXNzaW9uU3RhdGUuRU5ELCBlbmRSZWFzb24pO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnvqTlkbzlj6vkuK3nu6fnu63pgoDor7dcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+355So5oi3IElEIOWIl+ihqFxuICAgKi9cbiAgYXN5bmMgaW52aXRlKHVzZXJJZHM6IHN0cmluZ1tdLCBvcHRpb25zOiBJSW52aXRlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgaWYgKHRoaXMuX2NvbnZlcnNhdGlvblR5cGUgIT09IENvbnZlcnNhdGlvblR5cGUuR1JPVVApIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5DT05WRVJTQVRJT05fTk9UX0dST1VQX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxTdGF0ZU1hY2hpbmVdIGludml0ZSAtPiB1c2VySWRzOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWApO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IGV4aXN0ZWRVc2VySWRzID0gT2JqZWN0LmtleXModGhpcy5fdXNlckluZm8pO1xuICAgIGNvbnN0IGV4aXN0ZWRVc2VyUG9maWxlczogSUV4aXN0ZWRVc2VyUG9maWxlc1tdID0gZXhpc3RlZFVzZXJJZHMubWFwKCh1c2VySWQpID0+IHtcbiAgICAgIGxldCBjYWxsU3RhdHVzID0gTXNnQ2FsbFN0YXR1cy5DT05ORUNURUQ7XG4gICAgICAvLyDljIXlkKvooqvpgoDor7fogIXvvIzmiJbogIXnlKjmiLfnirbmgIHkuLogd2F0aW5nIOaXtu+8jOeKtuaAgeS4uiDlk43pk4NcbiAgICAgIGlmICh1c2VySWRzLmluY2x1ZGVzKHVzZXJJZCkgfHwgdGhpcy5fdXNlckluZm9bdXNlcklkXS5zdGF0ZSA9PT0gUkNDYWxsVXNlclN0YXRlLldBSVRJTkcpIHtcbiAgICAgICAgY2FsbFN0YXR1cyA9IE1zZ0NhbGxTdGF0dXMuUklOR0lORztcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICAgIGNhbGxTdGF0dXMsXG4gICAgICAgIG1lZGlhSWQ6IHVzZXJJZCxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGV4dHJhID0gJycsIHB1c2hDb25maWcgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyDlj5HpgIHkurrlkZjlj5jmm7Tmtojmga9cbiAgICBjb25zdCB7IGNvZGUsIG1lc3NhZ2UgfSA9IGF3YWl0IHRoaXMuX2NhbGxNc2dIYW5kbGVyLnNlbmRNZW1lYmVyTW9kaWZ5KHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgZXh0cmEsXG4gICAgICBwdXNoQ29uZmlnLFxuICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICAvLyDpmaToh6rlt7HvvIzlhbbku5bmiYDmnInkurrlnYfpnIDmlLbliLAgbW9kaWZ5IOa2iOaBr++8jOS7peatpOabtOaWsOeKtuaAgVxuICAgICAgaW52aXRlVXNlcklkczogdXNlcklkcy5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gY3VycmVudFVzZXJJZCksXG4gICAgICBjYWxsZXJJZDogdGhpcy5nZXRDYWxsZXJJZCgpLFxuICAgICAgZXhpc3RlZFVzZXJQb2ZpbGVzLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiBbLi4uZXhpc3RlZFVzZXJJZHMsIC4uLnVzZXJJZHNdLmZpbHRlcigoaWQpID0+IGlkICE9PSBjdXJyZW50VXNlcklkKSxcbiAgICB9KTtcblxuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgY29uc3QgeyBzZW50VGltZSB9ID0gbWVzc2FnZSE7XG4gICAgICAvLyDkv67mlLnooqvpgoDor7fkurrnirbmgIHvvIzlubbpgJrnn6VcbiAgICAgIHVzZXJJZHMuZm9yRWFjaCgodXNlcklkKSA9PiB7XG4gICAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0gPSB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHN0YXRlOiBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORyxcbiAgICAgICAgICBpc0NhbGxlcjogZmFsc2UsXG4gICAgICAgICAgaXNSZW1vdGU6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIC8vIOmAmuefpSBjYWxsIOWxguS6uuWRmOeKtuaAgeWPmOabtFxuICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bdXNlcklkXSk7XG4gICAgICAgIC8vIOWQr+WKqOWRvOWPq+iuoeaXtuWZqFxuICAgICAgICB0aGlzLl91c2VyVGltZXJzW3VzZXJJZF0gPSBuZXcgVGltZXIoKCkgPT4ge1xuICAgICAgICAgIC8vIOWRvOWPq+i2heaXtuWkhOeQhueKtuaAgeOAgeW5tumAmuefpSBjYWxsIOWxglxuICAgICAgICAgIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0gJiYgKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORSk7XG4gICAgICAgICAgLy8g6YCa55+lIGNhbGwg5bGC5Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UpO1xuXG4gICAgICAgICAgLy8g5ZG85Y+r6LaF5pe25pyq5o6l5oqb5Ye6b25IdW5ndXBcbiAgICAgICAgICB0aGlzLl93YXRjaGVycy5vbkh1bmd1cCh0aGlzLl91c2VySW5mb1t1c2VySWRdLCBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFKTtcblxuICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICAgIC8vIOaIv+mXtOS6uuWRmOS/oeaBr+WwkeS6juS4pOS4qu+8jOmAmuefpeaIv+mXtOeKtuaAgVxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5U3RhdGVDaGFuZ2UoUkNDYWxsU2Vzc2lvblN0YXRlLkVORCwgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9OT19SRVNQT05TRSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLl9nZXRUaW1lb3V0KHNlbnRUaW1lKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6YCa55+l5Lq65ZGY5Y+Y5pu0XG4gICAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdID0ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzdGF0ZTogUkNDYWxsVXNlclN0YXRlLk5PTkUsXG4gICAgICAgICAgaXNDYWxsZXI6IGZhbHNlLFxuICAgICAgICAgIGlzUmVtb3RlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICAvLyDpgJrnn6UgY2FsbCDlsYLkurrlkZjnirbmgIHlj5jmm7RcblxuICAgICAgICBjb25zdCBlbmRSZWFzb24gPSBjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuUkVKRUNURURfQllfQkxBQ0tMSVNUID8gUkNDYWxsRW5kUmVhc29uLkFEREVEX1RPX0JMQUNLTElTVCA6IFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SO1xuICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodGhpcy5fdXNlckluZm9bdXNlcklkXSwgZW5kUmVhc29uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2h1bmd1cEhhbmRsZShyZWFzb246IFJDQ2FsbEVuZFJlYXNvbiwgaXNTZW5kSGFuZ3VwTWVzc2FnZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcblxuICAgIC8vIOWPkemAgeaMguaWreexu+Wei+a2iOaBr1xuICAgIGxldCBjb2RlID0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1M7XG4gICAgaWYgKGlzU2VuZEhhbmd1cE1lc3NhZ2UpIHtcbiAgICAgIGNvbnN0IGhhbmd1cFBhcmFtcyA9IHtcbiAgICAgICAgY2hhbm5lbElkOiB0aGlzLl9jaGFubmVsSWQsXG4gICAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICAgIHJlYXNvbixcbiAgICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgICAgIHB1c2hDb25maWc6IHRoaXMuX2h1bmd1cFB1c2hDb25maWcsXG4gICAgICB9O1xuXG4gICAgICBpZiAocmVhc29uID09PSBSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMKSB7XG4gICAgICAgIC8vIOW3seerr+iiq+Wkmuerr+WKoOWFpSBSVEMg5oi/6Ze05oyk5o6J5ZCO77yM5LiN5YaN562J5Y+R5oyC5pat5raI5oGv55qE57uT5p6c77yM6Ziy5q2i6LWwIHVzZXJMZWF2ZSDlr7zoh7TmjILmlq3ljp/lm6DkuI3lh4bnoa5cbiAgICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZEh1bmd1cChoYW5ndXBQYXJhbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyBjb2RlOiBtc2dDb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsTXNnSGFuZGxlci5zZW5kSHVuZ3VwKGhhbmd1cFBhcmFtcyk7XG4gICAgICAgIGNvZGUgPSBtc2dDb2RlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2VuZFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgLy8g5pu05paw6YCa6K+d5Lq65ZGY54q25oCB44CB6YCa6K+d57uT5p2f5pe26Ze0IOW5tumAmuefpVxuICAgIGZvciAoY29uc3QgdXNlcklkIGluIHRoaXMuX3VzZXJJbmZvKSB7XG4gICAgICB0aGlzLl91c2VySW5mb1t1c2VySWRdLnN0YXRlID0gUkNDYWxsVXNlclN0YXRlLk5PTkU7XG4gICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgIHRoaXMuX25vdGlmeVVzZXJTdGF0ZUNoYW5nZSh0aGlzLl91c2VySW5mb1t1c2VySWRdLCByZWFzb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbm90aWZ5VXNlclN0YXRlQ2hhbmdlKHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0pO1xuICAgICAgfVxuICAgICAgZGVsZXRlIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF07XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3VzZXJJbmZvKS5sZW5ndGggPCAyKSB7XG4gICAgICAvLyDmuIXnqbrlhoXlrZjmgIHmlbDmja7vvIzlubbpgJrnn6VcbiAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIHJlYXNvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaMguaWrVxuICAgKi9cbiAgYXN5bmMgaHVuZ3VwKCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsICdbUkNDYWxsU3RhdGVNYWNoaW5lXSBodW5ndXAnKTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDpu5jorqTmjILmlq0gcmVhc29uIOS4uumAmuivnei/h+eoi+S4re+8jOW3seaWueato+W4uOWPlua2iOmAmuivnVxuICAgIGxldCByZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uSEFOR1VQO1xuICAgIC8qKlxuICAgICAqIOiLpei2heaXtuiuoeaXtuWZqOWtmOWcqCwg5bex5pa55Li6IGNhbGxlciDljp/lm6DkuLrlt7Hmlrnlj5bmtojpgJror50sXG4gICAgICog5bex5pa55Li6IGNhbGxlZSDkuJTmnKrov5vlhaXpgJror53kuK3vvIzljp/lm6DkuLrlt7Hmlrnmi5Lnu53pgJror51cbiAgICAgKi9cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fdXNlclRpbWVycykubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdLmlzQ2FsbGVyKSB7XG4gICAgICAgIHJlYXNvbiA9IFJDQ2FsbEVuZFJlYXNvbi5DQU5DRUw7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3VzZXJJbmZvW2N1cnJlbnRVc2VySWRdLnN0YXRlID09PSBSQ0NhbGxVc2VyU3RhdGUuV0FJVElORykge1xuICAgICAgICByZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uUkVKRUNUO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOa4hemZpOaJgOaciei2heaXtuiuoeaXtuWZqFxuICAgIGZvciAoY29uc3QgdXNlcklkIGluIHRoaXMuX3VzZXJUaW1lcnMpIHtcbiAgICAgIHRoaXMuX2NsZWFyVGltZXJCeUlkKHVzZXJJZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9odW5ndXBIYW5kbGUocmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDkv67mlLnpgJror53lqpLkvZPnsbvlnotcbiAgICogQHBhcmFtIG1lZGlhVHlwZSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8g5pS55Li66Z+z6aKR6YCa6K+dIHwgUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPIOaUueS4uumfs+inhumikemAmuivnVxuICAgKi9cbiAgYXN5bmMgY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxTdGF0ZU1hY2hpbmVdIGNoYW5nZU1lZGlhVHlwZSAtPiBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfWApO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbE1zZ0hhbmRsZXIuc2VuZE1lZGlhTW9kaWZ5KHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZTogdGhpcy5fY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgdXNlcklkczogdGhpcy5nZXRSZW1vdGVVc2VySWRzKCksXG4gICAgfSk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnlKjmiLfliqDlhaXpgJror53ooaXlgb/mnLrliLbvvIhydGMgdXNlckpvaW4g5LqL5Lu26Kem5Y+R77yJXG4gICAqIOS4u+WPq+WRvOWPq+WQju+8jOacquaUtuWIsOiiq+WPqyBhY2NlcHQg5raI5oGv77yM5L2G5pS25Yiw5LqGIHVzZXJKb2luIOWQjOagt+ihpeWBv+abtOaWsOeUqOaIt+OAgeaIv+mXtOeKtuaAgeOAgeWRvOWPq+iuoeaXtuWZqFxuICAgKi9cbiAgdXNlckpvaW4odXNlcklkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbFN0YXRlTWFjaGluZV0gdXNlckpvaW4gLT4gdXNlcklkczogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gKTtcbiAgICAvLyDlu7bov58gMzAwbXMg6Ziy5q2iIHVzZXJKaW9uIOWSjCBhY2NlcHQg5raI5oGv6YO95pyJ55qE5oOF5Ya15LiL77yMIHVzZXJKb2luIOavlCBhY2NlcHQg5YWI5YiwXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgICBjb25zdCB1c2VySW5mbyA9IHRoaXMuX3VzZXJJbmZvW3VzZXJJZF07XG4gICAgICAgIC8vIOabtOaWsOS6uuWRmOeKtuaAgSAoLy8g576k57uE6YCa6K+d5pe277yaIEHlkJFC44CBQ+WPkei1t+mAmuivnSBC5YWI5o6l5ZCs77yMQ+WQjuaOpeWQrO+8jOi/meaXtkLmsqHmnIlD55qEdXNlcklk5a+55bqU55qEX3VzZXJJbmZv77yM5omA5Lul6L+Z6YeM5Yik5pat5LiA5LiLKVxuICAgICAgICBpZiAodXNlckluZm8gJiYgdXNlckluZm8uc3RhdGUgIT09IFJDQ2FsbFVzZXJTdGF0ZS5LRUVQSU5HKSB7XG4gICAgICAgICAgdXNlckluZm8uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuS0VFUElORztcbiAgICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodXNlckluZm8pO1xuICAgICAgICB9XG4gICAgICAgIC8vIOabtOaWsOaIv+mXtOeKtuaAgVxuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvblN0YXRlICE9PSBSQ0NhbGxTZXNzaW9uU3RhdGUuS0VFUElORykge1xuICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5LRUVQSU5HKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDlgZzmraLlubbmuIXpmaTlkbzlj6vorqHml7blmahcbiAgICAgICAgdGhpcy5fY2xlYXJUaW1lckJ5SWQodXNlcklkKTtcbiAgICAgIH0pO1xuICAgIH0sIDMwMCk7XG4gIH1cblxuICAvKipcbiAgICog55So5oi356a75byA6YCa6K+d6KGl5YG/5py65Yi277yIcnRjIHVzZXJMZWF2ZeOAgWtpY2tPZmYg5LqL5Lu26Kem5Y+R77yJXG4gICAqIOmAmuivneS4rei/nOerr+eUqOaIt+aMguaWre+8jOaMguaWrea2iOaBr+acquWIsO+8jOS9huaYr+ebkeWQrOWIsCBydGMgdXNlckxlYXZlIOWQjOagt+ihpeWBv+abtOaWsOeUqOaIt+OAgeaIv+mXtOeKtuaAgVxuICAgKi9cbiAgdXNlckxlYXZlKHVzZXJJZHM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxTdGF0ZU1hY2hpbmVdIHVzZXJMZWF2ZSAtPiB1c2VySWRzOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWApO1xuICAgIC8vIOW7tui/nyAzMDBtcyDpmLLmraIgdXNlckxlYXZlIOWSjCBodW5ndXAg5raI5oGv6YO95pyJ55qE5oOF5Ya15LiL77yMdXNlckxlYXZlIOavlCBodW5ndXAg5YWI5YiwXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgICBjb25zdCB1c2VySW5mbyA9IHRoaXMuX3VzZXJJbmZvW3VzZXJJZF07XG4gICAgICAgIC8vIOabtOaWsOS6uuWRmOeKtuaAgVxuICAgICAgICBpZiAodXNlckluZm8gJiYgdXNlckluZm8uc3RhdGUgIT09IFJDQ2FsbFVzZXJTdGF0ZS5OT05FKSB7XG4gICAgICAgICAgdXNlckluZm8uc3RhdGUgPSBSQ0NhbGxVc2VyU3RhdGUuTk9ORTtcbiAgICAgICAgICB0aGlzLl9ub3RpZnlVc2VyU3RhdGVDaGFuZ2UodXNlckluZm8sIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfSEFOR1VQKTtcbiAgICAgICAgICB0aGlzLl93YXRjaGVycy5vbkh1bmd1cCh1c2VySW5mbywgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9IQU5HVVApO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VySW5mb1t1c2VySWRdO1xuICAgICAgICB9XG4gICAgICAgIC8vIOS4u+WPq+aWuee+pOiBiumCgOivt+iiq+WPq+aWueWQjuemu+e6v++8jOS4u+WPq+aWueatpOaXtuS4uuetieW+heeKtuaAgeWQjuS4jeWGjeS4iue6v++8jOiiq+WPq+aWueaOpeWQrOWQjuaMguaWreiHs+WJqeS9meS4gOS6uuaXtuetieW+heS4gOWIhumSn+WQjuaMguaWrVxuICAgICAgICBjb25zdCByZW1vdGVVc2Vyc1RpbWVyID0gbmV3IFRpbWVyKCgpID0+IHtcbiAgICAgICAgICBjb25zdCByZW1vdGVVc2VycyA9IHRoaXMuZ2V0UmVtb3RlVXNlcnMoKTtcbiAgICAgICAgICAvLyDov5znq6/lj6rmnInkuIDkuKrnlKjmiLfkuJTmmK/nrYnlvoXnirbmgIHvvIznrYnlvoXkuIDliIbpkp/lkI7mjILmlq1cbiAgICAgICAgICBpZiAocmVtb3RlVXNlcnMubGVuZ3RoID09PSAxICYmIHJlbW90ZVVzZXJzWzBdLnN0YXRlID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLl9odW5ndXBIYW5kbGUoUkNDYWxsRW5kUmVhc29uLlJFTU9URV9ORVRXT1JLX0VSUk9SKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDYwMDAwKTtcbiAgICAgICAgLy8g5pu05paw5oi/6Ze054q25oCBXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbykubGVuZ3RoIDwgMiAmJiB0aGlzLl9zZXNzaW9uU3RhdGUgIT09IFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQpIHtcbiAgICAgICAgICB0aGlzLl9lbmRUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlKFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQsIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfSEFOR1VQKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgMzAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIOWxguW3seaWueW8guW4uOWksei0peWQjuiwg+eUqOeahOaWueazlVxuICAgKiDop6blj5Hml7bmnLrvvJrpn7Pop4bpopHmnI3liqHlvILluLjjgIHojrflj5botYTmupDlpLHotKXjgIHliqDlhaUgUlRDIOaIv+mXtOWksei0peOAgeWPkeW4g3zorqLpmIXlpLHotKVcbiAgICovXG4gIGNsb3NlKHJlYXNvbjogUkNDYWxsRW5kUmVhc29uKSB7XG4gICAgdGhpcy5faHVuZ3VwSGFuZGxlKHJlYXNvbik7XG4gIH1cblxuICBzZXRIdW5ndXBQdXNoQ29uZmlnKHB1c2hDb25maWc6IElQdXNoQ29uZmlnKSB7XG4gICAgdGhpcy5faHVuZ3VwUHVzaENvbmZpZyA9IHB1c2hDb25maWc7XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5ZSv5LiA5qCH6K+GXG4gICAqL1xuICBnZXRDYWxsSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIOWkmue7hOe7hyBJRFxuICAgKi9cbiAgZ2V0Q2hhbm5lbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5uZWxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDnm67moIcgSUTvvIzljZXlkbzlr7nmlrnkurrlkZggSWQsIOe+pOWRvOe+pOe7hCBJZFxuICAgKi9cbiAgZ2V0VGFyZ2V0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFyZ2V0SWQ7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Lya6K+d57G75Z6LXG4gICAqL1xuICBnZXRDb252ZXJzYXRpb25UeXBlKCk6IENvbnZlcnNhdGlvblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9jb252ZXJzYXRpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlui/nOerr+aIkOWRmCBJRCDliJfooahcbiAgICovXG4gIGdldFJlbW90ZVVzZXJJZHMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGFsbFVzZXJJZHMgPSBPYmplY3Qua2V5cyh0aGlzLl91c2VySW5mbyk7XG4gICAgY29uc3QgcmVtb3RlVXNlcklkcyA9IGFsbFVzZXJJZHMuZmlsdGVyKChpZCkgPT4gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSAhPT0gaWQpO1xuICAgIHJldHVybiByZW1vdGVVc2VySWRzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlui/nOerr+aIkOWRmOS/oeaBr+WIl+ihqFxuICAgKi9cbiAgZ2V0UmVtb3RlVXNlcnMoKTogSVVzZXJEYXRhW10ge1xuICAgIGNvbnN0IHJlbW90ZVVzZXI6IElVc2VyRGF0YVtdID0gW107XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgZm9yIChjb25zdCB1aWQgaW4gdGhpcy5fdXNlckluZm8pIHtcbiAgICAgIGNvbnN0IHsgdXNlcklkIH0gPSB0aGlzLl91c2VySW5mb1t1aWRdO1xuICAgICAgaWYgKHVzZXJJZCAhPT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICByZW1vdGVVc2VyLnB1c2godGhpcy5fdXNlckluZm9bdWlkXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZW1vdGVVc2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluaIv+mXtOeKtuaAgVxuICAgKi9cbiAgZ2V0U3RhdGUoKTogUkNDYWxsU2Vzc2lvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvblN0YXRlID09PSBudWxsID8gUkNDYWxsU2Vzc2lvblN0YXRlLkVORCA6IHRoaXMuX3Nlc3Npb25TdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bkurrlkZjnirbmgIFcbiAgICovXG4gIGdldFVzZXJTdGF0ZSh1c2VySWQ6IHN0cmluZyk6IFJDQ2FsbFVzZXJTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJJbmZvW3VzZXJJZF0/LnN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluS8muivneWPkei1t+iAhSBJZFxuICAgKi9cbiAgZ2V0Q2FsbGVySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbGVySWQhO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+asoeS8muivnemCgOivt+iAhSBJZFxuICAgKi9cbiAgZ2V0SW52aXRlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ludml0ZXJJZCE7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5b2T5YmN6YCa6K+d5aqS5L2T57G75Z6LXG4gICAqL1xuICBnZXRNZWRpYVR5cGUoKTogUkNDYWxsTWVkaWFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fbWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneaMguaWreWQjuWPr+iwg+eUqFxuICAgKi9cbiAgZ2V0U3VtbWFyeSgpOiBJRW5kU3VtbWFyeSB7XG4gICAgLy8g6YCa6K+d5pe26Ze06K6h566XXG4gICAgY29uc3QgYmVnaW5UaW1lc3RhbXAgPSB0aGlzLl9iZWdpblRpbWVzdGFtcDtcbiAgICBjb25zdCBlbmRUaW1lc3RhbXAgPSB0aGlzLl9lbmRUaW1lc3RhbXA7XG4gICAgbGV0IGR1cmF0aW9uID0gMDtcbiAgICBpZiAoZW5kVGltZXN0YW1wID4gYmVnaW5UaW1lc3RhbXAgJiYgYmVnaW5UaW1lc3RhbXAgIT09IDApIHtcbiAgICAgIGR1cmF0aW9uID0gZW5kVGltZXN0YW1wIC0gYmVnaW5UaW1lc3RhbXA7XG4gICAgfVxuXG4gICAgY29uc3Qgc3VtbWFyeSA9IHtcbiAgICAgIGNvbnZlcnNhdGlvblR5cGU6IHRoaXMuX2NvbnZlcnNhdGlvblR5cGUsXG4gICAgICBjaGFubmVsSWQ6IHRoaXMuX2NoYW5uZWxJZCxcbiAgICAgIHRhcmdldElkOiB0aGlzLl90YXJnZXRJZCxcbiAgICAgIG1lZGlhVHlwZTogdGhpcy5fbWVkaWFUeXBlLFxuICAgICAgYmVnaW5UaW1lc3RhbXAsXG4gICAgICBlbmRUaW1lc3RhbXAsXG4gICAgICBkdXJhdGlvbixcbiAgICAgIGVuZFJlYXNvbjogdGhpcy5fZW5kUmVhc29uISxcbiAgICB9O1xuXG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxTdGF0ZU1hY2hpbmVdIGdldFN1bW1hcnkgLT4gc3VtbWFyeTogJHtKU09OLnN0cmluZ2lmeShzdW1tYXJ5KX1gKTtcbiAgICByZXR1cm4gc3VtbWFyeTtcbiAgfVxufVxuIiwiLyoqXG4gKiDpgJror53lqpLkvZPnsbvlnotcbiAqL1xuZXhwb3J0IGVudW0gUkNDYWxsTWVkaWFUeXBlIHtcbiAgLyoqXG4gICAqIOmfs+mikemAmuivnVxuICAgKi9cbiAgQVVESU8gPSAxLFxuICAvKipcbiAgICog6KeG6aKR6YCa6K+dXG4gICAqL1xuICBBVURJT19WSURFT1xufVxuIiwiZXhwb3J0IGVudW0gTWVtYmVyTW9kaWZ5VHlwZSB7XG4gIEFERCA9IDEsXG4gIFJFTU9WRVxufVxuIiwiLyoqXG4gKiDlubPlj7BcbiAqL1xuZXhwb3J0IGVudW0gUGxhdGZvcm0ge1xuICBXRUIgPSAnV2ViJyxcbiAgSU9TID0gJ2lPUycsXG4gIEFORFJPSUQgPSAnQW5kcm9pZCdcbn1cbiIsImltcG9ydCB7XG4gIENvbnZlcnNhdGlvblR5cGUsIElMb2dnZXIsIElSZWNlaXZlZE1lc3NhZ2UsIFJUQ1BsdWdpbkNvbnRleHQsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IENhbGxSZW1vdGVFbmRSZWFzb24sIFJDQ2FsbEVuZFJlYXNvbiB9IGZyb20gJy4vZW51bXMvUkNDYWxsRW5kUmVhc29uJztcbmltcG9ydCB7IFJDQ2FsbE1lZGlhVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsTWVkaWFUeXBlJztcbmltcG9ydCB7IFJDQ2FsbE1lc3NhZ2VUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxNZXNzYWdlVHlwZSc7XG5pbXBvcnQgeyBJSHVuZ3VwTXNnQ29udGVudCwgSUludml0ZU1zZ0NvbnRlbnQsIElNZWRpYU1vZGlmeU1zZ0NvbnRlbnQgfSBmcm9tICcuL2ludGVyZmFjZXMvSU1lc3NhZ2VIYW5kbGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBJT2ZmbGluZVJlY29yZCB7XG4gIGNoYW5uZWxJZDogc3RyaW5nLFxuICBjb252ZXJzYXRpb25UeXBlOiBDb252ZXJzYXRpb25UeXBlLFxuICB0YXJnZXRJZDogc3RyaW5nLFxuICBtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSxcbiAgY2FsbElkOiBzdHJpbmcsXG4gIGludml0ZXJJZDogc3RyaW5nLFxuICBlbmRSZWFzb246IFJDQ2FsbEVuZFJlYXNvbixcbiAgYmVnaW5UaW1lc3RhbXA6IG51bWJlcixcbiAgZW5kVGltZXN0YW1wOiBudW1iZXIsXG4gIGR1cmF0aW9uOiBudW1iZXJcbn1cblxuLyoqXG4gKiDnprvnur/pgJror53orrDlvZXlmahcbiAqL1xuZXhwb3J0IGNsYXNzIE9mZmxpbmVSZWNvcmRlciB7XG4gIHByaXZhdGUgX21lc3NhZ2VzOiBJUmVjZWl2ZWRNZXNzYWdlW10gfCBbXSA9IFtdXG5cbiAgcHJpdmF0ZSBfY2hhbm5lbElkITogc3RyaW5nXG5cbiAgcHJpdmF0ZSBfY29udmVyc2F0aW9uVHlwZSE6IENvbnZlcnNhdGlvblR5cGVcblxuICBwcml2YXRlIF90YXJnZXRJZCE6IHN0cmluZ1xuXG4gIHByaXZhdGUgX21lZGlhVHlwZSE6IFJDQ2FsbE1lZGlhVHlwZVxuXG4gIHByaXZhdGUgX2NhbGxJZCE6IHN0cmluZ1xuXG4gIHByaXZhdGUgX2NhbGxlcklkITogc3RyaW5nXG5cbiAgcHJpdmF0ZSBfaW52aXRlcklkITogc3RyaW5nXG5cbiAgcHJpdmF0ZSBfZW5kUmVhc29uITogUkNDYWxsRW5kUmVhc29uXG5cbiAgcHJpdmF0ZSBfYmVnaW5UaW1lc3RhbXA6IG51bWJlciA9IDBcblxuICBwcml2YXRlIF9lbmRUaW1lc3RhbXA6IG51bWJlciA9IDBcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vblJlY29yZDogKHJlY29yZDogSU9mZmxpbmVSZWNvcmQpID0+IHZvaWQsXG4gICkge1xuXG4gIH1cblxuICAvKipcbiAgICog5YiwIGludml0ZSB8IG1lbWJlck1vZGlmeSDnu5PmnZ9cbiAgICog5Y6f5Zug5qC55o2u5bex5pa55piv5ZCm5Li65Li75Y+r77yM5Li75Y+r5Li66L+c56uv5pyq5o6l5ZCsIOiiq+WPq+iiq+W3seerr+acquaOpeWQrFxuICAgKi9cbiAgcHJpdmF0ZSBfZG9JbnZpdGUobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIHNlbmRlclVzZXJJZCwgY29udGVudCxcbiAgICB9ID0gbWVzc2FnZTtcbiAgICBjb25zdCB7IGNhbGxJZCwgbWVkaWFUeXBlIH0gPSBjb250ZW50IGFzIElJbnZpdGVNc2dDb250ZW50O1xuICAgIHRoaXMuX2NoYW5uZWxJZCA9IGNoYW5uZWxJZCE7XG4gICAgdGhpcy5fY29udmVyc2F0aW9uVHlwZSA9IGNvbnZlcnNhdGlvblR5cGU7XG4gICAgdGhpcy5fdGFyZ2V0SWQgPSB0YXJnZXRJZDtcbiAgICB0aGlzLl9jYWxsSWQgPSBjYWxsSWQ7XG4gICAgdGhpcy5fbWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICAgIGNvbnN0IGlzQ2FsbGVyID0gc2VuZGVyVXNlcklkID09PSBjdXJyZW50VXNlcklkO1xuICAgIHRoaXMuX2ludml0ZXJJZCA9IHNlbmRlclVzZXJJZDtcbiAgICB0aGlzLl9lbmRSZWFzb24gPSBpc0NhbGxlciA/IFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfTk9fUkVTUE9OU0UgOiBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX05PX1JFU1BPTlNFO1xuICAgIHRoaXMuX2NhbkdlblJlY29yZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIsCBpbnZpdGUgfCBtZW1iZXJNb2RpZnkg57uT5p2fXG4gICAqIOWOn+WboOagueaNruW3seaWueaYr+WQpuS4uuS4u+WPq++8jOS4u+WPq+S4uui/nOerr+acquaOpeWQrCDooqvlj6vooqvlt7Hnq6/mnKrmjqXlkKxcbiAgICovXG4gIHByaXZhdGUgX2RvTWVtYmVyTW9kaWZ5KG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICB0aGlzLl9kb0ludml0ZShtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnlKggaW52aXRlIHwgbWVtYmVyTW9kaWZ5IOiuoeeul+eahOemu+e6v+iusOW9lVxuICAgKi9cbiAgcHJpdmF0ZSBfZG9SaW5naW5nKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICB0aGlzLl9jYW5HZW5SZWNvcmQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliLAgYWNjZXB0IOivtOaYjumAmuivneW3suW7uueri1xuICAgKiDljp/lm6Dpu5jorqTlt7HmlrnmraPluLjmjILmlq1cbiAgICovXG4gIHByaXZhdGUgX2RvQWNjZXB0KG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICB0aGlzLl9lbmRSZWFzb24gPSBSQ0NhbGxFbmRSZWFzb24uSEFOR1VQO1xuICAgIHRoaXMuX2JlZ2luVGltZXN0YW1wID0gbWVzc2FnZS5zZW50VGltZTtcbiAgICB0aGlzLl9jYW5HZW5SZWNvcmQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliLAgaHVuZ3VwIOivtOaYjuS4uuato+W4uOaMguaWrVxuICAgKiDljp/lm6Dlj5bmtojmga/kvZPph4zmjILmlq3ljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX2RvSHVuZ3VwKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IGNvbnRlbnQsIHNlbnRUaW1lLCBzZW5kZXJVc2VySWQgfSA9IG1lc3NhZ2U7XG4gICAgY29uc3QgeyByZWFzb24gfSA9IGNvbnRlbnQgYXMgSUh1bmd1cE1zZ0NvbnRlbnQ7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgaXNTZWxmU2VuZCA9IHNlbmRlclVzZXJJZCA9PT0gY3VycmVudFVzZXJJZDtcbiAgICB0aGlzLl9lbmRSZWFzb24gPSBpc1NlbGZTZW5kID8gcmVhc29uIDogQ2FsbFJlbW90ZUVuZFJlYXNvbltyZWFzb25dO1xuICAgIHRoaXMuX2VuZFRpbWVzdGFtcCA9IHNlbnRUaW1lO1xuXG4gICAgdGhpcy5fY2FuR2VuUmVjb3JkKCk7XG4gIH1cblxuICAvKipcbiAgICog5Y+q5L+u5pS56YCa6K+d57G75Z6LXG4gICAqL1xuICBwcml2YXRlIF9kb01lZGlhTW9kaWZ5KG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IGNvbnRlbnQgfSA9IG1lc3NhZ2U7XG4gICAgY29uc3QgeyBtZWRpYVR5cGUgfSA9IGNvbnRlbnQgYXMgSU1lZGlhTW9kaWZ5TXNnQ29udGVudDtcbiAgICB0aGlzLl9tZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgdGhpcy5fY2FuR2VuUmVjb3JkKCk7XG4gIH1cblxuICBwcml2YXRlIF9jYW5HZW5SZWNvcmQoKSB7XG4gICAgaWYgKHRoaXMuX21lc3NhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbGV0IGR1cmF0aW9uID0gMDtcbiAgICAgIGNvbnN0IGlzTmVlZER1cmF0aW9uUmVhc29uID0gW1xuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uSEFOR1VQLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0hBTkdVUCxcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLk9USEVSX0NMSUVOVF9KT0lORURfQ0FMTCxcbiAgICAgICAgUkNDYWxsRW5kUmVhc29uLlJFTU9URV9PVEhFUl9DTElFTlRfSk9JTkVEX0NBTEwsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5LSUNLRURfQllfU0VSVkVSLFxuICAgICAgICBSQ0NhbGxFbmRSZWFzb24uUkVNT1RFX0tJQ0tFRF9CWV9TRVJWRVIsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5BQ0NFUFRfU1lTVEVNX0NBTEwsXG4gICAgICAgIFJDQ2FsbEVuZFJlYXNvbi5SRU1PVEVfQUNDRVBUX1NZU1RFTV9DQUxMLFxuICAgICAgXS5pbmNsdWRlcyh0aGlzLl9lbmRSZWFzb24pO1xuICAgICAgaWYgKGlzTmVlZER1cmF0aW9uUmVhc29uKSB7XG4gICAgICAgIGR1cmF0aW9uID0gdGhpcy5fZW5kVGltZXN0YW1wIC0gdGhpcy5fYmVnaW5UaW1lc3RhbXA7XG4gICAgICB9XG4gICAgICB0aGlzLl9vblJlY29yZCh7XG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5fY2hhbm5lbElkLFxuICAgICAgICBjb252ZXJzYXRpb25UeXBlOiB0aGlzLl9jb252ZXJzYXRpb25UeXBlLFxuICAgICAgICB0YXJnZXRJZDogdGhpcy5fdGFyZ2V0SWQsXG4gICAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgICBpbnZpdGVySWQ6IHRoaXMuX2ludml0ZXJJZCxcbiAgICAgICAgbWVkaWFUeXBlOiB0aGlzLl9tZWRpYVR5cGUsXG4gICAgICAgIGVuZFJlYXNvbjogdGhpcy5fZW5kUmVhc29uLFxuICAgICAgICBiZWdpblRpbWVzdGFtcDogdGhpcy5fYmVnaW5UaW1lc3RhbXAsXG4gICAgICAgIGVuZFRpbWVzdGFtcDogdGhpcy5fZW5kVGltZXN0YW1wLFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uUmVjdk9mZmxpbmVNc2dzKG1lc3NhZ2VzOiBJUmVjZWl2ZWRNZXNzYWdlW10pIHtcbiAgICB0aGlzLl9tZXNzYWdlcyA9IG1lc3NhZ2VzO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IG1zZyA9IHRoaXMuX21lc3NhZ2VzLnNoaWZ0KCkhO1xuICAgICAgY29uc3QgeyBtZXNzYWdlVHlwZSwgY29udGVudDogeyBjYWxsSWQgfSB9ID0gbXNnO1xuICAgICAgc3dpdGNoIChtZXNzYWdlVHlwZSkge1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlOlxuICAgICAgICAgIHRoaXMuX2RvSW52aXRlKG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNSaW5naW5nOlxuICAgICAgICAgIHRoaXMuX2RvUmluZ2luZyhtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDQWNjZXB0OlxuICAgICAgICAgIHRoaXMuX2RvQWNjZXB0KG1zZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW06XG4gICAgICAgICAgdGhpcy5fZG9NZW1iZXJNb2RpZnkobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lZGlhOlxuICAgICAgICAgIHRoaXMuX2RvTWVkaWFNb2RpZnkobXNnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0hhbmd1cDpcbiAgICAgICAgICB0aGlzLl9kb0h1bmd1cChtc2cpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbT2ZmbGluZVJlY29yZGVyXSBvblJlY3ZPZmZsaW5lTXNncyAtPiB1bmV4cGVjdGVkIG1lc3NhZ2U6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IHdoaWxlICh0aGlzLl9tZXNzYWdlcy5sZW5ndGggPiAwKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ29udmVyc2F0aW9uVHlwZSwgRXJyb3JDb2RlLCBFdmVudEVtaXR0ZXIsIElMb2dnZXIsIElQdXNoQ29uZmlnIGFzIElFbmdpbmVQdXNoQ29uZmlnLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgSVNlbmRNc2dPcHRpb25zLCBSVENQbHVnaW5Db250ZXh0LFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBNZW1iZXJNb2RpZnlUeXBlIH0gZnJvbSAnLi9lbnVtcy9NZW1iZXJNb2RpZnlUeXBlJztcbmltcG9ydCB7IFJDQ2FsbEVycm9yQ29kZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsQ29kZSc7XG5pbXBvcnQgeyBSQ0NhbGxNZXNzYWdlVHlwZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsTWVzc2FnZVR5cGUnO1xuaW1wb3J0IHsgSVVzZXJQcm9maWxlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lTdGF0ZU1hY2hpbmUnO1xuaW1wb3J0IHtcbiAgSUFjY2VwdE1zZ0NvbnRlbnQsIElBY2NlcHRNc2dPcHRpb25zLCBJQ2FsbE1zZ09wdGlvbiwgSUh1bmd1cE1zZ0NvbnRlbnQsIElIdW5ndXBNc2dPcHRpb25zLFxuICBJSW52aXRlTXNnQ29udGVudCwgSUludml0ZU1zZ09wdGlvbnMsIElNZWRpYU1vZGlmeU1zZ0NvbnRlbnQsIElNZWRpYU1vZGlmeU1zZ09wdGlvbnMsIElNZW1iZXJNb2RpZnlNc2dDb250ZW50LFxuICBJTWVtYmVyTW9kaWZ5TXNnT3B0aW9ucywgSU1zZ0xpc3RlbmVyLCBJUmluZ2luZ01zZ0NvbnRlbnQsIElSaW5naW5nTXNnT3B0aW9ucyxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lNZXNzYWdlSGFuZGxlcic7XG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJy4vZW51bXMvUGxhdGZvcm0nO1xuaW1wb3J0IHsgZ2V0Q2FsbERldmljZUlkIH0gZnJvbSAnLi4vaGVscGVyJztcbmltcG9ydCB7IElPZmZsaW5lUmVjb3JkLCBPZmZsaW5lUmVjb3JkZXIgfSBmcm9tICcuL09mZmxpbmVSZWNvcmRlcic7XG5pbXBvcnQgeyBSQ0NhbGxTdGF0ZU1hY2hpbmUgfSBmcm9tICcuLic7XG5cbmNvbnN0IGNhbGxNc2dUeXBlcyA9IFsnUkM6VkNBY2NlcHQnLCAnUkM6VkNSaW5naW5nJywgJ1JDOlZDU3VtbWFyeScsICdSQzpWQ0hhbmd1cCcsICdSQzpWQ0ludml0ZScsICdSQzpWQ01vZGlmeU1lZGlhJywgJ1JDOlZDTW9kaWZ5TWVtJ107XG5cbnR5cGUgTXNnTGlzdGVuZXJLZXlzID0ga2V5b2YgSU1zZ0xpc3RlbmVyXG5cbmludGVyZmFjZSBJTXNnQnVmZmVySXRlbSB7XG4gIG1hcmtUaW1lOiBudW1iZXIsXG4gIG1zZzogSVJlY2VpdmVkTWVzc2FnZVxufVxuXG5jb25zdCBFbmdpbmVFcnJvckNvZGVUb0NhbGxFcnJvckNvZGU6IHsgW2tleTogbnVtYmVyXTogUkNDYWxsRXJyb3JDb2RlIH0gPSB7XG4gIFtFcnJvckNvZGUuUkVKRUNURURfQllfQkxBQ0tMSVNUXTogUkNDYWxsRXJyb3JDb2RlLlJFSkVDVEVEX0JZX0JMQUNLTElTVCxcbiAgW0Vycm9yQ29kZS5OT1RfSU5fR1JPVVBdOiBSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX0dST1VQLFxufTtcblxuLyoqXG4gKiDmtojmga/mjqXmlLblpITnkIY6IOWcqOe6v+a2iOaBr+OAgeemu+e6v+a2iOaBr1xuICog5Y+R6YCB5raI5oGv5aSE55CGOiDlj5HpgIHkuI3lkIznsbvlnovmtojmga/lsIHoo4VcbiAqL1xuZXhwb3J0IGNsYXNzIENhbGxNZXNzYWdlSGFuZGxlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHByaXZhdGUgX3dhdGNoZXJzOiBJTXNnTGlzdGVuZXIgPSB7fVxuXG4gIHByaXZhdGUgX3VzZXJJbmZvOiBJVXNlclByb2ZpbGUgPSB7fVxuXG4gIHByaXZhdGUgX21zZ0J1ZmZlckxpc3Q6IElNc2dCdWZmZXJJdGVtW10gPSBbXVxuXG4gIHByaXZhdGUgX2hhZEhhbmRsZU1zZ1RpbWVyOiBib29sZWFuID0gZmFsc2VcblxuICBwcml2YXRlIF9vZmZsaW5lUmVjb3JkZXIhOiBPZmZsaW5lUmVjb3JkZXJcblxuICBwcml2YXRlIF9kZXZpY2VJZDogc3RyaW5nID0gJydcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogSUxvZ2dlcixcbiAgICAvKipcbiAgICAgKiDnprvnur/mtojmga/lpITnkIbml7bpl7Tpl7TpmpRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vZmZsaW5lTXNnSXR2OiBudW1iZXIgPSA2MCAqIDEwMDAsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZ2V0U3RhdGVNYWNoaW5lOiAoY2FsbElkOiBzdHJpbmcpID0+IFJDQ2FsbFN0YXRlTWFjaGluZSB8IG51bGwsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgLy8gZGV2aWNlSWRcbiAgICB0aGlzLl9kZXZpY2VJZCA9IGdldENhbGxEZXZpY2VJZChfcnVudGltZSk7XG4gICAgLy8g5aSE55CG5raI5oGv5pS25Y+RXG4gICAgdGhpcy5fY29udGV4dC5vbm1lc3NhZ2UgPSB0aGlzLl9vbk1lc3NhZ2UuYmluZCh0aGlzKTtcbiAgICAvLyDlpITnkIbnprvnur/mtojmga/orrDlvZVcbiAgICB0aGlzLl9vZmZsaW5lUmVjb3JkZXIgPSBuZXcgT2ZmbGluZVJlY29yZGVyKHRoaXMuX2NvbnRleHQsIHRoaXMuX2xvZ2dlciwgKHJlY29yZDogSU9mZmxpbmVSZWNvcmQpID0+IHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtDYWxsTWVzc2FnZUhhbmRsZXJdIG9mZmxpbmVSZWNvcmRlciAtPiAke0pTT04uc3RyaW5naWZ5KHJlY29yZCl9YCk7XG4gICAgICB0aGlzLl93YXRjaGVycy5vbk9mZmxpbmVSZWNvcmQgJiYgdGhpcy5fd2F0Y2hlcnMub25PZmZsaW5lUmVjb3JkKHJlY29yZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vbk1lc3NhZ2UobWVzc2FnZTogSVJlY2VpdmVkTWVzc2FnZSkge1xuICAgIGNvbnN0IGlzQ2FsbE1zZyA9IGNhbGxNc2dUeXBlcy5pbmNsdWRlcyhtZXNzYWdlLm1lc3NhZ2VUeXBlKTtcbiAgICBpZiAoaXNDYWxsTXNnKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gX29uTWVzc2FnZSAtPiBjYWxsIG1lc3NhZ2U6ICR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSl9YCk7XG4gICAgICAvLyDpgJrov4fpgY3ljoYgYnVmZmVyTGlzdCDmn6Xmib7opoHmj5LlhaXnmoToioLngrlcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hcmtUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgeyBzZW50VGltZTogY3VycmVudE1zZ1NlbnRUaW1lIH0gPSBtZXNzYWdlO1xuICAgICAgICBsZXQgaW5zZXJ0SW5kZXggPSAwO1xuICAgICAgICAvLyDpnIDpgY3ljobmlbDnu4Tlhajpg6jpobnvvIzmlYXkvb/nlKggZm9yRWFjaCwgZmluZEluZGV4IOaJvuWIsOesrOS4gOS4quespuWQiOadoeS7tueahOWwseS8mue7iOatolxuICAgICAgICB0aGlzLl9tc2dCdWZmZXJMaXN0LmZvckVhY2goKHsgbXNnOiB7IHNlbnRUaW1lIH0gfSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoY3VycmVudE1zZ1NlbnRUaW1lID49IHNlbnRUaW1lKSB7XG4gICAgICAgICAgICAvLyBpbnNlcnRJbmRleCDpnIDkuLrlvZPliY3nrKblkIjmnaHku7blhYPntKDnmoTlkI7kuIDkvY3vvIzmlYUgKzFcbiAgICAgICAgICAgIGluc2VydEluZGV4ID0gaW5kZXggKyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3Quc3BsaWNlKGluc2VydEluZGV4LCAwLCB7XG4gICAgICAgICAgbWFya1RpbWUsXG4gICAgICAgICAgbXNnOiBtZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgb25NZXNzYWdlIC0+IG1zZ0J1ZmZlckxpc3Q6ICR7dGhpcy5fbXNnQnVmZmVyTGlzdC5sZW5ndGh9YCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gc3BsaWNlIGJ1ZmZlciBtc2cgZXJyb3IgLT4gJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICAvLyDlkK/liqjmtojmga/lpITnkIZcbiAgICAgIHRoaXMuX2hhbmRsZUJ1ZmZlck1zZ3MoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICog5Zyo57q/5raI5oGv5oqb57uZ54q25oCB5py65aSE55CGXG4gICAqL1xuICBwcml2YXRlIF9vblJlY3ZPbmxpbmVDYWxsTXNnKG1lc3NhZ2U6IElSZWNlaXZlZE1lc3NhZ2UpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBvbk1lc3NhZ2UgLT4gX29uUmVjdk9ubGluZUNhbGxNc2c6ICR7bWVzc2FnZS5tZXNzYWdlVHlwZX1gKTtcbiAgICBjb25zdCB7IGNvbnRlbnQ6IHsgY2FsbElkIH0gfSA9IG1lc3NhZ2U7XG4gICAgLy8g5Zyo57q/5raI5oGv55u05o6l5oqb5Ye6XG4gICAgc3dpdGNoIChtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSW52aXRlOlxuICAgICAgICB0aGlzLl93YXRjaGVycy5vbkludml0ZSAmJiB0aGlzLl93YXRjaGVycy5vbkludml0ZShtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDUmluZ2luZzpcbiAgICAgICAgc3VwZXIuZW1pdChgJHtjYWxsSWR9b25SaW5naW5nYCwgbWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0FjY2VwdDpcbiAgICAgICAgc3VwZXIuZW1pdChgJHtjYWxsSWR9b25BY2NlcHRgLCBtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtOlxuICAgICAgICAvLyDmlLbliLDkurrlkZjlj5jmm7Tmipvlh7ogb25JbnZpdGUg55Sf5oiQ54q25oCB5py65a6e5L6LXG4gICAgICAgIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlICYmIHRoaXMuX3dhdGNoZXJzLm9uSW52aXRlKG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZWRpYTpcbiAgICAgICAgc3VwZXIuZW1pdChgJHtjYWxsSWR9b25NZWRpYU1vZGlmeWAsIG1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsTWVzc2FnZVR5cGUuVkNIYW5ndXA6XG4gICAgICAgIHN1cGVyLmVtaXQoYCR7Y2FsbElkfW9uSHVuZ3VwYCwgbWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgW0NhbGxNZXNzYWdlSGFuZGxlcl0gb25SZWN2T25saW5lQ2FsbE1zZyAtPiB1bmV4cGVjdGVkIG1lc3NhZ2U6ICR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSl9YCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmtojmga8gYnVmZmVyIOWIl+ihqOWkhOeQhumAu+i+kVxuICAgKiAx44CB5q+PIDIwbXMg5qOA5p+l5LiA5qyhIGJ1ZmZlciBsaXN0XG4gICAqIDLjgIHlj5blh7rlt7Lnu4/lu7bov58gMjAwIOeahOa2iOaBr+WIl+ihqOi/m+ihjOa2iOi0uSB8IOaXoOW7tui/nyAyMDBtcyDlhoXmtojmga/nm7TmjqXpgJLlvZJcbiAgICogM+OAgea2iOi0ueWIhuS4uiDnprvnur/mtojmga/mtojotLnpgLvovpHjgIHlnKjnur/mtojmga/mtojotLnpgLvovpHvvIzmtojotLnlkI7pgJLlvZJcbiAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQnVmZmVyTXNncygpIHtcbiAgICAvLyDmtojmga8gYnVmZmVyIOWIl+ihqOmVv+W6puS4uiAwIOaXtuWKoOmUgVxuICAgIGlmICh0aGlzLl9tc2dCdWZmZXJMaXN0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLl9oYWRIYW5kbGVNc2dUaW1lcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCAnX2hhbmRsZUJ1ZmZlck1zZ3MgcmV0dXJuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOmcgOimgeWKoOmUge+8jOaUtuWIsOWkmuasoea2iOaBr+WQju+8jOWPr+iDveS8mui1t+WkmuS4qiB0aW1lclxuICAgIHRoaXMuX2hhZEhhbmRsZU1zZ1RpbWVyID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIOWPluWHuuWkp+S6jiAyMDAgbXMg5raI5oGv5YiX6KGoXG4gICAgICBjb25zdCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBidWZmZXJzID0gdGhpcy5fbXNnQnVmZmVyTGlzdC5maWx0ZXIoKGl0ZW0pID0+IGN1cnJlbnRUaW1lIC0gaXRlbS5tYXJrVGltZSA+PSAyMDApO1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtDYWxsTWVzc2FnZUhhbmRsZXJdIGhhbmRsZUJ1ZmZlck1zZ3MgLT4gbGlzdHMgb3ZlciAyMDBtcyA6ICR7SlNPTi5zdHJpbmdpZnkoYnVmZmVycy5tYXAoKHsgbXNnOiB7IG1lc3NhZ2VVSWQsIGlzT2ZmTGluZU1lc3NhZ2UsIGNvbnRlbnQ6IHsgY2FsbElkIH0gfSB9KSA9PiAoeyBtZXNzYWdlVUlkLCBpc09mZkxpbmVNZXNzYWdlLCBjYWxsSWQgfSkpKX1gKTtcbiAgICAgIGlmIChidWZmZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyDmsqHmnInlu7bov58gMjAwbXMg55qE5raI5oGv77yM5raI6LS56YC76L6R6Kej6ZSB5bm26YCS5b2S5omn6KGMXG4gICAgICAgIHRoaXMuX2hhZEhhbmRsZU1zZ1RpbWVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2hhbmRsZUJ1ZmZlck1zZ3MoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnVmZmVyc1swXS5tc2cuaXNPZmZMaW5lTWVzc2FnZSkge1xuICAgICAgICAvLyDlvZPnrKzkuIDmnaHmtojmga/kuLrnprvnur/mtojmga/ml7bvvIznm7TmjqXku44gYnVmZmVyIOS4reWPluWHuuaJgOacieemu+e6v+a2iOaBr++8jOi/m+ihjOa2iOaBr1xuICAgICAgICBsZXQgb2ZmbGluZUJ1ZmZlcnMgPSB0aGlzLl9tc2dCdWZmZXJMaXN0LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5tc2cuaXNPZmZMaW5lTWVzc2FnZSk7XG5cbiAgICAgICAgLy8g56a757q/5raI5oGv5aSE55CG6YC76L6RXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjb252ZXJzYXRpb25UeXBlLCBtZXNzYWdlVHlwZSwgc2VudFRpbWUsIHNlbmRlclVzZXJJZCwgY29udGVudDogeyBjYWxsSWQ6IGludml0ZUNhbGxJZCwgaW52aXRlVXNlcklkcyB9LFxuICAgICAgICAgIH0gPSBvZmZsaW5lQnVmZmVyc1swXS5tc2c7XG5cbiAgICAgICAgICBjb25zdCBpc0ludml0ZU1zZ1R5cGUgPSBbUkNDYWxsTWVzc2FnZVR5cGUuVkNJbnZpdGUsIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtXS5pbmNsdWRlcyhtZXNzYWdlVHlwZSBhcyBSQ0NhbGxNZXNzYWdlVHlwZSk7XG5cbiAgICAgICAgICAvLyDorqHnrpflvZPliY3ml7bpl7TkuI7mtojmga/lj5HpgIHml7bpl7Tlt65cbiAgICAgICAgICBjb25zdCBkZWxheVRpbWUgPSB0aGlzLl9jb250ZXh0LmdldFNlcnZlclRpbWUoKSAtIHNlbnRUaW1lO1xuICAgICAgICAgIGNvbnN0IGlzTGVzc1RoYW5PZmZsaW5lTXNnSXR2ID0gZGVsYXlUaW1lIDwgdGhpcy5fb2ZmbGluZU1zZ0l0djtcblxuICAgICAgICAgIGlmICghaXNMZXNzVGhhbk9mZmxpbmVNc2dJdHYpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdfJywgYG9mZmxpbmUgbXNnIGRlbGF5VGltZTogJHtkZWxheVRpbWV9bXNgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNJbnZpdGVNc2dUeXBlKSB7IC8vIOWPluWHuueahOesrOS4gOadoea2iOaBr+S4uiBpbnZpdGUgfCBtZW1Nb2RpZnlcbiAgICAgICAgICAgIC8vIOWPluWHuuebuOWQjCBDYWxsSWQg5raI5oGv5YiX6KGoXG4gICAgICAgICAgICBjb25zdCB0YXNrTXNnTGlzdDogSVJlY2VpdmVkTWVzc2FnZVtdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9mZmxpbmVCdWZmZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBvZmZsaW5lQnVmZmVyc1tpXS5tc2c7XG4gICAgICAgICAgICAgIGNvbnN0IHsgY29udGVudDogeyBjYWxsSWQ6IG90aGVyQ2FsbElkIH0gfSA9IGl0ZW07XG4gICAgICAgICAgICAgIGlmIChpbnZpdGVDYWxsSWQgPT09IG90aGVyQ2FsbElkKSB7XG4gICAgICAgICAgICAgICAgdGFza01zZ0xpc3QucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgdGFza01zZ0xpc3QgbGVuZ3RoOiAke3Rhc2tNc2dMaXN0Lmxlbmd0aH1gKTtcblxuICAgICAgICAgICAgaWYgKHRhc2tNc2dMaXN0Lmxlbmd0aCA+IDApIHsgLy8g6Ziy5q2iIHRhc2tNc2dMaXN0IOS4uiAwXG4gICAgICAgICAgICAgIC8vIOaJvuWHuiBtc2dCdWZmZXJMaXN0IOS4reW3sua2iOi0ueeahOa2iOaBr+acgOWkpyBpbmRleFxuICAgICAgICAgICAgICBjb25zdCBkZWxJbmRleCA9IHRoaXMuX21zZ0J1ZmZlckxpc3QuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLm1zZy5tZXNzYWdlVUlkID09PSB0YXNrTXNnTGlzdFt0YXNrTXNnTGlzdC5sZW5ndGggLSAxXS5tZXNzYWdlVUlkKTtcbiAgICAgICAgICAgICAgLy8g5Yig6Zmk5raI6LS56L+HIG1zZ0J1ZmZlckxpc3Qg55qE5raI5oGvXG4gICAgICAgICAgICAgIHRoaXMuX21zZ0J1ZmZlckxpc3QgPSB0aGlzLl9tc2dCdWZmZXJMaXN0LnNsaWNlKGRlbEluZGV4ICsgMSk7XG5cbiAgICAgICAgICAgICAgLy8g5om+5Ye6IG9mZmxpbmVNc2dzIOS4reW3sua2iOi0ueeahOa2iOaBr+acgOWkpyBpbmRleFxuICAgICAgICAgICAgICBjb25zdCBkZWxPZmZsaW5lSW5kZXggPSBvZmZsaW5lQnVmZmVycy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0ubXNnLm1lc3NhZ2VVSWQgPT09IHRhc2tNc2dMaXN0W3Rhc2tNc2dMaXN0Lmxlbmd0aCAtIDFdLm1lc3NhZ2VVSWQpO1xuICAgICAgICAgICAgICAvLyDliKDpmaTmtojotLnov4cgb2ZmbGluZUJ1ZmZlcnMg55qE5raI5oGvXG4gICAgICAgICAgICAgIG9mZmxpbmVCdWZmZXJzID0gb2ZmbGluZUJ1ZmZlcnMuc2xpY2UoZGVsT2ZmbGluZUluZGV4ICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIOWNleiBiuacque7k+adn+mAmuivneWIpOaWrVxuICAgICAgICAgICAgICog5aaC5p6c5raI5oGv5ZyoIDYwcyDlhoXvvIzliKTmlq3mmK/lkKbmnKrmiJDlr7nvvIjlj6rmnIkgaW52aXRlIOaIluWPquaciSBpbnZpdGUg5oiWIHJpbmdpbmcg5oiQ5a+55oqb57uZIOemu+e6v+iusOW9leWZqO+8jOacquaIkOWvueaKm+e7meeKtuaAgeaculxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBpc1VuZmluaXNoZWRQcml2YXRlQ2FsbDogYm9vbGVhbiA9ICgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjb252ZXJzYXRpb25UeXBlICE9PSBDb252ZXJzYXRpb25UeXBlLlBSSVZBVEUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc3QgaXNPbmx5SW52aXRlID0gdGFza01zZ0xpc3QubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgICBjb25zdCBoYXNJbnZpdGVBbmRSaW5naW5nID0gdGFza01zZ0xpc3QuZXZlcnkoKGl0ZW0pID0+IFtSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZWRpYSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNSaW5naW5nXS5pbmNsdWRlcyhpdGVtLm1lc3NhZ2VUeXBlIGFzIFJDQ2FsbE1lc3NhZ2VUeXBlKSk7XG4gICAgICAgICAgICAgIHJldHVybiBpc09ubHlJbnZpdGUgfHwgaGFzSW52aXRlQW5kUmluZ2luZztcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIOe+pOiBiuacque7k+adn+mAmuivneWIpOaWrVxuICAgICAgICAgICAgICog6YCa6L+HIGxpc3Qg5LitIGludml0ZSDlkowgbWVtYmVyTW9kaWZ5IOa2iOaBr+S4reWPluWHuuaJgOacieWPguS4jumAmuivneeahCB1c2VySWRcbiAgICAgICAgICAgICAqIOmBjeWOhiBsaXN0IOaJvuWHuuaJgOaciSBoYW5ndXAg55qEIHNlbmRVc2VySWRcbiAgICAgICAgICAgICAqICAgICDmgLvkurrmlbAgLSDmjILmlq3kurrmlbAgPiAxICDkuJTliankvZnkurrmlbDljIXlkKvoh6rlt7HvvIzorqTkuLrpgJror53mnKrmjILmlq3ov5vnirbmgIHmnLpcbiAgICAgICAgICAgICAqICAgICDmgLvkurrmlbAgLSDmjILmlq3kurrmlbAgPD0gMSDpgJror53mjILmlq3vvIzov5vnprvnur/mtojmga/lpITnkIblmahcbiAgICAgICAgICAgICAqICAgICDkuLvlj6vnm7TmjqXmjILmlq3kuJTlhbbku5bkurrmnKrmjqXlkKznm7TmjqXov5vnprvnur/lpITnkIblmahcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgaXNVbmZpbmlzaGVkR3JwQ2FsbDogYm9vbGVhbiA9ICgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjb252ZXJzYXRpb25UeXBlICE9PSBDb252ZXJzYXRpb25UeXBlLkdST1VQKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIGxldCBpc1VuZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgbGV0IG5vT25lQWNjZXB0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgbGV0IGFsbFVzZXJJZHMgPSBbc2VuZGVyVXNlcklkLCAuLi5pbnZpdGVVc2VySWRzXTtcbiAgICAgICAgICAgICAgbGV0IGlzQ2FsbGVySHVuZ3VwID0gZmFsc2U7XG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFza01zZ0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHNlbmRlclVzZXJJZDogdGFza01zZ1NlbmRlclVzZXJJZCwgbWVzc2FnZVR5cGUgfSA9IHRhc2tNc2dMaXN0W2ldO1xuICAgICAgICAgICAgICAgIC8vIOWPquimgeiHquW3seaMguaWreebtOaOpei3s+WHuuW+queOr++8jOi/m+emu+e6v+a2iOaBr1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVHlwZSA9PT0gUkNDYWxsTWVzc2FnZVR5cGUuVkNIYW5ndXAgJiYgdGFza01zZ1NlbmRlclVzZXJJZCA9PT0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSkge1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIOaJvuWHuuaJgOacieaMguaWreeahOS6uuWRmO+8jOS7peWPiumAmuivneWPkei1t+iAheaYr+WQpuaMguaWrVxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlVHlwZSA9PT0gUkNDYWxsTWVzc2FnZVR5cGUuVkNIYW5ndXApIHtcbiAgICAgICAgICAgICAgICAgIGlzQ2FsbGVySHVuZ3VwID0gc2VuZGVyVXNlcklkID09PSB0YXNrTXNnU2VuZGVyVXNlcklkO1xuICAgICAgICAgICAgICAgICAgYWxsVXNlcklkcyA9IGFsbFVzZXJJZHMuZmlsdGVyKChpZCkgPT4gdGFza01zZ1NlbmRlclVzZXJJZCAhPT0gaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDliKTmlq3mmK/lkKbml6DkurrmjqXlkKxcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZVR5cGUgPT09IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDQWNjZXB0KSB7XG4gICAgICAgICAgICAgICAgICBub09uZUFjY2VwdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyDkuI3mmK/kuLvlj6vmjILmlq3kuJTml6DkurrmjqXlkKzvvIzkuJTliankvZnkurrmlbDlpKfkuo4gMVxuICAgICAgICAgICAgICBpZiAoIShub09uZUFjY2VwdCAmJiBpc0NhbGxlckh1bmd1cCkgJiYgYWxsVXNlcklkcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgaXNVbmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gaXNVbmZpbmlzaGVkO1xuICAgICAgICAgICAgfSkoKTtcblxuICAgICAgICAgICAgaWYgKGlzTGVzc1RoYW5PZmZsaW5lTXNnSXR2ICYmIChpc1VuZmluaXNoZWRQcml2YXRlQ2FsbCB8fCBpc1VuZmluaXNoZWRHcnBDYWxsKSkge1xuICAgICAgICAgICAgICB0YXNrTXNnTGlzdC5mb3JFYWNoKHRoaXMuX29uUmVjdk9ubGluZUNhbGxNc2csIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fb2ZmbGluZVJlY29yZGVyLm9uUmVjdk9mZmxpbmVNc2dzKHRhc2tNc2dMaXN0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlzTGVzc1RoYW5PZmZsaW5lTXNnSXR2ICYmIHRoaXMuX2dldFN0YXRlTWFjaGluZShpbnZpdGVDYWxsSWQpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX29uUmVjdk9ubGluZUNhbGxNc2cob2ZmbGluZUJ1ZmZlcnNbMF0ubXNnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbQ2FsbE1lc3NhZ2VIYW5kbGVyXSB1bmV4Y2VwdGVkIG9mZmxpbmUgbXNnIC0+ICR7SlNPTi5zdHJpbmdpZnkob2ZmbGluZUJ1ZmZlcnNbMF0ubXNnKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZmxpbmVCdWZmZXJzLnNoaWZ0KCk7XG4gICAgICAgICAgICB0aGlzLl9tc2dCdWZmZXJMaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChvZmZsaW5lQnVmZmVycy5sZW5ndGggPiAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOWcqOe6v+a2iOaBr+WkhOeQhumAu+i+kVxuICAgICAgICBidWZmZXJzLmZvckVhY2goKHsgbXNnIH0pID0+IHtcbiAgICAgICAgICB0aGlzLl9vblJlY3ZPbmxpbmVDYWxsTXNnKG1zZyEpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8g5om+5Ye6IG1zZ0J1ZmZlckxpc3Qg5Lit5bey5raI6LS555qE5raI5oGv5pyA5aSnIGluZGV4XG4gICAgICAgIGNvbnN0IGRlbENvdW50ID0gYnVmZmVycy5sZW5ndGg7XG4gICAgICAgIC8vIOWIoOmZpOa2iOi0uei/h+eahOa2iOaBr1xuICAgICAgICB0aGlzLl9tc2dCdWZmZXJMaXN0LnNwbGljZSgwLCBkZWxDb3VudCk7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGB0aW1lciBvbmxpbmUgbXNnIGhhbmRsZSAtPiBkZWxDb3VudDogJHtkZWxDb3VudH0gbXNnQnVmZmVyTGlzdDogJHt0aGlzLl9tc2dCdWZmZXJMaXN0Lmxlbmd0aH1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2hhZEhhbmRsZU1zZ1RpbWVyID0gZmFsc2U7XG4gICAgICB0aGlzLl9oYW5kbGVCdWZmZXJNc2dzKCk7XG4gICAgfSwgMjApO1xuICB9XG5cbiAgcmVnaXN0ZXJFdmVudExpc3RlbmVyKGxpc3RlbmVyOiBJTXNnTGlzdGVuZXIpIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX3dhdGNoZXJzLCBsaXN0ZW5lcik7XG4gIH1cblxuICByZWdpc3RlclN0YXRlTWFjaGluZUV2ZW50KGNhbGxJZDogc3RyaW5nLCBmdW5jTmFtZTogTXNnTGlzdGVuZXJLZXlzLCBldmVudDogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgZXZlbnRUeXBlID0gY2FsbElkICsgZnVuY05hbWU7XG4gICAgc3VwZXIub24oZXZlbnRUeXBlLCBldmVudCk7XG4gIH1cblxuICB1bnJlZ2lzdGVyU3RhdGVNYWNoaW5lRXZlbnQoY2FsbElkOiBzdHJpbmcpIHtcbiAgICBbJ29uUmluZ2luZycsICdvbkFjY2VwdCcsICdvbkh1bmd1cCcsICdvbk1lZGlhTW9kaWZ5J10uZm9yRWFjaCgoZnVuY05hbWUpID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IGNhbGxJZCArIGZ1bmNOYW1lO1xuICAgICAgc3VwZXIucmVtb3ZlQWxsKGV2ZW50VHlwZSk7XG4gICAgfSk7XG4gIH1cblxuICByZWdpc3RlclVzZXJJbmZvKHVzZXJJbmZvOiBJVXNlclByb2ZpbGUpIHtcbiAgICB0aGlzLl91c2VySW5mbyA9IHVzZXJJbmZvO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgSBJTSDmtojmga9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3NlbmRDYWxsTWVzc2FnZShvcHRpb25zOiBJQ2FsbE1zZ09wdGlvbik6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIG1lc3NhZ2U/OiBJUmVjZWl2ZWRNZXNzYWdlIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgQ2FsbE1lc3NhZ2VIYW5kbGVyXSBzZW5kQ2FsbE1lc2FnZSAtPiBtZXNzYWdlOiAke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMpfWApO1xuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNvbnRlbnQsIG1lc3NhZ2VUeXBlLCBkaXJlY3Rpb25hbFVzZXJJZExpc3QsIHB1c2hDb25maWcsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3Qgc2VuZE9wdHM6IElTZW5kTXNnT3B0aW9ucyA9IHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIG1lc3NhZ2VUeXBlLFxuICAgICAgY29udGVudCxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdCxcbiAgICB9O1xuXG4gICAgaWYgKFtSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSwgUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0sIFJDQ2FsbE1lc3NhZ2VUeXBlLlZDSGFuZ3VwXS5pbmNsdWRlcyhtZXNzYWdlVHlwZSkpIHtcbiAgICAgIGNvbnN0IG5ld1B1c2hDb25maWcgPSBwdXNoQ29uZmlnIHx8IHsgcHVzaFRpdGxlOiAnJywgcHVzaENvbnRlbnQ6ICcnLCBwdXNoRGF0YTogJycgfTtcbiAgICAgIG5ld1B1c2hDb25maWcuYW5kcm9pZENvbmZpZyA9IE9iamVjdC5hc3NpZ24ocHVzaENvbmZpZz8uYW5kcm9pZENvbmZpZyB8fCB7fSwge1xuICAgICAgICBjYXRlZ29yeUhXOiAnVk9JUCcsXG4gICAgICAgIGNhdGVnb3J5Vml2bzogJ0lNJyxcbiAgICAgIH0pO1xuICAgICAgbmV3UHVzaENvbmZpZy5pT1NDb25maWcgPSBPYmplY3QuYXNzaWduKG5ld1B1c2hDb25maWcuaU9TQ29uZmlnIHx8IHt9LCB7XG4gICAgICAgIGFwbnNDb2xsYXBzZUlkOiBjb250ZW50LmNhbGxJZCxcbiAgICAgIH0pO1xuICAgICAgbmV3UHVzaENvbmZpZy5kaXNhYmxlUHVzaFRpdGxlID0gZmFsc2U7XG4gICAgICBuZXdQdXNoQ29uZmlnLmZvcmNlU2hvd0RldGFpbENvbnRlbnQgPSBmYWxzZTtcbiAgICAgIHNlbmRPcHRzLnB1c2hDb25maWcgPSBuZXdQdXNoQ29uZmlnIGFzIElFbmdpbmVQdXNoQ29uZmlnO1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUsIGRhdGE6IG1lc3NhZ2UgfSA9IGF3YWl0IHRoaXMuX2NvbnRleHQuc2VuZE1lc3NhZ2UoY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIHNlbmRPcHRzKTtcbiAgICBpZiAoY29kZSAhPT0gRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBDYWxsTWVzc2FnZUhhbmRsZXJdIHNlbmRDYWxsTWVzYWdlIGVycm9yIC0+IGNvZGU6ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IEVuZ2luZUVycm9yQ29kZVRvQ2FsbEVycm9yQ29kZVtjb2RlXSB8fCBSQ0NhbGxFcnJvckNvZGUuU0VORF9NU0dfRVJST1IsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgbWVzc2FnZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgemCgOivt+a2iOaBr1xuICAgKi9cbiAgYXN5bmMgc2VuZEludml0ZShvcHRpb25zOiBJSW52aXRlTXNnT3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIHJvb21UeXBlLCBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIG1lZGlhVHlwZSwgaW52aXRlVXNlcklkcywgZXh0cmEsIHB1c2hDb25maWcsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCAnQ2FsbE1lc3NhZ2VIYW5kbGVyXSBzZW5kQ2FsbE1lc2FnZSBzZW5kSW52aXRlJywgSlNPTi5zdHJpbmdpZnkob3B0aW9ucykpO1xuICAgIHRoaXMuX3dhdGNoZXJzLnNlbmRBY2NlcHQgJiYgdGhpcy5fd2F0Y2hlcnMuc2VuZEFjY2VwdCh7IGNhbGxJZCB9KTtcbiAgICBjb25zdCBjb250ZW50OiBJSW52aXRlTXNnQ29udGVudCA9IHtcbiAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5XRUIsXG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICByb29tVHlwZSxcbiAgICAgIGV4dHJhLFxuICAgICAgZW5naW5lVHlwZTogNCxcbiAgICAgIGNoYW5uZWxJbmZvOiB7IElkOiBjYWxsSWQsIEtleTogJycgfSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGludml0ZVVzZXJJZHMsXG4gICAgICBvYnNlcnZlclVzZXJJZHM6IFtdLFxuICAgICAgdXNlcjogdGhpcy5fdXNlckluZm8sXG4gICAgfTtcblxuICAgIGlmIChwdXNoQ29uZmlnKSB7XG4gICAgICBwdXNoQ29uZmlnLnB1c2hEYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIHVzZXJJZExpc3Q6IGludml0ZVVzZXJJZHMsXG4gICAgICAgIGNhbGxJZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbE1lc3NhZ2Uoe1xuICAgICAgY2hhbm5lbElkLFxuICAgICAgY29udmVyc2F0aW9uVHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY29udGVudCxcbiAgICAgIG1lc3NhZ2VUeXBlOiBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSxcbiAgICAgIGRpcmVjdGlvbmFsVXNlcklkTGlzdDogY29udmVyc2F0aW9uVHlwZSA9PT0gQ29udmVyc2F0aW9uVHlwZS5HUk9VUCA/IGludml0ZVVzZXJJZHMgOiBbdGFyZ2V0SWRdLFxuICAgICAgcHVzaENvbmZpZyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHkurrlkZjlj5jmm7Tmtojmga9cbiAgICovXG4gIGFzeW5jIHNlbmRNZW1lYmVyTW9kaWZ5KG9wdGlvbnM6IElNZW1iZXJNb2RpZnlNc2dPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY2FsbElkLCBtZWRpYVR5cGUsIGludml0ZVVzZXJJZHMsIGNhbGxlcklkLFxuICAgICAgZXhpc3RlZFVzZXJQb2ZpbGVzLCBkaXJlY3Rpb25hbFVzZXJJZExpc3QsIGV4dHJhLCBwdXNoQ29uZmlnLFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNvbnRlbnQ6IElNZW1iZXJNb2RpZnlNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQiwgLy8gVE9ETyDkuI4gSU0g5LiA6Ie0XG4gICAgICBkZXZpY2VJZDogdGhpcy5fZGV2aWNlSWQsXG4gICAgICBjYWxsSWQsXG4gICAgICBleHRyYSxcbiAgICAgIGVuZ2luZVR5cGU6IDQsXG4gICAgICBjaGFubmVsSW5mbzogeyBJZDogY2FsbElkLCBLZXk6ICcnIH0sXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBpbnZpdGVVc2VySWRzLFxuICAgICAgb2JzZXJ2ZXJVc2VySWRzOiBbXSxcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgICAgY2FsbGVyOiBjYWxsZXJJZCxcbiAgICAgIG1vZGlmeU1lbVR5cGU6IE1lbWJlck1vZGlmeVR5cGUuQURELFxuICAgICAgZXhpc3RlZFVzZXJQb2ZpbGVzLFxuICAgIH07XG5cbiAgICBpZiAocHVzaENvbmZpZykge1xuICAgICAgcHVzaENvbmZpZy5wdXNoRGF0YSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICB1c2VySWRMaXN0OiBpbnZpdGVVc2VySWRzLFxuICAgICAgICBjYWxsSWQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsTWVzc2FnZSh7XG4gICAgICBjaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWVzc2FnZVR5cGU6IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVtLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0LFxuICAgICAgcHVzaENvbmZpZyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HpgIHlk43pk4Pmtojmga9cbiAgICovXG4gIHNlbmRSaW5naW5nKG9wdGlvbnM6IElSaW5naW5nTXNnT3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgdXNlcklkcyxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJUmluZ2luZ01zZ0NvbnRlbnQgPSB7XG4gICAgICBwbGF0Zm9ybTogUGxhdGZvcm0uV0VCLFxuICAgICAgZGV2aWNlSWQ6IHRoaXMuX2RldmljZUlkLFxuICAgICAgY2FsbElkLFxuICAgICAgdXNlcjogdGhpcy5fdXNlckluZm8sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxNZXNzYWdlKHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtZXNzYWdlVHlwZTogUkNDYWxsTWVzc2FnZVR5cGUuVkNSaW5naW5nLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiB1c2VySWRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeWQjOaEj+aOpeWQrOa2iOaBr1xuICAgKi9cbiAgc2VuZEFjY2VwdChvcHRpb25zOiBJQWNjZXB0TXNnT3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgbWVkaWFUeXBlLCB1c2VySWRzLFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNvbnRlbnQ6IElBY2NlcHRNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsTWVzc2FnZSh7XG4gICAgICBjaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWVzc2FnZVR5cGU6IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDQWNjZXB0LFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiB1c2VySWRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeaMguaWrea2iOaBr1xuICAgKi9cbiAgc2VuZEh1bmd1cChvcHRpb25zOiBJSHVuZ3VwTXNnT3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNoYW5uZWxJZCwgY29udmVyc2F0aW9uVHlwZSwgdGFyZ2V0SWQsIGNhbGxJZCwgcmVhc29uLCB1c2VySWRzLCBwdXNoQ29uZmlnLFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNvbnRlbnQ6IElIdW5ndXBNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHJlYXNvbixcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgIH07XG5cbiAgICBpZiAocHVzaENvbmZpZykge1xuICAgICAgcHVzaENvbmZpZy5wdXNoRGF0YSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY2FsbElkLCByZWFzb24sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxNZXNzYWdlKHtcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtZXNzYWdlVHlwZTogUkNDYWxsTWVzc2FnZVR5cGUuVkNIYW5ndXAsXG4gICAgICBwdXNoQ29uZmlnLFxuICAgICAgZGlyZWN0aW9uYWxVc2VySWRMaXN0OiB1c2VySWRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkemAgeWqkuS9k+WPmOabtOa2iOaBr1xuICAgKi9cbiAgc2VuZE1lZGlhTW9kaWZ5KG9wdGlvbnM6IElNZWRpYU1vZGlmeU1zZ09wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBjaGFubmVsSWQsIGNvbnZlcnNhdGlvblR5cGUsIHRhcmdldElkLCBjYWxsSWQsIG1lZGlhVHlwZSwgdXNlcklkcyxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb250ZW50OiBJTWVkaWFNb2RpZnlNc2dDb250ZW50ID0ge1xuICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLldFQixcbiAgICAgIGRldmljZUlkOiB0aGlzLl9kZXZpY2VJZCxcbiAgICAgIGNhbGxJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHVzZXI6IHRoaXMuX3VzZXJJbmZvLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsTWVzc2FnZSh7XG4gICAgICBjaGFubmVsSWQsXG4gICAgICBjb252ZXJzYXRpb25UeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjb250ZW50LFxuICAgICAgbWVzc2FnZVR5cGU6IFJDQ2FsbE1lc3NhZ2VUeXBlLlZDTW9kaWZ5TWVkaWEsXG4gICAgICBkaXJlY3Rpb25hbFVzZXJJZExpc3Q6IHVzZXJJZHMsXG4gICAgfSk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbExhbmd1YWdlIHtcbiAgWkggPSAnemgnLFxuICBFTiA9ICdlbidcbn1cbiIsImV4cG9ydCBjb25zdCBFTiA9IHtcbiAgUHVzaFRpdGxlOiB7XG4gICAgQVVESU86ICdZb3UgaGF2ZSBhIHZvaWNlIGNhbGwnLFxuICAgIFZJREVPOiAnWW91IGhhdmUgYSB2aWRlbyBjYWxsJyxcbiAgfSxcbn07XG4iLCJleHBvcnQgY29uc3QgWkggPSB7XG4gIFB1c2hUaXRsZToge1xuICAgIEFVRElPOiAn5oKo5pyJ5LiA5p2h6Z+z6aKR6YCa6K+dJyxcbiAgICBWSURFTzogJ+aCqOacieS4gOadoeinhumikemAmuivnScsXG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUkNDYWxsTGFuZ3VhZ2UgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxMYW5nJztcbmltcG9ydCB7IEVOIH0gZnJvbSAnLi9lbic7XG5pbXBvcnQgeyBaSCB9IGZyb20gJy4vemgnO1xuXG4vKipcbiAqIENhbGxFbmdpbmUg5YWo5bGA6K+t6KiA6K6+572u77yM5b2T5YmN5LuF5pSv5oyB5Lit44CB6Iux5paHXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2NhbCB7XG4gIHN0YXRpYyBfbGFuZzogUkNDYWxsTGFuZ3VhZ2UgPSBSQ0NhbGxMYW5ndWFnZS5aSFxuXG4gIHN0YXRpYyBzZXQobGFuZzogUkNDYWxsTGFuZ3VhZ2UpIHtcbiAgICB0aGlzLl9sYW5nID0gbGFuZztcbiAgfVxuXG4gIHN0YXRpYyBnZXQoKSB7XG4gICAgaWYgKHRoaXMuX2xhbmcgPT09IFJDQ2FsbExhbmd1YWdlLkVOKSB7XG4gICAgICByZXR1cm4gRU47XG4gICAgfVxuICAgIHJldHVybiBaSDtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQmFzaWNMb2dnZXIsIENvbnZlcnNhdGlvblR5cGUsIElSZWNlaXZlZE1lc3NhZ2UsIElSdW50aW1lLCBSVENQbHVnaW5Db250ZXh0LFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxTdGF0ZU1hY2hpbmUgfSBmcm9tICcuL2NvcmUvU3RhdGVNYWNoaW5lJztcbmltcG9ydCB7XG4gIElDYWxsU3RhdGVNYWNoaW5lV2F0Y2hlcnMsIElFbmRTdW1tYXJ5LCBJSW52aXRlZFVzZXJzLCBJTWVkaWFNb2RpZnlJbmZvLCBJTWVtYmVyTW9kaWZ5SW5mbywgSVNlbmRlckluZm8sIElTdGF0ZUNoYW5nZUluZm8sIElVc2VyUHJvZmlsZSwgSVVzZXJTdGF0ZUNoYW5nZUluZm8sIElVc2VyRGF0YSwgSUludml0ZU9wdGlvbnMsXG59IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL0lTdGF0ZU1hY2hpbmUnO1xuaW1wb3J0IHsgUkNDYWxsRXJyb3JDb2RlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbENvZGUnO1xuaW1wb3J0IHsgUkNDYWxsVXNlclN0YXRlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbFVzZXJTdGF0ZSc7XG5pbXBvcnQgeyBSQ0NhbGxTZXNzaW9uU3RhdGUgfSBmcm9tICcuL2NvcmUvZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbEVuZFJlYXNvbiB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxFbmRSZWFzb24nO1xuaW1wb3J0IHsgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbE1lZGlhVHlwZSc7XG5pbXBvcnQgeyBDYWxsTWVzc2FnZUhhbmRsZXIgfSBmcm9tICcuL2NvcmUvTWVzc2FnZUhhbmRsZXInO1xuaW1wb3J0IHsgZXZlbnRFbWl0dGVyLCBnZW5lcmF0ZVJhbmRvbUlkLCBnZXRDYWxsRGV2aWNlSWQgfSBmcm9tICcuL2hlbHBlcic7XG5pbXBvcnQgeyBSQ0NhbGxMYW5ndWFnZSB9IGZyb20gJy4vY29yZS9lbnVtcy9SQ0NhbGxMYW5nJztcbmltcG9ydCB7IElDYWxsRW5naW5lT3B0aW9ucywgSUNhbGxFbmdpbmVXYXRjaGVycyB9IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL0lDYWxsRW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbE1lc3NhZ2VUeXBlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ2FsbE1lc3NhZ2VUeXBlJztcbmltcG9ydCB7IElJbnZpdGVNc2dDb250ZW50IH0gZnJvbSAnLi9jb3JlL2ludGVyZmFjZXMvSU1lc3NhZ2VIYW5kbGVyJztcbmltcG9ydCB7IExvY2FsIH0gZnJvbSAnLi9jb3JlL2xvY2FsZSc7XG5pbXBvcnQgeyBJT2ZmbGluZVJlY29yZCB9IGZyb20gJy4vY29yZS9PZmZsaW5lUmVjb3JkZXInO1xuaW1wb3J0IHsgUkNDcm9zc0NhbGxUeXBlIH0gZnJvbSAnLi9jb3JlL2VudW1zL1JDQ3Jvc3NDYWxsVHlwZSc7XG5pbXBvcnQgeyBJUHVzaENvbmZpZyB9IGZyb20gJy4uL3NyYy9pbnRlcmZhY2UnO1xuXG5jbGFzcyBSQ0NhbGxFbmdpbmUge1xuICBwcml2YXRlIF9zdGF0ZU1hY2hpbmU6IHsgW2NhbGxJZDogc3RyaW5nXTogUkNDYWxsU3RhdGVNYWNoaW5lIH0gPSB7fVxuXG4gIHByaXZhdGUgX2NhbGxNc2dIYW5kbGVyOiBDYWxsTWVzc2FnZUhhbmRsZXJcblxuICAvKipcbiAgICog5Yid5aeL5YyWXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBlbmdpbmUgUGxndWluQ29udGV4dCDlrp7kvotcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIC8qKlxuICAgICAqIOi/kOihjOaXtuebuOWFs1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIC8qKlxuICAgICAqIGVuZ2luZSDml6Xlv5fmqKHlnZflrp7kvovvvIznlLEgQ2FsbExpYiDlsYLliJ3lp4vljJZcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIC8qKlxuICAgICAqIOebkeWQrOaWueazlVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3dhdGNoZXJzOiBJQ2FsbEVuZ2luZVdhdGNoZXJzLFxuICAgIC8qKlxuICAgICAqIOWFtuS7lumFjee9rumhuVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IElDYWxsRW5naW5lT3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oJ18nLCBgUkNDYWxsRW5naW5lIFZlcnNpb246ICR7X19WRVJTSU9OX199IENvbW1pdElkOiAke19fQ09NTUlUX0lEX199YCk7XG4gICAgLy8g6K6+572uIERldmljZUlkXG4gICAgZ2V0Q2FsbERldmljZUlkKF9ydW50aW1lKTtcbiAgICAvLyDnm5HlkKwgSU0g5raI5oGvXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIgPSBuZXcgQ2FsbE1lc3NhZ2VIYW5kbGVyKHRoaXMuX2NvbnRleHQsIHRoaXMuX3J1bnRpbWUsIHRoaXMuX2xvZ2dlciwgdGhpcy5fb3B0aW9ucy5vZmZsaW5lTXNnSXR2LCB0aGlzLl9nZXRTdGF0ZU1hY2hpbmUuYmluZCh0aGlzKSk7XG4gICAgLy8g5rOo5YaM5raI5oGv5qih5Z2X55uR5ZCsXG4gICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIucmVnaXN0ZXJFdmVudExpc3RlbmVyKHtcbiAgICAgIG9uSW52aXRlOiB0aGlzLl9vbkludml0ZS5iaW5kKHRoaXMpLFxuICAgICAgc2VuZEFjY2VwdDogdGhpcy5faGFuZGxlU2VuZEFjY2VwdC5iaW5kKHRoaXMpLFxuICAgICAgb25PZmZsaW5lUmVjb3JkOiB0aGlzLl93YXRjaGVycy5vbk9mZmxpbmVSZWNvcmQsXG4gICAgfSk7XG4gICAgLy8g55uR5ZCs54q25oCB5py65YWz6ZetXG4gICAgZXZlbnRFbWl0dGVyLm9uKCdvblN0YXRlTWFjaGluZUNsb3NlJywgKGNhbGxJZDogc3RyaW5nKSA9PiB7XG4gICAgICBkZWxldGUgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF07XG4gICAgfSk7XG4gICAgLy8g6K6+572u6K+t6KiAXG4gICAgTG9jYWwuc2V0KF9vcHRpb25zLmxhbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25JbnZpdGUobXNnOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hhbm5lbElkLCBjb252ZXJzYXRpb25UeXBlLCB0YXJnZXRJZCwgY29udGVudCwgbWVzc2FnZVR5cGUsIHNlbmRlclVzZXJJZDogc3VpZCwgcHVzaENvbmZpZyxcbiAgICB9ID0gbXNnO1xuICAgIHRoaXMuX2xvZ2dlci53YXJuKCdfJywgYFJDQ2FsbEVuZ2luZSBfb25JbnZpdGU6dGFyZ2V0SWQgJHt0YXJnZXRJZH0gc2VuZGVyVXNlcklkOiAke3N1aWR9YCk7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWFUeXBlLCBjYWxsSWQsIGV4dHJhLCByb29tVHlwZSxcbiAgICB9ID0gY29udGVudCBhcyBJSW52aXRlTXNnQ29udGVudDtcbiAgICBsZXQgc2VuZGVyVXNlcklkOiBzdHJpbmc7XG4gICAgaWYgKHJvb21UeXBlICE9PSBSQ0Nyb3NzQ2FsbFR5cGUuUkNDYWxsUm9vbVR5cGVBY3Jvc3NDYWxsKSB7XG4gICAgICBzZW5kZXJVc2VySWQgPSBzdWlkO1xuICAgIH0gZWxzZSB7XG4gICAgICBbLCBzZW5kZXJVc2VySWRdID0gc3VpZC5zcGxpdCgnXycpO1xuICAgIH1cbiAgICBjb25zdCBjcnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGlmICh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpID09PSBzZW5kZXJVc2VySWQpIHsgLy8g5aSa56uv5aSE55CGXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog576k6IGK6YCa6K+d5pyJ5YW25LuW56uv5aSE55CG5pe277yM5LiN5YaN5aSE55CG5q2k6YCa6K+d5Lit55qE6YKA6K+35raI5oGvXG4gICAgICog5p2h5Lu2MTog5q2k5Lq65bey6KKr6YKA6K+36YCa6K+dXG4gICAgICog5p2h5Lu2Mjog5pys56uv5peg5q2k6YCa6K+d55qE54q25oCB5py6XG4gICAgICovXG4gICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSkge1xuICAgICAgY29uc3QgaXNLZWVwaW5nID0gY29udGVudC5leGlzdGVkVXNlclBvZmlsZXMuc29tZSgoaXRlbTogeyB1c2VySWQ6IHN0cmluZyB9KSA9PiAoaXRlbS51c2VySWQgPT09IGNydFVzZXJJZCkpO1xuICAgICAgaWYgKGlzS2VlcGluZyAmJiAhdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlTWFjaGluZSA9IHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdO1xuICAgIGlmICghc3RhdGVNYWNoaW5lKSB7XG4gICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSA9IG5ldyBSQ0NhbGxTdGF0ZU1hY2hpbmUoXG4gICAgICAgIHRoaXMuX2NvbnRleHQsXG4gICAgICAgIHRoaXMuX3J1bnRpbWUsXG4gICAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgICAgdGhpcy5fY2FsbE1zZ0hhbmRsZXIsXG4gICAgICAgIGNoYW5uZWxJZCEsXG4gICAgICAgIGNvbnZlcnNhdGlvblR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGNhbGxJZCxcbiAgICAgICk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsRW5naW5lXSBSQ0NhbGxTdGF0ZU1hY2hpbmUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgLT4gY2FsbElkOiAke2NhbGxJZH1gKTtcblxuICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ0ludml0ZSkge1xuICAgICAgICAvLyDnirbmgIHmnLrlhoXpg6jlpITnkIYgaW52aXRlIOa2iOaBr1xuICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX29uSW52aXRlKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VUeXBlID09PSBSQ0NhbGxNZXNzYWdlVHlwZS5WQ01vZGlmeU1lbSkge1xuICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXS5fX29uTWVtYmVyTW9kaWZ5KG1zZyk7XG4gICAgICB9XG4gICAgICB0aGlzLl93YXRjaGVycy5vbkludml0ZSh0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSwgZXh0cmEpO1xuXG4gICAgICBjb25zdCBoYXNPdGhlclN0YXRlTWFjaGluZSA9IE9iamVjdC5rZXlzKHRoaXMuX3N0YXRlTWFjaGluZSkuZmlsdGVyKChvdGhlckNhbGxJZCkgPT4gY2FsbElkICE9PSBvdGhlckNhbGxJZCkubGVuZ3RoID4gMDtcbiAgICAgIGlmIChoYXNPdGhlclN0YXRlTWFjaGluZSAmJiAhKHRoaXMuX29wdGlvbnMuaXNBbGxvd0FjY2VwdE5ld0NhbGwgfHwgZmFsc2UpKSB7XG4gICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9faGFuZGxlSW52aXRlSW5TZXNzaW9uKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlVHlwZSA9PT0gUkNDYWxsTWVzc2FnZVR5cGUuVkNNb2RpZnlNZW0pIHtcbiAgICAgIHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fb25NZW1iZXJNb2RpZnkobXNnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5YWB6K645o6l5ZCs5paw55qE6YCa6K+d5pe277yM5o6l5ZCs5a6M5paw55qE6YCa6K+d5ZCO77yM5oyC5pat5YW25LuW6YCa6K+dXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVTZW5kQWNjZXB0KGluZm86IHsgY2FsbElkOiBzdHJpbmcgfSkge1xuICAgIGlmICh0aGlzLl9vcHRpb25zLmlzQWxsb3dBY2NlcHROZXdDYWxsKSB7XG4gICAgICBjb25zdCB7IGNhbGxJZCB9ID0gaW5mbztcbiAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fc3RhdGVNYWNoaW5lKSB7XG4gICAgICAgIGlmIChjYWxsSWQgIT09IGlkKSB7XG4gICAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lW2lkXS5odW5ndXAoKTtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fc3RhdGVNYWNoaW5lW2lkXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOiOt+WPlueKtuaAgeaculxuICAqL1xuICBwcml2YXRlIF9nZXRTdGF0ZU1hY2hpbmUoY2FsbElkOiBzdHJpbmcpOiBSQ0NhbGxTdGF0ZU1hY2hpbmUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF07XG4gIH1cblxuICAvKipcbiAgICog5rOo5YaM55So5oi35L+h5oGvLCDlj5HpgIEgY2FsbCDmtojmga/ml7bnlKjmiLfkv6Hmga/mkLrluKZcbiAgICovXG4gIHJlZ2lzdGVyVXNlckluZm8odXNlckluZm86IElVc2VyUHJvZmlsZSkge1xuICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnXycsIGBbUkNDYWxsRW5naW5lXSByZWdpc3RlclVzZXJJbmZvIC0+IHVzZXJJbmZvOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJbmZvKX1gKTtcblxuICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLnJlZ2lzdGVyVXNlckluZm8odXNlckluZm8pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWNleWRvFxuICAgKiBAcGFyYW0gY2hhbm5lbElkIOe7hOe7hyBJRFxuICAgKiBAcGFyYW0gdGFyZ2V0SWQgIOWvueaWuSBJRFxuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOWqkuS9k+exu+Wei1xuICAgKiBAcGFyYW0gZXh0cmEg5raI5oGv5omp5bGV5L+h5oGvXG4gICAqIEBwYXJhbSBwdXNoQ29uZmlnIOaOqOmAgemFjee9rlxuICAgKi9cbiAgYXN5bmMgY2FsbChcbiAgICBjaGFubmVsSWQ6IHN0cmluZyxcbiAgICB0YXJnZXRJZDogc3RyaW5nLFxuICAgIG1lZGlhVHlwZTogbnVtYmVyLFxuICAgIGV4dHJhOiBzdHJpbmcgPSAnJyxcbiAgICBwdXNoQ29uZmlnOiBJUHVzaENvbmZpZyxcbiAgICBpc0Nyb3NzQXBwa2V5ID0gZmFsc2UsXG4gICk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHN0YXRlTWFjaGluZT86IFJDQ2FsbFN0YXRlTWFjaGluZSB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdfJywgYFtSQ0NhbGxFbmdpbmVdIGNhbGwgLT4gYXJnczogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjaGFubmVsSWQsIHRhcmdldElkLCBtZWRpYVR5cGUsIGV4dHJhLCBwdXNoQ29uZmlnLFxuICAgIH0pfWApO1xuICAgIGNvbnN0IGNhbGxJZCA9IGdlbmVyYXRlUmFuZG9tSWQoKTtcbiAgICBjb25zdCBoYXNTdGF0ZU1hY2hpbmUgPSBPYmplY3Qua2V5cyh0aGlzLl9zdGF0ZU1hY2hpbmUpLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc1N0YXRlTWFjaGluZSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNUQVRFX01BQ0hJTkVfRVhJVCB9O1xuICAgIH1cbiAgICB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSA9IG5ldyBSQ0NhbGxTdGF0ZU1hY2hpbmUoXG4gICAgICB0aGlzLl9jb250ZXh0LFxuICAgICAgdGhpcy5fcnVudGltZSxcbiAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICAgIHRoaXMuX2NhbGxNc2dIYW5kbGVyLFxuICAgICAgY2hhbm5lbElkLFxuICAgICAgQ29udmVyc2F0aW9uVHlwZS5QUklWQVRFLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjYWxsSWQsXG4gICAgKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLl9fY2FsbChbdGFyZ2V0SWRdLCBleHRyYSwgcHVzaENvbmZpZywgaXNDcm9zc0FwcGtleSk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyxcbiAgICAgICAgc3RhdGVNYWNoaW5lOiB0aGlzLl9zdGF0ZU1hY2hpbmVbY2FsbElkXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnvqTlkbxcbiAgICogQHBhcmFtIGNoYW5uZWxJZCDnu4Tnu4cgSURcbiAgICogQHBhcmFtIHRhcmdldElkICDnvqTnu4QgSURcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDlqpLkvZPnsbvlnotcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr6YKA6K+35Lq65ZGY5YiX6KGoXG4gICAqIEBwYXJhbSBleHRyYSDmtojmga/mianlsZXkv6Hmga9cbiAgICogQHBhcmFtIHB1c2hDb25maWcg5o6o6YCB6YWN572uXG4gICAqL1xuICBhc3luYyBjYWxsSW5Hcm91cChcbiAgICBjaGFubmVsSWQ6IHN0cmluZyxcbiAgICB0YXJnZXRJZDogc3RyaW5nLFxuICAgIG1lZGlhVHlwZTogbnVtYmVyLFxuICAgIHVzZXJJZHM6IHN0cmluZ1tdLFxuICAgIGV4dHJhOiBzdHJpbmcgPSAnJyxcbiAgICBwdXNoQ29uZmlnOiBJUHVzaENvbmZpZyxcbiAgKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc3RhdGVNYWNoaW5lPzogUkNDYWxsU3RhdGVNYWNoaW5lIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCBgW1JDQ2FsbEVuZ2luZV0gY2FsbEluR3JvdXAgLT4gYXJnczogJHtKU09OLnN0cmluZ2lmeSh7IGNoYW5uZWxJZCwgdGFyZ2V0SWQsIG1lZGlhVHlwZSB9KX1gKTtcbiAgICBjb25zdCBjYWxsSWQgPSBnZW5lcmF0ZVJhbmRvbUlkKCk7XG4gICAgY29uc3QgaGFzU3RhdGVNYWNoaW5lID0gT2JqZWN0LmtleXModGhpcy5fc3RhdGVNYWNoaW5lKS5sZW5ndGggPiAwO1xuICAgIGlmIChoYXNTdGF0ZU1hY2hpbmUpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVEFURV9NQUNISU5FX0VYSVQgfTtcbiAgICB9XG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0gPSBuZXcgUkNDYWxsU3RhdGVNYWNoaW5lKFxuICAgICAgdGhpcy5fY29udGV4dCxcbiAgICAgIHRoaXMuX3J1bnRpbWUsXG4gICAgICB0aGlzLl9sb2dnZXIsXG4gICAgICB0aGlzLl9jYWxsTXNnSGFuZGxlcixcbiAgICAgIGNoYW5uZWxJZCxcbiAgICAgIENvbnZlcnNhdGlvblR5cGUuR1JPVVAsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGNhbGxJZCxcbiAgICApO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc3RhdGVNYWNoaW5lW2NhbGxJZF0uX19jYWxsKHVzZXJJZHMsIGV4dHJhLCBwdXNoQ29uZmlnKTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTLFxuICAgICAgICBzdGF0ZU1hY2hpbmU6IHRoaXMuX3N0YXRlTWFjaGluZVtjYWxsSWRdLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmUgOavgeW9k+WJjeeahOeKtuaAgeaculxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ18nLCAnW1JDQ2FsbEVuZ2luZV0gZGVzdHJveScpO1xuICAgIHRoaXMuX3N0YXRlTWFjaGluZSA9IHt9O1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFJDQ2FsbEVuZ2luZSxcbiAgUkNDYWxsU3RhdGVNYWNoaW5lLCBSQ0NhbGxFcnJvckNvZGUsXG4gIFJDQ2FsbFVzZXJTdGF0ZSxcbiAgUkNDYWxsU2Vzc2lvblN0YXRlLFxuICBSQ0NhbGxFbmRSZWFzb24sXG4gIFJDQ2FsbE1lZGlhVHlwZSxcbiAgUkNDYWxsTGFuZ3VhZ2UsXG59O1xuXG5leHBvcnQgdHlwZSB7XG4gIElDYWxsU3RhdGVNYWNoaW5lV2F0Y2hlcnMsIElFbmRTdW1tYXJ5LFxuICBJQ2FsbEVuZ2luZVdhdGNoZXJzLFxuICBJVXNlclN0YXRlQ2hhbmdlSW5mbyxcbiAgSVN0YXRlQ2hhbmdlSW5mbyxcbiAgSVNlbmRlckluZm8sXG4gIElNZW1iZXJNb2RpZnlJbmZvLFxuICBJTWVkaWFNb2RpZnlJbmZvLFxuICBJSW52aXRlZFVzZXJzLFxuICBJVXNlckRhdGEsXG4gIElVc2VyUHJvZmlsZSxcbiAgSU9mZmxpbmVSZWNvcmQsXG4gIElJbnZpdGVPcHRpb25zLFxufTtcbiIsIi8qKlxuICog5Lqn55Sfc2Vzc2lvbueahOWcuuaZr1xuICovXG5leHBvcnQgZW51bSBQcm9kdWNlVHlwZXMge1xuICAvKipcbiAgICog5Li75Y+rXG4gICAqL1xuICBDQUxMRVIgPSAxLFxuXG4gIC8qKlxuICAgKiDooqvlj6tcbiAgICovXG4gIENBTExFRSA9IDJcbn1cbiIsImNsYXNzIEV2ZW50RW1pdHRlciB7XG4gIHByaXZhdGUgbGlzdDoge1twcm9wTmFtZTogc3RyaW5nXTogYW55W119ID0ge31cblxuICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgZnVuOihkYXRhPzphbnkpPT52b2lkKSB7XG4gICAgKHRoaXMubGlzdFtldmVudF0gfHwgKHRoaXMubGlzdFtldmVudF0gPSBbXSkpLnB1c2goZnVuKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBvbmNlKGV2ZW50OiBzdHJpbmcsIGZ1bjooZGF0YT86YW55KT0+dm9pZCkge1xuICAgIGNvbnN0IG9uID0gKGRhdGE/OmFueSkgPT4ge1xuICAgICAgdGhpcy5vZmYoZXZlbnQsIG9uKTtcbiAgICAgIGZ1bi5jYWxsKHRoaXMsIGRhdGEpO1xuICAgIH07XG4gICAgb24uZnVuID0gZnVuO1xuICAgIHRoaXMub24oZXZlbnQsIG9uKTtcbiAgfVxuXG4gIHB1YmxpYyBvZmYoZXZlbnQ6IHN0cmluZywgZnVuPzooZGF0YT86YW55KT0+dm9pZCkge1xuICAgIGNvbnN0IGZ1bnMgPSB0aGlzLmxpc3RbZXZlbnRdO1xuICAgIGlmICghZnVucykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWZ1bikge1xuICAgICAgLy8g5aaC5p6c5rKh5pyJ5LygIGZuIOeahOivne+8jOWwseS8muWwhiBldmVudCDlgLzlr7nlupTnvJPlrZjliJfooajkuK3nmoQgZnVuIOmDvea4heepulxuICAgICAgZnVucyAmJiAoZnVucy5sZW5ndGggPSAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6Iul5pyJIGZ1bu+8jOmBjeWOhue8k+WtmOWIl+ihqO+8jOeci+eci+S8oOWFpeeahCBmbiDkuI7lk6rkuKrlh73mlbDnm7jlkIzvvIzlpoLmnpznm7jlkIzlsLHnm7TmjqXku47nvJPlrZjliJfooajkuK3liKDmjonljbPlj69cbiAgICAgIGxldCBjYjtcbiAgICAgIGZvciAobGV0IGkgPSAwLCB7IGxlbmd0aCB9ID0gZnVuczsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNiID0gZnVuc1tpXTtcbiAgICAgICAgaWYgKGNiID09PSBmdW4gfHwgY2IuZnVuID09PSBmdW4pIHtcbiAgICAgICAgICBmdW5zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlbWl0KGV2ZW50OiBzdHJpbmcsIGRhdGE/OmFueSkge1xuICAgIC8vIOesrOS4gOS4quWPguaVsOaYr+WvueW6lOeahCBldmVudCDlgLzvvIznm7TmjqXnlKjmlbDnu4TnmoQgc2hpZnQg5pa55rOV5Y+W5Ye6XG4gICAgY29uc3QgZnVucyA9IFsuLi50aGlzLmxpc3RbZXZlbnRdXTtcblxuICAgIC8vIOWmguaenOe8k+WtmOWIl+ihqOmHjOayoeaciSBmdW4g5bCx6L+U5ZueIGZhbHNlXG4gICAgaWYgKCFmdW5zIHx8IGZ1bnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIOmBjeWOhiBldmVudCDlgLzlr7nlupTnmoTnvJPlrZjliJfooajvvIzkvp3mrKHmiafooYwgZm5cbiAgICBmdW5zLmZvckVhY2goKGZ1bikgPT4ge1xuICAgICAgZnVuLmNhbGwodGhpcywgZGF0YSk7XG4gICAgfSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIEV2ZW50RW1pdHRlcixcbn07XG4iLCJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgbmV3IEV2ZW50RW1pdHRlcigpO1xuIiwiaW1wb3J0IHtcbiAgUlRDSm9pblR5cGUsIExvZ0wsIGlzVW5kZWZpbmVkLCBpc0Jvb2xlYW4sIGlzU3RyaW5nLCBJaU9TUHVzaENvbmZpZyxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsRXJyb3JDb2RlLCBSQ0NhbGxMYW5ndWFnZSwgUkNDYWxsTWVkaWFUeXBlIH0gZnJvbSAnQHJjLWVtYmVkL2NhbGwtZW5naW5lJztcbmltcG9ydCB7IFJDUmVzb2x1dGlvbiB9IGZyb20gJ0Byb25nY2xvdWQvcGx1Z2luLXJ0Yyc7XG5cbmltcG9ydCB7XG4gIElTZXNzaW9uTGlzdGVuZXIsIElSQ0NhbGxJbml0T3B0aW9ucywgSVZhbGlkYXRpb25SZXN1bHQsIElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzLCBJUHVzaENvbmZpZyxcbn0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5mdW5jdGlvbiBpc0xhbmd1YWdlKHZhbDogc3RyaW5nKSB7XG4gIGNvbnN0IHZhbHVlczogc3RyaW5nW10gPSBPYmplY3QudmFsdWVzKFJDQ2FsbExhbmd1YWdlKTtcbiAgcmV0dXJuIHZhbHVlcy5pbmNsdWRlcyh2YWwpO1xufVxuXG5mdW5jdGlvbiBpc0pvaW5UeXBlKHZhbDogbnVtYmVyKSB7XG4gIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMoUlRDSm9pblR5cGUpIGFzIG51bWJlcltdO1xuICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHZhbCk7XG59XG5cbmZ1bmN0aW9uIGlzTG9nTGV2ZWwodmFsOiBudW1iZXIpIHtcbiAgcmV0dXJuIFtMb2dMLkRFQlVHLCBMb2dMLklORk8sIExvZ0wuV0FSTiwgTG9nTC5FUlJPUl0uaW5jbHVkZXModmFsKTtcbn1cblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQ2FsbEluaXRPcHRpb25zID0gKG9wdGlvbnM6IElSQ0NhbGxJbml0T3B0aW9ucyk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gbWlzc2luZyBwYXJhbWV0ZXIgLT4gb3B0aW9ucycgfTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcgfTtcbiAgfVxuICBjb25zdCBrZXlOYW1lczogc3RyaW5nW10gPSBbJ3J0Y0NsaWVudCcsICdvblNlc3Npb24nLCAnb25TZXNzaW9uQ2xvc2UnXTtcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgY29uc3QgbWlzc2luZ0tleXM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8g5qCh6aqM5aGr6aG55piv5ZCm6YO95YyF5ZCr77yM5aaC5p6c5ZOq5Liq5LiN5YyF5ZCr5bCx5pS26ZuG6LW35p2lXG4gIGtleU5hbWVzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIG1pc3NpbmdLZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIOWmguaenOe8uuWwkeW/heWhq+eahOebkeWQrOWHveaVsOaIluWvueixoVxuICBpZiAobWlzc2luZ0tleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiBgSW5pdGlhbGl6YXRpb24gbWlzc2luZyBwYXJhbWV0ZXIgLT4gXCIke21pc3NpbmdLZXlzLmpvaW4oJywnKX1cImAgfTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMucnRjQ2xpZW50ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ3J0Y0NsaWVudFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ29iamVjdFxcJycgfTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMub25TZXNzaW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnb25TZXNzaW9uXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBvcHRpb25zLm9uU2Vzc2lvbkNsb3NlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnb25TZXNzaW9uQ2xvc2VcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdmdW5jdGlvblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hmlzQWxsb3dTdWJzY3JpYmVSZXRyeSDkvYbkuI3mmK9ib29sZWFu57G75Z6LXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5pc0FsbG93U3Vic2NyaWJlUmV0cnkgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gXFwnaXNBbGxvd1N1YnNjcmliZVJldHJ5XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnYm9vbGVhblxcJycgfTtcbiAgfVxuXG4gIC8vIOWmguaenOS8oOS6hu+8jOS9huS4jeaYr2Jvb2xlYW7nsbvlnotcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmlzQWxsb3dQdWJsaXNoUmV0cnkgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmlzQWxsb3dQdWJsaXNoUmV0cnkgIT09ICdib29sZWFuJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2lzQWxsb3dQdWJsaXNoUmV0cnlcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdib29sZWFuXFwnJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqG77yM5L2G5LiN5pivYm9vbGVhbuexu+Wei1xuICBpZiAodHlwZW9mIG9wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUgIT09ICdib29sZWFuJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2lzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Jvb2xlYW5cXCcnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9SVENKb2luVHlwZeeahOaemuS4vlxuICBpZiAodHlwZW9mIG9wdGlvbnMuam9pblR5cGUgIT09ICd1bmRlZmluZWQnICYmICFpc0pvaW5UeXBlKG9wdGlvbnMuam9pblR5cGUhKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2pvaW5UeXBlXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgY29ycmVjdCB0eXBlJyB9O1xuICB9XG5cbiAgLy8g5aaC5p6c5Lyg5LqG77yM5L2G5LiN5pivYm9vbGVhbuexu+Wei1xuICBpZiAodHlwZW9mIG9wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0gIT09ICdib29sZWFuJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ2lzQWxsb3dEZW1vdGlvbkdldFN0cmVhbVxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Jvb2xlYW5cXCcnIH07XG4gIH1cblxuICAvLyDlpoLmnpzkvKDkuobvvIzkvYbkuI3mmK9SQ0NhbGxMYW5ndWFnZeeahOaemuS4vlxuICBpZiAodHlwZW9mIG9wdGlvbnMubGFuZyAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzTGFuZ3VhZ2Uob3B0aW9ucy5sYW5nISkpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdsYW5nXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgY29ycmVjdCB0eXBlJyB9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmxvZ091dHB1dExldmVsICE9PSAndW5kZWZpbmVkJyAmJiAhaXNMb2dMZXZlbChvcHRpb25zLmxvZ091dHB1dExldmVsISkpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBcXCdsb2dPdXRwdXRMZXZlbFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGNvcnJlY3QgdHlwZScgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbn07XG5cbi8qKlxuICog5qCh6aqMcmVnaXN0ZXJTZXNzaW9uTGlzdGVuZXLlj4LmlbBcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTGlzdGVuZXIgPSAobGlzdGVuZXI6IElTZXNzaW9uTGlzdGVuZXIpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICghbGlzdGVuZXIpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdtaXNzaW5nIHBhcmFtZXRlciAtPiBsaXN0ZW5lcicgfTtcbiAgfVxuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ2xpc3RlbmVyIG11c3QgYmUgYW4gb2JqZWN0JyB9O1xuICB9XG4gIGNvbnN0IGtleU5hbWVzOiBzdHJpbmdbXSA9IFsnb25SaW5naW5nJywgJ29uQWNjZXB0JywgJ29uSHVuZ3VwJywgJ29uVHJhY2tSZWFkeSddO1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGxpc3RlbmVyKTtcbiAgY29uc3QgbWlzc2luZ0tleXM6IHN0cmluZ1tdID0gW107XG4gIGtleU5hbWVzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIG1pc3NpbmdLZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gIH0pO1xuICBpZiAobWlzc2luZ0tleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiBgbWlzc2luZyBwYXJhbWV0ZXIgLT4gXCIke21pc3NpbmdLZXlzLmpvaW4oJywnKX1cImAgfTtcbiAgfVxuICBpZiAodHlwZW9mIGxpc3RlbmVyLm9uUmluZ2luZyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ29uUmluZ2luZ1xcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIub25BY2NlcHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdvbkFjY2VwdFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIub25IdW5ndXAgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdvbkh1bmd1cFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ2Z1bmN0aW9uXFwnJyB9O1xuICB9XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIub25UcmFja1JlYWR5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnb25UcmFja1JlYWR5XFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnZnVuY3Rpb25cXCcnIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG59O1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVUYXJnZXRJZCA9ICh0YXJnZXRJZDogc3RyaW5nKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAodGFyZ2V0SWQgJiYgdHlwZW9mIHRhcmdldElkID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xuICB9XG4gIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ3RhcmdldElkXFwnIHBhcmFtZXRlciBpcyByZXF1aXJlZCwgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZU1lZGlhVHlwZSA9IChtZWRpYVR5cGU6IG51bWJlcik6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPIHx8IG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnbWVkaWFUeXBlXFwnIHBhcmFtZXRlciBpcyByZXF1aXJlZCwgbXVzdCBiZSBvZiB0eXBlIFxcJ1JDQ2FsbE1lZGlhVHlwZVxcJycgfTtcbn07XG5leHBvcnQgY29uc3QgdmFsaWRhdGVFeHRyYSA9IChleHRyYTogc3RyaW5nKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAodHlwZW9mIGV4dHJhID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IHJlc3VsdDogdHJ1ZSB9O1xuICB9XG4gIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ2V4dHJhXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xufTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVB1c2hUaXRsZSA9IChwdXNoVGl0bGU6IHN0cmluZyk6IElWYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgaWYgKHR5cGVvZiBwdXNoVGl0bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwncHVzaFRpdGxlXFwnIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xufTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVB1c2hDb250ZW50ID0gKHB1c2hDb250ZW50OiBzdHJpbmcpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmICh0eXBlb2YgcHVzaENvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwncHVzaENvbnRlbnRcXCcgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG59O1xuXG4vKipcbiAqIOagoemqjCBwdXNoQ29uZmlnXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVB1c2hDb25maWcgPSAocHVzaENvbmZpZzogSVB1c2hDb25maWcpID0+IHtcbiAgY29uc3QgcHVzaENvbmZpZ0tleXMgPSBbJ3B1c2hUaXRsZScsICdwdXNoQ29udGVudCcsICdwdXNoRGF0YScsICdpT1NDb25maWcnLCAnYW5kcm9pZENvbmZpZycsICdkaXNhYmxlUHVzaFRpdGxlJywgJ3RlbXBsYXRlSWQnXTtcbiAgY29uc3Qga2V5SXNSaWdodCA9IE9iamVjdC5rZXlzKHB1c2hDb25maWcpLmV2ZXJ5KChrZXkpID0+IHB1c2hDb25maWdLZXlzLmluY2x1ZGVzKGtleSkpO1xuICBpZiAoIWtleUlzUmlnaHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgZXJyb3JNc2c6IGByaWdodCBrZXk6ICR7cHVzaENvbmZpZ0tleXMuam9pbignLCcpfWAsXG4gICAgfTtcbiAgfVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBwdXNoQ29uZmlnS2V5cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBrZXkgPSBwdXNoQ29uZmlnS2V5c1tpbmRleF07XG4gICAgLyoqXG4gICAgICog5qCh6aqMIGJvb2xlYW4g57G75Z6LXG4gICAgICovXG4gICAgaWYgKGtleSA9PT0gJ2Rpc2FibGVQdXNoVGl0bGUnKSB7XG4gICAgICBpZiAoIWlzVW5kZWZpbmVkKHB1c2hDb25maWdba2V5XSkgJiYgIWlzQm9vbGVhbihwdXNoQ29uZmlnW2tleV0pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgICAgIGVycm9yTXNnOiBgJHtrZXl9IHR5cGUgaXMgYm9vbGVhbmAsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdwdXNoVGl0bGUnXG4gICAgICB8fCBrZXkgPT09ICd0ZW1wbGF0ZUlkJykge1xuICAgICAgLyoqXG4gICAgICAgKiDmoKHpqowgc3RyaW5nIOexu+Wei1xuICAgICAgICovXG4gICAgICBpZiAocHVzaENvbmZpZ1trZXldICYmICFpc1N0cmluZyhwdXNoQ29uZmlnW2tleV0pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgICAgIGVycm9yTXNnOiBgJHtrZXl9IHR5cGUgaXMgc3RyaW5nYCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgeyBpT1NDb25maWcsIGFuZHJvaWRDb25maWcgfSA9IHB1c2hDb25maWc7XG5cbiAgLyoqXG4gICAqIOagoemqjCBpT1NDb25maWdcbiAgICovXG4gIGNvbnN0IHZhbGlkYXRlSU9TQ29uZmlnUmVzID0gdmFsaWRhdGVJT1NDb25maWcoaU9TQ29uZmlnIHx8IHt9KTtcbiAgaWYgKHZhbGlkYXRlSU9TQ29uZmlnUmVzLmNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlSU9TQ29uZmlnUmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIOagoemqjCBhbmRyb2lkQ29uZmlnXG4gICAqL1xuICBjb25zdCB2YWxpZGF0ZUFuZHJvaWRDb25maWdSZXMgPSB2YWxpZGF0ZUFuZHJvaWRDb25maWcoYW5kcm9pZENvbmZpZyB8fCB7fSk7XG4gIGlmICh2YWxpZGF0ZUFuZHJvaWRDb25maWdSZXMuY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVBbmRyb2lkQ29uZmlnUmVzO1xuICB9XG5cbiAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbn07XG5cbmNvbnN0IHZhbGlkYXRlSU9TQ29uZmlnID0gKGlPU0NvbmZpZzogSWlPU1B1c2hDb25maWcpID0+IHtcbiAgY29uc3QgeyB0aHJlYWRJZCwgcmljaE1lZGlhVXJpIH0gPSBpT1NDb25maWcgfHwge307XG4gIGlmICh0aHJlYWRJZCAmJiAhaXNTdHJpbmcodGhyZWFkSWQpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5QQVJBTV9FUlJPUixcbiAgICAgIGVycm9yTXNnOiAnaU9TQ29uZmlnLnRocmVhZElkIHR5cGUgaXMgc3RyaW5nJyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJpY2hNZWRpYVVyaSAmJiAhaXNTdHJpbmcocmljaE1lZGlhVXJpKSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuUEFSQU1fRVJST1IsXG4gICAgICBlcnJvck1zZzogJ2lPU0NvbmZpZy5yaWNoTWVkaWFVcmkgdHlwZSBpcyBzdHJpbmcnLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbn07XG5cbmNvbnN0IHZhbGlkYXRlQW5kcm9pZENvbmZpZyA9IChhbmRyb2lkQ29uZmlnOiBhbnkpID0+IHtcbiAgY29uc3QgYW5kcm9pZENvbmZpZ0tleXMgPSBbJ25vdGlmaWNhdGlvbklkJywgJ2NoYW5uZWxJZE1pJywgJ21pTGFyZ2VJY29uVXJsJywgJ2NoYW5uZWxJZEhXJywgJ2NhdGVnb3J5SFcnLCAnaW1wb3J0YW5jZUhXJywgJ2ltYWdlVXJsSFcnLCAnY2hhbm5lbElkT1BQTycsICd0eXBlVml2bycsICdjYXRlZ29yeVZpdm8nLCAnZmNtQ2hhbm5lbElkJywgJ2ZjbUNvbGxhcHNlS2V5JywgJ2ZjbUltYWdlVXJsJywgJ2ltcG9ydGFuY2VIb25vcicsICdpbWFnZVVybEhvbm9yJ107XG4gIGNvbnN0IGtleUlzUmlnaHQgPSBPYmplY3Qua2V5cyhhbmRyb2lkQ29uZmlnKS5ldmVyeSgoa2V5KSA9PiBhbmRyb2lkQ29uZmlnS2V5cy5pbmNsdWRlcyhrZXkpKTtcbiAgaWYgKCFrZXlJc1JpZ2h0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5QQVJBTV9FUlJPUixcbiAgICAgIGVycm9yTXNnOiBgcmlnaHQga2V5OiAke2FuZHJvaWRDb25maWdLZXlzLmpvaW4oJywnKX1gLFxuICAgIH07XG4gIH1cblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYW5kcm9pZENvbmZpZ0tleXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3Qga2V5ID0gYW5kcm9pZENvbmZpZ0tleXNbaW5kZXhdO1xuICAgIGlmIChrZXkgPT09ICdpbXBvcnRhbmNlSFcnIHx8IGtleSA9PT0gJ2ltcG9ydGFuY2VIb25vcicpIHtcbiAgICAgIGlmIChhbmRyb2lkQ29uZmlnW2tleV0gJiYgYW5kcm9pZENvbmZpZ1trZXldICE9PSAnTE9XJyAmJiBhbmRyb2lkQ29uZmlnW2tleV0gIT09ICdOT1JNQUwnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgICAgIGVycm9yTXNnOiBgYW5kcm9pZENvbmZpZy4ke2tleX0gdmFsdWUgaXMgTk9STUFMfExPV2AsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhbmRyb2lkQ29uZmlnW2tleV0gJiYgIWlzU3RyaW5nKGFuZHJvaWRDb25maWdba2V5XSkpIHtcbiAgICAgIC8qKlxuICAgICAgICog5qCh6aqMIHN0cmluZyDnsbvlnotcbiAgICAgICAqL1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogUkNDYWxsRXJyb3JDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgICBlcnJvck1zZzogYGFuZHJvaWRDb25maWcuJHtrZXl9IHR5cGUgaXMgc3RyaW5nYCxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG59O1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVVc2VySWRzID0gKHVzZXJJZHM6IHN0cmluZ1tdKTogSVZhbGlkYXRpb25SZXN1bHQgPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodXNlcklkcykpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCd1c2VySWRzXFwnIHBhcmFtZXRlciBpcyByZXF1aXJlZCwgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1tdXFwnJyB9O1xuICB9XG4gIGlmICghdXNlcklkcy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCd1c2VySWRzXFwnIHBhcmFtZXRlciBpcyByZXF1aXJlZCwgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1tdXFwnJyB9O1xuICB9XG4gIGlmICghdXNlcklkcy5ldmVyeSgoc3RyKSA9PiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyAmJiBzdHIubGVuZ3RoID4gMCkpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCd1c2VySWRzXFwnIHBhcmFtZXRlciBpcyByZXF1aXJlZCcgfTtcbiAgfVxuICByZXR1cm4geyByZXN1bHQ6IHRydWUgfTtcbn07XG5cbmZ1bmN0aW9uIGlzUkNGcmFtZVJhdGUodmFsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYXJycyA9IFsnRlBTXzEwJywgJ0ZQU18xNScsICdGUFNfMjQnLCAnRlBTXzMwJ107XG4gIHJldHVybiBhcnJzLmluY2x1ZGVzKHZhbCk7XG59XG5cbmNvbnN0IGlzVmFsaWRSZXNvbHV0aW9uID0gKHJlc29sdXRpb24/OiBSQ1Jlc29sdXRpb24pOiBib29sZWFuID0+ICEhUkNSZXNvbHV0aW9uW3Jlc29sdXRpb24hXTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTWVkaWFTdHJlYW1Db25zdHJhaW50cyA9IChjb25zdHJhaW50czogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBJVmFsaWRhdGlvblJlc3VsdCA9PiB7XG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy5hdWRpbyAmJiB0eXBlb2YgY29uc3RyYWludHMuYXVkaW8ubWljcGhvbmVJZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnN0cmFpbnRzLmF1ZGlvLm1pY3Bob25lSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMuYXVkaW8ubWljcGhvbmVJZFxcJyBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xuICB9XG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy5hdWRpbyAmJiB0eXBlb2YgY29uc3RyYWludHMuYXVkaW8uc2FtcGxlUmF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnN0cmFpbnRzLmF1ZGlvLnNhbXBsZVJhdGUgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMuYXVkaW8uc2FtcGxlUmF0ZVxcJyBtdXN0IGJlIG9mIHR5cGUgXFwnbnVtYmVyXFwnJyB9O1xuICB9XG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8uY2FtZXJhSWQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zdHJhaW50cy52aWRlby5jYW1lcmFJZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdjb25zdHJhaW50cy52aWRlby5jYW1lcmFJZFxcJyBtdXN0IGJlIG9mIHR5cGUgXFwnc3RyaW5nXFwnJyB9O1xuICB9XG4gIC8vIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8uZmFjZU1vZGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnN0cmFpbnRzLnZpZGVvLmNhbWVyYUlkICE9PSAndXNlcicgJiYgY29uc3RyYWludHMudmlkZW8uZmFjZU1vZGUgIT09ICdlbnZpcm9ubWVudCcpIHtcbiAgLy8gICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdjb25zdHJhaW50cy52aWRlby5jYW1lcmFJZFxcJyBtdXN0IGJlICBcXCd1c2VyXFwnIG9yIFxcJ2Vudmlyb25tZW50XFwnJyB9XG4gIC8vIH1cblxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGVcXCcgbXVzdCBiZSBvZiB0eXBlIFxcJ3N0cmluZ1xcJycgfTtcbiAgfVxuXG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlICE9PSAndW5kZWZpbmVkJyAmJiAhaXNSQ0ZyYW1lUmF0ZShjb25zdHJhaW50cy52aWRlby5mcmFtZVJhdGUpKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnZnJhbWVSYXRlXFwnIHZhbHVlIGlzIG91dCBvZiByYW5nZScgfTtcbiAgfVxuXG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiB0eXBlb2YgY29uc3RyYWludHMudmlkZW8ucmVzb2x1dGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgbXNnOiAnXFwnY29uc3RyYWludHMudmlkZW8uZnJhbWVSYXRlXFwnIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnIH07XG4gIH1cblxuICBpZiAoY29uc3RyYWludHMgJiYgY29uc3RyYWludHMudmlkZW8gJiYgdHlwZW9mIGNvbnN0cmFpbnRzLnZpZGVvLnJlc29sdXRpb24gIT09ICd1bmRlZmluZWQnICYmICFpc1ZhbGlkUmVzb2x1dGlvbihjb25zdHJhaW50cy52aWRlby5yZXNvbHV0aW9uKSkge1xuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIG1zZzogJ1xcJ3Jlc29sdXRpb25cXCcgdmFsdWUgaXMgb3V0IG9mIHJhbmdlJyB9O1xuICB9XG4gIGlmIChjb25zdHJhaW50cyAmJiBjb25zdHJhaW50cy52aWRlbyAmJiAoIWNvbnN0cmFpbnRzLnZpZGVvLmZyYW1lUmF0ZSB8fCAhY29uc3RyYWludHMudmlkZW8ucmVzb2x1dGlvbikpIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCBtc2c6ICdcXCdyZXNvbHV0aW9uXFwnIGFuZCBcXCdyZXNvbHV0aW9uXFwnIGlzIHJlcXVpcmVkJyB9O1xuICB9XG5cbiAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlIH07XG59O1xuIiwiZXhwb3J0IGNvbnN0IHRpbWVyU2V0VGltZW91dCA9IChmdW5jOiBGdW5jdGlvbiwgdGltZW91dDogbnVtYmVyKTogbnVtYmVyID0+IHNldFRpbWVvdXQoZnVuYywgdGltZW91dCkgYXMgbnVtYmVyO1xuIiwiaW1wb3J0IHsgdGltZXJTZXRUaW1lb3V0IH0gZnJvbSAnLi9oZWxwZXInO1xuXG5leHBvcnQgY2xhc3MgVGltZXIge1xuICBwcml2YXRlIF90aW1lcklkOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSBfc3RhcnRUaW1lOiBudW1iZXIgPSAwXG5cbiAgY29uc3RydWN0b3IoY2FsbGJhY2s6IEZ1bmN0aW9uLCB0aW1lb3V0OiBudW1iZXIpIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX3RpbWVySWQgPSB0aW1lclNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuICAgIHRoaXMuX3N0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gIH1cblxuICBzdG9wKCk6IHtcbiAgICBzdGFydFRpbWU6IG51bWJlcixcbiAgICBlbmRUaW1lOiBudW1iZXIsXG4gICAgZHVyYXRpb246IG51bWJlclxuICAgIH0ge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcklkKTtcblxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxldCBkdXJhdGlvbiA9IGVuZFRpbWUgLSB0aGlzLl9zdGFydFRpbWU7XG4gICAgaWYgKHRoaXMuX3N0YXJ0VGltZSA9PT0gMCkge1xuICAgICAgZHVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGFydFRpbWU6IHRoaXMuX3N0YXJ0VGltZSxcbiAgICAgIGVuZFRpbWUsXG4gICAgICBkdXJhdGlvbixcbiAgICB9O1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gMDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29udmVyc2F0aW9uVHlwZSwgSUxvZ2dlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIElNZWRpYU1vZGlmeUluZm8sXG4gIElNZW1iZXJNb2RpZnlJbmZvLFxuICBJU2VuZGVySW5mbyxcbiAgSVN0YXRlQ2hhbmdlSW5mbyxcbiAgSVVzZXJEYXRhLFxuICBJVXNlclN0YXRlQ2hhbmdlSW5mbyxcbiAgSUludml0ZU9wdGlvbnMsXG4gIFJDQ2FsbEVuZFJlYXNvbixcbiAgUkNDYWxsRXJyb3JDb2RlLFxuICBSQ0NhbGxNZWRpYVR5cGUsXG4gIFJDQ2FsbFNlc3Npb25TdGF0ZSxcbiAgUkNDYWxsU3RhdGVNYWNoaW5lLFxuICBSQ0NhbGxVc2VyU3RhdGUsXG59IGZyb20gJ0ByYy1lbWJlZC9jYWxsLWVuZ2luZSc7XG5pbXBvcnQge1xuICBJUkNSVENTdGF0ZVJlcG9ydCxcbiAgUkNLaWNrUmVhc29uLFxuICBSQ0xvY2FsVHJhY2ssXG4gIFJDUmVtb3RlQXVkaW9UcmFjayxcbiAgUkNSZW1vdGVUcmFjayxcbiAgUkNSZW1vdGVWaWRlb1RyYWNrLFxuICBSQ1JUQ0NsaWVudCxcbiAgUkNSVENDb2RlLFxuICBSQ1JUQ1BpbmdSZXN1bHQsXG4gIFJDUlRDUm9vbSxcbiAgSU1pY3Bob25lQXVkaW9Qcm9maWxlLFxufSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuXG5pbXBvcnQgeyBQcm9kdWNlVHlwZXMgfSBmcm9tICcuL2VudW1zJztcblxuaW1wb3J0IHtcbiAgSURldmljZUNoYW5nZVBhcmFtcyxcbiAgSU1lZGlhU3RyZWFtQ29uc3RyYWludHMsXG4gIElNdXRlVXNlcixcbiAgSVJDQ2FsbFNlc3Npb25PcHRpb25zLFxuICBJU2Vzc2lvbkxpc3RlbmVyLFxuICBJVmFsaWRhdGlvblJlc3VsdCxcbn0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IGV2ZW50RW1pdHRlciBmcm9tICcuL2V2ZW50RW1pdHRlcic7XG5pbXBvcnQge1xuICB2YWxpZGF0ZUxpc3RlbmVyLCB2YWxpZGF0ZU1lZGlhU3RyZWFtQ29uc3RyYWludHMsIHZhbGlkYXRlVXNlcklkcywgdmFsaWRhdGVFeHRyYSwgdmFsaWRhdGVQdXNoVGl0bGUsIHZhbGlkYXRlUHVzaENvbnRlbnQsIHZhbGlkYXRlUHVzaENvbmZpZyxcbn0gZnJvbSAnLi92YWxpZGF0aW9uJztcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSAnLi90aW1lcic7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxTZXNzaW9uIHtcbiAgLyoqXG4gICAqIFJUQ+aIv+mXtOWunuS+i1xuICAgKi9cbiAgcHJpdmF0ZSBfcm9vbSE6IFJDUlRDUm9vbVxuXG4gIC8qKlxuICAgKiDnlKjmiLfkvKDov5vmnaXnmoQg5a+5c2Vzc2lvbueahOebkeWQrCAo6KaB5ZyoUkNDYWxsQ2xpZW5055qEX29uSW52aXRl6YeM5Yik5pat77yM6KaB5rGC5omn6KGM5a6Mb25TZXNzaW9u5b+F6aG75rOo5YaMc2Vzc2lvbueahOebkeWQrO+8jOaJgOS7pei/memHjOaYr3B1YmxpYylcbiAgICovXG4gIHB1YmxpYyBfbGlzdGVuZXI6IElTZXNzaW9uTGlzdGVuZXIgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiBSVEPorqLpmIXjgIHlj5HluIPph43or5XnmoTmrKHmlbBcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX1JFVFJZQ09VTlQ6IG51bWJlciA9IDJcblxuICAvKipcbiAgICog5Yqg5YWl5oi/6Ze05a6a5pe25ZmoXG4gICAqL1xuXG4gIHByaXZhdGUgam9pblJvb21UaW1lcjogYW55ID0gbnVsbFxuXG4gIGNvbnN0cnVjdG9yKFxuXG4gICAgLyoqXG4gICAgICog54q25oCB5py65a6e5L6LXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc3RhdGVNYWNoaW5lOiBSQ0NhbGxTdGF0ZU1hY2hpbmUsXG5cbiAgICAvKipcbiAgICAgKiBydGPlrp7kvotcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydGNDbGllbnQ6IFJDUlRDQ2xpZW50LFxuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBJTG9nZ2VyLFxuXG4gICAgLyoqXG4gICAgICogc2Vzc2lvbueahOWFtuWug+mAiemhuVxuICAgICAqL1xuICAgIHByaXZhdGUgX29wdGlvbnM6IElSQ0NhbGxTZXNzaW9uT3B0aW9ucyA9IHt9LFxuXG4gICkge1xuICAgIC8vIOebkeWQrOeKtuaAgeaculxuICAgIHRoaXMuX3N0YXRlTWFjaGluZS5yZWdpc3RlckV2ZW50TGlzdGVuZXIoe1xuICAgICAgLyoqXG4gICAgICAgKiDnlKjmiLfnirbmgIHlj5jmm7RcbiAgICAgICAqIEBwYXJhbSBpbmZvXG4gICAgICAgKi9cbiAgICAgIG9uVXNlclN0YXRlQ2hhbmdlOiAoeyB1c2VyLCByZWFzb24gfTogSVVzZXJTdGF0ZUNoYW5nZUluZm8pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25Vc2VyU3RhdGVDaGFuZ2VdIHVzZXJJZC0+JHt1c2VyPy51c2VySWR9IHN0YXRlLT4ke3VzZXI/LnN0YXRlfSByZWFzb24tPiR7cmVhc29ufWApO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiDmiL/pl7TnirbmgIHlj5jmm7RcbiAgICAgICAqIEBwYXJhbVxuICAgICAgICovXG4gICAgICBvblN0YXRlQ2hhbmdlOiBhc3luYyAoaW5mbzogSVN0YXRlQ2hhbmdlSW5mbykgPT4ge1xuICAgICAgICBjb25zdCB7IHN0YXRlLCByZWFzb24gfSA9IGluZm87XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uU3RhdGVDaGFuZ2VdIDogc3RhdGUtPiR7c3RhdGV9IHJlYXNvbi0+JHtyZWFzb259YCk7XG5cbiAgICAgICAgLy8g5aaC5p6c5Zyo6YCa6K+d5Lit77yM5bCx5Yqg5oi/6Ze0XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gUkNDYWxsU2Vzc2lvblN0YXRlLktFRVBJTkcpIHtcbiAgICAgICAgICBjb25zdCByb29tSWQ6IHN0cmluZyA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRDYWxsSWQoKTtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblN0YXRlQ2hhbmdlXSByb29tSWQ6ICR7cm9vbUlkfWApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDliqDmiL/pl7RcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2pvaW5Sb29tKHJvb21JZCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SKTtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBvblN0YXRlQ2hhbmdlXSBqb2luUm9vbSB0aHJvdyBleGNlcHRpb24gcm9vbUlkIC0+ICR7cm9vbUlkfWApO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogIOS7peS4i+S4ieadoeWPquimgea7oei2s+S4gOadoe+8jOeKtuaAgeS8muWPmOaIkFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkRcbiAgICAgICAgICAgKiAgMeOAgeacrOerr+eUqOaIt+iHquW3seS4u+WKqOaMguaWrVxuICAgICAgICAgICAqICAy44CB5pyN5Yqh56uv5oqK5pys56uv55So5oi36Lii5Ye6UlRD5oi/6Ze0XG4gICAgICAgICAgICogIDPjgIHmiL/pl7Tph4zlsI/kuo4y5Liq5Lq6XG4gICAgICAgICAgICovXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQpIHtcbiAgICAgICAgICAvLyDov5jmnKrliqDlhaXmiL/pl7TlsLHmjILmlq1cbiAgICAgICAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgICAgICAgIC8vIOmUgOavgeacrOWcsOa1ge+8jOWFs+mXreaRhOWDj+WktFxuICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9kZXN0cm95VHJhY2tzKHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MpO1xuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeUluZm8gPSB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0U3VtbWFyeSgpO1xuICAgICAgICAgICAgZXZlbnRFbWl0dGVyLmVtaXQoJ3Nlc3Npb25DbG9zZScsIHsgc2Vzc2lvbjogdGhpcywgc3VtbWFyeUluZm8gfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9kZXN0cm95VHJhY2tzKHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MpO1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uU3RhdGVDaGFuZ2VdIGxvY2FsVHJhY2tzIGRlc3Ryb3llZCcpO1xuICAgICAgICAgIHRoaXMuX2xlYXZlUm9vbSgpO1xuICAgICAgICAgIHRoaXMuX3Jvb20gPSBudWxsIGFzIHVua25vd24gYXMgUkNSVENSb29tO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOWTjemTg1xuICAgICAgICogQHBhcmFtIHNlbmRlciDlj5HotbfnlKjmiLfkv6Hmga9cbiAgICAgICAqL1xuICAgICAgb25SaW5naW5nOiAoc2VuZGVyOiBJU2VuZGVySW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblJpbmdpbmddc2VuZGVyOiBzZW5kZXIudXNlcklkIC0+ICR7c2VuZGVyLnVzZXJJZH1gKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIOmAmuefpeeUqOaIt+WTjemTg1xuICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblJpbmdpbmcoc2VuZGVyLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25SaW5naW5nXSBtZXRob2QgZXhjZXB0aW9uIC0+IG9uUmluZ2luZycpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAgICog5b2T6L+c56uv55So5oi35ZCM5oSP5o6l5ZCsXG4gICAgICAgICAqL1xuICAgICAgb25BY2NlcHQ6IChzZW5kZXI6IElTZW5kZXJJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uQWNjZXB0XXNlbmRlcjogc2VuZGVyLnVzZXJJZCAtPiAke3NlbmRlci51c2VySWR9YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8g6YCa55+l5pys56uv77yM6L+c56uv55So5oi35bey5o6l5ZCsXG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uQWNjZXB0KHNlbmRlciwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uQWNjZXB0XSBtZXRob2QgZXhjZXB0aW9uIC0+IG9uQWNjZXB0Jyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICAgKiDlvZPmnInov5znq6/nlKjmiLfmjILmlq1cbiAgICAgICAgICovXG4gICAgICBvbkh1bmd1cDogKHNlbmRlcjogSVNlbmRlckluZm8sIHJlYXNvbjogUkNDYWxsRW5kUmVhc29uKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIG9uSHVuZ3VwXXNlbmRlcjogc2VuZGVyLnVzZXJJZCAtPiAke3NlbmRlci51c2VySWR9IHJlYXNvbi0+JHtyZWFzb259YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8g6YCa55+l5pys56uv77yM6L+c56uv55So5oi35bey5oyC5patXG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uSHVuZ3VwKHNlbmRlciwgcmVhc29uLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25IdW5ndXBdIG1ldGhvZCBleGNlcHRpb24gLT4gb25IdW5ndXAnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiDmlLbliLDkurrlkZjlj5jmm7RcbiAgICAgICAqIEBwYXJhbSBzZW5kZXIg5Y+R6LW355So5oi35L+h5oGvXG4gICAgICAgKi9cbiAgICAgIG9uTWVtYmVyTW9kaWZ5OiAoeyBzZW5kZXIsIGludml0ZWRVc2VycyB9OiBJTWVtYmVyTW9kaWZ5SW5mbykgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvbk1lbWJlck1vZGlmeV0gc2VuZGVyLnVzZXJJZCAtPiAke3NlbmRlci51c2VySWR9YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8g6YCa55+l55So5oi35Lq65ZGY5Y+Y5pu0XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uTWVtYmVyTW9kaWZ5KHNlbmRlciwgaW52aXRlZFVzZXJzLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25NZW1iZXJNb2RpZnldIG1ldGhvZCBleGNlcHRpb24gLT4gb25NZW1iZXJNb2RpZnknKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiDmlLbliLDpgJror53nsbvlnovlj5jmm7QgKOmAmuivnemZjee6pylcbiAgICAgICAqIEBwYXJhbSBzZW5kZXIg5Y+R6LW355So5oi35L+h5oGvXG4gICAgICAgKi9cbiAgICAgIG9uTWVkaWFNb2RpZnk6ICh7IHNlbmRlciwgbWVkaWFUeXBlIH06IElNZWRpYU1vZGlmeUluZm8pID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25NZWRpYU1vZGlmeV1zZW5kZXI6IHNlbmRlci51c2VySWQgLT4gJHtzZW5kZXIudXNlcklkfSBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfWApO1xuICAgICAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8pIHtcbiAgICAgICAgICAvLyDov5znq6/mlLbliLDpgJror53pmY3nuqfpgJrnn6XlkI7vvIzov5znq6/miafooYzpmY3nuqfpgJror50o5LiN5Y+R5raI5oGvKVxuICAgICAgICAgIHRoaXMuX3NldE1lZGlhVHlwZVRvQXVkaW8oKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vbk1lZGlhTW9kaWZ5KHNlbmRlciwgbWVkaWFUeXBlLCB0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25NZWRpYU1vZGlmeV0gbWV0aG9kIGV4Y2VwdGlvbiAtPiBvbk1lZGlhTW9kaWZ5Jyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIOaYr+WQpui3qGFwcGtleVxuICAgICAgICogQHBhcmFtIHNlbmRlciDlj5HotbfnlKjmiLfkv6Hmga9cbiAgICAgICAqL1xuICAgICAgY3Jvc3NBcHBrZXk6IChpc0Nyb3NzQXBwa2V5OiBib29sZWFuKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGNyb3NzQXBwa2V5XSDmmK/lkKbot6ggYXBwa2V5OiAke2lzQ3Jvc3NBcHBrZXl9YCk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMuaXNDcm9zc0FwcGtleSA9IGlzQ3Jvc3NBcHBrZXk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICog6K6+572u5oyC5pat55qE5o6o6YCB5L+h5oGvXG4gICAgICovXG4gICAgdGhpcy5fc3RhdGVNYWNoaW5lLnNldEh1bmd1cFB1c2hDb25maWcodGhpcy5fb3B0aW9ucy5odW5ndXBQdXNoQ29uZmlnIHx8IHsgcHVzaFRpdGxlOiAnJywgcHVzaENvbnRlbnQ6ICcnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICDliqDlhaXmiL/pl7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2pvaW5Sb29tKHJvb21JZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgbGV0IGNhbGxCYWNrO1xuICAgIHRyeSB7XG4gICAgICAvLyDliqDmiL/pl7RcbiAgICAgIGlmICh0aGlzLl9vcHRpb25zLmlzQ3Jvc3NBcHBrZXkpIHtcbiAgICAgICAgY2FsbEJhY2sgPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuam9pbkNyb3NzUlRDUm9vbShyb29tSWQsIHRoaXMuX29wdGlvbnMuam9pblR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbEJhY2sgPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuam9pblJUQ1Jvb20ocm9vbUlkLCB0aGlzLl9vcHRpb25zLmpvaW5UeXBlKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBjb2RlLCB1c2VySWRzLCByb29tIH0gPSBjYWxsQmFjaztcblxuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIC8vIOWmguaenOmfs+inhumikeacjeWKoeacquW8gOmAmlxuICAgICAgICBpZiAoY29kZSA9PT0gUkNSVENDb2RlLk5PVF9PUEVOX1ZJREVPX0FVRElPX1NFUlZFUikge1xuICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5TRVJWSUNFX05PVF9PUEVORUQpO1xuICAgICAgICAgIC8vIOW3seaWueWFtuS7luerr+W3suWcqOmAmuivneS4rVxuICAgICAgICB9IGlmIChjb2RlID09PSBSQ1JUQ0NvZGUuU0lHTkFMX0pPSU5fUlRDX1JPT01fUkVGVVNFRCkge1xuICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5PVEhFUl9DTElFTlRfSU5fQ0FMTCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLk5FVFdPUktfRVJST1IpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbENsaWVudCBfam9pblJvb21dIGpvaW4gcm9vbSBmYWlsZWQ6IHJvb21JZCAtPiAke3Jvb21JZH0gUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkpPSU5fUk9PTV9FUlJPUiB9O1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIOe+pOiBiuacrOerr+WKoOWFpeaIv+mXtOWQju+8jOabtOaWsOS6uuWRmOeKtuaAgeS4uumAmuivneS4rVxuICAgICAgICovXG4gICAgICBjb25zdCBjb252ZXJzYXRpb25UeXBlID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENvbnZlcnNhdGlvblR5cGUoKTtcbiAgICAgIGNvbnZlcnNhdGlvblR5cGUgPT09IENvbnZlcnNhdGlvblR5cGUuR1JPVVAgJiYgdGhpcy5fc3RhdGVNYWNoaW5lLnVzZXJKb2luKFt0aGlzLl9ydGNDbGllbnQuZ2V0Q3VycmVudElkKCldKTtcblxuICAgICAgLyoqXG4gICAgICAgKiDpkojlr7nnp4HmnInkupEgQHJvbmdjbG91ZC9wbHVnaW4tcnRjQDUuMS4xMC1lbnRlcnByaXNlLjcg5aKe5Yqg6KGl5LiB77yMXG4gICAgICAgKiDnp4HmnInkupHljYflrowgUlRDIHNkayDniYjmnKzlkI7liKDmjonmraTooaXkuIFcbiAgICAgICAqIOWKoOWujOaIv+mXtOWQju+8jOWvueaWueaMguaWreS6hu+8jOmcgOmAgOWHuuaIv+mXtFxuICAgICAgICovXG4gICAgICBpZiAodGhpcy5fc3RhdGVNYWNoaW5lLmdldFN0YXRlKCkgPT09IFJDQ2FsbFNlc3Npb25TdGF0ZS5FTkQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmxlYXZlUm9vbShyb29tISk7XG4gICAgICAgIHRoaXMuX3Jvb20gPSBudWxsIGFzIHVua25vd24gYXMgUkNSVENSb29tO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICAgICAgfVxuXG4gICAgICAvLyDooqvlj6vmlrnliqDlhaXmiL/pl7TmiJDlip/vvIzkvYbkuLvlj6vmlrnlnKjliqDlhaXmiL/pl7TliY3nprvnur9cbiAgICAgIGlmICh1c2VySWRzIS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRoaXMuam9pblJvb21UaW1lciA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlJFTU9URV9ORVRXT1JLX0VSUk9SKTtcbiAgICAgICAgfSwgNjAwMDApO1xuICAgICAgfVxuICAgICAgdGhpcy5fcm9vbSA9IHJvb20gYXMgUkNSVENSb29tO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uTkVUV09SS19FUlJPUik7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2pvaW5Sb29tXSBfcnRjQ2xpZW50LmpvaW5SVENSb29tIHRocm93IGV4Y2VwdGlvbiByb29tSWQgLT4gJHtyb29tSWR9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5KT0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDmiL/pl7TkuIrms6jlhoznm5HlkKzkuovku7ZcbiAgICB0aGlzLl9yZWdpc3RlclJvb21FdmVudExpc3RlbmVyKCk7XG5cbiAgICAvLyDms6jlhozmiL/pl7TotKjph4/mlbDmja7nm5HlkKzlmahcbiAgICB0aGlzLl9yZWdpc3RlclJlcG9ydExpc3RlbmVyKCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8g6K6i6ZiF6L+c56iL55qE5rWB77yM5oqK6L+c56iL55qE5rWB5oqb57uZ55So5oi3XG4gICAgICBhd2FpdCB0aGlzLl9zdWJzY3JpYmVJblJvb21SZW1vdGVUcmFjaygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyDnu5PmnZ/pgJror51zZXNzaW9uXG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uU1VCU0NSSUJFX0VSUk9SKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfam9pblJvb21dIF9zdWJzY3JpYmVJblJvb21SZW1vdGVUcmFjayBFeGNlcHRpb24gcm9vbUlkIC0+ICR7cm9vbUlkfWApO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuSk9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIOW+gOaIv+mXtOmHjOWPkeW4g+acrOWcsOi1hOa6kFxuICAgICAgYXdhaXQgdGhpcy5fcHVibGlzaCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyDnu5PmnZ/pgJror51zZXNzaW9uXG4gICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uUFVCTElTSF9FUlJPUik7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2pvaW5Sb29tXSBfcHVibGlzaCBFeGNlcHRpb24gcm9vbUlkIC0+ICR7cm9vbUlkfWApO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuSk9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICogKOWIneWni+WMluaIv+mXtOeahOaXtuWAmSkg6K6i6ZiF6L+c56iL55qE5rWB77yM5oqK6L+c56iL55qE5rWB5oqb57uZ55So5oi3XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zdWJzY3JpYmVJblJvb21SZW1vdGVUcmFjaygpIHtcbiAgICAvLyDojrflj5bmiYDmnInov5znqIvlt7Llj5HluIPnmoTpn7Pop4bpopHotYTmupDliJfooahcbiAgICBjb25zdCB0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSA9IHRoaXMuX3Jvb20uZ2V0UmVtb3RlVHJhY2tzKCk7XG4gICAgaWYgKHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc3Vic2NyaWJlUmV0cnkodHJhY2tzLCB0aGlzLl9vcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSwgdGhpcy5fUkVUUllDT1VOVCk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlNVQlNDUklCRV9FUlJPUik7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBfc3Vic2NyaWJlSW5Sb29tUmVtb3RlVHJhY2tdIFJlc291cmNlIHN1YnNjcmlwdGlvbiBmYWlsZWQgcm9vbUlkIC0+ICR7dGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxJZCgpfSBSVEMgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWPr+S7pemHjeivleeahOiuoumYhVxuICAgKiBAcGFyYW0gcGFyYW1zLnRyYWNrcyB0cmFja3NcbiAgICogQHBhcmFtIHBhcmFtcy5pc0FsbG93U3Vic2NyaWJlUmV0cnkg5piv5ZCm5YWB6K646YeN6K+VXG4gICAqIEBwYXJhbSBwYXJhbXMuY291bnQg5YWB6K646YeN6K+V55qE5qyh5pWwXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zdWJzY3JpYmVSZXRyeSh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSwgaXNBbGxvd1N1YnNjcmliZVJldHJ5OiBib29sZWFuID0gZmFsc2UsIGNvdW50OiBudW1iZXIgPSAwKTogUHJvbWlzZTx7IGNvZGU6IFJDUlRDQ29kZSB9PiB7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnN1YnNjcmliZSh0cmFja3MpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uVHJhY2tTdWJzY3JpYmVGYWlsICYmIHRoaXMuX2xpc3RlbmVyIS5vblRyYWNrU3Vic2NyaWJlRmFpbChjb2RlLCB0aGlzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbl0gX2xpc3RlbmVyLm9uVHJhY2tTdWJzY3JpYmVGYWlsIGV4Y2VwdGlvbicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgLy8g5aaC5p6c5LiN5YWB6K646YeN6K+V77yM55u05o6l6L+U5ZueXG4gICAgICBpZiAoIWlzQWxsb3dTdWJzY3JpYmVSZXRyeSkge1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgIGNvdW50LS07XG4gICAgICAgIHJldHVybiB0aGlzLl9zdWJzY3JpYmVSZXRyeSh0cmFja3MsIGlzQWxsb3dTdWJzY3JpYmVSZXRyeSwgY291bnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5Y+R5biD5pys5Zyw6LWE5rqQ55qE6YC76L6RXG4gICAqXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9wdWJsaXNoKCkge1xuICAgIGNvbnN0IHRyYWNrcyA9IHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MhO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcHVibGlzaFJldHJ5KHRyYWNrcywgdGhpcy5fb3B0aW9ucy5pc0FsbG93UHVibGlzaFJldHJ5LCB0aGlzLl9SRVRSWUNPVU5UKTtcblxuICAgIC8vIOiLpei1hOa6kOWPkeW4g+Wksei0pVxuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLlBVQkxJU0hfRVJST1IpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gX3B1Ymxpc3RdIFJlc291cmNlIHB1Ymxpc2hpbmcgZmFpbGVkOiByb29tSWQgLT4gJHt0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2FsbElkKCl9IFJDUlRDQ29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g5aaC5p6c5piv5Li75Yqo5Y+R6LW355qE5ZG85Y+r77yM5bey5o+Q5YmN5oqb5Ye65LqG6LWE5rqQLCDooqvliqjlkbzlj6vvvIzov5nph4zmiY3pnIDopoHmipvlh7pcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5wcm9kdWNlVHlwZSA9PT0gUHJvZHVjZVR5cGVzLkNBTExFRSkge1xuICAgICAgLy8g5ZCR5aSW5oqb5Ye65pys5Zyw5rWBLCDpgJrnn6XkuJrliqHlsYJ0cmFja1JlYWR5XG4gICAgICB0aGlzLl9ub3RpZnlUcmFja1JlYWR5KHRyYWNrcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWPr+S7pemHjeivleeahOWPkeW4g1xuICAgKiBAcGFyYW0gcGFyYW1zLnRyYWNrcyB0cmFja3NcbiAgICogQHBhcmFtIHBhcmFtcy5pc0FsbG93UHVibGlzaFJldHJ5IOaYr+WQpuWFgeiuuOmHjeivlVxuICAgKiBAcGFyYW0gcGFyYW1zLmNvdW50IOWFgeiuuOmHjeivleeahOasoeaVsFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfcHVibGlzaFJldHJ5KHRyYWNrczogUkNMb2NhbFRyYWNrW10sIGlzQWxsb3dQdWJsaXNoUmV0cnk6IGJvb2xlYW4gPSBmYWxzZSwgY291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPHsgY29kZTogUkNSVENDb2RlIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20ucHVibGlzaCh0cmFja3MpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uVHJhY2tQdWJsaXNoRmFpbCAmJiB0aGlzLl9saXN0ZW5lciEub25UcmFja1B1Ymxpc2hGYWlsKGNvZGUsIHRoaXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uXSBfbGlzdGVuZXIub25UcmFja1B1Ymxpc2hGYWlsIGV4Y2VwdGlvbicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgLy8g5aaC5p6c5LiN5YWB6K646YeN6K+V77yM55u05o6l6L+U5ZueXG4gICAgICBpZiAoIWlzQWxsb3dQdWJsaXNoUmV0cnkpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICBjb3VudC0tO1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVibGlzaFJldHJ5KHRyYWNrcywgaXNBbGxvd1B1Ymxpc2hSZXRyeSwgY291bnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6YCA5Ye65oi/6Ze0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9sZWF2ZVJvb20oKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOmAgOWHuuaIv+mXtFxuICAgICAgY29uc3QgY2FsbEJhY2sgPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQubGVhdmVSb29tKHRoaXMuX3Jvb20pO1xuICAgICAgLy8g5oiQ5Yqf6YCA5Ye65oi/6Ze077yM6Kem5Y+RUkNDYWxsQ2xpZW505a6e5L6L5LiK55qEb25TZXNzaW9uQ2xvc2Xnm5HlkKzvvIzmipvnu5nnlKjmiLfkv6Hmga9cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9sZWF2ZVJvb21dIFN1Y2Nlc3NmdWxseSBleGl0ZWQgdGhlIHJvb20gY29kZTogJHtjYWxsQmFjay5jb2RlfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gX2xlYXZlUm9vbV0gbGVhdmVSb29tIHRocm93IGV4Y2VwdGlvbicpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNvbnN0IHN1bW1hcnlJbmZvID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFN1bW1hcnkoKTtcbiAgICAgIGV2ZW50RW1pdHRlci5lbWl0KCdzZXNzaW9uQ2xvc2UnLCB7IHNlc3Npb246IHRoaXMsIHN1bW1hcnlJbmZvIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlh7rnjrDlvILluLjlkI7opoHlpITnkIbnmoTpgLvovpEsXG4gICAqIEBwYXJhbSBlbmRSZWFzb24g5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9leGNlcHRpb25DbG9zZShlbmRSZWFzb246IFJDQ2FsbEVuZFJlYXNvbikge1xuICAgIC8vIOmUgOavgeacrOWcsOa1gVxuICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgJiYgdGhpcy5fZGVzdHJveVRyYWNrcyh0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzKTtcblxuICAgIC8vIOe7k+adn+eKtuaAgeaculxuICAgIHRoaXMuX3N0YXRlTWFjaGluZS5jbG9zZShlbmRSZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIOeUqOaIt+iwg+eUqOeahO+8jOazqOWGjHNlc3Npb27kuIrnmoTnm5HlkKxcbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclNlc3Npb25MaXN0ZW5lcihsaXN0ZW5lcjogSVNlc3Npb25MaXN0ZW5lcik6IHZvaWQge1xuICAgIC8vIOWFiOagoemqjGxpc3RlbmVyLCDlpoLmnpzkuI3pgJrov4fvvIzkvJp0cm93IGVycm9yXG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZUxpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICBpZiAoIWNvbmNsdXNpb24ucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxTZXNzaW9uIHJlZ2lzdGVyU2Vzc2lvbkxpc3RlbmVyXSAke2NvbmNsdXNpb24ubXNnfWApO1xuICAgIH1cbiAgICB0aGlzLl9saXN0ZW5lciA9IHsgLi4ubGlzdGVuZXIgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDosINSVEMgQVBJIOiOt+W+l+acrOWcsOa1gVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0TG9jYWxUcmFja0NvcmUobWVkaWFUeXBlOiBSQ0NhbGxNZWRpYVR5cGUsIGNvbnN0cmFpbnRzPzogSU1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCB0cmFja3M/OiBSQ0xvY2FsVHJhY2tbXSB9PiB7XG4gICAgLy8g5qOA5rWL5piv5ZCm6IO95aSf6I635b6X5pys5Zyw5rWBXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPKSB7XG4gICAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUF1ZGlvVHJhY2soJ1JvbmdDbG91ZFJUQycsIGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzLmF1ZGlvICYmIHsgLi4uY29uc3RyYWludHMuYXVkaW8gfSk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIF9nZXRMb2NhbFRyYWNrQ29yZV0gZ2V0IEF1ZGlvIGxvY2FsIHRyYWNrcyBmYWlsZWQgUkNUIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX1RSQUNLX0VSUk9SIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsU2Vzc2lvbiBfZ2V0TG9jYWxUcmFja0NvcmVdIHN1Y2Nlc3NmdWxseSBnZXQgQXVkaW8gbG9jYWwgdHJhY2tzJyk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgdHJhY2tzOiBbdHJhY2shXSB9O1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBbmRDYW1lcmFUcmFja3MoJ1JvbmdDbG91ZFJUQycsIGNvbnN0cmFpbnRzICYmIHsgLi4uY29uc3RyYWludHMgfSk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2dldExvY2FsVHJhY2tDb3JlXSBnZXQgQXVkaW8gYW5kIFZpZGVvIGxvY2FsIHRyYWNrcyBmYWlsZWQgUkNUIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9BVURJT19BTkRfVklERU9fVFJBQ0tfRVJST1IgfTtcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbFNlc3Npb24gX2dldExvY2FsVHJhY2tDb3JlXSBzdWNjZXNzZnVsbHkgZ2V0IGF1ZGlvIGFuZCB2aWRlbyBsb2NhbCB0cmFja3MnKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgdHJhY2tzIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9nZXRMb2NhbFRyYWNrKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlLCBjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgdHJhY2tzPzogUkNMb2NhbFRyYWNrW10gfT4ge1xuICAgIC8vIOW5tuS4lOaYr+iOt+W+l+mfs+inhumikSwg5bm25LiUIO+8iOWmguaenOiOt+W+l+mfs+inhumikeS4jeaIkOWKn++8jOWFgeiuuOmZjee6p+iOt+W+l+mfs+mike+8iVxuICAgIGlmICh0aGlzLl9vcHRpb25zLmlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbSAmJiBtZWRpYVR5cGUgPT09IFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTykge1xuICAgICAgY29uc3QgeyBjb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTywgY29uc3RyYWludHMpO1xuXG4gICAgICAvLyDlpoLmnpzpn7Pop4bpopHkuI3og73ojrflvpfvvIzlsLHpmY3nuqfojrflvpfpn7PpopFcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUoUkNDYWxsTWVkaWFUeXBlLkFVRElPLCBjb25zdHJhaW50cyk7XG4gICAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICAgIC8vIOiOt+WPlui1hOa6kOWksei0pe+8jOmcgOimgeiwg+eKtuaAgeacunN0YXRlIOS4uiBlbmRcbiAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uR0VUX01FRElBX1JFU09VUkNFU19FUlJPUik7XG4gICAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNvZGUsIHRyYWNrcyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY29kZSwgdHJhY2tzIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fZ2V0TG9jYWxUcmFja0NvcmUobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgLy8g6I635Y+W6LWE5rqQ5aSx6LSl77yM6ZyA6KaB6LCD54q25oCB5py6c3RhdGUg5Li6IGVuZFxuICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLkdFVF9NRURJQV9SRVNPVVJDRVNfRVJST1IpO1xuXG4gICAgICByZXR1cm4geyBjb2RlOiBfY29kZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlOiBfY29kZSwgdHJhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit5pu05o2i6Z+z6aKR6K6+5aSHXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2hhbmdlQXVkaW9EZXZpY2UoYXVkaW9Db25zdHJhaW50cz86IElNaWNwaG9uZUF1ZGlvUHJvZmlsZSk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUgfT4ge1xuICAgIC8vIOaWsOiuvuWkh+eahHRyYWNrXG4gICAgY29uc3QgcmVjZW50VHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuXG4gICAgLy8g5pW055CG5ZCO55qE5pys5ZywdHJhY2tcbiAgICBjb25zdCBsb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlTWljcm9waG9uZUF1ZGlvVHJhY2soJ1JvbmdDbG91ZFJUQycsIGF1ZGlvQ29uc3RyYWludHMpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGNoYW5nZURldmljZV0gZ2V0IGxvY2FsIEF1ZGlvIHRyYWNrcyBmYWlsZWQgUkNUTGliIGNvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9BVURJT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgJiYgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICBpZiAodHJhY2suaXNBdWRpb1RyYWNrKCkpIHtcbiAgICAgICAgLy8g5LmL5YmN55qE6Z+z6aKR6YO96ZSA5q+B77yM77yIUlRDTGliIFNES+WGhemDqOS8muWcqCBhZGRMb2NhbFRyYWNrIOa4heeQhuWQjOexu+Wei+i9qOmBk+aVsOaNru+8jOaJgOS7pei/memHjOazqOmHiuaOie+8iVxuICAgICAgICAvLyB0cmFjay5kZXN0cm95KClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOWPquaKiuS5i+WJjeeahOinhumikeeVmeS4i1xuICAgICAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlY2VudFRyYWNrcy5wdXNoKHRyYWNrISk7XG5cbiAgICAvLyDliqDkuIrmnKzlnLDmlrDkuqfnlJ/nmoTpn7PpopFcbiAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrISk7XG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyA9IGxvY2FsVHJhY2tzO1xuICAgIC8vIOmAmuefpeS4muWKoeWxgnRyYWNrUmVhZHlcbiAgICB0aGlzLl9ub3RpZnlUcmFja1JlYWR5KHJlY2VudFRyYWNrcyk7XG5cbiAgICAvLyDlpoLmnpzlvZPliY3lt7LliqDlhaXmiL/pl7TvvIzlj5HluIPmlrDmtYFcbiAgICBpZiAodGhpcy5fcm9vbSkge1xuICAgICAgLy8g5Y+R5biD5paw5rWBXG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20ucHVibGlzaChyZWNlbnRUcmFja3MpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5BVURJT19QVUJMSVNIX0VSUk9SIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog576k5ZG85Y+r5Lit57un57ut6YKA6K+3XG4gICAqIEBwYXJhbSB1c2VySWRzIOiiq+mCgOivt+eUqOaItyBJRCDliJfooahcbiAgICogQHBhcmFtIG9wdGlvbnMuZXh0cmEg5raI5oGv55qE5omp5bGV5L+h5oGvXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOW6n+W8gyBvcHRpb25zLnB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg5bqf5byDIG9wdGlvbnMucHVzaENvbnRlbnQg6YCa55+l5YaF5a65XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW52aXRlKHVzZXJJZHM6IHN0cmluZ1tdLCBvcHRpb25zOiBJSW52aXRlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgY29uc3QgeyBleHRyYSA9ICcnIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHB1c2hDb25maWcgPSB0aGlzLl9vcHRpb25zLmNhbGxQdXNoQ29uZmlnID8gdGhpcy5fb3B0aW9ucy5jYWxsUHVzaENvbmZpZyA6IG9wdGlvbnMucHVzaENvbmZpZztcbiAgICBjb25zdCBjb25jbHVzaW9uOiBJVmFsaWRhdGlvblJlc3VsdFtdID0gW3ZhbGlkYXRlVXNlcklkcyh1c2VySWRzKSwgdmFsaWRhdGVFeHRyYShleHRyYSldO1xuICAgIGlmIChwdXNoQ29uZmlnKSB7XG4gICAgICBjb25zdCB7IGNvZGUsIGVycm9yTXNnIH0gPSB2YWxpZGF0ZVB1c2hDb25maWcocHVzaENvbmZpZyk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGludml0ZV0gcGFyYW0gZXJyb3IsIGVycm9yTXNnOiAke2Vycm9yTXNnfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNsdXNpb24uZXZlcnkoKG9iajogSVZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICFvYmoucmVzdWx0ICYmIG1lc3NhZ2VzLnB1c2gob2JqLm1zZyEpO1xuICAgICAgcmV0dXJuIG9iai5yZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsQ2xpZW50IGludml0ZV0gJHttZXNzYWdlcy5qb2luKCdcXG4nKX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3N0YXRlTWFjaGluZS5pbnZpdGUodXNlcklkcywge1xuICAgICAgZXh0cmEsIHB1c2hDb25maWcsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWQjOaEj+aOpeWQrFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFjY2VwdChjb25zdHJhaW50cz86IElNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZU1lZGlhU3RyZWFtQ29uc3RyYWludHMoY29uc3RyYWludHMhKTtcbiAgICBpZiAoIWNvbmNsdXNpb24ucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxTZXNzaW9uIGFjY2VwdF0gJHtjb25jbHVzaW9uLm1zZ31gKTtcbiAgICB9XG5cbiAgICAvLyDmjqXlkKzkuYvliY3vvIzlhYjmjILmlq3lvZPliY3kuYvlpJbnmoRzZXNzaW9u77yM546w6Zi25q615LiN5YWB6K6455So5oi35YWI5oup5o6l5ZCsc2Vzc2lvbu+8jOS6i+WFiOS8muWcqOeKtuaAgeacuuWGhemDqOaMguaWre+8jOi/memHjOaKm+WHuuWOu++8jOS8mua4heeQhuWFtuWug+eahHNlZXNpb25cbiAgICBldmVudEVtaXR0ZXIuZW1pdCgnaHVuZ3VwT3RoZXJTZXNzaW9uJywgeyBzZXNzaW9uOiB0aGlzIH0pO1xuICAgIGNvbnN0IG1lZGlhVHlwZSA9IHRoaXMuX3N0YXRlTWFjaGluZS5nZXRNZWRpYVR5cGUoKTtcbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2sobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyA9IHRyYWNrcztcblxuICAgIC8vIOWPkemAgeaOpeWQrOeahOa2iOaBr1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc3RhdGVNYWNoaW5lLmFjY2VwdCgpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGFjY2VwdF1TZW5kIGFjY2VwdCBtZXNzYWdlIGZhaWxlZCAtPiBjb2RlOiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjILmlq1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBodW5ndXAoKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZTsgfT4ge1xuICAgIC8vIGNvbnN0IHN1bW1hcnlJbmZvID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFN1bW1hcnkoKVxuICAgIC8vIGV2ZW50RW1pdHRlci5lbWl0KCdzZXNzaW9uQ2xvc2UnLCB7IHNlc3Npb246IHRoaXMsIHN1bW1hcnlJbmZvIH0pXG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5odW5ndXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53lqpLkvZPlj5jmm7RcbiAgICogIEBwYXJhbSBtZWRpYVR5cGUgUkNDYWxsTWVkaWFUeXBlLkFVRElPIOaUueS4uumfs+mikemAmuivnSB8IFJDQ2FsbE1lZGlhVHlwZS5BVURJT19WSURFTyDmlLnkuLrpn7Pop4bpopHpgJror51cbiAgICovXG4gIHB1YmxpYyBhc3luYyBfY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsTWVkaWFUeXBlKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zdGF0ZU1hY2hpbmUuY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZSk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2NoYW5nZU1lZGlhVHlwZV0gY2hhbmdlIG1lZGlhIHR5cGUgZmFpbCBjb2RlLT4gJHtjb2RlfWApO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5pys5Zyw6KeG6aKRXG4gICAqL1xuICBwcml2YXRlIF9nZXRMb2NhbFZpZGVvVHJhY2tzKCk6IFJDTG9jYWxUcmFja1tdIHtcbiAgICBsZXQgbG9jYWxWaWRlb1RyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiBsb2NhbFZpZGVvVHJhY2tzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcykge1xuICAgICAgbG9jYWxWaWRlb1RyYWNrcyA9IHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MuZmlsdGVyKCh0cmFjaykgPT4gdHJhY2suaXNWaWRlb1RyYWNrKCkpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxWaWRlb1RyYWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfmnKzlnLDpn7PpopFcbiAgICovXG4gIHByaXZhdGUgX2dldExvY2FsQXVkaW9UcmFja3MoKTogUkNMb2NhbFRyYWNrW10ge1xuICAgIGxldCBsb2NhbEF1ZGlvdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIGxvY2FsQXVkaW90cmFja3M7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzKSB7XG4gICAgICBsb2NhbEF1ZGlvdHJhY2tzID0gdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc0F1ZGlvVHJhY2soKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbEF1ZGlvdHJhY2tzO1xuICB9XG5cbiAgLyoqXG4gICAqIOaKiumAmuivneeahE1lZGlhVHlwZeWNh+e6p+WIsOmfs+inhumikVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2V0TWVkaWFUeXBlVG9BdWRpb0FuZFZpZGVvKCkge1xuICAgIC8vIOiOt+W+l+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVDYW1lcmFWaWRlb1RyYWNrKCk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX0FORF9WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWPkeW4g+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZTogX2NvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20ucHVibGlzaChbdHJhY2shXSk7XG5cbiAgICAvLyDoi6XotYTmupDlj5HluIPlpLHotKVcbiAgICBpZiAoX2NvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gX2VuYWJsZVZpZGVvXSBSZXNvdXJjZSBwdWJsaXNoaW5nIGZhaWxlZDogUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDpgJrnn6XkuJrliqHlsYJ0cmFja1JlYWR5XG4gICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShbdHJhY2shXSk7XG5cbiAgICAvLyDlj5Hmtojmga9cbiAgICB0aGlzLl9jaGFuZ2VNZWRpYVR5cGUoUkNDYWxsTWVkaWFUeXBlLkFVRElPX1ZJREVPKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiorpgJror53nmoRNZWRpYVR5cGXpmY3nuqfliLDpn7PpopFcbiAgICogQHBhcmFtIGlzU2VuZE1lc3NzYWdlIOaYr+WQpumcgOimgeWPkea2iOaBrywg6buY6K6k5Y+R5raI5oGvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zZXRNZWRpYVR5cGVUb0F1ZGlvKCkge1xuICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbFZpZGVvVHJhY2tzKCk7XG4gICAgaWYgKHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIC8vIOemgeeUqOinhumikVxuICAgICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgICAgdHJhY2subXV0ZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIOWPlua2iOWPkeW4g+inhumikVxuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnVucHVibGlzaCh0cmFja3MpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlVmlkZW9dIHVucHVibGlzaCBmYWlsZWQgLT4gJHtjb2RlfWApO1xuICAgICAgfVxuXG4gICAgICAvLyDlhbPpl63mkYTlg4/lpLRcbiAgICAgIHRoaXMuX2Rlc3Ryb3lUcmFja3ModHJhY2tzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d6ZmN57qn77yM55uu5YmN6ZyA5rGC5Y+q5YGa6YCa6K+d6ZmN57qn77yM6Z+z6KeG6aKR5Y+v5Lul6ZmN57qn5Li66Z+z6aKR77yM6Z+z6aKR5LiN6IO95Y2H5Yiw6Z+z6KeG6aKRLCDlj5Hmtojmga/miJDlip/miY3nrpfpmY3nuqfmiJDlip9cbiAgICpcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXNjZW5kQWJpbGl0eSgpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NoYW5nZU1lZGlhVHlwZShSQ0NhbGxNZWRpYVR5cGUuQVVESU8pO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fc2V0TWVkaWFUeXBlVG9BdWRpbygpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog56aB55So6KeG6aKRdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNhYmxlVmlkZW9UcmFjaygpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlIH0+IHtcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLk5PVF9JTl9ST09NX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IHRoaXMuX2dldExvY2FsVmlkZW9UcmFja3MoKTtcbiAgICBpZiAoIXRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlVmlkZW9UcmFja10gUm9vbSBtaXNzaW5nIHZpZGVvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk1JU1NJTkdfVklERU9fVFJBQ0tfRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOemgeeUqOinhumikVxuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5tdXRlKCk7XG4gICAgfSk7XG5cbiAgICAvLyDlpoLmnpzkuI3pnIDlhbPpl63mkYTlg4/lpLRcbiAgICBpZiAoIXRoaXMuX29wdGlvbnMuaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8vIOWPlua2iOWPkeW4g+inhumikVxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS51bnB1Ymxpc2godHJhY2tzKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlVmlkZW9dIHVucHVibGlzaCBmYWlsZWQgLT4gJHtjb2RlfWApO1xuXG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuVU5QVUJMSVNIX1ZJREVPX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIC8vIOWFs+mXreaRhOWDj+WktFxuICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkK/nlKjop4bpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuYWJsZVZpZGVvVHJhY2soKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSB9PiB7XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZUF1ZGlvVHJhY2tdIFJvb20gbWlzc2luZyBhdWRpbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWmguaenOS4jemcgOWFs+mXreaRhOWDj+WktFxuICAgIGlmICghdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUpIHtcbiAgICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbFZpZGVvVHJhY2tzKCk7XG4gICAgICBpZiAoIXRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIEVuYWJsZVZpZGVvVHJhY2tdIFJvb20gbWlzc2luZyB2aWRlbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5NSVNTSU5HX1ZJREVPX1RSQUNLX0VSUk9SfWApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUiB9O1xuICAgICAgfVxuXG4gICAgICAvLyDlkK/nlKjop4bpopFcbiAgICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICAgIHRyYWNrLnVubXV0ZSgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8vIOiOt+W+l+acrOerr+inhumikei1hOa6kFxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVDYW1lcmFWaWRlb1RyYWNrKCk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gRW5hYmxlVmlkZW9UcmFja10gR2V0IFJlc291cmNlIGZhaWxlZDogUkNSVENDb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5HRVRfTE9DQUxfVklERU9fVFJBQ0tfRVJST1IgfTtcbiAgICB9XG4gICAgY29uc3QgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG4gICAgdGhpcy5fb3B0aW9ucy5sb2NhbFRyYWNrcyAmJiB0aGlzLl9vcHRpb25zLmxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIGlmICh0cmFjay5pc1ZpZGVvVHJhY2soKSkge1xuICAgICAgICAvLyDkuYvliY3nmoTop4bpopHpg73plIDmr4FcbiAgICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5Y+q55WZ5LiL5LmL5YmN55qE6Z+z6aKRXG4gICAgICAgIGxvY2FsVHJhY2tzLnB1c2godHJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g5Yqg5LiK5pys5Zyw5paw5Lqn55Sf55qE6KeG6aKRXG4gICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuICAgIHRoaXMuX29wdGlvbnMubG9jYWxUcmFja3MgPSBsb2NhbFRyYWNrcztcblxuICAgIC8vIOS4uuS6huinpuWPkeWvueaWueeahG9uVmlkZW9NdXRlQ2hhbmdlIOWFiOemgeeUqFxuICAgIHRyYWNrIS5tdXRlKCk7XG5cbiAgICAvLyDlj5HluIPmnKznq6/op4bpopHotYTmupBcbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnB1Ymxpc2goW3RyYWNrIV0pO1xuXG4gICAgLy8g6Iul6LWE5rqQ5Y+R5biD5aSx6LSlXG4gICAgaWYgKF9jb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIEVuYWJsZVZpZGVvVHJhY2tdIFJlc291cmNlIHB1Ymxpc2hpbmcgZmFpbGVkOiBSQ1JUQ0NvZGUgLT4gJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlZJREVPX1BVQkxJU0hfRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDlkK/nlKhcbiAgICB0cmFjayEudW5tdXRlKCk7XG5cbiAgICAvLyDpgJrnn6XkuJrliqHlsYJ0cmFja1JlYWR5XG4gICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShbdHJhY2shXSk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjpn7PpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc2FibGVBdWRpb1RyYWNrKCkge1xuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgYFtSQ0NhbGxTZXNzaW9uIGRpc2FibGVBdWRpb1RyYWNrXSBSb29tIG1pc3NpbmcgYXVkaW8gdHJhY2sgLT4gJHtSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTk9UX0lOX1JPT01fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFja3M6IFJDTG9jYWxUcmFja1tdID0gdGhpcy5fZ2V0TG9jYWxBdWRpb1RyYWNrcygpO1xuXG4gICAgLy8g56aB55So6Z+z6aKRXG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrOiBSQ0xvY2FsVHJhY2spID0+IHtcbiAgICAgIHRyYWNrLm11dGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkK/nlKjpn7PpopF0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuYWJsZUF1ZGlvVHJhY2soKSB7XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbFNlc3Npb24gZGlzYWJsZUF1ZGlvVHJhY2tdIFJvb20gbWlzc2luZyBhdWRpbyB0cmFjayAtPiAke1JDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUn1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZS5OT1RfSU5fUk9PTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrczogUkNMb2NhbFRyYWNrW10gPSB0aGlzLl9nZXRMb2NhbEF1ZGlvVHJhY2tzKCk7XG5cbiAgICBpZiAoIXRyYWNrcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBkaXNhYmxlQXVkaW9UcmFja10gUm9vbSBtaXNzaW5nIGF1ZGlvIHRyYWNrIC0+ICR7UkNDYWxsRXJyb3JDb2RlLk1JU1NJTkdfVklERU9fVFJBQ0tfRVJST1J9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuTUlTU0lOR19WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cblxuICAgIC8vIOWQr+eUqOmfs+mikVxuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICB0cmFjay51bm11dGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDplIDmr4HmnKzlnLDmtYFcbiAgICovXG4gIHByaXZhdGUgX2Rlc3Ryb3lUcmFja3ModHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSkge1xuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5ZCR5aSW5oqb5Ye65pys5Zyw5rWBXG4gICAqL1xuICBwcml2YXRlIF9ub3RpZnlUcmFja1JlYWR5KHRyYWNrczogUkNMb2NhbFRyYWNrW10gfCBSQ1JlbW90ZVRyYWNrW10pIHtcbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2s6IFJDTG9jYWxUcmFjayB8IFJDUmVtb3RlVHJhY2spID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblRyYWNrUmVhZHkodHJhY2ssIHRoaXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIF9ub3RpZnlUcmFja1JlYWR5XSBfbGlzdGVuZXIgb25UcmFja1JlYWR5IGV4Y2VwdGlvbicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiL/pl7TkuIrms6jlhozkuovku7ZcbiAgICovXG4gIHByaXZhdGUgX3JlZ2lzdGVyUm9vbUV2ZW50TGlzdGVuZXIoKSB7XG4gICAgdGhpcy5fcm9vbS5yZWdpc3RlclJvb21FdmVudExpc3RlbmVyKFxuICAgICAge1xuICAgICAgICAvKipcbiAgICAgICAgICog5pys56uv6KKr6Lii5Ye65oi/6Ze05pe26Kem5Y+RXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiDooqvouKLlh7rmiL/pl7Tlj6/og73mmK/nlLHkuo7mnI3liqHnq6/otoXlh7rkuIDlrprml7bpl7TmnKrog73mlLbliLAgcnRjUGluZyDmtojmga/vvIzmiYDku6XorqTkuLrlt7Hmlrnnprvnur/jgIJcbiAgICAgICAgICog5Y+m5LiA56eN5Y+v6IO95piv5bex5pa5IHJ0Y1Bpbmcg5aSx6LSl5qyh5pWw6LaF5Ye65LiK6ZmQ77yM5pWF6ICM5Li75Yqo5pat57q/XG4gICAgICAgICAqIEBwYXJhbSBieVNlcnZlclxuICAgICAgICAgKiDlvZPlgLzkuLogZmFsc2Ug5pe277yM6K+05piO5pys56uvIHJ0Y1Bpbmcg6LaF5pe2XG4gICAgICAgICAqIOW9k+WAvOS4uiB0cnVlIOaXtu+8jOivtOaYjuacrOerr+aUtuWIsOiiq+i4ouWHuuaIv+mXtOmAmuefpVxuICAgICAgICAgKi9cbiAgICAgICAgb25LaWNrT2ZmOiAoYnlTZXJ2ZXI6IGJvb2xlYW4sIHN0YXRlPzogUkNLaWNrUmVhc29uIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVzZXJJZDogc3RyaW5nID0gdGhpcy5fcnRjQ2xpZW50LmdldEN1cnJlbnRJZCgpO1xuICAgICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZS51c2VyTGVhdmUoW2N1cnJlbnRVc2VySWRdKTtcblxuICAgICAgICAgIGlmICghYnlTZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2V4Y2VwdGlvbkNsb3NlKFJDQ2FsbEVuZFJlYXNvbi5ORVRXT1JLX0VSUk9SKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSQ0tpY2tSZWFzb24uU0VSVkVSX0tJQ0spIHtcbiAgICAgICAgICAgICAgdGhpcy5fZXhjZXB0aW9uQ2xvc2UoUkNDYWxsRW5kUmVhc29uLktJQ0tFRF9CWV9TRVJWRVIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSQ0tpY2tSZWFzb24uT1RIRVJfS0lDSykge1xuICAgICAgICAgICAgICB0aGlzLl9leGNlcHRpb25DbG9zZShSQ0NhbGxFbmRSZWFzb24uT1RIRVJfQ0xJRU5UX0pPSU5FRF9DQUxMKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDmjqXmlLbliLDmiL/pl7Tkv6Hku6Tml7blm57osIPvvIznlKjmiLflj6/pgJrov4fmiL/pl7Tlrp7kvovnmoQgYHNlbmRNZXNzYWdlKG5hbWUsIGNvbnRlbnQpYCDmjqXlj6Plj5HpgIHkv6Hku6RcbiAgICAgICAgICogQHBhcmFtIG5hbWUg5L+h5Luk5ZCNXG4gICAgICAgICAqIEBwYXJhbSBjb250ZW50IOS/oeS7pOWGheWuuVxuICAgICAgICAgKiBAcGFyYW0gc2VuZGVyVXNlcklkIOWPkemAgeiAhSBJZFxuICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZVVJZCDmtojmga/llK/kuIDmoIfor4ZcbiAgICAgICAgICovXG4gICAgICAgIG9uTWVzc2FnZVJlY2VpdmUobmFtZTogc3RyaW5nLCBjb250ZW50OiBhbnksIHNlbmRlclVzZXJJZDogc3RyaW5nLCBtZXNzYWdlVUlkOiBzdHJpbmcpIHtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOebkeWQrOaIv+mXtOWxnuaAp+WPmOabtOmAmuefpVxuICAgICAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAgICAgKiBAcGFyYW0gY29udGVudFxuICAgICAgICAgKi9cbiAgICAgICAgb25Sb29tQXR0cmlidXRlQ2hhbmdlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKSB7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlj5HluIPogIXnpoHnlKgv5ZCv55So6Z+z6aKRXG4gICAgICAgICAqIEBwYXJhbSBhdWRpb1RyYWNrIFJDUmVtb3RlQXVkaW9UcmFjayDnsbvlrp7kvotcbiAgICAgICAgICovXG4gICAgICAgIG9uQXVkaW9NdXRlQ2hhbmdlOiAoYXVkaW9UcmFjazogUkNSZW1vdGVBdWRpb1RyYWNrKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25BdWRpb011dGVDaGFuZ2VdIHVzZXJJZC0+JHthdWRpb1RyYWNrLmdldFVzZXJJZCgpfSBtdXRlZCAtPiAke2F1ZGlvVHJhY2suaXNPd25lck11dGVkKCl9YCk7XG4gICAgICAgICAgY29uc3QgbXV0ZVVzZXI6IElNdXRlVXNlciA9IHtcbiAgICAgICAgICAgIHVzZXJJZDogYXVkaW9UcmFjay5nZXRVc2VySWQoKSxcbiAgICAgICAgICAgIG11dGVkOiBhdWRpb1RyYWNrLmlzT3duZXJNdXRlZCgpLFxuICAgICAgICAgICAga2luZDogJ2F1ZGlvJyxcbiAgICAgICAgICAgIHRyYWNrSWQ6IGF1ZGlvVHJhY2suZ2V0VHJhY2tJZCgpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOmAmuefpee7meS4muWKoVxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uQXVkaW9NdXRlQ2hhbmdlKG11dGVVc2VyLCB0aGlzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uQXVkaW9NdXRlQ2hhbmdlXSBNaXNzaW5nIGxpc3RlbmluZyBtZXRob2QgLT4gb25UcmFja011dGVDaGFuZ2UnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOWPkeW4g+iAheemgeeUqC/lkK/nlKjop4bpopFcbiAgICAgICAgICogQHBhcmFtIHZpZGVvVHJhY2sgUkNSZW1vdGVWaWRlb1RyYWNrIOexu+WunuS+i+WvueixoVxuICAgICAgICAgKi9cbiAgICAgICAgb25WaWRlb011dGVDaGFuZ2U6ICh2aWRlb1RyYWNrOiBSQ1JlbW90ZVZpZGVvVHJhY2spID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblZpZGVvTXV0ZUNoYW5nZV11c2VySWQtPiR7dmlkZW9UcmFjay5nZXRVc2VySWQoKX0gbXV0ZWQgLT4gJHt2aWRlb1RyYWNrLmlzT3duZXJNdXRlZCgpfWApO1xuICAgICAgICAgIGNvbnN0IG11dGVVc2VyOiBJTXV0ZVVzZXIgPSB7XG4gICAgICAgICAgICB1c2VySWQ6IHZpZGVvVHJhY2suZ2V0VXNlcklkKCksXG4gICAgICAgICAgICBtdXRlZDogdmlkZW9UcmFjay5pc093bmVyTXV0ZWQoKSxcbiAgICAgICAgICAgIGtpbmQ6ICd2aWRlbycsXG4gICAgICAgICAgICB0cmFja0lkOiB2aWRlb1RyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOmAmuefpee7meS4muWKoVxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uVmlkZW9NdXRlQ2hhbmdlKG11dGVVc2VyLCB0aGlzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uVmlkZW9NdXRlQ2hhbmdlXSBNaXNzaW5nIGxpc3RlbmluZyBtZXRob2QgLT4gb25WaWRlb011dGVDaGFuZ2UnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaIv+mXtOWGheWFtuS7lueUqOaIt+aWsOWPkeW4g+i1hOa6kOaXtuinpuWPkVxuICAgICAgICAgKiDlpoLpnIDojrflj5bliqDlhaXmiL/pl7TkuYvliY3miL/pl7TlhoXmn5DkuKrnlKjmiLflj5HluIPnmoTotYTmupDliJfooajvvIzlj6/kvb/nlKggcm9vbS5nZXRSZW1vdGVUcmFja3NCeVVzZXJJZCgndXNlcklkJykg6I635Y+WXG4gICAgICAgICAqIEBwYXJhbSB0cmFja3Mg5paw5Y+R5biD55qE6Z+z6L2o5LiO6KeG6L2o5pWw5o2u5YiX6KGo77yM5YyF5ZCr5paw5Y+R5biD55qEIFJDUmVtb3RlQXVkaW9UcmFjayDkuI4gUkNSZW1vdGVWaWRlb1RyYWNrIOWunuS+i1xuICAgICAgICAgKi9cbiAgICAgICAgb25UcmFja1B1Ymxpc2g6IGFzeW5jICh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkgPT4ge1xuICAgICAgICAgIC8vIOmAgOWHuuaIv+mXtOWQju+8jOi/mOS8mui1sOWIsOi/me+8n++8n++8jOaJgOS7peWIpOaWreS4gOS4i++8jOayoeaciXJvb23kuI3miafooYzorqLpmIVcbiAgICAgICAgICBpZiAodGhpcy5fcm9vbSkge1xuICAgICAgICAgICAgLy8g5oyJ5Lia5Yqh6ZyA5rGC6YCJ5oup6ZyA6KaB6K6i6ZiF6LWE5rqQ77yM6YCa6L+HIHJvb20uc3Vic2NyaWJlIOaOpeWPo+i/m+ihjOiuoumYhVxuICAgICAgICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnN1YnNjcmliZSh0cmFja3MpO1xuICAgICAgICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsU2Vzc2lvbiBvblRyYWNrUHVibGlzaF0gc3Vic2NyaWJlIGZhaWxlZCBSVENDb2RlIC0+JHtjb2RlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaIv+mXtOeUqOaIt+WPlua2iOWPkeW4g+i1hOa6kFxuICAgICAgICAgKiBAcGFyYW0gdHJhY2tzIOiiq+WPlua2iOWPkeW4g+eahOmfs+i9qOS4juinhui9qOaVsOaNruWIl+ihqFxuICAgICAgICAgKiBAZGVzY3JpcHRpb24g5b2T6LWE5rqQ6KKr5Y+W5raI5Y+R5biD5pe277yMU0RLIOWGhemDqOS8muWPlua2iOWvueebuOWFs+i1hOa6kOeahOiuoumYhe+8jOS4muWKoeWxguS7hemcgOWkhOeQhiBVSSDkuJrliqFcbiAgICAgICAgICovXG4gICAgICAgIG9uVHJhY2tVbnB1Ymxpc2g6ICh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkgPT4ge1xuXG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDorqLpmIXnmoTpn7Pop4bpopHmtYHpgJrpgZPlt7Llu7rnq4ssIHRyYWNrIOW3suWPr+S7pei/m+ihjOaSreaUvlxuICAgICAgICAgKiBAcGFyYW0gdHJhY2sgUkNSZW1vdGVUcmFjayDnsbvlrp7kvotcbiAgICAgICAgICovXG4gICAgICAgIG9uVHJhY2tSZWFkeTogKHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWVkaWFUeXBlID0gdGhpcy5fc3RhdGVNYWNoaW5lLmdldE1lZGlhVHlwZSgpO1xuXG4gICAgICAgICAgLy8g5pyJ5pe25a+55pa55rKh5pyJ6ZmN57qn5oiQ5Yqf77yM5omU5oqb6L+H5p2l6KeG6aKR77yM6L+Z5pe255qE6KeG6aKR5LiN5a+55aSW5oqb5Ye6XG4gICAgICAgICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsTWVkaWFUeXBlLkFVRElPICYmIHRyYWNrLmlzVmlkZW9UcmFjaygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8g5omn6KGM55So5oi355qEb25UcmFja1JlYWR555uR5ZCsXG4gICAgICAgICAgdGhpcy5fbm90aWZ5VHJhY2tSZWFkeShbdHJhY2tdKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOS6uuWRmOWKoOWFpVxuICAgICAgICAgKiBAcGFyYW0gdXNlcklkcyDliqDlhaXnmoTkurrlkZggaWQg5YiX6KGoXG4gICAgICAgICAqL1xuICAgICAgICBvblVzZXJKb2luOiAodXNlcklkczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICAvLyDmnInkurrliqDlhaXmuIXpmaTlrprml7blmahcbiAgICAgICAgICBpZiAodGhpcy5qb2luUm9vbVRpbWVyKSB7XG4gICAgICAgICAgICB0aGlzLmpvaW5Sb29tVGltZXIuc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9zdGF0ZU1hY2hpbmUudXNlckpvaW4odXNlcklkcyk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDkurrlkZjpgIDlh7pcbiAgICAgICAgICogQHBhcmFtIHVzZXJJZHNcbiAgICAgICAgICovXG4gICAgICAgIG9uVXNlckxlYXZlOiAodXNlcklkczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsU2Vzc2lvbiBvblVzZXJMZWF2ZV0gbGlzdGVuaW5nIG9uVXNlckxlYXZlIHVzZXJJZHMgLT4gJHt1c2VySWRzPy5qb2luKCcsJyl9YCk7XG4gICAgICAgICAgdGhpcy5fc3RhdGVNYWNoaW5lLnVzZXJMZWF2ZSh1c2VySWRzKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJUQyDmr4/mrKEgUGluZyDnu5PmnpxcbiAgICAgICAgICovXG4gICAgICAgIG9uUGluZzogKHJlc3VsdDogUkNSVENQaW5nUmVzdWx0KSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCBgW1JDQ2FsbFNlc3Npb24gb25QaW5nXSR7cmVzdWx0fWApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDpgJrnn6Xnu5nkuJrliqFcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyIS5vblBpbmcgJiYgdGhpcy5fbGlzdGVuZXIhLm9uUGluZyhyZXN1bHQsIHRoaXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbFNlc3Npb24gb25QaW5nXSBsaXN0ZW5pbmcgb25QaW5nIGV4Y2VwdGlvbicpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOaIv+mXtOi0qOmHj+aVsOaNruebkeWQrOWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJSZXBvcnRMaXN0ZW5lcigpIHtcbiAgICAvLyDms6jlhozmiL/pl7TotKjph4/mlbDmja7nm5HlkKzlmahcbiAgICB0aGlzLl9yb29tLnJlZ2lzdGVyUmVwb3J0TGlzdGVuZXIoe1xuICAgICAgLyoqXG4gICAgICAgKiDnlKjkuo7mjqXmlLbnirbmgIHmlbDmja7miqXlkYpcbiAgICAgICAqIEBwYXJhbSByZXBvcnRcbiAgICAgICAqL1xuICAgICAgb25TdGF0ZVJlcG9ydDogKHJlcG9ydDogSVJDUlRDU3RhdGVSZXBvcnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lciEub25SVENTdGF0ZVJlcG9ydCAmJiB0aGlzLl9saXN0ZW5lciEub25SVENTdGF0ZVJlcG9ydChyZXBvcnQsIHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsU2Vzc2lvbiBvblN0YXRlUmVwb3J0XSBsaXN0ZW5lciBvblN0YXRlUmVwb3J0IGV4Y2VwdGlvbicpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIH5JQ0Ug6L+e5o6l54q25oCB5Y+Y5pu06YCa55+lflxuICAgICAgICogQHNpbmNlIHZlcnNpb24gNS4xLjVcbiAgICAgICAqL1xuICAgICAgb25JQ0VDb25uZWN0aW9uU3RhdGVDaGFuZ2U6IChzdGF0ZTogUlRDSWNlQ29ubmVjdGlvblN0YXRlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXIhLm9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlICYmIHRoaXMuX2xpc3RlbmVyIS5vbklDRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZShzdGF0ZSwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NhbGxTZXNzaW9uIG9uSUNFQ29ubmVjdGlvblN0YXRlQ2hhbmdlXSBvbklDRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSBleGNlcHRpb24nKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICDpgJror53llK/kuIDmoIfor4ZcbiAgICovXG4gIHB1YmxpYyBnZXRTZXNzaW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldENhbGxJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqICDojrflj5bmiL/pl7TlvZPliY3kvJror50gSWTvvIzlvZPmiL/pl7TlhoXlt7Lml6DmiJDlkZjml7bmiL/pl7TkvJrlm57mlLbvvIzph43mlrDliqDlhaXml7Ygc2Vzc2lvbklkIOWwhuabtOaWsO+8jCjnlKjmiLflvZXliLbotYTmupDnlKjnmoQpXG4gICAqL1xuICBwdWJsaWMgZ2V0UlRDU2Vzc2lvbklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yb29tID8gdGhpcy5fcm9vbS5nZXRTZXNzaW9uSWQoKSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogIOebruaghyBJRO+8jOWNleWRvOWvueaWueS6uuWRmCBJZCwg576k5ZG8576k57uEIElkXG4gICAqL1xuICBwdWJsaWMgZ2V0VGFyZ2V0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFRhcmdldElkKCk7XG4gIH1cblxuICAvKipcbiAgICogIOiOt+WPluS8muivneexu+Wei1xuICAgKi9cbiAgcHVibGljIGdldENvbnZlcnNhdGlvblR5cGUoKTogQ29udmVyc2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRDb252ZXJzYXRpb25UeXBlKCk7XG4gIH1cblxuICAvKipcbiAgICogIOe7hOe7hyBJRFxuICAgKi9cbiAgcHVibGljIGdldENoYW5uZWxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2hhbm5lbElkKCk7XG4gIH1cblxuICAvKipcbiAgICog5oi/6Ze05Lq65ZGY5YiX6KGo77yM5LiN5YyF5ZCr5pys56uv5L+h5oGvXG4gICAqL1xuICBwdWJsaWMgZ2V0UmVtb3RlVXNlcnMoKTogSVVzZXJEYXRhW10ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0UmVtb3RlVXNlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICog5oi/6Ze05Lq65ZGY5YiX6KGo77yM5LiN5YyF5ZCr5pys56uv5L+h5oGvXG4gKi9cbiAgcHVibGljIGdldFVzZXJzKCk6IElVc2VyRGF0YVtdIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFJlbW90ZVVzZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5Lq65ZGY54q25oCBXG4gICAqL1xuICBwdWJsaWMgZ2V0VXNlclN0YXRlKHVzZXJJZDogc3RyaW5nKTogUkNDYWxsVXNlclN0YXRlIHtcbiAgICBpZiAoIXVzZXJJZCB8fCB0eXBlb2YgdXNlcklkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VySWQgaXMgcmVxdWlyZWQsIG11c3QgYmUgb2YgdHlwZSBcXCdzdHJpbmdcXCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlTWFjaGluZS5nZXRVc2VyU3RhdGUodXNlcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5ZzZXNzaW9u54q25oCBXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhdGUoKTogUkNDYWxsU2Vzc2lvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldFN0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5Lya6K+d5Y+R6LW36ICFaWRcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZU1hY2hpbmUuZ2V0Q2FsbGVySWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpdtZWRpYVR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXRNZWRpYVR5cGUoKTogUkNDYWxsTWVkaWFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVNYWNoaW5lLmdldE1lZGlhVHlwZSgpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBSVENQbHVnaW5Db250ZXh0LCBJUnVudGltZSwgSVJUQ0pvaW5lZEluZm8sIEVycm9yQ29kZSwgUlRDSm9pblR5cGUsIElMb2dnZXIsIEJhc2ljTG9nZ2VyLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBSQ0NhbGxFbmdpbmUsIFJDQ2FsbFN0YXRlTWFjaGluZSwgUkNDYWxsRXJyb3JDb2RlLCBSQ0NhbGxMYW5ndWFnZSwgUkNDYWxsTWVkaWFUeXBlLCBJT2ZmbGluZVJlY29yZCxcbn0gZnJvbSAnQHJjLWVtYmVkL2NhbGwtZW5naW5lJztcbmltcG9ydCB7IFJDUlRDQ2xpZW50LCBSQ1JUQ0NvZGUsIFJDTG9jYWxUcmFjayB9IGZyb20gJ0Byb25nY2xvdWQvcGx1Z2luLXJ0Yyc7XG5pbXBvcnQge1xuICBJUkNDYWxsSW5Hcm91cFBhcmFtcywgSVJDQ2FsbEluaXRPcHRpb25zLCBJUkNDYWxsUGFyYW1zLCBJTWVkaWFTdHJlYW1Db25zdHJhaW50cywgSVZhbGlkYXRpb25SZXN1bHQsIElQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBQcm9kdWNlVHlwZXMgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCBldmVudEVtaXR0ZXIgZnJvbSAnLi9ldmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgUkNDYWxsU2Vzc2lvbiB9IGZyb20gJy4vUkNDYWxsU2Vzc2lvbic7XG5pbXBvcnQge1xuICB2YWxpZGF0ZUxpc3RlbmVyLCB2YWxpZGF0ZVRhcmdldElkLCB2YWxpZGF0ZU1lZGlhVHlwZSwgdmFsaWRhdGVVc2VySWRzLCB2YWxpZGF0ZUV4dHJhLCB2YWxpZGF0ZVB1c2hDb25maWcsXG59IGZyb20gJy4vdmFsaWRhdGlvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJDQ2FsbENsaWVudCB7XG4gIC8qKlxuICAgKiBydGPlrp7kvotcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3J0Y0NsaWVudDogUkNSVENDbGllbnRcblxuICAvKipcbiAgICogY2FsbEVuZ2luZeWxguWunuS+i1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfY2FsbEVuZ2luZTogUkNDYWxsRW5naW5lXG5cbiAgLyoqXG4gICAqIOWFtuWug+WPguaVsFxuICAgKi9cbiAgcHJpdmF0ZSBfb3B0aW9uczogSVJDQ2FsbEluaXRPcHRpb25zXG5cbiAgLyoqXG4gICAqIHNlc3Npb27liJfooahcbiAgICovXG4gIHByaXZhdGUgX3Nlc3Npb25MaXN0OiBSQ0NhbGxTZXNzaW9uW10gPSBbXVxuXG4gIC8qKlxuICAgKiDnp7vliqjnq6/lkbzlj6vmjqjpgIHphY3nva5cbiAgICovXG4gIHByaXZhdGUgX2NhbGxQdXNoQ29uZmlnPzogSVB1c2hDb25maWdcblxuICAvKipcbiAgICog56e75Yqo56uv5oyC5pat5o6o6YCB6YWN572uXG4gICAqL1xuICBwcml2YXRlIF9odW5ndXBQdXNoQ29uZmlnPzogSVB1c2hDb25maWdcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9jb250ZXh0OiBSVENQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgX29wdGlvbnM6IElSQ0NhbGxJbml0T3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy5fcnRjQ2xpZW50ID0gX29wdGlvbnMucnRjQ2xpZW50O1xuXG4gICAgdGhpcy5fb3B0aW9ucyA9IHsgLyoqXG4gICAgICAgKiDmmK/lkKblhYHorrjlj5HluIPph43or5XvvIwg6buY6K6k5LiN5YWB6K64XG4gICAgICAgKi9cbiAgICAgIGlzQWxsb3dQdWJsaXNoUmV0cnk6IGZhbHNlLFxuXG4gICAgICAvKipcbiAgICAgICAqIOaYr+WQpuWFgeiuuOiuoumYhemHjeivle+8jOm7mOiupOS4jeWFgeiuuFxuICAgICAgICovXG4gICAgICBpc0FsbG93U3Vic2NyaWJlUmV0cnk6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiDnpoHnlKjop4bpopHml7blhbPmkYTlg4/lpLQsIOm7mOiupOWFs+mXrVxuICAgICAgICovXG4gICAgICBpc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGU6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFJUQyDmiL/pl7TliqDlhaXnsbvlnovvvIzpu5jorqQgICBSVENKb2luVHlwZS5DT0VYSVNUID0gMiDkuKTkuKrorr7lpIflhbHlrZhcbiAgICAgICAqICAgICBSVENKb2luVHlwZS5LSUNLID0gMCzouKLliY3kuIDkuKrorr7lpIdcbiAgICAgICAqICAgICBSVENKb2luVHlwZS5SRUZVU0UgPSAxLOW9k+WJjeWKoOWFpeaLkue7nVxuICAgICAgICogICAgIFJUQ0pvaW5UeXBlLkNPRVhJU1QgPSAyIOS4pOS4quiuvuWkh+WFseWtmFxuICAgICAgICovXG4gICAgICBqb2luVHlwZTogUlRDSm9pblR5cGUuQ09FWElTVCxcblxuICAgICAgLyoqXG4gICAgICAgKiDlhYHorrjpmY3nuqfojrflvpfmtYHvvIzojrflvpfpn7Pop4bpopHkuI3miJDlip8g77yM6ZmN57qn6I635b6X6Z+z6aKRLCDpu5jorqTkuI3lhYHorrhcbiAgICAgICAqL1xuICAgICAgaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtOiBmYWxzZSxcblxuICAgICAgLyoqXG4gICAgICAgKiDor63oqIDorr7nva4gKOaOqOmAgSksIOS4jeS8oOm7mOiupOS4uuS4reaWh1xuICAgICAgICovXG4gICAgICBsYW5nOiBSQ0NhbGxMYW5ndWFnZS5aSCxcbiAgICAgIC4uLl9vcHRpb25zLFxuICAgIH07XG5cbiAgICAvLyDliJ3lp4vljJZjYWxsRW5naW5lLCDlubbnm5HlkKxvbkludml0ZVxuICAgIHRoaXMuX2NhbGxFbmdpbmUgPSBuZXcgUkNDYWxsRW5naW5lKHRoaXMuX2NvbnRleHQsIF9ydW50aW1lLCB0aGlzLl9sb2dnZXIsIHtcblxuICAgICAgLyoqXG4gICAgICAgKiDnm5HlkKzmlLbliLBpbnZpdGVcbiAgICAgICAqL1xuICAgICAgb25JbnZpdGU6IHRoaXMuX29uSW52aXRlLmJpbmQodGhpcyksXG5cbiAgICAgIC8qKlxuICAgICAgICog55uR5ZCs56a757q/5raI5oGv5oql5ZGKXG4gICAgICAgKi9cbiAgICAgIG9uT2ZmbGluZVJlY29yZDogdGhpcy5fb25PZmZsaW5lUmVjb3JkLmJpbmQodGhpcyksXG4gICAgfSwge1xuXG4gICAgICAvKipcbiAgICAgICAqIOivreiogOiuvue9riAo5o6o6YCBKSwg5LiN5Lyg6buY6K6k5Li65Lit5paHXG4gICAgICAgKi9cbiAgICAgIGxhbmc6IHRoaXMuX29wdGlvbnMubGFuZyB8fCBSQ0NhbGxMYW5ndWFnZS5aSCxcblxuICAgIH0pO1xuXG4gICAgZXZlbnRFbWl0dGVyLm9uKCdzZXNzaW9uQ2xvc2UnLCAoeyBzZXNzaW9uLCBzdW1tYXJ5SW5mbyB9KSA9PiB7XG4gICAgICAvLyDku45zZXNzaW9uTGlzdOWOu+aOiei/meS4quWFs+mXreeahHNlc3Npb25cbiAgICAgIHRoaXMuX3JlbW92ZVNlc3Npb24oc2Vzc2lvbik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMub25TZXNzaW9uQ2xvc2Uoc2Vzc2lvbiwgc3VtbWFyeUluZm8pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdfJywgJ1tSQ0NDYWxsQ2xpZW50XSBvcHRpb25zLm9uU2Vzc2lvbkNsb3NlIGV4Y2VwdGlvbicpO1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDmjqXlkKzkuYvliY3mjILmlq3lhbblroPnmoRzZXNzaW9uXG4gICAgZXZlbnRFbWl0dGVyLm9uKCdodW5ndXBPdGhlclNlc3Npb24nLCAoeyBzZXNzaW9uIH0pID0+IHtcbiAgICAgIGNvbnN0IGlkID0gc2Vzc2lvbi5nZXRTZXNzaW9uSWQoKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgaHVuZ3VwT3RoZXJTZXNzaW9uXSBzZXNzaW9uSWQgcmVhZHkgdG8gYWNjZXB0IC0+ICR7aWR9YCk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IGh1bmd1cE90aGVyU2Vzc2lvbl0gc2Vzc2lvbkxpc3QgLT4ke3RoaXMuX3Nlc3Npb25MaXN0Lm1hcCgoc2VzKSA9PiBzZXMuZ2V0U2Vzc2lvbklkKCkpLmpvaW4oJywnKX1gKTtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIHdoaWxlICh0aGlzLl9zZXNzaW9uTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIOWmguaenOS4juimgeaOpeWQrOeahHNlc3Npb27kuI3kuIDoh7RcbiAgICAgICAgaWYgKHRoaXMuX3Nlc3Npb25MaXN0W2ldLmdldFNlc3Npb25JZCgpICE9PSBpZCkge1xuICAgICAgICAgIC8vIOaMguaWrVxuICAgICAgICAgIHRoaXMuX3Nlc3Npb25MaXN0W2ldLmh1bmd1cCgpO1xuXG4gICAgICAgICAgLy8g5oyC5pat5ZCO5Yig6ZmkXG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbkxpc3Quc3BsaWNlKGksIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIOWmguaenOaYr+imgeaOpeWQrOeahHNlc3Npb27vvIzot7Pov4fov5nkuKrntKLlvJXvvIzmiYDku6XliqAxXG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IGh1bmd1cE90aGVyU2Vzc2lvbl0gY3VycmVudCBzZXNzaW9uTGlzdCBsZW5ndGggLT4ke3RoaXMuX3Nlc3Npb25MaXN0Lmxlbmd0aH1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnm5HlkKxvbkludml0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfb25JbnZpdGUoc3RhdGVNYWNoaW5lOiBSQ0NhbGxTdGF0ZU1hY2hpbmUsIGV4dHJhPzogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBfb25JbnZpdGVdIFJlY2VpdmVkIGludml0ZSBtZXNzYWdlJyk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBSQ0NhbGxTZXNzaW9uKHN0YXRlTWFjaGluZSwgdGhpcy5fcnRjQ2xpZW50LCB0aGlzLl9sb2dnZXIsIHtcblxuICAgICAgLy8g5piv5ZCm5YWB6K646K6i6ZiF6YeN6K+VXG4gICAgICBpc0FsbG93U3Vic2NyaWJlUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5LFxuXG4gICAgICAvLyDmmK/lkKblhYHorrjlj5HluIPph43or5VcbiAgICAgIGlzQWxsb3dQdWJsaXNoUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1B1Ymxpc2hSZXRyeSxcblxuICAgICAgLyoqXG4gICAgICAgKiDnpoHnlKjop4bpopHml7blhbPmkYTlg4/lpLRcbiAgICAgICAqL1xuICAgICAgaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlOiB0aGlzLl9vcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSVEMg5oi/6Ze05Yqg5YWl57G75Z6LXG4gICAgICAgKi9cbiAgICAgIGpvaW5UeXBlOiB0aGlzLl9vcHRpb25zLmpvaW5UeXBlLFxuXG4gICAgICAvLyDlhYHorrjpmY3nuqfojrflvpfmtYHvvIzojrflvpfpn7Pop4bpopHkuI3miJDlip8g77yM6ZmN57qn6I635b6X6Z+z6aKRLCDpu5jorqTkuI3lhYHorrhcbiAgICAgIGlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbTogdGhpcy5fb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0sXG5cbiAgICAgIC8vIOagh+aYjuaYr+iiq+WPq+S6p+eUn+eahHNlc3Npb25cbiAgICAgIHByb2R1Y2VUeXBlOiBQcm9kdWNlVHlwZXMuQ0FMTEVFLFxuXG4gICAgICBjYWxsUHVzaENvbmZpZzogdGhpcy5fY2FsbFB1c2hDb25maWcsXG5cbiAgICAgIGh1bmd1cFB1c2hDb25maWc6IHRoaXMuX2h1bmd1cFB1c2hDb25maWcsXG4gICAgfSk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBfb25JbnZpdGVdIFJlY2VpdmVkIGludml0ZSBtZXNzYWdlLCBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzZXNzaW9uJyk7XG5cbiAgICAvKipcbiAgICAgKiDlpoLmnpzpgJror53nmoTml7blgJnkuI3lhYHorrjmjqXlkKzmlrDnmoTpgJror53vvIznm7TmjqXmjILmlq3vvIwg6L+Z5Lqb5bel5L2c5ZyoY2FsbEVuZ2luZemHjOWujOaIkFxuICAgICAqL1xuICAgIHRoaXMuX3Nlc3Npb25MaXN0LnB1c2goc2Vzc2lvbik7XG5cbiAgICB0cnkge1xuICAgICAgLy8g5omn6KGM55So5oi3QVBJ55qE55uR5ZCsXG4gICAgICB0aGlzLl9vcHRpb25zLm9uU2Vzc2lvbihzZXNzaW9uLCBleHRyYSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsQ2xpZW50IF9vcHRpb25zLm9uU2Vzc2lvbl0gb25TZXNzaW9uIGV4Y2VwdGlvbicpO1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIOW/hemhu+WcqG9uU2Vzc2lvbumHjOazqOWGjHNlc3Npb27nm5HlkKzkuovku7bvvIzov5nph4zmo4DmtYvkuIDkuIvmnInmsqHmnInms6jlhoxcbiAgICBpZiAoc2Vzc2lvbi5fbGlzdGVuZXIpIHtcbiAgICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVMaXN0ZW5lcihzZXNzaW9uLl9saXN0ZW5lcik7XG4gICAgICBpZiAoIWNvbmNsdXNpb24ucmVzdWx0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjb25jbHVzaW9uLm1zZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsICdbUkNDYWxsQ2xpZW50IF9vcHRpb25zLm9uU2Vzc2lvbl0gc2Vzc2lvbiBNdXN0IEhhdmUgTGlzdGVuZXInKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW1JDQ2FsbFNlc3Npb24gIF9vcHRpb25zLm9uU2Vzc2lvbl0gc2Vzc2lvbiBNdXN0IEhhdmUgTGlzdGVuZXInKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog55uR5ZCs56a757q/5raI5oGv5oql5ZGKXG4gICAqIEBwYXJhbSByZWNvcmRcbiAgICovXG4gIHB1YmxpYyBfb25PZmZsaW5lUmVjb3JkKHJlY29yZDogSU9mZmxpbmVSZWNvcmQpIHtcbiAgICB0cnkge1xuICAgICAgLy8g5omn6KGM55So5oi3QVBJ55qE55uR5ZCsXG4gICAgICB0aGlzLl9vcHRpb25zLm9uT2ZmbGluZVJlY29yZCAmJiB0aGlzLl9vcHRpb25zLm9uT2ZmbGluZVJlY29yZChyZWNvcmQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCAnW1JDQ2FsbENsaWVudCBfb3B0aW9ucy5vbk9mZmxpbmVSZWNvcmRdIG9uT2ZmbGluZVJlY29yZCBleGNlcHRpb24nKTtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5rOo5YaM55So5oi35L+h5oGv44CC5rOo5YaM5ZCO77yM5Zyo5Y+R6LW36YKA6K+35oiW5oyC5pat562J5pON5L2c5pe277yM5Lya5bCG6K+l5L+h5oGv5LiA5bm25Y+R6YCB57uZ5a+556uvXG4gICAqIEBwYXJhbSBpbmZvLm5hbWUgICAgICAgIOeUqOaIt+WQjeensFxuICAgKiBAcGFyYW0gaW5mby5wb3J0cmFpdFVyaSDnlKjmiLflpLTlg4/kv6Hmga9cbiAgICogQHBhcmFtIGluZm8uZXh0cmEgICAgICAg6aKE55WZ5ouT5bGV5a2X5q61XG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJVc2VySW5mbyhpbmZvOiB7IG5hbWU/OiBzdHJpbmc7IHBvcnRyYWl0VXJpPzogc3RyaW5nOyBleHRyYT86IHN0cmluZzsgfSA9IHt9KSB7XG4gICAgdGhpcy5fY2FsbEVuZ2luZS5yZWdpc3RlclVzZXJJbmZvKGluZm8pO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgcmVnaXN0ZXJVc2VySW5mb10gc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyIHVzZXIgaW5mbyBkYXRhJyk7XG4gIH1cblxuICAvKipcbiAgKiDot6hBcHDljZXlkbzvvIxcYuWPkemAgWludml0Zea2iOaBr++8jOWbnuiwg+WbnuadpeaOpeaUtnN0YXRlTWFjaGluZSwg5bu6c2Vzc2lvblxuICAqIEBwYXJhbSBwYXJhbXMudGFyZ2V0SWQg6KKr5ZG85Y+r5LiA5pa555qE55So5oi3IGlkIOW/heWhq1xuICAqIEBwYXJhbSBwYXJhbXMubWVkaWFUeXBlIOmfs+mikeWRvOWPqyBvciDpn7Pop4bpopHlkbzlj6sgIOW/heWhq1xuICAqIEBwYXJhbSBwYXJhbXMubGlzdGVuZXIgKHNlc3Npb27kuIrnmoTnm5HlkKwpIOW/heWhq1xuICAqIEBwYXJhbSBwYXJhbXMuY29uc3RyYWludHMg6I635Y+W6Z+z6aKR5oiW6Z+z6KeG6aKR6LWE5rqQ5pe255qE5Y+C5pWwIOWPr+mAiVxuICAqIEBwYXJhbSBwYXJhbXMuY2hhbm5lbElkIOe7hOe7hyBJZCDlj6/pgIlcbiAgKiBAcGFyYW0gcGFyYW1zLmV4dHJhIOa2iOaBr+aJqeWxleS/oeaBr1xuICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaFRpdGxlIOmAmuefpeeahOagh+mimFxuICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaENvbnRlbnQg6YCa55+l55qE5YaF5a65XG4gICogQHBhcmFtIHBhcmFtcy5iaXRyYXRlIOmcgOimgeiuvue9rueahOeggeeOh+WPguaVsFxuICAqXG4gICovXG4gIHB1YmxpYyBhc3luYyBzdGFydENyb3NzQ2FsbCh7XG4gICAgdGFyZ2V0SWQsIG1lZGlhVHlwZSA9IFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQgPSAnJywgZXh0cmEgPSAnJywgcHVzaFRpdGxlID0gJycsIHB1c2hDb250ZW50ID0gJycsIGJpdHJhdGUsXG4gIH06IElSQ0NhbGxQYXJhbXMpOiBQcm9taXNlPHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLCBzZXNzaW9uPzogUkNDYWxsU2Vzc2lvbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuX19jYWxsKHtcbiAgICAgIHRhcmdldElkLCBtZWRpYVR5cGUsIGxpc3RlbmVyLCBjb25zdHJhaW50cywgY2hhbm5lbElkLCBleHRyYSwgcHVzaFRpdGxlLCBwdXNoQ29udGVudCwgYml0cmF0ZSwgaXNDcm9zc0FwcGtleTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDljZXlkbzvvIxcYuWPkemAgWludml0Zea2iOaBr++8jOWbnuiwg+WbnuadpeaOpeaUtnN0YXRlTWFjaGluZSwg5bu6c2Vzc2lvblxuICAgKiBAcGFyYW0gcGFyYW1zLnRhcmdldElkIOiiq+WRvOWPq+S4gOaWueeahOeUqOaItyBpZCDlv4XloatcbiAgICogQHBhcmFtIHBhcmFtcy5tZWRpYVR5cGUg6Z+z6aKR5ZG85Y+rIG9yIOmfs+inhumikeWRvOWPqyAg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMubGlzdGVuZXIgKHNlc3Npb27kuIrnmoTnm5HlkKwpIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbnN0cmFpbnRzIOiOt+WPlumfs+mikeaIlumfs+inhumikei1hOa6kOaXtueahOWPguaVsCDlj6/pgIlcbiAgICogQHBhcmFtIHBhcmFtcy5jaGFubmVsSWQg57uE57uHIElkIOWPr+mAiVxuICAgKiBAcGFyYW0gcGFyYW1zLmV4dHJhIOa2iOaBr+aJqeWxleS/oeaBr1xuICAgKiBAZGVwcmVjYXRlZCA1LjEuMiDniYjmnKzlup/lvIMgcGFyYW1zLnB1c2hUaXRsZSDpgJrnn6XnmoTmoIfpophcbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoQ29udGVudCDpgJrnn6XnmoTlhoXlrrlcbiAgICogQHBhcmFtIHBhcmFtcy5iaXRyYXRlIOmcgOimgeiuvue9rueahOeggeeOh+WPguaVsFxuICAgKlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNhbGwoe1xuICAgIHRhcmdldElkLCBtZWRpYVR5cGUgPSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8sIGxpc3RlbmVyLCBjb25zdHJhaW50cywgY2hhbm5lbElkID0gJycsIGV4dHJhID0gJycsIHB1c2hUaXRsZSA9ICcnLCBwdXNoQ29udGVudCA9ICcnLCBiaXRyYXRlLFxuICB9OiBJUkNDYWxsUGFyYW1zKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc2Vzc2lvbj86IFJDQ2FsbFNlc3Npb24gfT4ge1xuICAgIHJldHVybiB0aGlzLl9fY2FsbCh7XG4gICAgICB0YXJnZXRJZCwgbWVkaWFUeXBlLCBsaXN0ZW5lciwgY29uc3RyYWludHMsIGNoYW5uZWxJZCwgZXh0cmEsIHB1c2hUaXRsZSwgcHVzaENvbnRlbnQsIGJpdHJhdGUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9fY2FsbCh7XG4gICAgdGFyZ2V0SWQsIG1lZGlhVHlwZSA9IFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQgPSAnJywgZXh0cmEgPSAnJywgcHVzaFRpdGxlID0gJycsIHB1c2hDb250ZW50ID0gJycsIGJpdHJhdGUsIGlzQ3Jvc3NBcHBrZXkgPSBmYWxzZSxcbiAgfTogSVJDQ2FsbFBhcmFtcyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHNlc3Npb24/OiBSQ0NhbGxTZXNzaW9uIH0+IHtcbiAgICBjb25zdCBwdXNoQ29uZmlnID0gdGhpcy5fY2FsbFB1c2hDb25maWcgPyB0aGlzLl9jYWxsUHVzaENvbmZpZyA6IHsgcHVzaFRpdGxlLCBwdXNoQ29udGVudCB9O1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbF0gZXh0cmEtPiR7ZXh0cmF9IHB1c2hDb25maWctPiR7SlNPTi5zdHJpbmdpZnkocHVzaENvbmZpZyl9YCk7XG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHRbXSA9IFt2YWxpZGF0ZVRhcmdldElkKHRhcmdldElkKSwgdmFsaWRhdGVNZWRpYVR5cGUobWVkaWFUeXBlKSwgdmFsaWRhdGVMaXN0ZW5lcihsaXN0ZW5lciksIHZhbGlkYXRlRXh0cmEoZXh0cmEpXTtcbiAgICBjb25zdCBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCByZXN1bHQgPSBjb25jbHVzaW9uLmV2ZXJ5KChvYmo6IElWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAhb2JqLnJlc3VsdCAmJiBtZXNzYWdlcy5wdXNoKG9iai5tc2chKTtcbiAgICAgIHJldHVybiBvYmoucmVzdWx0O1xuICAgIH0pO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtSQ0NhbGxDbGllbnQgY2FsbF0gJHttZXNzYWdlcy5qb2luKCdcXG4nKX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGU6IHZhbGlkYXRlUHVzaENvZGUsIGVycm9yTXNnIH0gPSB2YWxpZGF0ZVB1c2hDb25maWcocHVzaENvbmZpZyk7XG4gICAgaWYgKHZhbGlkYXRlUHVzaENvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsXSBwYXJhbSBlcnJvciwgZXJyb3JNc2c6ICR7ZXJyb3JNc2d9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiB2YWxpZGF0ZVB1c2hDb2RlIH07XG4gICAgfVxuXG4gICAgbGV0IGxvY2FsVHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSA9IFtdO1xuXG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrKG1lZGlhVHlwZSwgY29uc3RyYWludHMpO1xuICAgIGlmIChfY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IF9jb2RlIH07XG4gICAgfVxuICAgIGxvY2FsVHJhY2tzID0gdHJhY2tzITtcblxuICAgIGxvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAvLyDorr7nva7noIHnjodcbiAgICAgIGlmICh0cmFjay5pc0F1ZGlvVHJhY2soKSAmJiBiaXRyYXRlPy5hdWRpbykge1xuICAgICAgICB0cmFjay5zZXRCaXRyYXRlKGJpdHJhdGU/LmF1ZGlvKTtcbiAgICAgIH1cbiAgICAgIGlmICh0cmFjay5pc1ZpZGVvVHJhY2soKSAmJiBiaXRyYXRlPy52aWRlbykge1xuICAgICAgICB0cmFjay5zZXRCaXRyYXRlKGJpdHJhdGU/LnZpZGVvPy5tYXgsIGJpdHJhdGU/LnZpZGVvPy5taW4sIGJpdHJhdGU/LnZpZGVvPy5zdGFydCk7XG4gICAgICB9XG4gICAgICAvLyDlkJHlpJbmipvlh7rmnKzlnLDmtYFcbiAgICAgIGxpc3RlbmVyLm9uVHJhY2tSZWFkeSh0cmFjayk7XG4gICAgfSk7XG5cbiAgICAvLyDosIPnlKhjYWxsRW5naW5l55qEY2FsbOi/lOWbnuS4gOS4queKtuaAgeacuueahOWunuS+i1xuICAgIGNvbnN0IHsgY29kZSwgc3RhdGVNYWNoaW5lIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmNhbGwoY2hhbm5lbElkLCB0YXJnZXRJZCwgbWVkaWFUeXBlLCBleHRyYSwgcHVzaENvbmZpZywgaXNDcm9zc0FwcGtleSk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTICYmIHN0YXRlTWFjaGluZSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBjYWxsXSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzdGF0ZSBtYWNoaW5lJyk7XG4gICAgICBjb25zdCBzZXNzaW9uID0gbmV3IFJDQ2FsbFNlc3Npb24oc3RhdGVNYWNoaW5lLCB0aGlzLl9ydGNDbGllbnQsIHRoaXMuX2xvZ2dlciwge1xuICAgICAgICBsb2NhbFRyYWNrcyxcblxuICAgICAgICAvLyDmmK/lkKblhYHorrjorqLpmIXph43or5VcbiAgICAgICAgaXNBbGxvd1N1YnNjcmliZVJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dTdWJzY3JpYmVSZXRyeSxcblxuICAgICAgICAvLyDmmK/lkKblhYHorrjorqLpmIXph43or5VcbiAgICAgICAgaXNBbGxvd1B1Ymxpc2hSZXRyeTogdGhpcy5fb3B0aW9ucy5pc0FsbG93UHVibGlzaFJldHJ5LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDnpoHnlKjop4bpopHml7blhbPmkYTlg4/lpLRcbiAgICAgICAgICovXG4gICAgICAgIGlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZTogdGhpcy5fb3B0aW9ucy5pc09mZkNhbWVyYVdoZW5WaWRlb0Rpc2FibGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJUQyDmiL/pl7TliqDlhaXnsbvlnotcbiAgICAgICAgICovXG4gICAgICAgIGpvaW5UeXBlOiB0aGlzLl9vcHRpb25zLmpvaW5UeXBlLFxuXG4gICAgICAgIC8vIOWFgeiuuOmZjee6p+iOt+W+l+a1ge+8jOiOt+W+l+mfs+inhumikeS4jeaIkOWKnyDvvIzpmY3nuqfojrflvpfpn7PpopEsIOm7mOiupOS4jeWFgeiuuFxuICAgICAgICBpc0FsbG93RGVtb3Rpb25HZXRTdHJlYW06IHRoaXMuX29wdGlvbnMuaXNBbGxvd0RlbW90aW9uR2V0U3RyZWFtLFxuXG4gICAgICAgIC8vIOagh+aYjuaYr+S4u+WPq+S6p+eUn+eahHNlc3Npb25cbiAgICAgICAgcHJvZHVjZVR5cGU6IFByb2R1Y2VUeXBlcy5DQUxMRVIsXG5cbiAgICAgICAgaXNDcm9zc0FwcGtleSxcblxuICAgICAgICBjYWxsUHVzaENvbmZpZzogdGhpcy5fY2FsbFB1c2hDb25maWcsXG5cbiAgICAgICAgaHVuZ3VwUHVzaENvbmZpZzogdGhpcy5faHVuZ3VwUHVzaENvbmZpZyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBzZXNzaW9u5LiK5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgICBzZXNzaW9uLnJlZ2lzdGVyU2Vzc2lvbkxpc3RlbmVyKGxpc3RlbmVyKTtcblxuICAgICAgdGhpcy5fc2Vzc2lvbkxpc3QucHVzaChzZXNzaW9uKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbF0gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc2Vzc2lvbiBvYmplY3QsIHNlc3Npb25JZDogJHtzZXNzaW9uLmdldFNlc3Npb25JZCgpfWApO1xuICAgICAgcmV0dXJuIHsgY29kZSwgc2Vzc2lvbiB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbENsaWVudCBjYWxsXSBjYWxsIGZhaWxlZCBjb2RlIC0+OiAke2NvZGV9YCk7XG4gICAgbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIC8vIOemgeeUqOinhumikVxuICAgICAgdHJhY2subXV0ZSgpO1xuXG4gICAgICAvLyDlhbPpl63mkYTlg4/lpLRcbiAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HotbfnvqTnu4Tlkbzlj6tcbiAgICogQHBhcmFtIHBhcmFtcy50YXJnZXRJZCDnvqTnu4QgSWQg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMudXNlcklkcyDooqvlkbzlj6vnmoTnvqTlhoXmiJDlkZggSWQg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMubWVkaWFUeXBlIOmfs+mikeWRvOWPqyBvciDpn7Pop4bpopHlkbzlj6sg5b+F5aGrXG4gICAqIEBwYXJhbSBwYXJhbXMubGlzdGVuZXIgKHNlc3Npb27kuIrnmoTnm5HlkKwpIOW/heWhq1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbnN0cmFpbnRzIOiOt+WPlumfs+mikeaIlumfs+inhumikei1hOa6kOaXtueahOWPguaVsCDlj6/pgIlcbiAgICogQHBhcmFtIHBhcmFtcy5jaGFubmVsSWQg57uE57uHIElkIOWPr+mAiVxuICAgKiBAcGFyYW0gcGFyYW1zLmV4dHJhIOa2iOaBr+aJqeWxleS/oeaBryDlj6/pgIlcbiAgICogQGRlcHJlY2F0ZWQgNS4xLjIg54mI5pys5bqf5byDIHBhcmFtcy5wdXNoVGl0bGUg6YCa55+l55qE5qCH6aKYXG4gICAqIEBkZXByZWNhdGVkIDUuMS4yIOeJiOacrOW6n+W8gyBwYXJhbXMucHVzaENvbnRlbnQg6YCa55+l55qE5YaF5a65XG4gICAqIEBwYXJhbSBwYXJhbXMuYml0cmF0ZSDpnIDopoHorr7nva7nmoTnoIHnjoflj4LmlbBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYWxsSW5Hcm91cCh7XG4gICAgdGFyZ2V0SWQsIHVzZXJJZHMsIG1lZGlhVHlwZSA9IFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgbGlzdGVuZXIsIGNvbnN0cmFpbnRzLCBjaGFubmVsSWQgPSAnJywgZXh0cmEgPSAnJywgcHVzaFRpdGxlID0gJycsIHB1c2hDb250ZW50ID0gJycsIGJpdHJhdGUsXG4gIH06IElSQ0NhbGxJbkdyb3VwUGFyYW1zKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbEVycm9yQ29kZSwgc2Vzc2lvbj86IFJDQ2FsbFNlc3Npb24gfT4ge1xuICAgIGNvbnN0IHB1c2hDb25maWcgPSB0aGlzLl9jYWxsUHVzaENvbmZpZyA/IHRoaXMuX2NhbGxQdXNoQ29uZmlnIDogeyBwdXNoVGl0bGUsIHB1c2hDb250ZW50IH07XG4gICAgY29uc3QgY29uY2x1c2lvbjogSVZhbGlkYXRpb25SZXN1bHRbXSA9IFt2YWxpZGF0ZVRhcmdldElkKHRhcmdldElkKSwgdmFsaWRhdGVVc2VySWRzKHVzZXJJZHMpLCB2YWxpZGF0ZU1lZGlhVHlwZShtZWRpYVR5cGUpLCB2YWxpZGF0ZUxpc3RlbmVyKGxpc3RlbmVyKSwgdmFsaWRhdGVFeHRyYShleHRyYSldO1xuICAgIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNvbmNsdXNpb24uZXZlcnkoKG9iajogSVZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICFvYmoucmVzdWx0ICYmIG1lc3NhZ2VzLnB1c2gob2JqLm1zZyEpO1xuICAgICAgcmV0dXJuIG9iai5yZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsQ2xpZW50IGNhbGxJbkdyb3VwXSAke21lc3NhZ2VzLmpvaW4oJ1xcbicpfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZTogdmFsaWRhdGVQdXNoQ29kZSwgZXJyb3JNc2cgfSA9IHZhbGlkYXRlUHVzaENvbmZpZyhwdXNoQ29uZmlnKTtcbiAgICBpZiAodmFsaWRhdGVQdXNoQ29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcignXycsIGBbUkNDYWxsQ2xpZW50IGNhbGxdIHBhcmFtIGVycm9yLCBlcnJvck1zZzogJHtlcnJvck1zZ31gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IHZhbGlkYXRlUHVzaENvZGUgfTtcbiAgICB9XG5cbiAgICBsZXQgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICBjb25zdCB7IGNvZGU6IF9jb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2sobWVkaWFUeXBlLCBjb25zdHJhaW50cyk7XG4gICAgaWYgKF9jb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogX2NvZGUgfTtcbiAgICB9XG4gICAgbG9jYWxUcmFja3MgPSB0cmFja3MhO1xuXG4gICAgbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIC8vIOiuvue9rueggeeOh1xuICAgICAgaWYgKHRyYWNrLmlzQXVkaW9UcmFjaygpICYmIGJpdHJhdGU/LmF1ZGlvKSB7XG4gICAgICAgIHRyYWNrLnNldEJpdHJhdGUoYml0cmF0ZT8uYXVkaW8pO1xuICAgICAgfVxuICAgICAgaWYgKHRyYWNrLmlzVmlkZW9UcmFjaygpICYmIGJpdHJhdGU/LnZpZGVvKSB7XG4gICAgICAgIHRyYWNrLnNldEJpdHJhdGUoYml0cmF0ZT8udmlkZW8/Lm1heCwgYml0cmF0ZT8udmlkZW8/Lm1pbiwgYml0cmF0ZT8udmlkZW8/LnN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIC8vIOWQkeWkluaKm+WHuuacrOWcsOa1gVxuICAgICAgbGlzdGVuZXIub25UcmFja1JlYWR5KHRyYWNrKTtcbiAgICB9KTtcblxuICAgIC8vIOW+gOe7hOmHjOWPkea2iOaBr1xuICAgIGNvbnN0IHsgY29kZSwgc3RhdGVNYWNoaW5lIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmNhbGxJbkdyb3VwKGNoYW5uZWxJZCwgdGFyZ2V0SWQsIG1lZGlhVHlwZSwgdXNlcklkcywgZXh0cmEsIHB1c2hDb25maWcpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUyAmJiBzdGF0ZU1hY2hpbmUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgJ1tSQ0NhbGxDbGllbnQgY2FsbEluR3JvdXBdIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIHN0YXRlIG1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgUkNDYWxsU2Vzc2lvbihzdGF0ZU1hY2hpbmUsIHRoaXMuX3J0Y0NsaWVudCwgdGhpcy5fbG9nZ2VyLCB7XG4gICAgICAgIGxvY2FsVHJhY2tzLFxuXG4gICAgICAgIC8vIOaYr+WQpuWFgeiuuOiuoumYhemHjeivlVxuICAgICAgICBpc0FsbG93U3Vic2NyaWJlUmV0cnk6IHRoaXMuX29wdGlvbnMuaXNBbGxvd1N1YnNjcmliZVJldHJ5LFxuXG4gICAgICAgIC8vIOaYr+WQpuWFgeiuuOWPkeW4g+mHjeivlVxuICAgICAgICBpc0FsbG93UHVibGlzaFJldHJ5OiB0aGlzLl9vcHRpb25zLmlzQWxsb3dQdWJsaXNoUmV0cnksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIOemgeeUqOinhumikeaXtuWFs+aRhOWDj+WktFxuICAgICAgICAgKi9cbiAgICAgICAgaXNPZmZDYW1lcmFXaGVuVmlkZW9EaXNhYmxlOiB0aGlzLl9vcHRpb25zLmlzT2ZmQ2FtZXJhV2hlblZpZGVvRGlzYWJsZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUlRDIOaIv+mXtOWKoOWFpeexu+Wei1xuICAgICAgICAgKi9cbiAgICAgICAgam9pblR5cGU6IHRoaXMuX29wdGlvbnMuam9pblR5cGUsXG5cbiAgICAgICAgLy8g5YWB6K646ZmN57qn6I635b6X5rWB77yM6I635b6X6Z+z6KeG6aKR5LiN5oiQ5YqfIO+8jOmZjee6p+iOt+W+l+mfs+mikSwg6buY6K6k5LiN5YWB6K64XG4gICAgICAgIGlzQWxsb3dEZW1vdGlvbkdldFN0cmVhbTogdGhpcy5fb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0sXG5cbiAgICAgICAgLy8g5qCH5piO5piv5Li75Y+r5Lqn55Sf55qEc2Vzc2lvblxuICAgICAgICBwcm9kdWNlVHlwZTogUHJvZHVjZVR5cGVzLkNBTExFUixcblxuICAgICAgICBjYWxsUHVzaENvbmZpZzogdGhpcy5fY2FsbFB1c2hDb25maWcsXG5cbiAgICAgICAgaHVuZ3VwUHVzaENvbmZpZzogdGhpcy5faHVuZ3VwUHVzaENvbmZpZyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBzZXNzaW9u5LiK5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgICBzZXNzaW9uLnJlZ2lzdGVyU2Vzc2lvbkxpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgIHRoaXMuX3Nlc3Npb25MaXN0LnB1c2goc2Vzc2lvbik7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsIGBbUkNDYWxsQ2xpZW50IGNhbGxJbkdyb3VwXSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBzZXNzaW9uIG9iamVjdCwgc2Vzc2lvbklkOiAke3Nlc3Npb24uZ2V0U2Vzc2lvbklkKCl9YCk7XG4gICAgICByZXR1cm4geyBjb2RlLCBzZXNzaW9uIH07XG4gICAgfVxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdfJywgYFtSQ0NhbGxDbGllbnQgY2FsbEluR3JvdXBdIGNhbGxJbkdyb3VwIGZhaWxlZCBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICBsb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgLy8g56aB55So6KeG6aKRXG4gICAgICB0cmFjay5tdXRlKCk7XG5cbiAgICAgIC8vIOWFs+mXreaRhOWDj+WktFxuICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiwg1JUQyBBUEkg6I635b6X5pys5Zyw5rWBXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9nZXRMb2NhbFRyYWNrQ29yZShtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSwgY29uc3RyYWludHM/OiBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHRyYWNrcz86IFJDTG9jYWxUcmFja1tdIH0+IHtcbiAgICAvLyDmo4DmtYvmmK/lkKbog73lpJ/ojrflvpfmnKzlnLDmtYFcbiAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU8pIHtcbiAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQXVkaW9UcmFjaygnUm9uZ0Nsb3VkUlRDJywgY29uc3RyYWludHMgJiYgY29uc3RyYWludHMuYXVkaW8gJiYgeyAuLi5jb25zdHJhaW50cy5hdWRpbyB9KTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbENsaWVudCBfZ2V0VHJhY2tdIGdldCBBdWRpbyBsb2NhbCB0cmFja3MgZmFpbGVkIFJDVCBjb2RlIC0+ICR7Y29kZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLkdFVF9MT0NBTF9BVURJT19UUkFDS19FUlJPUiB9O1xuICAgICAgfVxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ18nLCAnW1JDQ2FsbENsaWVudCBfZ2V0VHJhY2tdIHN1Y2Nlc3NmdWxseSBnZXQgQXVkaW8gbG9jYWwgdHJhY2tzJyk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgdHJhY2tzOiBbdHJhY2shXSB9O1xuICAgIH1cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrcyB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBbmRDYW1lcmFUcmFja3MoJ1JvbmdDbG91ZFJUQycsIGNvbnN0cmFpbnRzICYmIHsgLi4uY29uc3RyYWludHMgfSk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbENsaWVudCBfZ2V0VHJhY2tdIGdldCBBdWRpbyBhbmQgVmlkZW8gbG9jYWwgdHJhY2tzIGZhaWxlZCBSQ1QgY29kZSAtPiAke2NvZGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuR0VUX0xPQ0FMX0FVRElPX0FORF9WSURFT19UUkFDS19FUlJPUiB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2dnZXIuaW5mbygnXycsICdbUkNDYWxsQ2xpZW50IF9nZXRUcmFja10gc3VjY2Vzc2Z1bGx5IGdldCBhdWRpbyBhbmQgdmlkZW8gbG9jYWwgdHJhY2tzJyk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MsIHRyYWNrcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0TG9jYWxUcmFjayhtZWRpYVR5cGU6IFJDQ2FsbE1lZGlhVHlwZSwgY29uc3RyYWludHM/OiBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIHRyYWNrcz86IFJDTG9jYWxUcmFja1tdIH0+IHtcbiAgICAvLyDlpoLmnpzmmK/lhYHorrjpmY3nuqfojrflvpfmtYHvvIzlubbkuJTmmK/ojrflvpfpn7Pop4bpopFcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5pc0FsbG93RGVtb3Rpb25HZXRTdHJlYW0gJiYgbWVkaWFUeXBlID09PSBSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShSQ0NhbGxNZWRpYVR5cGUuQVVESU9fVklERU8sIGNvbnN0cmFpbnRzKTtcblxuICAgICAgLy8g5aaC5p6c6Z+z6KeG6aKR5LiN6IO96I635b6X77yM5bCx6ZmN57uE6I635b6X6Z+z6aKRXG4gICAgICBpZiAoY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgY29uc3QgeyBjb2RlLCB0cmFja3MgfSA9IGF3YWl0IHRoaXMuX2dldExvY2FsVHJhY2tDb3JlKFJDQ2FsbE1lZGlhVHlwZS5BVURJTywgY29uc3RyYWludHMpO1xuICAgICAgICBpZiAoY29kZSAhPT0gUkNDYWxsRXJyb3JDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY29kZSwgdHJhY2tzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjb2RlLCB0cmFja3MgfTtcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlOiBfY29kZSwgdHJhY2tzIH0gPSBhd2FpdCB0aGlzLl9nZXRMb2NhbFRyYWNrQ29yZShtZWRpYVR5cGUsIGNvbnN0cmFpbnRzKTtcbiAgICBpZiAoX2NvZGUgIT09IFJDQ2FsbEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBfY29kZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlOiBfY29kZSwgdHJhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICog5LuOc2Vzc2lvbkxpc3TliKDpmaTmn5DkuKpzZXNzaW9uXG4gICAqL1xuICBwcml2YXRlIF9yZW1vdmVTZXNzaW9uKHNlc3Npb246IFJDQ2FsbFNlc3Npb24pIHtcbiAgICBjb25zdCBpZCA9IHNlc3Npb24uZ2V0U2Vzc2lvbklkKCk7XG4gICAgdGhpcy5fc2Vzc2lvbkxpc3QgPSB0aGlzLl9zZXNzaW9uTGlzdC5maWx0ZXIoKHNlc3Npb24pID0+IHNlc3Npb24uZ2V0U2Vzc2lvbklkKCkgIT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blt7Hmlrnlhbbku5bnq6/liqDlhaXpgJror53vvIjlt7LliqDlhaUgUlRDIOaIv+mXtO+8ieeahOeUqOaIt+S/oeaBr1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEpvaW5lZFJvb21JbmZvKCk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUsIGRhdGE/OiBJUlRDSm9pbmVkSW5mb1tdIH0+IHtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NvbnRleHQuZ2V0UlRDSm9pbmVkVXNlckluZm8odGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSk7XG4gICAgaWYgKGNvZGUgIT09IEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgZ2V0Sm9pbmVkVXNlckluZm8gZXJyb3IgY29kZTogJHtjb2RlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsRXJyb3JDb2RlLlFVRVJZX0pPSU5FRF9VU0VSX0lORk9fRVJST1IgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUywgZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruWRvOWPq+OAgeaMguaWreaOqOmAgeaVsOaNrlxuICAgKiBAcGFyYW0gY2FsbFB1c2hDb25maWcg5ZG85Y+r5o6o6YCB6YWN572uXG4gICAqIEBwYXJhbSBodW5ndXBQdXNoQ29uZmlnIOaMguaWreaOqOmAgemFjee9rlxuICAgKiBAZGVzY3JpcHRpb24gY2FsbExpYiDkvJrlhoXnva4gSVB1c2hDb25maWcg5LitIHB1c2hEYXRhIOeahOi1i+WAvO+8jOS4muWKoeWxguaXoOmcgOWFs+azqCBwdXNoRGF0YSDlrZfmrrXlgLxcbiAgICovXG4gIHB1YmxpYyBzZXRQdXNoQ29uZmlnKGNhbGxQdXNoQ29uZmlnOiBJUHVzaENvbmZpZywgaHVuZ3VwUHVzaENvbmZpZzogSVB1c2hDb25maWcpIHtcbiAgICBjb25zdCB2YWxpZGF0ZVJlcyA9IFtjYWxsUHVzaENvbmZpZywgaHVuZ3VwUHVzaENvbmZpZ10ubWFwKChpdGVtKSA9PiB2YWxpZGF0ZVB1c2hDb25maWcoaXRlbSkpO1xuXG4gICAgZm9yIChjb25zdCB7IGNvZGUsIGVycm9yTXNnIH0gb2YgdmFsaWRhdGVSZXMpIHtcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoJ18nLCBgW1JDQ2FsbENsaWVudCBzZXRQdXNoQ29uZmlnXSBwYXJhbSBlcnJvciwgZXJyb3JNc2c6ICR7ZXJyb3JNc2d9YCk7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsUHVzaENvbmZpZyA9IGNhbGxQdXNoQ29uZmlnO1xuICAgIHRoaXMuX2h1bmd1cFB1c2hDb25maWcgPSBodW5ndXBQdXNoQ29uZmlnO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJUGx1Z2luR2VuZXJhdG9yLCBJUnVudGltZSwgUlRDUGx1Z2luQ29udGV4dCwgVmVyc2lvbk1hbmFnZSxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHtcbiAgUkNDYWxsRXJyb3JDb2RlLCBSQ0NhbGxMYW5ndWFnZSwgUkNDYWxsRW5kUmVhc29uLCBSQ0NhbGxNZWRpYVR5cGUsIFJDQ2FsbFVzZXJTdGF0ZSwgUkNDYWxsU2Vzc2lvblN0YXRlLCBJRW5kU3VtbWFyeSwgSUludml0ZWRVc2VycywgSVNlbmRlckluZm8sIElPZmZsaW5lUmVjb3JkLFxufSBmcm9tICdAcmMtZW1iZWQvY2FsbC1lbmdpbmUnO1xuaW1wb3J0IHsgSVJDUlRDU3RhdGVSZXBvcnQgfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHtcbiAgSVJDQ2FsbEluaXRPcHRpb25zLCBJUkNDYWxsUGFyYW1zLCBJUkNDYWxsSW5Hcm91cFBhcmFtcywgSVNlc3Npb25MaXN0ZW5lciwgSU11dGVVc2VyLCBJTWVkaWFTdHJlYW1Db25zdHJhaW50cywgSURldmljZUNoYW5nZVBhcmFtcywgSVZhbGlkYXRpb25SZXN1bHQsIElQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgUkNDYWxsQ2xpZW50IGZyb20gJy4vUkNDYWxsQ2xpZW50JztcbmltcG9ydCB7IFJDQ2FsbFNlc3Npb24gfSBmcm9tICcuL1JDQ2FsbFNlc3Npb24nO1xuaW1wb3J0IHsgdmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuL3ZhbGlkYXRpb24nO1xuXG4vLyBwbHVnaW4tY2FsbCDniYjmnKzkuIrmiqVcblZlcnNpb25NYW5hZ2UuYWRkKCdwbHVnaW4tY2FsbCcsIF9fVkVSU0lPTl9fKTtcblxuY29uc3QgaW5zdGFsbGVyOiBJUGx1Z2luR2VuZXJhdG9yPFJDQ2FsbENsaWVudCwgSVJDQ2FsbEluaXRPcHRpb25zPiA9IHtcbiAgdGFnOiAnUkNDYWxsJyxcbiAgdmVyaWZ5KHJ1bnRpbWU6IElSdW50aW1lKSB7XG4gICAgcmV0dXJuIHJ1bnRpbWUudGFnID09PSAnYnJvd3Nlcic7XG4gIH0sXG4gIHNldHVwKGNvbnRleHQ6IFJUQ1BsdWdpbkNvbnRleHQsIHJ1bnRpbWU6IElSdW50aW1lLCBvcHRpb25zOiBJUkNDYWxsSW5pdE9wdGlvbnMpOiBSQ0NhbGxDbGllbnQge1xuICAgIC8vIOWFiOagoemqjOWPguaVsFxuICAgIGNvbnN0IGNvbmNsdXNpb246IElWYWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMob3B0aW9ucyk7XG4gICAgaWYgKCFjb25jbHVzaW9uLnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbUkNDYWxsTGliIGluc3RhbGxlciBzdGV1cF0ke2NvbmNsdXNpb24ubXNnfWApO1xuICAgIH1cblxuICAgIC8vIOagoemqjOW9k+WJjeWuieijheeahCBlbmdpbmUg54mI5pys5piv5ZCm5Y+v55SoXG4gICAgaWYgKCFWZXJzaW9uTWFuYWdlLnZhbGlkRW5naW5lKF9fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fXykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGN1cnJlbnQgZW5naW5lIHZlcnNpb24gJyR7VmVyc2lvbk1hbmFnZS5nZXRJbmZvKCkuZW5naW5lfScgZXJyb3IsIHBsdWdpbi1jYWxsIHJlcXVpcmVkIGVuZ2luZSB2ZXJzaW9uIGF0IGxlYXN0ICcke19fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fX30nLmApO1xuICAgIH1cblxuICAgIGNvbnN0IGxvZ2dlciA9IGNvbnRleHQuY3JlYXRlTG9nZ2VyKCdSQ0NhbGwnLCAnUlRDJyk7XG4gICAgb3B0aW9ucy5sb2dPdXRwdXRMZXZlbCAmJiBsb2dnZXIuc2V0T3V0cHV0TGV2ZWwob3B0aW9ucy5sb2dPdXRwdXRMZXZlbCk7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMubG9nTGV2ZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsb2dnZXIud2FybignXycsICdUaGUgXFwnbG9nTGV2ZWxcXCcgcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgXFwnbG9nT3V0cHV0TGV2ZWxcXCcgaW5zdGVhZC4nKTtcbiAgICB9XG5cbiAgICBsb2dnZXIud2FybignXycsIGBSQ0NhbGwgVmVyc2lvbjogJHtfX1ZFUlNJT05fX30sIENvbW1pdDogJHtfX0NPTU1JVF9JRF9ffWApO1xuXG4gICAgcmV0dXJuIG5ldyBSQ0NhbGxDbGllbnQoY29udGV4dCwgcnVudGltZSwgbG9nZ2VyLCBvcHRpb25zKTtcbiAgfSxcbn07XG5cbmV4cG9ydCB7XG4gIGluc3RhbGxlcixcbiAgUkNDYWxsQ2xpZW50LFxuICBSQ0NhbGxTZXNzaW9uLFxuICBSQ0NhbGxMYW5ndWFnZSxcbiAgUkNDYWxsRXJyb3JDb2RlLFxuICBSQ0NhbGxFbmRSZWFzb24sXG4gIFJDQ2FsbE1lZGlhVHlwZSxcbiAgUkNDYWxsVXNlclN0YXRlLFxuICBSQ0NhbGxTZXNzaW9uU3RhdGUsXG59O1xuXG5leHBvcnQgdHlwZSB7XG4gIElFbmRTdW1tYXJ5LFxuICBJUkNDYWxsSW5pdE9wdGlvbnMsXG4gIElSQ0NhbGxQYXJhbXMsXG4gIElSQ0NhbGxJbkdyb3VwUGFyYW1zLFxuICBJU2Vzc2lvbkxpc3RlbmVyLFxuICBJU2VuZGVySW5mbyxcbiAgSU11dGVVc2VyLFxuICBJSW52aXRlZFVzZXJzLFxuICBJTWVkaWFTdHJlYW1Db25zdHJhaW50cyxcbiAgSURldmljZUNoYW5nZVBhcmFtcyxcbiAgSU9mZmxpbmVSZWNvcmQsXG4gIElSQ1JUQ1N0YXRlUmVwb3J0LFxuICBJUHVzaENvbmZpZyxcbn07XG4iXSwibmFtZXMiOlsic3RyaW5nMTB0bzY0IiwibnVtYmVyIiwiY2hhcnMiLCJyYWRpeCIsInF1dGllbnQiLCJhcnIiLCJtb2QiLCJnZXRVVUlEIiwiYyIsInIiLCJnZXRVVUlEMjIiLCJ1dWlkIiwiZ2VuZXJhdGVSYW5kb21JZCIsInJhbmRvbSIsInRpbWVyU2V0VGltZW91dCIsImZ1bmMiLCJ0aW1lb3V0IiwiZXZlbnRFbWl0dGVyIiwiRXZlbnRFbWl0dGVyIiwiZ2V0Q2FsbERldmljZUlkIiwicnVudGltZSIsImtleSIsIk1zZ0NhbGxTdGF0dXMiLCJNc2dDYWxsU3RhdHVzMiIsIlJDQ2FsbEVycm9yQ29kZSIsIlJDQ2FsbEVuZFJlYXNvbiIsIkNhbGxSZW1vdGVFbmRSZWFzb24iLCJSQ0NhbGxNZXNzYWdlVHlwZSIsIlJDQ2FsbFNlc3Npb25TdGF0ZSIsIlJDQ2FsbFNlc3Npb25TdGF0ZTIiLCJSQ0NhbGxVc2VyU3RhdGUiLCJSQ0NhbGxVc2VyU3RhdGUyIiwiUkNDcm9zc0NhbGxUeXBlIiwiVGltZXIkMSIsImNhbGxiYWNrIiwiX19wdWJsaWNGaWVsZCIsImVuZFRpbWUiLCJkdXJhdGlvbiIsIlJDQ2FsbFN0YXRlTWFjaGluZSIsIl9jb250ZXh0IiwiX3J1bnRpbWUiLCJfbG9nZ2VyIiwiX2NhbGxNc2dIYW5kbGVyIiwiX2NoYW5uZWxJZCIsIl9jb252ZXJzYXRpb25UeXBlIiwiX3RhcmdldElkIiwiX21lZGlhVHlwZSIsIl9jYWxsSWQiLCJzZW50VGltZSIsImRlbGF5VGltZSIsInVzZXJJZCIsInN0YXRlIiwicmVhc29uIiwiX2EiLCJ1c2VyIiwibWVzc2FnZSIsInNlbmRlclVzZXJJZCIsInVzZXJQcm9maWxlIiwiaHVuZ3VwUmVhc29uIiwibWVzc2FnZVR5cGUiLCJlbmRSZWFzb24iLCJyZW1vdGVVc2VySWQiLCJtc2dEZXZpY2VJZCIsInN1aWQiLCJkZXZpY2VJZCIsInNlbmRlckRldmljZUlkIiwiY3VycmVudFVzZXJJZCIsIkNvbnZlcnNhdGlvblR5cGUiLCJpc0N1cnJlbnRVc2VySWQiLCJtZWRpYVR5cGUiLCJjb250ZW50IiwiaXNMZXNzVGhhblR3byIsImlzSW52aXRlVXNlciIsImlzTm9PbmVBbnN3ZXJlZCIsIndhdGNoZXJzIiwiaW5pZHMiLCJyb29tVHlwZSIsInVzZXJJZExpc3QiLCJpZCIsImludml0ZVVzZXJJZHMiLCJUaW1lciIsImV4aXN0ZWRVc2VyUG9maWxlcyIsImNhbGxlciIsIm5lZWRSaW5naW5nVXNlcklkcyIsInVzZXJJbmZvIiwiY2FsbFN0YXR1cyIsImVycm9yIiwidXNlcklkcyIsImV4dHJhIiwicHVzaENvbmZpZyIsImlzQ3Jvc3NBcHBrZXkiLCJjb2RlIiwiaXNDYWxsZXIiLCJlbmRDb2RlIiwib3B0aW9ucyIsImV4aXN0ZWRVc2VySWRzIiwiaXNTZW5kSGFuZ3VwTWVzc2FnZSIsImhhbmd1cFBhcmFtcyIsIm1zZ0NvZGUiLCJyZW1vdGVVc2VycyIsInJlbW90ZVVzZXIiLCJ1aWQiLCJiZWdpblRpbWVzdGFtcCIsImVuZFRpbWVzdGFtcCIsInN1bW1hcnkiLCJSQ0NhbGxNZWRpYVR5cGUiLCJSQ0NhbGxNZWRpYVR5cGUyIiwiTWVtYmVyTW9kaWZ5VHlwZSIsIk1lbWJlck1vZGlmeVR5cGUyIiwiUGxhdGZvcm0iLCJPZmZsaW5lUmVjb3JkZXIiLCJfb25SZWNvcmQiLCJjaGFubmVsSWQiLCJjb252ZXJzYXRpb25UeXBlIiwidGFyZ2V0SWQiLCJjYWxsSWQiLCJpc1NlbGZTZW5kIiwibWVzc2FnZXMiLCJtc2ciLCJjYWxsTXNnVHlwZXMiLCJFbmdpbmVFcnJvckNvZGVUb0NhbGxFcnJvckNvZGUiLCJFcnJvckNvZGUiLCJDYWxsTWVzc2FnZUhhbmRsZXIiLCJfb2ZmbGluZU1zZ0l0diIsIl9nZXRTdGF0ZU1hY2hpbmUiLCJyZWNvcmQiLCJtYXJrVGltZSIsImN1cnJlbnRNc2dTZW50VGltZSIsImluc2VydEluZGV4IiwiaW5kZXgiLCJjdXJyZW50VGltZSIsImJ1ZmZlcnMiLCJpdGVtIiwibWVzc2FnZVVJZCIsImlzT2ZmTGluZU1lc3NhZ2UiLCJvZmZsaW5lQnVmZmVycyIsImludml0ZUNhbGxJZCIsImlzSW52aXRlTXNnVHlwZSIsImlzTGVzc1RoYW5PZmZsaW5lTXNnSXR2IiwidGFza01zZ0xpc3QiLCJpIiwib3RoZXJDYWxsSWQiLCJkZWxJbmRleCIsImRlbE9mZmxpbmVJbmRleCIsImlzVW5maW5pc2hlZFByaXZhdGVDYWxsIiwiaXNPbmx5SW52aXRlIiwiaGFzSW52aXRlQW5kUmluZ2luZyIsImlzVW5maW5pc2hlZEdycENhbGwiLCJpc1VuZmluaXNoZWQiLCJub09uZUFjY2VwdCIsImFsbFVzZXJJZHMiLCJpc0NhbGxlckh1bmd1cCIsInRhc2tNc2dTZW5kZXJVc2VySWQiLCJkZWxDb3VudCIsImxpc3RlbmVyIiwiZnVuY05hbWUiLCJldmVudCIsImV2ZW50VHlwZSIsImRpcmVjdGlvbmFsVXNlcklkTGlzdCIsInNlbmRPcHRzIiwibmV3UHVzaENvbmZpZyIsImNhbGxlcklkIiwiUkNDYWxsTGFuZ3VhZ2UiLCJFTiIsIlpIIiwiTG9jYWwiLCJsYW5nIiwiUkNDYWxsRW5naW5lIiwiX3dhdGNoZXJzIiwiX29wdGlvbnMiLCJjcnRVc2VySWQiLCJpbmZvIiwiUHJvZHVjZVR5cGVzIiwiZnVuIiwib24iLCJkYXRhIiwiZnVucyIsImNiIiwibGVuZ3RoIiwiaXNMYW5ndWFnZSIsInZhbCIsImlzSm9pblR5cGUiLCJSVENKb2luVHlwZSIsImlzTG9nTGV2ZWwiLCJMb2dMIiwidmFsaWRhdGVDYWxsSW5pdE9wdGlvbnMiLCJrZXlOYW1lcyIsImtleXMiLCJtaXNzaW5nS2V5cyIsInZhbGlkYXRlTGlzdGVuZXIiLCJ2YWxpZGF0ZVRhcmdldElkIiwidmFsaWRhdGVNZWRpYVR5cGUiLCJ2YWxpZGF0ZUV4dHJhIiwidmFsaWRhdGVQdXNoQ29uZmlnIiwicHVzaENvbmZpZ0tleXMiLCJpc1VuZGVmaW5lZCIsImlzQm9vbGVhbiIsImlzU3RyaW5nIiwiaU9TQ29uZmlnIiwiYW5kcm9pZENvbmZpZyIsInZhbGlkYXRlSU9TQ29uZmlnUmVzIiwidmFsaWRhdGVJT1NDb25maWciLCJ2YWxpZGF0ZUFuZHJvaWRDb25maWdSZXMiLCJ2YWxpZGF0ZUFuZHJvaWRDb25maWciLCJ0aHJlYWRJZCIsInJpY2hNZWRpYVVyaSIsImFuZHJvaWRDb25maWdLZXlzIiwidmFsaWRhdGVVc2VySWRzIiwic3RyIiwiaXNSQ0ZyYW1lUmF0ZSIsImlzVmFsaWRSZXNvbHV0aW9uIiwicmVzb2x1dGlvbiIsIlJDUmVzb2x1dGlvbiIsInZhbGlkYXRlTWVkaWFTdHJlYW1Db25zdHJhaW50cyIsImNvbnN0cmFpbnRzIiwiUkNDYWxsU2Vzc2lvbiIsIl9zdGF0ZU1hY2hpbmUiLCJfcnRjQ2xpZW50Iiwicm9vbUlkIiwic3VtbWFyeUluZm8iLCJzZW5kZXIiLCJpbnZpdGVkVXNlcnMiLCJjYWxsQmFjayIsInJvb20iLCJSQ1JUQ0NvZGUiLCJ0cmFja3MiLCJpc0FsbG93U3Vic2NyaWJlUmV0cnkiLCJjb3VudCIsImlzQWxsb3dQdWJsaXNoUmV0cnkiLCJjb25jbHVzaW9uIiwidHJhY2siLCJfY29kZSIsImF1ZGlvQ29uc3RyYWludHMiLCJyZWNlbnRUcmFja3MiLCJsb2NhbFRyYWNrcyIsImVycm9yTXNnIiwib2JqIiwibG9jYWxWaWRlb1RyYWNrcyIsImxvY2FsQXVkaW90cmFja3MiLCJieVNlcnZlciIsIlJDS2lja1JlYXNvbiIsIm5hbWUiLCJhdWRpb1RyYWNrIiwibXV0ZVVzZXIiLCJ2aWRlb1RyYWNrIiwicmVzdWx0IiwicmVwb3J0IiwiUkNDYWxsQ2xpZW50Iiwic2Vzc2lvbiIsInNlcyIsInN0YXRlTWFjaGluZSIsInB1c2hUaXRsZSIsInB1c2hDb250ZW50IiwiYml0cmF0ZSIsInZhbGlkYXRlUHVzaENvZGUiLCJfYiIsIl9jIiwiY2FsbFB1c2hDb25maWciLCJodW5ndXBQdXNoQ29uZmlnIiwidmFsaWRhdGVSZXMiLCJWZXJzaW9uTWFuYWdlIiwiaW5zdGFsbGVyIiwiY29udGV4dCIsImxvZ2dlciJdLCJtYXBwaW5ncyI6IjJnQkFFQSxNQUFNQSxHQUFnQkMsR0FBbUIsQ0FDakMsTUFBQUMs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
|