@rongcloud/plugin-call-plus 2.1.0 → 2.1.1
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.d.ts +161 -78
- package/dist/index.esm.js +1026 -906
- package/dist/index.umd.js +2 -2
- package/package.json +1 -1
package/dist/index.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(U,S){typeof exports=="object"&&typeof module<"u"?S(exports,require("@rongcloud/engine"),require("@rongcloud/plugin-rtc")):typeof define=="function"&&define.amd?define(["exports","@rongcloud/engine","@rongcloud/plugin-rtc"],S):(U=typeof globalThis<"u"?globalThis:U||self,S(U.CallPlus={},U.RCEngine,U.RCRTC))})(this,function(U,S,N){"use strict";var Qe=Object.defineProperty;var Xe=(U,S,N)=>S in U?Qe(U,S,{enumerable:!0,configurable:!0,writable:!0,value:N}):U[S]=N;var I=(U,S,N)=>(Xe(U,typeof S!="symbol"?S+"":S,N),N);const a={SUCCESS:0,PARAM_ERROR:80001,SESSION_EXIST:80002,NOT_IN_CALL:80003,MEDIATYPE_INVALID:80004,NOT_VIDEO_CALL:80005,RTC_SERVICE_UNAVAILABLE:80006,USER_LIST_INVAILD:80007,CALL_ID_INVALID:80008,TRANSACTION_ID_INVALID:80009,USER_ID_INVALID:80010,SINGLE_CALL_NOT_SUPPORT_MULTI_PERSON:80011,SIGNAL_DISCONNECTED:80012,CAMERA_CLOSED:80100,MICROPHONE_CLOSED:80101,MEDIA_RESOURCE_INVALIED:80102,NOT_INSTALL_RTC_PLUGIN:80103,PLAY_MEDIA_FAILED:80104,VIDEO_VIEW_NOT_SET:80105};var n=(_=>(_.L_INDEX_INSTALL_CALL_PLUS_PLUGIN_O="L-index_install_call_plus_plugin-O",_.L_CALLPLUS_CLIENT_SET_EVENT_LISTENER_O="L-callplus_client_set_event_listener-O",_.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O="L-callplus_client_call_event_listener-O",_.L_CALLPLUS_CLIENT_SET_STATUS_REPORT_LISTENER_O="L-callplus_client_set_status_report_listener-O",_.L_CALLPLUS_CLIENT_CALL_STATUS_REPORT_LISTENER_O="L-callplus_client_call_status_report_listener-O",_.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_T="L-callplus_client_set_video_config-T",_.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R="L-callplus_client_set_video_config-R",_.L_CALLPLUS_VIDEO_CONFIG_SET_FRAME_RATE_O="L-callplus_video_config_set_frame_rate-O",_.L_CALLPLUS_VIDEO_CONFIG_SET_RESOLUTION_O="L-callplus_video_config_set_resolution-O",_.L_CALLPLUS_VIDEO_CONFIG_SET_BITRATE_O="L-callplus_video_config_set_bitrate-O",_.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_T="L-callplus_client_set_audio_config-T",_.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R="L-callplus_client_set_audio_config-R",_.L_CALLPLUS_AUDIO_CONFIG_SET_BITRATE_O="L-callplus_audio_config_set_bitrate-O",_.L_CALLPLUS_AUDIO_CONFIG_SET_SAMPLE_RATE_O="L-callplus_audio_config_set_sample_rate-O",_.L_CALLPLUS_CLIENT_PREVIEW_T="L-callplus_client_preview-T",_.L_CALLPLUS_CLIENT_PREVIEW_R="L-callplus_client_preview-R",_.L_CALLPLUS_CLIENT_START_CALL_T="L-callplus_client_start_call-T",_.L_CALLPLUS_CLIENT_START_CALL_R="L-callplus_client_start_call-R",_.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_T="L-callplus_client_join_multi_call-T",_.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R="L-callplus_client_join_multi_call-R",_.L_CALLPLUS_CLIENT_ACCEPT_T="L-callplus_client_accept-T",_.L_CALLPLUS_CLIENT_ACCEPT_R="L-callplus_client_accept-R",_.L_CALLPLUS_CLIENT_HANGUP_T="L-callplus_client_hangup-T",_.L_CALLPLUS_CLIENT_HANGUP_R="L-callplus_client_hangup-R",_.L_CALLPLUS_CLIENT_INVITE_T="L-callplus_client_invite-T",_.L_CALLPLUS_CLIENT_INVITE_R="L-callplus_client_invite-R",_.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_T="L-callplus_client_request_change_media_type-T",_.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R="L-callplus_client_request_change_media_type-R",_.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_T="L-callplus_client_cancel_change_media_type-T",_.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R="L-callplus_client_cancel_change_media_type-R",_.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_T="L-callplus_client_reply_change_media_type-T",_.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R="L-callplus_client_reply_change_media_type-R",_.L_CALLPLUS_CLIENT_GET_CURRENT_CALL_SESSION_T="L-callplus_client_get_current_call_session-T",_.L_CALLPLUS_CLIENT_GET_CURRENT_CALL_SESSION_R="L-callplus_client_get_current_call_session-R",_.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_T="L-callplus_client_get_available_call_sessions_from_server-T",_.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R="L-callplus_client_get_available_call_sessions_from_server-R",_.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_T="L-callplus_client_get_call_records-T",_.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R="L-callplus_client_get_call_records-R",_.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_T="L-callplus_client_delete_call_records_by_callId-T",_.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R="L-callplus_client_delete_call_records_by_callId-R",_.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_T="L-callplus_client_delete_all_call_records_from_server-T",_.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R="L-callplus_client_delete_all_call_records_from_server-R",_.L_CALLPLUS_CLIENT_START_CAMERA_T="L-callplus_client_start_camera-T",_.L_CALLPLUS_CLIENT_START_CAMERA_R="L-callplus_client_start_camera-R",_.L_CALLPLUS_CLIENT_STOP_CAMERA_T="L-callplus_client_stop_camera-T",_.L_CALLPLUS_CLIENT_STOP_CAMERA_R="L-callplus_client_stop_camera-R",_.L_CALLPLUS_CLIENT_SWITCH_CAMERA_T="L-callplus_client_switch_camera-T",_.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R="L-callplus_client_switch_camera-R",_.L_CALLPLUS_CLIENT_START_MICROPHONE_T="L-callplus_client_start_microphone-T",_.L_CALLPLUS_CLIENT_START_MICROPHONE_R="L-callplus_client_start_microphone-R",_.L_CALLPLUS_CLIENT_STOP_MICROPHONE_T="L-callplus_client_stop_microphone-T",_.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R="L-callplus_client_stop_microphone-R",_.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_T="L-callplus_client_set_video_view-T",_.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R="L-callplus_client_set_video_view-R",_.L_RTC_MODULE_SET_VIDEO_VIEW_O="L-rtc_module_set_video_view-O",_.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_T="L-callplus_client_remove_video_view-T",_.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R="L-callplus_client_remove_video_view-R",_.L_RTC_MODULE_REMOVE_VIDEO_VIEW_O="L-rtc_module_remove_video_view-O",_.L_CALLPLUS_CLIENT_PLAY_MEDIA_T="L-callplus_client_play_media-T",_.L_CALLPLUS_CLIENT_PLAY_MEDIA_R="L-callplus_client_play_media-R",_.L_RTC_MODULE_PLAY_MEDIA_T="L-rtc_module_play_media-T",_.L_RTC_MODULE_PLAY_MEDIA_R="L-rtc_module_play_media-R",_.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_T="L-rtc_module_set_all_remote_audio_enbale-T",_.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R="L-rtc_module_set_all_remote_audio_enable-R",_.L_RTC_MODULE_SUBSCRIBE_T="L-rtc_module_subscribe-T",_.L_RTC_MODULE_SUBSCRIBE_R="L-rtc_module_subscribe-R",_.L_RTC_MODULE_UNSUBSCRIBE_T="L-rtc_module_unsubscribe-T",_.L_RTC_MODULE_UNSUBSCRIBE_R="L-rtc_module_unsubscribe-R",_.L_RTC_MODULE_PUBLISH_T="L-rtc_module_publish-T",_.L_RTC_MODULE_PUBLISH_R="L-rtc_module_publish-R",_.L_RTC_MODULE_UNPUBLISH_T="L-rtc_module_unpublish-T",_.L_RTC_MODULE_UNPUBLISH_R="L-rtc_module_unpublish-R",_.L_RTC_MODULE_DESTROY_ALL_TRACKS_O="L-rtc_module_destroy_all_tracks-O",_.L_RTC_MODULE_SESSION_CONNECT_T="L-rtc_module_session_connect-T",_.L_RTC_MODULE_SESSION_CONNECT_P="L-rtc_module_session_connect-P",_.L_RTC_MODULE_SESSION_CONNECT_R="L-rtc_module_session_connect-R",_.L_RTC_MODULE_SESSION_CLOSE_T="L-rtc_module_session_close-T",_.L_RTC_MODULE_SESSION_CLOSE_P="L-rtc_module_session_close-P",_.L_RTC_MODULE_SESSION_CLOSE_R="L-rtc_module_session_close-R",_.L_RTC_MODULE_CREATE_VIDEO_TRACK_T="L-rtc_module_create_video_track-T",_.L_RTC_MODULE_CREATE_VIDEO_TRACK_R="L-rtc_module_create_video_track-R",_.L_RTC_MODULE_CREATE_AUDIO_TRACK_T="L-rtc_module_create_audio_track-T",_.L_RTC_MODULE_CREATE_AUDIO_TRACK_R="L-rtc_module_create_audio_track-R",_.L_RTC_MODULE_RECEIVE_TRACK_PUBLISH_O="L-rtc_module_receive_track_publish-O",_.L_RTC_MODULE_RECEIVE_TRACK_UNPUBLISH_O="L-rtc_module_receive_track_unpublish-O",_.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O="L-rtc_module_receive_track_enable_change-O",_.L_RTC_MODULE_RECEIVE_KICK_OFF_O="L-rtc_module_receive_kick_off-O",_.L_RTC_MODULE_RECEIVE_PEERCONNECTION_EXCEPT_CLOSE_O="L-rtc_module_receive_peerconnection_except_close-O",_.L_RTC_MODULE_CHANGE_MEDIA_TYPE_T="L-rtc_module_change_media_type-T",_.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R="L-rtc_module_change_media_type-R",_.L_RTC_MODULE_JOIN_RTC_ROOM_T="L-rtc_module_join_rtc_room-T",_.L_RTC_MODULE_JOIN_RTC_ROOM_R="L-rtc_module_join_rtc_room-R",_.L_RTC_MODULE_QUIT_RTC_ROOM_T="L-rtc_module_quit_rtc_room-T",_.L_RTC_MODULE_QUIT_RTC_ROOM_R="L-rtc_module_quit_rtc_room-R",_.L_SIGNAL_TRANSPORTER_SINGLE_CALL_T="L-signal_transporter_single_call-T",_.L_SIGNAL_TRANSPORTER_GROUP_CALL_T="L-signal_transporter_group_call-T",_.L_SIGNAL_TRANSPORTER_INVITE_T="L-signal_transporter_invite-T",_.L_SIGNAL_TRANSPORTER_RING_T="L-signal_transporter_ring-T",_.L_SIGNAL_TRANSPORTER_ACCEPT_T="L-signal_transporter_accept-T",_.L_SIGNAL_TRANSPORTER_ACCEPT_R="L-signal_transporter_accept-R",_.L_SIGNAL_TRANSPORTER_JOIN_CALL_T="L-signal_transporter_join_call-T",_.L_SIGNAL_TRANSPORTER_HANGUP_T="L-signal_transporter_hangup-T",_.L_SIGNAL_TRANSPORTER_CALL_STATUS_UP_T="L-signal_transporter_call_status_up-T",_.L_SIGNAL_TRANSPORTER_CALL_EVENT_UP_T="L-signal_transporter_call_event_up-T",_.L_SIGNAL_TRANSPORTER_CALL_DIALOG_UP_T="L-signal_transporter_call_dialog_up-T",_.L_SIGNAL_TRANSPORTER_DELETE_CALL_RECORD_T="L-signal_transporter_delete_call_record-T",_.L_SIGNAL_TRANSPORTER_GET_CALL_RECORD_T="L-signal_transporter_get_call_record-T",_.L_SIGNAL_TRANSPORTER_GET_CALL_SERVER_TIME_T="L-signal_transporter_get_call_server_time-T",_.L_SIGNAL_TRANSPORTER_GET_CALL_TIME_INFO_T="L-signal_transporter_get_call_time_info-T",_.L_SIGNAL_TRANSPORTER_GET_AVAILABLE_CALL_LIST_T="L-signal_transporter_get_available_call_list-T",_.L_SIGNAL_TRANSPORTER_CLEAR_CALL_RECORD_T="L-signal_transporter_clear_call_record-T",_.L_SIGNAL_TRANSPORTER_GET_CALL_INFO_BY_CALLID_T="L-signal_transporter_get_call_info_by_callId-T",_.L_SIGNAL_TRANSPORTER_USER_SYSTEM_STATE_UP_T="L-signal_transporter_user_system_state_up-T",_.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_SIGNAL_DATA_O="L-signal_transporter_receive_call_signal_data-O",_.L_SIGNAL_TRANSPORTER_IM_STATE_CHANGE_O="L-signal_transporter_im_state_change-O",_.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O="L-signal_transporter_receive_invite-O",_.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O="L-signal_transporter_receive_call_status-O",_.L_CALL_ENGINE_UPDATE_USERS_STATE_O="L-call_engine_update_users_state-O",_.L_CALL_ENGINE_IM_STATE_CHANGE_O="L-call_engine_im_state_change-O",_.L_CALL_ENGINE_CALL_TIMEOUT_O="L-call_engine_call_timeout-O",_.L_CALL_ENGINE_START_CALL_TIMER_O="L-call_engine_start_call_timer-O",_.L_CALL_ENGINE_STOP_CALL_TIMER_O="L-call_engine_stop_call_timer-O",_.L_CALL_ENGINE_UP_ON_PHONE_END_T="L-call_engine_up_on_phone_end-T",_.L_CALL_ENGINE_UP_ON_PHONE_END_R="L-call_engine_up_on_phone_end-R",_.L_CALL_ENGINE_RECEIVE_FIRST_FRAME_TIME_O="L-call_engine_receive_first_frame_time-O",_.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O="L-call_engine_receive_mediatype_change-O",_.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O="L-call_engine_receive_close_session-O",_.L_CALL_ENGINE_RECEIVE_CALL_RECORD_O="L-call_engine_receive_call_record-O",_.L_CALL_ENGINE_RECEIVE_COMPLEMENTARY_DATA_O="L-call_engine_receive_complementary_data-O",_.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_T="L-call_engine_create_session_by_server-T",_.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R="L-call_engine_create_session_by_server-R",_.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_T="L-call_engine_up_first_frame_time-T",_.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_R="L-call_engine_up_first_frame_time-R",_.L_TIME_CORRECT_START_O="L-time_correct_start-O",_.L_TIME_CORRECT_STOP_O="L-time_correct_stop-O",_.L_TIME_CORRECT_RESTART_O="L-time_correct_restart-O",_.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_T="L-time_correct_get_call_client_time_by_server-T",_.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_P="L-time_correct_get_call_client_time_by_server-P",_.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R="L-time_correct_get_call_client_time_by_server-R",_.L_TIME_CORRECT_CALC_CLIENT_START_TIME_T="L-time_correct_calc_client_start_time-T",_.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R="L-time_correct_calc_client_start_time-R",_.L_TIME_CORRECT_SET_DELTA_TIME_O="L-time_correct_set_delta_time-O",_.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_T="L-time_correct_loop_correct_client_time-T",_.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R="L-time_correct_loop_correct_client_time-R",_.L_INNER_SESSION_UPDATE_USER_STATE_O="L-inner_session_update_user_state-O",_.L_INNER_SESSION_SET_USER_DEVICE_ENABLE_O="L-inner_session_set_user_device_enable-O",_.L_CALLPLUS_SESSION_GET_CREATE_TIME_T="L-callplus_session_get_create_time-T",_.L_CALLPLUS_SESSION_GET_CREATE_TIME_R="L-callplus_session_get_create_time-R",_.L_CALLPLUS_SESSION_GET_DURATION_T="L-callplus_session_get_duration-T",_.L_CALLPLUS_SESSION_GET_DURATION_R="L-callplus_session_get_duration-R",_.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O="L-callplus_set_android_push_config-O",_))(n||{});class j{constructor(i,e,t){I(this,"_startTime",0);I(this,"_duration",0);I(this,"_callId","");this._session=i,this._callEngine=e,this._logger=t,this._callId=this._session.getCallId()}getCallId(){return this._callId}getState(){return this._session.getSessionState()}getCallType(){return this._session.getCallType()}getMediaType(){return this._session.getMediaType()}getUserList(){return this._session.getUserList().map(i=>{const{userId:e,userState:t,cameraEnable:s,microphoneEnable:r}=i;return{userId:e,state:t,cameraEnable:s,microphoneEnable:r}})}getCreatorUserId(){return this._session.getStartCallerId()}getInviterUserId(){return this._session.getCallerId()}async getCreateTimestamp(){const i=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_SESSION_GET_CREATE_TIME_T,"",i),this._startTime)return{code:a.SUCCESS,startTime:this._startTime};const{code:e,clientStartTime:t}=await this._callEngine.getCallStaringTime({callId:this._callId},i);return e!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_SESSION_GET_CREATE_TIME_R,`errCode: ${e}`,i),{code:e}):(this._logger.info(n.L_CALLPLUS_SESSION_GET_CREATE_TIME_R,"success",i),this._startTime=t,{code:a.SUCCESS,startTime:this._startTime})}async getDuration(){const i=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_SESSION_GET_DURATION_T,"",i),this._duration)return this._logger.info(n.L_CALLPLUS_SESSION_GET_DURATION_R,`code: ${a.SUCCESS}, duration: ${this._duration}`,i),{code:a.SUCCESS,duration:this._duration};const{code:e,data:t}=await this._callEngine.getCallTimeInfo(this._callId,i);return e!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_SESSION_GET_DURATION_R,`code: ${e}`,i),{code:e}):(this._logger.info(n.L_CALLPLUS_SESSION_GET_DURATION_R,`code: ${a.SUCCESS}, duration: ${t.duration}`,i),this._duration=t.duration,{code:a.SUCCESS,duration:this._duration})}}var M=(_=>(_[_.SINGLE=0]="SINGLE",_[_.MULTI=1]="MULTI",_))(M||{}),A=(_=>(_[_.IDLE=0]="IDLE",_[_.CALLING=100]="CALLING",_[_.INVITED=101]="INVITED",_[_.RINGING=102]="RINGING",_[_.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",_[_.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",_[_.CONNECTING=200]="CONNECTING",_[_.ONCALL=300]="ONCALL",_[_.ONPHONE=301]="ONPHONE",_[_.ENDED=1e3]="ENDED",_[_.NO_ANSWER=1001]="NO_ANSWER",_[_.MISSED=1002]="MISSED",_[_.CANCELLED=1003]="CANCELLED",_[_.DECLINED=1004]="DECLINED",_[_.ERROR=2e3]="ERROR",_))(A||{}),m=(_=>(_[_.AUDIO=0]="AUDIO",_[_.AUDIO_VIDEO=1]="AUDIO_VIDEO",_[_.VIDEO=2]="VIDEO",_))(m||{}),p=(_=>(_[_.IDLE=0]="IDLE",_[_.CALLING=100]="CALLING",_[_.INVITED=101]="INVITED",_[_.RINGING=102]="RINGING",_[_.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",_[_.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",_[_.CONNECTING=200]="CONNECTING",_[_.ONCALL=300]="ONCALL",_[_.ENDED=1e3]="ENDED",_[_.NOANSWER=1001]="NOANSWER",_[_.MISSED=1002]="MISSED",_[_.CANCELED=1003]="CANCELED",_[_.DECLINED=1004]="DECLINED",_[_.ERROR=2e3]="ERROR",_))(p||{}),F=(_=>(_[_.CANCEL_CHANGE_MEDIA_TYPE=0]="CANCEL_CHANGE_MEDIA_TYPE",_[_.REFUSE_CHANGE_MEDIA_TYPE=1]="REFUSE_CHANGE_MEDIA_TYPE",_[_.SERVER_ALLOW_MEDIA_TYPE=2]="SERVER_ALLOW_MEDIA_TYPE",_[_.CHANGE_MEDIA_TYPE_TIMEOUT=3]="CHANGE_MEDIA_TYPE_TIMEOUT",_))(F||{}),R=(_=>(_[_.IDLE=0]="IDLE",_[_.CALLING=100]="CALLING",_[_.INVITED=101]="INVITED",_[_.RINGING=102]="RINGING",_[_.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",_[_.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",_[_.CONNECTING=200]="CONNECTING",_[_.ONCALL=300]="ONCALL",_[_.ON_PHONE=301]="ON_PHONE",_[_.ON_PHONE_END=302]="ON_PHONE_END",_[_.ON_DEVICE_DISABLE=303]="ON_DEVICE_DISABLE",_[_.ON_DEVICE_ENABLE=304]="ON_DEVICE_ENABLE",_[_.ABNORMAL_END=999]="ABNORMAL_END",_[_.ENDED=1e3]="ENDED",_[_.NO_ANSWER=1001]="NO_ANSWER",_[_.MISSED=1002]="MISSED",_[_.CANCELLED=1003]="CANCELLED",_[_.DECLINED=1004]="DECLINED",_[_.OTHER_CLIENT_CALLING=1010]="OTHER_CLIENT_CALLING",_[_.OTHER_CLIENT_ACCEPT=1011]="OTHER_CLIENT_ACCEPT",_[_.JOIN_ROOM_ERR=1105]="JOIN_ROOM_ERR",_[_.PUBLISH_ERR=1106]="PUBLISH_ERR",_[_.SUBSCRIBE_ERR=1107]="SUBSCRIBE_ERR",_[_.ACCEPT_CARRIER=1108]="ACCEPT_CARRIER",_[_.KICKED_BY_SERVER=1109]="KICKED_BY_SERVER",_[_.CONNECTION_ERR=1110]="CONNECTION_ERR",_[_.LOGOUT=1111]="LOGOUT",_[_.OTHER_CLIENT_LOGIN=1112]="OTHER_CLIENT_LOGIN",_[_.OTHER_CLIENT_JOINED=1113]="OTHER_CLIENT_JOINED",_[_.OTHER_CLIENT_IN_ROOM=1114]="OTHER_CLIENT_IN_ROOM",_[_.OTHER_CLIENT_HANGUP=1151]="OTHER_CLIENT_HANGUP",_[_.REMOTE_JOIN_RTC_ERROR=1205]="REMOTE_JOIN_RTC_ERROR",_[_.REMOTE_PUBLISH_ERROR=1206]="REMOTE_PUBLISH_ERROR",_[_.REMOTE_SUBSCRIBE_ERROR=1207]="REMOTE_SUBSCRIBE_ERROR",_[_.REMOTE_KICKED_BY_SERVER=1209]="REMOTE_KICKED_BY_SERVER",_[_.REMOTE_CONNECTION_ERROR=1210]="REMOTE_CONNECTION_ERROR",_[_.REMOTE_LOGOUT=1211]="REMOTE_LOGOUT",_[_.REMOTE_OTHER_CLIENT_LOGIN=1212]="REMOTE_OTHER_CLIENT_LOGIN",_[_.REMOTE_OTHER_JOINED_RTC=1213]="REMOTE_OTHER_JOINED_RTC",_[_.REMOTE_OTHER_CLIENT_IN_RTC=1214]="REMOTE_OTHER_CLIENT_IN_RTC",_))(R||{});class Ie{constructor(i){I(this,"_audioConfig",{});this._logger=i}setDefaultMicrophoneId(i){return this._audioConfig.microphoneId=i,this}setBitrate(i,e){return!S.isNumber(i)||!S.isNumber(e)||e<=0||i<=0||e<i?(this._logger.error(n.L_CALLPLUS_AUDIO_CONFIG_SET_BITRATE_O,`params error -> max: ${e},min: ${i}, max and min is a number > 0, max should > min`),this):(this._audioConfig.minBitrate=i,this._audioConfig.maxBitrate=e,this)}setSampleRate(i){return S.isNumber(i)?(this._audioConfig.sampleRate=i,this):(this._logger.error(n.L_CALLPLUS_AUDIO_CONFIG_SET_SAMPLE_RATE_O,`params error -> sampleRate: ${i}`),this)}build(){return this._audioConfig}}class Ce{constructor(i){I(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});this._logger=i}setFrameRate(i){return N.RCFrameRate[i]?(this._videoConfig.frameRate=i,this):(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_FRAME_RATE_O,`params error -> fps: ${i}`),this)}setVideoResolution(i){return N.RCResolution[i]?(this._videoConfig.resolution=i,this):(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_RESOLUTION_O,`params error -> resolution: ${i}`),this)}setDefaultCameraId(i){return this._videoConfig.cameraId=i,this}setBitrate(i,e){return!S.isNumber(i)||!S.isNumber(e)||e<=0||i<=0||e<i?(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_BITRATE_O,`params error -> max: ${e},min: ${i}, max and min is a number > 0, max should > min`),this):(this._videoConfig.minBitrate=i,this._videoConfig.maxBitrate=e,this)}build(){return this._videoConfig}}const de=_=>{const{callId:i,callType:e,callDir:t,mediaType:s,callingUserId:r,callUserIds:o,callStatus:E,sessionStatus:L,startTime:c,endTime:l,duration:T,syncTime:C,sysStatus:d,crtTime:h}=_;return{callId:i,callType:e,callDirection:t,mediaType:s,callerUserId:r,callUserIds:o,sessionState:E,userState:L,startTimestamp:c,endTimestamp:l,duration:T,syncTimestamp:C,systemState:d,createTimestamp:h}},me=_=>{const{callId:i}=_,e=[],t=[],s=[],r=[];return _.callSessionUsers.forEach(o=>{const{userId:E,sessionStatus:L,sysStatus:c}=o;switch(L){case A.INVITED:r.push({callId:i,userId:E,userState:L});break;case A.RINGING:e.push({callId:i,fromUserId:E});break;case A.CONNECTING:s.push({fromUserId:E});break;case A.CANCELLED:case A.DECLINED:case A.ENDED:case A.IDLE:t.push({callId:i,fromUserId:E,userState:L,systemState:c});break}}),{ringingData:e,hangupData:t,acceptData:s,otherInvitedData:r}},fe=_=>_&&_.nodeName&&_.nodeName.toUpperCase()==="VIDEO",pe=(_,i)=>{let e=!1;const t=[R.INVITED,R.RINGING,R.BUSYLINE_RINGING,R.BUSYLINE_WAIT,R.CONNECTING,R.ONCALL];return _===R.ONCALL&&t.includes(i)&&(e=!0),e},Me=(_,i)=>{let e=!1;const t=[A.INVITED,A.RINGING,A.BUSYLINE_RINGING,A.BUSYLINE_WAIT,A.CONNECTING,A.ONCALL];return _===A.ONCALL&&t.includes(i)&&(e=!0),e},De=(_,i)=>{let e;switch(_){case A.CALLING:e=R.CANCELLED;break;case A.RINGING:case A.INVITED:e=R.DECLINED;break;case A.CONNECTING:e=i?R.DECLINED:R.CANCELLED;break;case A.ONCALL:e=R.ENDED;break}return e},ie=_=>{const{voipCallInfo:i}=_;if(!i)return!1;const{strategy:e}=JSON.parse(i);return e===1},he=(_,i)=>(_||_===0)&&(!S.isNumber(_)||_<=0)?{code:a.PARAM_ERROR,errorMsg:`params error -> minBitrate: a number of > 0, value: ${_}`}:(i||i===0)&&(!S.isNumber(i)||i<=0)?{code:a.PARAM_ERROR,errorMsg:`params error -> maxBitrate: a number of > 0, value: ${i}`}:_&&i&&i<_?{code:a.PARAM_ERROR,errorMsg:`params error -> maxBitrate: ${i}, minBitrate: ${_}, maxBitrate should > minBitrate`}:{code:a.SUCCESS},Ae=_=>{const i=[];for(const e in _){const{videoView:t,isTiny:s}=_[e];i.push({userId:e,videoView:t.nodeName,isTiny:s})}return i},ye=(_={},i={},e)=>{const{threadId:t,apnsCollapseId:s,richMediaUri:r}=_,{channelIdMi:o,channelIdHW:E,channelIdOPPO:L,typeVivo:c,fcmChannelId:l,fcmCollapseKey:T,fcmImageUrl:C,miLargeIconUrl:d,importanceHW:h,categoryHW:O,imageUrlHW:u,categoryVivo:f,importanceHonor:v,imageUrlHonor:D}=i,y={};t&&(y["thread-id"]=t),y["apns-collapse-id"]=s||e,r&&(y.richMediaUri=r);const P={};E&&(P.channelId=E),u&&(P.image=u),O&&(P.category=O),P.importance=h||"NORMAL";const b=[{HW:P},{APNS:y}];let Y;(T||C||l)&&(Y={},T&&(Y.collapse_key=T),C&&(Y.imageUrl=C),l&&(Y.channelId=l),b[0].FCM=Y);let K;(o||d)&&(K={},o&&(K.channelId=o),d&&(K.large_icon_uri=d),b[0].MI=K);let Te;L&&(Te={},Te.channelId=L,b[0].OPPO=Te);let te;(c||f)&&(te={},c&&(te.classification=c),f&&(te.category=f),b[0].VIVO=te);let _e;return(v||D)&&(_e={},v&&(_e.importance=v),D&&(_e.image=D),b[0].HONOR=_e),JSON.stringify(b)},se=(_,i)=>{const{pushTitle:e="",iOSConfig:t,androidConfig:s,disablePushTitle:r,templateId:o}=_,E={pushConfigs:ye(t,s,i)};return S.isBoolean(r)&&(E.disableTitle=r),e&&(E.title=e),o&&(E.templateId=o),JSON.stringify(E)},re=_=>{const i=["pushTitle","iOSConfig","androidConfig","disablePushTitle","templateId"];if(!Object.keys(_).every(E=>i.includes(E)))return{code:a.PARAM_ERROR,errorMsg:`right key: ${i.join(",")}`};for(let E=0;E<i.length;E++){const L=i[E];if(L==="disablePushTitle"){if(!S.isUndefined(_[L])&&!S.isBoolean(_[L]))return{code:a.PARAM_ERROR,errorMsg:`${L} type is boolean`}}else if((L==="pushTitle"||L==="templateId")&&_[L]&&!S.isString(_[L]))return{code:a.PARAM_ERROR,errorMsg:`${L} type is string`}}const{iOSConfig:t,androidConfig:s}=_,r=Pe(t||{});if(r.code!==a.SUCCESS)return r;const o=ve(s||{});return o.code!==a.SUCCESS?o:{code:a.SUCCESS}},Pe=_=>{const{threadId:i,richMediaUri:e}=_||{};return i&&!S.isString(i)?{code:a.PARAM_ERROR,errorMsg:"iOSConfig.threadId type is string"}:e&&!S.isString(e)?{code:a.PARAM_ERROR,errorMsg:"iOSConfig.richMediaUri type is string"}:{code:a.SUCCESS}},ve=_=>{const i=["channelIdMi","miLargeIconUrl","channelIdHW","categoryHW","importanceHW","imageUrlHW","channelIdOPPO","typeVivo","categoryVivo","fcmChannelId","fcmCollapseKey","fcmImageUrl","importanceHonor","imageUrlHonor"];if(!Object.keys(_).every(t=>i.includes(t)))return{code:a.PARAM_ERROR,errorMsg:`right key: ${i.join(",")}`};for(let t=0;t<i.length;t++){const s=i[t];if(s==="importanceHW"||s==="importanceHonor"){if(_[s]&&_[s]!=="LOW"&&_[s]!=="NORMAL")return{code:a.PARAM_ERROR,errorMsg:`androidConfig.${s} value is NORMAL|LOW`}}else if(_[s]&&!S.isString(_[s]))return{code:a.PARAM_ERROR,errorMsg:`androidConfig.${s} type is string`}}return{code:a.SUCCESS}},Ne=(_,i="utf-8")=>{let e=0;return i==="utf-16"?e=Ve(_):e=Ge(_),e},Ve=_=>{let i=0,e;for(let t=0,s=_.length;t<s;t++)e=_.charCodeAt(t),e<=65535?i+=2:i+=4;return i},Ge=_=>{let i=0,e;for(let t=0,s=_.length;t<s;t++)e=_.charCodeAt(t),e<127?i+=1:e<=2047?i+=2:e<=65535?i+=3:i+=4;return i};var x=(_=>(_.L_QS_START_CALL_S="Call-start-S",_.L_QS_ACCEPT_CALL_S="Call-accept-S",_.L_QS_HANGUP_CALL_S="Call-hangup-S",_.L_QS_RECEIVE_CALL_S="Call-recv-S",_.L_QS_ABNORMAL_HANGUP_S="Call-interrupt-S",_))(x||{});class be{constructor(i,e){this._logger=i,this._context=e}reportStatisticsData(i,e,t,s,r,o,E){const L=+new Date,{mediaType:c,callType:l,callId:T}=s?{mediaType:s.getMediaType(),callType:s.getCallType(),callId:s.getCallId()}:E,C={cr:"unknown",net:"unknown",cod:e,mtp:c,ctp:l,cid:T,time:L,uid:this._context.getCurrentId()};r&&Object.assign(C,{ccid:r});let d=null;switch(i){case x.L_QS_RECEIVE_CALL_S:d={...C,rf:o};break;case x.L_QS_ABNORMAL_HANGUP_S:d={...C};break;default:d={...C,dur:L-t}}this._logger.info("L-call-plus-statistic",JSON.stringify(d),i),this._logger.__statistics(i,JSON.stringify(d))}}var w=(_=>(_.REQUEST="request",_.ACCEPT="accept",_.REFUSE="refuse",_.CANCEL="cancel",_.NOTICE="notice",_.TIMEOUT="timeout",_))(w||{}),q=(_=>(_[_.SWITCH_MEDIA_TYPE=1]="SWITCH_MEDIA_TYPE",_))(q||{}),ne=(_=>(_[_.NORMAL=0]="NORMAL",_[_.SECRET=1]="SECRET",_))(ne||{}),oe=(_=>(_.INVITER="inviter",_.INVITEE="invitee",_))(oe||{});class ae extends S.EventEmitter{constructor(e,t,s,r,o,E,L,c){super();I(this,"_reqMediaType");I(this,"_inviterTimerId");I(this,"_inviteeTimerId");I(this,"_oldDialogData");I(this,"isLocalClientHangup",!1);this._callId=e,this._state=t,this._callType=s,this._mediaType=r,this._startCallerId=o,this._callerId=E,this._callUsers=L,this._logger=c}getCallId(){return this._callId}getSessionState(){return this._state}getCallType(){return this._callType}getMediaType(){return this._mediaType}getStartCallerId(){return this._startCallerId}getCallerId(){return this._callerId}getUserList(){return this._callUsers}getReqMediaType(){return this._reqMediaType}getInviterTimerId(){return this._inviterTimerId}getInviteeTimerId(){return this._inviteeTimerId}getAllTimerIds(){return[this._inviterTimerId,this._inviteeTimerId]}setUserDeviceEnable(e,t,s,r){this._logger.info(n.L_INNER_SESSION_SET_USER_DEVICE_ENABLE_O,`userId: ${e}, mediaType: ${t}, enable: ${s}`,r);const o=this._callUsers.find(E=>e===E.userId);t===m.AUDIO?o.microphoneEnable=s:o.cameraEnable=s}updateUserList(e,t){const s=[];return e.forEach(r=>{const{userState:o,stateTime:E,systemState:L}=r;if([A.CALLING,A.INVITED,A.BUSYLINE_WAIT].includes(o))this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`push user: ${JSON.stringify(r)}`,t),this._callUsers.push(r),s.push(r);else{let l=!1;for(let T=0;T<this._callUsers.length;T++){const{userId:C,stateTime:d,systemState:h,userState:O}=this._callUsers[T];if(C===r.userId){l=!0;const u=pe(h,L),f=Me(O,o),v=L===R.ON_PHONE_END&&h!==R.ON_PHONE&&o!==A.IDLE;if(E&&d&&E<d||u&&f){try{this._logger.warn(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`timeout user state: old:${JSON.stringify({userId:C,oldStateTime:d,oldSystemState:h,oldUserState:O})}; new:${JSON.stringify(r)}`,t)}catch(D){this._logger.error(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList err: ${D.message}`,t)}break}else{this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList -> cover ${JSON.stringify(r)}`,t),this._callUsers[T]=r,!v&&s.push(r);break}}}l||(this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList -> no user push ${JSON.stringify(r)}`,t),this._callUsers.push(r),s.push(r))}}),s}setOldDialogData(e){this._oldDialogData=e}updateSessionState(e){this._state=e}updateCallType(e){this._callType=e}updateMediaType(e){this._mediaType=e}updateReqMediaType(e){this._reqMediaType=e}updateTimerId(e,t){e==="inviter"?this._inviterTimerId=t:this._inviteeTimerId=t}getOldDialogData(){return this._oldDialogData}setIsLocalClientHangup(e){this.isLocalClientHangup=e}getIsLocalClientHangup(){return this.isLocalClientHangup}}var g=(_=>(_.START_SINGLE_CALL="startSingleCall",_.START_GROUP_CALL="startGroupCall",_.INVITE_CALL="inviteCall",_.PUB_INVITE_CALL="pubInviteCall",_.RINGING_CALL="ringCall",_.ACCEPT_CALL="acceptCall",_.JOIN_CALL="joinCall",_.HANGUP_CALL="hangupCall",_.STATUS_UP_CALL="statusUpCall",_.STATUS_DOWN_CALL="statusDownCall",_.EVENT_UP_CALL="eventUpCall",_.EVENT_DOWN_CALL="eventDownCall",_.DIALOG_UP_CALL="dialogUpCall",_.DIALOG_DOWN_CALL="dialogDownCall",_.GET_CALL_USER_SESSION_LIST="getCallUSerSessionList",_.SYNC_CALL_LOG="syncCallLog",_.PUB_CALL_LOG="pubCallLog",_.DEL_CALL_LOG="deleteCallLog",_.QRY_CALL_STATE="queryUserHasCall",_.QRY_SRV_TIMESTAMP="getCallSrvTimeStamp",_.GET_CALL_STATE_LIST="getUserCallStateList",_.CLEAR_CALL_LOG="cleanCallLog",_.GET_CALL_SESSION="getCallSession",_.GET_CALL_TIME_INFO="getCallTimeInfo",_.END_ABNORMAL_CALL="endUserAbnormalCalls",_.SYS_STATUS_UP="sysStatusUp",_.UP_CALL_LOG_READED="upCallLogReaded",_.PUB_CALL_LOG_READED="pubCallLogReaded",_.PUB_NACK_SEQ_ID="pubNACKSeqId",_.GET_USER_CALL_SESSION_ID_LIST="getUserCallSessionIdList",_))(g||{});const Ee=(_,i)=>setTimeout(_,i),Be=_=>new Promise(i=>{setTimeout(i,_)}),we=[S.ErrorCode.RC_NET_CHANNEL_INVALID,S.ErrorCode.RC_NET_UNAVAILABLE,S.ErrorCode.RC_MSG_RESP_TIMEOUT,N.RCRTCCode.SIGNAL_DISCONNECTED,N.RCRTCCode.REQUEST_FAILED],Q=async({asyncFn:_,fnArgs:i,currentRetryTime:e=Date.now(),maxDuration:t=60*1e3,intervals:s=[2*1e3,4*1e3,8*1e3,16*1e3,32*1e3,64*1e3],index:r=0,onError:o})=>{const E=await _(...i),L=2*1e3;return E.code===a.SUCCESS||!we.includes(E.code)||Date.now()+L-e>t?E:(o&&o(E.code),await Be(L),Q({asyncFn:_,fnArgs:i,currentRetryTime:e,maxDuration:t,intervals:s,index:r,onError:o}))};var J=(_=>(_.onBeforePublish="onBeforePublish",_.onPublishRes="onPublishRes",_.onPubInviteCall="onPubInviteCall",_.onPubInviteCallPullKv="onPubInviteCallPullKv",_.onPubInviteCallMiss="onPubInviteCallMiss",_))(J||{}),Le=(_=>(_.NOT_CURRENT_DEVICEID="not current device id",_.SECRET_CALL="secret call",_.NOT_INVITEE="not an invitee",_))(Le||{}),X=(_=>(_.PUB_INVITE="pubinvitecall",_.PULL_KV_INVITE="pullkv_invitecall",_.PUSH="system_pubsh",_))(X||{});class $e extends S.EventEmitter{constructor(e,t,s,r,o){super();I(this,"_listener");I(this,"_needRetryActions",[g.START_SINGLE_CALL,g.START_GROUP_CALL,g.ACCEPT_CALL,g.JOIN_CALL,g.EVENT_UP_CALL]);I(this,"_sessionId","");this._context=e,this._runtime=t,this._initOpts=s,this._timeCorrectioner=r,this._logger=o,this._context.onCallInfo=this._onRecvCallSignal.bind(this),this._context.onconnectionstatechange=this._onIMConnectionStateChange.bind(this),this._sessionId=S.getUUID22()}getSessionId(){return this._sessionId}registerListener(e){this._listener=e}async startCall(e,t){const{clientCallId:s,callType:r,toUsers:o,mediaType:E,secretChat:L,targetType:c,targetId:l,nickName:T,oldRoomId:C,pushExt:d,extra:h}=e;return r===M.SINGLE?this.startSingleCall({clientCallId:s,toUserId:o[0].userId,mediaType:E,secretChat:L,targetType:c,targetId:l,oldRoomId:C,toOrgId:o[0].orgId||"",pushExt:d,extra:h},t):this.startGroupCall({clientCallId:s,toUsers:o,mediaType:E,targetType:c,targetId:l,nickName:T,oldRoomId:C,pushExt:d,extra:h},t)}async startSingleCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_SINGLE_CALL_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(this._context.getCurrentId(),g.START_SINGLE_CALL,e)}async startGroupCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GROUP_CALL_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(this._context.getCurrentId(),g.START_GROUP_CALL,e)}async inviteCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_INVITE_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,g.INVITE_CALL,e)}async ringingCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_RING_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,g.RINGING_CALL,e)}async acceptCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_ACCEPT_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,g.ACCEPT_CALL,e)}async joinCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_JOIN_CALL_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,g.JOIN_CALL,e)}async hangupCall(e,t){this._logger.info(n.L_SIGNAL_TRANSPORTER_HANGUP_T,`params: ${JSON.stringify(e)}`,t);const{code:s}=await this._sendCallSignal(e.callId,g.HANGUP_CALL,e);return s===a.NOT_IN_CALL?{code:a.SUCCESS}:{code:s}}async statusUpCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_STATUS_UP_T,`call status up params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,g.STATUS_UP_CALL,e)}async eventUpCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_EVENT_UP_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,g.EVENT_UP_CALL,e)}async dialogUpCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_DIALOG_UP_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,g.DIALOG_UP_CALL,e)}async deleteCallRecord(e,t,s){return this._logger.info(n.L_SIGNAL_TRANSPORTER_DELETE_CALL_RECORD_T,`callIds: ${JSON.stringify(t)}`,s),this._sendCallSignal(e,g.DEL_CALL_LOG,{callIds:t})}async syncCallLog(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_RECORD_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.userId,g.SYNC_CALL_LOG,e)}async queryUserHasCall(){const e=this._context.getCurrentId();return this._sendCallSignal(e,g.QRY_CALL_STATE,null)}async getCallServerTimestamp(e){const t=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_SERVER_TIME_T,`userId: ${t}`,e),this._sendCallSignal(t,g.QRY_SRV_TIMESTAMP,null)}async getCallTimeInfo(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_TIME_INFO_T,`callId: ${e}`,t),this._sendCallSignal(e,g.GET_CALL_TIME_INFO,{callId:e})}async getUserCallStateList(e){const t=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_AVAILABLE_CALL_LIST_T,`userId: ${t}`,e),this._sendCallSignal(t,g.GET_CALL_STATE_LIST,null)}async clearCallRecord(e){const t=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_CLEAR_CALL_RECORD_T,`userId: ${t}`,e),this._sendCallSignal(t,g.CLEAR_CALL_LOG,null)}async getCallSession(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_INFO_BY_CALLID_T,`callId: ${e.callId}`,t),this._sendCallSignal(e.callId,g.GET_CALL_SESSION,e)}async sysStatusUp(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_USER_SYSTEM_STATE_UP_T,`opts: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,g.SYS_STATUS_UP,e)}async upCallLogReaded(e){const t=this._context.getCurrentId();return this._sendCallSignal(t,g.UP_CALL_LOG_READED,e)}async endUserAbnormalCalls(e){return this._sendCallSignal(this._context.getCurrentId(),g.END_ABNORMAL_CALL,e)}_onIMConnectionStateChange(e){const t=this._logger.createTraceId();this._logger.info(n.L_SIGNAL_TRANSPORTER_IM_STATE_CHANGE_O,`state: ${e}`,t),this._listener.onIMStateChange(e),e===S.RCConnectionStatus.CONNECTED?this._timeCorrectioner.start(t):this._timeCorrectioner.stop(t)}async _sendCallSignal(e,t,s){const r=s?JSON.stringify({...s,sessionId:this._sessionId}):"";let o;this._needRetryActions.includes(t)?o=await Q({asyncFn:this._context.setCallInfo.bind(this._context),fnArgs:[e,t,r]}):o=await this._context.setCallInfo(e,t,r);const{code:E,data:L}=o;if(E!==S.ErrorCode.SUCCESS)return{code:E};const{value:c}=L,l=JSON.parse(c).data;return{code:a.SUCCESS,data:l}}_onRecvCallSignal(e){const t=this._logger.createTraceId();this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_SIGNAL_DATA_O,`data: ${e}`,t),JSON.parse(e).list.forEach(r=>{const{key:o}=r,E=JSON.parse(r.value);switch(o){case g.PUB_INVITE_CALL:this._onPubInviteCall(E,t,!0);break;case g.STATUS_DOWN_CALL:this._onStatusDownCall(E,t);break;case g.EVENT_DOWN_CALL:this._onEventDownCall(E,t);break;case g.DIALOG_DOWN_CALL:this._onDialogDownCall(E,t);break;case g.PUB_CALL_LOG:this._onPubCallLog(E,t);break;case g.PUB_CALL_LOG_READED:break;case g.PUB_NACK_SEQ_ID:break;default:this._onConpensationData(E,t);break}})}_isValidData(e){return!!(S.isNull(e)||S.isString(e)&&((e==null?void 0:e.length)===0||e===this._sessionId))}_onPubInviteCall(e,t,s=!0){try{const r=this._context.getCurrentId(),o=e.callSessionUsers.find(L=>L.userId===r),E=this._context.getConnectionStatus();this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`currentUser: ${JSON.stringify(o)}, currentUserId: ${r}, state: ${E}`,t)}catch(r){this._logger.error(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`error: ${r.message}`,t)}if(!this._isValidData(e.toDeviceId||"")){this._logger.warn(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`not current deviceId -> deviceInfo: ${JSON.stringify({toDeviceId:e.toDeviceId,clientDeviceId:this._sessionId})}`,t);const r={extra:JSON.stringify(e),reason:Le.NOT_CURRENT_DEVICEID,refer:s?X.PUB_INVITE:X.PULL_KV_INVITE};this.emit(J.onPubInviteCallMiss,Object.assign(e,r));return}this._listener.onInvite(e,s,t),s?this.emit(J.onPubInviteCall,Object.assign(e,{extra:JSON.stringify(e)})):this.emit(J.onPubInviteCallPullKv,Object.assign(e,{extra:JSON.stringify(e)}))}_onStatusDownCall(e,t){if(e.callSessionUsers=e.callSessionUsers.filter(s=>!!s.changed),this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O,"",t),!this._isValidData(e.toDeviceId||"")){this._logger.warn(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O,`not current deviceId -> deviceInfo: ${JSON.stringify({toDeviceId:e.toDeviceId,clientDeviceId:this._sessionId})}`,t),this._listener.onOtherClientStatusDown(e,t);return}this._listener.onStatusDown(e,t,this._sessionId)}_onEventDownCall(e,t){this._listener.onEventDown(e,t)}_onDialogDownCall(e,t){const{dialogType:s}=e;s===q.SWITCH_MEDIA_TYPE&&this._listener.onSwitchMediaType(e,t)}_onPubCallLog(e,t){this._logger.info(n.L_CALL_ENGINE_RECEIVE_CALL_RECORD_O,`call record: ${JSON.stringify(e)}`,t),this._listener.onRecvCallEndLog(e,t)}_onConpensationData(e,t){this._logger.info(n.L_CALL_ENGINE_RECEIVE_COMPLEMENTARY_DATA_O,"",t);const{callId:s,callType:r,mediaType:o,secretChat:E,duration:L,callStatus:c,callingUserId:l,callSessionUsers:T,toDeviceId:C,callDialogEntitys:d,extra:h}=e;T.some(u=>u.sessionStatus===A.INVITED&&u.userId===this._context.getCurrentId())?this._onPubInviteCall({callId:s,toDeviceId:C,callType:r,mediaType:o,inviteUserId:l,callingUserId:l,callSessionUsers:T,secretChat:E,extra:h},t,!0):this._onStatusDownCall({callId:s,toDeviceId:C,callStatus:c,duration:L,callSessionUsers:T},t),d.length>0&&d.forEach(u=>this._onDialogDownCall(u,t),this)}}const He=_=>{const i="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ+/".split(""),e=i.length+1;let t=+_;const s=[];do{const r=t%e;t=(t-r)/e,s.unshift(i[r])}while(t);return s.join("")},ke=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,_=>{const i=Math.random()*16|0;return(_==="x"?i:i&3|8).toString(16)}),Fe=()=>{let _=ke();return _=`${_.replace(/-/g,"")}0`,_=parseInt(_,16),_=He(_),_.length>22&&(_=_.slice(0,22)),_},xe="RC_CALLPLUS",Ye=1;let $;const V=class V{static init(i,e){$=i,this.isSupport()||$.info("[RCCallIndexDB]","IndexDB is not support in the current environment");const t=window.indexedDB.open(xe,Ye);t.onerror=s=>{$.warn("[RCCallIndexDB]",`open indexDB req failed -> ${s.target.error}`)},t.onsuccess=s=>{this._db=s.target.result,this._db&&(this._db.onclose=r=>{$.warn("[RCCallIndexDB]",`The db ${this._db.name} has unexpectedly closed. ${r}`),this.unInit()},this._db.onerror=r=>{$.warn("[RCCallIndexDB]",`The db ${this._db.name} has opening error. ${r}`),this.unInit()},this._db.onabort=r=>{$.warn("[RCCallIndexDB]",`The db ${this._db.name} has opening aborted. ${r}`),this.unInit()}),V._instance=new V,e.onSuccess()},t.onupgradeneeded=s=>{this._db=s.target.result,V.createObjStore("CallBW_AbnormalCall",{keyPath:"userId"})}}static unInit(){this._db=null,this._instance=null}static getInstance(){return this._instance}static isSupport(){return!(typeof window>"u"||!window||!window.indexedDB)}static createObjStore(i,e){var t;(t=V._db)!=null&&t.objectStoreNames.contains(i)?$.debug("[RCCallIndexDB]",`createObjStore ${i} already exists`):V._db.createObjectStore(i,e)}addValue(i,e){return new Promise((t,s)=>{if(!V._db){t(!1);return}const o=V._db.transaction([i],"readwrite").objectStore(i).add(e);o.onsuccess=()=>{t(!0)},o.onerror=()=>{$.debug("[RCCallIndexDB]","addValue failed"),t(!1)}})}readByKey(i,e){return new Promise((t,s)=>{if(!V._db){t(null);return}const o=V._db.transaction([i]).objectStore(i).get(e);o.onsuccess=()=>{t(o.result)},o.onerror=E=>{$.warn("[RCCallIndexDB]",`readByKey onerror -> ${E}`),t(null)}})}updateByKey(i,e,t){return new Promise((s,r)=>{if(!V._db){s(!1);return}const E=V._db.transaction([i],"readwrite").objectStore(i).put(t);E.onsuccess=()=>{s(!0)},E.onerror=L=>{s(!1),$.warn("[RCCallIndexDB]",`updateByKey onerror -> ${L}`)}})}removeByKey(i,e){return new Promise((t,s)=>{if(!V._db){t(!1);return}const o=V._db.transaction([i],"readwrite").objectStore(i).delete(e);o.onsuccess=()=>{t(!0)},o.onerror=E=>{t(!1),$.warn("[RCCallIndexDB]",`removeByKey onerror -> ${E}`)}})}};I(V,"_db",null),I(V,"_instance",null);let z=V;class Je{constructor(i,e){I(this,"_localStore");I(this,"_indexDBStore");I(this,"_storeKey","CallBW_AbnormalCall");I(this,"_isSupportIndexDB");if(this._runtime=i,this._logger=e,this._isSupportIndexDB=z.isSupport(),this._isSupportIndexDB){z.init(this._logger,{onSuccess:()=>{this._indexDBStore=z.getInstance()}});return}this._localStore=i.localStorage}addAbnormallCallId(i,e){(this._isSupportIndexDB?this._addByIndexDB:this._addByLocalStore).call(this,i,e)}removeAbnormalCallIds(i,e){(this._isSupportIndexDB?this._removeByIndexDB:this._removeByLocalStore).call(this,i,e)}getAbnormalCallIds(i){return(this._isSupportIndexDB?this._getByIndexDB:this._getByLocalStore).call(this,i)}_addByLocalStore(i,e){try{const t=JSON.parse(this._localStore.getItem(this._storeKey)||"{}");let s=t[i];s?s.push(e):s=[e],t[i]=s,this._localStore.setItem(this._storeKey,JSON.stringify(t))}catch(t){this._logger.warn("[AbnormalCall]",`_addByLocalStore err: ${t.message}`)}}_removeByLocalStore(i,e){try{const t=JSON.parse(this._localStore.getItem(this._storeKey)||"{}");let s=t[i];s&&(s=s.filter(r=>!e.includes(r)),s.length>0?t[i]=s:delete t[i],this._localStore.setItem(this._storeKey,JSON.stringify(t)))}catch(t){this._logger.warn("[AbnormalCall]",`_removeByLocalStore err: ${t.message}`)}}_getByLocalStore(i){let e=null;try{const s=JSON.parse(this._localStore.getItem(this._storeKey)||"{}")[i];s&&(e=s)}catch(t){this._logger.warn("[AbnormalCall]",`_getByLocalStore err: ${t.message}`)}return Promise.resolve(e)}async _addByIndexDB(i,e){try{const t=await this._indexDBStore.readByKey(this._storeKey,i);t?(t.callIds.push(e),this._indexDBStore.updateByKey(this._storeKey,i,{userId:i,callIds:t.callIds})):this._indexDBStore.addValue(this._storeKey,{userId:i,callIds:[e]})}catch(t){this._logger.warn("[AbnormalCall]",`_addByIndexDB err: ${t.message}`)}}async _removeByIndexDB(i,e){try{const t=await this._indexDBStore.readByKey(this._storeKey,i);t&&(t.callIds=t.callIds.filter(s=>!e.includes(s)),t.callIds.length>0?this._indexDBStore.updateByKey(this._storeKey,i,{userId:i,callIds:t.callIds}):this._indexDBStore.removeByKey(this._storeKey,i))}catch(t){this._logger.warn("[AbnormalCall]",`_removeByIndexDB err: ${t.message}`)}}async _getByIndexDB(i){let e=null;try{e=await this._indexDBStore.readByKey(this._storeKey,i)}catch(t){this._logger.warn("[AbnormalCall]",`_getByIndexDB err: ${t.message}`)}return e?e.callIds:null}}var ce=(_=>(_[_.PROMPT=0]="PROMPT",_[_.CALL_DURATION=10]="CALL_DURATION",_[_.FIRST_FRAME=20]="FIRST_FRAME",_))(ce||{}),B=(_=>(_[_.SUCCESS=0]="SUCCESS",_[_.INVALID_RESPONSE_TIME=80170]="INVALID_RESPONSE_TIME",_[_.NONOPTIMAL_RES_TIME=80171]="NONOPTIMAL_RES_TIME",_))(B||{});class We{constructor(i,e,t){I(this,"_RTT",0);I(this,"_validMinRTT",200);I(this,"_validMaxRTT",1e3);I(this,"_deltaTime",0);I(this,"_timerId",null);I(this,"_interval",2*1e3);I(this,"_maxRetryTimes",8);I(this,"_startTimes",0);I(this,"_retryTimesInCall",0);I(this,"_maxRetryTimesInCall",3);this._callEngine=i,this._logger=e,this._singleCallDurationEv=t}async getCallClientTimeByServer(i,e){this._logger.info(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_T,`callId: ${i}`,e),(!this._RTT||this._RTT>this._validMinRTT)&&await this._getDeltaTime(e),this._RTT>this._validMaxRTT&&this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${B.INVALID_RESPONSE_TIME}`,e);const{code:t,data:s}=await this._callEngine.getCallTimeInfo(i,e);if(t!==a.SUCCESS)return this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${t}`,e),{code:t};const{startTime:r}=s,o=Math.floor(r-this._deltaTime);let L=(Date.now()+this._deltaTime-r)/1e3;return L<0&&(this._logger.warn(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_P,`invalid duration: ${L}`,e),L=0),L=Math.floor(L),this._RTT>this._validMinRTT&&this._RTT<=this._validMaxRTT&&this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${B.NONOPTIMAL_RES_TIME}`,e),this._logger.info(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime,serverStartTime:r,clientStartTime:o,duration:L}),e),{code:t,duration:L,clientStartTime:o}}calcClientStartTime(i,e,t){if(this._logger.info(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_T,`callId: ${i}, startTime: ${e}`,t),this._RTT>this._validMaxRTT)return this._logger.error(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R,`code: ${B.INVALID_RESPONSE_TIME}`,t),this._loopCorrectClientTime(i,t),{code:B.INVALID_RESPONSE_TIME};const s=Math.floor(e-this._deltaTime);return this._logger.info(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime,startT:e,clientStartTime:s}),t),this._RTT>this._validMinRTT&&(this._retryTimesInCall=0,this._loopCorrectClientTime(i,t)),{code:B.SUCCESS,clientStartTime:s}}start(i){this._timerId||this._startTimes>=this._maxRetryTimes||(this._logger.info(n.L_TIME_CORRECT_START_O,`timerId: ${this._timerId}`),this._startTimes++,this._getDeltaTime(i),this._timerId=Ee(()=>{this._timerId=null,this.start(i)},this._interval))}stop(i){this._logger.info(n.L_TIME_CORRECT_STOP_O,`timerId: ${this._timerId}`,i),this._timerId&&clearTimeout(this._timerId),this._timerId=null,this._startTimes=0}restart(i){this._logger.info(n.L_TIME_CORRECT_RESTART_O,`legal rtt time, RTT: ${this._RTT}, validMinRTT: ${this._validMinRTT}`,i),!(this._RTT<this._validMinRTT)&&(this.stop(i),this.start(i))}getLocalDelayTime(){return this._deltaTime}getRTT(){return this._RTT}async _getDeltaTime(i){const e=Date.now(),{code:t,data:s}=await this._callEngine.getCallServerTimestamp(i),r=Date.now();if(t!==a.SUCCESS)return{code:t};const o=r-e;return(o<this._RTT||this._RTT===0)&&o<=this._validMaxRTT&&(this._RTT=o),o<this._validMinRTT&&this.stop(i),this._deltaTime=s-e-this._RTT/2,this._logger.info(n.L_TIME_CORRECT_SET_DELTA_TIME_O,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime}),i),{code:t,delayTime:this._deltaTime}}async _getDeltaTimeInCall(i,e){const t=Date.now(),{code:s,data:r}=await this._callEngine.getCallTimeInfo(i,e),o=Date.now();if(s!==a.SUCCESS)return{code:s};const E=o-t;E<this._RTT&&(this._RTT=E),this._deltaTime=r.syncTime-t-this._RTT/2,this._logger.info(n.L_TIME_CORRECT_SET_DELTA_TIME_O,JSON.stringify({callId:i,rtt:this._RTT,deltaT:this._deltaTime}),e);const L=Math.floor(r.startTime-this._deltaTime),c=Math.floor(r.firstFrametime-this._deltaTime);return E<this._validMinRTT?{code:B.SUCCESS,clientStartTime:L,clientFirstFrameTime:c}:{code:B.INVALID_RESPONSE_TIME,clientStartTime:L,clientFirstFrameTime:c}}async _loopCorrectClientTime(i,e){this.stop(e),this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_T,`callId: ${i}`,e);const{code:t,clientStartTime:s,clientFirstFrameTime:r}=await this._getDeltaTimeInCall(i,e);if(t===B.SUCCESS){this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R,`code: ${a.SUCCESS}`,e),this._singleCallDurationEv(i,s,r,e);return}if(this._retryTimesInCall>this._maxRetryTimesInCall&&t===B.INVALID_RESPONSE_TIME){this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R,`code: ${B.INVALID_RESPONSE_TIME}`,e),this._singleCallDurationEv(i,s,r,e);return}this._retryTimesInCall>this._maxRetryTimesInCall||(this._retryTimesInCall++,setTimeout(()=>{this._loopCorrectClientTime(i,e)},this._interval))}}var Z=(_=>(_[_.SOON_AFETER=0]="SOON_AFETER",_[_.CURRENT=1]="CURRENT",_))(Z||{}),le=(_=>(_[_.PUB_INVITE_CALL=0]="PUB_INVITE_CALL",_[_.PULL_KV_INVITE_CALL=1]="PULL_KV_INVITE_CALL",_[_.SYSTEM_PUSH=2]="SYSTEM_PUSH",_))(le||{}),Se=(_=>(_[_.OUT=-1]="OUT",_[_.GROUP=0]="GROUP",_[_.IN=1]="IN",_))(Se||{});const Re=60*1e3,H=class H extends S.EventEmitter{constructor(e,t,s,r,o){super();I(this,"_mainSession",null);I(this,"_holdSessions",[]);I(this,"_signalModule");I(this,"_abnormalModule");I(this,"_isUpFirstFrameTime",!1);I(this,"_callStartMap",{});I(this,"_timeCorrectioner");I(this,"_clientCallId","");this._context=e,this._runtime=t,this._initOpts=s,this._logger=r,this._reportAppEventModule=o,this._timeCorrectioner=new We(this,r,this._onRecvSinCallDuration.bind(this)),this._signalModule=new $e(e,t,s,this._timeCorrectioner,this._logger),this._signalModule.registerListener({onInvite:this._onInvite.bind(this),onStatusDown:this._onStatusDown.bind(this),onOtherClientStatusDown:this._onOtherClientStatusDown.bind(this),onEventDown:this._onEventDown.bind(this),onSwitchMediaType:this._onSwitchMediaType.bind(this),onRecvCallEndLog:this._onRecvCallEndLog.bind(this),onIMStateChange:this._onIMStateChange.bind(this)}),this._abnormalModule=new Je(t,r)}async startCall(e,t){const s=this._context.getCurrentId(),{callType:r,mediaType:o,toUsers:E,targetId:L,targetType:c,oldRoomId:l,pushConfig:T,extra:C}=e;this._clientCallId=e.callId;const d=T?se(T,this._clientCallId):"",{code:h,data:O}=await this._signalModule.startCall({clientCallId:this._clientCallId,callType:r,mediaType:o,toUsers:E,secretChat:ne.NORMAL,targetType:c,targetId:L,oldRoomId:l,pushExt:d,extra:C},t);if(h!==a.SUCCESS)return{code:h};const{callId:u,busylineUsers:f}=O;if(this._abnormalModule.addAbnormallCallId(s,u),this._mainSession=new ae(u,p.INVITED,r,o,s,s,[],this._logger),r===M.SINGLE){const P=this._startTimer(O.callId,A.NO_ANSWER,t);this._mainSession.updateTimerId(oe.INVITER,P)}const v={userId:s,userState:A.CALLING,systemState:R.CALLING,targetType:c,targetId:L,cameraEnable:!1,microphoneEnable:!1};let D=E.map(({userId:P,targetType:b,targetId:Y})=>({userId:P,userState:A.INVITED,systemState:R.INVITED,targetType:b,targetId:Y,cameraEnable:!1,microphoneEnable:!1})),y=[];return f&&(y=f.map(P=>{const{targetType:b,targetId:Y}=D.find(K=>K.userId===P.userId);return{userId:P.userId,userState:P.sessionStatus,systemState:R.BUSYLINE_RINGING,targetType:b,targetId:Y,cameraEnable:!1,microphoneEnable:!1}}),D=D.filter(({userId:P})=>y.every(({userId:b})=>b!==P))),setTimeout(()=>{this.updateUsersState(u,[v,...D,...y],t)}),{code:h,data:O}}async invite(e,t){var T;if(!this._mainSession)return{code:a.NOT_IN_CALL};const{toUsers:s,pushConfig:r,extra:o}=e,E=r?se(r,this._clientCallId):"",L=this._mainSession.getCallId(),{code:c,data:l}=await this._signalModule.inviteCall({callId:L,toUsers:s,pushExt:E,extra:o},t);if(c===a.SUCCESS){this._mainSession.getCallType()===M.SINGLE&&(this._mainSession.updateCallType(M.MULTI),this._onCallTypeChange(this._mainSession.getCallId(),M.MULTI,t));let C=s.map(({userId:h,targetType:O,targetId:u})=>({userId:h,userState:A.INVITED,systemState:R.INVITED,targetType:O,targetId:u,cameraEnable:!1,microphoneEnable:!1})),d=[];l.busylineUsers&&(d=(T=l.busylineUsers)==null?void 0:T.map(h=>{const{targetType:O,targetId:u}=C.find(f=>f.userId===h.userId);return{userId:h.userId,userState:h.sessionStatus,systemState:R.BUSYLINE_RINGING,targetType:O,targetId:u,cameraEnable:!1,microphoneEnable:!1}}),C=C.filter(({userId:h})=>d.every(({userId:O})=>O!==h))),this.updateUsersState(L,[...C,...d],t)}return{code:c,data:l}}clearAllTimer(e,t){[this._mainSession,...this._holdSessions].forEach(s=>{s&&s.getCallId()===e&&s.getAllTimerIds().forEach(r=>this._stopTimer.bind(this)(r,t))})}async hangup(e,t){const{callId:s,systemState:r,pushConfig:o}=e,E=o?se(o,this._clientCallId):"";return this._signalModule.hangupCall({callId:s,sysStatus:r,pushExt:E},t)}async accept(e,t){if(!this._mainSession)return{code:a.NOT_IN_CALL};const{callId:s}=e,{code:r}=await this._signalModule.acceptCall({callId:s},t);return this._stopTimer(this._mainSession.getInviteeTimerId(),t),r!==a.SUCCESS?{code:r}:(this._clearMobileOnPhone(e.callId,t),this._mainSession.updateSessionState(p.CONNECTING),{code:r})}async joinCall(e,t){const s=this._context.getCurrentId();this._mainSession&&this._stopTimer(this._mainSession.getInviteeTimerId(),t);const{code:r}=await this._signalModule.joinCall({callId:e.callId},t);return r!==a.SUCCESS?{code:r}:(this._abnormalModule.addAbnormallCallId(s,e.callId),this._mainSession?this._clearMobileOnPhone(e.callId,t):await this._createSessionByServer(e.callId,t,!0),{code:r})}async requestChangeMediaType(e,t){if(!this._mainSession)return{code:a.NOT_IN_CALL};const s={mediaType:e.mediaType};this._mainSession.updateReqMediaType(e.mediaType);const r=Fe(),{code:o}=await this._signalModule.dialogUpCall({transactionId:r,callId:this._mainSession.getCallId(),toUserIds:e.toUserIds,dialogType:q.SWITCH_MEDIA_TYPE,action:w.REQUEST,extraKeyVal:s},t);return o!==a.SUCCESS?{code:o}:{code:a.SUCCESS,data:{transactionId:r}}}async responseChangeMediaType(e,t){if(!this._mainSession)return{code:a.NOT_IN_CALL};const s=this._mainSession.getReqMediaType();return e.agree&&(this._mainSession.updateMediaType(s),this._mainSession.updateReqMediaType(null)),this._signalModule.dialogUpCall({transactionId:e.transactionId,callId:this._mainSession.getCallId(),dialogType:q.SWITCH_MEDIA_TYPE,action:e.agree?w.ACCEPT:w.REFUSE},t)}async cancelChangeMediaType(e,t){return this._mainSession?this._signalModule.dialogUpCall({transactionId:e.transactionId,callId:this._mainSession.getCallId(),dialogType:q.SWITCH_MEDIA_TYPE,action:w.CANCEL},t):{code:a.NOT_IN_CALL}}async getCallLogList(e,t){const s=this._context.getCurrentId(),{timestamp:r,count:o,order:E}=e,{code:L,data:c}=await this._signalModule.syncCallLog({userId:s,syncTime:r,count:o,order:E},t);if(L!==a.SUCCESS)return{code:L};const l=c.callLogList.map(T=>de(T));return{code:a.SUCCESS,data:{hasMore:!!(c!=null&&c.hasMore),syncTime:E===0?c.maxTime:c.minTime,list:l}}}async deleteCallLog(e,t){const s=this._context.getCurrentId();return this._signalModule.deleteCallRecord(s,e,t)}async getCallServerTimestamp(e){const{code:t,data:s}=await this._signalModule.getCallServerTimestamp(e);return t!==a.SUCCESS?{code:t}:{code:t,data:s.syncTime}}async getCallTimeInfo(e,t){return this._signalModule.getCallTimeInfo(e,t)}async getOpenCallList(e){const t=this._context.getCurrentId(),{code:s,data:r}=await this._signalModule.getUserCallStateList(e);if(s!==a.SUCCESS)return{code:s};const o=r.callStateList.map(E=>{const{callId:L,callType:c,mediaType:l,callingUserId:T,callUserIds:C,callStatus:d,crtTime:h,userSessionStatus:O,startTime:u,syncTime:f}=E,v=T===t?Se.OUT:Se.IN,{clientStartTime:D=u}=this._timeCorrectioner.calcClientStartTime(L,u,e);return{callId:L,callType:c,callDirection:v,mediaType:l,callerUserId:T,callUserIds:C,sessionState:d,userState:O,startTimestamp:u,endTimestamp:0,duration:Math.floor((+new Date-D)/1e3),syncTimestamp:f,systemState:0,createTimestamp:h}});return{code:s,data:o}}async removeAllCallLog(e){const{code:t}=await this._signalModule.clearCallRecord(e);return t!==a.SUCCESS?{code:t}:{code:t}}async getCallSession(e,t){const{code:s,data:r}=await this._signalModule.getCallSession(e,t);if(s!==a.SUCCESS)return{code:s};const{callId:o,callingUserId:E,callType:L,mediaType:c,callStatus:l,callSessionUsers:T,startTime:C,duration:d,syncTime:h}=r,O=T.map(u=>{const{userId:f,sessionStatus:v,sysStatus:D,targetType:y,targetId:P}=u;return{userId:f,userState:v,systemState:D,targetType:y,targetId:P,cameraEnable:!1,microphoneEnable:!1}});return{code:s,data:{callId:o,startCallerId:E,callType:L,mediaType:c,sessionState:l,callSessionUsers:O,startTime:C,duration:d,syncTime:h}}}getHoldSession(e){const t=this._holdSessions.find(s=>s&&s.getCallId()===e);return t?new j(t,this,this._logger):null}getLocalMainSession(){return this._mainSession?new j(this._mainSession,this,this._logger):null}updateMainSessionState(e){var t;(t=this._mainSession)==null||t.updateSessionState(e)}setIsLocalClientHangup(e){var t;(t=this._mainSession)==null||t.setIsLocalClientHangup(e)}updateUsersState(e,t,s){this._logger.info(n.L_CALL_ENGINE_UPDATE_USERS_STATE_O,`updateUsersState -> users: ${JSON.stringify(t)}`,s);const r=[this._mainSession,...this._holdSessions].find(E=>(E==null?void 0:E.getCallId())===e),o=[];if(r){const E=t.map(L=>{const c=r.getUserList().filter(({userId:d})=>d===L.userId)[0]||{},l=L.userState===A.IDLE,{cameraEnable:T=!1,microphoneEnable:C=!1}=l?{cameraEnable:!1,microphoneEnable:!1}:c;return{...L,cameraEnable:T,microphoneEnable:C}});o.push(...r.updateUserList(E,s))}else o.push(...t);o.length>0&&this._onUserStateChange(e,o,s)}setUserDeviceEnable(e,t,s,r){var o;(o=this._mainSession)==null||o.setUserDeviceEnable(e,t,s,r)}async getCallStaringTime(e,t){return this._timeCorrectioner.getCallClientTimeByServer(e.callId,t)}async systemStatusUp(e,t){return this._signalModule.sysStatusUp(e,t)}async upFirstFrameTime(e){if(!this._mainSession||this._mainSession&&this._mainSession.getCallType()!==M.SINGLE||this._isUpFirstFrameTime)return{code:a.SUCCESS};const s=Date.now(),r=this._timeCorrectioner.getLocalDelayTime(),o=Math.floor(s+r);this._logger.info(n.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_T,`now: ${s}; delay: ${r}; streamReadyTime: ${o}`,e),this._isUpFirstFrameTime=!0;const E=this._mainSession.getCallId(),{code:L}=await this._signalModule.eventUpCall({callId:E,eventType:ce.FIRST_FRAME,eventArgs:{streamReadyTime:o},eventTime:Date.now()},e);return this._logger.info(n.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_R,`code: ${L}`,e),{code:L}}endCurrentSession(e,t,s){const r=this._context.getCurrentId();if(this._mainSession&&this._mainSession.getCallId()===t){const o=this._mainSession.getUserList().map(L=>{let{userId:c,systemState:l,targetType:T,targetId:C}=L;return c===r&&(l=e),{userId:c,sessionStatus:A.ENDED,statusTime:Date.now(),duration:0,changed:1,inviteUserId:this._mainSession.getStartCallerId(),sysStatus:l,targetType:T,targetId:C}}),E={callId:this._mainSession.getCallId(),toDeviceId:this._signalModule.getSessionId(),callStatus:p.ENDED,duration:0,callSessionUsers:o};this._onStatusDown(E,s)}}startTimeCorrection(e){this._timeCorrectioner.restart(e)}getDelayTimeInfo(){return{delayTime:this._timeCorrectioner.getLocalDelayTime(),rtt:this._timeCorrectioner.getRTT()}}upgradeMainSession(e){var s;const t=this._holdSessions.findIndex(r=>r.getCallId()===e);this._mainSession=(s=this._holdSessions.splice(t,1))==null?void 0:s[0]}async endCurrentUserAbnormalCalls(e){const t=this._context.getCurrentId(),s=await this._abnormalModule.getAbnormalCallIds(t);if(!s)return{code:a.SUCCESS};const{code:r}=await this._signalModule.endUserAbnormalCalls({callIds:s,allDevice:e.allDevice?1:0});return r===a.SUCCESS&&this._abnormalModule.removeAbnormalCallIds(t,s),{code:r}}_onIMStateChange(e){const t=this._logger.createTraceId();let s=0;e===S.RCConnectionStatus.DISCONNECTED&&this._mainSession&&this._mainSession.getSessionState()!==p.ONCALL&&(s=Ee(()=>{var r;this._logger.info(n.L_CALL_ENGINE_IM_STATE_CHANGE_O,"endCurrentSession, IM disconnected for more than 60s",t),this.endCurrentSession(R.CONNECTION_ERR,(r=this._mainSession)==null?void 0:r.getCallId(),t)},Re)),e===S.RCConnectionStatus.CONNECTED&&(s&&clearTimeout(s),this.endCurrentUserAbnormalCalls({allDevice:!0}))}_handleCallTimeout(e,t,s){this._logger.warn(n.L_CALL_ENGINE_CALL_TIMEOUT_O,`call timeout callId: ${e}, userState: ${t}`,s);const r=[this._mainSession,...this._holdSessions].find(E=>E&&E.getCallId()===e);if(!r){this._logger.warn(n.L_CALL_ENGINE_CALL_TIMEOUT_O,`handleCallTimeout without session, callId: ${e}`,s);return}const o=this._context.getCurrentId();this._onStatusDown({callId:e,toDeviceId:this._signalModule.getSessionId(),callStatus:p.ENDED,duration:0,callSessionUsers:r.getUserList().map(E=>{const{userId:L,targetType:c,targetId:l,stateTime:T}=E;let C,d;return L===o?(C=t===A.MISSED?R.MISSED:R.NO_ANSWER,d=t===A.MISSED?A.MISSED:A.NO_ANSWER):(C=t===A.MISSED?R.NO_ANSWER:R.MISSED,d=t===A.MISSED?A.NO_ANSWER:A.MISSED),{userId:L,sessionStatus:d,statusTime:T?T+1:Date.now(),duration:0,changed:1,inviteUserId:r.getCallerId(),sysStatus:C,targetType:c,targetId:l}})},s)}_startTimer(e,t,s){const r=Ee(()=>{this._handleCallTimeout(e,t,s),this._signalModule.statusUpCall({callId:e,sessionStatus:t},s)},Re);return this._logger.info(n.L_CALL_ENGINE_START_CALL_TIMER_O,`callId: ${e}, timerId: ${r}`,s),r}_stopTimer(e,t){clearTimeout(e),this._logger.info(n.L_CALL_ENGINE_STOP_CALL_TIMER_O,`timerId: ${e}`,t)}_onInvite(e,t,s){this._clientCallId=S.getUUID();const r=this._context.getCurrentId(),{callSessionUsers:o,secretChat:E,extra:L="{}"}=e;if(E===ne.SECRET){this.emit(J.onPubInviteCallMiss,Object.assign(e,{extra:JSON.stringify(e),reason:Le.SECRET_CALL,refer:t?X.PUB_INVITE:X.PULL_KV_INVITE}));return}o.some(l=>l.userId===r)&&this._selfIsInviteeHandle(e,t,s,L),this._othersIsInviteeHandle(e,s)}_selfIsInviteeHandle(e,t,s,r){const{callId:o,inviteUserId:E,callType:L,mediaType:c,callSessionUsers:l}=e,T=this._context.getCurrentId();this._abnormalModule.addAbnormallCallId(T,o);const C=new ae(o,p.RINGING,L,c,E,E,[],this._logger);this._signalModule.ringingCall({callId:o},s);const d=this._startTimer(o,A.MISSED,s);C.updateTimerId(oe.INVITEE,d),this._mainSession?(this._holdSessions.push(C),this._mainSession.updateSessionState(p.BUSYLINE_WAIT)):this._mainSession=C;const h=new j(C,this,this._logger);this._reportAppEventModule.onReceivedCall(h,s,JSON.parse(r||"{}").extra);const O=t?le.PUB_INVITE_CALL:le.PULL_KV_INVITE_CALL;this.emit(H.__INNER_INVITE__,h,O);const u=l.map(({userId:f,sessionStatus:v,sysStatus:D,targetType:y,targetId:P,statusTime:b})=>({userId:f,userState:v,systemState:D,targetType:y,targetId:P,stateTime:b,cameraEnable:!1,microphoneEnable:!1}));this.updateUsersState(o,u,s)}_othersIsInviteeHandle(e,t){var T,C,d;const{callId:s,inviteUserId:r,callSessionUsers:o}=e,E=this._context.getCurrentId(),L=o.filter(h=>h.userId!==E&&h.userId!==r&&h.sessionStatus===A.INVITED);if(!L.length)return;((T=this._mainSession)==null?void 0:T.getCallType())===M.SINGLE&&((C=this._mainSession)==null?void 0:C.getCallId())===s&&(this._onCallTypeChange(this._mainSession.getCallId(),M.MULTI,t),(d=this._mainSession)==null||d.updateCallType(M.MULTI));const c=[],l=[];L.forEach(h=>{const{userId:O,sessionStatus:u,sysStatus:f}=h;c.push({callId:s,userId:O,userState:u}),l.push({userId:O,userState:u,systemState:f,cameraEnable:!1,microphoneEnable:!1})}),this._onOtherMemberInvite(c),this.updateUsersState(s,l,t)}_onHangup(e,t,s){this._mainSession&&e.forEach(r=>{r.callId===this._mainSession.getCallId()&&(r.userState===A.CANCELLED?this._stopTimer(this._mainSession.getInviteeTimerId(),s):this._stopTimer(this._mainSession.getInviterTimerId(),s))})}_onAccept(e,t){var L,c,l,T;const s=(L=this._mainSession)==null?void 0:L.getSessionState(),r=[p.CONNECTING,p.ONCALL,p.BUSYLINE_WAIT];if(((c=this._mainSession)==null?void 0:c.getCallType())===M.SINGLE&&s&&r.includes(s))return;const o=this._mainSession.getStartCallerId(),E=this._context.getCurrentId();((l=this._mainSession)==null?void 0:l.getCallType())===M.SINGLE&&o===E&&e.filter(d=>d.fromUserId!==E)&&this.emit(H.__INNER_SESSION_CONNECT__,this.getLocalMainSession().getCallId(),t),(T=this._mainSession)==null||T.updateSessionState(p.CONNECTING),this._stopTimer(this._mainSession.getInviterTimerId(),t)}async _onStatusDown(e,t){var d,h;const{callStatus:s,startTime:r,callId:o}=e;if(o!==((d=this._mainSession)==null?void 0:d.getCallId()))return;if(this._callStartMap[o]=this._callStartMap[o]||{},!this._callStartMap[o].isReceiveCallStartTime&&s===p.ONCALL){this._callStartMap[o].isReceiveCallStartTime=!0;const{code:O,clientStartTime:u}=this._timeCorrectioner.calcClientStartTime(o,r,t);O===B.SUCCESS&&this._reportAppEventModule.onReceivedCallStartTime({callId:o,callStartTime:u},t)}let E=!1;const L=this._context.getCurrentId(),c=e.callSessionUsers.map(O=>([A.IDLE,A.DECLINED,A.MISSED,A.NO_ANSWER,A.CANCELLED].includes(O.sessionStatus)&&O.sysStatus!==R.CANCELLED&&O.userId===L&&(E=!0),{userId:O.userId,userState:O.sessionStatus,systemState:O.sysStatus,stateTime:O.statusTime,cameraEnable:!1,microphoneEnable:!1}));if(c.length>0&&this.updateUsersState(o,c,t),!this._mainSession&&!this._holdSessions.length)return;const{hangupData:l,acceptData:T,otherInvitedData:C}=me(e);l.length>0&&this._onHangup(l,e.callStatus,t),T.length>0&&this._onAccept(T,t),C.length>0&&((h=this._mainSession)==null?void 0:h.getCallType())===M.MULTI&&this._onOtherMemberInvite(C),(e.callStatus===p.ENDED||E)&&this._onSessionClose(e,t,E)}_onOtherClientStatusDown(e,t){var L,c,l;const s=this._context.getCurrentId(),{callId:r,callSessionUsers:o}=e,E=o.find(({userId:T})=>T===s);if(E&&(this._mainSession||this._holdSessions.length)){const{userId:T,sessionStatus:C,statusTime:d}=E;if(C===A.CONNECTING){const h=[A.ONCALL,A.CONNECTING],O=((L=this._mainSession)==null?void 0:L.getCallId())===r,u=(l=(c=this._mainSession)==null?void 0:c.getUserList().find(v=>v.userId===s))==null?void 0:l.userState;O&&u&&h.includes(u)||(this.updateUsersState(r,[{userId:T,userState:C,systemState:R.OTHER_CLIENT_ACCEPT,stateTime:d,cameraEnable:!1,microphoneEnable:!1}],t),this._onSessionClose(e,t,!1))}}}async _onEventDown(e,t){var E;const{callId:s,eventArgs:r,eventType:o}=e;if(o===ce.CALL_DURATION&&s===((E=this._mainSession)==null?void 0:E.getCallId())){const{firstFrameTime:L}=r,{code:c,clientStartTime:l}=this._timeCorrectioner.calcClientStartTime(s,L,t);this._logger.info(n.L_CALL_ENGINE_RECEIVE_FIRST_FRAME_TIME_O,`clientFirstFrameTime: ${l}`,t),c===B.SUCCESS&&this._reportAppEventModule.onReceivedCallFirstFrameTime(s,l,t)}}_onRecvSinCallDuration(e,t,s,r){var o;((o=this._mainSession)==null?void 0:o.getCallId())===e&&(this._reportAppEventModule.onReceivedCallStartTime({callId:e,callStartTime:t},r),this._reportAppEventModule.onReceivedCallFirstFrameTime(e,s,r))}_onSwitchMediaType(e,t){var O,u,f,v,D;const{callId:s,action:r,extraKeyVal:o,transactionId:E,promoterId:L}=e,{mediaType:c,reason:l}=o,T=(O=this._mainSession)==null?void 0:O.getCallId();if(s!==T){this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,`not current session callId: ${T}, recvCallId: ${s}`,t);return}const{transactionId:C,action:d,mediaType:h}=((u=this._mainSession)==null?void 0:u.getOldDialogData())||{};if(C===E&&d===r&&h===c){this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,"duplicate dialog data",t);return}if(this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,`action: ${r}, reason: ${l}`,t),(f=this._mainSession)==null||f.setOldDialogData({transactionId:E,action:r,mediaType:c}),r===w.REQUEST)this._onRequestChangeMediaType({transactionId:E,userId:L,mediaType:c},t);else{let y=null;switch(l){case w.CANCEL:y=F.CANCEL_CHANGE_MEDIA_TYPE;break;case w.ACCEPT:y=F.SERVER_ALLOW_MEDIA_TYPE,(v=this._mainSession)==null||v.updateMediaType(this._mainSession.getReqMediaType()),(D=this._mainSession)==null||D.updateReqMediaType(null);break;case w.REFUSE:y=F.REFUSE_CHANGE_MEDIA_TYPE;break;case w.TIMEOUT:y=F.CHANGE_MEDIA_TYPE_TIMEOUT;break}F[y]&&this._receiveMediaTypeChangeResult({transactionId:E,userId:L,mediaType:c},y,t)}r===w.NOTICE&&c===m.AUDIO&&!l&&this._receiveMediaTypeChangeResult({transactionId:E,userId:L,mediaType:c},F.SERVER_ALLOW_MEDIA_TYPE,t)}_onRecvCallEndLog(e,t){const s=de(e);this._reportAppEventModule.onReceivedCallRecord(s,t)}_onSessionClose(e,t,s){const{callId:r}=e,o=this._context.getCurrentId();this._abnormalModule.removeAbnormalCallIds(o,[r]);let E=[this._mainSession,...this._holdSessions].find(l=>l&&l.getCallId()===r);if(!E){this._logger.warn(n.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O,`unexpect session callId -> ${r}`,t);return}this._logger.warn(n.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O,`callId: ${r}`,t),this._mainSession&&this._mainSession.getCallId()===r&&(this._mainSession.getAllTimerIds().forEach(l=>this._stopTimer.bind(this)(l,t)),E.getCallType()===M.SINGLE&&(this._isUpFirstFrameTime=!1),delete this._callStartMap[r]),this.emit(H.__INNER_SESSION_CLOSE__,r,t);const L=E.getUserList().find(l=>l.userId===o);let c;s&&e.toDeviceId!==this._signalModule.getSessionId()&&(c=E.getIsLocalClientHangup()?L.systemState:R.OTHER_CLIENT_HANGUP),this._reportAppEventModule.onCallEnded(new j(E,this,this._logger),c||L.systemState,t),this._removeSession(r)}_removeSession(e){var t;if(e===((t=this._mainSession)==null?void 0:t.getCallId()))this._mainSession=null;else{const s=this._holdSessions.findIndex(r=>(r==null?void 0:r.getCallId())===e);this._holdSessions.splice(s,1)}}async _createSessionByServer(e,t,s=!1){this._logger.info(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_T,`callId: ${e}`,t);const{code:r,data:o}=await this.getCallSession({callId:e},t);if(r!==a.SUCCESS){this._logger.error(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R,`errcode: ${r}`,t);return}this._logger.info(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R,`code: ${r}, data: ${JSON.stringify(o)}`,t);const{callType:E,mediaType:L,callSessionUsers:c,startCallerId:l}=o;this._mainSession=new ae(e,p.CONNECTING,E,L,l,l,[],this._logger),s&&this._clearMobileOnPhone(e,t),this.updateUsersState(e,c,t)}async _clearMobileOnPhone(e,t){const s=[this._mainSession,...this._holdSessions].find(r=>(r==null?void 0:r.getCallId())===e);if(s&&s.getCallType()===M.MULTI){this._logger.info(n.L_CALL_ENGINE_UP_ON_PHONE_END_T,`callId: ${e}`,t);const{code:r}=await this.systemStatusUp({callId:e,sysStatus:R.ON_PHONE_END,forward:Z.CURRENT},t);r===a.SUCCESS?this._logger.info(n.L_CALL_ENGINE_UP_ON_PHONE_END_R,`callId: ${e}`,t):this._logger.warn(n.L_CALL_ENGINE_UP_ON_PHONE_END_R,`callId: ${e}, errCode: ${r}`,t)}}_onUserStateChange(e,t,s){const r=this._context.getCurrentId();t.forEach(o=>{const{userId:E,userState:L,systemState:c}=o;E!==r&&this._reportAppEventModule.onRemoteUserStateChanged({callId:e,userId:E,userState:L,reason:c},s)}),t.forEach(({userId:o,systemState:E})=>{o===r&&E===R.ABNORMAL_END&&this.emit(H.__INNER_SESSION_CLOSE__,e,s)})}_onOtherMemberInvite(e){e.forEach(t=>{var E;const{userId:s,callId:r}=t,o=(E=this.getLocalMainSession())==null?void 0:E.getInviterUserId();this._reportAppEventModule.onRemoteUserInvited([s],o,r)})}_onRequestChangeMediaType(e,t){const{userId:s,transactionId:r,mediaType:o}=e;this._reportAppEventModule.onReceivedChangeMediaTypeRequest(s,r,o,t)}_receiveMediaTypeChangeResult(e,t,s){t===F.SERVER_ALLOW_MEDIA_TYPE&&this.emit(H.__INNER_CHANGE_MEDIA_TYPE__,e.mediaType,s),this._reportAppEventModule.onReceivedChangeMediaTypeResult({...e,code:t},s)}_onCallTypeChange(e,t,s){this._reportAppEventModule.onCallTypeChanged(t,e,s)}};I(H,"__INNER_SESSION_CLOSE__","inner-session-close"),I(H,"__INNER_SESSION_CONNECT__","inner-session-connect"),I(H,"__INNER_CHANGE_MEDIA_TYPE__","inner-change-media-type"),I(H,"__INNER_INVITE__","inner-invite");let W=H;var ee=(_=>(_.NORMAL="RongCloudRTC",_.SCREEN="ScreenShare",_))(ee||{});const G=class G extends S.EventEmitter{constructor(e,t,s,r,o,E){super();I(this,"_rtcClient");I(this,"_localTracks",[]);I(this,"_room",null);I(this,"_callId","");I(this,"_callMediaType");I(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});I(this,"_audioConfig",{});I(this,"_isPubTiny",!1);I(this,"_videoConfigIsChange",!1);I(this,"_audioConfigIsChange",!1);I(this,"_userViewMap",{});I(this,"_callPlusStatusReportListener",null);I(this,"_remoteAudioEnable",!0);this._context=e,this._runtime=t,this._initOpts=s,this._logger=r,this._callEngine=o,this._reportAppEventModule=E,this._rtcClient=s==null?void 0:s.rtcClient,this._isPubTiny=s.isPubTiny||!1}setCallPlusStatusReportListener(e){this._callPlusStatusReportListener=e}async getCameraVideoTrack(e){const t=this.getLocalVideoTrack(),{code:s,track:r}=t&&!this._videoConfigIsChange?{track:t,code:a.SUCCESS}:await this._createVideoTrack(e);return this._videoConfigIsChange=!1,s!==a.SUCCESS?{code:s}:{code:a.SUCCESS,track:r}}async getMicrophoneAudioTrack(e){const t=this.getLocalAudioTrack(),{code:s,track:r}=t&&!this._audioConfigIsChange?{track:t,code:a.SUCCESS}:await this._createAudioTrack(e);return this._audioConfigIsChange=!1,s!==a.SUCCESS?{code:s}:{code:a.SUCCESS,track:r}}async createCallMediaTracks(e,t){this._callMediaType=e;const{code:s}=await this.getMicrophoneAudioTrack(t);if(s!==a.SUCCESS)return{code:s};if(e===m.AUDIO_VIDEO){const{code:r}=await this.getCameraVideoTrack(t);if(r!==a.SUCCESS)return{code:r}}return{code:a.SUCCESS}}setVideoConfig(e){this._videoConfigIsChange=!0,this._videoConfig=e}setAudioConfig(e){this._audioConfigIsChange=!0,this._audioConfig=e}destroyAllTracks(e){this._logger.info(n.L_RTC_MODULE_DESTROY_ALL_TRACKS_O,"",e),this._localTracks.forEach(t=>{t.destroy()}),this._localTracks.length=0}setAllRemoteAudioEnable(e,t){return this._logger.info(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_T,`enable: ${e}`,t),S.isBoolean(e)?(this._remoteAudioEnable=e,this._room?(this._room.getRemoteTracks().filter(r=>r.isAudioTrack()).forEach(r=>{e?r.unmute():r.mute()}),this._logger.info(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R,"success",t),{code:a.SUCCESS}):{code:a.SUCCESS}):(this._logger.error(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R,`param error, enable: type is boolean, value: ${e}`),{code:a.PARAM_ERROR})}async destroyTrack(e){e.destroy();const t=this._localTracks.findIndex(s=>s.getTrackId()===e.getTrackId());this._localTracks.splice(t,1)}async sessionConnected(e,t){var r;if(this._logger.info(n.L_RTC_MODULE_SESSION_CONNECT_T,`callId: ${e}`,t),!this._room){const{code:o,room:E}=await this.joinRTCRoom(e,t);if(o!==a.SUCCESS)return;this._room=E}this._callId=e,this._regRTCListeners();const s=((r=this._room)==null?void 0:r.getRemoteUserIds())||[];if(s.length>0&&this._onOtherMemJoined(s.map(o=>({callId:e,userId:o})),t),this._localTracks.length>0){this.emit(J.onBeforePublish);const o=this._isPubTiny?this._localTracks.map(L=>L.isVideoTrack()?{track:L,isPubTiny:!0}:L):this._localTracks,{code:E}=await this.publish(o,t);this.emit(J.onPublishRes,E)}else this._logger.warn(n.L_RTC_MODULE_SESSION_CONNECT_P,"sessionConnected local tracks is empty",t);this._logger.info(n.L_RTC_MODULE_SESSION_CONNECT_R,`code: ${a.SUCCESS}`,t)}async sessionClose(e,t){var r;this._logger.info(n.L_RTC_MODULE_SESSION_CLOSE_T,`callId: ${e}`,t),this.destroyAllTracks(t);const s=(r=this._room)==null?void 0:r.getRoomId();if(this._room&&e===s){const{code:o}=await this._rtcClient.leaveRoom(this._room);if(this._releaseStoredData(),o!==N.RCRTCCode.SUCCESS){this._logger.error(n.L_RTC_MODULE_SESSION_CLOSE_R,`leaveRoom failed, code: ${o}`,t);return}this._logger.info(n.L_RTC_MODULE_SESSION_CLOSE_R,"leaveRoom success",t)}else this._logger.warn(n.L_RTC_MODULE_SESSION_CLOSE_R,"leaveRoom throw exception: not in room",t)}async disableVideoTrack(){const e=this.getLocalVideoTrack();return e?{code:await e.mute(),track:e}:{code:a.CAMERA_CLOSED}}async enableVideoTrack(e){const t=this.getLocalVideoTrack();return t?t.isOwnerMuted()?{code:await t.unmute()}:{code:a.SUCCESS}:{code:a.CAMERA_CLOSED}}async changeVideoDevice(e){const t=[],s=[],{code:r,track:o}=await this._rtcClient.createCameraVideoTrack(ee.NORMAL,this._videoConfig);if(r!==N.RCRTCCode.SUCCESS)return{code:r};const{minBitrate:E,maxBitrate:L}=this._videoConfig;(E||L)&&o.setBitrate(L,E);let c;if(this._localTracks&&this._localTracks.forEach(l=>{l.isVideoTrack()?(l.destroy(),c=l):s.push(l)}),this._localTracks=this._localTracks.filter(l=>c&&l.getTrackId()!==c.getTrackId()),t.push(o),s.push(o),this._localTracks=s,this._onLocalTrackReady(t,e),this._room){const{code:l}=await this._room.publish(t);if(l!==N.RCRTCCode.SUCCESS)return{code:l}}return{code:a.SUCCESS,track:o}}async disableAudioTrack(){const e=this.getLocalAudioTrack();return e?{code:await e.mute(),track:e}:{code:a.MICROPHONE_CLOSED}}async changeMediaType(e,t){this._logger.info(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_T,`mediaType: ${e}`,t);let s;e===m.AUDIO_VIDEO?s=await this._upgradeMediaType(t):s=await this._downgradeMediaType(t),s.code===a.SUCCESS&&this._logger.info(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,"success",t)}async _upgradeMediaType(e){let t=this.getLocalVideoTrack();if(!t){const{code:o,track:E}=await this._createVideoTrack(e);if(o!==a.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`create video track errCode: ${o}`,e),{code:o};t=E;const{minBitrate:L,maxBitrate:c}=this._videoConfig;(L||c)&&t.setBitrate(c,L)}const s=this._isPubTiny?{track:t,isPubTiny:!0}:t,{code:r}=await this.publish([s],e);return r!==a.SUCCESS&&this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`publish errCode: ${r}`,e),{code:r}}async _downgradeMediaType(e){const t=this.getLocalVideoTrack();if(t){const{code:s}=await this._room.unpublish([t]);if(s!==N.RCRTCCode.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`unpublish errCode: ${s}`,e),{code:s};this.destroyTrack(t)}return{code:a.SUCCESS}}async joinRTCRoom(e,t){this._logger.info(n.L_RTC_MODULE_JOIN_RTC_ROOM_T,`call: ${e}`,t);const{code:s,room:r,tracks:o}=await Q({asyncFn:this._rtcClient.joinRTCRoom.bind(this._rtcClient),fnArgs:[e,void 0,void 0,!1,S.RTCMode.CALL]});return s!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_JOIN_RTC_ROOM_R,`callId: ${e}, errCode: ${s}`,t),this._onRTCMethodFail(R.JOIN_ROOM_ERR,t),{code:s}):(this._logger.info(n.L_RTC_MODULE_JOIN_RTC_ROOM_R,"success",t),this._room=r,this._onSelfJoined({callId:e,userId:this._context.getCurrentId()},t),o!=null&&o.length&&this._onRemoteTrackPublish(o),this._callId=e,{code:a.SUCCESS,room:r,tracks:o})}async subscribeTracks(e,t){if(this._logger.info(n.L_RTC_MODULE_SUBSCRIBE_T,JSON.stringify({params:e.map(r=>{const{track:o,subTiny:E}=r;return{trackId:o.getTrackId(),subTiny:E}})}),t),!this._room)return{code:a.SUCCESS};const{code:s}=await Q({asyncFn:this._room.subscribe.bind(this._room),fnArgs:[e],onError:r=>{}});return s!==N.RCRTCCode.SUCCESS?(this._reportAppEventModule.onFetchRemoteMediaError(e,s),this._onRTCMethodFail(R.SUBSCRIBE_ERR,t),this._logger.error(n.L_RTC_MODULE_SUBSCRIBE_R,`errorCode: ${s}`,t),{code:s}):(this._logger.info(n.L_RTC_MODULE_SUBSCRIBE_R,"success",t),{code:a.SUCCESS})}async unsubscribeTracks(e,t){if(this._logger.info(n.L_RTC_MODULE_UNSUBSCRIBE_T,JSON.stringify({trackIds:e.map(r=>r.getTrackId())}),t),!this._room)return{code:a.SUCCESS};const{code:s}=await this._room.unsubscribe(e);return s!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_UNSUBSCRIBE_R,`errorCode: ${s}`,t),{code:s}):(this._logger.info(n.L_RTC_MODULE_UNSUBSCRIBE_R,"success",t),{code:a.SUCCESS})}_releaseStoredData(){this._room=null,this._remoteAudioEnable=!0,this._userViewMap={}}getRemoteTracks(){const e={};return this._room&&this._room.getRemoteUserIds().forEach(s=>{e[s]=this._room.getRemoteTracksByUserId(s)}),e}getRemoteTrack(e,t){var s;return(s=this._room)==null?void 0:s.getRemoteTracksByUserId(e).find(r=>t===m.AUDIO?r.isAudioTrack():r.isVideoTrack())}_regRTCListeners(){this._room.registerRoomEventListener({onKickOff:(e,t)=>{this._onKickOff(e,this._room.getRoomId(),t),this._releaseStoredData()},onUserJoin:e=>{const t=e.map(r=>({callId:this._callId,userId:r})),s=this._logger.createTraceId();this._onOtherMemJoined(t,s)},onUserLeave:e=>{e.forEach(t=>{delete this._userViewMap[t]})},onTrackPublish:this._onRemoteTrackPublish.bind(this),onTrackUnpublish:this._onTrackUnpublish.bind(this),onTrackReady:e=>{this._onRemoteTrackReady([e])},onVideoMuteChange:e=>{this._onVideoMuteChagne({fromUserId:e.getUserId(),muted:e.isOwnerMuted(),trackId:e.getTrackId()})},onAudioMuteChange:e=>{this._onAudioMuteChange({fromUserId:e.getUserId(),muted:e.isOwnerMuted(),trackId:e.getTrackId()})},onRTCPeerConnectionCloseByException:this._onRTCPeerConnectionCloseByException.bind(this)}),this._room.registerReportListener({onStateReport:this._onRTCStateReport.bind(this)}),this._room.onAudioLevelChange(e=>{this._reportAppEventModule.onUserAudioLevelChanged(e)})}_onLocalTrackReady(e,t){this._reportAppEventModule.onUserMediaAvailable(e,t)}_onRemoteTrackReady(e){this._reportAppEventModule.onUserMediaAvailable(e),this.emit(G.__INNER_RECEIVE_FIRST_FRAME__)}_onKickOff(e,t,s,r){this._logger.info(n.L_RTC_MODULE_RECEIVE_KICK_OFF_O,`roonId: ${t}, byServer: ${e}, state: ${s}, kickExtra: ${JSON.stringify(r)}`);let o=R.CONNECTION_ERR;if(e)if(r)o=r.kickReasonCode;else switch(s){case N.RCKickReason.SERVER_KICK:o=R.KICKED_BY_SERVER;break;case N.RCKickReason.OTHER_KICK:o=R.OTHER_CLIENT_JOINED;break;case N.RCKickReason.IM_DISCONNECTED:o=R.CONNECTION_ERR;break;case N.RCKickReason.IM_LOGOUT:o=R.LOGOUT;break;case N.RCKickReason.OTHER_CLIENT_IM_CONNECTED:o=R.OTHER_CLIENT_LOGIN;break}this.emit(G.__INNER_ON_KICKOFF__,o,t)}_onRTCPeerConnectionCloseByException(){const e=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_PEERCONNECTION_EXCEPT_CLOSE_O,"",e),this.emit(G.__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__,e)}async _onSelfJoined(e,t){this.emit(G.__INNER_ON_SELF_JOINED__,e.callId,t)}_onRemoteTrackPublish(e){const t=this._logger.createTraceId();this._onDeviceEnableChange(e,t),this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_PUBLISH_O,JSON.stringify({callId:this._callId,trackIds:e.map(r=>r.getTrackId())}),t);const s=[];e.forEach(r=>{var E;const o=r.getUserId();if(r.isAudioTrack())s.push({track:r,subTiny:!1}),this._reportAppEventModule.onRemoteMicrophoneStateChanged(this._callId,r);else if((E=this._userViewMap[o])!=null&&E.videoView){this._reportAppEventModule.onRemoteCameraStateChanged(this._callId,r);const{isTiny:L}=this._userViewMap[o];s.push({track:r,subTiny:L})}}),s.length&&this.subscribeTracks(s,t)}async _onTrackUnpublish(e){const t=this._logger.createTraceId();this._onDeviceEnableChange(e,t),this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_UNPUBLISH_O,JSON.stringify({callId:this._callId,trackIds:e.map(s=>s.getTrackId())}),t),await this.unsubscribeTracks(e,t)}_onAudioMuteChange(e){const t=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O,JSON.stringify({info:e}),t);const s=this._room.getRemoteTrack(e.trackId);this._onDeviceEnableChange([s],t),this._reportAppEventModule.onRemoteMicrophoneStateChanged(this._callId,s)}_onVideoMuteChagne(e){const t=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O,JSON.stringify({info:e}),t);const s=this._room.getRemoteTrack(e.trackId);this._onDeviceEnableChange([s],t),this._reportAppEventModule.onRemoteCameraStateChanged(this._callId,s)}_onRTCStateReport(e){const{senders:t,receivers:s}=e;t.forEach(r=>{var c;const{kind:o,packetsLostRate:E,rtt:L}=r;this._callMediaType===m.AUDIO_VIDEO&&o==="audio"||(c=this._callPlusStatusReportListener)==null||c.onSendPacketLoss(E||0,L||0)}),s.forEach(r=>{var C;const{trackId:o,kind:E,packetsLostRate:L,bitrate:c}=r;if(this._callMediaType===m.AUDIO_VIDEO&&E==="audio")return;const{userId:l}=N.helper.parseTrackId(o),T={};L&&(T[l]={packetLostRate:L,bitRate:c},(C=this._callPlusStatusReportListener)==null||C.onReceivePacketLoss(T))})}_onRTCMethodFail(e,t){this.emit(G.__INNER_RTC_PROCESS_FAILED__,e,t)}_onOtherMemJoined(e,t){this.emit(G.__INNER_ON_OTHER_JOINED__,e,t)}_onDeviceEnableChange(e,t){this.emit(G.__INNER_ON_DEVICE_ENABLE_CHANGE__,e,t)}async _createAudioTrack(e){var E;if(this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_T,"",e),(E=this._localTracks)!=null&&E.some(L=>L.isAudioTrack()))return this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,"success",e),{code:a.SUCCESS};const{code:t,track:s}=await this._rtcClient.createMicrophoneAudioTrack(ee.NORMAL,this._audioConfig);if(t!==N.RCRTCCode.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,`errCode: ${t}`,e),{code:t};this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,"success",e);const{minBitrate:r,maxBitrate:o}=this._audioConfig;return(r||o)&&s.setBitrate(o,r),this._localTracks.push(s),this._onLocalTrackReady([s],e),{code:a.SUCCESS,track:s}}async _createVideoTrack(e){var E;if(this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_T,"",e),(E=this._localTracks)!=null&&E.some(L=>L.isVideoTrack()&&!L.isDestroyed()))return this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,"success",e),{code:a.SUCCESS};const{code:t,track:s}=await this._rtcClient.createCameraVideoTrack(ee.NORMAL,this._videoConfig);if(t!==N.RCRTCCode.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,`errCode: ${t}`,e),{code:t};this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,"success",e);const{minBitrate:r,maxBitrate:o}=this._videoConfig;return(r||o)&&s.setBitrate(o,r),this._localTracks.push(s),this._onLocalTrackReady([s],e),{code:a.SUCCESS,track:s}}getLocalVideoTrack(){let e;return this._localTracks&&([e]=this._localTracks.filter(t=>t.isVideoTrack())),e}getLocalAudioTrack(){let e;return this._localTracks&&([e]=this._localTracks.filter(t=>t.isAudioTrack())),e}async publish(e,t){this._logger.info(n.L_RTC_MODULE_PUBLISH_T,`tracksIds: ${e.map(r=>r instanceof N.RCLocalTrack?r.getTrackId():r.track.getTrackId())}`,t);const{code:s}=await Q({asyncFn:this._room.publish.bind(this._room),fnArgs:[e],onError:r=>{}});return s!==N.RCRTCCode.SUCCESS?(this._onRTCMethodFail(R.PUBLISH_ERR,t),this._logger.error(n.L_RTC_MODULE_PUBLISH_R,`errCode: ${s}`,t),{code:s}):(this._logger.info(n.L_RTC_MODULE_PUBLISH_R,`code: ${a.SUCCESS}`,t),{code:a.SUCCESS})}publishVideoTrack(){const e=this.getLocalVideoTrack(),t=this._isPubTiny?{track:e,isPubTiny:!0}:e;return this._room.publish([t])}setVideoView(e,t){const s=[];e.forEach(r=>{const{userId:o,videoElement:E,isTiny:L=!1}=r;if(this._userViewMap[o]={videoView:E,isTiny:L},o===this._context.getCurrentId()||!this._room)return;const l=(this.getRemoteTracks()[o]||[]).map(T=>({track:T,subTiny:L})).filter(({track:T})=>!T.isSubscribed());s.push(...l)}),this._logger.info(n.L_RTC_MODULE_SET_VIDEO_VIEW_O,JSON.stringify({userViewMap:Ae(this._userViewMap),needSubTrackIds:s.map(({track:r})=>r.getTrackId())}),t),s.length&&this.subscribeTracks(s,t)}removeVideoView(e,t){const s=[];e.forEach(r=>{const o=this.getRemoteTracks()[r];if(o&&o.length){const E=o.filter(L=>L.isVideoTrack());E.length&&s.push(E[0])}delete this._userViewMap[r]}),this._logger.info(n.L_RTC_MODULE_REMOVE_VIDEO_VIEW_O,JSON.stringify({userViewMap:Ae(this._userViewMap),unsubTracks:s.map(r=>r.getTrackId())}),t),s.length&&this.unsubscribeTracks(s,t)}getUserViewMap(){return this._userViewMap}async playMedia(e,t,s,r){this._logger.info(n.L_RTC_MODULE_PLAY_MEDIA_T,`userId: ${e}, mediaType: ${t}, videoView: ${s==null?void 0:s.nodeName}`,r);let o=null;if(e===this._context.getCurrentId()?o=t===m.AUDIO?this.getLocalAudioTrack():this.getLocalVideoTrack():o=this.getRemoteTracks()[e].filter(E=>t===m.AUDIO?E.isAudioTrack():E.isVideoTrack())[0],!o)return this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`error code: ${a.MEDIA_RESOURCE_INVALIED}`,r),{code:a.MEDIA_RESOURCE_INVALIED};try{const{code:E}=o.isAudioTrack()?await o.play():await o.play(s);return o.isAudioTrack()&&!this._remoteAudioEnable&&o.mute(),E!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`errCode: ${E}`,r),{code:E}):(this._logger.info(n.L_RTC_MODULE_PLAY_MEDIA_R,"success",r),{code:a.SUCCESS})}catch(E){return this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`errCode: ${a.PLAY_MEDIA_FAILED}, message: ${E.message},`,r),{code:a.PLAY_MEDIA_FAILED}}}};I(G,"__INNER_RTC_PROCESS_FAILED__","inner-rtc-process-failed"),I(G,"__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__","inner-rtc-peerconnection-abnormal-close"),I(G,"__INNER_ON_SELF_JOINED__","inner-on-self-joined"),I(G,"__INNER_ON_OTHER_JOINED__","inner-on-other-joined"),I(G,"__INNER_RECEIVE_FIRST_FRAME__","inner-receive-first-frame"),I(G,"__INNER_ON_KICKOFF__","inner-kickoff-frame"),I(G,"__INNER_ON_DEVICE_ENABLE_CHANGE__","inner-on-device-enable-change");let k=G;class Ke{constructor(i){I(this,"_listener");this._logger=i}registerEventListener(i){this._listener=i}async _callAppListener(i,...e){var s;const t=(s=this._listener)==null?void 0:s[i];if(t)try{await t(...e)}catch(r){this._logger.error(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({name:r.name,message:r.message}))}}onReceivedCall(i,e,t){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCall",callId:i.getCallId()}),e),this._callAppListener("onReceivedCall",i,t)}onRemoteUserInvited(i,e,t){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteUserInvited",inviteeUserList:i,inviterUserId:e,callId:t})),this._callAppListener("onRemoteUserInvited",i,e,t)}onCallConnected(i){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallConnected",callId:i.getCallId()})),this._callAppListener("onCallConnected",i)}onCallTypeChanged(i,e,t){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallTypeChanged",callId:e,callType:i}),t),this._callAppListener("onCallTypeChanged",i,e)}onRemoteUserStateChanged(i,e){const{callId:t,userId:s,userState:r,reason:o}=i;this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteUserStateChanged",callId:t,userId:s,userState:r,reason:o}),e),this._callAppListener("onRemoteUserStateChanged",t,s,r,o)}onCallEnded(i,e,t){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallEnded",callId:i.getCallId(),closeReason:e}),t),this._callAppListener("onCallEnded",i,e)}onRemoteCameraStateChanged(i,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteCameraStateChanged",callId:i,trackId:e==null?void 0:e.getTrackId(),enable:e==null?void 0:e.isOwnerMuted()}));const t=e==null?void 0:e.getUserId();this._callAppListener("onRemoteCameraStateChanged",i,t,e==null?void 0:e.isOwnerMuted())}onRemoteMicrophoneStateChanged(i,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteMicrophoneStateChanged",callId:i,trackId:e==null?void 0:e.getTrackId(),enable:e==null?void 0:e.isOwnerMuted()}));const t=e==null?void 0:e.getUserId();this._callAppListener("onRemoteMicrophoneStateChanged",i,t,e==null?void 0:e.isOwnerMuted())}onReceivedCallRecord(i,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallRecord",record:i}),e),this._callAppListener("onReceivedCallRecord",i)}onReceivedChangeMediaTypeRequest(i,e,t,s){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedChangeMediaTypeRequest",userId:i,transactionId:e}),s),this._callAppListener("onReceivedChangeMediaTypeRequest",i,e,t)}onReceivedChangeMediaTypeResult(i,e){const{userId:t,transactionId:s,mediaType:r,code:o}=i;this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedChangeMediaTypeResult",userId:t,mediaType:r}),e),this._callAppListener("onReceivedChangeMediaTypeResult",{userId:t,transactionId:s,mediaType:r,code:o})}onReceivedCallStartTime(i,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallStartTime",info:i}),e),this._callAppListener("onReceivedCallStartTime",i)}onReceivedCallFirstFrameTime(i,e,t){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallFirstFrameTime",callId:i,callFirstFrameTime:e}),t),this._callAppListener("onReceivedCallFirstFrameTime",i,e)}onUserMediaAvailable(i,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onUserMediaAvailable",trackIds:i.map(t=>t.getTrackId())}),e),i.forEach(t=>{const s=t.getUserId(),r=t.isAudioTrack()?m.AUDIO:m.VIDEO;this._callAppListener("onUserMediaAvailable",s,r)})}onFetchRemoteMediaError(i,e){i.forEach(({track:t})=>{const s=t.getUserId();this._callAppListener("onFetchRemoteMediaError",s,e)})}onUserAudioLevelChanged(i){i.forEach(({track:e,audioLevel:t})=>{const s=e.getUserId();this._callAppListener("onUserAudioLevelChanged",s,t)})}}var Oe=(_=>(_[_.UNKNOW_ERR=41e3]="UNKNOW_ERR",_[_.DB_ERR=41001]="DB_ERR",_[_.JSON_ERR=41002]="JSON_ERR",_[_.INVALID_JSON_ERR=41003]="INVALID_JSON_ERR",_[_.MISSING_PARAMS=41004]="MISSING_PARAMS",_[_.PARAMS_REQUIRED=41005]="PARAMS_REQUIRED",_[_.DATA_FORMAT_ERR=41006]="DATA_FORMAT_ERR",_[_.METHOD_NOT_IMPLEMENTED=41007]="METHOD_NOT_IMPLEMENTED",_[_.CALL_NOT_EXIST=41010]="CALL_NOT_EXIST",_[_.SINGAL_EXCEED_TWO_INVITEE=41011]="SINGAL_EXCEED_TWO_INVITEE",_[_.GROUP_EXCEEDS_QUORUM=41012]="GROUP_EXCEEDS_QUORUM",_[_.OPERATION_EXPIRED=41013]="OPERATION_EXPIRED",_[_.DEVICE_IS_CALLING=41014]="DEVICE_IS_CALLING",_[_.REPORT_STREAM_READY_TIME_IS_INVALID=41018]="REPORT_STREAM_READY_TIME_IS_INVALID",_[_.NOT_CALL_YOURSELF=41019]="NOT_CALL_YOURSELF",_[_.SESSION_STATUS_NOT_EXIST=41020]="SESSION_STATUS_NOT_EXIST",_[_.HANGUP_NOT_ALLOW=41021]="HANGUP_NOT_ALLOW",_[_.ACCEPT_NOT_ALLOW=41022]="ACCEPT_NOT_ALLOW",_[_.OPERATION_NOT_ALLOW=41025]="OPERATION_NOT_ALLOW",_[_.TRANSACTION_ID_ERR=41100]="TRANSACTION_ID_ERR",_[_.UP_VIDEO_CANCELED=41050]="UP_VIDEO_CANCELED",_[_.CURRENT_CALL_IS_AUDIO=41051]="CURRENT_CALL_IS_AUDIO",_[_.CURRENT_CALL_IS_VIDEO=41052]="CURRENT_CALL_IS_VIDEO",_))(Oe||{});class ue{constructor(i){I(this,"_androidPushConfig",{});this._logger=i}setChannelIdMi(i){return S.isString(i)?(this._androidPushConfig.channelIdMi=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: channelIdMi type is string, value: ${i}`),this)}setMiLargeIconUrl(i){return S.isString(i)?(this._androidPushConfig.miLargeIconUrl=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: miLargeIconUrl type is string, value: ${i}`),this)}setChannelIdHW(i){return S.isString(i)?(this._androidPushConfig.channelIdHW=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: channelIdHW type is string, value: ${i}`),this)}setCategoryHW(i){return S.isString(i)?(this._androidPushConfig.categoryHW=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: categoryHW type is string, value: ${i}`),this)}setImportanceHW(i){return i!=="LOW"&&i!=="NORMAL"?(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: importanceHW value is NORMAL|LOW, value: ${i}`),this):(this._androidPushConfig.importanceHW=i,this)}setImageUrlHW(i){return S.isString(i)?(this._androidPushConfig.imageUrlHW=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: imageUrlHW type is string, value: ${i}`),this)}setChannelIdOPPO(i){return S.isString(i)?(this._androidPushConfig.channelIdOPPO=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: channelIdOPPO type is string, value: ${i}`),this)}setTypeVivo(i){return S.isString(i)?(this._androidPushConfig.typeVivo=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: typeVivo type is string, value: ${i}`),this)}setCategoryVivo(i){return S.isString(i)?(this._androidPushConfig.categoryVivo=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: categoryVivo type is string, value: ${i}`),this)}setFcmChannelId(i){return S.isString(i)?(this._androidPushConfig.fcmChannelId=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: fcmChannelId type is string, value: ${i}`),this)}setFcmCollapseKey(i){return S.isString(i)?(this._androidPushConfig.fcmCollapseKey=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: fcmCollapseKey type is string, value: ${i}`),this)}setFcmImageUrl(i){return S.isString(i)?(this._androidPushConfig.fcmImageUrl=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: fcmImageUrl type is string, value: ${i}`),this)}setimportanceHonor(i){return i!=="LOW"&&i!=="NORMAL"?(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: importanceHonor value is NORMAL|LOW, value: ${i}`),this):(this._androidPushConfig.importanceHonor=i,this)}setimageUrlHonor(i){return S.isString(i)?(this._androidPushConfig.imageUrlHonor=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: imageUrlHonor type is string, value: ${i}`),this)}build(){return this._androidPushConfig}}const ge=128*1024;class Ue{constructor(i,e,t,s){I(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});I(this,"_audioConfig",{});I(this,"_callPlusStatistics");I(this,"_clientCallId","");I(this,"_isLaunchHangup",!1);I(this,"_needHangupCallId",null);I(this,"_callEngine");I(this,"_rtcModule");I(this,"_reportAppEventModule");this._context=i,this._logger=e,this._runtime=t,this._initOpts=s,this._reportAppEventModule=new Ke(e),this._callPlusStatistics=new be(this._logger,this._context),this._callEngine=new W(this._context,this._runtime,this._initOpts,this._logger,this._reportAppEventModule),this._rtcModule=new k(this._context,this._runtime,this._initOpts,this._logger,this._callEngine,this._reportAppEventModule),this._rtcModule.on(k.__INNER_RTC_PROCESS_FAILED__,this._rtcProcessFailHandle.bind(this)),this._rtcModule.on(k.__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__,this._peerConnectionAbnormalClose.bind(this)),this._rtcModule.on(k.__INNER_ON_SELF_JOINED__,this._selfJoinedHandle.bind(this)),this._rtcModule.on(k.__INNER_ON_OTHER_JOINED__,this._otherJoinedHandle.bind(this)),this._rtcModule.on(k.__INNER_RECEIVE_FIRST_FRAME__,this._receiveFirstFrameHandle.bind(this)),this._rtcModule.on(k.__INNER_ON_KICKOFF__,this._kickoffHandle.bind(this)),this._rtcModule.on(k.__INNER_ON_DEVICE_ENABLE_CHANGE__,this._receiveDeviceEnableChangeHandle.bind(this)),this._callEngine.on(W.__INNER_SESSION_CONNECT__,this._rtcModule.sessionConnected.bind(this._rtcModule)),this._callEngine.on(W.__INNER_SESSION_CLOSE__,this._sessionCloseHandle.bind(this)),this._callEngine.on(W.__INNER_CHANGE_MEDIA_TYPE__,this._rtcModule.changeMediaType.bind(this._rtcModule)),this._callEngine.on(W.__INNER_INVITE__,(r,o)=>{this._callPlusStatistics.reportStatisticsData(x.L_QS_RECEIVE_CALL_S,a.SUCCESS,+new Date,r,"",o)})}_rtcProcessFailHandle(i,e){const t=this._callEngine.getLocalMainSession();if(t){const s=t.getCallId();this._callEngine.systemStatusUp({callId:s,sysStatus:i,forward:Z.CURRENT},e),this._callPlusStatistics.reportStatisticsData(x.L_QS_ABNORMAL_HANGUP_S,a.SUCCESS,+new Date,t),this.__innerHangup({callId:s,systemState:i},e)}}_peerConnectionAbnormalClose(i){const e=this._callEngine.getLocalMainSession();e&&(this._callEngine.systemStatusUp({callId:e.getCallId(),sysStatus:R.CONNECTION_ERR,forward:Z.CURRENT},i),this._callEngine.endCurrentSession(R.CONNECTION_ERR,e.getCallId(),i))}async _selfJoinedHandle(i,e){const t=this._context.getCurrentId(),s=this._callEngine.getLocalMainSession();this._reportAppEventModule.onCallConnected(s);const r=this._rtcModule.getLocalVideoTrack(),o=this._rtcModule.getLocalAudioTrack(),E=r?!r.isOwnerMuted():!1,L=o?!o.isOwnerMuted():!1;this._callEngine.setUserDeviceEnable(t,m.VIDEO,E,e),this._callEngine.setUserDeviceEnable(t,m.AUDIO,L,e);const c=[{userId:t,userState:A.ONCALL,systemState:R.ONCALL,cameraEnable:E,microphoneEnable:L}];this._callEngine.updateUsersState(i,c,e),this._callEngine.startTimeCorrection(e)}_otherJoinedHandle(i,e){var r;let t="";const s=i.map(o=>(t=o.callId,{userId:o.userId,userState:A.ONCALL,systemState:R.ONCALL,cameraEnable:!1,microphoneEnable:!1}));this._callEngine.updateUsersState(t,s,e),((r=this._callEngine.getLocalMainSession())==null?void 0:r.getState())!==p.ONCALL&&this._callEngine.updateMainSessionState(p.ONCALL)}_receiveFirstFrameHandle(i){var e;((e=this._callEngine.getLocalMainSession())==null?void 0:e.getState())!==p.ONCALL&&this._callEngine.updateMainSessionState(p.ONCALL),this._callEngine.upFirstFrameTime(i)}_kickoffHandle(i,e,t){if(i===R.CONNECTION_ERR){this._callEngine.endCurrentSession(i,e,t);return}const s=this._callEngine.getLocalMainSession();if(s){const r=s.getCallId();this._callPlusStatistics.reportStatisticsData(x.L_QS_ABNORMAL_HANGUP_S,a.SUCCESS,+new Date,s,this._clientCallId),this._callEngine.systemStatusUp({callId:r,sysStatus:i,forward:Z.CURRENT},t),this._callEngine.endCurrentSession(i,e,t)}}_receiveDeviceEnableChangeHandle(i,e){i.forEach(t=>{const s=t.getUserId(),r=t.isAudioTrack()?m.AUDIO:m.VIDEO;this._callEngine.setUserDeviceEnable(s,r,!t.isOwnerMuted(),e)})}_sessionCloseHandle(i,e){this._isLaunchHangup||(this._clientCallId=""),this._isLaunchHangup=!1,this._rtcModule.sessionClose(i,e)}setCallPlusEventListener(i){this._logger.info(n.L_CALLPLUS_CLIENT_SET_EVENT_LISTENER_O,i?Object.keys(i).join(","):null),this._reportAppEventModule.registerEventListener(i)}setStatusReportListener(i){this._logger.info(n.L_CALLPLUS_CLIENT_SET_STATUS_REPORT_LISTENER_O,i?Object.keys(i).join(","):null),this._rtcModule.setCallPlusStatusReportListener(i)}setVideoView(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_T,JSON.stringify({list:i.map(t=>{const{userId:s,videoElement:r,isTiny:o}=t;return{userId:s,elementName:r==null?void 0:r.nodeName,isTiny:o}})}),e),!S.notEmptyArray(i))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, list: not empty array, value: ${JSON.stringify(i)}`,e),{code:a.PARAM_ERROR};for(const t of i){const{userId:s,videoElement:r}=t;if(!S.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, userId: not empty string, value: ${s}`,e),{code:a.PARAM_ERROR};if(!fe(r))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, videoElement: need a video element, value: ${r instanceof HTMLElement?r.nodeName:r}`,e),{code:a.PARAM_ERROR}}return this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,"succes",e),this._rtcModule.setVideoView(i,e),{code:a.SUCCESS}}removeVideoView(i){const e=this._logger.createTraceId();return this._logger.info(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_T,JSON.stringify({userIds:i}),e),S.notEmptyArray(i)&&i.every(t=>S.notEmptyString(t))?(this._logger.info(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R,"succes",e),this._rtcModule.removeVideoView(i,e),{code:a.SUCCESS}):(this._logger.error(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(i)}`,e),{code:a.PARAM_ERROR})}async playMedia(i,e){const t=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_T,JSON.stringify({userId:i,mediaType:e}),t),!S.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`params err, userId: not empty string, value: ${i}`,t),{code:a.PARAM_ERROR};if(S.isUndefined(m[e]))return this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`params err, mediaType is illegal, value: ${e}`,t),{code:a.PARAM_ERROR};if(e===m.AUDIO&&i===this._context.getCurrentId())return this._logger.info(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,"success",t),{code:a.SUCCESS};const{videoView:s}=this._rtcModule.getUserViewMap()[i]||{};return e!==m.AUDIO&&!s?(this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`errCode: ${a.VIDEO_VIEW_NOT_SET}, video view not set`,t),{code:a.VIDEO_VIEW_NOT_SET}):this._rtcModule.playMedia(i,e,s,t)}createVideoConfigBuilder(){return new Ce(this._logger)}setVideoConfig(i){this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_T,JSON.stringify(i));const{frameRate:e,resolution:t,maxBitrate:s,minBitrate:r}=i;if(!N.RCFrameRate[e])return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,`param error, frameRate is illegal, value: ${e}`),{code:a.PARAM_ERROR};if(!N.RCResolution[t])return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,`param error, resolution is illegal, value: ${t}`),{code:a.PARAM_ERROR};const{code:o,errorMsg:E}=he(r,s);return o!==a.SUCCESS&&this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,E),this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,"success"),this._videoConfig={...i},this._rtcModule.setVideoConfig(this._videoConfig),{code:a.SUCCESS}}createAudioConfigBuilder(){return new Ie(this._logger)}createAndroidPushConfigBuilder(){return new ue(this._logger)}setAudioConfig(i){this._logger.info(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_T,JSON.stringify(i));const{sampleRate:e,minBitrate:t,maxBitrate:s}=i;if(e&&!S.isNumber(e))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,`param error, sampleRate: type is number, value: ${e}`),{code:a.PARAM_ERROR};const{code:r,errorMsg:o}=he(t,s);return r!==a.SUCCESS&&this._logger.error(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,o),this._logger.info(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,"success"),this._audioConfig={...i},this._rtcModule.setAudioConfig(this._audioConfig),{code:a.SUCCESS}}async startCall(i,e=M.SINGLE,t=m.AUDIO_VIDEO,s,r){this._clientCallId=S.getUUID();const o=+new Date,E=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_T,`userIds: ${i.join(",")}, callType: ${e}, mediaType: ${t}, pushConfig: ${s}, extra: ${r}`,E),this._context.getConnectionStatus()!==S.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.SIGNAL_DISCONNECTED}`,E),{code:a.SIGNAL_DISCONNECTED};const L=this._context.getNaviInfo();if(!L||!ie(L))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.RTC_SERVICE_UNAVAILABLE}`,E),{code:a.RTC_SERVICE_UNAVAILABLE};if(!(S.notEmptyArray(i)&&i.every(h=>S.notEmptyString(h))))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(i)}`,E),{code:a.PARAM_ERROR};if(S.isUndefined(M[e]))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, callType is illegal, value: ${e}`,E),{code:a.PARAM_ERROR};if(S.isUndefined(m[t]))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, mediaType is illegal, value: ${t}`,E),{code:a.PARAM_ERROR};if(s){const h=re(s);if(h.code!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, pushConfig is illegal, msg: ${h.errorMsg}`,E),{code:a.PARAM_ERROR}}if(r){if(!S.isString(r))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, extra is illegal, value: ${r}`,E),{code:a.PARAM_ERROR};if(Ne(r)>ge)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,"params err, extra max size is 128KB",E),{code:a.PARAM_ERROR}}if(i.length>1&&e===M.SINGLE)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, You can only call one person in a single call, userIds: ${i.join(",")}`,E),{code:a.PARAM_ERROR};if(this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${a.SESSION_EXIST}, session exist`,E),{code:a.SESSION_EXIST};const{code:c}=await this._rtcModule.createCallMediaTracks(t,E);if(c!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`create meida tracks error code: ${c}`,E),{code:c};const{code:l,data:T}=await this._callEngine.startCall({toUsers:i.map(h=>({userId:h})),callType:e,mediaType:t,callId:this._clientCallId,pushConfig:s,extra:JSON.stringify({userId:this._context.getCurrentId(),extra:r})},E);if(this._callPlusStatistics.reportStatisticsData(x.L_QS_START_CALL_S,l,o,null,this._clientCallId,null,{mediaType:t,callType:e,callId:(T==null?void 0:T.callId)||""}),l!==a.SUCCESS)return this._rtcModule.destroyAllTracks(E),this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`signal error code: ${l}`,E),{code:l};const{callId:C,clientCallId:d}=T;return this._needHangupCallId===d?(this._callEngine.clearAllTimer(C,E),this._callEngine.hangup({callId:C},E),this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_R,`the ${C} call has been hangup`,E),{code:a.SUCCESS}):(e===M.MULTI&&await this._rtcModule.sessionConnected(C,E),this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_R,JSON.stringify({data:T,code:l}),E),{code:a.SUCCESS,callId:C})}async joinMultiCall(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_T,`callId: ${i}`,e),this._context.getConnectionStatus()!==S.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.SIGNAL_DISCONNECTED}`,e),{code:a.SIGNAL_DISCONNECTED};const t=this._context.getNaviInfo();if(!t||!ie(t))return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.RTC_SERVICE_UNAVAILABLE}`,e),{code:a.RTC_SERVICE_UNAVAILABLE};if(!S.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`params err, callId: not empty string, value: ${i}`,e),{code:a.PARAM_ERROR};const{code:s,data:r}=await this._callEngine.getCallSession({callId:i},e);if(s!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`get call data error, code: ${s}`,e),{code:s};const{mediaType:o}=r,E=this._callEngine.getLocalMainSession();if(E&&E.getCallId()!==i)return{code:a.SESSION_EXIST};const{code:L}=await this._rtcModule.createCallMediaTracks(o,e);if(L!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`create meida tracks error code: ${L}`,e),{code:L};const{code:c}=await this._callEngine.joinCall({callId:i,mediaType:o},e);return c!==a.SUCCESS?(this._rtcModule.destroyAllTracks(e),this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`signal error code: ${c}`,e),{code:c}):(this._logger.info(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${a.SUCCESS}`,e),await this._rtcModule.sessionConnected(i,e),{code:a.SUCCESS})}async invite(i,e,t){var L;const s=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_INVITE_T,`callId: ${i.join(",")}, pushConfig: ${e}, extra: ${t}`,s),!(S.notEmptyArray(i)&&i.every(c=>S.notEmptyString(c))))return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(i)}`,s),{code:a.PARAM_ERROR};if(e){const c=re(e);if(c.code!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`params err, pushConfig is illegal, msg: ${c.errorMsg}`,s),{code:a.PARAM_ERROR}}if(t){if(!S.isString(t))return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`params err, extra is illegal, value: ${t}`,s),{code:a.PARAM_ERROR};if(Ne(t)>ge)return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,"params err, extra max size is 128KB",s),{code:a.PARAM_ERROR}}const{code:r,data:o}=await this._callEngine.invite({toUsers:i.map(c=>({userId:c})),pushConfig:e,extra:JSON.stringify({userId:this._context.getCurrentId(),extra:t})},s);if(r!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`signal error code: ${r}`,s),{code:r};const E=[];return(L=o.busylineUsers)!=null&&L.length&&E.push(...o.busylineUsers.map(c=>({userId:c.userId,state:c.sessionStatus}))),this._logger.info(n.L_CALLPLUS_CLIENT_INVITE_R,`success busyUsers: ${JSON.stringify(E)}`,s),{code:a.SUCCESS,busyUsers:E}}async accept(i){const e=+new Date,t=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_ACCEPT_T,`callId: ${i}`,t),this._context.getConnectionStatus()!==S.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode: ${a.SIGNAL_DISCONNECTED}`,t),{code:a.SIGNAL_DISCONNECTED};const s=this._context.getNaviInfo();if(!s||!ie(s))return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode: ${a.RTC_SERVICE_UNAVAILABLE}`,t),{code:a.RTC_SERVICE_UNAVAILABLE};if(!S.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`params err, callId: not empty string, value: ${i}`,t),{code:a.PARAM_ERROR};const r=this._callEngine.getLocalMainSession(),o=this._callEngine.getHoldSession(i);if(!r&&!o)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode : ${a.NOT_IN_CALL}, session not exist`,t),{code:a.NOT_IN_CALL};if(i===(o==null?void 0:o.getCallId())){const{code:T}=await this.hangup(r.getCallId());if(T!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`hangup mainSession error code: ${T}`,t),{code:T};this._callEngine.upgradeMainSession(i)}const L=r.getMediaType(),{code:c}=await this._rtcModule.createCallMediaTracks(L,t);if(c!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`create meida tracks error code: ${c}`,t),{code:c};const{code:l}=await this._callEngine.accept({callId:i},t);return this._callPlusStatistics.reportStatisticsData(x.L_QS_ACCEPT_CALL_S,l,e,r),l!==a.SUCCESS?(this._rtcModule.destroyAllTracks(t),this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`signal error code: ${l}`,t),{code:l}):(this._logger.info(n.L_CALLPLUS_CLIENT_ACCEPT_R,"success",t),this._rtcModule.sessionConnected(i,t),{code:a.SUCCESS})}async __innerHangup(i,e){var r;const{callId:t}=i;this._callEngine.setIsLocalClientHangup(!0),this._callEngine.clearAllTimer(t,e);const{code:s}=await this._callEngine.hangup(i,e);return s===Oe.CALL_NOT_EXIST?{code:a.SUCCESS}:(s===a.SUCCESS&&t===((r=this._callEngine.getLocalMainSession())==null?void 0:r.getCallId())&&await this._rtcModule.sessionClose(t,e),{code:s})}async hangup(i,e){const t=+new Date,s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_HANGUP_T,`callId: ${i}, pushConfig: ${e}`,s);const r=this._callEngine.getLocalMainSession();if(!r)return{code:a.NOT_IN_CALL};if(i&&!S.isString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, callId: type is string, value: ${i}`,s),{code:a.PARAM_ERROR};if(e){const h=re(e);if(h.code!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, pushConfig is illegal, msg: ${h.errorMsg}`,s),{code:a.PARAM_ERROR}}const o=r.getCallId();if(i&&i!==o&&!this._callEngine.getHoldSession(i))return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, callId is invalid, value: ${i}`,s),{code:a.CALL_ID_INVALID};this._isLaunchHangup=!0,this._needHangupCallId=i||o;const L=this._callEngine.getHoldSession(this._needHangupCallId)||r,c=this._context.getCurrentId(),l=r.getUserList().filter(h=>h.userId===c)[0].state,T=[r.getCreatorUserId(),r.getInviterUserId()].includes(c),C=De(l,T),{code:d}=await this.__innerHangup({callId:this._needHangupCallId,systemState:C,pushConfig:e},s);return this._callPlusStatistics.reportStatisticsData(x.L_QS_HANGUP_CALL_S,d,t,L,this._clientCallId),d!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`signal error code : ${d}`,s),{code:d}):(this._needHangupCallId=null,this._logger.info(n.L_CALLPLUS_CLIENT_HANGUP_R,"success",s),{code:a.SUCCESS})}async requestChangeMediaType(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_T,`mediaType: ${i}`,e),S.isUndefined(m[i]))return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`params err, mediaType is illegal, value: ${i}`,e),{code:a.PARAM_ERROR};const t=this.getCurrentCallSession(),s=t==null?void 0:t.getMediaType();if(i===s)return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`error code: ${a.MEDIATYPE_INVALID}`,e),{code:a.MEDIATYPE_INVALID};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,e),{code:a.NOT_IN_CALL};const r=t==null?void 0:t.getUserList().filter(L=>L.userId!==this._context.getCurrentId()).map(L=>L.userId),{code:o,data:E}=await this._callEngine.requestChangeMediaType({mediaType:i,toUserIds:r||[]},e);return o!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`signal error code: ${o}`,e),{code:o}):(this._logger.info(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`success transactionId: ${E.transactionId}`,e),{code:a.SUCCESS,transactionId:E.transactionId})}async cancelChangeMediaType(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_T,`transactionId: ${i}`,e),!S.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`param error, transactionId: not empty string, value: ${i}`,e),{code:a.PARAM_ERROR};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,e),{code:a.NOT_IN_CALL};const{code:t}=await this._callEngine.cancelChangeMediaType({transactionId:i},e);return t!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`signal error code: ${t}`,e),{code:t}):(this._logger.info(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,"success",e),{code:a.SUCCESS})}async replyChangeMediaType(i,e){const t=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_T,`transactionId: ${i}`,t),!S.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`param error, transactionId: not empty string, value: ${i}`,t),{code:a.PARAM_ERROR};if(!S.isBoolean(e))return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`param error, isAgree: type is boolean, value: ${e}`,t),{code:a.PARAM_ERROR};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`error code : ${a.NOT_IN_CALL}, session not exist`,t),{code:a.NOT_IN_CALL};const{code:s}=await this._callEngine.responseChangeMediaType({transactionId:i,agree:e},t);return s!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`signal error: ${s}`,t),{code:s}):(this._logger.info(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,"success",t),{code:a.SUCCESS})}getCurrentCallSession(){return this._callEngine.getLocalMainSession()}async getAvailableCallRecordsFromServer(){const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_T,"",i);const{code:e,data:t}=await this._callEngine.getOpenCallList(i);return e!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R,`signal error code: ${e}`,i),{code:e}):(this._logger.info(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R,`success, data: ${JSON.stringify(t)}`,i),{code:a.SUCCESS,records:t})}async getCallRecords(i,e,t=0){const s=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_T,`startTimestamp: ${i}, count: ${e}`,s),!(S.isNumber(i)&&i>=0))return this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`params error, startTimestamp: is a number >= 0, value: ${i}`,s),{code:a.PARAM_ERROR};if(!(S.isNumber(e)&&e>0))return this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`params error, count: is a number >= 0, value: ${e}`,s),{code:a.PARAM_ERROR};const{code:r,data:o}=await this._callEngine.getCallLogList({timestamp:i,count:e,order:t},s);return r!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`signal error code: ${r}`,s),{code:r}):(this._logger.info(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,"success",s),{code:a.SUCCESS,result:o})}async deleteCallRecordsFromServer(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_T,`callIds: ${i.join(",")}`,e),!(S.notEmptyArray(i)&&i.every(s=>S.notEmptyString(s))))return this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,`params err, callIds: not empty array, callId: not empty string, callIds: ${JSON.stringify(i)}`,e),{code:a.PARAM_ERROR};const{code:t}=await this._callEngine.deleteCallLog(i,e);return t!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,`signal error code: ${t}`,e),{code:t}):(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,"success",e),{code:a.SUCCESS})}async deleteAllCallRecordsFromServer(){const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_T,"",i);const{code:e}=await this._callEngine.removeAllCallLog(i);return e!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R,`signal error code: ${e}`,i),{code:e}):(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R,"success",i),{code:a.SUCCESS})}async startCamera(){var r;const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_T,"",i);const{code:e,track:t}=await this._rtcModule.getCameraVideoTrack(i);if(e!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`create video track error code: ${e}`,i),{code:e};if(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),m.VIDEO,!0,i),!(t!=null&&t.isPublished())&&((r=this._callEngine.getLocalMainSession())==null?void 0:r.getState())===p.ONCALL){const{code:o}=await this._rtcModule.publishVideoTrack();return o!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`publish error code: ${o}`,i),{code:o}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_R,"success",i),{code:a.SUCCESS})}const{code:s}=await this._rtcModule.enableVideoTrack(i);return s!==N.RCRTCCode.SUCCESS&&s!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`signal error code: ${s}`,i),{code:s}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_R,"success",i),{code:a.SUCCESS})}async stopCamera(){const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_STOP_CAMERA_T,"",i);const{code:e,track:t}=await this._rtcModule.disableVideoTrack();return e!==a.SUCCESS&&e!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_STOP_CAMERA_R,`error code: ${e}`,i),{code:e}):(this._rtcModule.destroyTrack(t),this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),m.VIDEO,!1,i),this._logger.info(n.L_CALLPLUS_CLIENT_STOP_CAMERA_R,"success",i),{code:a.SUCCESS})}async switchCamera(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_T,`cameraId: ${i}`,e),!S.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`param error, cameraId: not empty string, value: ${i}`,e),{code:a.PARAM_ERROR};const t=this._callEngine.getLocalMainSession();if(!t)return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`errCode: ${a.NOT_IN_CALL}`,e),{code:a.NOT_IN_CALL};if(t.getMediaType()===m.AUDIO)return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`errCode: ${a.NOT_VIDEO_CALL}`,e),{code:a.NOT_VIDEO_CALL};this._videoConfig.cameraId=i,this._rtcModule.setVideoConfig(this._videoConfig);const{code:s}=await this._rtcModule.changeVideoDevice(e);return s!==a.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`call client changeVideoDevice error code: ${s}`,e),{code:s}):(this._logger.info(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,"success",e),{code:a.SUCCESS})}async startMicrophone(){const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_T,"",i);const{code:e,track:t}=await this._rtcModule.getMicrophoneAudioTrack(i);if(e!==a.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,`create microphone audio track error code: ${e}`,i),{code:e};if(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),m.AUDIO,!0,i),!t.isOwnerMuted())return this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,"success",i),{code:a.SUCCESS};const s=await t.unmute();return s!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,`signal error code: ${e}`,i),{code:s}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,"success",i),{code:a.SUCCESS})}async stopMicrophone(){const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_T,"",i);const{code:e}=await this._rtcModule.disableAudioTrack();return e!==a.SUCCESS&&e!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R,`signal error code: ${e}`,i),{code:e}):(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),m.AUDIO,!1,i),this._logger.info(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R,"success",i),{code:a.SUCCESS})}isMicrophoneEnabled(){const i=this._rtcModule.getLocalAudioTrack();return!!i&&!i.isOwnerMuted()}async setAllRemoteAudioEnable(i){const e=this._logger.createTraceId();return this._rtcModule.setAllRemoteAudioEnable(i,e)}getVersion(){return"2.1.0"}async getCameras(){return await N.device.getCameras()}async getMicrophones(){return await N.device.getMicrophones()}}const je=_=>_?S.isObject(_)?Object.keys(_).includes("rtcClient")?S.isObject(_.rtcClient)?{isLegal:!0}:{isLegal:!1,msg:"Initialization 'rtcClient' parameter must be of type 'object'"}:{isLegal:!1,code:a.NOT_INSTALL_RTC_PLUGIN}:{isLegal:!1,msg:"Initialization options must be an object"}:{isLegal:!1,msg:"Initialization missing parameter -> options"},qe={tag:"RCCallPlus",verify(_){return S.VersionManage.add("plugin-call-plus","2.1.0"),S.VersionManage.validEngine("5.8.2")?!0:(console.error(`The current engine version '${S.VersionManage.getInfo().engine}' error, plugin-call-plus required engine version at least '5.8.2'.`),!1)},setup(_,i,e){const t=je(e);if(!t.isLegal)throw new Error(`[CallPlusLib installer steup]${t.msg}`);const s=_.createLogger("CallPlusLib","RTC"),r=S.isUndefined(e.logOutputLevel)?S.LogL.WARN:e.logOutputLevel;return s.setOutputLevel(r),s.warn(n.L_INDEX_INSTALL_CALL_PLUS_PLUGIN_O,"CallPlus Version: 2.1.0, Commit: db4c39c341a3460b34b9f2ed0ecea59bacaa62a4"),new Ue(_,s,i,e)}};Object.defineProperty(U,"RCCallPlusFrameRate",{enumerable:!0,get:()=>N.RCFrameRate}),Object.defineProperty(U,"RCCallPlusResolution",{enumerable:!0,get:()=>N.RCResolution}),U.RCAudioConfigBuilder=Ie,U.RCCallPlusAndroidPushConfigBuilder=ue,U.RCCallPlusCallState=p,U.RCCallPlusClient=Ue,U.RCCallPlusCode=a,U.RCCallPlusMediaType=m,U.RCCallPlusMediaTypeChangeResult=F,U.RCCallPlusReason=R,U.RCCallPlusSession=j,U.RCCallPlusSessionUserState=A,U.RCCallPlusType=M,U.RCVideoConfigBuilder=Ce,U.installer=qe,Object.defineProperty(U,Symbol.toStringTag,{value:"Module"})});
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxTZXNzaW9uU3RhdGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvYXBpL2VudW1zL1JDQ2FsbFBsdXNSZWFzb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNBdWRpb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNWaWRlb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9oZWxwZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUEx1c1N0YXRpc3RpY3MudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvU2VjcmV0Q2FsbFR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JDQ2FsbElubmVyU2Vzc2lvbi50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy90aW1lcnMudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yZXRyeS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2ludGVyZmFjZXMvSUNhbGxIb29rcy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvU2lnbmFsVHJhbnNwb3J0ZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yYW5kb20udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9pbmRleERCLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvbW9kdWxlcy9BYm5vcm1hbENhbGwudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9DYWxsU2VydmVyRXZlbnRUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsUGx1c0lubmVyQ29kZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvVGltZUNvcnJlY3Rpb25lci50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0ZvcndhcmRUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvaW50ZXJmYWNlcy9JQ2FsbFBsdXNTdGF0aXN0aWNzLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsRGlyZWN0aW9uLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvUkNDYWxsRW5naW5lLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUlRDUmVzb3VyY2VUYWcudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JUQ01vZHVsZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1JlcG9ydE1vZHVsZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJFcnJvckNvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNDYWxsUGx1c0FuZHJvaWRQdXNoQ29uZmlnQnVpbGRlci50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2FwaS9jb25zdGFudHMudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNDYWxsUGx1c0NsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3V0aWxzL3ZhbGlkYXRpb24udHMiLCIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZW51bVxuICovXG5leHBvcnQgY29uc3QgUkNDYWxsUGx1c0NvZGUgPSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1M6IDAsXG4gIC8qKlxuICAgKiDlj4LmlbDplJnor69cbiAgICovXG4gIFBBUkFNX0VSUk9SOiA4MDAwMSxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+adn+eahCBzZXNzaW9uXG4gICAqL1xuICBTRVNTSU9OX0VYSVNUOiA4MDAwMixcbiAgLyoqXG4gICAqIOacquWKoOWFpemAmuivnVxuICAgKi9cbiAgTk9UX0lOX0NBTEw6IDgwMDAzLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L6KKr56aB5q2iXG4gICAqL1xuICBNRURJQVRZUEVfSU5WQUxJRDogODAwMDQsXG4gIC8qKlxuICAgKiDlvZPliY3kuI3mmK/op4bpopHpgJror51cbiAgICovXG4gIE5PVF9WSURFT19DQUxMOiA4MDAwNSxcbiAgLyoqXG4gICAqIOW8gOmAmueahOmfs+inhumikeacjeWKoeayoeacieWPiuaXtueUn+aViOaIlumfs+inhumikeacjeWKoeW3suWFs+mXrVxuICAgKi9cbiAgUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEU6IDgwMDA2LFxuICAvKipcbiAgICog6LCD55So5Ye95pWw5pe277yM5Lyg5YWl55qE55So5oi35YiX6KGo5Li656m66ZSZ6K+vXG4gICAqL1xuICBVU0VSX0xJU1RfSU5WQUlMRDogODAwMDcsXG4gIC8qKlxuICAgKiDosIPnlKjlh73mlbDml7bvvIzkvKDlhaXnmoTpgJror50gSWQg5Li656m66ZSZ6K+vXG4gICAqL1xuICBDQUxMX0lEX0lOVkFMSUQ6IDgwMDA4LFxuICAvKipcbiAgICog5LqL5YqhIElkIOS4uuepuumUmeivr1xuICAgKi9cbiAgVFJBTlNBQ1RJT05fSURfSU5WQUxJRDogODAwMDksXG4gIC8qKlxuICAgKiDosIPnlKjlh73mlbDml7bvvIzkvKDlhaXnmoTnlKjmiLcgSWQg5Li656m66ZSZ6K+vXG4gICAqL1xuICBVU0VSX0lEX0lOVkFMSUQ6IDgwMDEwLFxuICAvKipcbiAgICog5Y+R6LW35Y2V5Lq65ZG85Y+r5pe277yM5Lq65ZGY5YiX6KGo5Lit5Y+q6IO95pyJ5LiA5Liq5Lq6XG4gICAqL1xuICBTSU5HTEVfQ0FMTF9OT1RfU1VQUE9SVF9NVUxUSV9QRVJTT046IDgwMDExLFxuICAvKipcbiAgICogaW0g5pyq6L+e5o6lXG4gICAqL1xuICBTSUdOQUxfRElTQ09OTkVDVEVEOiA4MDAxMixcbiAgLyoqXG4gICAqIOaRhOWDj+WktOacquaJk+W8gFxuICAgKi9cbiAgQ0FNRVJBX0NMT1NFRDogODAxMDAsXG4gIC8qKlxuICAgKiDpuqblhYvpo47mnKrmiZPlvIBcbiAgICovXG4gIE1JQ1JPUEhPTkVfQ0xPU0VEOiA4MDEwMSxcbiAgLyoqXG4gICAqIOaXoOWqkuS9k+i1hOa6kFxuICAgKi9cbiAgTUVESUFfUkVTT1VSQ0VfSU5WQUxJRUQ6IDgwMTAyLFxuICAvKipcbiAgICog5pyqIGluc3RhbGwgUlRDIOaPkuS7tlxuICAgKi9cbiAgTk9UX0lOU1RBTExfUlRDX1BMVUdJTjogODAxMDMsXG4gIC8qKlxuICAgKiDmkq3mlL7lvILluLhcbiAgICovXG4gIFBMQVlfTUVESUFfRkFJTEVEOiA4MDEwNCxcbiAgLyoqXG4gICAqIOaSreaUvuinhumikemcgOimgSB2aWRlbyDlhYPntKBcbiAgICovXG4gIFZJREVPX1ZJRVdfTk9UX1NFVDogODAxMDUsXG59IGFzIGNvbnN0O1xuIiwiZXhwb3J0IGVudW0gUkNDYWxsUGx1c0xvZ2dlclRhZyB7XG4gIExfSU5ERVhfSU5TVEFMTF9DQUxMX1BMVVNfUExVR0lOX08gPSAnTC1pbmRleF9pbnN0YWxsX2NhbGxfcGx1c19wbHVnaW4tTycsXG4gIC8qKlxuICAgKiDkuJrliqHlsYLkuovku7bms6jlhoxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9FVkVOVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF9ldmVudF9saXN0ZW5lci1PJyxcbiAgLyoqXG4gICAqIOS4muWKoeWxguS6i+S7tuiwg+eUqFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbGxfZXZlbnRfbGlzdGVuZXItTycsXG4gIC8qKlxuICAgKiDpgJror53otKjph4/mlbDmja7nm5HlkKzms6jlhoxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9TVEFUVVNfUkVQT1JUX0xJU1RFTkVSX08gPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3N0YXR1c19yZXBvcnRfbGlzdGVuZXItTycsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfU1RBVFVTX1JFUE9SVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbGxfc3RhdHVzX3JlcG9ydF9saXN0ZW5lci1PJyxcbiAgLyoqXG4gICAqIOiuvue9ruaRhOWDj+WktOinhumikemFjee9rumhuVxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF92aWRlb19jb25maWctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zZXRfdmlkZW9fY29uZmlnLVInLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfRlJBTUVfUkFURV9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9mcmFtZV9yYXRlLU8nLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfUkVTT0xVVElPTl9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9yZXNvbHV0aW9uLU8nLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfQklUUkFURV9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9iaXRyYXRlLU8nLFxuICAvKipcbiAgICog6K6+572u6bqm5YWL6aOO6Z+z6aKR6YWN572u6aG5XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TRVRfQVVESU9fQ09ORklHX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X2F1ZGlvX2NvbmZpZy1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF9hdWRpb19jb25maWctUicsXG4gIExfQ0FMTFBMVVNfQVVESU9fQ09ORklHX1NFVF9CSVRSQVRFX08gPSAnTC1jYWxscGx1c19hdWRpb19jb25maWdfc2V0X2JpdHJhdGUtTycsXG4gIExfQ0FMTFBMVVNfQVVESU9fQ09ORklHX1NFVF9TQU1QTEVfUkFURV9PID0gJ0wtY2FsbHBsdXNfYXVkaW9fY29uZmlnX3NldF9zYW1wbGVfcmF0ZS1PJyxcbiAgLyoqXG4gICAqIOmihOiniFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfUFJFVklFV19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3ByZXZpZXctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1BSRVZJRVdfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9wcmV2aWV3LVInLFxuICAvKipcbiAgICog5byA5aeL5ZG85Y+rXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc3RhcnRfY2FsbC1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X2NhbGwtUicsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror53ku7vliqFcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2pvaW5fbXVsdGlfY2FsbC1UJyxcbiAgLyoqXG4gICAqIOWKoOWFpemAmuivnee7k+aenFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IgPSAnTC1jYWxscGx1c19jbGllbnRfam9pbl9tdWx0aV9jYWxsLVInLFxuICAvKipcbiAgICog5o6l5ZCs6YCa6K+d5Lu75YqhXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9hY2NlcHQtVCcsXG4gIC8qKlxuICAgKiDmjqXlkKzpgJror53nu5PmnpxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2FjY2VwdC1SJyxcbiAgLyoqXG4gICAqIOaMguaWrVxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1QgPSAnTC1jYWxscGx1c19jbGllbnRfaGFuZ3VwLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9oYW5ndXAtUicsXG4gIC8qKlxuICAgKiDpgoDor7dcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2ludml0ZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1IgPSAnTC1jYWxscGx1c19jbGllbnRfaW52aXRlLVInLFxuICAvKipcbiAgICog5Y+R6LW35aqS5L2T57G75Z6L5YiH5o2i6K+35rGCXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1QgPSAnTC1jYWxscGx1c19jbGllbnRfcmVxdWVzdF9jaGFuZ2VfbWVkaWFfdHlwZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcXVlc3RfY2hhbmdlX21lZGlhX3R5cGUtUicsXG4gIC8qKlxuICAgKiDlj5bmtojlqpLkvZPnsbvlnovliIfmjaLor7fmsYJcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbmNlbF9jaGFuZ2VfbWVkaWFfdHlwZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1IgPSAnTC1jYWxscGx1c19jbGllbnRfY2FuY2VsX2NoYW5nZV9tZWRpYV90eXBlLVInLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L5YiH5o2i5bqU562UXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcGx5X2NoYW5nZV9tZWRpYV90eXBlLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcGx5X2NoYW5nZV9tZWRpYV90eXBlLVInLFxuICAvKipcbiAgICog6I635Y+W5b2T5YmN6L+b6KGM5Lit55qE6YCa6K+d5Lu75YqhXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQ1VSUkVOVF9DQUxMX1NFU1NJT05fVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfY3VycmVudF9jYWxsX3Nlc3Npb24tVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DVVJSRU5UX0NBTExfU0VTU0lPTl9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2dldF9jdXJyZW50X2NhbGxfc2Vzc2lvbi1SJyxcbiAgLyoqXG4gICAqIOiOt+WPluacque7k+adn+eahOmAmuivneWIl+ihqFxuICAgKiBBdmFpbGFibGVDYWxsU2Vzc2lvbnNGcm9tU2VydmVyXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQVZBSUxBQkxFX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2dldF9hdmFpbGFibGVfY2FsbF9zZXNzaW9uc19mcm9tX3NlcnZlci1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfYXZhaWxhYmxlX2NhbGxfc2Vzc2lvbnNfZnJvbV9zZXJ2ZXItUicsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53orrDlvZVcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfY2FsbF9yZWNvcmRzLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IgPSAnTC1jYWxscGx1c19jbGllbnRfZ2V0X2NhbGxfcmVjb3Jkcy1SJyxcbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg5riF55CG6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9jYWxsX3JlY29yZHNfYnlfY2FsbElkLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9jYWxsX3JlY29yZHNfYnlfY2FsbElkLVInLFxuICAvKipcbiAgICog5riF55CG5omA5pyJ6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9hbGxfY2FsbF9yZWNvcmRzX2Zyb21fc2VydmVyLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9hbGxfY2FsbF9yZWNvcmRzX2Zyb21fc2VydmVyLVInLFxuICAvKipcbiAgICog5omT5byA5pGE5YOP5aS0XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdGFydF9jYW1lcmEtVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X2NhbWVyYS1SJyxcbiAgLyoqXG4gICAqIOWFs+mXreaRhOWDj+WktFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdG9wX2NhbWVyYS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdG9wX2NhbWVyYS1SJyxcbiAgLyoqXG4gICAqIOWIh+aNouaRhOWDj+WktFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N3aXRjaF9jYW1lcmEtVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zd2l0Y2hfY2FtZXJhLVInLFxuICAvKipcbiAgICog5omT5byA6bqm5YWL6aOOXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc3RhcnRfbWljcm9waG9uZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X21pY3JvcGhvbmUtUicsXG4gIC8qKlxuICAgKiDlhbPpl63puqblhYvpo45cbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfTUlDUk9QSE9ORV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0b3BfbWljcm9waG9uZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9NSUNST1BIT05FX1IgPSAnTC1jYWxscGx1c19jbGllbnRfc3RvcF9taWNyb3Bob25lLVInLFxuICAvKipcbiAgICog6K6+572uIHZpZGVvIHZpZXdcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3ZpZGVvX3ZpZXctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3ZpZGVvX3ZpZXctUicsXG4gIExfUlRDX01PRFVMRV9TRVRfVklERU9fVklFV19PID0gJ0wtcnRjX21vZHVsZV9zZXRfdmlkZW9fdmlldy1PJyxcbiAgLyoqXG4gICAqIOWIoOmZpCB2aWRlbyB2aWV3XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlbW92ZV92aWRlb192aWV3LVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlbW92ZV92aWRlb192aWV3LVInLFxuICBMX1JUQ19NT0RVTEVfUkVNT1ZFX1ZJREVPX1ZJRVdfTyA9ICdMLXJ0Y19tb2R1bGVfcmVtb3ZlX3ZpZGVvX3ZpZXctTycsXG4gIC8qKlxuICAgKiDmkq3mlL7lqpLkvZNcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9wbGF5X21lZGlhLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9QTEFZX01FRElBX1IgPSAnTC1jYWxscGx1c19jbGllbnRfcGxheV9tZWRpYS1SJyxcbiAgTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfVCA9ICdMLXJ0Y19tb2R1bGVfcGxheV9tZWRpYS1UJyxcbiAgTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiA9ICdMLXJ0Y19tb2R1bGVfcGxheV9tZWRpYS1SJyxcbiAgLyoqXG4gICAqIOmdmemfs+i/nOerr+mfs+mikVxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1NFVF9BTExfUkVNT1RFX0FVRElPX0VOQUJMRV9UID0gJ0wtcnRjX21vZHVsZV9zZXRfYWxsX3JlbW90ZV9hdWRpb19lbmJhbGUtVCcsXG4gIExfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfUiA9ICdMLXJ0Y19tb2R1bGVfc2V0X2FsbF9yZW1vdGVfYXVkaW9fZW5hYmxlLVInLFxuICAvKipcbiAgICog6K6i6ZiFXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfU1VCU0NSSUJFX1QgPSAnTC1ydGNfbW9kdWxlX3N1YnNjcmliZS1UJyxcbiAgTF9SVENfTU9EVUxFX1NVQlNDUklCRV9SID0gJ0wtcnRjX21vZHVsZV9zdWJzY3JpYmUtUicsXG4gIC8qKlxuICAgKiDlj5bmtojorqLpmIVcbiAgICovXG4gIExfUlRDX01PRFVMRV9VTlNVQlNDUklCRV9UID0gJ0wtcnRjX21vZHVsZV91bnN1YnNjcmliZS1UJyxcbiAgTF9SVENfTU9EVUxFX1VOU1VCU0NSSUJFX1IgPSAnTC1ydGNfbW9kdWxlX3Vuc3Vic2NyaWJlLVInLFxuICAvKipcbiAgICog5Li75Yqo5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUFVCTElTSF9UID0gJ0wtcnRjX21vZHVsZV9wdWJsaXNoLVQnLFxuICBMX1JUQ19NT0RVTEVfUFVCTElTSF9SID0gJ0wtcnRjX21vZHVsZV9wdWJsaXNoLVInLFxuICAvKipcbiAgICog5Y+W5raI5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfVU5QVUJMSVNIX1QgPSAnTC1ydGNfbW9kdWxlX3VucHVibGlzaC1UJyxcbiAgTF9SVENfTU9EVUxFX1VOUFVCTElTSF9SID0gJ0wtcnRjX21vZHVsZV91bnB1Ymxpc2gtUicsXG4gIC8qKlxuICAgKiDplIDmr4HmiYDmnInpn7Pop4bpopHotYTmupBcbiAgICovXG4gIExfUlRDX01PRFVMRV9ERVNUUk9ZX0FMTF9UUkFDS1NfTyA9ICdMLXJ0Y19tb2R1bGVfZGVzdHJveV9hbGxfdHJhY2tzLU8nLFxuICAvKipcbiAgICogc2Vzc2lvbiDlu7rnq4vlkI4gUlRDIOaooeWdl+eahOWkhOeQhlxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9UID0gJ0wtcnRjX21vZHVsZV9zZXNzaW9uX2Nvbm5lY3QtVCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUCA9ICdMLXJ0Y19tb2R1bGVfc2Vzc2lvbl9jb25uZWN0LVAnLFxuICBMX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY29ubmVjdC1SJyxcbiAgLyoqXG4gICAqIHNlc3Npb24g57uT5p2f5ZCOIFJUQyDmqKHlnZfnmoTlpITnkIZcbiAgICovXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1QgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtVCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1AgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtUCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtUicsXG4gIC8qKlxuICAgKiDliJvlu7rop4bpopHotYTmupBcbiAgICovXG4gIExfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfVCA9ICdMLXJ0Y19tb2R1bGVfY3JlYXRlX3ZpZGVvX3RyYWNrLVQnLFxuICBMX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IgPSAnTC1ydGNfbW9kdWxlX2NyZWF0ZV92aWRlb190cmFjay1SJyxcbiAgLyoqXG4gICAqIOWIm+W7uumfs+mikei1hOa6kFxuICAgKi9cbiAgTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19UID0gJ0wtcnRjX21vZHVsZV9jcmVhdGVfYXVkaW9fdHJhY2stVCcsXG4gIExfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiA9ICdMLXJ0Y19tb2R1bGVfY3JlYXRlX2F1ZGlvX3RyYWNrLVInLFxuICAvKipcbiAgICog5pS25Yiw6LWE5rqQ5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19QVUJMSVNIX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfcHVibGlzaC1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOi1hOa6kOWPlua2iOWPkeW4g1xuICAgKi9cbiAgTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfVU5QVUJMSVNIX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfdW5wdWJsaXNoLU8nLFxuICAvKipcbiAgICog5pS25Yiw6LWE5rqQ54q25oCB5Y+Y5pu0XG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19FTkFCTEVfQ0hBTkdFX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfZW5hYmxlX2NoYW5nZS1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOiiq+i4ouWHuuaIv+mXtFxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1JFQ0VJVkVfS0lDS19PRkZfTyA9ICdMLXJ0Y19tb2R1bGVfcmVjZWl2ZV9raWNrX29mZi1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsCBwZWVyY29ubmVjdGlvbiDlvILluLjlhbPpl61cbiAgICovXG4gIExfUlRDX01PRFVMRV9SRUNFSVZFX1BFRVJDT05ORUNUSU9OX0VYQ0VQVF9DTE9TRV9PID0gJ0wtcnRjX21vZHVsZV9yZWNlaXZlX3BlZXJjb25uZWN0aW9uX2V4Y2VwdF9jbG9zZS1PJyxcbiAgLyoqXG4gICAqIOWIh+aNouWqkuS9k+exu+Wei1xuICAgKi9cbiAgTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1QgPSAnTC1ydGNfbW9kdWxlX2NoYW5nZV9tZWRpYV90eXBlLVQnLFxuICBMX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfUiA9ICdMLXJ0Y19tb2R1bGVfY2hhbmdlX21lZGlhX3R5cGUtUicsXG4gIC8qKlxuICAgKiDliqDlhaXmiL/pl7RcbiAgICovXG4gIExfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1QgPSAnTC1ydGNfbW9kdWxlX2pvaW5fcnRjX3Jvb20tVCcsXG4gIExfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1IgPSAnTC1ydGNfbW9kdWxlX2pvaW5fcnRjX3Jvb20tUicsXG4gIC8qKlxuICAgKiDpgIDlh7rmiL/pl7RcbiAgICovXG4gIExfUlRDX01PRFVMRV9RVUlUX1JUQ19ST09NX1QgPSAnTC1ydGNfbW9kdWxlX3F1aXRfcnRjX3Jvb20tVCcsXG4gIExfUlRDX01PRFVMRV9RVUlUX1JUQ19ST09NX1IgPSAnTC1ydGNfbW9kdWxlX3F1aXRfcnRjX3Jvb20tUicsXG5cbiAgLy8gc2lnbmFsIOaooeWdl+aXpeW/l+agh+etvlxuICAvKipcbiAgICog5byA5aeL5ZG85Y+rXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9TSU5HTEVfQ0FMTF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3NpbmdsZV9jYWxsLVQnLFxuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HUk9VUF9DQUxMX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZ3JvdXBfY2FsbC1UJyxcbiAgLyoqXG4gICAqIOmCgOivt1xuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSU5WSVRFX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaW52aXRlLVQnLFxuICAvKipcbiAgICog5ZON6ZODXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SSU5HX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfcmluZy1UJyxcbiAgLyoqXG4gICAqIOaOpeWQrFxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfQUNDRVBUX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfYWNjZXB0LVQnLFxuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9BQ0NFUFRfUiA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9hY2NlcHQtUicsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror51cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0pPSU5fQ0FMTF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2pvaW5fY2FsbC1UJyxcbiAgLyoqXG4gICAqIOaMguaWremAmuivnVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSEFOR1VQX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaGFuZ3VwLVQnLFxuICAvKipcbiAgICog6YCa6K+d54q25oCB5LiK5oqlXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX1NUQVRVU19VUF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2NhbGxfc3RhdHVzX3VwLVQnLFxuICAvKipcbiAgICog6YCa6K+d5LqL5Lu25LiK5oqlXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX0VWRU5UX1VQX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfY2FsbF9ldmVudF91cC1UJyxcbiAgLyoqXG4gICAqIOmAmuivneWvueivneS6i+S7tuS4iuaKpVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9ESUFMT0dfVVBfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9jYWxsX2RpYWxvZ191cC1UJyxcbiAgLyoqXG4gICAqIOWIoOmZpOmAmuivneiusOW9lVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfREVMRVRFX0NBTExfUkVDT1JEX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZGVsZXRlX2NhbGxfcmVjb3JkLVQnLFxuICAvKipcbiAgICog6I635Y+W6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9SRUNPUkRfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF9yZWNvcmQtVCcsXG4gIC8qKlxuICAgKiDmn6Xor6IgY2FsbCBzZXJ2ZXIg5b2T5YmN5pe26Ze05oizXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9TRVJWRVJfVElNRV9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2dldF9jYWxsX3NlcnZlcl90aW1lLVQnLFxuICAvKipcbiAgICog6I635Y+W5oyH5a6a6YCa6K+d55qE5pe26Ze05L+h5oGvXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9USU1FX0lORk9fVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF90aW1lX2luZm8tVCcsXG4gIC8qKlxuICAgKiDojrflj5bnlKjmiLfmnKrnu5PmnZ/nmoTpgJror53liJfooajkv6Hmga9cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9BVkFJTEFCTEVfQ0FMTF9MSVNUX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZ2V0X2F2YWlsYWJsZV9jYWxsX2xpc3QtVCcsXG4gIC8qKlxuICAgKiDmuIXpmaTpgJror53orrDlvZVcbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0NMRUFSX0NBTExfUkVDT1JEX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfY2xlYXJfY2FsbF9yZWNvcmQtVCcsXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOiOt+WPlumAmuivneS/oeaBr1xuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfSU5GT19CWV9DQUxMSURfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfY2FsbF9pbmZvX2J5X2NhbGxJZC1UJyxcbiAgLyoqXG4gICAqIOeUqOaIt+ezu+e7n+eKtuaAgeS4iuaKpVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfVVNFUl9TWVNURU1fU1RBVEVfVVBfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl91c2VyX3N5c3RlbV9zdGF0ZV91cC1UJyxcbiAgLyoqXG4gICAqIOaUtuWIsCBjYWxsIHNpZ25hbCDmtojmga9cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfQ0FMTF9TSUdOQUxfREFUQV9PID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3JlY2VpdmVfY2FsbF9zaWduYWxfZGF0YS1PJyxcbiAgLyoqXG4gICAqIGltIOeKtuaAgeWPmOWMllxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSU1fU1RBVEVfQ0hBTkdFX08gPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfaW1fc3RhdGVfY2hhbmdlLU8nLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+d6YKA6K+3XG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0lOVklURV9PID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3JlY2VpdmVfaW52aXRlLU8nLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+d54q25oCB5Y+Y5pu0XG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU1RBVFVTX08gPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfcmVjZWl2ZV9jYWxsX3N0YXR1cy1PJyxcbiAgLyoqXG4gICAqIGNhbGwgZW5naW5lIOabtOaWsOS6uuWRmOeKtuaAgVxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9VUERBVEVfVVNFUlNfU1RBVEVfTyA9ICdMLWNhbGxfZW5naW5lX3VwZGF0ZV91c2Vyc19zdGF0ZS1PJyxcbiAgLyoqXG4gICAqIGltIOeKtuaAgeWPmOabtFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9JTV9TVEFURV9DSEFOR0VfTyA9ICdMLWNhbGxfZW5naW5lX2ltX3N0YXRlX2NoYW5nZS1PJyxcbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq+OAgeaUtuWIsOmCgOivt+i2heaXtlxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9DQUxMX1RJTUVPVVRfTyA9ICdMLWNhbGxfZW5naW5lX2NhbGxfdGltZW91dC1PJyxcbiAgLyoqXG4gICAqIOW8gOWQr+mAmuivneWumuaXtuWZqFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9TVEFSVF9DQUxMX1RJTUVSX08gPSAnTC1jYWxsX2VuZ2luZV9zdGFydF9jYWxsX3RpbWVyLU8nLFxuICAvKipcbiAgICog5riF6Zmk6YCa6K+d5a6a5pe25ZmoXG4gICAqL1xuICBMX0NBTExfRU5HSU5FX1NUT1BfQ0FMTF9USU1FUl9PID0gJ0wtY2FsbF9lbmdpbmVfc3RvcF9jYWxsX3RpbWVyLU8nLFxuICAvKipcbiAgICog5LiK5oqlIG9uUGhvbmVFbmRcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1QgPSAnTC1jYWxsX2VuZ2luZV91cF9vbl9waG9uZV9lbmQtVCcsXG4gIExfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1IgPSAnTC1jYWxsX2VuZ2luZV91cF9vbl9waG9uZV9lbmQtUicsXG4gIC8qKlxuICAgKiDmlLbliLDpppbluKfml7bpl7TkuIvlj5FcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9GSVJTVF9GUkFNRV9USU1FX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX2ZpcnN0X2ZyYW1lX3RpbWUtTycsXG4gIC8qKlxuICAgKiDmlLbliLDlqpLkvZPnsbvlnovliIfmjaLkuovku7ZcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9NRURJQVRZUEVfQ0hBTkdFX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX21lZGlhdHlwZV9jaGFuZ2UtTycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53nu5PmnZ9cbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DTE9TRV9TRVNTSU9OX08gPSAnTC1jYWxsX2VuZ2luZV9yZWNlaXZlX2Nsb3NlX3Nlc3Npb24tTycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53ml6Xlv5dcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DQUxMX1JFQ09SRF9PID0gJ0wtY2FsbF9lbmdpbmVfcmVjZWl2ZV9jYWxsX3JlY29yZC1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOihpeWBv+aVsOaNrlxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NPTVBMRU1FTlRBUllfREFUQV9PID0gJ0wtY2FsbF9lbmdpbmVfcmVjZWl2ZV9jb21wbGVtZW50YXJ5X2RhdGEtTycsXG4gIC8qKlxuICAgKiDliJvlu7ogc2Vzc2lvblxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfVCA9ICdMLWNhbGxfZW5naW5lX2NyZWF0ZV9zZXNzaW9uX2J5X3NlcnZlci1UJyxcbiAgTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfUiA9ICdMLWNhbGxfZW5naW5lX2NyZWF0ZV9zZXNzaW9uX2J5X3NlcnZlci1SJyxcbiAgLyoqXG4gICAqIOS4iuaKpemmluW4p+aXtumXtFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9VUF9GSVJTVF9GUkFNRV9USU1FX1QgPSAnTC1jYWxsX2VuZ2luZV91cF9maXJzdF9mcmFtZV90aW1lLVQnLFxuICBMX0NBTExfRU5HSU5FX1VQX0ZJUlNUX0ZSQU1FX1RJTUVfUiA9ICdMLWNhbGxfZW5naW5lX3VwX2ZpcnN0X2ZyYW1lX3RpbWUtUicsXG4gIC8qKlxuICAgKiDlvIDlkK/ml7bpl7TmoKHmraNcbiAgICovXG4gIExfVElNRV9DT1JSRUNUX1NUQVJUX08gPSAnTC10aW1lX2NvcnJlY3Rfc3RhcnQtTycsXG4gIC8qKlxuICAgKiDlgZzmraLmoKHml7ZcbiAgICovXG4gIExfVElNRV9DT1JSRUNUX1NUT1BfTyA9ICdMLXRpbWVfY29ycmVjdF9zdG9wLU8nLFxuICAvKipcbiAgICog6YeN5paw5byA5ZCv5qCh5pe2XG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9SRVNUQVJUX08gPSAnTC10aW1lX2NvcnJlY3RfcmVzdGFydC1PJyxcbiAgLyoqXG4gICAqIOS7juacjeWKoeerr+iOt+WPlumAmuivneaXtumVv+OAgemAmuivneW8gOWni+aXtumXtFxuICAgKi9cbiAgTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1QgPSAnTC10aW1lX2NvcnJlY3RfZ2V0X2NhbGxfY2xpZW50X3RpbWVfYnlfc2VydmVyLVQnLFxuICBMX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfUCA9ICdMLXRpbWVfY29ycmVjdF9nZXRfY2FsbF9jbGllbnRfdGltZV9ieV9zZXJ2ZXItUCcsXG4gIExfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SID0gJ0wtdGltZV9jb3JyZWN0X2dldF9jYWxsX2NsaWVudF90aW1lX2J5X3NlcnZlci1SJyxcbiAgLyoqXG4gICAqIOiuoeeul+WuouaIt+err+W8gOWni+aXtumXtFxuICAgKi9cbiAgTF9USU1FX0NPUlJFQ1RfQ0FMQ19DTElFTlRfU1RBUlRfVElNRV9UID0gJ0wtdGltZV9jb3JyZWN0X2NhbGNfY2xpZW50X3N0YXJ0X3RpbWUtVCcsXG4gIExfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfUiA9ICdMLXRpbWVfY29ycmVjdF9jYWxjX2NsaWVudF9zdGFydF90aW1lLVInLFxuICAvKipcbiAgICog5a2Y5YKo5a6i5oi356uv5ZKM5pyN5Yqh56uv5pe26Ze05YGP5beuXG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9TRVRfREVMVEFfVElNRV9PID0gJ0wtdGltZV9jb3JyZWN0X3NldF9kZWx0YV90aW1lLU8nLFxuICAvKipcbiAgICog5b6q546v5LiJ5qyh5qCh5q2j57uZ5a6i5oi356uv55qE5pe26Ze0XG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9MT09QX0NPUlJFQ1RfQ0xJTkVUX1RJTUVfVCA9ICdMLXRpbWVfY29ycmVjdF9sb29wX2NvcnJlY3RfY2xpZW50X3RpbWUtVCcsXG4gIExfVElNRV9DT1JSRUNUX0xPT1BfQ09SUkVDVF9DTElORVRfVElNRV9SID0gJ0wtdGltZV9jb3JyZWN0X2xvb3BfY29ycmVjdF9jbGllbnRfdGltZS1SJyxcbiAgLyoqXG4gICAqIHNlc3Npb24g5YaF6YOo5pu05paw5Lq65ZGY54q25oCBXG4gICAqL1xuICBMX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTyA9ICdMLWlubmVyX3Nlc3Npb25fdXBkYXRlX3VzZXJfc3RhdGUtTycsXG4gIC8qKlxuICAgKiDorr7nva4gc2Vzc2lvbiDkurrlkZjorr7lpIfnirbmgIFcbiAgICovXG4gIExfSU5ORVJfU0VTU0lPTl9TRVRfVVNFUl9ERVZJQ0VfRU5BQkxFX08gPSAnTC1pbm5lcl9zZXNzaW9uX3NldF91c2VyX2RldmljZV9lbmFibGUtTycsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53lvIDlp4vml7bpl7RcbiAgICovXG4gIExfQ0FMTFBMVVNfU0VTU0lPTl9HRVRfQ1JFQVRFX1RJTUVfVCA9ICdMLWNhbGxwbHVzX3Nlc3Npb25fZ2V0X2NyZWF0ZV90aW1lLVQnLFxuICBMX0NBTExQTFVTX1NFU1NJT05fR0VUX0NSRUFURV9USU1FX1IgPSAnTC1jYWxscGx1c19zZXNzaW9uX2dldF9jcmVhdGVfdGltZS1SJyxcbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneaXtumVv1xuICAgKi9cbiAgTF9DQUxMUExVU19TRVNTSU9OX0dFVF9EVVJBVElPTl9UID0gJ0wtY2FsbHBsdXNfc2Vzc2lvbl9nZXRfZHVyYXRpb24tVCcsXG4gIExfQ0FMTFBMVVNfU0VTU0lPTl9HRVRfRFVSQVRJT05fUiA9ICdMLWNhbGxwbHVzX3Nlc3Npb25fZ2V0X2R1cmF0aW9uLVInLFxuICAvKipcbiAgICog6K6+572u5a6J5Y2T5o6o6YCB6YWN572u6aG5XG4gICAqL1xuICBMX0NBTExQTFVTX1NFVF9BTkRST0lEX1BVU0hfQ09ORklHX08gPSAnTC1jYWxscGx1c19zZXRfYW5kcm9pZF9wdXNoX2NvbmZpZy1PJ1xufVxuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBSQ0NhbGxQbHVzVHlwZSwgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUsIFJDQ2FsbFBsdXNNZWRpYVR5cGUsIFJDQ2FsbFBsdXNDYWxsU3RhdGUsXG59IGZyb20gJy4uL2FwaS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUkNDYWxsSW5uZXJTZXNzaW9uIH0gZnJvbSAnLi9SQ0NhbGxJbm5lclNlc3Npb24nO1xuaW1wb3J0IHsgUkNDYWxsRW5naW5lIH0gZnJvbSAnLi4vUkNDYWxsRW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDb2RlIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZyc7XG5cbi8qKlxuICog5a+55aSWIHNlc3Npb24g5a6e5L6L77yM5LuF5pyJ6I635Y+W5pa55rOV77yM5peg5rOV5L+u5pS5XG4gKi9cbmV4cG9ydCBjbGFzcyBSQ0NhbGxQbHVzU2Vzc2lvbiB7XG4gIHByaXZhdGUgX3N0YXJ0VGltZTogbnVtYmVyID0gMFxuXG4gIHByaXZhdGUgX2R1cmF0aW9uOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSBfY2FsbElkOiBzdHJpbmcgPSAnJ1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Nlc3Npb246IFJDQ2FsbElubmVyU2Vzc2lvbixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsRW5naW5lOiBSQ0NhbGxFbmdpbmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG4gICAgdGhpcy5fY2FsbElkID0gdGhpcy5fc2Vzc2lvbi5nZXRDYWxsSWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgQ2FsbElkXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FsbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5Ygc2Vzc2lvbiDnirbmgIFcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0ZSgpOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRTZXNzaW9uU3RhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53nsbvlnotcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsVHlwZSgpOiBSQ0NhbGxQbHVzVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb24uZ2V0Q2FsbFR5cGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53lqpLkvZPnsbvlnotcbiAgICovXG4gIHB1YmxpYyBnZXRNZWRpYVR5cGUoKTogUkNDYWxsUGx1c01lZGlhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb24uZ2V0TWVkaWFUeXBlKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6YCa6K+d5Lq65ZGY5YiX6KGoXG4gICAqL1xuICBwdWJsaWMgZ2V0VXNlckxpc3QoKTogeyB1c2VySWQ6IHN0cmluZywgc3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb24uZ2V0VXNlckxpc3QoKS5tYXAoKHVzZXIpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdXNlcklkLCB1c2VyU3RhdGUsIGNhbWVyYUVuYWJsZSwgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgIH0gPSB1c2VyO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBzdGF0ZTogdXNlclN0YXRlLFxuICAgICAgICBjYW1lcmFFbmFibGUsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGUsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneWPkei1t+iAhSB1c2VySWRcbiAgICovXG4gIGdldENyZWF0b3JVc2VySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRTdGFydENhbGxlcklkKCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6YCa6K+d6YKA6K+36ICFIHVzZXJJZFxuICAgKiDlkbzlhaXmnInlgLzvvIzlkbzlh7rml7bvvIzlgLzkuLrmnKzlnLDnlKjmiLcgVXNlcklkXG4gICAqL1xuICBnZXRJbnZpdGVyVXNlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb24uZ2V0Q2FsbGVySWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53otbflp4vml7bpl7RcbiAgICovXG4gIGFzeW5jIGdldENyZWF0ZVRpbWVzdGFtcCgpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIHN0YXJ0VGltZT86IG51bWJlcn0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VTU0lPTl9HRVRfQ1JFQVRFX1RJTUVfVCwgJycsIHRyYWNlSWQpO1xuICAgIGlmICh0aGlzLl9zdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lIH07XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgY2xpZW50U3RhcnRUaW1lIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxTdGFyaW5nVGltZSh7IGNhbGxJZDogdGhpcy5fY2FsbElkIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFU1NJT05fR0VUX0NSRUFURV9USU1FX1IsIGBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFU1NJT05fR0VUX0NSRUFURV9USU1FX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gY2xpZW50U3RhcnRUaW1lITtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIHN0YXJ0VGltZTogdGhpcy5fc3RhcnRUaW1lLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6YCa6K+d5pe26ZW/XG4gICAqIOmAmuivneacque7k+adn+WJje+8jOWAvOS4uiAwXG4gICAqL1xuICBhc3luYyBnZXREdXJhdGlvbigpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGR1cmF0aW9uPzogbnVtYmVyfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVNTSU9OX0dFVF9EVVJBVElPTl9ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fZHVyYXRpb24pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVNTSU9OX0dFVF9EVVJBVElPTl9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfSwgZHVyYXRpb246ICR7dGhpcy5fZHVyYXRpb259YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCBkdXJhdGlvbjogdGhpcy5fZHVyYXRpb24gfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbFRpbWVJbmZvKHRoaXMuX2NhbGxJZCwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VTU0lPTl9HRVRfRFVSQVRJT05fUiwgYGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VTU0lPTl9HRVRfRFVSQVRJT05fUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU30sIGR1cmF0aW9uOiAke2RhdGEhLmR1cmF0aW9ufWAsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2R1cmF0aW9uID0gZGF0YSEuZHVyYXRpb247XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBkdXJhdGlvbjogdGhpcy5fZHVyYXRpb24sXG4gICAgfTtcbiAgfVxufVxuIiwiLyoqXG4gKiDlkbzlj6vnsbvlnotcbiAqL1xuZXhwb3J0IGVudW0gUkNDYWxsUGx1c1R5cGUge1xuICAvKipcbiAgICog5Y2V5ZG8XG4gICAqL1xuICBTSU5HTEUsXG4gIC8qKlxuICAgKiDlpJrkurrlkbzlj6tcbiAgICovXG4gIE1VTFRJXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSB7XG4gIC8qKlxuICAgKiBJRExFXG4gICAqL1xuICBJRExFID0gMCxcbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq1xuICAgKi9cbiAgQ0FMTElORyA9IDEwMCxcbiAgLyoqXG4gICAqIOiiq+mCgOivt1xuICAgKi9cbiAgSU5WSVRFRCA9IDEwMSxcbiAgLyoqXG4gICAqIOWTjemTg1xuICAgKi9cbiAgUklOR0lORyA9IDEwMixcbiAgLyoqXG4gICAqIOW3seaWueW/meeijOebtOaOpeaMguaWrVxuICAgKi9cbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgLyoqXG4gICAqIOW3seaWueW/meeijOetieW+heaOpeWQrOWFtuS7lumAmuivnVxuICAgKi9cbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgLyoqXG4gICAqIOmAmuivnei/nuaOpeS4rVxuICAgKi9cbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgLyoqXG4gICAqIOato+WcqOmAmuivneS4rVxuICAgKi9cbiAgT05DQUxMID0gMzAwLFxuICAvKipcbiAgICog5q2j5Zyo57O757uf6YCa6K+d5LitXG4gICAqL1xuICBPTlBIT05FID0gMzAxLFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PX0FOU1dFUiA9IDEwMDEsXG4gIC8qKlxuICAgKiDlt7Hnq6/otoXml7bmnKrmjqXlkKxcbiAgICovXG4gIE1JU1NFRCA9IDEwMDIsXG4gIC8qKlxuICAgKiDpgJror53lj5bmtohcbiAgICovXG4gIENBTkNFTExFRCA9IDEwMDMsXG4gIC8qKlxuICAgKiDpgJror53mi5Lnu51cbiAgICovXG4gIERFQ0xJTkVEID0gMTAwNCxcbiAgLyoqXG4gICAqIOW8guW4uFxuICAgKi9cbiAgRVJST1IgPSAyMDAwXG59XG4iLCIvKipcbiAqIOWRvOWPq+WqkuS9k+exu+Wei1xuICovXG5leHBvcnQgZW51bSBSQ0NhbGxQbHVzTWVkaWFUeXBlIHtcbiAgLyoqXG4gICAqIOmfs+mikVxuICAgKi9cbiAgQVVESU8sXG4gIC8qKlxuICAgKiDpn7Pop4bpopFcbiAgICovXG4gIEFVRElPX1ZJREVPLFxuICAvKipcbiAgICog6KeG6aKRXG4gICAqL1xuICBWSURFTyxcbn1cbiIsIi8qKlxuICog6YCa6K+d54q25oCBXG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNDYWxsU3RhdGUge1xuICAvKipcbiAgICog5Yid5aeL54q25oCBXG4gICAqL1xuICBJRExFID0gMCxcbiAgLyoqXG4gICAqIOato+WcqOWRvOWPq1xuICAgKi9cbiAgQ0FMTElORyA9IDEwMCxcbiAgLyoqXG4gICAqIOiiq+mCgOivt1xuICAgKi9cbiAgSU5WSVRFRCA9IDEwMSxcbiAgLyoqXG4gICAqIOWTjemTg1xuICAgKi9cbiAgUklOR0lORyA9IDEwMixcbiAgLyoqXG4gICAqIOW/mee6v+WTjemTg1xuICAgKi9cbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgLyoqXG4gICAqIOW/mee6v+etieW+hVxuICAgKi9cbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgLyoqXG4gICAqIOmAmuivnei/nuaOpeS4rVxuICAgKi9cbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgLyoqXG4gICAqIOmAmuivneS4rVxuICAgKi9cbiAgT05DQUxMID0gMzAwLFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PQU5TV0VSID0gMTAwMSxcbiAgLyoqXG4gICAqIOW3seerr+acquaOpeWQrFxuICAgKi9cbiAgTUlTU0VEID0gMTAwMixcbiAgLyoqXG4gICAqIOW3seerr+WPlua2iOmAmuivnVxuICAgKi9cbiAgQ0FOQ0VMRUQgPSAxMDAzLFxuICAvKipcbiAgICog6L+c56uv5ouS57udXG4gICAqL1xuICBERUNMSU5FRCA9IDEwMDQsXG5cbiAgRVJST1IgPSAyMDAwXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0IHtcbiAgLyoqXG4gICAqIOivt+axguaWueWPlua2iOWqkuS9k+exu+Wei+WPmOabtFxuICAgKi9cbiAgQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFID0gMCxcbiAgLyoqXG4gICAqIOW6lOetlOaWueaLkue7neWqkuS9k+exu+Wei+WIh+aNolxuICAgKi9cbiAgUkVGVVNFX0NIQU5HRV9NRURJQV9UWVBFID0gMSxcbiAgLyoqXG4gICAqIOacjeWKoeS7suijgeWFgeiuuOWqkuS9k+exu+Wei+WIh+aNolxuICAgKi9cbiAgU0VSVkVSX0FMTE9XX01FRElBX1RZUEUgPSAyLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L5YiH5o2i6LaF5pe2XG4gICAqL1xuICBDSEFOR0VfTUVESUFfVFlQRV9USU1FT1VUID0gMyxcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNSZWFzb24ge1xuICBJRExFID0gMCxcbiAgQ0FMTElORyA9IDEwMCxcbiAgSU5WSVRFRCA9IDEwMSxcbiAgUklOR0lORyA9IDEwMixcbiAgQlVTWUxJTkVfUklOR0lORyA9IDEwMyxcbiAgQlVTWUxJTkVfV0FJVCA9IDEwNCxcbiAgQ09OTkVDVElORyA9IDIwMCxcbiAgT05DQUxMID0gMzAwLFxuICBPTl9QSE9ORSA9IDMwMSxcbiAgT05fUEhPTkVfRU5EID0gMzAyLFxuICAvKipcbiAgICog6L6T5YWl6K6+5aSH5LiN5Y+v55SoXG4gICAqL1xuICBPTl9ERVZJQ0VfRElTQUJMRSA9IDMwMyxcbiAgLyoqXG4gICAqIOi+k+WFpeiuvuWkh+WPr+eUqFxuICAgKi9cbiAgT05fREVWSUNFX0VOQUJMRSA9IDMwNCxcbiAgLyoqXG4gICAqIOacrOerr+W8guW4uOemu+W8gFxuICAgKi9cbiAgQUJOT1JNQUxfRU5EID0gOTk5LFxuICAvKipcbiAgICog6YCa6K+d57uT5p2fXG4gICAqL1xuICBFTkRFRCA9IDEwMDAsXG4gIC8qKlxuICAgKiDov5znq6/mnKrmjqXlkKxcbiAgICovXG4gIE5PX0FOU1dFUiA9IDEwMDEsXG4gIC8qKlxuICAgKiDlt7Hnq6/mnKrmjqXlkKxcbiAgICovXG4gIE1JU1NFRCA9IDEwMDIsXG4gIC8qKlxuICAgKiDlt7Hnq6/pgJror53lj5bmtohcbiAgICovXG4gIENBTkNFTExFRCA9IDEwMDMsXG4gIC8qKlxuICAgKiDov5znq6/mi5Lnu51cbiAgICovXG4gIERFQ0xJTkVEID0gMTAwNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+WRvOWHuijlvZPliY3nq6/ooqvouKIpXG4gICAqL1xuICBPVEhFUl9DTElFTlRfQ0FMTElORyA9IDEwMTAsXG4gIC8qKlxuICAgKiDlhbbku5bnq6/lt7LmjqXlkKxcbiAgICovXG4gIE9USEVSX0NMSUVOVF9BQ0NFUFQgPSAxMDExLFxuICAvKipcbiAgICog5Yqg5YWlIFJUQyDmiL/pl7TlpLHotKVcbiAgICovXG4gIEpPSU5fUk9PTV9FUlIgPSAxMTA1LFxuICAvKipcbiAgICog5Y+R5biD6LWE5rqQ5aSx6LSlXG4gICAqL1xuICBQVUJMSVNIX0VSUiA9IDExMDYsXG4gIC8qKlxuICAgKiDorqLpmIXotYTmupDlpLHotKVcbiAgICovXG4gIFNVQlNDUklCRV9FUlIgPSAxMTA3LFxuICAvKipcbiAgICog5o6l5ZCs57O757uf6YCa6K+dXG4gICAqL1xuICBBQ0NFUFRfQ0FSUklFUiA9IDExMDgsXG4gIC8qKlxuICAgKiDooqvnpoHmraLpgJror51cbiAgICovXG4gIEtJQ0tFRF9CWV9TRVJWRVIgPSAxMTA5LFxuICAvKipcbiAgICogUlRDIFBpbmcg5aSx6LSl6KKr6Lii5Ye65oi/6Ze0XG4gICAqL1xuICBDT05ORUNUSU9OX0VSUiA9IDExMTAsXG4gIC8qKlxuICAgKiDnlKjmiLfpgIDlh7rnmbvlvZXooqvouKLlh7rmiL/pl7RcbiAgICovXG4gIExPR09VVCA9IDExMTEsXG4gIC8qKlxuICAgKiDnlKjmiLfooqvlhbbku5bnq6/nmbvlvZXmjKTkuIvnur9cbiAgICovXG4gIE9USEVSX0NMSUVOVF9MT0dJTiA9IDExMTIsXG4gIC8qKlxuICAgKiDlhbbku5bnq6/liqDlhaXmlrDpgJror51cbiAgICovXG4gIE9USEVSX0NMSUVOVF9KT0lORUQgPSAxMTEzLFxuICAvKipcbiAgICog5YW25LuW56uv5bey5Zyo5YW25LuW6YCa6K+d5Lit77yI5bex56uvIEExIOWFtuS7luerr+ato+WcqOmAmuivneS4re+8jEEyIOWkmuerr+WPiOWKoOWFpeaIv+mXtOiiq+aLkue7neWQjumAmuivnee7k+adnyBBMiDnmoTnirbmgIHvvIlcbiAgICovXG4gIE9USEVSX0NMSUVOVF9JTl9ST09NID0gMTExNCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+W3suaMguaWrVxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0hBTkdVUCA9IDExNTEsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfliqDlhaXmiL/pl7TlpLHotKVcbiAgICovXG4gIFJFTU9URV9KT0lOX1JUQ19FUlJPUiA9IDEyMDUsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLflj5HluIPotYTmupDlpLHotKVcbiAgICovXG4gIFJFTU9URV9QVUJMSVNIX0VSUk9SID0gMTIwNixcbiAgLyoqXG4gICAqIOi/nOerr+eUqOaIt+iuoumYhei1hOa6kOWksei0pVxuICAgKi9cbiAgUkVNT1RFX1NVQlNDUklCRV9FUlJPUiA9IDEyMDcsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLflt7Looqso5bCB56aBKeemgeatoumAmuivnVxuICAgKi9cbiAgUkVNT1RFX0tJQ0tFRF9CWV9TRVJWRVIgPSAxMjA5LFxuICAvKipcbiAgICog6L+c56uv55So5oi3VURQ6L+e5o6l5pat5byAXG4gICAqL1xuICBSRU1PVEVfQ09OTkVDVElPTl9FUlJPUiA9IDEyMTAsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfpgIDlh7pJTeeZu+W9lVxuICAgKi9cbiAgUkVNT1RFX0xPR09VVCA9IDEyMTEsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfooqvlhbbku5bnq6/nmbvlvZXmjKTkuIvnur9cbiAgICovXG4gIFJFTU9URV9PVEhFUl9DTElFTlRfTE9HSU4gPSAxMjEyLFxuICAvKipcbiAgICog6L+c56uv55So5oi36KKr5YW25LuW56uv5Yqg5YWl5oi/6Ze0IGpvaW5Sb29tIOi4ouWHulxuICAgKi9cbiAgUkVNT1RFX09USEVSX0pPSU5FRF9SVEMgPSAxMjEzLFxuICAvKipcbiAgICog6L+c56uv55So5oi355qE5YW25LuW56uv5bey57uP5Zyo5oi/6Ze05Lit77yM5LiN5YWB6K64IGpvaW5Sb29tIOi/m+ihjOmfs+inhumikemAmuivnVxuICAgKi9cbiAgUkVNT1RFX09USEVSX0NMSUVOVF9JTl9SVEMgPSAxMjE0XG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgaXNOdW1iZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBJQXVkaW9Db25maWcgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICBwcml2YXRlIF9hdWRpb0NvbmZpZzogSUF1ZGlvQ29uZmlnID0ge31cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIOaMh+Wumum7mOiupOm6puWFi+mjjlxuICAgKiBtaWNyb3Bob25lSWQg5Y+W5YC85Y+v5Y+C6ICDIGh0dHBzOi8vZG9jLnJvbmdjbG91ZC5jbi9ydGMvV2ViLzUuWC9kZXZpY2UjJUU4JThFJUI3JUU1JThGJTk2JUU5JUJBJUE2JUU1JTg1JThCJUU5JUEzJThFJUU4JUFFJUJFJUU1JUE0JTg3JUU1JTg4JTk3JUU4JUExJUE4XG4gICAqL1xuICBzZXREZWZhdWx0TWljcm9waG9uZUlkKG1pY3JvcGhvbmVJZDogc3RyaW5nKTogUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLm1pY3JvcGhvbmVJZCA9IG1pY3JvcGhvbmVJZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7mnIDlsI/jgIHmnIDlpKfnoIHnjodcbiAgICog5Y2V5L2NIGticHNcbiAgICog5LiN6K6+572u5pe277yM5Y+W5Yqo5oCB56CB546H6K6h566X57uT5p6cXG4gICAqIEBwYXJhbSBtaW4g5pyA5bCP56CB546HXG4gICAqIEBwYXJhbSBtYXgg5pyA5aSn56CB546HXG4gICAqL1xuICBzZXRCaXRyYXRlKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IFJDQXVkaW9Db25maWdCdWlsZGVyIHtcbiAgICBpZiAoIWlzTnVtYmVyKG1pbikgfHwgIWlzTnVtYmVyKG1heCkgfHwgbWF4IDw9IDAgfHwgbWluIDw9IDAgfHwgbWF4IDwgbWluKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0FVRElPX0NPTkZJR19TRVRfQklUUkFURV9PLCBgcGFyYW1zIGVycm9yIC0+IG1heDogJHttYXh9LG1pbjogJHttaW59LCBtYXggYW5kIG1pbiBpcyBhIG51bWJlciA+IDAsIG1heCBzaG91bGQgPiBtaW5gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hdWRpb0NvbmZpZy5taW5CaXRyYXRlID0gbWluO1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLm1heEJpdHJhdGUgPSBtYXg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u6Z+z6aKR6YeH5qC3546H77yM5LiN5bu66K6u6Ieq6KGM5L+u5pS5XG4gICAqIEBwYXJhbSBzYW1wbGVSYXRlIOmHh+agt+eOh1xuICAgKi9cbiAgc2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlOiBudW1iZXIpOiBSQ0F1ZGlvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFpc051bWJlcihzYW1wbGVSYXRlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19BVURJT19DT05GSUdfU0VUX1NBTVBMRV9SQVRFX08sIGBwYXJhbXMgZXJyb3IgLT4gc2FtcGxlUmF0ZTogJHtzYW1wbGVSYXRlfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLnNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIOaehOW7uumFjee9riAqL1xuICBidWlsZCgpOiBJQXVkaW9Db25maWcge1xuICAgIHJldHVybiB0aGlzLl9hdWRpb0NvbmZpZztcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzaWNMb2dnZXIsIGlzTnVtYmVyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0ZyYW1lUmF0ZSwgUkNDYWxsUGx1c1Jlc29sdXRpb24sIElWaWRlb0NvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gIHByaXZhdGUgX3ZpZGVvQ29uZmlnOiBJVmlkZW9Db25maWcgPSB7XG4gICAgcmVzb2x1dGlvbjogUkNDYWxsUGx1c1Jlc29sdXRpb24uVzY0MF9INDgwLFxuICAgIGZyYW1lUmF0ZTogUkNDYWxsUGx1c0ZyYW1lUmF0ZS5GUFNfMTUsXG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHt9XG5cbiAgLyoqIOmSiOWvueS4jeWQjOinhumikea1geWIhuWIq+mFjee9ruW4p+eOhyAqL1xuICBzZXRGcmFtZVJhdGUoZnBzOiBSQ0NhbGxQbHVzRnJhbWVSYXRlKTogUkNWaWRlb0NvbmZpZ0J1aWxkZXIge1xuICAgIGlmICghUkNDYWxsUGx1c0ZyYW1lUmF0ZVtmcHNdKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfRlJBTUVfUkFURV9PLCBgcGFyYW1zIGVycm9yIC0+IGZwczogJHtmcHN9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcuZnJhbWVSYXRlID0gZnBzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIOmSiOWvueS4jeWQjOinhumikea1geWIhuWIq+mFjee9ruWIhui+qOeOhyAqL1xuICBzZXRWaWRlb1Jlc29sdXRpb24ocmVzb2x1dGlvbjogUkNDYWxsUGx1c1Jlc29sdXRpb24pOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFSQ0NhbGxQbHVzUmVzb2x1dGlvbltyZXNvbHV0aW9uXSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19WSURFT19DT05GSUdfU0VUX1JFU09MVVRJT05fTywgYHBhcmFtcyBlcnJvciAtPiByZXNvbHV0aW9uOiAke3Jlc29sdXRpb259YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcucmVzb2x1dGlvbiA9IHJlc29sdXRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u6buY6K6kIGNhbWVyYUlkXG4gICAqIGNhbWVyYUlkIOWPluWAvOWPr+WPguiAgyBodHRwczovL2RvYy5yb25nY2xvdWQuY24vcnRjL1dlYi81LlgvZGV2aWNlIyVFOCU4RSVCNyVFNSU4RiU5NiVFNiU5MSU4NCVFNSU4MyU4RiVFNSVBNCVCNCVFOCVBRSVCRSVFNSVBNCU4NyVFNSU4OCU5NyVFOCVBMSVBOFxuICAgKiDkvZznlKjkuo7pooTop4jlip/og73jgIHlkbzlj6vlj5bmtYHnrYlcbiAgICovXG4gIHNldERlZmF1bHRDYW1lcmFJZChjYW1lcmFJZDogc3RyaW5nKTogUkNWaWRlb0NvbmZpZ0J1aWxkZXIge1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnLmNhbWVyYUlkID0gY2FtZXJhSWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5pyA5bCP44CB5pyA5aSn56CB546HXG4gICAqIOWNleS9jSBrYnBzXG4gICAqIOS4jeiuvue9ruaXtu+8jOWPluWKqOaAgeeggeeOh+iuoeeul+e7k+aenFxuICAgKiBAcGFyYW0gbWluIOacgOWwj+eggeeOh1xuICAgKiBAcGFyYW0gbWF4IOacgOWkp+eggeeOh1xuICAgKi9cbiAgc2V0Qml0cmF0ZShtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFpc051bWJlcihtaW4pIHx8ICFpc051bWJlcihtYXgpIHx8IG1heCA8PSAwIHx8IG1pbiA8PSAwIHx8IG1heCA8IG1pbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19WSURFT19DT05GSUdfU0VUX0JJVFJBVEVfTywgYHBhcmFtcyBlcnJvciAtPiBtYXg6ICR7bWF4fSxtaW46ICR7bWlufSwgbWF4IGFuZCBtaW4gaXMgYSBudW1iZXIgPiAwLCBtYXggc2hvdWxkID4gbWluYCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fdmlkZW9Db25maWcubWluQml0cmF0ZSA9IG1pbjtcbiAgICB0aGlzLl92aWRlb0NvbmZpZy5tYXhCaXRyYXRlID0gbWF4O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g5p6E5bu66YWN572uXG4gIGJ1aWxkKCk6IElWaWRlb0NvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZGVvQ29uZmlnO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJTmF2aUluZm8sIGlzQm9vbGVhbiwgaXNOdW1iZXIsIGlzU3RyaW5nLCBpc1VuZGVmaW5lZCxcbn0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHtcbiAgSUFuZHJvaWRQdXNoQ29uZmlnLCBJUkNDYWxsUGx1c1B1c2hDb25maWcsIElpT1NQdXNoQ29uZmlnLCBSQ0NhbGxQbHVzQ29kZSwgUkNDYWxsUGx1c1JlYXNvbixcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFNlc3Npb25Vc2VyU3RhdGUnO1xuaW1wb3J0IHtcbiAgSUFjY2VwdEluZm8sIElSQ0NhbGxQbHVzQ2FsbFJlY29yZCwgSUhhbmd1cEluZm8sIElPdGhlck1lbUluZm8sIElSaW5naW5nSW5mbyxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JUkNDYWxsQ2xpZW50JztcbmltcG9ydCB7IElTdGF0dXNEb3duQ29udCwgSVN5bmNDYWxsTG9nUmVzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JU2lnbmFsVHJhbnNwb3J0ZXInO1xuXG4vKipcbiAqIGNhbGwgc2VydmVyIGxvZyDovazmjaJcbiAqL1xuZXhwb3J0IGNvbnN0IHRyYW4yQ2FsbExvZyA9IChjYWxsTG9nTGlzdDogSVN5bmNDYWxsTG9nUmVzKTogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkID0+IHtcbiAgY29uc3Qge1xuICAgIGNhbGxJZCxcbiAgICBjYWxsVHlwZSxcbiAgICBjYWxsRGlyLFxuICAgIG1lZGlhVHlwZSxcbiAgICBjYWxsaW5nVXNlcklkLFxuICAgIGNhbGxVc2VySWRzLFxuICAgIGNhbGxTdGF0dXMsXG4gICAgc2Vzc2lvblN0YXR1cyxcbiAgICBzdGFydFRpbWUsXG4gICAgZW5kVGltZSxcbiAgICBkdXJhdGlvbixcbiAgICBzeW5jVGltZSxcbiAgICBzeXNTdGF0dXMsXG4gICAgY3J0VGltZSxcbiAgfSA9IGNhbGxMb2dMaXN0O1xuICByZXR1cm4ge1xuICAgIGNhbGxJZCxcbiAgICBjYWxsVHlwZSxcbiAgICBjYWxsRGlyZWN0aW9uOiBjYWxsRGlyLFxuICAgIG1lZGlhVHlwZSxcbiAgICAvLyBpc1NlY3JldENoYXQ6IEJvb2xlYW4oc2VjcmV0Q2hhdCksXG4gICAgY2FsbGVyVXNlcklkOiBjYWxsaW5nVXNlcklkLFxuICAgIGNhbGxVc2VySWRzLFxuICAgIHNlc3Npb25TdGF0ZTogY2FsbFN0YXR1cyxcbiAgICB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMsXG4gICAgc3RhcnRUaW1lc3RhbXA6IHN0YXJ0VGltZSxcbiAgICBlbmRUaW1lc3RhbXA6IGVuZFRpbWUsXG4gICAgZHVyYXRpb24sXG4gICAgc3luY1RpbWVzdGFtcDogc3luY1RpbWUsXG4gICAgc3lzdGVtU3RhdGU6IHN5c1N0YXR1cyxcbiAgICBjcmVhdGVUaW1lc3RhbXA6IGNydFRpbWUsXG4gIH07XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElQYXJzZVN0YXR1cyB7XG4gIHJpbmdpbmdEYXRhOiBJUmluZ2luZ0luZm9bXTtcbiAgaGFuZ3VwRGF0YTogSUhhbmd1cEluZm9bXTtcbiAgYWNjZXB0RGF0YTogSUFjY2VwdEluZm9bXTtcbiAgb3RoZXJJbnZpdGVkRGF0YTogSU90aGVyTWVtSW5mb1tdO1xufVxuXG4vKipcbiAqIHBhcnNlU3RhdHVzXG4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZVN0YXR1c0RhdGEgPSAoZGF0YTogSVN0YXR1c0Rvd25Db250KTogSVBhcnNlU3RhdHVzID0+IHtcbiAgY29uc3QgeyBjYWxsSWQgfSA9IGRhdGE7XG4gIGNvbnN0IHJpbmdpbmdEYXRhOiBJUmluZ2luZ0luZm9bXSA9IFtdO1xuICBjb25zdCBoYW5ndXBEYXRhOiBJSGFuZ3VwSW5mb1tdID0gW107XG4gIGNvbnN0IGFjY2VwdERhdGE6IElBY2NlcHRJbmZvW10gPSBbXTtcbiAgY29uc3Qgb3RoZXJJbnZpdGVkRGF0YTogSU90aGVyTWVtSW5mb1tdID0gW107XG4gIGRhdGEuY2FsbFNlc3Npb25Vc2Vycy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgY29uc3QgeyB1c2VySWQsIHNlc3Npb25TdGF0dXMsIHN5c1N0YXR1cyB9ID0gaXRlbTtcbiAgICBzd2l0Y2ggKHNlc3Npb25TdGF0dXMpIHtcbiAgICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRDpcbiAgICAgICAgb3RoZXJJbnZpdGVkRGF0YS5wdXNoKHtcbiAgICAgICAgICBjYWxsSWQsXG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5SSU5HSU5HOlxuICAgICAgICAvLyDpgJrnn6Xlk43pk4NcbiAgICAgICAgcmluZ2luZ0RhdGEucHVzaCh7IGNhbGxJZCwgZnJvbVVzZXJJZDogdXNlcklkIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ09OTkVDVElORzpcbiAgICAgICAgLy8g6YCa55+l5a+55pa55bey5o6l5ZCsXG4gICAgICAgIGFjY2VwdERhdGEucHVzaCh7IGZyb21Vc2VySWQ6IHVzZXJJZCB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNBTkNFTExFRDpcbiAgICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuREVDTElORUQ6XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkVOREVEOlxuICAgICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JRExFOlxuICAgICAgICBoYW5ndXBEYXRhLnB1c2goe1xuICAgICAgICAgIGNhbGxJZCxcbiAgICAgICAgICBmcm9tVXNlcklkOiB1c2VySWQsXG4gICAgICAgICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgICAgICAgIHN5c3RlbVN0YXRlOiBzeXNTdGF0dXMsXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICByaW5naW5nRGF0YSxcbiAgICBoYW5ndXBEYXRhLFxuICAgIGFjY2VwdERhdGEsXG4gICAgb3RoZXJJbnZpdGVkRGF0YSxcbiAgfTtcbn07XG5cbi8qKlxuICog5a6D5qOA5p+l5YWD57Sg5piv5ZCm5piv6KeG6aKR6IqC54K5XG4gKiBAcGFyYW0ge2FueX0gZWxlbWVudCAtIOaCqOimgeajgOafpeeahOWFg+e0oOaYr+WQpuS4uuinhumikeWFg+e0oOOAglxuICogQHJldHVybnMg5LiA5Liq5biD5bCU5YC844CCXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVZpZGVvTm9kZU5hbWUgPSAoZWxlbWVudDogYW55KSA9PiBlbGVtZW50ICYmIGVsZW1lbnQubm9kZU5hbWUgJiYgZWxlbWVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnVklERU8nO1xuXG4vKipcbiAqIOagueaNrueUqOaIt+W9k+WJjeeahCBzeXN0ZW1TdGF0ZSDlkozmlrDkuIvlj5HnmoQgc3lzdGVtU3RhdGUs5p2l5Yik5pat5pawIHN5c3RlbVN0YXRlIOaYr+WQpuaXoOaViFxuICog5L6L77ya5b2T5YmN55So5oi35bey5ZyoIGNhbGwg5Lit77yM5Y+I5pS25Yiw5q2k55So5oi355qEIOWTjemTg+OAgei/nuaOpeS4rSDnrYlcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlU3lzU3RhdGUgPSAoY3J0U3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24sIG5ld1N0YXRlOiBSQ0NhbGxQbHVzUmVhc29uKSA9PiB7XG4gIGxldCBpc0luVmFsaWQgPSBmYWxzZTtcbiAgY29uc3QgaW52YWxpZFN0YXRlcyA9IFtcbiAgICBSQ0NhbGxQbHVzUmVhc29uLklOVklURUQsXG4gICAgUkNDYWxsUGx1c1JlYXNvbi5SSU5HSU5HLFxuICAgIFJDQ2FsbFBsdXNSZWFzb24uQlVTWUxJTkVfUklOR0lORyxcbiAgICBSQ0NhbGxQbHVzUmVhc29uLkJVU1lMSU5FX1dBSVQsXG4gICAgUkNDYWxsUGx1c1JlYXNvbi5DT05ORUNUSU5HLFxuICAgIFJDQ2FsbFBsdXNSZWFzb24uT05DQUxMLFxuICBdO1xuICBpZiAoY3J0U3RhdGUgPT09IFJDQ2FsbFBsdXNSZWFzb24uT05DQUxMICYmIGludmFsaWRTdGF0ZXMuaW5jbHVkZXMobmV3U3RhdGUpKSB7XG4gICAgaXNJblZhbGlkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gaXNJblZhbGlkO1xufTtcblxuLyoqXG4gICAqIOagueaNrueUqOaIt+W9k+WJjeeahCB1c2VyU3RhdGUg5ZKM5paw5LiL5Y+R55qEIHVzZXJTdGF0ZSzmnaXliKTmlq3mlrAgdXNlclN0YXRlIOaYr+WQpuaXoOaViFxuICAgKiDml6DmlYjnmoTnlKjmiLfnirbmgIFcbiAgICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVVc2VyU3RhdGUgPSAoY3J0U3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLCBuZXdTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUpID0+IHtcbiAgbGV0IGlzSW5WYWxpZCA9IGZhbHNlO1xuICBjb25zdCBpbnZhbGlkU3RhdGVzID0gW1xuICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQsXG4gICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuUklOR0lORyxcbiAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5CVVNZTElORV9SSU5HSU5HLFxuICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkJVU1lMSU5FX1dBSVQsXG4gICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ09OTkVDVElORyxcbiAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5PTkNBTEwsXG4gIF07XG4gIGlmIChjcnRTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuT05DQUxMICYmIGludmFsaWRTdGF0ZXMuaW5jbHVkZXMobmV3U3RhdGUpKSB7XG4gICAgaXNJblZhbGlkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gaXNJblZhbGlkO1xufTtcblxuLyoqXG4gKiDojrflj5bmjILmlq3ml7bnmoTkurrlkZjns7vnu5/nirbmgIFcbiAqIEBwYXJhbSB1c2VyU3RhdGUg5Lq65ZGY54q25oCBXG4gKiBAcGFyYW0gaXNDYWxsZWUg5piv5ZCm5piv6KKr5Y+rXG4gKiBAcmV0dXJucyDkurrlkZjns7vnu5/nirbmgIFcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEhhbmd1cFN5c3RlbVN0YXRlID0gKHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUsIGlzQ2FsbGVlOiBib29sZWFuKSA9PiB7XG4gIGxldCBzeXN0ZW1TdGF0ZTtcbiAgc3dpdGNoICh1c2VyU3RhdGUpIHtcbiAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNBTExJTkc6XG4gICAgICBzeXN0ZW1TdGF0ZSA9IFJDQ2FsbFBsdXNSZWFzb24uQ0FOQ0VMTEVEO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5SSU5HSU5HOlxuICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRDpcbiAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5ERUNMSU5FRDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ09OTkVDVElORzpcbiAgICAgIHN5c3RlbVN0YXRlID0gaXNDYWxsZWUgPyBSQ0NhbGxQbHVzUmVhc29uLkRFQ0xJTkVEIDogUkNDYWxsUGx1c1JlYXNvbi5DQU5DRUxMRUQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk9OQ0FMTDpcbiAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5FTkRFRDtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBzeXN0ZW1TdGF0ZTtcbn07XG5cbi8qKlxuICog5Yik5pat5piv5ZCm5byA5aeL6Z+z6KeG6aKR5pyN5YqhXG4gKi9cbmV4cG9ydCBjb25zdCBpc1N1cHBvcnRNZWRpYVNlcnZlciA9IChuYXZpSW5mbzogSU5hdmlJbmZvKSA9PiB7XG4gIGNvbnN0IHsgdm9pcENhbGxJbmZvIH0gPSBuYXZpSW5mbztcbiAgaWYgKCF2b2lwQ2FsbEluZm8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB7IHN0cmF0ZWd5IH0gPSBKU09OLnBhcnNlKHZvaXBDYWxsSW5mbyk7XG4gIGlmIChzdHJhdGVneSAhPT0gMSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQml0cmF0ZSA9IChtaW5CaXRyYXRlPzogbnVtYmVyLCBtYXhCaXRyYXRlPzogbnVtYmVyKSA9PiB7XG4gIGlmIChtaW5CaXRyYXRlIHx8IG1pbkJpdHJhdGUgPT09IDApIHtcbiAgICBpZiAoIWlzTnVtYmVyKG1pbkJpdHJhdGUpIHx8IG1pbkJpdHJhdGUgPD0gMCkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IsIGVycm9yTXNnOiBgcGFyYW1zIGVycm9yIC0+IG1pbkJpdHJhdGU6IGEgbnVtYmVyIG9mID4gMCwgdmFsdWU6ICR7bWluQml0cmF0ZX1gIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKG1heEJpdHJhdGUgfHwgbWF4Qml0cmF0ZSA9PT0gMCkge1xuICAgIGlmICghaXNOdW1iZXIobWF4Qml0cmF0ZSkgfHwgbWF4Qml0cmF0ZSA8PSAwKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiwgZXJyb3JNc2c6IGBwYXJhbXMgZXJyb3IgLT4gbWF4Qml0cmF0ZTogYSBudW1iZXIgb2YgPiAwLCB2YWx1ZTogJHttYXhCaXRyYXRlfWAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAobWluQml0cmF0ZSAmJiBtYXhCaXRyYXRlICYmIG1heEJpdHJhdGUgPCBtaW5CaXRyYXRlKSB7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IsIGVycm9yTXNnOiBgcGFyYW1zIGVycm9yIC0+IG1heEJpdHJhdGU6ICR7bWF4Qml0cmF0ZX0sIG1pbkJpdHJhdGU6ICR7bWluQml0cmF0ZX0sIG1heEJpdHJhdGUgc2hvdWxkID4gbWluQml0cmF0ZWAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyVmlkZW9WaWV3SW5mbyA9ICh1c2VyVmlld01hcDogeyBbdXNlcklkOiBzdHJpbmddOiB7IHZpZGVvVmlldzogSFRNTFZpZGVvRWxlbWVudCwgaXNUaW55OiBib29sZWFuIH0gfSkgPT4ge1xuICBjb25zdCB1c2VyVmlld01hcEluZm8gPSBbXTtcbiAgZm9yIChjb25zdCB1c2VySWQgaW4gdXNlclZpZXdNYXApIHtcbiAgICBjb25zdCB7IHZpZGVvVmlldywgaXNUaW55IH0gPSB1c2VyVmlld01hcFt1c2VySWRdO1xuICAgIHVzZXJWaWV3TWFwSW5mby5wdXNoKHtcbiAgICAgIHVzZXJJZCxcbiAgICAgIHZpZGVvVmlldzogdmlkZW9WaWV3Lm5vZGVOYW1lLFxuICAgICAgaXNUaW55LFxuICAgIH0pO1xuICB9XG4gIHJldHVybiB1c2VyVmlld01hcEluZm87XG59O1xuXG4vKipcbiAqIOeUn+aIkCBwdXNoQ29uZmlncyBKU09OXG4gKiBAZGVzY3JpcHRpb25cbiAqIOS4jiBTZXJ2ZXIg57qm5a6a5LiA6Ie077yMIHRocmVhZElk44CBYXBuc0NvbGxhcHNlSWTjgIFjaGFubmVsSWRNaeOAgWNoYW5uZWxJZEhX44CBY2hhbm5lbElkT1BQT+OAgXR5cGVWaXZvIOaXoOWAvOaXtuWPr+S8oOepuuWtl+espuS4slxuKi9cbmNvbnN0IHB1c2hDb25maWdzVG9KU09OID0gKGlPU0NvbmZpZzogSWlPU1B1c2hDb25maWcgPSB7fSwgYW5kcm9pZENvbmZpZzogSUFuZHJvaWRQdXNoQ29uZmlnID0ge30sIGNsaWVudENhbGxJZDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3Qge1xuICAgIHRocmVhZElkLCBhcG5zQ29sbGFwc2VJZCwgcmljaE1lZGlhVXJpLFxuICB9ID0gaU9TQ29uZmlnO1xuICBjb25zdCB7XG4gICAgY2hhbm5lbElkTWksIGNoYW5uZWxJZEhXLCBjaGFubmVsSWRPUFBPLCB0eXBlVml2bywgZmNtQ2hhbm5lbElkLCBmY21Db2xsYXBzZUtleSwgZmNtSW1hZ2VVcmwsXG4gICAgbWlMYXJnZUljb25VcmwsIGltcG9ydGFuY2VIVywgY2F0ZWdvcnlIVywgaW1hZ2VVcmxIVywgY2F0ZWdvcnlWaXZvLCBpbXBvcnRhbmNlSG9ub3IsIGltYWdlVXJsSG9ub3IsXG4gIH0gPSBhbmRyb2lkQ29uZmlnO1xuICBjb25zdCBBUE5TOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSA9IHt9O1xuICB0aHJlYWRJZCAmJiAoQVBOU1sndGhyZWFkLWlkJ10gPSB0aHJlYWRJZCk7XG4gIEFQTlNbJ2FwbnMtY29sbGFwc2UtaWQnXSA9IGFwbnNDb2xsYXBzZUlkIHx8IGNsaWVudENhbGxJZDtcbiAgcmljaE1lZGlhVXJpICYmIChBUE5TLnJpY2hNZWRpYVVyaSA9IHJpY2hNZWRpYVVyaSk7XG5cbiAgY29uc3QgSFc6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gIGNoYW5uZWxJZEhXICYmIChIVy5jaGFubmVsSWQgPSBjaGFubmVsSWRIVyk7XG4gIGltYWdlVXJsSFcgJiYgKEhXLmltYWdlID0gaW1hZ2VVcmxIVyk7XG4gIGNhdGVnb3J5SFcgJiYgKEhXLmNhdGVnb3J5ID0gY2F0ZWdvcnlIVyk7XG4gIEhXLmltcG9ydGFuY2UgPSBpbXBvcnRhbmNlSFcgfHwgJ05PUk1BTCc7XG5cbiAgY29uc3QgcHVzaENvbmdmaWdzOiBhbnkgPSBbXG4gICAge1xuICAgICAgSFcsXG4gICAgfSxcbiAgICB7XG4gICAgICBBUE5TLFxuICAgIH0sXG4gIF07XG5cbiAgbGV0IEZDTToge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIGlmIChmY21Db2xsYXBzZUtleSB8fCBmY21JbWFnZVVybCB8fCBmY21DaGFubmVsSWQpIHtcbiAgICBGQ00gPSB7fTtcbiAgICBmY21Db2xsYXBzZUtleSAmJiAoRkNNLmNvbGxhcHNlX2tleSA9IGZjbUNvbGxhcHNlS2V5KTtcbiAgICBmY21JbWFnZVVybCAmJiAoRkNNLmltYWdlVXJsID0gZmNtSW1hZ2VVcmwpO1xuICAgIGZjbUNoYW5uZWxJZCAmJiAoRkNNLmNoYW5uZWxJZCA9IGZjbUNoYW5uZWxJZCk7XG4gICAgcHVzaENvbmdmaWdzWzBdLkZDTSA9IEZDTTtcbiAgfVxuXG4gIGxldCBNSToge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIGlmIChjaGFubmVsSWRNaSB8fCBtaUxhcmdlSWNvblVybCkge1xuICAgIE1JID0ge307XG4gICAgY2hhbm5lbElkTWkgJiYgKE1JLmNoYW5uZWxJZCA9IGNoYW5uZWxJZE1pKTtcbiAgICBtaUxhcmdlSWNvblVybCAmJiAoTUkubGFyZ2VfaWNvbl91cmkgPSBtaUxhcmdlSWNvblVybCk7XG4gICAgcHVzaENvbmdmaWdzWzBdLk1JID0gTUk7XG4gIH1cblxuICBsZXQgT1BQTzoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIGlmIChjaGFubmVsSWRPUFBPKSB7XG4gICAgT1BQTyA9IHt9O1xuICAgIE9QUE8uY2hhbm5lbElkID0gY2hhbm5lbElkT1BQTztcbiAgICBwdXNoQ29uZ2ZpZ3NbMF0uT1BQTyA9IE9QUE87XG4gIH1cblxuICBsZXQgVklWTzoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIGlmICh0eXBlVml2byB8fCBjYXRlZ29yeVZpdm8pIHtcbiAgICBWSVZPID0ge307XG4gICAgdHlwZVZpdm8gJiYgKFZJVk8uY2xhc3NpZmljYXRpb24gPSB0eXBlVml2byk7XG4gICAgY2F0ZWdvcnlWaXZvICYmIChWSVZPLmNhdGVnb3J5ID0gY2F0ZWdvcnlWaXZvKTtcbiAgICBwdXNoQ29uZ2ZpZ3NbMF0uVklWTyA9IFZJVk87XG4gIH1cblxuICBsZXQgSE9OT1I6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuICBpZiAoaW1wb3J0YW5jZUhvbm9yIHx8IGltYWdlVXJsSG9ub3IpIHtcbiAgICBIT05PUiA9IHt9O1xuICAgIGltcG9ydGFuY2VIb25vciAmJiAoSE9OT1IuaW1wb3J0YW5jZSA9IGltcG9ydGFuY2VIb25vcik7XG4gICAgaW1hZ2VVcmxIb25vciAmJiAoSE9OT1IuaW1hZ2UgPSBpbWFnZVVybEhvbm9yKTtcbiAgICBwdXNoQ29uZ2ZpZ3NbMF0uSE9OT1IgPSBIT05PUjtcbiAgfVxuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShwdXNoQ29uZ2ZpZ3MpO1xufTtcblxuLyoqXG4gKiDmioogcHVzaENvbmZpZyDovazljJbkuLrmnI3liqHnq6/pnIDopoHnmoTmlbDmja5cbiAqL1xuZXhwb3J0IGNvbnN0IHRyYW5zU2VydmVyUHVzaEV4dCA9IChwdXNoQ29uZmlnOiBJUkNDYWxsUGx1c1B1c2hDb25maWcsIGNsaWVudENhbGxJZDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBwdXNoVGl0bGUgPSAnJywgaU9TQ29uZmlnLCBhbmRyb2lkQ29uZmlnLCBkaXNhYmxlUHVzaFRpdGxlLCB0ZW1wbGF0ZUlkLFxuICB9ID0gcHVzaENvbmZpZztcbiAgY29uc3QgcHVzaEV4dDogYW55ID0ge1xuICAgIHB1c2hDb25maWdzOiBwdXNoQ29uZmlnc1RvSlNPTihpT1NDb25maWcsIGFuZHJvaWRDb25maWcsIGNsaWVudENhbGxJZCksXG4gIH07XG4gIGlzQm9vbGVhbihkaXNhYmxlUHVzaFRpdGxlKSAmJiAocHVzaEV4dC5kaXNhYmxlVGl0bGUgPSBkaXNhYmxlUHVzaFRpdGxlKTtcbiAgcHVzaFRpdGxlICYmIChwdXNoRXh0LnRpdGxlID0gcHVzaFRpdGxlKTtcbiAgdGVtcGxhdGVJZCAmJiAocHVzaEV4dC50ZW1wbGF0ZUlkID0gdGVtcGxhdGVJZCk7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShwdXNoRXh0KTtcbn07XG5cbi8qKlxuICog5qCh6aqMIHB1c2hDb25maWdcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaENvbmZpZyA9IChwdXNoQ29uZmlnOiBJUkNDYWxsUGx1c1B1c2hDb25maWcpID0+IHtcbiAgY29uc3QgcHVzaENvbmZpZ0tleXMgPSBbJ3B1c2hUaXRsZScsICdpT1NDb25maWcnLCAnYW5kcm9pZENvbmZpZycsICdkaXNhYmxlUHVzaFRpdGxlJywgJ3RlbXBsYXRlSWQnXTtcbiAgY29uc3Qga2V5SXNSaWdodCA9IE9iamVjdC5rZXlzKHB1c2hDb25maWcpLmV2ZXJ5KChrZXkpID0+IHB1c2hDb25maWdLZXlzLmluY2x1ZGVzKGtleSkpO1xuICBpZiAoIWtleUlzUmlnaHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IsXG4gICAgICBlcnJvck1zZzogYHJpZ2h0IGtleTogJHtwdXNoQ29uZmlnS2V5cy5qb2luKCcsJyl9YCxcbiAgICB9O1xuICB9XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHB1c2hDb25maWdLZXlzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGtleSA9IHB1c2hDb25maWdLZXlzW2luZGV4XTtcbiAgICAvKipcbiAgICAgKiDmoKHpqowgYm9vbGVhbiDnsbvlnotcbiAgICAgKi9cbiAgICBpZiAoa2V5ID09PSAnZGlzYWJsZVB1c2hUaXRsZScpIHtcbiAgICAgIGlmICghaXNVbmRlZmluZWQocHVzaENvbmZpZ1trZXldKSAmJiAhaXNCb29sZWFuKHB1c2hDb25maWdba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUixcbiAgICAgICAgICBlcnJvck1zZzogYCR7a2V5fSB0eXBlIGlzIGJvb2xlYW5gLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncHVzaFRpdGxlJ1xuICAgICAgfHwga2V5ID09PSAndGVtcGxhdGVJZCcpIHtcbiAgICAgIC8qKlxuICAgICAgICog5qCh6aqMIHN0cmluZyDnsbvlnotcbiAgICAgICAqL1xuICAgICAgaWYgKHB1c2hDb25maWdba2V5XSAmJiAhaXNTdHJpbmcocHVzaENvbmZpZ1trZXldKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgICAgIGVycm9yTXNnOiBgJHtrZXl9IHR5cGUgaXMgc3RyaW5nYCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgeyBpT1NDb25maWcsIGFuZHJvaWRDb25maWcgfSA9IHB1c2hDb25maWc7XG5cbiAgLyoqXG4gICAqIOagoemqjCBpT1NDb25maWdcbiAgICovXG4gIGNvbnN0IHZhbGlkYXRlSU9TQ29uZmlnUmVzID0gdmFsaWRhdGVJT1NDb25maWcoaU9TQ29uZmlnIHx8IHt9KTtcbiAgaWYgKHZhbGlkYXRlSU9TQ29uZmlnUmVzLmNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVJT1NDb25maWdSZXM7XG4gIH1cblxuICAvKipcbiAgICog5qCh6aqMIGFuZHJvaWRDb25maWdcbiAgICovXG4gIGNvbnN0IHZhbGlkYXRlQW5kcm9pZENvbmZpZ1JlcyA9IHZhbGlkYXRlQW5kcm9pZENvbmZpZyhhbmRyb2lkQ29uZmlnIHx8IHt9KTtcbiAgaWYgKHZhbGlkYXRlQW5kcm9pZENvbmZpZ1Jlcy5jb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlQW5kcm9pZENvbmZpZ1JlcztcbiAgfVxuXG4gIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbn07XG5cbmNvbnN0IHZhbGlkYXRlSU9TQ29uZmlnID0gKGlPU0NvbmZpZzogSWlPU1B1c2hDb25maWcpID0+IHtcbiAgY29uc3QgeyB0aHJlYWRJZCwgcmljaE1lZGlhVXJpIH0gPSBpT1NDb25maWcgfHwge307XG4gIGlmICh0aHJlYWRJZCAmJiAhaXNTdHJpbmcodGhyZWFkSWQpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgZXJyb3JNc2c6ICdpT1NDb25maWcudGhyZWFkSWQgdHlwZSBpcyBzdHJpbmcnLFxuICAgIH07XG4gIH1cblxuICBpZiAocmljaE1lZGlhVXJpICYmICFpc1N0cmluZyhyaWNoTWVkaWFVcmkpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgZXJyb3JNc2c6ICdpT1NDb25maWcucmljaE1lZGlhVXJpIHR5cGUgaXMgc3RyaW5nJyxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbn07XG5cbmNvbnN0IHZhbGlkYXRlQW5kcm9pZENvbmZpZyA9IChhbmRyb2lkQ29uZmlnOiBhbnkpID0+IHtcbiAgY29uc3QgYW5kcm9pZENvbmZpZ0tleXMgPSBbJ2NoYW5uZWxJZE1pJywgJ21pTGFyZ2VJY29uVXJsJywgJ2NoYW5uZWxJZEhXJywgJ2NhdGVnb3J5SFcnLCAnaW1wb3J0YW5jZUhXJywgJ2ltYWdlVXJsSFcnLCAnY2hhbm5lbElkT1BQTycsICd0eXBlVml2bycsICdjYXRlZ29yeVZpdm8nLCAnZmNtQ2hhbm5lbElkJywgJ2ZjbUNvbGxhcHNlS2V5JywgJ2ZjbUltYWdlVXJsJywgJ2ltcG9ydGFuY2VIb25vcicsICdpbWFnZVVybEhvbm9yJ107XG4gIGNvbnN0IGtleUlzUmlnaHQgPSBPYmplY3Qua2V5cyhhbmRyb2lkQ29uZmlnKS5ldmVyeSgoa2V5KSA9PiBhbmRyb2lkQ29uZmlnS2V5cy5pbmNsdWRlcyhrZXkpKTtcbiAgaWYgKCFrZXlJc1JpZ2h0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgZXJyb3JNc2c6IGByaWdodCBrZXk6ICR7YW5kcm9pZENvbmZpZ0tleXMuam9pbignLCcpfWAsXG4gICAgfTtcbiAgfVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhbmRyb2lkQ29uZmlnS2V5cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBrZXkgPSBhbmRyb2lkQ29uZmlnS2V5c1tpbmRleF07XG4gICAgaWYgKGtleSA9PT0gJ2ltcG9ydGFuY2VIVycgfHwga2V5ID09PSAnaW1wb3J0YW5jZUhvbm9yJykge1xuICAgICAgaWYgKGFuZHJvaWRDb25maWdba2V5XSAmJiBhbmRyb2lkQ29uZmlnW2tleV0gIT09ICdMT1cnICYmIGFuZHJvaWRDb25maWdba2V5XSAhPT0gJ05PUk1BTCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUixcbiAgICAgICAgICBlcnJvck1zZzogYGFuZHJvaWRDb25maWcuJHtrZXl9IHZhbHVlIGlzIE5PUk1BTHxMT1dgLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYW5kcm9pZENvbmZpZ1trZXldICYmICFpc1N0cmluZyhhbmRyb2lkQ29uZmlnW2tleV0pKSB7XG4gICAgICAvKipcbiAgICAgICAqIOagoemqjCBzdHJpbmcg57G75Z6LXG4gICAgICAgKi9cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgICBlcnJvck1zZzogYGFuZHJvaWRDb25maWcuJHtrZXl9IHR5cGUgaXMgc3RyaW5nYCxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCeXRlTGVuZ3RoID0gKHN0cjogc3RyaW5nLCBjaGFyc2V0OiBzdHJpbmcgPSAndXRmLTgnKSA9PiB7XG4gIGxldCB0b3RhbCA9IDA7XG4gIGlmIChjaGFyc2V0ID09PSAndXRmLTE2Jykge1xuICAgIHRvdGFsID0gY2FsY3VsYXRlVVRGMTZCeXRlTGVuZ3RoKHN0cik7XG4gIH0gZWxzZSB7XG4gICAgdG90YWwgPSBjYWxjdWxhdGVVVEY4Qnl0ZUxlbmd0aChzdHIpO1xuICB9XG4gIHJldHVybiB0b3RhbDtcbn07XG5cbmNvbnN0IGNhbGN1bGF0ZVVURjE2Qnl0ZUxlbmd0aCA9IChzdHI6IHN0cmluZykgPT4ge1xuICBsZXQgdG90YWwgPSAwOyBsZXQgY2hhdENvZGU6IG51bWJlcjtcbiAgZm9yIChsZXQgaSA9IDAsIG1heCA9IHN0ci5sZW5ndGg7IGkgPCBtYXg7IGkrKykge1xuICAgIGNoYXRDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGNoYXRDb2RlIDw9IDB4ZmZmZikge1xuICAgICAgdG90YWwgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgdG90YWwgKz0gNDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvdGFsO1xufTtcblxuY29uc3QgY2FsY3VsYXRlVVRGOEJ5dGVMZW5ndGggPSAoc3RyOiBzdHJpbmcpID0+IHtcbiAgbGV0IHRvdGFsID0gMDsgbGV0IGNoYXRDb2RlOiBudW1iZXI7XG4gIGZvciAobGV0IGkgPSAwLCBtYXggPSBzdHIubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHtcbiAgICBjaGF0Q29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjaGF0Q29kZSA8IDB4MDA3Zikge1xuICAgICAgdG90YWwgKz0gMTtcbiAgICB9IGVsc2UgaWYgKGNoYXRDb2RlIDw9IDB4MDdmZikge1xuICAgICAgdG90YWwgKz0gMjtcbiAgICB9IGVsc2UgaWYgKGNoYXRDb2RlIDw9IDB4ZmZmZikge1xuICAgICAgdG90YWwgKz0gMztcbiAgICB9IGVsc2Uge1xuICAgICAgdG90YWwgKz0gNDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvdGFsO1xufTtcbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnIHtcbiAgLyoqXG4gICAqIOWPkei1t+mAmuivnVxuICAgKi9cbiAgTF9RU19TVEFSVF9DQUxMX1MgPSAnQ2FsbC1zdGFydC1TJyxcbiAgLyoqXG4gICAqIOaOpeWQrOmAmuivnVxuICAgKi9cbiAgTF9RU19BQ0NFUFRfQ0FMTF9TID0gJ0NhbGwtYWNjZXB0LVMnLFxuICAvKipcbiAgICog5oyC5pat6YCa6K+dXG4gICAqL1xuICBMX1FTX0hBTkdVUF9DQUxMX1MgPSAnQ2FsbC1oYW5ndXAtUycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror51cbiAgICovXG4gIExfUVNfUkVDRUlWRV9DQUxMX1MgPSAnQ2FsbC1yZWN2LVMnLFxuICAvKipcbiAgICog5byC5bi45oyC5patXG4gICAqL1xuICBMX1FTX0FCTk9STUFMX0hBTkdVUF9TID0gJ0NhbGwtaW50ZXJydXB0LVMnXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgUGx1Z2luQ29udGV4dCB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lDYWxsUGx1c1N0YXRpc3RpY3MnO1xuaW1wb3J0IHtcbiAgUkNDYWxsUGx1c01lZGlhVHlwZSwgUkNDYWxsUGx1c1Nlc3Npb24sIFJDQ2FsbFBsdXNUeXBlLFxufSBmcm9tICcuLi9hcGkvaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ0NhbGxQTHVzU3RhdGlzdGljcyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUGx1Z2luQ29udGV4dCxcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgcmVwb3J0U3RhdGlzdGljc0RhdGEoXG4gICAgdGFnOiBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyxcbiAgICBjb2RlOiBudW1iZXIsXG4gICAgc3RhcnRUaW1lOiBudW1iZXIsXG4gICAgc2Vzc2lvbjogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsLFxuICAgIGNsaWVudENhbGxJZD86IHN0cmluZyxcbiAgICBpbnZpdGVTb3VyY2U/OiBSQ0NhbGxQbHVzSW52aXRlU291cmNlIHwgbnVsbCxcbiAgICBleHRyYT86IHtcbiAgICAgIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgICAgIGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSxcbiAgICAgIGNhbGxJZDogc3RyaW5nLFxuICAgIH0sXG4gICkge1xuICAgIGNvbnN0IG5vd1RpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB7IG1lZGlhVHlwZSwgY2FsbFR5cGUsIGNhbGxJZCB9ID0gc2Vzc2lvbiA/IHsgbWVkaWFUeXBlOiBzZXNzaW9uLmdldE1lZGlhVHlwZSgpLCBjYWxsVHlwZTogc2Vzc2lvbi5nZXRDYWxsVHlwZSgpLCBjYWxsSWQ6IHNlc3Npb24uZ2V0Q2FsbElkKCkgfSA6IGV4dHJhITtcbiAgICBjb25zdCBjb21tb25EYXRhID0ge1xuICAgICAgY3I6ICd1bmtub3duJyxcbiAgICAgIG5ldDogJ3Vua25vd24nLFxuICAgICAgY29kOiBjb2RlLFxuICAgICAgbXRwOiBtZWRpYVR5cGUsXG4gICAgICBjdHA6IGNhbGxUeXBlLFxuICAgICAgY2lkOiBjYWxsSWQsXG4gICAgICB0aW1lOiBub3dUaW1lLFxuICAgICAgdWlkOiB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLFxuICAgIH07XG5cbiAgICBjbGllbnRDYWxsSWQgJiYgT2JqZWN0LmFzc2lnbihjb21tb25EYXRhLCB7IGNjaWQ6IGNsaWVudENhbGxJZCB9KTtcblxuICAgIGxldCBkYXRhID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOWRvOWPq1xuICAgICAgICovXG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfUkVDRUlWRV9DQUxMX1M6XG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgLi4uY29tbW9uRGF0YSxcbiAgICAgICAgICByZjogaW52aXRlU291cmNlLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIC8qKlxuICAgICAgICog5byC5bi45oyC5patXG4gICAgICAgKi9cbiAgICAgIGNhc2UgUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19BQk5PUk1BTF9IQU5HVVBfUzpcbiAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICAuLi5jb21tb25EYXRhLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlj5HotbfjgIHmjqXlkKzjgIHmjILmlq3pgJror51cbiAgICAgICAgICovXG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgLi4uY29tbW9uRGF0YSxcbiAgICAgICAgICBkdXI6IG5vd1RpbWUgLSBzdGFydFRpbWUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ0wtY2FsbC1wbHVzLXN0YXRpc3RpYycsIEpTT04uc3RyaW5naWZ5KGRhdGEpLCB0YWcpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLl9fc3RhdGlzdGljcyh0YWcsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgfVxufVxuIiwiLyoqXG4gKiDlr7nor53liqjkvZxcbiAqL1xuZXhwb3J0IGVudW0gRGlhbG9nQWN0aW9uIHtcbiAgLyoqXG4gICAqIOivt+axglxuICAgKi9cbiAgUkVRVUVTVCA9ICdyZXF1ZXN0JyxcbiAgLyoqXG4gICAqIOaOpeWPl1xuICAgKi9cbiAgQUNDRVBUID0gJ2FjY2VwdCcsXG4gIC8qKlxuICAgKiDmi5Lnu51cbiAgICovXG4gIFJFRlVTRSA9ICdyZWZ1c2UnLFxuICAvKipcbiAgICog6K+35rGC5Y+W5raIXG4gICAqL1xuICBDQU5DRUwgPSAnY2FuY2VsJyxcbiAgLyoqXG4gICAqIOmAmuefpVxuICAgKi9cbiAgTk9USUNFID0gJ25vdGljZScsXG4gIC8qKlxuICAgKiDotoXml7ZcbiAgICovXG4gIFRJTUVPVVQgPSAndGltZW91dCdcbn1cbiIsIi8qKlxuICog5a+56K+d57G75Z6LXG4gKi9cbmV4cG9ydCBlbnVtIERpYWxvZ1R5cGUge1xuICBTV0lUQ0hfTUVESUFfVFlQRSA9IDFcbn1cbiIsIi8qKlxuICog6YCa6K+d6aKd5aSW57G75Z6L77yI56e75Yqo56uv54m55pyJ77yJXG4gKi9cbmV4cG9ydCBlbnVtIFNlY3JldENhbGxUeXBlIHtcbiAgLyoqXG4gICAqIOaZrumAmumAmuivnVxuICAgKi9cbiAgTk9STUFMLFxuICAvKipcbiAgICog5a+G6IGKXG4gICAqL1xuICBTRUNSRVRcbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWFsb2dBY3Rpb24gfSBmcm9tICcuLi9lbnVtcy9EaWFsb2dBY3Rpb24nO1xuaW1wb3J0IHsgUkNDYWxsUGx1c01lZGlhVHlwZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NhbGxTdGF0ZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzVHlwZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxTZXNzaW9uVXNlclN0YXRlJztcbmltcG9ydCB7IElTZXNzaW9uVXNlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyB2YWxpZGF0ZVN5c1N0YXRlLCB2YWxpZGF0ZVVzZXJTdGF0ZSB9IGZyb20gJy4uL3V0aWxzL2hlbHBlcic7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlYXNvbiB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzUmVhc29uJztcblxuZXhwb3J0IGVudW0gQ2FsbFRpbWVyRXZlbnRUeXBlIHtcbiAgSU5WSVRFUiA9ICdpbnZpdGVyJyxcbiAgSU5WSVRFRSA9ICdpbnZpdGVlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElPbGREaWFsb2dEYXRhe1xuICB0cmFuc2FjdGlvbklkPzogc3RyaW5nO1xuICBhY3Rpb246IERpYWxvZ0FjdGlvbjtcbiAgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlO1xufVxuXG4vKipcbiAqIFNESyDlhoXpg6jkvb/nlKggU2Vzc2lvbiDlrp7kvotcbiAqL1xuZXhwb3J0IGNsYXNzIFJDQ2FsbElubmVyU2Vzc2lvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiDor7fmsYLmm7TmlrDnmoQgbWVkaWFUeXBlXG4gICAqL1xuICBwcml2YXRlIF9yZXFNZWRpYVR5cGUhOiBSQ0NhbGxQbHVzTWVkaWFUeXBlIHwgbnVsbFxuXG4gIC8qKlxuICAgKiDpgoDor7fogIXotoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX2ludml0ZXJUaW1lcklkITogbnVtYmVyXG5cbiAgLyoqXG4gICAqIOiiq+mCgOivt+iAhei2heaXtuiuoeaXtuWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfaW52aXRlZVRpbWVySWQhOiBudW1iZXJcblxuICAvKipcbiAgICog5b2T5YmNIHNlc3Npb24g5Lq65ZGY5L+h5oGv5YiX6KGoXG4gICAqL1xuICAvLyBwcml2YXRlIF9jYWxsVXNlcnM6IElTZXNzaW9uVXNlcltdID0gW11cblxuICAvKipcbiAgICog5penIGRpYWxvZyDmlbDmja7vvIznlKjkuo7lr7nmr5RcbiAgICovXG4gIHByaXZhdGUgX29sZERpYWxvZ0RhdGEhOiBJT2xkRGlhbG9nRGF0YVxuXG4gIC8qKlxuICAgKiDorrDlvZXmmK/lkKbmnKzlnLDmnInmjILmlq1cbiAgICovXG4gIHByaXZhdGUgaXNMb2NhbENsaWVudEhhbmd1cDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOaehOmAoOWZqFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogQ2FsbCBJRFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIHNlc3Npb24g54q25oCBXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc3RhdGU6IFJDQ2FsbFBsdXNDYWxsU3RhdGUsXG4gICAgLyoqXG4gICAgICog6YCa6K+d57G75Z6LXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2FsbFR5cGU6IFJDQ2FsbFBsdXNUeXBlLFxuICAgIC8qKlxuICAgICAqIOmAmuivneWqkuS9k+exu+Wei1xuICAgICAqL1xuICAgIHByaXZhdGUgX21lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgICAvKipcbiAgICAgKiBzZXNzaW9uIOWRvOWPq+WPkei1t+iAhVxuICAgICAqL1xuICAgIHByaXZhdGUgX3N0YXJ0Q2FsbGVySWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiDmnKzmrKEgc2Vzc2lvbiDnmoTpgoDor7fogIVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jYWxsZXJJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIOW9k+WJjSBzZXNzaW9uIOS6uuWRmOS/oeaBr+WIl+ihqFxuICAgICAqL1xuICAgIHByaXZhdGUgX2NhbGxVc2VyczogSVNlc3Npb25Vc2VyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgQ2FsbElEXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FsbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bnirbmgIFcbiAgICovXG4gIHB1YmxpYyBnZXRTZXNzaW9uU3RhdGUoKTogUkNDYWxsUGx1c0NhbGxTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneexu+Wei1xuICAgKi9cbiAgcHVibGljIGdldENhbGxUeXBlKCk6IFJDQ2FsbFBsdXNUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbFR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5aqS5L2T57G75Z6LXG4gICAqL1xuICBwdWJsaWMgZ2V0TWVkaWFUeXBlKCk6IFJDQ2FsbFBsdXNNZWRpYVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9tZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIHNlc3Npb24g5Y+R6LW36ICFXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhcnRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGFydENhbGxlcklkO1xuICB9XG5cbiAgLyoqXG4gICAqIOacrOasoSBzZXNzaW9uIOmCgOivt+iAhVxuICAgKi9cbiAgcHVibGljIGdldENhbGxlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxlcklkO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBzZXNzaW9uIHVzZXIgbGlzdFxuICAgKi9cbiAgcHVibGljIGdldFVzZXJMaXN0KCk6IElTZXNzaW9uVXNlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbFVzZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIOivt+axguabtOaWsOeahCBtZWRpYVR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXRSZXFNZWRpYVR5cGUoKTogUkNDYWxsUGx1c01lZGlhVHlwZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yZXFNZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICogaW52aXRlclRpbWVySWRcbiAgICovXG4gIHB1YmxpYyBnZXRJbnZpdGVyVGltZXJJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbnZpdGVyVGltZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBpbnZpdGVlVGltZXJJZFxuICAgKi9cbiAgcHVibGljIGdldEludml0ZWVUaW1lcklkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2ludml0ZWVUaW1lcklkO1xuICB9XG5cbiAgcHVibGljIGdldEFsbFRpbWVySWRzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gW3RoaXMuX2ludml0ZXJUaW1lcklkLCB0aGlzLl9pbnZpdGVlVGltZXJJZF07XG4gIH1cblxuICBwdWJsaWMgc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQ6IHN0cmluZywgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlLCBlbmFibGU6IGJvb2xlYW4sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1NFVF9VU0VSX0RFVklDRV9FTkFCTEVfTywgYHVzZXJJZDogJHt1c2VySWR9LCBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfSwgZW5hYmxlOiAke2VuYWJsZX1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB1c2VyU3RhdGUgPSB0aGlzLl9jYWxsVXNlcnMuZmluZCgoaXRlbSkgPT4gdXNlcklkID09PSBpdGVtLnVzZXJJZCk7XG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykge1xuICAgICAgdXNlclN0YXRlIS5taWNyb3Bob25lRW5hYmxlID0gZW5hYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB1c2VyU3RhdGUhLmNhbWVyYUVuYWJsZSA9IGVuYWJsZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pu05paw5Lq65ZGY5YiX6KGoLCDlubbov5Tlm57mm7TmlrDnmoTkurrlkZjliJfooahcbiAgICog5qC55o2u5Lq65ZGY54q25oCB5Y675re75Yqg44CB5Yig6Zmk44CB5pu05pawXG4gICAqIOagueaNrueKtuaAgeaXtumXtO+8jOWIpOaWreaYr+WQpuabtOaWsO+8jOaXoOaXtumXtOaIs+eahOS4uuacrOWcsOeKtuaAgeiwg+aVtO+8jOebtOaOpeabtOaWsFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVVzZXJMaXN0KHVzZXJzOiBJU2Vzc2lvblVzZXJbXSwgdHJhY2VJZDogc3RyaW5nKTogSVNlc3Npb25Vc2VyW10ge1xuICAgIGNvbnN0IGNoYW5nZWRVc2VyczogSVNlc3Npb25Vc2VyW10gPSBbXTtcbiAgICB1c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHVzZXJTdGF0ZTogbmV3VXNlclN0YXRlLFxuICAgICAgICBzdGF0ZVRpbWU6IG5ld1N0YXRlVGltZSxcbiAgICAgICAgc3lzdGVtU3RhdGU6IG5ld1N5c1N0YXRlLFxuICAgICAgfSA9IHVzZXI7XG4gICAgICBjb25zdCBuZWVkQWRkU3RhdGVzID0gW1JDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNBTExJTkcsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkJVU1lMSU5FX1dBSVRdO1xuICAgICAgaWYgKG5lZWRBZGRTdGF0ZXMuaW5jbHVkZXMobmV3VXNlclN0YXRlKSkge1xuICAgICAgICAvLyDnm7TmjqXmt7vliqDmlbDmja5cbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHB1c2ggdXNlcjogJHtKU09OLnN0cmluZ2lmeSh1c2VyKX1gLCB0cmFjZUlkKTtcbiAgICAgICAgdGhpcy5fY2FsbFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgIGNoYW5nZWRVc2Vycy5wdXNoKHVzZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5pu05paw5pWw5o2uXG4gICAgICAgIGxldCBoYXNVc2VyID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2FsbFVzZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgdXNlcklkLCBzdGF0ZVRpbWU6IG9sZFN0YXRlVGltZSwgc3lzdGVtU3RhdGU6IG9sZFN5c3RlbVN0YXRlLCB1c2VyU3RhdGU6IG9sZFVzZXJTdGF0ZSxcbiAgICAgICAgICB9ID0gdGhpcy5fY2FsbFVzZXJzW2ldO1xuICAgICAgICAgIGlmICh1c2VySWQgPT09IHVzZXIudXNlcklkKSB7XG4gICAgICAgICAgICBoYXNVc2VyID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW52YWxpZFN5c1N0YXRlID0gdmFsaWRhdGVTeXNTdGF0ZShvbGRTeXN0ZW1TdGF0ZSwgbmV3U3lzU3RhdGUpO1xuICAgICAgICAgICAgY29uc3QgaXNJbnZhbGlkVXNlclN0YXRlID0gdmFsaWRhdGVVc2VyU3RhdGUob2xkVXNlclN0YXRlLCBuZXdVc2VyU3RhdGUpO1xuXG4gICAgICAgICAgICBjb25zdCBpc0ludmFsaWRPbnBob25lRW5kID0gbmV3U3lzU3RhdGUgPT09IFJDQ2FsbFBsdXNSZWFzb24uT05fUEhPTkVfRU5EICYmIG9sZFN5c3RlbVN0YXRlICE9PSBSQ0NhbGxQbHVzUmVhc29uLk9OX1BIT05FICYmIG5ld1VzZXJTdGF0ZSAhPT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiDml6DmlYjnmoTnirbmgIHvvJpcbiAgICAgICAgICAgICAqIOaWsOS4i+WPkeeKtuaAgeeahOaXtumXtOWwj+S6juW9k+WJjeeKtuaAgeeahOaXtumXtCDkuJQgc3lzdGVtU3RhdGUg5ZKMIHVzZXJTdGF0ZSDlnYfmmK/ml6DmlYjnmoRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKChuZXdTdGF0ZVRpbWUgJiYgb2xkU3RhdGVUaW1lICYmIG5ld1N0YXRlVGltZSA8IG9sZFN0YXRlVGltZSkgfHwgKGlzSW52YWxpZFN5c1N0YXRlICYmIGlzSW52YWxpZFVzZXJTdGF0ZSkpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9VUERBVEVfVVNFUl9TVEFURV9PLCBgdGltZW91dCB1c2VyIHN0YXRlOiBvbGQ6JHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICB1c2VySWQsIG9sZFN0YXRlVGltZSwgb2xkU3lzdGVtU3RhdGUsIG9sZFVzZXJTdGF0ZSxcbiAgICAgICAgICAgICAgICB9KX07IG5ldzoke0pTT04uc3RyaW5naWZ5KHVzZXIpfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHVwZGF0ZVVzZXJMaXN0IGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8g55u05o6l6KaG55uW5pu05pawXG4gICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1VQREFURV9VU0VSX1NUQVRFX08sIGB1cGRhdGVVc2VyTGlzdCAtPiBjb3ZlciAke0pTT04uc3RyaW5naWZ5KHVzZXIpfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB0aGlzLl9jYWxsVXNlcnNbaV0gPSB1c2VyO1xuICAgICAgICAgICAgICAhaXNJbnZhbGlkT25waG9uZUVuZCAmJiBjaGFuZ2VkVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOaXoOatpOeUqOaIt+ebtOaOpea3u+WKoFxuICAgICAgICBpZiAoIWhhc1VzZXIpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9VUERBVEVfVVNFUl9TVEFURV9PLCBgdXBkYXRlVXNlckxpc3QgLT4gbm8gdXNlciBwdXNoICR7SlNPTi5zdHJpbmdpZnkodXNlcil9YCwgdHJhY2VJZCk7XG4gICAgICAgICAgdGhpcy5fY2FsbFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgICAgY2hhbmdlZFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlZFVzZXJzO1xuICB9XG5cbiAgcHVibGljIHNldE9sZERpYWxvZ0RhdGEoZGF0YTogSU9sZERpYWxvZ0RhdGEpIHtcbiAgICB0aGlzLl9vbGREaWFsb2dEYXRhID0gZGF0YTtcbiAgfVxuXG4gIC8qKiA9PT09PT3np4HmnInmlrnms5U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiAgLyoqXG4gICAqIOabtOaWsCBzZXNzaW9uIOeKtuaAgVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVNlc3Npb25TdGF0ZShzdGF0ZTogUkNDYWxsUGx1c0NhbGxTdGF0ZSkge1xuICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICog5pu05paw6YCa6K+d57G75Z6L77yI5Y2H6ZmN57qn6K6+572u77yJXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2FsbFR5cGUoY2FsbFR5cGU6IFJDQ2FsbFBsdXNUeXBlKSB7XG4gICAgdGhpcy5fY2FsbFR5cGUgPSBjYWxsVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmm7TmlrDlqpLkvZPnsbvlnovvvIjljYfpmY3nuqfvvIlcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVNZWRpYVR5cGUobWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlKSB7XG4gICAgdGhpcy5fbWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOivt+axgueahOWqkuS9k+exu+Wei++8iOWNh+mZjee6p++8iVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVJlcU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfCBudWxsKSB7XG4gICAgdGhpcy5fcmVxTWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsCBpbnZ0ZXIgdGltZXIgaWRcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVUaW1lcklkKHR5cGU6IENhbGxUaW1lckV2ZW50VHlwZSwgdGltZXJJZDogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGUgPT09IENhbGxUaW1lckV2ZW50VHlwZS5JTlZJVEVSKSB7XG4gICAgICB0aGlzLl9pbnZpdGVyVGltZXJJZCA9IHRpbWVySWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2ludml0ZWVUaW1lcklkID0gdGltZXJJZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WXG4gICAqL1xuICBwdWJsaWMgZ2V0T2xkRGlhbG9nRGF0YSgpOiBJT2xkRGlhbG9nRGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuX29sZERpYWxvZ0RhdGE7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5piv5ZCm5piv5bex56uv5oyC5patXG4gICAqL1xuICBwdWJsaWMgc2V0SXNMb2NhbENsaWVudEhhbmd1cChpc0xvY2FsQ2xpZW50SGFuZ3VwOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc0xvY2FsQ2xpZW50SGFuZ3VwID0gaXNMb2NhbENsaWVudEhhbmd1cDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTG9jYWxDbGllbnRIYW5ndXA7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIENhbGxTZXJ2ZXJBY3Rpb24ge1xuICAvKipcbiAgICog5byA5aeL5Y2V5Lq65ZG85Y+rXG4gICAqL1xuICBTVEFSVF9TSU5HTEVfQ0FMTCA9ICdzdGFydFNpbmdsZUNhbGwnLFxuICAvKipcbiAgICog5byA5aeL5aSa5Lq65ZG85Y+rXG4gICAqL1xuICBTVEFSVF9HUk9VUF9DQUxMID0gJ3N0YXJ0R3JvdXBDYWxsJyxcbiAgLyoqXG4gICAqIOmCgOivt+WlveWPi+WKoOWFpemAmuivnVxuICAgKi9cbiAgSU5WSVRFX0NBTEwgPSAnaW52aXRlQ2FsbCcsXG4gIC8qKlxuICAgKiDkuIvlj5HpgoDor7fpgJror53mlbDmja5cbiAgICovXG4gIFBVQl9JTlZJVEVfQ0FMTCA9ICdwdWJJbnZpdGVDYWxsJyxcbiAgLyoqXG4gICAqIOmAmuivneWTjemTg1xuICAgKi9cbiAgUklOR0lOR19DQUxMID0gJ3JpbmdDYWxsJyxcbiAgLyoqXG4gICAqIOaOpeWPl+mAmuivnVxuICAgKi9cbiAgQUNDRVBUX0NBTEwgPSAnYWNjZXB0Q2FsbCcsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror51cbiAgICovXG4gIEpPSU5fQ0FMTCA9ICdqb2luQ2FsbCcsXG4gIC8qKlxuICAgKiDmjILmlq3pgJror51cbiAgICovXG4gIEhBTkdVUF9DQUxMID0gJ2hhbmd1cENhbGwnLFxuICAvKipcbiAgICog6YCa6K+d54q25oCB5LiK5oqlXG4gICAqL1xuICBTVEFUVVNfVVBfQ0FMTCA9ICdzdGF0dXNVcENhbGwnLFxuICAvKipcbiAgICog6YCa6K+d54q25oCB5LiL5Y+RXG4gICAqL1xuICBTVEFUVVNfRE9XTl9DQUxMID0gJ3N0YXR1c0Rvd25DYWxsJyxcbiAgLyoqXG4gICAqIOmAmuivneS6i+S7tuS4iuaKpVxuICAgKi9cbiAgRVZFTlRfVVBfQ0FMTCA9ICdldmVudFVwQ2FsbCcsXG4gIC8qKlxuICAgKiDpgJror53kuovku7bkuIvlj5FcbiAgICovXG4gIEVWRU5UX0RPV05fQ0FMTCA9ICdldmVudERvd25DYWxsJyxcbiAgLyoqXG4gICAqIOWvueivneaVsOaNruS4iuihjFxuICAgKi9cbiAgRElBTE9HX1VQX0NBTEwgPSAnZGlhbG9nVXBDYWxsJyxcbiAgLyoqXG4gICAqIOWvueivneaVsOaNruS4i+ihjFxuICAgKi9cbiAgRElBTE9HX0RPV05fQ0FMTCA9ICdkaWFsb2dEb3duQ2FsbCcsXG4gIC8qKlxuICAgKiDojrflj5bnlKjmiLfkvJror53mlbDmja7liJfooahcbiAgICovXG4gIEdFVF9DQUxMX1VTRVJfU0VTU0lPTl9MSVNUID0gJ2dldENhbGxVU2VyU2Vzc2lvbkxpc3QnLFxuICAvKipcbiAgICog5pel5b+X6K6w5b2V5ZCM5q2lXG4gICAqL1xuICBTWU5DX0NBTExfTE9HID0gJ3N5bmNDYWxsTG9nJyxcbiAgLyoqXG4gICAqIOaXpeW/l+iusOW9leS4i+WPkVxuICAgKi9cbiAgUFVCX0NBTExfTE9HID0gJ3B1YkNhbGxMb2cnLFxuICAvKipcbiAgICog5om56YeP5Yig6Zmk6YCa6K+d6K6w5b2VXG4gICAqL1xuICBERUxfQ0FMTF9MT0cgPSAnZGVsZXRlQ2FsbExvZycsXG4gIC8qKlxuICAgKiDmn6Xor6LlvZPliY3nlKjmiLflt7LmnInnmoQgY2FsbCDnirbmgIFcbiAgICovXG4gIFFSWV9DQUxMX1NUQVRFID0gJ3F1ZXJ5VXNlckhhc0NhbGwnLFxuICAvKipcbiAgICog5p+l6K+iIGNhbGxTZXJ2ZXIg5b2T5YmN5pe26Ze05oizXG4gICAqL1xuICBRUllfU1JWX1RJTUVTVEFNUCA9ICdnZXRDYWxsU3J2VGltZVN0YW1wJyxcbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjeeUqOaIt+i/m+ihjOeahCBjYWxsIOWIl+ihqFxuICAgKi9cbiAgR0VUX0NBTExfU1RBVEVfTElTVCA9ICdnZXRVc2VyQ2FsbFN0YXRlTGlzdCcsXG4gIC8qKlxuICAgKiDmuIXpmaTlvZPliY3nlKjmiLfpgJror53orrDlvZVcbiAgICovXG4gIENMRUFSX0NBTExfTE9HID0gJ2NsZWFuQ2FsbExvZycsXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCDkvJror53kv6Hmga9cbiAgICovXG4gIEdFVF9DQUxMX1NFU1NJT04gPSAnZ2V0Q2FsbFNlc3Npb24nLFxuICAvKipcbiAgICog6I635Y+WIGNhbGwg5pe26Ze05L+h5oGvXG4gICAqL1xuICBHRVRfQ0FMTF9USU1FX0lORk8gPSAnZ2V0Q2FsbFRpbWVJbmZvJyxcbiAgLyoqXG4gICAqIOe7k+adn+W9k+WJjeeUqOaIt+W8guW4uOeahGNhbGxTZXNzaW9uKOWMheWQq+WQhOS4qumYtuautSnvvIzkuLvopoHnlKjkuo7lupTnlKjlvILluLjpgIDlh7rlho3lkK/liqjjgIHlkITnp43pgJror53lvILluLjlvZPkuK3jgILphYzmg4XosIPnlKhcbiAgICovXG4gIEVORF9BQk5PUk1BTF9DQUxMID0gJ2VuZFVzZXJBYm5vcm1hbENhbGxzJyxcbiAgLyoqXG4gICAqIOeUqOaIt+ezu+e7n+eKtuaAgeS4iuaKpVxuICAgKi9cbiAgU1lTX1NUQVRVU19VUCA9ICdzeXNTdGF0dXNVcCcsXG4gIC8qKlxuICAgKiDkuIrmiqXpgJror53orrDlvZXlt7Lor7vnirbmgIFcbiAgICovXG4gIFVQX0NBTExfTE9HX1JFQURFRCA9ICd1cENhbGxMb2dSZWFkZWQnLFxuICAvKipcbiAgICog5LiL5Y+R6YCa6K+d6K6w5b2V5bey6K+754q25oCBXG4gICAqL1xuICBQVUJfQ0FMTF9MT0dfUkVBREVEID0gJ3B1YkNhbGxMb2dSZWFkZWQnLFxuICAvKipcbiAgICog5LiL5Y+R5LiL6KGM5L+h5Luk5pWw5o2u5bqP5Y+3SWQg77yI5byx572R6KGl5YG/5pa55rOV77yM56e75Yqo56uv5bey5a6e546w77yMUEMg5pyq5a6e546w77yJXG4gICAqL1xuICBQVUJfTkFDS19TRVFfSUQgPSAncHViTkFDS1NlcUlkJyxcbiAgLyoqXG4gICAqIOafpeivouW9k+WJjeeUqOaIt+WPguS4jueahOacque7k+adn+eahGNhbGxTZXNzaW9u55qEQ2FsbElk5YiX6KGo77yMZ3JvdXDkuJPnlKjvvIzlj6/lnKhncm91cGNhbGznu5PmnZ/ml7bvvIzooaXlgb/lkITnq6/nmoTlv6vmjbflhaXlj6PmmK/lkKbmtojlpLHnmoTliKTmlq1cbiAgICovXG4gIEdFVF9VU0VSX0NBTExfU0VTU0lPTl9JRF9MSVNUID0gJ2dldFVzZXJDYWxsU2Vzc2lvbklkTGlzdCdcbn1cbiIsImV4cG9ydCBjb25zdCB0aW1lclNldFRpbWVvdXQgPSAoZnVuYzogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcik6IG51bWJlciA9PiBzZXRUaW1lb3V0KGZ1bmMsIHRpbWVvdXQpIGFzIG51bWJlcjtcblxuZXhwb3J0IGNvbnN0IHRpbWVySW50ZXJ2YWwgPSAoZnVuOiBGdW5jdGlvbiwgaXR2OiBudW1iZXIpOiBudW1iZXIgPT4gc2V0SW50ZXJ2YWwoZnVuLCBpdHYpIGFzIG51bWJlcjtcblxuZXhwb3J0IGNvbnN0IHNsZWVwID0gKG1pbGxpc2Vjb25kOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gIHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmQpO1xufSk7XG4iLCJpbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ1JUQ0NvZGUgfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHsgQ2FsbFNlcnZlckVycm9yQ29kZSB9IGZyb20gJy4uL2VudW1zL0NhbGxTZXJ2ZXJFcnJvckNvZGUnO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3RpbWVycyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzQ29kZSc7XG5cbmV4cG9ydCB0eXBlIFRSZXRyeUVycm9yQ29kZSA9IENhbGxTZXJ2ZXJFcnJvckNvZGUgfCBSQ1JUQ0NvZGUgfCBudW1iZXIgfCBFcnJvckNvZGVcbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIOimgemHjeivleeahOW8guatpeWHveaVsFxuICAgKi9cbiAgYXN5bmNGbjogRnVuY3Rpb247XG4gIC8qKlxuICAgKiDlh73mlbDnmoTlj4LmlbBcbiAgICovXG4gIGZuQXJnczogYW55W107XG4gIC8qKlxuICAgKiDlvZPliY3ph43or5Xml7bpl7TmiLNcbiAgICovXG4gIGN1cnJlbnRSZXRyeVRpbWU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDmnIDlpKfph43or5Xml7bplb9cbiAgICovXG4gIG1heER1cmF0aW9uPzogbnVtYmVyO1xuICAvKipcbiAgICog5qKv5bqm6YeN6K+V6Ze06ZqUXG4gICAqL1xuICBpbnRlcnZhbHM/OiBudW1iZXJbXTtcbiAgLyoqXG4gICAqIOair+W6pumHjeivlemXtOmalOaVsOe7hOS4i+agh1xuICAgKi9cbiAgaW5kZXg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDph43or5XlpLHotKXnmoTlm57osINcbiAgICovXG4gIG9uRXJyb3I/OiAoY29kZTogVFJldHJ5RXJyb3JDb2RlKSA9PiB2b2lkXG59XG5cbmNvbnN0IG5lZWRSZXRyeUNvZGU6IFRSZXRyeUVycm9yQ29kZVtdID0gW1xuICAvKipcbiAgICogSU0g5bqV5bGC6L+U5Zue6ZyA6KaB6YeN6K+V55qE6ZSZ6K+v56CBXG4gICAqL1xuICBFcnJvckNvZGUuUkNfTkVUX0NIQU5ORUxfSU5WQUxJRCxcbiAgRXJyb3JDb2RlLlJDX05FVF9VTkFWQUlMQUJMRSxcbiAgRXJyb3JDb2RlLlJDX01TR19SRVNQX1RJTUVPVVQsXG4gIC8qKlxuICAgKiBSVEMg6L+U5Zue6ZyA6KaB6YeN6K+V55qE6ZSZ6K+v56CBXG4gICAqL1xuICBSQ1JUQ0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCxcbiAgUkNSVENDb2RlLlJFUVVFU1RfRkFJTEVELFxuXG5dO1xuXG4vKipcbiAqIEBwYXJhbSBSZXRyeU9wdGlvbnMuYXN5bmNGbiDopoHph43or5XnmoTlvILmraXlh73mlbBcbiAqIEBwYXJhbSBSZXRyeU9wdGlvbnMuZm5BcmdzIOWHveaVsOeahOWPguaVsFxuICogQHBhcmFtIFJldHJ5T3B0aW9ucy5jdXJyZW50UmV0cnlUaW1lIOW9k+WJjemHjeivleaXtumXtOaIs1xuICogQHBhcmFtIFJldHJ5T3B0aW9ucy5tYXhEdXJhdGlvbiDmnIDlpKfph43or5Xml7bplb9cbiAqIEBwYXJhbSBSZXRyeU9wdGlvbnMuaW50ZXJ2YWxzIOair+W6pumHjeivlemXtOmalFxuICogQHBhcmFtIFJldHJ5T3B0aW9ucy5pbmRleCDmoq/luqbph43or5Xpl7TpmpTmlbDnu4TkuIvmoIdcbiAqL1xuZXhwb3J0IGNvbnN0IHJldHJ5QXN5bmNGbiA9IGFzeW5jIDxSIGV4dGVuZHMge2NvZGU6IFRSZXRyeUVycm9yQ29kZX0+ICh7XG4gIGFzeW5jRm4sXG4gIGZuQXJncyxcbiAgY3VycmVudFJldHJ5VGltZSA9IERhdGUubm93KCksXG4gIG1heER1cmF0aW9uID0gNjAgKiAxMDAwLFxuICBpbnRlcnZhbHMgPSBbMiAqIDEwMDAsIDQgKiAxMDAwLCA4ICogMTAwMCwgMTYgKiAxMDAwLCAzMiAqIDEwMDAsIDY0ICogMTAwMF0sXG4gIGluZGV4ID0gMCxcbiAgb25FcnJvcixcbn06IFJldHJ5T3B0aW9ucyk6IFByb21pc2U8Uj4gPT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBhc3luY0ZuKC4uLmZuQXJncyk7XG4gIC8vIGNvbnN0IGl0diA9IGludGVydmFsc1tpbmRleF0gfHwgaW50ZXJ2YWxzW2ludGVydmFscy5sZW5ndGggLSAxXVxuICAvLyBpbmRleCsrXG4gIC8vIGl0diDlhpnmrbsgMjAwMCBtcyAs5ZCO57ut6ZyA6KaB5YaN5pS+5byA5qKv5bqm6YeN6K+VXG4gIGNvbnN0IGl0diA9IDIgKiAxMDAwO1xuICBjb25zdCBpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkgPSAocmVzLmNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1NcbiAgICB8fCAhbmVlZFJldHJ5Q29kZS5pbmNsdWRlcyhyZXMuY29kZSkpXG4gICAgfHwgKChEYXRlLm5vdygpICsgaXR2IC0gY3VycmVudFJldHJ5VGltZSkgPiBtYXhEdXJhdGlvbik7XG5cbiAgaWYgKCFpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkpIHtcbiAgICBvbkVycm9yICYmIG9uRXJyb3IocmVzLmNvZGUpO1xuICAgIGF3YWl0IHNsZWVwKGl0dik7XG4gICAgcmV0dXJuIHJldHJ5QXN5bmNGbih7XG4gICAgICBhc3luY0ZuLFxuICAgICAgZm5BcmdzLFxuICAgICAgY3VycmVudFJldHJ5VGltZSxcbiAgICAgIG1heER1cmF0aW9uLFxuICAgICAgaW50ZXJ2YWxzLFxuICAgICAgaW5kZXgsXG4gICAgICBvbkVycm9yLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5QnlUaW1lT3B0aW9ucyB7XG4gIC8qKlxuICAgKiDopoHph43or5XnmoTlvILmraXlh73mlbBcbiAgICovXG4gIGFzeW5jRm46IEZ1bmN0aW9uO1xuICAvKipcbiAgICog5Ye95pWw55qE5Y+C5pWwXG4gICAqL1xuICBmbkFyZ3M6IGFueVtdO1xuICAvKipcbiAgICog5b2T5YmN6YeN6K+V5pe26Ze05oizXG4gICAqL1xuICBjdXJyZW50UmV0cnlUaW1lPzogbnVtYmVyO1xuICAvKipcbiAgICog5pyA5aSn6YeN6K+V5qyh5pWwLCDpu5jorqQgMiDmrKFcbiAgICovXG4gIG1heFJldHJ5VGltZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIOmHjeivleWksei0peeahOWbnuiwg1xuICAgKi9cbiAgb25FcnJvcj86IChjb2RlOiBUUmV0cnlFcnJvckNvZGUpID0+IHZvaWRcbn1cblxuZXhwb3J0IGNvbnN0IHJldHJ5QXNueWNGbkJ5VGltZSA9IGFzeW5jIDxSIGV4dGVuZHMge2NvZGU6IFRSZXRyeUVycm9yQ29kZX0+ICh7XG4gIGFzeW5jRm4sXG4gIGZuQXJncyxcbiAgY3VycmVudFJldHJ5VGltZSA9IDAsXG4gIG1heFJldHJ5VGltZSA9IDIsXG4gIG9uRXJyb3IsXG59OiBSZXRyeUJ5VGltZU9wdGlvbnMpOiBQcm9taXNlPFI+ID0+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgYXN5bmNGbiguLi5mbkFyZ3MpO1xuICBjb25zdCBpdHYgPSAyICogMTAwMDtcbiAgY3VycmVudFJldHJ5VGltZSsrO1xuICBjb25zdCBpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkgPSAocmVzLmNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1NcbiAgICB8fCAhbmVlZFJldHJ5Q29kZS5pbmNsdWRlcyhyZXMuY29kZSkpIHx8IGN1cnJlbnRSZXRyeVRpbWUgPiBtYXhSZXRyeVRpbWU7XG5cbiAgaWYgKCFpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkpIHtcbiAgICBvbkVycm9yICYmIG9uRXJyb3IocmVzLmNvZGUpO1xuICAgIGF3YWl0IHNsZWVwKGl0dik7XG4gICAgcmV0dXJuIHJldHJ5QXNueWNGbkJ5VGltZSh7XG4gICAgICBhc3luY0ZuLFxuICAgICAgZm5BcmdzLFxuICAgICAgY3VycmVudFJldHJ5VGltZSxcbiAgICAgIG1heFJldHJ5VGltZSxcbiAgICAgIG9uRXJyb3IsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG4iLCJpbXBvcnQgeyBJUHViSW52aXRlQ29uIH0gZnJvbSAnLi9JU2lnbmFsVHJhbnNwb3J0ZXInO1xuXG5leHBvcnQgZW51bSBDYWxsSG9va3NUeXBlIHtcbiAgb25CZWZvcmVQdWJsaXNoID0gJ29uQmVmb3JlUHVibGlzaCcsXG4gIG9uUHVibGlzaFJlcyA9ICdvblB1Ymxpc2hSZXMnLFxuICBvblB1Ykludml0ZUNhbGwgPSAnb25QdWJJbnZpdGVDYWxsJyxcbiAgb25QdWJJbnZpdGVDYWxsUHVsbEt2ID0gJ29uUHViSW52aXRlQ2FsbFB1bGxLdicsXG4gIG9uUHViSW52aXRlQ2FsbE1pc3MgPSAnb25QdWJJbnZpdGVDYWxsTWlzcydcbn1cblxuZXhwb3J0IGVudW0gUHViSW52aXRlQ2FsbE1pc3NSZWFzb24ge1xuICBOT1RfQ1VSUkVOVF9ERVZJQ0VJRCA9ICdub3QgY3VycmVudCBkZXZpY2UgaWQnLFxuICBTRUNSRVRfQ0FMTCA9ICdzZWNyZXQgY2FsbCcsXG4gIE5PVF9JTlZJVEVFID0gJ25vdCBhbiBpbnZpdGVlJ1xufVxuXG5leHBvcnQgZW51bSBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyIHtcbiAgUFVCX0lOVklURSA9ICdwdWJpbnZpdGVjYWxsJyxcbiAgUFVMTF9LVl9JTlZJVEUgPSAncHVsbGt2X2ludml0ZWNhbGwnLFxuICBQVVNIID0gJ3N5c3RlbV9wdWJzaCdcbn1cblxuZXhwb3J0IHR5cGUgSVB1Ykludml0ZUNhbGxJbmZvID0gSVB1Ykludml0ZUNvbiAmIHsgZXh0cmE6IHN0cmluZ31cblxuZXhwb3J0IHR5cGUgSVB1Ykludml0ZUNhbGxNaXNzSW5mbyA9IElQdWJJbnZpdGVDb24gJiB7IGV4dHJhOiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nLCByZWZlcjogUHViSW52aXRlQ2FsbE1pc3NSZWZlcn1cbiIsImltcG9ydCB7XG4gIEJhc2ljTG9nZ2VyLCBFcnJvckNvZGUsIEV2ZW50RW1pdHRlciwgZ2V0VVVJRDIyLCBJUnVudGltZSwgaXNOdWxsLCBpc1N0cmluZywgbG9nZ2VyLCBQbHVnaW5Db250ZXh0LCBSQ0Nvbm5lY3Rpb25TdGF0dXMsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IENhbGxTZXJ2ZXJBY3Rpb24gfSBmcm9tICcuLi9lbnVtcy9DYWxsU2VydmVyQWN0aW9uJztcbmltcG9ydCB7XG4gIElBY2NlcHRDYWxsQ29uLFxuICBJQmFzZVNpbmdhbENvbixcbiAgSUNsZWFyQ2FsbExvZ1JlcyxcbiAgSUNvbnBlbnNhdGlvbkRhdGEsXG4gIElEaWFsb2dEb3duQ2FsbENvbixcbiAgSURpYWxvZ1VwQ2FsbENvbixcbiAgSUVuZEFibm9ybWFsQ2FsbE9wdHMsXG4gIElFdmVudERvd25DYWxsQ29uLFxuICBJRXZlbnRVcENhbGxDb24sXG4gIElHZXRDYWxsU2Vzc2lvblNlcnZlclJlcyxcbiAgSUdldENhbGxUaW1lSW5mb1JlcyxcbiAgSUdldFVzZXJDYWxsU3RhdGVMaXN0UmVzLFxuICBJSGFuZ3VwQ2FsbENvbixcbiAgSUludml0ZUNhbGxDb24sXG4gIElJbnZpdGVDYWxsUmVzLFxuICBJSm9pbkNhbGxDb24sXG4gIElQdWJDYWxsTG9nLFxuICBJUHViSW52aXRlQ29uLFxuICBJUXJ5VXNlckhhc0NhbGxSZXMsXG4gIElSaW5naW5nQ2FsbENvbixcbiAgSVNpZ25hbFRyYW5zcG9ydGVyTGlzdGVuZXIsXG4gIElTdGFydENhbGxDb24sXG4gIElTdGFydENhbGxSZXMsXG4gIElTdGFydEdyb3VwQ29uLFxuICBJU3RhcnRTaW5nbGVDb24sXG4gIElTdGF0dXNEb3duQ29udCxcbiAgSVN0YXR1c1VwQ29uLFxuICBJU3luY0NhbGxMb2dDb24sXG4gIElTeW5jQ2FsbExvZ1Jlc0xpc3QsXG4gIElTeXNTdGF0dXNVcE9wdHMsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSVNpZ25hbFRyYW5zcG9ydGVyJztcbmltcG9ydCB7IERpYWxvZ1R5cGUgfSBmcm9tICcuLi9lbnVtcy9EaWFsb2dUeXBlJztcbmltcG9ydCB7IElSQ0NhbGxJbml0T3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSUluZGV4JztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZSc7XG5pbXBvcnQgeyBUaW1lQ29ycmVjdGlvbmVyIH0gZnJvbSAnLi9UaW1lQ29ycmVjdGlvbmVyJztcbmltcG9ydCB7IHJldHJ5QXN5bmNGbiB9IGZyb20gJy4uL3V0aWxzL3JldHJ5JztcbmltcG9ydCB7IFJDQ2FsbFBsdXNUeXBlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsVHlwZSc7XG5pbXBvcnQge1xuICBDYWxsSG9va3NUeXBlLCBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbiwgUHViSW52aXRlQ2FsbE1pc3NSZWZlcixcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JQ2FsbEhvb2tzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDb2RlIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZyc7XG5cbmV4cG9ydCBjbGFzcyBTaWduYWxUcmFuc3BvcnRlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiDnm5HlkKzlr7nosaFcbiAgICovXG4gIF9saXN0ZW5lciE6IElTaWduYWxUcmFuc3BvcnRlckxpc3RlbmVyXG5cbiAgLyoqXG4gICAqIOmcgOimgemHjeivleeahCBhY3Rpb25cbiAgICovXG4gIF9uZWVkUmV0cnlBY3Rpb25zOiBDYWxsU2VydmVyQWN0aW9uW10gPSBbXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5TVEFSVF9TSU5HTEVfQ0FMTCxcbiAgICBDYWxsU2VydmVyQWN0aW9uLlNUQVJUX0dST1VQX0NBTEwsXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5BQ0NFUFRfQ0FMTCxcbiAgICBDYWxsU2VydmVyQWN0aW9uLkpPSU5fQ0FMTCxcbiAgICBDYWxsU2VydmVyQWN0aW9uLkVWRU5UX1VQX0NBTEwsXG4gIF1cblxuICBfc2Vzc2lvbklkOiBzdHJpbmcgPSAnJ1xuXG4gIC8qKlxuICAgKiBjb25zdHJ1Y3RvclxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUGx1Z2luQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0T3B0czogSVJDQ2FsbEluaXRPcHRpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RpbWVDb3JyZWN0aW9uZXI6IFRpbWVDb3JyZWN0aW9uZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9jb250ZXh0Lm9uQ2FsbEluZm8gPSB0aGlzLl9vblJlY3ZDYWxsU2lnbmFsLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fY29udGV4dC5vbmNvbm5lY3Rpb25zdGF0ZWNoYW5nZSA9IHRoaXMuX29uSU1Db25uZWN0aW9uU3RhdGVDaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9zZXNzaW9uSWQgPSBnZXRVVUlEMjIoKTtcbiAgfVxuXG4gIGdldFNlc3Npb25JZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbklkO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyTGlzdGVuZXIobGlzdGVuZXI6IElTaWduYWxUcmFuc3BvcnRlckxpc3RlbmVyKSB7XG4gICAgdGhpcy5fbGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydENhbGwobXNnOiBJU3RhcnRDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJU3RhcnRDYWxsUmVzfT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGNsaWVudENhbGxJZCwgY2FsbFR5cGUsIHRvVXNlcnMsIG1lZGlhVHlwZSwgc2VjcmV0Q2hhdCwgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQsIG5pY2tOYW1lLCBvbGRSb29tSWQsIHB1c2hFeHQsIGV4dHJhLFxuICAgIH0gPSBtc2c7XG4gICAgaWYgKGNhbGxUeXBlID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXJ0U2luZ2xlQ2FsbCh7XG4gICAgICAgIGNsaWVudENhbGxJZCxcbiAgICAgICAgdG9Vc2VySWQ6IHRvVXNlcnNbMF0udXNlcklkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIHNlY3JldENoYXQsXG4gICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBvbGRSb29tSWQsXG4gICAgICAgIHRvT3JnSWQ6IHRvVXNlcnNbMF0ub3JnSWQgfHwgJycsXG4gICAgICAgIHB1c2hFeHQsXG4gICAgICAgIGV4dHJhLFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXJ0R3JvdXBDYWxsKHtcbiAgICAgIGNsaWVudENhbGxJZCxcbiAgICAgIHRvVXNlcnMsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICB0YXJnZXRUeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBuaWNrTmFtZSxcbiAgICAgIG9sZFJvb21JZCxcbiAgICAgIHB1c2hFeHQsXG4gICAgICBleHRyYSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydFNpbmdsZUNhbGwobXNnOiBJU3RhcnRTaW5nbGVDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9TSU5HTEVfQ0FMTF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTdGFydFNpbmdsZUNvbiwgSVN0YXJ0Q2FsbFJlcz4odGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgQ2FsbFNlcnZlckFjdGlvbi5TVEFSVF9TSU5HTEVfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydEdyb3VwQ2FsbChtc2c6IElTdGFydEdyb3VwQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJU3RhcnRDYWxsUmVzfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR1JPVVBfQ0FMTF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTdGFydEdyb3VwQ29uLCBJU3RhcnRDYWxsUmVzPih0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBDYWxsU2VydmVyQWN0aW9uLlNUQVJUX0dST1VQX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaW52aXRlQ2FsbChtc2c6IElJbnZpdGVDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJSW52aXRlQ2FsbFJlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0lOVklURV9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElJbnZpdGVDYWxsQ29uLCBJSW52aXRlQ2FsbFJlcz4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5JTlZJVEVfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByaW5naW5nQ2FsbChtc2c6IElSaW5naW5nQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUklOR19ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElSaW5naW5nQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLlJJTkdJTkdfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhY2NlcHRDYWxsKG1zZzogSUFjY2VwdENhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0FDQ0VQVF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElBY2NlcHRDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uQUNDRVBUX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgam9pbkNhbGwobXNnOiBJSm9pbkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0pPSU5fQ0FMTF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElKb2luQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkpPSU5fQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5ndXBDYWxsKG1zZzogSUhhbmd1cENhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0hBTkdVUF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJSGFuZ3VwQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkhBTkdVUF9DQUxMLCBtc2cpO1xuICAgIGlmIChjb2RlID09PSBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCkge1xuICAgICAgLy8g5a2Y5Zyo5Y2V5ZG8IEEg5oyC5pat5ZCO55u05o6l6Lii5Ye6IELvvIxDYWxsU2VydmVyIOW3suenu+mZpCBjYWxsLCBCIOWQjuWIsCBDYWxsU2VydmVyIOeahCBoYW5ndXAg5Lya6L2s5Li6IENhbGxTZXJ2ZXJFcnJvckNvZGUuQ0FMTF9OT1RfRVhJU1TvvIzmlYXlv73nlaVcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXR1c1VwQ2FsbChtc2c6IElTdGF0dXNVcENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9TVEFUVVNfVVBfVCwgYGNhbGwgc3RhdHVzIHVwIHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJU3RhdHVzVXBDb24sIHVuZGVmaW5lZD4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5TVEFUVVNfVVBfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBldmVudFVwQ2FsbChtc2c6IElFdmVudFVwQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9FVkVOVF9VUF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElFdmVudFVwQ2FsbENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkVWRU5UX1VQX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGlhbG9nVXBDYWxsKG1zZzogSURpYWxvZ1VwQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0FMTF9ESUFMT0dfVVBfVCwgYHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShtc2cpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJRGlhbG9nVXBDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uRElBTE9HX1VQX0NBTEwsIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlQ2FsbFJlY29yZCh1c2VySWQ6IHN0cmluZywgY2FsbElkczogc3RyaW5nW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9ERUxFVEVfQ0FMTF9SRUNPUkRfVCwgYGNhbGxJZHM6ICR7SlNPTi5zdHJpbmdpZnkoY2FsbElkcyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPHtjYWxsSWRzOiBzdHJpbmdbXX0sIHVuZGVmaW5lZD4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLkRFTF9DQUxMX0xPRywge1xuICAgICAgY2FsbElkcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzeW5jQ2FsbExvZyhtc2c6IElTeW5jQ2FsbExvZ0NvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVN5bmNDYWxsTG9nUmVzTGlzdH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX1JFQ09SRF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTeW5jQ2FsbExvZ0NvbiwgSVN5bmNDYWxsTG9nUmVzTGlzdD4obXNnLnVzZXJJZCwgQ2FsbFNlcnZlckFjdGlvbi5TWU5DX0NBTExfTE9HLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHF1ZXJ5VXNlckhhc0NhbGwoKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVFyeVVzZXJIYXNDYWxsUmVzfT4ge1xuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPG51bGwsIElRcnlVc2VySGFzQ2FsbFJlcz4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLlFSWV9DQUxMX1NUQVRFLCBudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsU2VydmVyVGltZXN0YW1wKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IHsgc3luY1RpbWU6IG51bWJlcn19PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX1NFUlZFUl9USU1FX1QsIGB1c2VySWQ6ICR7dXNlcklkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxudWxsLCB7IHN5bmNUaW1lOiBudW1iZXJ9Pih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uUVJZX1NSVl9USU1FU1RBTVAsIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENhbGxUaW1lSW5mbyhjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldENhbGxUaW1lSW5mb1Jlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX1RJTUVfSU5GT19ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8eyBjYWxsSWQ6IHN0cmluZ30sIElHZXRDYWxsVGltZUluZm9SZXM+KGNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5HRVRfQ0FMTF9USU1FX0lORk8sIHsgY2FsbElkIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFVzZXJDYWxsU3RhdGVMaXN0KHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElHZXRVc2VyQ2FsbFN0YXRlTGlzdFJlc30+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0FWQUlMQUJMRV9DQUxMX0xJU1RfVCwgYHVzZXJJZDogJHt1c2VySWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPG51bGwsIElHZXRVc2VyQ2FsbFN0YXRlTGlzdFJlcz4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLkdFVF9DQUxMX1NUQVRFX0xJU1QsIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNsZWFyQ2FsbFJlY29yZCh0cmFjZUlkOiBzdHJpbmcpOlByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElDbGVhckNhbGxMb2dSZXN9PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0NMRUFSX0NBTExfUkVDT1JEX1QsIGB1c2VySWQ6ICR7dXNlcklkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxudWxsLCBJQ2xlYXJDYWxsTG9nUmVzPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uQ0xFQVJfQ0FMTF9MT0csIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENhbGxTZXNzaW9uKG9wdHM6IElCYXNlU2luZ2FsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJR2V0Q2FsbFNlc3Npb25TZXJ2ZXJSZXN9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9JTkZPX0JZX0NBTExJRF9ULCBgY2FsbElkOiAke29wdHMuY2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJQmFzZVNpbmdhbENvbiwgSUdldENhbGxTZXNzaW9uU2VydmVyUmVzPihvcHRzLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5HRVRfQ0FMTF9TRVNTSU9OLCBvcHRzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzeXNTdGF0dXNVcChvcHRzOiBJU3lzU3RhdHVzVXBPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9VU0VSX1NZU1RFTV9TVEFURV9VUF9ULCBgb3B0czogJHtKU09OLnN0cmluZ2lmeShvcHRzKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN5c1N0YXR1c1VwT3B0cywgdW5kZWZpbmVkPihvcHRzLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5TWVNfU1RBVFVTX1VQLCBvcHRzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cENhbGxMb2dSZWFkZWQob3B0czogSUJhc2VTaW5nYWxDb24pOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUJhc2VTaW5nYWxDb24sIHVuZGVmaW5lZD4odXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLlVQX0NBTExfTE9HX1JFQURFRCwgb3B0cyk7XG4gIH1cblxuICAvKipcbiAgICog5riF6Zmk55So5oi35q2j5Zyo5ZG85Y+r5Lit55qE6YCa6K+d5Lya6K+d77yIKumdnuaatOmcsuaOpeWPo++8jOS+m+iwg+ivlemFjOaDheiwg+eUqO+8iVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuZFVzZXJBYm5vcm1hbENhbGxzKG9wdHM6IElFbmRBYm5vcm1hbENhbGxPcHRzKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDx7IGFsbERldmljZTogMCB8IDF9LCB1bmRlZmluZWQ+KHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIENhbGxTZXJ2ZXJBY3Rpb24uRU5EX0FCTk9STUFMX0NBTEwsIG9wdHMpO1xuICB9XG5cbiAgLyoqID09PT09PeengeacieaWueazlT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuICBwcml2YXRlIF9vbklNQ29ubmVjdGlvblN0YXRlQ2hhbmdlKHN0YXRlOiBSQ0Nvbm5lY3Rpb25TdGF0dXMpIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0lNX1NUQVRFX0NIQU5HRV9PLCBgc3RhdGU6ICR7c3RhdGV9YCwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9saXN0ZW5lci5vbklNU3RhdGVDaGFuZ2Uoc3RhdGUpO1xuICAgIC8qKlxuICAgICAqIOi/nuaOpeaIkOWKn+WQjuWQr+WKqOaXtumXtOagoeato+WZqFxuICAgICAqL1xuICAgIGlmIChzdGF0ZSA9PT0gUkNDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgdGhpcy5fdGltZUNvcnJlY3Rpb25lci5zdGFydCh0cmFjZUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdGltZUNvcnJlY3Rpb25lci5zdG9wKHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxsIOS/oeS7pOWPkemAgVxuICAgKiBAcGFyYW0gdGFyZ2V0SWQg6I635Y+WIGNhbGwgbG9nIChzeW5jQ2FsbExvZykg5pe25LygIHVzZXJJZCwg5YW25LuWIGFjdGlvbiDkvKAgY2FsbElkXG4gICAqIEBwYXJhbSBrZXkgY2FsbCBzZXJ2ZXIg5a6a5LmJIGFjdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBhY3Rpb24g5pC65bim5Y+C5pWw77yM5peg5Y+C5pWw5Lyg56m65a2X56ym5LiyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9zZW5kQ2FsbFNpZ25hbCA8VCwgUj4odGFyZ2V0SWQ6IHN0cmluZywga2V5OiBDYWxsU2VydmVyQWN0aW9uLCBvcHRpb25zOiBUKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogUn0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMgPyBKU09OLnN0cmluZ2lmeSh7IC4uLm9wdGlvbnMsIC4uLnsgc2Vzc2lvbklkOiB0aGlzLl9zZXNzaW9uSWQgfSB9KSA6ICcnO1xuXG4gICAgbGV0IHJlc3VsdDoge2RhdGE/OiB7IGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nfSwgY29kZTogRXJyb3JDb2RlfTtcbiAgICBpZiAodGhpcy5fbmVlZFJldHJ5QWN0aW9ucy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCByZXRyeUFzeW5jRm4gPHtkYXRhPzogeyBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZ30sIGNvZGU6IEVycm9yQ29kZX0+KHtcbiAgICAgICAgYXN5bmNGbjogdGhpcy5fY29udGV4dC5zZXRDYWxsSW5mby5iaW5kKHRoaXMuX2NvbnRleHQpLFxuICAgICAgICBmbkFyZ3M6IFt0YXJnZXRJZCwga2V5LCB2YWx1ZV0sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5fY29udGV4dC5zZXRDYWxsSW5mbyh0YXJnZXRJZCwga2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gcmVzdWx0O1xuICAgIGlmIChjb2RlICE9PSBFcnJvckNvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICBjb25zdCB7IHZhbHVlOiBzZXJ2ZXJWYWwgfSA9IGRhdGEhO1xuICAgIGNvbnN0IHBhcnNlZERhdGEgPSBKU09OLnBhcnNlKHNlcnZlclZhbCkuZGF0YSBhcyBSO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgZGF0YTogcGFyc2VkRGF0YSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGwg5L+h5Luk5o6l5pS2XG4gICAqL1xuICBwcml2YXRlIF9vblJlY3ZDYWxsU2lnbmFsKGRhdGE6IHN0cmluZykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9DQUxMX1NJR05BTF9EQVRBX08sIGBkYXRhOiAke2RhdGF9YCwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCBkYXRhTGlzdCA9IEpTT04ucGFyc2UoZGF0YSkubGlzdCBhcyB7W2tleTogc3RyaW5nXTogc3RyaW5nIH1bXTtcbiAgICBkYXRhTGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7IGtleSB9ID0gaXRlbTtcbiAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKGl0ZW0udmFsdWUpO1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlBVQl9JTlZJVEVfQ0FMTDpcbiAgICAgICAgICB0aGlzLl9vblB1Ykludml0ZUNhbGwoaW5mbyBhcyBJUHViSW52aXRlQ29uLCB0cmFjZUlkLCB0cnVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlNUQVRVU19ET1dOX0NBTEw6XG4gICAgICAgICAgdGhpcy5fb25TdGF0dXNEb3duQ2FsbChpbmZvIGFzIElTdGF0dXNEb3duQ29udCwgdHJhY2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5FVkVOVF9ET1dOX0NBTEw6XG4gICAgICAgICAgdGhpcy5fb25FdmVudERvd25DYWxsKGluZm8gYXMgSUV2ZW50RG93bkNhbGxDb24sIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uRElBTE9HX0RPV05fQ0FMTDpcbiAgICAgICAgICB0aGlzLl9vbkRpYWxvZ0Rvd25DYWxsKGluZm8gYXMgSURpYWxvZ0Rvd25DYWxsQ29uLCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlBVQl9DQUxMX0xPRzpcbiAgICAgICAgICB0aGlzLl9vblB1YkNhbGxMb2coaW5mbyBhcyBJUHViQ2FsbExvZywgdHJhY2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5QVUJfQ0FMTF9MT0dfUkVBREVEOlxuICAgICAgICAgIC8vIHBhc3Mg5pqC5pyq55So5YiwXG4gICAgICAgICAgLy8gdGhpcy5fb25QdWJDYWxsTG9nUmVhZGVkKGluZm8gYXMgSVB1YkNhbGxMb2dSZWFkZWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uUFVCX05BQ0tfU0VRX0lEOlxuICAgICAgICAgIC8vIFRPRE8gY2FsbCDlvLHnvZHooaXlgb/mlrnmoYjmtonlj4rmlrnms5XvvIxQQyDmnKrlgZrvvIzmraTlpITpmLLmraLotbDliLAgZGVmYXVsdFxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMuX29uQ29ucGVuc2F0aW9uRGF0YShpbmZvIGFzIElDb25wZW5zYXRpb25EYXRhLCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gZGV2aWNlSWQg5Yik5pat5pWw5o2u5piv5ZCm5bqU6K+l5LiL5Y+RXG4gICAqIGRldmljZUlkIOS4uuepuuWtl+espuS4suaIliBudWxsIOebtOaOpeS4i+WPkVxuICAgKiBkZXZpY2VJZCDmnInlhbfkvZPnmoTlgLzvvIzmoLnmja4gZGV2aWNlSWQg5Yik5pat5piv5ZCm5piv5bex56uv55qEIGRldmljZUlkXG4gICAqL1xuICBwcml2YXRlIF9pc1ZhbGlkRGF0YShkZXZpY2VJZDogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc051bGwoZGV2aWNlSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGlzU3RyaW5nKGRldmljZUlkKSAmJiAoZGV2aWNlSWQ/Lmxlbmd0aCA9PT0gMCB8fCBkZXZpY2VJZCA9PT0gdGhpcy5fc2Vzc2lvbklkKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDpgoDor7dcbiAgICogQHBhcmFtIGlzRGlyZWN0bHkg5piv5ZCm5Li655u05Y+R5L+h5LukXG4gICAqL1xuICBwcml2YXRlIF9vblB1Ykludml0ZUNhbGwoZGF0YTogSVB1Ykludml0ZUNvbiwgdHJhY2VJZDogc3RyaW5nLCBpc0RpcmVjdGx5ID0gdHJ1ZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdXJyZW50VUlkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gZGF0YS5jYWxsU2Vzc2lvblVzZXJzLmZpbmQoKGl0ZW0pID0+IGl0ZW0udXNlcklkID09PSBjdXJyZW50VUlkKTtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fY29udGV4dC5nZXRDb25uZWN0aW9uU3RhdHVzKCk7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfSU5WSVRFX08sIGBjdXJyZW50VXNlcjogJHtKU09OLnN0cmluZ2lmeShjdXJyZW50VXNlcil9LCBjdXJyZW50VXNlcklkOiAke2N1cnJlbnRVSWR9LCBzdGF0ZTogJHtzdGF0ZX1gLCB0cmFjZUlkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfSU5WSVRFX08sIGBlcnJvcjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWAsIHRyYWNlSWQpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2lzVmFsaWREYXRhKGRhdGEudG9EZXZpY2VJZCB8fCAnJykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9JTlZJVEVfTywgYG5vdCBjdXJyZW50IGRldmljZUlkIC0+IGRldmljZUluZm86ICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0b0RldmljZUlkOiBkYXRhLnRvRGV2aWNlSWQsXG4gICAgICAgIGNsaWVudERldmljZUlkOiB0aGlzLl9zZXNzaW9uSWQsXG4gICAgICB9KX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIEEg5ZKMIEIg576k6YCa6K+d5Lit77yMQSDlho3pgoDor7cgQ++8jEIg5ZKMIEInIOmDveS8muS8muaUtuWIsCBwdWJJbnZpdGVDYWxsLCBCJyDmlLbliLDnmoQgcHViSW52aXRlQ2FsbCDnmoQgdG9EZXZpY2VJZCDkuI3kuLroh6rlt7HvvIzml6DpnIDlpITnkIZcblxuICAgICAgLy8gaG9va3Mg5Zue6LCD5aSE55CGXG4gICAgICBjb25zdCBpbmZvID0ge1xuICAgICAgICBleHRyYTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgIHJlYXNvbjogUHViSW52aXRlQ2FsbE1pc3NSZWFzb24uTk9UX0NVUlJFTlRfREVWSUNFSUQsXG4gICAgICAgIHJlZmVyOiBpc0RpcmVjdGx5ID8gUHViSW52aXRlQ2FsbE1pc3NSZWZlci5QVUJfSU5WSVRFIDogUHViSW52aXRlQ2FsbE1pc3NSZWZlci5QVUxMX0tWX0lOVklURSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbE1pc3MsIE9iamVjdC5hc3NpZ24oZGF0YSwgaW5mbykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RlbmVyLm9uSW52aXRlKGRhdGEsIGlzRGlyZWN0bHksIHRyYWNlSWQpO1xuICAgIGlmIChpc0RpcmVjdGx5KSB7XG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGwsIE9iamVjdC5hc3NpZ24oZGF0YSwgeyBleHRyYTogSlNPTi5zdHJpbmdpZnkoZGF0YSkgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGxQdWxsS3YsIE9iamVjdC5hc3NpZ24oZGF0YSwgeyBleHRyYTogSlNPTi5zdHJpbmdpZnkoZGF0YSkgfSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDnirbmgIHlj5jmm7TvvJrlk43pk4PjgIHlv5nnoozjgIHpgJror53nrYnlvoXjgIHlr7nmlrnmnKrmjqXlkKzjgIHlt7HmlrnmnKrmjqXlkKxcbiAgICovXG4gIHByaXZhdGUgX29uU3RhdHVzRG93bkNhbGwoZGF0YTogSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICAvLyDmlbDmja7kuK3ov4fmu6TmjonmnKrlj5jmm7TnmoQgdXNlclNlc3Npb25cbiAgICBkYXRhLmNhbGxTZXNzaW9uVXNlcnMgPSBkYXRhLmNhbGxTZXNzaW9uVXNlcnMuZmlsdGVyKChpdGVtKSA9PiBCb29sZWFuKGl0ZW0uY2hhbmdlZCkpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU1RBVFVTX08sICcnLCB0cmFjZUlkKTtcblxuICAgIGlmICghdGhpcy5faXNWYWxpZERhdGEoZGF0YS50b0RldmljZUlkIHx8ICcnKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU1RBVFVTX08sIGBub3QgY3VycmVudCBkZXZpY2VJZCAtPiBkZXZpY2VJbmZvOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdG9EZXZpY2VJZDogZGF0YS50b0RldmljZUlkLFxuICAgICAgICBjbGllbnREZXZpY2VJZDogdGhpcy5fc2Vzc2lvbklkLFxuICAgICAgfSl9YCwgdHJhY2VJZCk7XG4gICAgICAvLyDkuI3mmK/nu5nlvZPliY3orr7lpIfkuIvlj5HnmoTnirbmgIHlpITnkIZcbiAgICAgIHRoaXMuX2xpc3RlbmVyLm9uT3RoZXJDbGllbnRTdGF0dXNEb3duKGRhdGEsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9saXN0ZW5lci5vblN0YXR1c0Rvd24oZGF0YSwgdHJhY2VJZCwgdGhpcy5fc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53kuovku7blj5jmm7TvvJrmiZPlvIB85YWz6ZetIOaRhOWDj+WktFxuICAgKi9cbiAgcHJpdmF0ZSBfb25FdmVudERvd25DYWxsKGRhdGE6IElFdmVudERvd25DYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9saXN0ZW5lci5vbkV2ZW50RG93bihkYXRhLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53osIPmlbTkuovku7blj4rnu5PmnpxcbiAgICog5LqL5Lu277ya5aqS5L2T57G75Z6L5YiH5o2iXG4gICAqIOWKqOS9nO+8muivt+axguOAgeaOpeWPl+OAgeaLkue7neOAgeWPlua2iFxuICAgKi9cbiAgcHJpdmF0ZSBfb25EaWFsb2dEb3duQ2FsbChkYXRhOiBJRGlhbG9nRG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgZGlhbG9nVHlwZSB9ID0gZGF0YTtcbiAgICBpZiAoZGlhbG9nVHlwZSA9PT0gRGlhbG9nVHlwZS5TV0lUQ0hfTUVESUFfVFlQRSkge1xuICAgICAgdGhpcy5fbGlzdGVuZXIub25Td2l0Y2hNZWRpYVR5cGUoZGF0YSwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivnee7k+adn+WQju+8jOaXpeW/l+S4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBfb25QdWJDYWxsTG9nKGRhdGE6IElQdWJDYWxsTG9nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DQUxMX1JFQ09SRF9PLCBgY2FsbCByZWNvcmQ6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YCwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9saXN0ZW5lci5vblJlY3ZDYWxsRW5kTG9nKGRhdGEsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOihpeWBv+aVsOaNruWkhOeQhlxuICAgKi9cbiAgcHJpdmF0ZSBfb25Db25wZW5zYXRpb25EYXRhKGRhdGE6IElDb25wZW5zYXRpb25EYXRhLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DT01QTEVNRU5UQVJZX0RBVEFfTywgJycsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgY2FsbFR5cGUsIG1lZGlhVHlwZSwgc2VjcmV0Q2hhdCwgZHVyYXRpb24sIGNhbGxTdGF0dXMsIGNhbGxpbmdVc2VySWQsIGNhbGxTZXNzaW9uVXNlcnMsIHRvRGV2aWNlSWQsIGNhbGxEaWFsb2dFbnRpdHlzLCBleHRyYSxcbiAgICB9ID0gZGF0YTtcblxuICAgIGNvbnN0IGlzUHViSW52aXRlQ2FsbERhdGEgPSBjYWxsU2Vzc2lvblVzZXJzLnNvbWUoKGl0ZW0pID0+IGl0ZW0uc2Vzc2lvblN0YXR1cyA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRCAmJiBpdGVtLnVzZXJJZCA9PT0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSk7XG5cbiAgICBpZiAoaXNQdWJJbnZpdGVDYWxsRGF0YSkge1xuICAgICAgdGhpcy5fb25QdWJJbnZpdGVDYWxsKHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICB0b0RldmljZUlkLFxuICAgICAgICBjYWxsVHlwZSxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBpbnZpdGVVc2VySWQ6IGNhbGxpbmdVc2VySWQsXG4gICAgICAgIGNhbGxpbmdVc2VySWQsXG4gICAgICAgIGNhbGxTZXNzaW9uVXNlcnMsXG4gICAgICAgIHNlY3JldENoYXQsXG4gICAgICAgIGV4dHJhLFxuICAgICAgfSwgdHJhY2VJZCwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29uU3RhdHVzRG93bkNhbGwoe1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIHRvRGV2aWNlSWQsXG4gICAgICAgIGNhbGxTdGF0dXMsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICBjYWxsU2Vzc2lvblVzZXJzLFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgaWYgKGNhbGxEaWFsb2dFbnRpdHlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNhbGxEaWFsb2dFbnRpdHlzLmZvckVhY2goKGRhdGEpID0+IHRoaXMuX29uRGlhbG9nRG93bkNhbGwoZGF0YSwgdHJhY2VJZCksIHRoaXMpO1xuICAgIH1cbiAgfVxufVxuIiwiY29uc3Qgc3RyaW5nMTB0bzY0ID0gKG51bWJlcjogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gJzAxMjM0NTY3ODlhYmNkZWZnaGlna2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUdLTE1OT1BRUlNUVVZXWFlaKy8nLnNwbGl0KCcnKTtcbiAgY29uc3QgcmFkaXggPSBjaGFycy5sZW5ndGggKyAxO1xuICBsZXQgcXV0aWVudCA9ICtudW1iZXI7XG4gIGNvbnN0IGFyciA9IFtdO1xuICBkbyB7XG4gICAgY29uc3QgbW9kID0gcXV0aWVudCAlIHJhZGl4O1xuICAgIHF1dGllbnQgPSAocXV0aWVudCAtIG1vZCkgLyByYWRpeDtcbiAgICBhcnIudW5zaGlmdChjaGFyc1ttb2RdKTtcbiAgfSB3aGlsZSAocXV0aWVudCk7XG4gIHJldHVybiBhcnIuam9pbignJyk7XG59O1xuXG5jb25zdCBnZXRVVUlEID0gKCkgPT4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCAoYykgPT4ge1xuICBjb25zdCByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMDtcbiAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XG4gIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbn0pO1xuXG4vKiDojrflj5YgMjIg5L2N55qEIFVVSUQgKi9cbmV4cG9ydCBjb25zdCBnZXRVVUlEMjIgPSAoKSA9PiB7XG4gIGxldCB1dWlkOiBzdHJpbmcgfCBudW1iZXIgPSBnZXRVVUlEKCk7XG4gIHV1aWQgPSBgJHt1dWlkLnJlcGxhY2UoLy0vZywgJycpfTBgO1xuICB1dWlkID0gcGFyc2VJbnQodXVpZCwgMTYpO1xuICB1dWlkID0gc3RyaW5nMTB0bzY0KHV1aWQpO1xuICBpZiAodXVpZC5sZW5ndGggPiAyMikge1xuICAgIHV1aWQgPSB1dWlkLnNsaWNlKDAsIDIyKTtcbiAgfVxuICByZXR1cm4gdXVpZDtcbn07XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcblxuY29uc3QgQ0FMTF9EQl9OQU1FID0gJ1JDX0NBTExQTFVTJztcblxuY29uc3QgREJfVkVSU0lPTiA9IDE7XG5cbmludGVyZmFjZSBJT2JqU3RvcmVQYXJhbXMge1xuICAvKipcbiAgICog5Li76ZSuXG4gICAqL1xuICBrZXlQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICog5aaC5p6c5rKh5pyJ5ZCI6YCC55qE5Li76ZSu77yM5Y+v5Lul6K6+572u5Li6IHRydWUg6Ieq5Yqo55Sf5oiQXG4gICAqL1xuICBhdXRvSW5jcmVtZW50PzogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgSUluZGV4REJPcHRzIHtcbiAgb25TdWNjZXNzOiAoKSA9PiB2b2lkO1xuICBvbkVycm9yPzogKCkgPT4gdm9pZDtcbn1cblxubGV0IGxvZ2dlcjogQmFzaWNMb2dnZXI7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxJbmRleERCIHtcbiAgLyoqXG4gICAqIGNhbGwgaW5kZXhEQiDlupNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9kYjogSURCRGF0YWJhc2UgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiBSQ0NhbGxJbmRleERCIOWunuS+i1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBSQ0NhbGxJbmRleERCIHwgbnVsbCA9IG51bGxcblxuICBzdGF0aWMgaW5pdChfbG9nZ2VyOiBCYXNpY0xvZ2dlciwgb3B0czogSUluZGV4REJPcHRzKSB7XG4gICAgbG9nZ2VyID0gX2xvZ2dlcjtcbiAgICBpZiAoIXRoaXMuaXNTdXBwb3J0KCkpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdbUkNDYWxsSW5kZXhEQl0nLCAnSW5kZXhEQiBpcyBub3Qgc3VwcG9ydCBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcSA9IHdpbmRvdy5pbmRleGVkREIub3BlbihDQUxMX0RCX05BTUUsIERCX1ZFUlNJT04pO1xuXG4gICAgcmVxLm9uZXJyb3IgPSAoZXY6IGFueSkgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oJ1tSQ0NhbGxJbmRleERCXScsIGBvcGVuIGluZGV4REIgcmVxIGZhaWxlZCAtPiAke2V2LnRhcmdldC5lcnJvcn1gKTtcbiAgICB9O1xuXG4gICAgcmVxLm9uc3VjY2VzcyA9IChldjogYW55KSA9PiB7XG4gICAgICB0aGlzLl9kYiA9IGV2LnRhcmdldC5yZXN1bHQ7XG4gICAgICBpZiAodGhpcy5fZGIpIHtcbiAgICAgICAgdGhpcy5fZGIub25jbG9zZSA9IChldjogYW55KSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ1tSQ0NhbGxJbmRleERCXScsIGBUaGUgZGIgJHt0aGlzLl9kYiEubmFtZX0gaGFzIHVuZXhwZWN0ZWRseSBjbG9zZWQuICR7ZXZ9YCk7XG4gICAgICAgICAgdGhpcy51bkluaXQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fZGIub25lcnJvciA9IChldjogYW55KSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ1tSQ0NhbGxJbmRleERCXScsIGBUaGUgZGIgJHt0aGlzLl9kYiEubmFtZX0gaGFzIG9wZW5pbmcgZXJyb3IuICR7ZXZ9YCk7XG4gICAgICAgICAgdGhpcy51bkluaXQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fZGIub25hYm9ydCA9IChldjogYW55KSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ1tSQ0NhbGxJbmRleERCXScsIGBUaGUgZGIgJHt0aGlzLl9kYiEubmFtZX0gaGFzIG9wZW5pbmcgYWJvcnRlZC4gJHtldn1gKTtcbiAgICAgICAgICB0aGlzLnVuSW5pdCgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgUkNDYWxsSW5kZXhEQi5faW5zdGFuY2UgPSBuZXcgUkNDYWxsSW5kZXhEQigpO1xuICAgICAgb3B0cy5vblN1Y2Nlc3MoKTtcbiAgICB9O1xuXG4gICAgcmVxLm9udXBncmFkZW5lZWRlZCA9IChldjogYW55KSA9PiB7XG4gICAgICB0aGlzLl9kYiA9IGV2LnRhcmdldC5yZXN1bHQ7XG5cbiAgICAgIFJDQ2FsbEluZGV4REIuY3JlYXRlT2JqU3RvcmUoJ0NhbGxCV19BYm5vcm1hbENhbGwnLCB7IGtleVBhdGg6ICd1c2VySWQnIH0pO1xuICAgIH07XG4gIH1cblxuICBzdGF0aWMgdW5Jbml0KCkge1xuICAgIHRoaXMuX2RiID0gbnVsbDtcbiAgICB0aGlzLl9pbnN0YW5jZSA9IG51bGw7XG4gIH1cblxuICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogUkNDYWxsSW5kZXhEQiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcbiAgfVxuXG4gIHN0YXRpYyBpc1N1cHBvcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXdpbmRvdyB8fCAhd2luZG93LmluZGV4ZWREQik7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlT2JqU3RvcmUob2JqTmFtZTogc3RyaW5nLCBvcHRzOiBJT2JqU3RvcmVQYXJhbXMpIHtcbiAgICBpZiAoIVJDQ2FsbEluZGV4REIuX2RiPy5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKG9iak5hbWUpKSB7XG4gICAgICBSQ0NhbGxJbmRleERCLl9kYiEuY3JlYXRlT2JqZWN0U3RvcmUob2JqTmFtZSwgb3B0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW1JDQ2FsbEluZGV4REJdJywgYGNyZWF0ZU9ialN0b3JlICR7b2JqTmFtZX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIG9iak5hbWUg6KGo5piOXG4gICAqIEBwYXJhbSB2YWwg6KaB5re75Yqg55qE5pWw5o2uXG4gICAqL1xuICBwdWJsaWMgYWRkVmFsdWUgPFQ+KG9iak5hbWU6IHN0cmluZywgdmFsOiBUKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGIpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYi50cmFuc2FjdGlvbihbb2JqTmFtZV0sICdyZWFkd3JpdGUnKS5vYmplY3RTdG9yZShvYmpOYW1lKTtcbiAgICAgIGNvbnN0IHJlcSA9IHN0b3JlLmFkZCh2YWwpO1xuXG4gICAgICByZXEub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfTtcblxuICAgICAgcmVxLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnW1JDQ2FsbEluZGV4REJdJywgJ2FkZFZhbHVlIGZhaWxlZCcpO1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5Li76ZSu6K+75Y+W5pWw5o2uXG4gICAqIEBwYXJhbSBrZXkg5Li76ZSuXG4gICAqL1xuICBwdWJsaWMgcmVhZEJ5S2V5IDxUPihvYmpOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIVJDQ2FsbEluZGV4REIuX2RiKSB7XG4gICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYi50cmFuc2FjdGlvbihbb2JqTmFtZV0pLm9iamVjdFN0b3JlKG9iak5hbWUpO1xuXG4gICAgICBjb25zdCByZXEgPSBzdG9yZS5nZXQoa2V5KTtcblxuICAgICAgcmVxLm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZShyZXEucmVzdWx0KTtcbiAgICAgIH07XG5cbiAgICAgIHJlcS5vbmVycm9yID0gKGV2KSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgcmVhZEJ5S2V5IG9uZXJyb3IgLT4gJHtldn1gKTtcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u5Li76ZSu5pu05paw5pWw5o2uXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQnlLZXkgPFQ+KG9iak5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbDogVCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIVJDQ2FsbEluZGV4REIuX2RiKSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0b3JlID0gUkNDYWxsSW5kZXhEQi5fZGIudHJhbnNhY3Rpb24oW29iak5hbWVdLCAncmVhZHdyaXRlJykub2JqZWN0U3RvcmUob2JqTmFtZSk7XG5cbiAgICAgIGNvbnN0IHJlcSA9IHN0b3JlLnB1dCh2YWwpO1xuXG4gICAgICByZXEub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfTtcblxuICAgICAgcmVxLm9uZXJyb3IgPSAoZXYpID0+IHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIGxvZ2dlci53YXJuKCdbUkNDYWxsSW5kZXhEQl0nLCBgdXBkYXRlQnlLZXkgb25lcnJvciAtPiAke2V2fWApO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVCeUtleShvYmpOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGIpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYi50cmFuc2FjdGlvbihbb2JqTmFtZV0sICdyZWFkd3JpdGUnKS5vYmplY3RTdG9yZShvYmpOYW1lKTtcblxuICAgICAgY29uc3QgcmVxID0gc3RvcmUuZGVsZXRlKGtleSk7XG5cbiAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXEub25lcnJvciA9IChldikgPT4ge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1tSQ0NhbGxJbmRleERCXScsIGByZW1vdmVCeUtleSBvbmVycm9yIC0+ICR7ZXZ9YCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgSVJ1bnRpbWUsIElTdG9yYWdlIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsSW5kZXhEQiB9IGZyb20gJy4uL3V0aWxzL2luZGV4REInO1xuXG5leHBvcnQgaW50ZXJmYWNlIElPYmpTdG9yZSB7W3VzZXJJZDogc3RyaW5nXTogc3RyaW5nW119XG5cbmludGVyZmFjZSBJU3RvcmVWYWwge3VzZXJJZDogc3RyaW5nLCBjYWxsSWRzOiBzdHJpbmdbXX1cblxuLyoqXG4gKiDlvILluLjnu5PmnZ8gY2FsbCDlpITnkIblrZjlgqjnsbtcbiAqIOWcqOWRvOWHuuaIluWRvOWFpemYtuauteeahCBjYWxsIOi/m+ihjOacrOWcsOWtmOWCqO+8jOato+W4uOe7k+adn+WQjua4hemZpFxuICog5byC5bi457uT5p2f5ZCO77yM5pys5Zyw5Y+W5pyq5riF6Zmk55qEIGNhbGxJZCwg6YCa6L+H5pyN5Yqh5o6l5Y+j5riF6Zmk5byC5bi457uT5p2f55qEIGNhbGwgLOmYsuatouaXoOazleWRvOWHuuaIluWRvOWFpVxuICovXG5leHBvcnQgY2xhc3MgQWJub3JtYWxDYWxsIHtcbiAgcHJpdmF0ZSBfbG9jYWxTdG9yZSE6IElTdG9yYWdlXG5cbiAgcHJpdmF0ZSBfaW5kZXhEQlN0b3JlITogUkNDYWxsSW5kZXhEQlxuXG4gIHByaXZhdGUgX3N0b3JlS2V5OiBzdHJpbmcgPSAnQ2FsbEJXX0Fibm9ybWFsQ2FsbCdcblxuICBwcml2YXRlIF9pc1N1cHBvcnRJbmRleERCOiBib29sZWFuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG4gICAgdGhpcy5faXNTdXBwb3J0SW5kZXhEQiA9IFJDQ2FsbEluZGV4REIuaXNTdXBwb3J0KCk7XG4gICAgaWYgKHRoaXMuX2lzU3VwcG9ydEluZGV4REIpIHtcbiAgICAgIFJDQ2FsbEluZGV4REIuaW5pdCh0aGlzLl9sb2dnZXIsIHtcbiAgICAgICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faW5kZXhEQlN0b3JlID0gUkNDYWxsSW5kZXhEQi5nZXRJbnN0YW5jZSgpITtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9sb2NhbFN0b3JlID0gX3J1bnRpbWUubG9jYWxTdG9yYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIOa3u+WKoOW8guW4uCBjYWxsSWRcbiAgICovXG4gIHB1YmxpYyBhZGRBYm5vcm1hbGxDYWxsSWQodXNlcklkOiBzdHJpbmcsIGNhbGxJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgYWRkRnVuYyA9IHRoaXMuX2lzU3VwcG9ydEluZGV4REIgPyB0aGlzLl9hZGRCeUluZGV4REIgOiB0aGlzLl9hZGRCeUxvY2FsU3RvcmU7XG4gICAgYWRkRnVuYy5jYWxsKHRoaXMsIHVzZXJJZCwgY2FsbElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliKDpmaTlvILluLggY2FsbElkXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQWJub3JtYWxDYWxsSWRzKHVzZXJJZDogc3RyaW5nLCBjYWxsSWRzOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHJlbW92ZUZ1bmMgPSB0aGlzLl9pc1N1cHBvcnRJbmRleERCID8gdGhpcy5fcmVtb3ZlQnlJbmRleERCIDogdGhpcy5fcmVtb3ZlQnlMb2NhbFN0b3JlO1xuICAgIHJlbW92ZUZ1bmMuY2FsbCh0aGlzLCB1c2VySWQsIGNhbGxJZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW8guW4uOe7k+adn+eahCBjYWxsSWQg5YiX6KGoXG4gICAqL1xuICBwdWJsaWMgZ2V0QWJub3JtYWxDYWxsSWRzKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+IHtcbiAgICBjb25zdCBnZXRGdW5jID0gdGhpcy5faXNTdXBwb3J0SW5kZXhEQiA/IHRoaXMuX2dldEJ5SW5kZXhEQiA6IHRoaXMuX2dldEJ5TG9jYWxTdG9yZTtcbiAgICByZXR1cm4gZ2V0RnVuYy5jYWxsKHRoaXMsIHVzZXJJZCk7XG4gIH1cblxuICBwcml2YXRlIF9hZGRCeUxvY2FsU3RvcmUodXNlcklkOiBzdHJpbmcsIGNhbGxJZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9ialN0b3JlOiBJT2JqU3RvcmUgPSA8SU9ialN0b3JlPkpTT04ucGFyc2UodGhpcy5fbG9jYWxTdG9yZS5nZXRJdGVtKHRoaXMuX3N0b3JlS2V5KSB8fCAne30nKTtcbiAgICAgIGxldCB1c2VyQWJub3JtYWxDYWxsSWRzID0gb2JqU3RvcmVbdXNlcklkXTtcbiAgICAgIGlmICh1c2VyQWJub3JtYWxDYWxsSWRzKSB7XG4gICAgICAgIHVzZXJBYm5vcm1hbENhbGxJZHMucHVzaChjYWxsSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXNlckFibm9ybWFsQ2FsbElkcyA9IFtjYWxsSWRdO1xuICAgICAgfVxuICAgICAgb2JqU3RvcmVbdXNlcklkXSA9IHVzZXJBYm5vcm1hbENhbGxJZHM7XG4gICAgICB0aGlzLl9sb2NhbFN0b3JlLnNldEl0ZW0odGhpcy5fc3RvcmVLZXksIEpTT04uc3RyaW5naWZ5KG9ialN0b3JlKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignW0Fibm9ybWFsQ2FsbF0nLCBgX2FkZEJ5TG9jYWxTdG9yZSBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVCeUxvY2FsU3RvcmUodXNlcklkOiBzdHJpbmcsIGNhbGxJZHM6IHN0cmluZ1tdKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9ialN0b3JlOiBJT2JqU3RvcmUgPSA8SU9ialN0b3JlPkpTT04ucGFyc2UodGhpcy5fbG9jYWxTdG9yZS5nZXRJdGVtKHRoaXMuX3N0b3JlS2V5KSB8fCAne30nKTtcbiAgICAgIGxldCB1c2VyQWJub3JtYWxDYWxsSWRzID0gb2JqU3RvcmVbdXNlcklkXTtcbiAgICAgIGlmICh1c2VyQWJub3JtYWxDYWxsSWRzKSB7XG4gICAgICAgIHVzZXJBYm5vcm1hbENhbGxJZHMgPSB1c2VyQWJub3JtYWxDYWxsSWRzLmZpbHRlcigoaWQpID0+ICFjYWxsSWRzLmluY2x1ZGVzKGlkKSk7XG4gICAgICAgIGlmICh1c2VyQWJub3JtYWxDYWxsSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBvYmpTdG9yZVt1c2VySWRdID0gdXNlckFibm9ybWFsQ2FsbElkcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgb2JqU3RvcmVbdXNlcklkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvY2FsU3RvcmUuc2V0SXRlbSh0aGlzLl9zdG9yZUtleSwgSlNPTi5zdHJpbmdpZnkob2JqU3RvcmUpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdbQWJub3JtYWxDYWxsXScsIGBfcmVtb3ZlQnlMb2NhbFN0b3JlIGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldEJ5TG9jYWxTdG9yZSh1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10gfCBudWxsPiB7XG4gICAgbGV0IGNhbGxJZHMgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvYmpTdG9yZTogSU9ialN0b3JlID0gPElPYmpTdG9yZT5KU09OLnBhcnNlKHRoaXMuX2xvY2FsU3RvcmUuZ2V0SXRlbSh0aGlzLl9zdG9yZUtleSkgfHwgJ3t9Jyk7XG4gICAgICBjb25zdCB1c2VyQWJub3JtYWxDYWxsSWRzID0gb2JqU3RvcmVbdXNlcklkXTtcbiAgICAgIGlmICh1c2VyQWJub3JtYWxDYWxsSWRzKSB7XG4gICAgICAgIGNhbGxJZHMgPSB1c2VyQWJub3JtYWxDYWxsSWRzO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ1tBYm5vcm1hbENhbGxdJywgYF9nZXRCeUxvY2FsU3RvcmUgZXJyOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2FsbElkcyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9hZGRCeUluZGV4REIodXNlcklkOiBzdHJpbmcsIGNhbGxJZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLl9pbmRleERCU3RvcmUucmVhZEJ5S2V5PElTdG9yZVZhbD4odGhpcy5fc3RvcmVLZXksIHVzZXJJZCk7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmNhbGxJZHMucHVzaChjYWxsSWQpO1xuICAgICAgICB0aGlzLl9pbmRleERCU3RvcmUudXBkYXRlQnlLZXkodGhpcy5fc3RvcmVLZXksIHVzZXJJZCwge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBjYWxsSWRzOiBkYXRhLmNhbGxJZHMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faW5kZXhEQlN0b3JlLmFkZFZhbHVlKHRoaXMuX3N0b3JlS2V5LCB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIGNhbGxJZHM6IFtjYWxsSWRdLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdbQWJub3JtYWxDYWxsXScsIGBfYWRkQnlJbmRleERCIGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlbW92ZUJ5SW5kZXhEQih1c2VySWQ6IHN0cmluZywgY2FsbElkczogc3RyaW5nW10pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuX2luZGV4REJTdG9yZS5yZWFkQnlLZXk8SVN0b3JlVmFsPih0aGlzLl9zdG9yZUtleSwgdXNlcklkKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGRhdGEuY2FsbElkcyA9IGRhdGEuY2FsbElkcy5maWx0ZXIoKGlkKSA9PiAhY2FsbElkcy5pbmNsdWRlcyhpZCkpO1xuICAgICAgICBpZiAoZGF0YS5jYWxsSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLl9pbmRleERCU3RvcmUudXBkYXRlQnlLZXkodGhpcy5fc3RvcmVLZXksIHVzZXJJZCwge1xuICAgICAgICAgICAgdXNlcklkLFxuICAgICAgICAgICAgY2FsbElkczogZGF0YS5jYWxsSWRzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2luZGV4REJTdG9yZS5yZW1vdmVCeUtleSh0aGlzLl9zdG9yZUtleSwgdXNlcklkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ1tBYm5vcm1hbENhbGxdJywgYF9yZW1vdmVCeUluZGV4REIgZXJyOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0QnlJbmRleERCKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+IHtcbiAgICBsZXQgZGF0YSA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPSBhd2FpdCB0aGlzLl9pbmRleERCU3RvcmUucmVhZEJ5S2V5PElTdG9yZVZhbD4odGhpcy5fc3RvcmVLZXksIHVzZXJJZCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignW0Fibm9ybWFsQ2FsbF0nLCBgX2dldEJ5SW5kZXhEQiBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHJldHVybiBkYXRhLmNhbGxJZHM7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iLCIvKipcbiAqIOS6i+S7tuexu+Wei1xuICovXG5leHBvcnQgZW51bSBDYWxsU2VydmVyRXZlbnRUeXBlIHtcbiAgLyoqXG4gICAqIOaPkOekuueql+WPo1xuICAgKi9cbiAgUFJPTVBUID0gMCxcbiAgLyoqXG4gICAqIENhbGxTZXJ2ZXIg5LiL5Y+R6YCa6K+d5pe26ZW/5Y+Y5pu057G75Z6LXG4gICAqL1xuICBDQUxMX0RVUkFUSU9OID0gMTAsXG4gIC8qKlxuICAgKiDmlLbliLDov5znq6/nrKzkuIDluKfml7bpl7RcbiAgICovXG4gIEZJUlNUX0ZSQU1FID0gMjAsXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxQbHVzSW5uZXJDb2RlIHtcbiAgU1VDQ0VTUyA9IDAsXG4gIC8qKlxuICAgKiDml6DmlYjnmoTlk43lupTml7bpl7TvvIjmjqXlj6Plk43lupTml7bpl7Tov4fplb/vvIlcbiAgICovXG4gIElOVkFMSURfUkVTUE9OU0VfVElNRSA9IDgwMTcwLFxuICAvKipcbiAgICog6Z2e5pyA5LyY5ZON5bqU5pe26Ze0XG4gICAqL1xuICBOT05PUFRJTUFMX1JFU19USU1FID0gODAxNzEsXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbEVuZ2luZSB9IGZyb20gJy4uL1JDQ2FsbEVuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzQ29kZSc7XG5pbXBvcnQgeyB0aW1lclNldFRpbWVvdXQgfSBmcm9tICcuLi91dGlscy90aW1lcnMnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNJbm5lckNvZGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxQbHVzSW5uZXJDb2RlJztcblxuLyoqXG4gKiDmoKHml7bmqKHlnZdcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbWVDb3JyZWN0aW9uZXIge1xuICAvKipcbiAgICog5o6l5Y+j5ZON5bqU5pe26Ze0XG4gICAqL1xuICBwcml2YXRlIF9SVFQ6IG51bWJlciA9IDBcblxuICAvKipcbiAgICog5Y+v55So55qE5o6l5Y+j5ZON5bqU5pe26Ze05LiL6ZmQ77yI5Y2V5L2NOiBtc++8iVxuICAgKi9cbiAgcHJpdmF0ZSBfdmFsaWRNaW5SVFQ6IG51bWJlciA9IDIwMFxuXG4gIC8qKlxuICAgKiDlj6/nlKjnmoTmjqXlj6Plk43lupTml7bpl7TkuIrpmZDvvIjljZXkvY06IG1z77yJXG4gICAqL1xuICBwcml2YXRlIF92YWxpZE1heFJUVDogbnVtYmVyID0gMTAwMFxuXG4gIC8qKlxuICAgKiDkuI4gY2FsbFNlcnZlciDnmoTml7bpl7TlgY/lt67ml7bpl7TvvIjljZXkvY06IG1z77yJXG4gICAqL1xuICBwcml2YXRlIF9kZWx0YVRpbWU6IG51bWJlciA9IDBcblxuICAvKipcbiAgICogdGltZXJJZFxuICAgKi9cbiAgcHJpdmF0ZSBfdGltZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICog6L2u6K6t5pe26Ze06Ze06ZqU77yI5Y2V5L2NOiBtc++8iVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaW50ZXJ2YWw6IG51bWJlciA9IDIgKiAxMDAwXG5cbiAgLyoqXG4gICAqIOacgOWkp+mHjeivleasoeaVsFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4UmV0cnlUaW1lczogbnVtYmVyID0gOFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxFbmdpbmU6IFJDQ2FsbEVuZ2luZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NpbmdsZUNhbGxEdXJhdGlvbkV2OiAoY2FsbElkOiBzdHJpbmcsIGNsaWVudFN0YXJ0VGltZTogbnVtYmVyLCBjbGllbnRGaXJzdEZyYW1lVGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpID0+IHZvaWQsXG4gICkge1xuXG4gIH1cblxuICAvKipcbiAgICog5LuO5pyN5Yqh56uv6I635Y+W6YCa6K+d5pe26ZW/44CB6YCa6K+d5byA5aeL5pe26Ze0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbENsaWVudFRpbWVCeVNlcnZlcihjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgZHVyYXRpb24/OiBudW1iZXIsIGNsaWVudFN0YXJ0VGltZT86IG51bWJlciB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgaWYgKCF0aGlzLl9SVFQgfHwgdGhpcy5fUlRUID4gdGhpcy5fdmFsaWRNaW5SVFQpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2dldERlbHRhVGltZSh0cmFjZUlkKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fUlRUID4gdGhpcy5fdmFsaWRNYXhSVFQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SLCBgY29kZTogJHtSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRX1gLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbFRpbWVJbmZvKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SLCBgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgc3RhcnRUaW1lOiBzZXJ2ZXJTdGFydFRpbWUgfSA9IGRhdGEhO1xuICAgIGNvbnN0IGNsaWVudFN0YXJ0VGltZSA9IE1hdGguZmxvb3Ioc2VydmVyU3RhcnRUaW1lIC0gdGhpcy5fZGVsdGFUaW1lKTtcbiAgICBjb25zdCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IGR1cmF0aW9uID0gKGN1cnJlbnRUaW1lICsgdGhpcy5fZGVsdGFUaW1lIC0gc2VydmVyU3RhcnRUaW1lKSAvIDEwMDA7XG5cbiAgICBpZiAoZHVyYXRpb24gPCAwKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9QLCBgaW52YWxpZCBkdXJhdGlvbjogJHtkdXJhdGlvbn1gLCB0cmFjZUlkKTtcbiAgICAgIGR1cmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICAvLyDlkJHkuIvlj5bmlbRcbiAgICBkdXJhdGlvbiA9IE1hdGguZmxvb3IoZHVyYXRpb24pO1xuXG4gICAgaWYgKHRoaXMuX1JUVCA+IHRoaXMuX3ZhbGlkTWluUlRUICYmIHRoaXMuX1JUVCA8PSB0aGlzLl92YWxpZE1heFJUVCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNJbm5lckNvZGUuTk9OT1BUSU1BTF9SRVNfVElNRX1gLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9SLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBydHQ6IHRoaXMuX1JUVCxcbiAgICAgIGRlbHRhVDogdGhpcy5fZGVsdGFUaW1lLFxuICAgICAgc2VydmVyU3RhcnRUaW1lLFxuICAgICAgY2xpZW50U3RhcnRUaW1lLFxuICAgICAgZHVyYXRpb24sXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGUsIGR1cmF0aW9uLCBjbGllbnRTdGFydFRpbWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnm7TmjqXorqHnrpflrqLmiLfnq6/lvIDlp4vml7bpl7RcbiAgICovXG4gIHB1YmxpYyBjYWxjQ2xpZW50U3RhcnRUaW1lKGNhbGxJZDogc3RyaW5nLCBzdGFydFRpbWU6IG51bWJlciwgdHJhY2VJZDogc3RyaW5nKTogeyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLCBjbGllbnRTdGFydFRpbWU/OiBudW1iZXIgfSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9DQUxDX0NMSUVOVF9TVEFSVF9USU1FX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfSwgc3RhcnRUaW1lOiAke3N0YXJ0VGltZX1gLCB0cmFjZUlkKTtcbiAgICBpZiAodGhpcy5fUlRUID4gdGhpcy5fdmFsaWRNYXhSVFQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0lubmVyQ29kZS5JTlZBTElEX1JFU1BPTlNFX1RJTUV9YCwgdHJhY2VJZCk7XG4gICAgICAvLyDlho3mrKHph43mlrDojrflj5YgUlRUIOW5tumHjeaWsOiuoeeul+W8gOWni+aXtumXtFxuICAgICAgdGhpcy5fbG9vcENvcnJlY3RDbGllbnRUaW1lKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNsaWVudFN0YXJ0VGltZSA9IE1hdGguZmxvb3Ioc3RhcnRUaW1lIC0gdGhpcy5fZGVsdGFUaW1lKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfUiwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgcnR0OiB0aGlzLl9SVFQsXG4gICAgICBkZWx0YVQ6IHRoaXMuX2RlbHRhVGltZSxcbiAgICAgIHN0YXJ0VDogc3RhcnRUaW1lLFxuICAgICAgY2xpZW50U3RhcnRUaW1lLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1pblJUVCkge1xuICAgICAgLy8g6YeN572uIGNhbGwg5Lit6YeN6K+V5qyh5pWwXG4gICAgICB0aGlzLl9yZXRyeVRpbWVzSW5DYWxsID0gMDtcbiAgICAgIC8vIOWGjeasoemHjeaWsOiOt+WPliBSVFQg5bm26YeN5paw6K6h566X5byA5aeL5pe26Ze0XG4gICAgICB0aGlzLl9sb29wQ29ycmVjdENsaWVudFRpbWUoY2FsbElkLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLlNVQ0NFU1MsIGNsaWVudFN0YXJ0VGltZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhcnRUaW1lcyA9IDA7XG5cbiAgLyoqXG4gICAqIOW8gOWni+WumuaXtumAkuW9kuiOt+WPluS4jiBDYWxsU2VydmVyIOeahOaXtumXtOWBj+W3ruWAvFxuICAgKi9cbiAgcHVibGljIHN0YXJ0KHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl90aW1lcklkIHx8IHRoaXMuX3N0YXJ0VGltZXMgPj0gdGhpcy5fbWF4UmV0cnlUaW1lcykge1xuICAgICAgLy8g6Ziy5q2i6YeN5aSN5ZCv5YqoXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9TVEFSVF9PLCBgdGltZXJJZDogJHt0aGlzLl90aW1lcklkfWApO1xuXG4gICAgdGhpcy5fc3RhcnRUaW1lcysrO1xuXG4gICAgLy8g6I635Y+WXG4gICAgdGhpcy5fZ2V0RGVsdGFUaW1lKHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl90aW1lcklkID0gbnVsbDtcbiAgICAgIHRoaXMuc3RhcnQodHJhY2VJZCk7XG4gICAgfSwgdGhpcy5faW50ZXJ2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWBnOatouWumuaXtui9ruiurVxuICAgKi9cbiAgcHVibGljIHN0b3AodHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9TVE9QX08sIGB0aW1lcklkOiAke3RoaXMuX3RpbWVySWR9YCwgdHJhY2VJZCk7XG4gICAgdGhpcy5fdGltZXJJZCAmJiBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJJZCk7XG4gICAgdGhpcy5fdGltZXJJZCA9IG51bGw7XG4gICAgLy8g6YeN572u5qyh5pWwXG4gICAgdGhpcy5fc3RhcnRUaW1lcyA9IDA7XG4gIH1cblxuICAvKipcbiAgICog6YeN5paw5a6a5pe26L2u6K6tXG4gICAqL1xuICBwdWJsaWMgcmVzdGFydCh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX1JFU1RBUlRfTywgYGxlZ2FsIHJ0dCB0aW1lLCBSVFQ6ICR7dGhpcy5fUlRUfSwgdmFsaWRNaW5SVFQ6ICR7dGhpcy5fdmFsaWRNaW5SVFR9YCwgdHJhY2VJZCk7XG4gICAgaWYgKHRoaXMuX1JUVCA8IHRoaXMuX3ZhbGlkTWluUlRUKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIOa4hemZpOW9k+WJjeato+WcqOi/m+ihjOeahFxuICAgIHRoaXMuc3RvcCh0cmFjZUlkKTtcbiAgICAvLyDph43mlrDlkK/liqhcbiAgICB0aGlzLnN0YXJ0KHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIGdldExvY2FsRGVsYXlUaW1lKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RlbHRhVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSVFQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fUlRUO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluS4jiBDYWxsU2VydmVyIOeahOaXtumXtOWBj+W3ruWAvO+8jOmdnumAmuivneS4reeahOiuoeeul1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0RGVsdGFUaW1lKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIGRlbGF5VGltZT86IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIGNvbnN0IHsgY29kZSwgZGF0YTogc3luY1RpbWUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbFNlcnZlclRpbWVzdGFtcCh0cmFjZUlkKTtcblxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFJUVCA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG5cbiAgICAvLyDlsI/kuo4gMTAwMG1zIOS4uuWPr+eUqCBydHRcbiAgICBpZiAoKGN1cnJlbnRSVFQgPCB0aGlzLl9SVFQgfHwgdGhpcy5fUlRUID09PSAwKSAmJiBjdXJyZW50UlRUIDw9IHRoaXMuX3ZhbGlkTWF4UlRUKSB7XG4gICAgICB0aGlzLl9SVFQgPSBjdXJyZW50UlRUO1xuICAgIH1cblxuICAgIC8vIOWPquacieWwj+S6jiAyMDBtcyDlgZzmraLojrflj5ZcbiAgICBpZiAoY3VycmVudFJUVCA8IHRoaXMuX3ZhbGlkTWluUlRUKSB7XG4gICAgICAvLyDlsI/kuo7mnIDlsI/lj6/nlKggcnR077yM5YGc5q2i6L2u6K6t6K6h566XXG4gICAgICB0aGlzLnN0b3AodHJhY2VJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGVsdGFUaW1lID0gKHN5bmNUaW1lISAtIHN0YXJ0VGltZSkgLSB0aGlzLl9SVFQgLyAyO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9TRVRfREVMVEFfVElNRV9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBydHQ6IHRoaXMuX1JUVCxcbiAgICAgIGRlbHRhVDogdGhpcy5fZGVsdGFUaW1lLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIHJldHVybiB7IGNvZGUsIGRlbGF5VGltZTogdGhpcy5fZGVsdGFUaW1lIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit6I635Y+W5byA5aeL5pe26Ze0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9nZXREZWx0YVRpbWVJbkNhbGwoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLCBjbGllbnRTdGFydFRpbWU/OiBudW1iZXIsIGNsaWVudEZpcnN0RnJhbWVUaW1lPzogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRDYWxsVGltZUluZm8oY2FsbElkLCB0cmFjZUlkKTtcbiAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFJUVCA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG5cbiAgICAvLyDlsI/kuo4gMTAwMG1zIOS4uuWPr+eUqCBydHRcbiAgICBpZiAoY3VycmVudFJUVCA8IHRoaXMuX1JUVCkge1xuICAgICAgdGhpcy5fUlRUID0gY3VycmVudFJUVDtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWx0YVRpbWUgPSAoZGF0YSEuc3luY1RpbWUgLSBzdGFydFRpbWUpIC0gdGhpcy5fUlRUIC8gMjtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfU0VUX0RFTFRBX1RJTUVfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY2FsbElkLFxuICAgICAgcnR0OiB0aGlzLl9SVFQsXG4gICAgICBkZWx0YVQ6IHRoaXMuX2RlbHRhVGltZSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCBjbGllbnRTdGFydFRpbWUgPSBNYXRoLmZsb29yKGRhdGEhLnN0YXJ0VGltZSAtIHRoaXMuX2RlbHRhVGltZSk7XG4gICAgY29uc3QgY2xpZW50Rmlyc3RGcmFtZVRpbWUgPSBNYXRoLmZsb29yKGRhdGEhLmZpcnN0RnJhbWV0aW1lIC0gdGhpcy5fZGVsdGFUaW1lKTtcblxuICAgIC8vIOWPquacieWwj+S6jiAyMDBtcyDlgZzmraLojrflj5ZcbiAgICBpZiAoY3VycmVudFJUVCA8IHRoaXMuX3ZhbGlkTWluUlRUKSB7XG4gICAgICAvLyDmnIDkvJjnu5PmnpzvvIzlgZzmraLova7orq3orqHnrpdcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUywgY2xpZW50U3RhcnRUaW1lLCBjbGllbnRGaXJzdEZyYW1lVGltZSB9O1xuICAgIH1cbiAgICAvLyDpnZ7mnIDkvJjnu5PmnpxcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRSwgY2xpZW50U3RhcnRUaW1lLCBjbGllbnRGaXJzdEZyYW1lVGltZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmV0cnlUaW1lc0luQ2FsbDogbnVtYmVyID0gMFxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX21heFJldHJ5VGltZXNJbkNhbGw6IG51bWJlciA9IDNcblxuICAvKipcbiAgICog5aSa5qyh5qCh5q2j5oqb57uZ5Lia5Yqh5bGC55qE6YCa6K+d5byA5aeL5pe26Ze044CB6aaW5bin5pe26Ze0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9sb29wQ29ycmVjdENsaWVudFRpbWUoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOWFiOWBnOatouacque7k+adn+eahOiuoeeul1xuICAgIHRoaXMuc3RvcCh0cmFjZUlkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0xPT1BfQ09SUkVDVF9DTElORVRfVElNRV9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUsIGNsaWVudFN0YXJ0VGltZSwgY2xpZW50Rmlyc3RGcmFtZVRpbWUgfSA9IGF3YWl0IHRoaXMuX2dldERlbHRhVGltZUluQ2FsbChjYWxsSWQsIHRyYWNlSWQpO1xuXG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9MT09QX0NPUlJFQ1RfQ0xJTkVUX1RJTUVfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU31gLCB0cmFjZUlkKTtcbiAgICAgIC8vIOe7k+aenOacgOS8mO+8jOaKm+e7meW6lOeUqOWxguW8gOWni+aXtumXtFxuICAgICAgdGhpcy5fc2luZ2xlQ2FsbER1cmF0aW9uRXYoY2FsbElkLCBjbGllbnRTdGFydFRpbWUhLCBjbGllbnRGaXJzdEZyYW1lVGltZSEsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmV0cnlUaW1lc0luQ2FsbCA+IHRoaXMuX21heFJldHJ5VGltZXNJbkNhbGwgJiYgY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5JTlZBTElEX1JFU1BPTlNFX1RJTUUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfTE9PUF9DT1JSRUNUX0NMSU5FVF9USU1FX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FfWAsIHRyYWNlSWQpO1xuICAgICAgLy8g6Z2e5pyA5LyY57uT5p6c77yM5oqb57uZ5bqU55So5bGC5byA5aeL5pe26Ze077yM5qC55o2u6YeN6K+V5qyh5pWw6L+b6KGM6YeN6K+VOyDph43or5UgMyDmrKHlkI7lho3mipvlh7rkuLvopoHmmK/kuLrkuobojrflj5bmnIDlsI8gUlRUXG4gICAgICB0aGlzLl9zaW5nbGVDYWxsRHVyYXRpb25FdihjYWxsSWQsIGNsaWVudFN0YXJ0VGltZSEsIGNsaWVudEZpcnN0RnJhbWVUaW1lISwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXRyeVRpbWVzSW5DYWxsID4gdGhpcy5fbWF4UmV0cnlUaW1lc0luQ2FsbCkge1xuICAgICAgLy8g5peg5pyA5LyY57uT5p6c77yM5bqU55So5bGC5qC55o2u6Ieq5bex55qE5pe26Ze06LWw6KGoLCDnm7jlvZPkuo4gUlRUIOaMiSAwIOWkhOeQhlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JldHJ5VGltZXNJbkNhbGwrKztcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2xvb3BDb3JyZWN0Q2xpZW50VGltZShjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH0sIHRoaXMuX2ludGVydmFsKTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gRm9yd2FyZFR5cGUge1xuICAvKipcbiAgICog6YCa6L+H5LiL5LiA5qyh5Lq65ZGY54q25oCBIHVzZXJTdGF0ZSDnmoTkuIvlj5HlkIzmraXluKbkuIvljrtcbiAgICovXG4gIFNPT05fQUZFVEVSID0gMCxcbiAgLyoqXG4gICAqIOeri+WNs+i9rOWPkVxuICAgKi9cbiAgQ1VSUkVOVCA9IDEsXG59XG4iLCJpbXBvcnQgeyBSQ0NhbGxQbHVzTWVkaWFUeXBlLCBSQ0NhbGxQbHVzVHlwZSB9IGZyb20gJy4uL2FwaS9pbnRlcmZhY2UnO1xuXG5leHBvcnQgZW51bSBSQ0NhbGxQbHVzSW52aXRlU291cmNlIHtcbiAgUFVCX0lOVklURV9DQUxMID0gMCxcbiAgUFVMTF9LVl9JTlZJVEVfQ0FMTCA9IDEsXG4gIFNZU1RFTV9QVVNIID0gMixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU3RhdGlzdGljc0RhdGEge1xuICAvKipcbiAgICog5LiK5oql5pe26Ze0XG4gICAqL1xuICB0aW1lOiBudW1iZXIsXG4gIC8qKlxuICAgKiDov5DokKXllYbvvIzkvovlpoIg5Lit5Zu96IGU6YCaXG4gICAqL1xuICBjcjogc3RyaW5nLFxuICAvKipcbiAgICog572R57uc57G75Z6L77yM5L6L5aaCIDRHXG4gICAqL1xuICBuZXQ6IHN0cmluZyxcbiAgLyoqXG4gICAqIHVzZXJJZFxuICAgKi9cbiAgdWlkOiBzdHJpbmcsXG4gIC8qKlxuICAgKiDplJnor6/noIFcbiAgICovXG4gIGNvZDogbnVtYmVyLFxuICAvKipcbiAgICog6LCD55So5omn6KGM5pe26ZW/XG4gICAqL1xuICBkdXI6IG51bWJlclxuICAvKipcbiAgICog5aqS5L2T57G75Z6LXG4gICAqL1xuICBtdHA6IFJDQ2FsbFBsdXNNZWRpYVR5cGVcbiAgLyoqXG4gICAqIOmAmuivneexu+Wei++8jOengeiBiuaIlue+pOiBilxuICAgKi9cbiAgY3RwOiBSQ0NhbGxQbHVzVHlwZVxuICAvKipcbiAgICogY2FsbElkXG4gICAqL1xuICBjaWQ6IHN0cmluZ1xuICAvKipcbiAgICogY2xpZW50IGNhbGxJZFxuICAgKi9cbiAgY2NpZDogc3RyaW5nLFxuICAvKipcbiAgICog6YKA6K+35o6l5pS25p2l5rqQXG4gICAqL1xuICByZjogUkNDYWxsUGx1c0ludml0ZVNvdXJjZVxufVxuIiwiZXhwb3J0IGVudW0gUkNDYWxsRGlyZWN0aW9uIHtcbiAgLyoqXG4gICAqIOWRvOWHulxuICAgKi9cbiAgT1VUID0gLTEsXG4gIC8qKlxuICAgKiDnvqTlkbxcbiAgICovXG4gIEdST1VQID0gMCxcbiAgLyoqXG4gICAqIOWRvOWFpVxuICAgKi9cbiAgSU4gPSAxXG59XG4iLCJpbXBvcnQge1xuICBCYXNpY0xvZ2dlciwgRXZlbnRFbWl0dGVyLCBJUnVudGltZSwgUGx1Z2luQ29udGV4dCwgUkNDb25uZWN0aW9uU3RhdHVzLCBnZXRVVUlELFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWFsb2dBY3Rpb24gfSBmcm9tICcuL2VudW1zL0RpYWxvZ0FjdGlvbic7XG5pbXBvcnQgeyBEaWFsb2dUeXBlIH0gZnJvbSAnLi9lbnVtcy9EaWFsb2dUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NhbGxTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxUeXBlJztcbmltcG9ydCB7IFNlY3JldENhbGxUeXBlIH0gZnJvbSAnLi9lbnVtcy9TZWNyZXRDYWxsVHlwZSc7XG5pbXBvcnQgeyBJUkNDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMvSUluZGV4JztcbmltcG9ydCB7XG4gIElBY2NlcHRJbmZvLFxuICBJQWNjZXB0T3B0cyxcbiAgSUNhbGxJZCxcbiAgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLFxuICBJUkNDYWxsUGx1c0dldENhbGxSZWNvcmRSZXMsXG4gIElDYW5jZWxDaGFuZ2VNZWRpYVR5cGVPcHRzLFxuICBJR2V0Q2FsbExvZ0xpc3RPcHRzLFxuICBJR2V0Q2FsbFNlc3Npb25SZXMsXG4gIElIYW5ndXBJbmZvLFxuICBJSW52aXRlT3B0cyxcbiAgSUludml0ZVJlcyxcbiAgSUpvaW5DYWxsT3B0cyxcbiAgSU90aGVyTWVtSW5mbyxcbiAgSVJlcUNoYW5nZU1lZGlhVHlwZU9wdHMsXG4gIElSZXFDaGFuZ2VNZWRpYVR5cGVSZXMsXG4gIElSZXNDaGFuZ2VNZWRpYVR5cGVPcHRzLFxuICBJU2Vzc2lvblVzZXIsXG4gIElTdGFydENhbGxPcHRzLFxuICBJU3RhcnRDYWxsUmVzdWx0LFxuICBJSGFuZ3VwRm9yQnVzeU9wdHMsXG4gIElDaGFuZ2VNZWRpYVR5cGVJbmZvLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQge1xuICBJQ2FsbFNlc3Npb25Vc2VyLFxuICBJRGlhbG9nRG93bkNhbGxDb24sXG4gIElFdmVudERvd25DYWxsQ29uLFxuICBJR2V0Q2FsbFRpbWVJbmZvUmVzLFxuICBJR2V0RGVsYXlUaW1lSW5mb1JlcyxcbiAgSVB1YkNhbGxMb2csXG4gIElQdWJJbnZpdGVDb24sXG4gIElTdGF0dXNEb3duQ29udCxcbiAgSVN5c1N0YXR1c1VwT3B0cyxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lTaWduYWxUcmFuc3BvcnRlcic7XG5pbXBvcnQgeyBDYWxsVGltZXJFdmVudFR5cGUsIFJDQ2FsbElubmVyU2Vzc2lvbiB9IGZyb20gJy4vbW9kdWxlcy9SQ0NhbGxJbm5lclNlc3Npb24nO1xuaW1wb3J0IHsgU2lnbmFsVHJhbnNwb3J0ZXIgfSBmcm9tICcuL21vZHVsZXMvU2lnbmFsVHJhbnNwb3J0ZXInO1xuaW1wb3J0IHsgcGFyc2VTdGF0dXNEYXRhLCB0cmFuMkNhbGxMb2csIHRyYW5zU2VydmVyUHVzaEV4dCB9IGZyb20gJy4vdXRpbHMvaGVscGVyJztcbmltcG9ydCB7IGdldFVVSUQyMiB9IGZyb20gJy4vdXRpbHMvcmFuZG9tJztcbmltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4vdXRpbHMvdGltZXJzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxTZXNzaW9uVXNlclN0YXRlJztcbmltcG9ydCB7IEFibm9ybWFsQ2FsbCB9IGZyb20gJy4vbW9kdWxlcy9BYm5vcm1hbENhbGwnO1xuaW1wb3J0IHsgQ2FsbFNlcnZlckV2ZW50VHlwZSB9IGZyb20gJy4vZW51bXMvQ2FsbFNlcnZlckV2ZW50VHlwZSc7XG5pbXBvcnQgeyBUaW1lQ29ycmVjdGlvbmVyIH0gZnJvbSAnLi9tb2R1bGVzL1RpbWVDb3JyZWN0aW9uZXInO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb24gfSBmcm9tICcuL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24nO1xuaW1wb3J0IHsgRm9yd2FyZFR5cGUgfSBmcm9tICcuL2VudW1zL0ZvcndhcmRUeXBlJztcbmltcG9ydCB7XG4gIENhbGxIb29rc1R5cGUsIFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLCBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSUNhbGxIb29rcyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSwgUkNDYWxsUGx1c1JlYXNvbiB9IGZyb20gJy4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzSW52aXRlU291cmNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL0lDYWxsUGx1c1N0YXRpc3RpY3MnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCB9IGZyb20gJy4vZW51bXMvUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIH0gZnJvbSAnLi9tb2R1bGVzL1JDQ2FsbFBsdXNSZXBvcnRNb2R1bGUnO1xuaW1wb3J0IHsgUkNDYWxsRGlyZWN0aW9uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxEaXJlY3Rpb24nO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0lubmVyQ29kZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsUGx1c0lubmVyQ29kZSc7XG5cbmNvbnN0IENBTExfVElNRV9PVVQgPSA2MCAqIDEwMDA7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxFbmdpbmUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBzdGF0aWMgX19JTk5FUl9TRVNTSU9OX0NMT1NFX186IHN0cmluZyA9ICdpbm5lci1zZXNzaW9uLWNsb3NlJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX1NFU1NJT05fQ09OTkVDVF9fOiBzdHJpbmcgPSAnaW5uZXItc2Vzc2lvbi1jb25uZWN0J1xuXG4gIHN0YXRpYyBfX0lOTkVSX0NIQU5HRV9NRURJQV9UWVBFX186IHN0cmluZyA9ICdpbm5lci1jaGFuZ2UtbWVkaWEtdHlwZSdcblxuICBzdGF0aWMgX19JTk5FUl9JTlZJVEVfXzogc3RyaW5nID0gJ2lubmVyLWludml0ZSdcblxuICAvKipcbiAgICog5Li7IHNlc3Npb25cbiAgICovXG4gIF9tYWluU2Vzc2lvbjogUkNDYWxsSW5uZXJTZXNzaW9uIHwgbnVsbCA9IG51bGxcblxuICAvKipcbiAgICog5Zyo6YCa6K+d5Lit5pS25Yiw55qEIOmCgOivtyBzZXNzaW9uXG4gICAqL1xuICBfaG9sZFNlc3Npb25zOiBSQ0NhbGxJbm5lclNlc3Npb25bXSA9IFtdXG5cbiAgLyoqXG4gICAqIOS/oeS7pOaooeWdl1xuICAgKi9cbiAgX3NpZ25hbE1vZHVsZTogU2lnbmFsVHJhbnNwb3J0ZXJcblxuICAvKipcbiAgICog5byC5bi457uT5p2fIGNhbGwg5aSE55CG5ZmoXG4gICAqL1xuICBfYWJub3JtYWxNb2R1bGU6IEFibm9ybWFsQ2FsbFxuXG4gIC8qKlxuICAgKiDorrDlvZXljZXlkbzkuK3vvIzmmK/lkKbkuIrmiqXov4fnrKzkuIDluKdcbiAgICog572uIHRydWUg5pe25py677ya5pS25Yiw6L+c56uv56ys5LiA5bin77yM5oiQ5Yqf5LiK5oqlIFNlcnZlclxuICAgKiDnva4gZmFsc2Ug5pe25py677ya6YCa6K+d57uT5p2fXG4gICAqL1xuICBwcml2YXRlIF9pc1VwRmlyc3RGcmFtZVRpbWU6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDpgJror53kuLogT05DQUxMIOaXtu+8jFNESyDpnIDnu5nkuJrliqHlsYLkuIrmiqXpgJror53lvIDlp4vorqHml7bkuovku7ZcbiAgICog5Lya5pS25Yiw5aSa5qyhIE9OQ0FMTO+8jOaJgOS7pemcgOimgeagh+ivhuaYr+WQpuW3suaKm+i/h+S6i+S7tlxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbFN0YXJ0TWFwOiB7XG4gICAgW2NhbGxJZDogc3RyaW5nXToge1xuICAgICAgaXNSZWNlaXZlQ2FsbFN0YXJ0VGltZTogYm9vbGVhbixcbiAgICB9XG4gIH0gPSB7fVxuXG4gIC8qKlxuICAgKiDmoKHml7blmahcbiAgICovXG4gIF90aW1lQ29ycmVjdGlvbmVyOiBUaW1lQ29ycmVjdGlvbmVyXG5cbiAgLyoqXG4gICAqIGNsaWVudCBjYWxsSWRcbiAgICovXG4gIHByaXZhdGUgX2NsaWVudENhbGxJZDogc3RyaW5nID0gJydcblxuICAvKipcbiAgICog5p6E6YCg5ZmoXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWU6IElSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2luaXRPcHRzOiBJUkNDYWxsSW5pdE9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZXBvcnRBcHBFdmVudE1vZHVsZTogUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl90aW1lQ29ycmVjdGlvbmVyID0gbmV3IFRpbWVDb3JyZWN0aW9uZXIodGhpcywgX2xvZ2dlciwgdGhpcy5fb25SZWN2U2luQ2FsbER1cmF0aW9uLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3NpZ25hbE1vZHVsZSA9IG5ldyBTaWduYWxUcmFuc3BvcnRlcihfY29udGV4dCwgX3J1bnRpbWUsIF9pbml0T3B0cywgdGhpcy5fdGltZUNvcnJlY3Rpb25lciwgdGhpcy5fbG9nZ2VyKTtcbiAgICB0aGlzLl9zaWduYWxNb2R1bGUucmVnaXN0ZXJMaXN0ZW5lcih7XG4gICAgICBvbkludml0ZTogdGhpcy5fb25JbnZpdGUuYmluZCh0aGlzKSxcbiAgICAgIG9uU3RhdHVzRG93bjogdGhpcy5fb25TdGF0dXNEb3duLmJpbmQodGhpcyksXG4gICAgICBvbk90aGVyQ2xpZW50U3RhdHVzRG93bjogdGhpcy5fb25PdGhlckNsaWVudFN0YXR1c0Rvd24uYmluZCh0aGlzKSxcbiAgICAgIG9uRXZlbnREb3duOiB0aGlzLl9vbkV2ZW50RG93bi5iaW5kKHRoaXMpLFxuICAgICAgb25Td2l0Y2hNZWRpYVR5cGU6IHRoaXMuX29uU3dpdGNoTWVkaWFUeXBlLmJpbmQodGhpcyksXG4gICAgICBvblJlY3ZDYWxsRW5kTG9nOiB0aGlzLl9vblJlY3ZDYWxsRW5kTG9nLmJpbmQodGhpcyksXG4gICAgICBvbklNU3RhdGVDaGFuZ2U6IHRoaXMuX29uSU1TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpLFxuICAgIH0pO1xuICAgIHRoaXMuX2Fibm9ybWFsTW9kdWxlID0gbmV3IEFibm9ybWFsQ2FsbChfcnVudGltZSwgX2xvZ2dlcik7XG4gIH1cblxuICAvKipcbiAgICog5Y+R6LW35ZG85Y+rXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3RhcnRDYWxsKG9wdHM6IElTdGFydENhbGxPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJU3RhcnRDYWxsUmVzdWx0fT4ge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxUeXBlLCBtZWRpYVR5cGUsIHRvVXNlcnMsIHRhcmdldElkLCB0YXJnZXRUeXBlLCBvbGRSb29tSWQsIHB1c2hDb25maWcsIGV4dHJhLFxuICAgIH0gPSBvcHRzO1xuICAgIHRoaXMuX2NsaWVudENhbGxJZCA9IG9wdHMuY2FsbElkO1xuICAgIGNvbnN0IHB1c2hFeHQgPSBwdXNoQ29uZmlnID8gdHJhbnNTZXJ2ZXJQdXNoRXh0KHB1c2hDb25maWcsIHRoaXMuX2NsaWVudENhbGxJZCkgOiAnJztcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5zdGFydENhbGwoe1xuICAgICAgY2xpZW50Q2FsbElkOiB0aGlzLl9jbGllbnRDYWxsSWQsXG4gICAgICBjYWxsVHlwZSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHRvVXNlcnMsXG4gICAgICBzZWNyZXRDaGF0OiBTZWNyZXRDYWxsVHlwZS5OT1JNQUwsXG4gICAgICB0YXJnZXRUeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBvbGRSb29tSWQsXG4gICAgICBwdXNoRXh0LFxuICAgICAgZXh0cmEsXG4gICAgfSwgdHJhY2VJZCk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY2FsbElkLCBidXN5bGluZVVzZXJzIH0gPSBkYXRhITtcblxuICAgIC8vIOacrOWcsOWtmOWCqCBjYWxsSWQsIGNhbGwg5byC5bi46YCA5Ye65pe25L2/55SoXG4gICAgdGhpcy5fYWJub3JtYWxNb2R1bGUuYWRkQWJub3JtYWxsQ2FsbElkKGN1cnJlbnRVc2VySWQsIGNhbGxJZCk7XG5cbiAgICAvLyDnlJ/miJDkuLsgc2Vzc2lvblxuICAgIHRoaXMuX21haW5TZXNzaW9uID0gbmV3IFJDQ2FsbElubmVyU2Vzc2lvbihcbiAgICAgIGNhbGxJZCxcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuSU5WSVRFRCxcbiAgICAgIGNhbGxUeXBlLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgY3VycmVudFVzZXJJZCxcbiAgICAgIGN1cnJlbnRVc2VySWQsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICApO1xuXG4gICAgLy8g5Y2V5ZG85ZCv5Yqo5ZG85Y+r6LaF5pe26K6h5pe25ZmoLCDnvqTlkbzml6DotoXml7bpgLvovpFcbiAgICBpZiAoY2FsbFR5cGUgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSkge1xuICAgICAgY29uc3QgaW52aXRlclRpbWVySWQgPSB0aGlzLl9zdGFydFRpbWVyKGRhdGEhLmNhbGxJZCwgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTk9fQU5TV0VSLCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZVRpbWVySWQoQ2FsbFRpbWVyRXZlbnRUeXBlLklOVklURVIsIGludml0ZXJUaW1lcklkKTtcbiAgICB9XG5cbiAgICAvLyDpgJrnn6Xlt7HmlrnkurrlkZjnirbmgIHlj5jmm7RcbiAgICBjb25zdCBzZWxmU3RhdGUgPSB7XG4gICAgICB1c2VySWQ6IGN1cnJlbnRVc2VySWQsXG4gICAgICB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNBTExJTkcsXG4gICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5DQUxMSU5HLFxuICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgIH07XG4gICAgbGV0IGludml0ZWVzU3RhdGUgPSB0b1VzZXJzLm1hcCgoeyB1c2VySWQsIHRhcmdldFR5cGUsIHRhcmdldElkIH0pID0+ICh7XG4gICAgICB1c2VySWQsXG4gICAgICB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQsXG4gICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5JTlZJVEVELFxuICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgIH0pKTtcblxuICAgIGxldCBidXN5VXNlcnNTdGF0ZTogSVNlc3Npb25Vc2VyW10gPSBbXTtcbiAgICBpZiAoYnVzeWxpbmVVc2Vycykge1xuICAgICAgYnVzeVVzZXJzU3RhdGUgPSBidXN5bGluZVVzZXJzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCB7IHRhcmdldFR5cGUsIHRhcmdldElkIH0gPSBpbnZpdGVlc1N0YXRlLmZpbmQoKHVzZXIpID0+IHVzZXIudXNlcklkID09PSBpdGVtLnVzZXJJZCkhO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJJZDogaXRlbS51c2VySWQsXG4gICAgICAgICAgdXNlclN0YXRlOiBpdGVtLnNlc3Npb25TdGF0dXMsXG4gICAgICAgICAgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24uQlVTWUxJTkVfUklOR0lORyxcbiAgICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICAgIHRhcmdldElkLFxuICAgICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIC8vIOiiq+mCgOivt+iAheS4remcgOi/h+a7pOWHuuW/meeijOeUqOaIt1xuICAgICAgaW52aXRlZXNTdGF0ZSA9IGludml0ZWVzU3RhdGUuZmlsdGVyKCh7IHVzZXJJZCB9KSA9PiBidXN5VXNlcnNTdGF0ZS5ldmVyeSgoeyB1c2VySWQ6IGJ1c3lVc2VySWQgfSkgPT4gYnVzeVVzZXJJZCAhPT0gdXNlcklkKSk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBbc2VsZlN0YXRlLCAuLi5pbnZpdGVlc1N0YXRlLCAuLi5idXN5VXNlcnNTdGF0ZV0sIHRyYWNlSWQpO1xuICAgIH0pO1xuICAgIHJldHVybiB7IGNvZGUsIGRhdGEgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3pgoDor7dcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbnZpdGUob3B0czogSUludml0ZU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElJbnZpdGVSZXN9PiB7XG4gICAgLy8g5LiN5a2Y5Zyo5q2j5Zyo6YCa6K+d5LitIHNlc3Npb24sIOS4jeWFgeiuuOmCgOivt1xuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyB0b1VzZXJzLCBwdXNoQ29uZmlnLCBleHRyYSB9ID0gb3B0cztcbiAgICBjb25zdCBwdXNoRXh0ID0gcHVzaENvbmZpZyA/IHRyYW5zU2VydmVyUHVzaEV4dChwdXNoQ29uZmlnLCB0aGlzLl9jbGllbnRDYWxsSWQpIDogJyc7XG5cbiAgICBjb25zdCBjYWxsSWQgPSB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKTtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5pbnZpdGVDYWxsKHtcbiAgICAgIGNhbGxJZCxcbiAgICAgIHRvVXNlcnMsXG4gICAgICBwdXNoRXh0LFxuICAgICAgZXh0cmEsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpIHtcbiAgICAgICAgLy8g5Y2V5ZG85Lit6YKA6K+35oiQ5Yqf77yM5Y2z5pu05pawIGNhbGwgc2Vzc2lvbiDpgJror53nsbvlnovkuLrnvqTlkbxcbiAgICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlQ2FsbFR5cGUoUkNDYWxsUGx1c1R5cGUuTVVMVEkpO1xuICAgICAgICAvLyDpgJrnn6UgY2FsbFR5cGUg5Y+Y5pu05Li6576k5ZG8XG4gICAgICAgIHRoaXMuX29uQ2FsbFR5cGVDaGFuZ2UodGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksIFJDQ2FsbFBsdXNUeXBlLk1VTFRJLCB0cmFjZUlkKTtcbiAgICAgIH1cblxuICAgICAgLy8g6YCa55+l6KKr6YKA6K+35Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgICBsZXQgaW52aXRlZFVzZXJzU3RhdGUgPSB0b1VzZXJzLm1hcCgoeyB1c2VySWQsIHRhcmdldFR5cGUsIHRhcmdldElkIH0pID0+ICh7XG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVELFxuICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5JTlZJVEVELFxuICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICB9KSk7XG5cbiAgICAgIGxldCBidXN5bGluZVVzZXJzU3RhdGU6IElTZXNzaW9uVXNlcltdID0gW107XG4gICAgICBpZiAoZGF0YSEuYnVzeWxpbmVVc2Vycykge1xuICAgICAgICBidXN5bGluZVVzZXJzU3RhdGUgPSBkYXRhIS5idXN5bGluZVVzZXJzPy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCB7IHRhcmdldFR5cGUsIHRhcmdldElkIH0gPSBpbnZpdGVkVXNlcnNTdGF0ZS5maW5kKCh1c2VyKSA9PiB1c2VyLnVzZXJJZCA9PT0gaXRlbS51c2VySWQpITtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXNlcklkOiBpdGVtLnVzZXJJZCxcbiAgICAgICAgICAgIHVzZXJTdGF0ZTogaXRlbS5zZXNzaW9uU3RhdHVzLFxuICAgICAgICAgICAgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24uQlVTWUxJTkVfUklOR0lORyxcbiAgICAgICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgaW52aXRlZFVzZXJzU3RhdGUgPSBpbnZpdGVkVXNlcnNTdGF0ZS5maWx0ZXIoKHsgdXNlcklkIH0pID0+IGJ1c3lsaW5lVXNlcnNTdGF0ZS5ldmVyeSgoeyB1c2VySWQ6IGJ1c3lVc2VySWQgfSkgPT4gYnVzeVVzZXJJZCAhPT0gdXNlcklkKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIFsuLi5pbnZpdGVkVXNlcnNTdGF0ZSwgLi4uYnVzeWxpbmVVc2Vyc1N0YXRlXSwgdHJhY2VJZCk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUsIGRhdGEgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBiZWZvcmVIYW5ndXBcbiAgICovXG4gIHB1YmxpYyBjbGVhckFsbFRpbWVyKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICAvLyDmuIXpmaTmiYDmnInotoXml7borqHml7blmahcbiAgICBbdGhpcy5fbWFpblNlc3Npb24sIC4uLnRoaXMuX2hvbGRTZXNzaW9uc10uZm9yRWFjaCgoc2Vzc2lvbikgPT4ge1xuICAgICAgaWYgKHNlc3Npb24gJiYgc2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICAgIHNlc3Npb24uZ2V0QWxsVGltZXJJZHMoKS5mb3JFYWNoKCh0aW1lcklkKSA9PiB0aGlzLl9zdG9wVGltZXIuYmluZCh0aGlzKSh0aW1lcklkLCB0cmFjZUlkKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5oyC5patXG4gICAqIOmAmuivneivt+axguWPlua2iOOAgemAmuivneaLkue7nVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhbmd1cChvcHRzOiBJSGFuZ3VwRm9yQnVzeU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsSWQsIHN5c3RlbVN0YXRlLCBwdXNoQ29uZmlnLFxuICAgIH0gPSBvcHRzO1xuICAgIGNvbnN0IHB1c2hFeHQgPSBwdXNoQ29uZmlnID8gdHJhbnNTZXJ2ZXJQdXNoRXh0KHB1c2hDb25maWcsIHRoaXMuX2NsaWVudENhbGxJZCkgOiAnJztcbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmhhbmd1cENhbGwoe1xuICAgICAgY2FsbElkLFxuICAgICAgc3lzU3RhdHVzOiBzeXN0ZW1TdGF0ZSxcbiAgICAgIHB1c2hFeHQsXG4gICAgfSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5o6l5pS26YKA6K+3XG4gICAqIOmAmuivneS4reWPiOaUtuWIsOaWsOadpeeUteWQju+8jOaOpeWQrOaWsOadpeeUteaXtu+8jOW/hemhu+WFiOaMguaWreS5i+WJjeeahOmAmuivne+8iG1haW5TZXNzaW9u77yJXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWNjZXB0KG9wdHM6IElBY2NlcHRPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgLy8g5LiN5a2Y5ZyoIHNlc3Npb24g5LiN5YWB6K645o6l5ZCsXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNhbGxJZCB9ID0gb3B0cztcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5hY2NlcHRDYWxsKHtcbiAgICAgIGNhbGxJZCxcbiAgICB9LCB0cmFjZUlkKTtcblxuICAgIC8vIOa4hemZpOaOpeWQrOi2heaXtuiuoeaXtuWZqFxuICAgIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbi5nZXRJbnZpdGVlVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICB0aGlzLl9jbGVhck1vYmlsZU9uUGhvbmUob3B0cy5jYWxsSWQsIHRyYWNlSWQpO1xuICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZVNlc3Npb25TdGF0ZShSQ0NhbGxQbHVzQ2FsbFN0YXRlLkNPTk5FQ1RJTkcpO1xuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOebtOaOpeWKoOWFpVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGpvaW5DYWxsKG9wdHM6IElKb2luQ2FsbE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDlhYjmlLbliLAgb25JbnZpdGXvvIzmsqHmnInmjqXpgJrov4cgam9pbkNhbGwg5riF6Zmk5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgdGhpcy5fbWFpblNlc3Npb24gJiYgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uLmdldEludml0ZWVUaW1lcklkKCksIHRyYWNlSWQpO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmpvaW5DYWxsKHsgY2FsbElkOiBvcHRzLmNhbGxJZCB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIC8vIOacrOWcsOWtmOWCqCBjYWxsSWQsIGNhbGwg5byC5bi46YCA5Ye65pe25L2/55SoXG4gICAgdGhpcy5fYWJub3JtYWxNb2R1bGUuYWRkQWJub3JtYWxsQ2FsbElkKGN1cnJlbnRVc2VySWQsIG9wdHMuY2FsbElkKTtcblxuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIC8vIOWmguaenOS4jeWtmOWcqCBtYWluU2Vzc2lvbiDku44gc2VydmVyIOiOt+WPluW9k+WJjeWKoOWFpeeahCBzZXNzaW9uXG4gICAgICBhd2FpdCB0aGlzLl9jcmVhdGVTZXNzaW9uQnlTZXJ2ZXIob3B0cy5jYWxsSWQsIHRyYWNlSWQsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jbGVhck1vYmlsZU9uUGhvbmUob3B0cy5jYWxsSWQsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53lqpLkvZPlj5jmm7Tor7fmsYJcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0Q2hhbmdlTWVkaWFUeXBlKG9wdHM6IElSZXFDaGFuZ2VNZWRpYVR5cGVPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJUmVxQ2hhbmdlTWVkaWFUeXBlUmVzfT4ge1xuICAgIC8vIOS4jeWtmOWcqOato+WcqOmAmuivneS4rSBzZXNzaW9uLCDkuI3lhYHorrjosIPnlKhcbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIGNvbnN0IGV4dHJhS2V5VmFsID0ge1xuICAgICAgbWVkaWFUeXBlOiBvcHRzLm1lZGlhVHlwZSxcbiAgICB9O1xuICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZVJlcU1lZGlhVHlwZShvcHRzLm1lZGlhVHlwZSk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25JZCA9IGdldFVVSUQyMigpO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmRpYWxvZ1VwQ2FsbCh7XG4gICAgICB0cmFuc2FjdGlvbklkLFxuICAgICAgY2FsbElkOiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICAgIHRvVXNlcklkczogb3B0cy50b1VzZXJJZHMsXG4gICAgICBkaWFsb2dUeXBlOiBEaWFsb2dUeXBlLlNXSVRDSF9NRURJQV9UWVBFLFxuICAgICAgYWN0aW9uOiBEaWFsb2dBY3Rpb24uUkVRVUVTVCxcbiAgICAgIGV4dHJhS2V5VmFsLFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgZGF0YTogeyB0cmFuc2FjdGlvbklkIH0gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53lqpLkvZPnsbvlnovlj5jmm7Tor7fmsYLlk43lupRcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXNwb25zZUNoYW5nZU1lZGlhVHlwZShvcHRzOiBJUmVzQ2hhbmdlTWVkaWFUeXBlT3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIC8vIOS4jeWtmOWcqOato+WcqOmAmuivneS4rSBzZXNzaW9uLCDkuI3lhYHorrjosIPnlKhcbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlcU1lZGlhVHlwZSA9IHRoaXMuX21haW5TZXNzaW9uLmdldFJlcU1lZGlhVHlwZSgpO1xuICAgIGlmIChvcHRzLmFncmVlKSB7XG4gICAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVNZWRpYVR5cGUocmVxTWVkaWFUeXBlISk7XG4gICAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVSZXFNZWRpYVR5cGUobnVsbCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuZGlhbG9nVXBDYWxsKHtcbiAgICAgIHRyYW5zYWN0aW9uSWQ6IG9wdHMudHJhbnNhY3Rpb25JZCxcbiAgICAgIGNhbGxJZDogdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgICBkaWFsb2dUeXBlOiBEaWFsb2dUeXBlLlNXSVRDSF9NRURJQV9UWVBFLFxuICAgICAgYWN0aW9uOiBvcHRzLmFncmVlID8gRGlhbG9nQWN0aW9uLkFDQ0VQVCA6IERpYWxvZ0FjdGlvbi5SRUZVU0UsXG4gICAgfSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5Y+W5raI6YCa6K+d5aqS5L2T57G75Z6L5YiH5o2i6K+35rGCXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2FuY2VsQ2hhbmdlTWVkaWFUeXBlKG9wdHM6IElDYW5jZWxDaGFuZ2VNZWRpYVR5cGVPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgLy8g5LiN5a2Y5Zyo5q2j5Zyo6YCa6K+d5LitIHNlc3Npb24sIOS4jeWFgeiuuOiwg+eUqFxuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbE1vZHVsZS5kaWFsb2dVcENhbGwoe1xuICAgICAgdHJhbnNhY3Rpb25JZDogb3B0cy50cmFuc2FjdGlvbklkLFxuICAgICAgY2FsbElkOiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICAgIGRpYWxvZ1R5cGU6IERpYWxvZ1R5cGUuU1dJVENIX01FRElBX1RZUEUsXG4gICAgICBhY3Rpb246IERpYWxvZ0FjdGlvbi5DQU5DRUwsXG4gICAgfSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIGNhbGwgbG9nIOWIl+ihqFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENhbGxMb2dMaXN0KG9wdHM6IElHZXRDYWxsTG9nTGlzdE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElSQ0NhbGxQbHVzR2V0Q2FsbFJlY29yZFJlc30+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7IHRpbWVzdGFtcCwgY291bnQsIG9yZGVyIH0gPSBvcHRzO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLnN5bmNDYWxsTG9nKHtcbiAgICAgIHVzZXJJZDogY3VycmVudFVzZXJJZCxcbiAgICAgIHN5bmNUaW1lOiB0aW1lc3RhbXAsXG4gICAgICBjb3VudCxcbiAgICAgIG9yZGVyLFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIGNvbnN0IGNhbGxMb2c6IElSQ0NhbGxQbHVzQ2FsbFJlY29yZFtdID0gZGF0YSEuY2FsbExvZ0xpc3QubWFwKChpdGVtKSA9PiB0cmFuMkNhbGxMb2coaXRlbSkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGhhc01vcmU6IEJvb2xlYW4oZGF0YT8uaGFzTW9yZSksXG4gICAgICAgIHN5bmNUaW1lOiBvcmRlciA9PT0gMCA/IGRhdGEhLm1heFRpbWUgOiBkYXRhIS5taW5UaW1lLFxuICAgICAgICBsaXN0OiBjYWxsTG9nLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaJuemHj+WIoOmZpOmAmuivneaXpeW/l1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlbGV0ZUNhbGxMb2coY2FsbElkczogc3RyaW5nW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmRlbGV0ZUNhbGxSZWNvcmQoY3VycmVudFVzZXJJZCwgY2FsbElkcywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIGNhbGwgc2VydmVyIOW9k+WJjeaXtumXtOaIs1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENhbGxTZXJ2ZXJUaW1lc3RhbXAodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogbnVtYmVyfT4ge1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmdldENhbGxTZXJ2ZXJUaW1lc3RhbXAodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSwgZGF0YTogZGF0YSEuc3luY1RpbWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCDml7bpl7Tkv6Hmga9cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsVGltZUluZm8oY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElHZXRDYWxsVGltZUluZm9SZXN9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRDYWxsVGltZUluZm8oY2FsbElkLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bmnKrnu5PmnZ/nmoTpgJror53liJfooahcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRPcGVuQ2FsbExpc3QodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkW10gfT4ge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YTogcmVzRGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmdldFVzZXJDYWxsU3RhdGVMaXN0KHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdCA9IHJlc0RhdGEhLmNhbGxTdGF0ZUxpc3QubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNhbGxJZCwgY2FsbFR5cGUsIG1lZGlhVHlwZSwgY2FsbGluZ1VzZXJJZCwgY2FsbFVzZXJJZHMsIGNhbGxTdGF0dXMsIGNydFRpbWUsIHVzZXJTZXNzaW9uU3RhdHVzLCBzdGFydFRpbWUsIHN5bmNUaW1lLFxuICAgICAgfSA9IGl0ZW07XG4gICAgICBjb25zdCBjYWxsRGlyZWN0aW9uID0gKGNhbGxpbmdVc2VySWQgPT09IGN1cnJlbnRVc2VySWQpID8gUkNDYWxsRGlyZWN0aW9uLk9VVCA6IFJDQ2FsbERpcmVjdGlvbi5JTjtcbiAgICAgIGNvbnN0IHsgY2xpZW50U3RhcnRUaW1lID0gc3RhcnRUaW1lIH0gPSB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmNhbGNDbGllbnRTdGFydFRpbWUoY2FsbElkLCBzdGFydFRpbWUsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBjYWxsVHlwZSxcbiAgICAgICAgY2FsbERpcmVjdGlvbixcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBjYWxsZXJVc2VySWQ6IGNhbGxpbmdVc2VySWQsXG4gICAgICAgIGNhbGxVc2VySWRzLFxuICAgICAgICBzZXNzaW9uU3RhdGU6IGNhbGxTdGF0dXMsXG4gICAgICAgIHVzZXJTdGF0ZTogdXNlclNlc3Npb25TdGF0dXMsXG4gICAgICAgIHN0YXJ0VGltZXN0YW1wOiBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWVzdGFtcDogMCxcbiAgICAgICAgZHVyYXRpb246IE1hdGguZmxvb3IoKCtuZXcgRGF0ZSgpIC0gY2xpZW50U3RhcnRUaW1lKSAvIDEwMDApLFxuICAgICAgICBzeW5jVGltZXN0YW1wOiBzeW5jVGltZSxcbiAgICAgICAgc3lzdGVtU3RhdGU6IDAsXG4gICAgICAgIGNyZWF0ZVRpbWVzdGFtcDogY3J0VGltZSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29kZSxcbiAgICAgIGRhdGE6IGxpc3QsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmuIXpmaTlvZPliY3nlKjmiLfnmoQgY2FsbCBsb2dcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZW1vdmVBbGxDYWxsTG9nKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuY2xlYXJDYWxsUmVjb3JkKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJrov4cgY2FsbElkIOiOt+WPliBzZXNzaW9uIOivpue7huS/oeaBr1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENhbGxTZXNzaW9uKG9wdHM6IElDYWxsSWQsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElHZXRDYWxsU2Vzc2lvblJlc30+IHtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRDYWxsU2Vzc2lvbihvcHRzLCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgY2FsbGluZ1VzZXJJZCwgY2FsbFR5cGUsIG1lZGlhVHlwZSwgY2FsbFN0YXR1cywgY2FsbFNlc3Npb25Vc2Vycywgc3RhcnRUaW1lLCBkdXJhdGlvbiwgc3luY1RpbWUsXG4gICAgfSA9IGRhdGEhO1xuICAgIGNvbnN0IHNlc3Npb25Vc2VycyA9IGNhbGxTZXNzaW9uVXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHVzZXJJZCwgc2Vzc2lvblN0YXR1cywgc3lzU3RhdHVzLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCxcbiAgICAgIH0gPSBpdGVtO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBzeXNTdGF0dXMsXG4gICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGUsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgc3RhcnRDYWxsZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbFR5cGUsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgc2Vzc2lvblN0YXRlOiBjYWxsU3RhdHVzLFxuICAgICAgICBjYWxsU2Vzc2lvblVzZXJzOiBzZXNzaW9uVXNlcnMsXG4gICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIHN5bmNUaW1lLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldEhvbGRTZXNzaW9uKGNhbGxJZDogc3RyaW5nKTogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsIHtcbiAgICBjb25zdCBpbm5lclNlc3Npb24gPSB0aGlzLl9ob2xkU2Vzc2lvbnMuZmluZCgoc2Vzc2lvbikgPT4gc2Vzc2lvbiAmJiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuICAgIHJldHVybiBpbm5lclNlc3Npb24gPyBuZXcgUkNDYWxsUGx1c1Nlc3Npb24oaW5uZXJTZXNzaW9uLCB0aGlzLCB0aGlzLl9sb2dnZXIpIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3kuLsgc2Vzc2lvblxuICAgKi9cbiAgcHVibGljIGdldExvY2FsTWFpblNlc3Npb24oKTogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWFpblNlc3Npb24gPyBuZXcgUkNDYWxsUGx1c1Nlc3Npb24odGhpcy5fbWFpblNlc3Npb24sIHRoaXMsIHRoaXMuX2xvZ2dlcikgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruS4uyBzZXNzaW9uIOeKtuaAgVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZU1haW5TZXNzaW9uU3RhdGUoc3RhdGU6IFJDQ2FsbFBsdXNDYWxsU3RhdGUpIHtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8udXBkYXRlU2Vzc2lvblN0YXRlKHN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorrDlvZXmmK/lkKbmmK/mnKznq6/mjILmlq1cbiAgICovXG4gIHB1YmxpYyBzZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKGlzTG9jYWxDbGllbnRIYW5ndXA6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8uc2V0SXNMb2NhbENsaWVudEhhbmd1cChpc0xvY2FsQ2xpZW50SGFuZ3VwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJrnn6XkurrlkZjnirbmgIFcbiAgICogQ2FsbENsaWVudCDkuZ/pnIDopoHmm7TmlrDkurrlkZjnirbmgIHvvIzlrprkuYnkuLrlhazlhbHlh73mlbBcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZDogc3RyaW5nLCB1c2VyczogSVNlc3Npb25Vc2VyW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUERBVEVfVVNFUlNfU1RBVEVfTywgYHVwZGF0ZVVzZXJzU3RhdGUgLT4gdXNlcnM6ICR7SlNPTi5zdHJpbmdpZnkodXNlcnMpfWAsIHRyYWNlSWQpO1xuXG4gICAgLy8g5pu05pawIHNlc3Npb24g5Lq65ZGY5YiX6KGoXG4gICAgY29uc3Qgc2Vzc2lvbiA9IFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5maW5kKChpdGVtKSA9PiBpdGVtPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKTtcblxuICAgIGNvbnN0IGNoYW5nZWRVc2VycyA9IFtdO1xuICAgIGlmIChzZXNzaW9uKSB7XG4gICAgICBjb25zdCBuZXdVc2VycyA9IHVzZXJzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBvbGRVc2VyU3RhdGUgPSBzZXNzaW9uLmdldFVzZXJMaXN0KCkuZmlsdGVyKCh7IHVzZXJJZCB9KSA9PiB1c2VySWQgPT09IGl0ZW0udXNlcklkKVswXSB8fCB7fTtcbiAgICAgICAgY29uc3QgaXNJZGxlID0gaXRlbS51c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklETEU7XG4gICAgICAgIGNvbnN0IHsgY2FtZXJhRW5hYmxlID0gZmFsc2UsIG1pY3JvcGhvbmVFbmFibGUgPSBmYWxzZSB9ID0gaXNJZGxlID8geyBjYW1lcmFFbmFibGU6IGZhbHNlLCBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSB9IDogb2xkVXNlclN0YXRlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgY2FtZXJhRW5hYmxlLFxuICAgICAgICAgIG1pY3JvcGhvbmVFbmFibGUsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgY2hhbmdlZFVzZXJzLnB1c2goLi4uc2Vzc2lvbi51cGRhdGVVc2VyTGlzdChuZXdVc2VycywgdHJhY2VJZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFuZ2VkVXNlcnMucHVzaCguLi51c2Vycyk7XG4gICAgfVxuICAgIC8vIOmAmuefpeS6i+S7tlxuICAgIGNoYW5nZWRVc2Vycy5sZW5ndGggPiAwICYmIHRoaXMuX29uVXNlclN0YXRlQ2hhbmdlKGNhbGxJZCwgY2hhbmdlZFVzZXJzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRVc2VyRGV2aWNlRW5hYmxlKHVzZXJJZDogc3RyaW5nLCBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIGVuYWJsZTogYm9vbGVhbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbWFpblNlc3Npb24/LnNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkLCBtZWRpYVR5cGUsIGVuYWJsZSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6YCa6K+d5byA5aeL5pe26Ze0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFN0YXJpbmdUaW1lKG9wdHM6IElDYWxsSWQsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZHVyYXRpb24/OiBudW1iZXIsIGNsaWVudFN0YXJ0VGltZT86IG51bWJlcn0+IHtcbiAgICByZXR1cm4gdGhpcy5fdGltZUNvcnJlY3Rpb25lci5nZXRDYWxsQ2xpZW50VGltZUJ5U2VydmVyKG9wdHMuY2FsbElkLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDkurrlkZjns7vnu5/nirbmgIHkuIrmiqVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzeXN0ZW1TdGF0dXNVcChvcHRzOiBJU3lzU3RhdHVzVXBPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuc3lzU3RhdHVzVXAob3B0cywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5Y2V5ZG85Lit5pS25Yiw6L+c56uv5rWB5ZCO77yM57uZIENhbGxTZXJ2ZXIg5LiK5oql77yM55So5LqO5aSE55CG6K6h5pe26YC76L6RXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBGaXJzdEZyYW1lVGltZSh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3Qgbm9OZWVkVXBDb25kaXRpb24gPSAhdGhpcy5fbWFpblNlc3Npb25cbiAgICAgIHx8ICh0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsVHlwZSgpICE9PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpXG4gICAgICB8fCB0aGlzLl9pc1VwRmlyc3RGcmFtZVRpbWU7XG4gICAgaWYgKG5vTmVlZFVwQ29uZGl0aW9uKSB7XG4gICAgICAvLyDkuI3lrZggbWFpblNlc3Npb24g5oiWIOmAmui/h+exu+Wei+S4jeS4uuWNleWRvOaXtu+8jOS4jeS4iuaKpe+8jOebtOaOpei/lOWbnuaIkOWKn1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlbGF5VGltZSA9IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuZ2V0TG9jYWxEZWxheVRpbWUoKTtcbiAgICBjb25zdCBzdHJlYW1SZWFkeVRpbWUgPSBNYXRoLmZsb29yKG5vdyArIGRlbGF5VGltZSk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQX0ZJUlNUX0ZSQU1FX1RJTUVfVCwgYG5vdzogJHtub3d9OyBkZWxheTogJHtkZWxheVRpbWV9OyBzdHJlYW1SZWFkeVRpbWU6ICR7c3RyZWFtUmVhZHlUaW1lfWAsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5faXNVcEZpcnN0RnJhbWVUaW1lID0gdHJ1ZTtcblxuICAgIGNvbnN0IGNhbGxJZCA9IHRoaXMuX21haW5TZXNzaW9uIS5nZXRDYWxsSWQoKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5ldmVudFVwQ2FsbCh7XG4gICAgICBjYWxsSWQsXG4gICAgICBldmVudFR5cGU6IENhbGxTZXJ2ZXJFdmVudFR5cGUuRklSU1RfRlJBTUUsXG4gICAgICBldmVudEFyZ3M6IHsgc3RyZWFtUmVhZHlUaW1lIH0sXG4gICAgICBldmVudFRpbWU6IERhdGUubm93KCksXG4gICAgfSwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfVVBfRklSU1RfRlJBTUVfVElNRV9SLCBgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOS4iuWxguaooeaLnyBzdGF0dXNEb3duQ2FsbCwg57uT5p2fIHNlc3Npb25cbiAgICog6YCa6K+d5bu656uL5ZCO77yM5Y+q6IO957uT5p2fIG1haW5TZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZW5kQ3VycmVudFNlc3Npb24oY3VycmVudFVzZXJTeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbiwgY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICBjb25zdCBzZXNzaW9uVXNlcnM6IElDYWxsU2Vzc2lvblVzZXJbXSA9IHRoaXMuX21haW5TZXNzaW9uLmdldFVzZXJMaXN0KCkubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgdXNlcklkLCBzeXN0ZW1TdGF0ZSwgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQsXG4gICAgICAgIH0gPSBpdGVtO1xuICAgICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgICAgc3lzdGVtU3RhdGUgPSBjdXJyZW50VXNlclN5c3RlbVN0YXRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHNlc3Npb25TdGF0dXM6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkVOREVELFxuICAgICAgICAgIHN0YXR1c1RpbWU6IERhdGUubm93KCksXG4gICAgICAgICAgZHVyYXRpb246IDAsXG4gICAgICAgICAgY2hhbmdlZDogMSxcbiAgICAgICAgICBpbnZpdGVVc2VySWQ6IHRoaXMuX21haW5TZXNzaW9uIS5nZXRTdGFydENhbGxlcklkKCksXG4gICAgICAgICAgc3lzU3RhdHVzOiBzeXN0ZW1TdGF0ZSxcbiAgICAgICAgICB0YXJnZXRUeXBlLFxuICAgICAgICAgIHRhcmdldElkLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhOiBJU3RhdHVzRG93bkNvbnQgPSB7XG4gICAgICAgIGNhbGxJZDogdGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgICAgIHRvRGV2aWNlSWQ6IHRoaXMuX3NpZ25hbE1vZHVsZS5nZXRTZXNzaW9uSWQoKSxcbiAgICAgICAgY2FsbFN0YXR1czogUkNDYWxsUGx1c0NhbGxTdGF0ZS5FTkRFRCxcbiAgICAgICAgZHVyYXRpb246IDAsXG4gICAgICAgIGNhbGxTZXNzaW9uVXNlcnM6IHNlc3Npb25Vc2VycyxcbiAgICAgIH07XG4gICAgICB0aGlzLl9vblN0YXR1c0Rvd24oZGF0YSwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOS4iuWxgiBSVEMg5Yqg5YWl5oi/6Ze05ZCO6YeN5paw5byA5aeL5qCh5pe2XG4gICAqL1xuICBwdWJsaWMgc3RhcnRUaW1lQ29ycmVjdGlvbih0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLnJlc3RhcnQodHJhY2VJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGVsYXlUaW1lSW5mbygpOiBJR2V0RGVsYXlUaW1lSW5mb1JlcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlbGF5VGltZTogdGhpcy5fdGltZUNvcnJlY3Rpb25lci5nZXRMb2NhbERlbGF5VGltZSgpLFxuICAgICAgcnR0OiB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmdldFJUVCgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogaG9sZFNlc3Npb24g5Y2H57qn5Li6IG1haW5TZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgdXBncmFkZU1haW5TZXNzaW9uKGhvbGRDYWxsSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5faG9sZFNlc3Npb25zLmZpbmRJbmRleCgoc2Vzc2lvbikgPT4gc2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gaG9sZENhbGxJZCk7XG4gICAgdGhpcy5fbWFpblNlc3Npb24gPSB0aGlzLl9ob2xkU2Vzc2lvbnMuc3BsaWNlKGluZGV4LCAxKT8uWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIOa4hemZpOW8guW4uOe7k+adn+eahCBjYWxsXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5kQ3VycmVudFVzZXJBYm5vcm1hbENhbGxzKG9wdHM6IHthbGxEZXZpY2U6IGJvb2xlYW59KTogUHJvbWlzZTx7Y29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCBjYWxsSWRzID0gYXdhaXQgdGhpcy5fYWJub3JtYWxNb2R1bGUuZ2V0QWJub3JtYWxDYWxsSWRzKGN1cnJlbnRVc2VySWQpO1xuICAgIGlmICghY2FsbElkcykge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmVuZFVzZXJBYm5vcm1hbENhbGxzKHtcbiAgICAgIGNhbGxJZHMsXG4gICAgICBhbGxEZXZpY2U6IG9wdHMuYWxsRGV2aWNlID8gMSA6IDAsXG4gICAgfSk7XG5cbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fYWJub3JtYWxNb2R1bGUucmVtb3ZlQWJub3JtYWxDYWxsSWRzKGN1cnJlbnRVc2VySWQsIGNhbGxJZHMpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKiogPT09PT0956eB5pyJ5pa55rOVPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiAgLyoqXG4gICAqIElNIOeKtuaAgeWPmOabtOWkhOeQhlxuICAgKi9cbiAgcHJpdmF0ZSBfb25JTVN0YXRlQ2hhbmdlKHN0YXRlOiBSQ0Nvbm5lY3Rpb25TdGF0dXMpIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICBsZXQgdGltZXJJZDogbnVtYmVyID0gMDtcbiAgICBpZiAoc3RhdGUgPT09IFJDQ29ubmVjdGlvblN0YXR1cy5ESVNDT05ORUNURUQpIHtcbiAgICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRTZXNzaW9uU3RhdGUoKSAhPT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgICAgLy8g5pat572R562J5b6FIDYwcyDlkI7op6blj5Egb25TZXNzaW9uQ2xvc2VcbiAgICAgICAgdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0lNX1NUQVRFX0NIQU5HRV9PLCAnZW5kQ3VycmVudFNlc3Npb24sIElNIGRpc2Nvbm5lY3RlZCBmb3IgbW9yZSB0aGFuIDYwcycsIHRyYWNlSWQpO1xuICAgICAgICAgIHRoaXMuZW5kQ3VycmVudFNlc3Npb24oUkNDYWxsUGx1c1JlYXNvbi5DT05ORUNUSU9OX0VSUiwgdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpISwgdHJhY2VJZCk7XG4gICAgICAgIH0sIENBTExfVElNRV9PVVQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhdGUgPT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRpbWVySWQgJiYgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgdGhpcy5lbmRDdXJyZW50VXNlckFibm9ybWFsQ2FsbHMoeyBhbGxEZXZpY2U6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWkhOeQhuWPkei1t+mCgOivt+OAgeaUtuWIsOmCgOivt+WQjuiuoeaXtui2heaXtlxuICAgKiDmj5DliY3mqKHmi58gX29uU3RhdHVzRG93biwg5LiN5YaN5L6d6LWWIENhbGxTZXJ2ZXIg5LiL5Y+R55qEIF9vblN0YXR1c0Rvd25cbiAgICog5aSE55CG572R57uc5byC5bi45oOF5Ya15LiL5LiK5oqlIENhbGxTZXJ2ZXIg5aSx6LSl77yMQ2FsbFNlcnZlciDkuI3kvJrkuIvlj5EgX29uU3RhdHVzRG93biDmg4XlhrVcbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZUNhbGxUaW1lb3V0KGNhbGxJZDogc3RyaW5nLCB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ0FMTF9USU1FT1VUX08sIGBjYWxsIHRpbWVvdXQgY2FsbElkOiAke2NhbGxJZH0sIHVzZXJTdGF0ZTogJHt1c2VyU3RhdGV9YCwgdHJhY2VJZCk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5maW5kKChzZXNzaW9uKSA9PiBzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ0FMTF9USU1FT1VUX08sIGBoYW5kbGVDYWxsVGltZW91dCB3aXRob3V0IHNlc3Npb24sIGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICB0aGlzLl9vblN0YXR1c0Rvd24oe1xuICAgICAgY2FsbElkLFxuICAgICAgdG9EZXZpY2VJZDogdGhpcy5fc2lnbmFsTW9kdWxlLmdldFNlc3Npb25JZCgpLFxuICAgICAgY2FsbFN0YXR1czogUkNDYWxsUGx1c0NhbGxTdGF0ZS5FTkRFRCxcbiAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgY2FsbFNlc3Npb25Vc2Vyczogc2Vzc2lvbi5nZXRVc2VyTGlzdCgpLm1hcCgodXNlcikgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdXNlcklkLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCwgc3RhdGVUaW1lLFxuICAgICAgICB9ID0gdXNlcjtcblxuICAgICAgICBsZXQgc3lzU3RhdHVzOiBSQ0NhbGxQbHVzUmVhc29uO1xuICAgICAgICBsZXQgc2Vzc2lvblN0YXR1czogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGU7XG4gICAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICBzeXNTdGF0dXMgPSB1c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCA/IFJDQ2FsbFBsdXNSZWFzb24uTUlTU0VEIDogUkNDYWxsUGx1c1JlYXNvbi5OT19BTlNXRVI7XG4gICAgICAgICAgc2Vzc2lvblN0YXR1cyA9IHVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEID8gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEIDogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTk9fQU5TV0VSO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN5c1N0YXR1cyA9IHVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEID8gUkNDYWxsUGx1c1JlYXNvbi5OT19BTlNXRVIgOiBSQ0NhbGxQbHVzUmVhc29uLk1JU1NFRDtcbiAgICAgICAgICBzZXNzaW9uU3RhdHVzID0gdXNlclN0YXRlID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQgPyBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5OT19BTlNXRVIgOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBzZXNzaW9uU3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RpbWU6IHN0YXRlVGltZSA/IHN0YXRlVGltZSArIDEgOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICAgIGNoYW5nZWQ6IDEsXG4gICAgICAgICAgaW52aXRlVXNlcklkOiBzZXNzaW9uLmdldENhbGxlcklkKCksXG4gICAgICAgICAgc3lzU3RhdHVzLFxuICAgICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvIDlkK/otoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX3N0YXJ0VGltZXIoY2FsbElkOiBzdHJpbmcsIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUsIHRyYWNlSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgLy8g5ZCv5Yqo5ZG85Y+r6LaF5pe26K6h5pe25ZmoXG4gICAgY29uc3QgdGltZXJJZCA9IHRpbWVyU2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9oYW5kbGVDYWxsVGltZW91dChjYWxsSWQsIHVzZXJTdGF0ZSwgdHJhY2VJZCk7XG4gICAgICAvLyDkuIrmiqUgY2FsbCBzZXJ2ZXIg6LaF5pe2XG4gICAgICB0aGlzLl9zaWduYWxNb2R1bGUuc3RhdHVzVXBDYWxsKHsgY2FsbElkLCBzZXNzaW9uU3RhdHVzOiB1c2VyU3RhdGUgfSwgdHJhY2VJZCk7XG4gICAgfSwgQ0FMTF9USU1FX09VVCk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfU1RBUlRfQ0FMTF9USU1FUl9PLCBgY2FsbElkOiAke2NhbGxJZH0sIHRpbWVySWQ6ICR7dGltZXJJZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGltZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDlgZzmraLotoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX3N0b3BUaW1lcih0aW1lcklkOiBudW1iZXIsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfU1RPUF9DQUxMX1RJTUVSX08sIGB0aW1lcklkOiAke3RpbWVySWR9YCwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5pS25YiwIOmAmuivnemCgOivt1xuICAgKi9cbiAgcHJpdmF0ZSBfb25JbnZpdGUoZGF0YTogSVB1Ykludml0ZUNvbiwgaXNEaXJlY3RseTogYm9vbGVhbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2xpZW50Q2FsbElkID0gZ2V0VVVJRCgpO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxTZXNzaW9uVXNlcnMsIHNlY3JldENoYXQsIGV4dHJhID0gJ3t9JyxcbiAgICB9ID0gZGF0YTtcblxuICAgIGlmIChzZWNyZXRDaGF0ID09PSBTZWNyZXRDYWxsVHlwZS5TRUNSRVQpIHtcbiAgICAgIC8vIOWmguaenOaYr+WvhuiBiumAmuivneS4jeWkhOeQhlxuICAgICAgdGhpcy5lbWl0KENhbGxIb29rc1R5cGUub25QdWJJbnZpdGVDYWxsTWlzcywgT2JqZWN0LmFzc2lnbihkYXRhLCB7XG4gICAgICAgIGV4dHJhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgcmVhc29uOiBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbi5TRUNSRVRfQ0FMTCxcbiAgICAgICAgcmVmZXI6IGlzRGlyZWN0bHkgPyBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLlBVQl9JTlZJVEUgOiBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLlBVTExfS1ZfSU5WSVRFLFxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOWmguaenOiHquW3seaYr+iiq+mCgOivt+eahOeUqOaIt1xuICAgIGNvbnN0IGlzSW52aXRlZSA9IGNhbGxTZXNzaW9uVXNlcnMuc29tZSgoaXRlbSkgPT4gaXRlbS51c2VySWQgPT09IGN1cnJlbnRVc2VySWQpO1xuICAgIGlmIChpc0ludml0ZWUpIHtcbiAgICAgIHRoaXMuX3NlbGZJc0ludml0ZWVIYW5kbGUoZGF0YSwgaXNEaXJlY3RseSwgdHJhY2VJZCwgZXh0cmEpO1xuICAgIH1cblxuICAgIHRoaXMuX290aGVyc0lzSW52aXRlZUhhbmRsZShkYXRhLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmnKznq6/ooqvpgoDor7flpITnkIZcbiAgICovXG4gIHByaXZhdGUgX3NlbGZJc0ludml0ZWVIYW5kbGUoZGF0YTogSVB1Ykludml0ZUNvbiwgaXNEaXJlY3RseTogYm9vbGVhbiwgdHJhY2VJZDogc3RyaW5nLCBleHRyYTogc3RyaW5nKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbElkLCBpbnZpdGVVc2VySWQsIGNhbGxUeXBlLCBtZWRpYVR5cGUsIGNhbGxTZXNzaW9uVXNlcnMsXG4gICAgfSA9IGRhdGE7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgLy8g5pys5Zyw5a2Y5YKoIGNhbGxJZCwgY2FsbCDlvILluLjpgIDlh7rml7bkvb/nlKhcbiAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZS5hZGRBYm5vcm1hbGxDYWxsSWQoY3VycmVudFVzZXJJZCwgY2FsbElkKTtcblxuICAgIC8vIOeUn+aIkCBjYWxsU2Vzc2lvblxuICAgIGNvbnN0IGlubmVyU2Vzc2lvbiA9IG5ldyBSQ0NhbGxJbm5lclNlc3Npb24oXG4gICAgICBjYWxsSWQsXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLlJJTkdJTkcsXG4gICAgICBjYWxsVHlwZSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGludml0ZVVzZXJJZCxcbiAgICAgIGludml0ZVVzZXJJZCxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICk7XG4gICAgLy8gY2FsbCBzZXJ2ZXIg5ZON6ZOD5LiK5oqlXG4gICAgdGhpcy5fc2lnbmFsTW9kdWxlLnJpbmdpbmdDYWxsKHsgY2FsbElkIH0sIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5ZCv5Yqo5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgICovXG4gICAgY29uc3QgaW52aXRlZVRpbWVySWQgPSB0aGlzLl9zdGFydFRpbWVyKGNhbGxJZCwgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VELCB0cmFjZUlkKTtcbiAgICBpbm5lclNlc3Npb24udXBkYXRlVGltZXJJZChDYWxsVGltZXJFdmVudFR5cGUuSU5WSVRFRSwgaW52aXRlZVRpbWVySWQpO1xuXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgLy8g55Sf5oiQ5Li7IHNlc3Npb25cbiAgICAgIHRoaXMuX21haW5TZXNzaW9uID0gaW5uZXJTZXNzaW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDnlJ/miJDlia8gc2Vzc2lvbnNcbiAgICAgIHRoaXMuX2hvbGRTZXNzaW9ucy5wdXNoKGlubmVyU2Vzc2lvbik7XG4gICAgICAvLyDmm7TmlrDkuLsgc2Vzc2lvbiDnirbmgIHkuLogSE9MRFxuICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlU2Vzc2lvblN0YXRlKFJDQ2FsbFBsdXNDYWxsU3RhdGUuQlVTWUxJTkVfV0FJVCk7XG4gICAgfVxuXG4gICAgLy8g5oqb5Ye65bex5pa56KKr6YKA6K+3XG4gICAgY29uc3QgY2FsbFBsdXNTZXNzaW9uID0gbmV3IFJDQ2FsbFBsdXNTZXNzaW9uKGlubmVyU2Vzc2lvbiwgdGhpcywgdGhpcy5fbG9nZ2VyKTtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbChjYWxsUGx1c1Nlc3Npb24sIHRyYWNlSWQsIEpTT04ucGFyc2UoZXh0cmEgfHwgJ3t9JykuZXh0cmEpO1xuXG4gICAgY29uc3QgaW52aXRlU291cmNlID0gaXNEaXJlY3RseSA/IFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UuUFVCX0lOVklURV9DQUxMIDogUkNDYWxsUGx1c0ludml0ZVNvdXJjZS5QVUxMX0tWX0lOVklURV9DQUxMO1xuICAgIHRoaXMuZW1pdChSQ0NhbGxFbmdpbmUuX19JTk5FUl9JTlZJVEVfXywgY2FsbFBsdXNTZXNzaW9uLCBpbnZpdGVTb3VyY2UpO1xuXG4gICAgY29uc3Qgb3RoZXJzU3RhdGU6IElTZXNzaW9uVXNlcltdID0gY2FsbFNlc3Npb25Vc2Vycy5tYXAoKHtcbiAgICAgIHVzZXJJZCwgc2Vzc2lvblN0YXR1cywgc3lzU3RhdHVzLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCwgc3RhdHVzVGltZSxcbiAgICB9KSA9PiAoe1xuICAgICAgdXNlcklkLFxuICAgICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgICAgc3lzdGVtU3RhdGU6IHN5c1N0YXR1cyxcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIHN0YXRlVGltZTogc3RhdHVzVGltZSxcbiAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICB9KSk7XG4gICAgLy8g5oqb5Ye65Lq65ZGY54q25oCB5Y+Y5pu0XG4gICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgb3RoZXJzU3RhdGUsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWFtuS7luS6uuiiq+mCgOivt+WkhOeQhlxuICAgKi9cbiAgcHJpdmF0ZSBfb3RoZXJzSXNJbnZpdGVlSGFuZGxlKGRhdGE6IElQdWJJbnZpdGVDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgY2FsbElkLCBpbnZpdGVVc2VySWQsIGNhbGxTZXNzaW9uVXNlcnMgfSA9IGRhdGE7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgLy8g6L+H5ruk5Ye65YW25LuW55So5oi35ZKM6Ieq5bexXG4gICAgY29uc3Qgb3RoZXJJbnZpdGVkTWVtYmVyID0gY2FsbFNlc3Npb25Vc2Vycy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udXNlcklkICE9PSBjdXJyZW50VXNlcklkICYmIGl0ZW0udXNlcklkICE9PSBpbnZpdGVVc2VySWQgJiYgaXRlbS5zZXNzaW9uU3RhdHVzID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVEKTtcbiAgICAvLyDmipvlh7rnvqTogYrkuK3ooqvpgoDor7fnmoTlhbbku5bkurpcbiAgICBpZiAoIW90aGVySW52aXRlZE1lbWJlci5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g6YCa55+lIGNhbGxUeXBlIOexu+Wei+WPmOabtFxuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFICYmIHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICB0aGlzLl9vbkNhbGxUeXBlQ2hhbmdlKHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLCBSQ0NhbGxQbHVzVHlwZS5NVUxUSSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9tYWluU2Vzc2lvbj8udXBkYXRlQ2FsbFR5cGUoUkNDYWxsUGx1c1R5cGUuTVVMVEkpO1xuICAgIH1cblxuICAgIGNvbnN0IGludml0ZWRNZW1iZXI6IElPdGhlck1lbUluZm9bXSA9IFtdO1xuICAgIGNvbnN0IHVzZXJzU3RhdGU6IElTZXNzaW9uVXNlcltdID0gW107XG4gICAgb3RoZXJJbnZpdGVkTWVtYmVyLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzeXNTdGF0dXMgfSA9IGl0ZW07XG4gICAgICBpbnZpdGVkTWVtYmVyLnB1c2goeyBjYWxsSWQsIHVzZXJJZCwgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzIH0pO1xuICAgICAgdXNlcnNTdGF0ZS5wdXNoKHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBzeXNTdGF0dXMsXG4gICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5fb25PdGhlck1lbWJlckludml0ZShpbnZpdGVkTWVtYmVyKTtcbiAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCB1c2Vyc1N0YXRlLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAg5oyC5pat77yI5a+55pa56YCa6K+d5Y+W5raI44CB6YCa6K+d5ouS57ud77yJXG4gICAqL1xuICBwcml2YXRlIF9vbkhhbmd1cChkYXRhOiBJSGFuZ3VwSW5mb1tdLCBjYWxsU2Vzc2lvbmFTdGF0dXM6IFJDQ2FsbFBsdXNDYWxsU3RhdGUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgLy8g5riF6Zmk5ZG85Y+r6LaF5pe26K6h5pe25ZmoXG4gICAgICBkYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uY2FsbElkID09PSB0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0Q2FsbElkKCkpIHtcbiAgICAgICAgICBpZiAoaXRlbS51c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNBTkNFTExFRCkge1xuICAgICAgICAgICAgLy8g5riF6Zmk5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgICAgICAgICB0aGlzLl9zdG9wVGltZXIodGhpcy5fbWFpblNlc3Npb24hLmdldEludml0ZWVUaW1lcklkKCksIHRyYWNlSWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDmi5LmjqXjgIHlv5nnoozjgIHmnKrmjqXlkKwg5riF6Zmk5ZG85Y+r6LaF5pe26K6h5pe25ZmoXG4gICAgICAgICAgICB0aGlzLl9zdG9wVGltZXIodGhpcy5fbWFpblNlc3Npb24hLmdldEludml0ZXJUaW1lcklkKCksIHRyYWNlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCDmjqXlkKxcbiAgICovXG4gIHByaXZhdGUgX29uQWNjZXB0KGRhdGE6IElBY2NlcHRJbmZvW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlc3Npb25TdGF0ZSA9IHRoaXMuX21haW5TZXNzaW9uPy5nZXRTZXNzaW9uU3RhdGUoKTtcbiAgICBjb25zdCB1bk5lZWRVcFN0YXRlID0gW1xuICAgICAgUkNDYWxsUGx1c0NhbGxTdGF0ZS5DT05ORUNUSU5HLFxuICAgICAgUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwsXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkJVU1lMSU5FX1dBSVQsXG4gICAgXTtcbiAgICBpZiAodGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRVxuICAgICAgJiYgc2Vzc2lvblN0YXRlICYmIHVuTmVlZFVwU3RhdGUuaW5jbHVkZXMoc2Vzc2lvblN0YXRlKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0Q2FsbGVySWQgPSB0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0U3RhcnRDYWxsZXJJZCgpO1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuXG4gICAgLyoqXG4gICAgICog5Y2V5ZG85pS25Yiw5a+55pa55o6l5ZCs5pe277yM6ZyA5a6M5oiQ5Y+R5biD6LWE5rqQ5LiA57O75YiX5Yqo5L2cXG4gICAgICovXG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUgJiYgc3RhcnRDYWxsZXJJZCA9PT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgY29uc3QgYWNjZXB0VXNlckluZm8gPSBkYXRhLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5mcm9tVXNlcklkICE9PSBjdXJyZW50VXNlcklkKTtcbiAgICAgIGFjY2VwdFVzZXJJbmZvICYmIHRoaXMuZW1pdChSQ0NhbGxFbmdpbmUuX19JTk5FUl9TRVNTSU9OX0NPTk5FQ1RfXywgdGhpcy5nZXRMb2NhbE1haW5TZXNzaW9uKCkhLmdldENhbGxJZCgpLCB0cmFjZUlkKTtcbiAgICB9XG4gICAgLy8g5pu05paw5Li7IHNlc3Npb24g54q25oCBXG4gICAgdGhpcy5fbWFpblNlc3Npb24/LnVwZGF0ZVNlc3Npb25TdGF0ZShSQ0NhbGxQbHVzQ2FsbFN0YXRlLkNPTk5FQ1RJTkcpO1xuXG4gICAgLy8g5riF6Zmk5ZG85Y+r6LaF5pe26K6h5pe25ZmoXG4gICAgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uIS5nZXRJbnZpdGVyVGltZXJJZCgpLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDnirbmgIHkuIvlj5FcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX29uU3RhdHVzRG93bihkYXRhOiBJU3RhdHVzRG93bkNvbnQsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8qKlxuICAgICAqIOmAmuivneeKtuaAgeS4uui/nuaOpeeKtuaAgeaXtu+8jOS/neWtmOacjeWKoeS4i+WPkeeahOmAmuivneW8gOWni+aXtumXtFxuICAgICAqL1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxTdGF0dXMsIHN0YXJ0VGltZSwgY2FsbElkLFxuICAgIH0gPSBkYXRhO1xuICAgIGlmIChjYWxsSWQgIT09IHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsSWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2NhbGxTdGFydE1hcFtjYWxsSWRdID0gdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0gfHwge307XG5cbiAgICAvKipcbiAgICAgKiDkuIrmiqXpgJror53lvIDlp4vorqHml7bkuovku7ZcbiAgICAgKiDmnaHku7bvvJrpgJror53nirbmgIHkuLogT05DQUxMIOS4lOacquS4iuaKpei/h+mAmuivneW8gOWni+iuoeaXtuS6i+S7tlxuICAgICAqL1xuICAgIGlmICghdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0uaXNSZWNlaXZlQ2FsbFN0YXJ0VGltZVxuICAgICAgJiYgY2FsbFN0YXR1cyA9PT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgIHRoaXMuX2NhbGxTdGFydE1hcFtjYWxsSWRdLmlzUmVjZWl2ZUNhbGxTdGFydFRpbWUgPSB0cnVlO1xuICAgICAgY29uc3QgeyBjb2RlLCBjbGllbnRTdGFydFRpbWUgfSA9IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuY2FsY0NsaWVudFN0YXJ0VGltZShjYWxsSWQsIHN0YXJ0VGltZSEsIHRyYWNlSWQpO1xuICAgICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbFN0YXJ0VGltZSh7XG4gICAgICAgICAgY2FsbElkLFxuICAgICAgICAgIGNhbGxTdGFydFRpbWU6IGNsaWVudFN0YXJ0VGltZSEsXG4gICAgICAgIH0sIHRyYWNlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOiuoeeul+aYr+WQpumAmuivnee7k+adn1xuICAgIGxldCBzZWxmRW5kID0gZmFsc2U7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICAvLyDkuIrmiqXkurrlkZjnirbmgIHlj5jmm7RcbiAgICBjb25zdCBjaGFuZ2VkVXNlcnMgPSBkYXRhLmNhbGxTZXNzaW9uVXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICAvKipcbiAgICAgICAqIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCDpnIDljLrliIbigJzlkbzlj6vmlrnlhYjlj5bmtojpgJror53igJ3lkozigJzmnKznq6/otoXml7bmnKrmjqXlkKzigJ1cbiAgICAgICAqL1xuICAgICAgY29uc3QgaXNMZWZ0ID0gW1xuICAgICAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JRExFLFxuICAgICAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5ERUNMSU5FRCxcbiAgICAgICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VELFxuICAgICAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5OT19BTlNXRVIsXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNBTkNFTExFRCxcbiAgICAgIF0uaW5jbHVkZXMoaXRlbS5zZXNzaW9uU3RhdHVzKSAmJiBpdGVtLnN5c1N0YXR1cyAhPT0gUkNDYWxsUGx1c1JlYXNvbi5DQU5DRUxMRUQ7XG4gICAgICBpZiAoaXNMZWZ0ICYmIGl0ZW0udXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgIHNlbGZFbmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VySWQ6IGl0ZW0udXNlcklkLFxuICAgICAgICB1c2VyU3RhdGU6IGl0ZW0uc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3lzdGVtU3RhdGU6IGl0ZW0uc3lzU3RhdHVzLFxuICAgICAgICBzdGF0ZVRpbWU6IGl0ZW0uc3RhdHVzVGltZSxcbiAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY2hhbmdlZFVzZXJzLmxlbmd0aCA+IDAgJiYgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgY2hhbmdlZFVzZXJzLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOayoeaciSBzZXNzaW9uIOS4jeWkhOeQhuS8muivneeKtuaAgeWPmOabtFxuICAgICAqL1xuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24gJiYgIXRoaXMuX2hvbGRTZXNzaW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDorqHnrpflh7rlk43lupTliqjkvZzvvIzlubbmipvlh7rkv6Hmga9cbiAgICBjb25zdCB7XG4gICAgICBoYW5ndXBEYXRhLCBhY2NlcHREYXRhLCBvdGhlckludml0ZWREYXRhLFxuICAgIH0gPSBwYXJzZVN0YXR1c0RhdGEoZGF0YSk7XG5cbiAgICBoYW5ndXBEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5fb25IYW5ndXAoaGFuZ3VwRGF0YSwgZGF0YS5jYWxsU3RhdHVzLCB0cmFjZUlkKTtcbiAgICBhY2NlcHREYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5fb25BY2NlcHQoYWNjZXB0RGF0YSwgdHJhY2VJZCk7XG5cbiAgICBpZiAob3RoZXJJbnZpdGVkRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5NVUxUSSkge1xuICAgICAgdGhpcy5fb25PdGhlck1lbWJlckludml0ZShvdGhlckludml0ZWREYXRhKTtcbiAgICB9XG5cbiAgICAvLyDlj6rmnInlnKggY2FsbFNlc3Npb24g54q25oCB5Li6IEVuZGVkIOaXtumAmuefpSBvblNlc3Npb25DbG9zZVxuICAgIGlmIChkYXRhLmNhbGxTdGF0dXMgPT09IFJDQ2FsbFBsdXNDYWxsU3RhdGUuRU5ERUQgfHwgc2VsZkVuZCkge1xuICAgICAgdGhpcy5fb25TZXNzaW9uQ2xvc2UoZGF0YSwgdHJhY2VJZCwgc2VsZkVuZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOWFtuS7luerr+eahOeKtuaAgeS4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBfb25PdGhlckNsaWVudFN0YXR1c0Rvd24oZGF0YTogSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7IGNhbGxJZCwgY2FsbFNlc3Npb25Vc2VycyB9ID0gZGF0YTtcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IGNhbGxTZXNzaW9uVXNlcnMuZmluZCgoeyB1c2VySWQgfSkgPT4gdXNlcklkID09PSBjdXJyZW50VXNlcklkKTtcblxuICAgIGlmIChjdXJyZW50VXNlciAmJiAodGhpcy5fbWFpblNlc3Npb24gfHwgdGhpcy5faG9sZFNlc3Npb25zLmxlbmd0aCkpIHtcbiAgICAgIC8vIOaYr+W3seerr+eKtuaAgeWPmOabtOS4lOWtmOWcqCBzZXNzaW9uIOWGjeWOu+mAmuefpeS6uuWRmOeKtuaAgeWPmOabtOWbnuiwg++8jOS4jeWtmOWcqCBzZXNzaW9uIOS4jemcgOimgemAmuefpVxuICAgICAgY29uc3QgeyB1c2VySWQsIHNlc3Npb25TdGF0dXMsIHN0YXR1c1RpbWUgfSA9IGN1cnJlbnRVc2VyO1xuICAgICAgaWYgKHNlc3Npb25TdGF0dXMgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNPTk5FQ1RJTkcpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVzID0gW1JDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk9OQ0FMTCwgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ09OTkVDVElOR107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIOWmguaenOiHquW3seacquaOpeWQrOS4u+mAmuivne+8jOaUtuWIsOWkmuerryBDb25uZWN0aW5nIOeKtuaAge+8jOmcgOaKm+WHuiBzZXNzaW9uQ2xvc2VcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGlzTWFpblNlc3Npb24gPSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZDtcbiAgICAgICAgY29uc3QgY3VycmVudFVzZXJTYXRlID0gdGhpcy5fbWFpblNlc3Npb24/LmdldFVzZXJMaXN0KCkuZmluZCgoaXRlbSkgPT4gaXRlbS51c2VySWQgPT09IGN1cnJlbnRVc2VySWQpPy51c2VyU3RhdGU7XG4gICAgICAgIGNvbnN0IGlzQWNjZXB0TWFpblNlc3Npb24gPSBpc01haW5TZXNzaW9uICYmIGN1cnJlbnRVc2VyU2F0ZSAmJiBzdGF0ZXMuaW5jbHVkZXMoY3VycmVudFVzZXJTYXRlKTtcbiAgICAgICAgaWYgKCFpc0FjY2VwdE1haW5TZXNzaW9uKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgW3tcbiAgICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLk9USEVSX0NMSUVOVF9BQ0NFUFQsXG4gICAgICAgICAgICBzdGF0ZVRpbWU6IHN0YXR1c1RpbWUsXG4gICAgICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgfV0sIHRyYWNlSWQpO1xuXG4gICAgICAgICAgdGhpcy5fb25TZXNzaW9uQ2xvc2UoZGF0YSwgdHJhY2VJZCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOS6i+S7tuS4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfb25FdmVudERvd24oZGF0YTogSUV2ZW50RG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgZXZlbnRBcmdzLCBldmVudFR5cGUsXG4gICAgfSA9IGRhdGE7XG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gQ2FsbFNlcnZlckV2ZW50VHlwZS5DQUxMX0RVUkFUSU9OICYmIGNhbGxJZCA9PT0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpKSB7XG4gICAgICBjb25zdCB7IGZpcnN0RnJhbWVUaW1lIH0gPSBldmVudEFyZ3MgYXMgeyBmaXJzdEZyYW1lVGltZTogbnVtYmVyIH07XG4gICAgICAvLyDorqHnrpflvIDlp4vml7bpl7RcbiAgICAgIGNvbnN0IHsgY29kZSwgY2xpZW50U3RhcnRUaW1lOiBjbGllbnRGaXJzdEZyYW1lVGltZSB9ID0gdGhpcy5fdGltZUNvcnJlY3Rpb25lci5jYWxjQ2xpZW50U3RhcnRUaW1lKGNhbGxJZCwgZmlyc3RGcmFtZVRpbWUsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfRklSU1RfRlJBTUVfVElNRV9PLCBgY2xpZW50Rmlyc3RGcmFtZVRpbWU6ICR7Y2xpZW50Rmlyc3RGcmFtZVRpbWV9YCwgdHJhY2VJZCk7XG4gICAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsRmlyc3RGcmFtZVRpbWUoY2FsbElkLCBjbGllbnRGaXJzdEZyYW1lVGltZSEsIHRyYWNlSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDpgJrnn6XljZXlkbwgZHVyYXRpb24g5Y+Y5pu0XG4gICAqL1xuICBwcml2YXRlIF9vblJlY3ZTaW5DYWxsRHVyYXRpb24oY2FsbElkOiBzdHJpbmcsIGNsaWVudFN0YXJ0VGltZTogbnVtYmVyLCBjbGllbnRGaXJzdEZyYW1lVGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsU3RhcnRUaW1lKHsgY2FsbElkLCAuLi57IGNhbGxTdGFydFRpbWU6IGNsaWVudFN0YXJ0VGltZSB9IH0sIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZShjYWxsSWQsIGNsaWVudEZpcnN0RnJhbWVUaW1lLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25Yiw5aqS5L2T5Y+Y5pu055u45YWz5LqL5Lu2XG4gICAqL1xuICBwcml2YXRlIF9vblN3aXRjaE1lZGlhVHlwZShkYXRhOiBJRGlhbG9nRG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgYWN0aW9uLCBleHRyYUtleVZhbCwgdHJhbnNhY3Rpb25JZCwgcHJvbW90ZXJJZCxcbiAgICB9ID0gZGF0YTtcbiAgICBjb25zdCB7IG1lZGlhVHlwZSwgcmVhc29uIH0gPSBleHRyYUtleVZhbDtcblxuICAgIGNvbnN0IGN1cnJlbnRDYWxsSWQgPSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCk7XG4gICAgaWYgKGNhbGxJZCAhPT0gY3VycmVudENhbGxJZCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfTUVESUFUWVBFX0NIQU5HRV9PLCBgbm90IGN1cnJlbnQgc2Vzc2lvbiBjYWxsSWQ6ICR7Y3VycmVudENhbGxJZH0sIHJlY3ZDYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHRyYW5zYWN0aW9uSWQ6IG9sZFRyYW5zSWQsIGFjdGlvbjogb2xkQWN0aW9uLCBtZWRpYVR5cGU6IE9sZE1lZGlhVHlwZSB9ID0gdGhpcy5fbWFpblNlc3Npb24/LmdldE9sZERpYWxvZ0RhdGEoKSB8fCB7fTtcbiAgICBpZiAob2xkVHJhbnNJZCA9PT0gdHJhbnNhY3Rpb25JZCAmJiBvbGRBY3Rpb24gPT09IGFjdGlvbiAmJiBPbGRNZWRpYVR5cGUgPT09IG1lZGlhVHlwZSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfTUVESUFUWVBFX0NIQU5HRV9PLCAnZHVwbGljYXRlIGRpYWxvZyBkYXRhJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfTUVESUFUWVBFX0NIQU5HRV9PLCBgYWN0aW9uOiAke2FjdGlvbn0sIHJlYXNvbjogJHtyZWFzb259YCwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8uc2V0T2xkRGlhbG9nRGF0YSh7IHRyYW5zYWN0aW9uSWQsIGFjdGlvbiwgbWVkaWFUeXBlIH0pO1xuXG4gICAgLy8g5Y2H57qn5rWB56iL5aSE55CGXG4gICAgaWYgKGFjdGlvbiA9PT0gRGlhbG9nQWN0aW9uLlJFUVVFU1QpIHtcbiAgICAgIHRoaXMuX29uUmVxdWVzdENoYW5nZU1lZGlhVHlwZSh7XG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IHRyYW5zYWN0aW9uSWQhLFxuICAgICAgICB1c2VySWQ6IHByb21vdGVySWQsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgIH0sIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY2hhbmdlTWVkaWFUeXBlUmVzdWx0ID0gbnVsbDtcbiAgICAgIHN3aXRjaCAocmVhc29uKSB7XG4gICAgICAgIGNhc2UgRGlhbG9nQWN0aW9uLkNBTkNFTDpcbiAgICAgICAgICBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgPSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LkNBTkNFTF9DSEFOR0VfTUVESUFfVFlQRTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBEaWFsb2dBY3Rpb24uQUNDRVBUOlxuICAgICAgICAgIGNoYW5nZU1lZGlhVHlwZVJlc3VsdCA9IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuU0VSVkVSX0FMTE9XX01FRElBX1RZUEU7XG4gICAgICAgICAgdGhpcy5fbWFpblNlc3Npb24/LnVwZGF0ZU1lZGlhVHlwZSh0aGlzLl9tYWluU2Vzc2lvbi5nZXRSZXFNZWRpYVR5cGUoKSEpO1xuICAgICAgICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVSZXFNZWRpYVR5cGUobnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRGlhbG9nQWN0aW9uLlJFRlVTRTpcbiAgICAgICAgICBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgPSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LlJFRlVTRV9DSEFOR0VfTUVESUFfVFlQRTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBEaWFsb2dBY3Rpb24uVElNRU9VVDpcbiAgICAgICAgICBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgPSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LkNIQU5HRV9NRURJQV9UWVBFX1RJTUVPVVQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHRbY2hhbmdlTWVkaWFUeXBlUmVzdWx0IGFzIFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHRdXG4gICAgICAmJiB0aGlzLl9yZWNlaXZlTWVkaWFUeXBlQ2hhbmdlUmVzdWx0KHtcbiAgICAgICAgdHJhbnNhY3Rpb25JZDogdHJhbnNhY3Rpb25JZCEsXG4gICAgICAgIHVzZXJJZDogcHJvbW90ZXJJZCxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgfSwgY2hhbmdlTWVkaWFUeXBlUmVzdWx0IGFzIFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIC8vIOmZjee6p+mAmuefpeWkhOeQhlxuICAgIGlmIChhY3Rpb24gPT09IERpYWxvZ0FjdGlvbi5OT1RJQ0UgJiYgbWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPICYmICFyZWFzb24pIHtcbiAgICAgIHRoaXMuX3JlY2VpdmVNZWRpYVR5cGVDaGFuZ2VSZXN1bHQoe1xuICAgICAgICB0cmFuc2FjdGlvbklkOiB0cmFuc2FjdGlvbklkISxcbiAgICAgICAgdXNlcklkOiBwcm9tb3RlcklkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICB9LCBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LlNFUlZFUl9BTExPV19NRURJQV9UWVBFLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25YiwIGNhbGwgbG9nIOaXpeW/l1xuICAgKi9cbiAgcHJpdmF0ZSBfb25SZWN2Q2FsbEVuZExvZyhkYXRhOiBJUHViQ2FsbExvZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2FsbExvZyA9IHRyYW4yQ2FsbExvZyhkYXRhKTtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbFJlY29yZChjYWxsTG9nLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53nu5PmnZ9cbiAgICovXG4gIHByaXZhdGUgX29uU2Vzc2lvbkNsb3NlKGRhdGE6IElTdGF0dXNEb3duQ29udCwgdHJhY2VJZDogc3RyaW5nLCBpc1NlbGZIYW5ndXA6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB7IGNhbGxJZCB9ID0gZGF0YTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcblxuICAgIC8vIOato+W4uOe7k+adn++8jOa4hemZpOacrOWcsOWtmOWCqOeahCBjYWxsSWRcbiAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZS5yZW1vdmVBYm5vcm1hbENhbGxJZHMoY3VycmVudFVzZXJJZCwgW2NhbGxJZF0pO1xuXG4gICAgbGV0IGNsb3NlZFNlc3Npb24gPSBbdGhpcy5fbWFpblNlc3Npb24sIC4uLnRoaXMuX2hvbGRTZXNzaW9uc10uZmluZCgoc2Vzc2lvbikgPT4gc2Vzc2lvbiAmJiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuICAgIGlmICghY2xvc2VkU2Vzc2lvbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfQ0xPU0VfU0VTU0lPTl9PLCBgdW5leHBlY3Qgc2Vzc2lvbiBjYWxsSWQgLT4gJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfQ0xPU0VfU0VTU0lPTl9PLCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcblxuICAgIC8vIHNlc3Npb24gY2xvc2Ug5ZCO57uT5p2f5omA5pyJ6LaF5pe26K6h5pe25ZmoXG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgIHRoaXMuX21haW5TZXNzaW9uLmdldEFsbFRpbWVySWRzKCkuZm9yRWFjaCgodGltZXJJZCkgPT4gdGhpcy5fc3RvcFRpbWVyLmJpbmQodGhpcykodGltZXJJZCwgdHJhY2VJZCkpO1xuICAgICAgLy8g57uT5p2fIOS4iuaKpeesrOS4gOW4p1xuICAgICAgaWYgKGNsb3NlZFNlc3Npb24uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFKSB7XG4gICAgICAgIHRoaXMuX2lzVXBGaXJzdEZyYW1lVGltZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgZGVsZXRlIHRoaXMuX2NhbGxTdGFydE1hcFtjYWxsSWRdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOa0vuWPkemAmuivnee7k+adn++8jOWkhOeQhumAmuivnee7k+adn+WQjiBSVEMg6YCA5oi/6Ze0562J6YC76L6RXG4gICAgICovXG4gICAgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ0xPU0VfXywgY2FsbElkLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOS4iuaKpemAmuivnee7k+adn1xuICAgICAqIOWkmuerr+WFtuS7luerr+aMguaWremAmuivne+8jOmcgOaKiuacrOerr+S6uuWRmOezu+e7n+eKtuaAgei9rOWMluS4uiBSQ0NhbGxQbHVzUmVhc29uLk9USEVSX0NMSUVOVF9IQU5HVVBcbiAgICAgKi9cbiAgICBjb25zdCBjcnRVc2VyRGF0YSA9IGNsb3NlZFNlc3Npb24uZ2V0VXNlckxpc3QoKS5maW5kKChpdGVtKSA9PiBpdGVtLnVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCk7XG4gICAgbGV0IGhhbmd1cFJlYXNvbjtcbiAgICBpZiAoaXNTZWxmSGFuZ3VwICYmIGRhdGEudG9EZXZpY2VJZCAhPT0gdGhpcy5fc2lnbmFsTW9kdWxlLmdldFNlc3Npb25JZCgpKSB7XG4gICAgICBoYW5ndXBSZWFzb24gPSBjbG9zZWRTZXNzaW9uLmdldElzTG9jYWxDbGllbnRIYW5ndXAoKSA/IGNydFVzZXJEYXRhIS5zeXN0ZW1TdGF0ZSA6IFJDQ2FsbFBsdXNSZWFzb24uT1RIRVJfQ0xJRU5UX0hBTkdVUDtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vbkNhbGxFbmRlZChuZXcgUkNDYWxsUGx1c1Nlc3Npb24oY2xvc2VkU2Vzc2lvbiwgdGhpcywgdGhpcy5fbG9nZ2VyKSwgaGFuZ3VwUmVhc29uIHx8IGNydFVzZXJEYXRhIS5zeXN0ZW1TdGF0ZSwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9yZW1vdmVTZXNzaW9uKGNhbGxJZCk7XG4gIH1cblxuICAvKipcbiAgICog5qC55o2uIGNhbGxJZCDnp7vpmaQgc2Vzc2lvblxuICAgKi9cbiAgcHJpdmF0ZSBfcmVtb3ZlU2Vzc2lvbihjYWxsSWQ6IHN0cmluZykge1xuICAgIGlmIChjYWxsSWQgPT09IHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsSWQoKSkge1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24gPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2hvbGRTZXNzaW9ucy5maW5kSW5kZXgoKHNlc3Npb24pID0+IHNlc3Npb24/LmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuICAgICAgdGhpcy5faG9sZFNlc3Npb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOS4jeWtmOWcqCBtYWluU2Vzc2lvbiDml7bvvIzku47mnI3liqHnq6/ojrflj5bmlbDmja7nlJ/miJAgbWFpblNlc3Npb24sIOW5tumAmuefpeS6uuWRmOeKtuaAgeWPmOabtFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlU2Vzc2lvbkJ5U2VydmVyKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcsIGlzTmVlZFVwOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ1JFQVRFX1NFU1NJT05fQllfU0VSVkVSX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5nZXRDYWxsU2Vzc2lvbih7IGNhbGxJZCB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9DUkVBVEVfU0VTU0lPTl9CWV9TRVJWRVJfUiwgYGVycmNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ1JFQVRFX1NFU1NJT05fQllfU0VSVkVSX1IsIGBjb2RlOiAke2NvZGV9LCBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfWAsIHRyYWNlSWQpO1xuXG4gICAgY29uc3Qge1xuICAgICAgY2FsbFR5cGUsIG1lZGlhVHlwZSwgY2FsbFNlc3Npb25Vc2Vycywgc3RhcnRDYWxsZXJJZCxcbiAgICB9ID0gZGF0YSE7XG5cbiAgICAvLyDnlJ/miJDkuLsgc2Vzc2lvblxuICAgIHRoaXMuX21haW5TZXNzaW9uID0gbmV3IFJDQ2FsbElubmVyU2Vzc2lvbihcbiAgICAgIGNhbGxJZCxcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuQ09OTkVDVElORyxcbiAgICAgIGNhbGxUeXBlLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgc3RhcnRDYWxsZXJJZCxcbiAgICAgIHN0YXJ0Q2FsbGVySWQsXG4gICAgICBbXSxcbiAgICAgIHRoaXMuX2xvZ2dlcixcbiAgICApO1xuICAgIGlmIChpc05lZWRVcCkge1xuICAgICAgdGhpcy5fY2xlYXJNb2JpbGVPblBob25lKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfVxuICAgIC8vIOS6uuWRmOeKtuaAgeWPmOabtOmAmuefpVxuICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIGNhbGxTZXNzaW9uVXNlcnMsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWFvOWuueenu+WKqOerryBvblBob25lIOaXoOazlea2iOmZpOmXrumimFxuICAgKiBBMSDnp7vliqjnq6/lkowgQiDmraPlnKggY2FsbCDkuK3vvIzkuJQgb25QaG9uZSDnirbmgIHvvIwgQTEg5p2A6L+b56iL5ZCO77yMQiDnq6/lsZXnpLrnmoQgb25QaG9uZSDnirbmgIHml6Dms5XmtojlpLFcbiAgICogQTIg5aSa56uv5Zyo5o6l5ZCs5ZKM55u05o6l5Yqg5YWlIGNhbGwg5pe277yM5LiK5oqlIG9uUGhvbmVFbmQg54q25oCB77yM5raI6ZmkIEIg56uv5bGV56S655qEIG9uUGhvbmUg54q25oCBXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jbGVhck1vYmlsZU9uUGhvbmUoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlc3Npb24gPSBbdGhpcy5fbWFpblNlc3Npb24sIC4uLnRoaXMuX2hvbGRTZXNzaW9uc10uZmluZCgoaXRlbSkgPT4gaXRlbT8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgaWYgKHNlc3Npb24gJiYgc2Vzc2lvbi5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5NVUxUSSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQX09OX1BIT05FX0VORF9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5zeXN0ZW1TdGF0dXNVcCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgc3lzU3RhdHVzOiBSQ0NhbGxQbHVzUmVhc29uLk9OX1BIT05FX0VORCxcbiAgICAgICAgZm9yd2FyZDogRm9yd2FyZFR5cGUuQ1VSUkVOVCxcbiAgICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfVVBfT05fUEhPTkVfRU5EX1IsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQX09OX1BIT05FX0VORF9SLCBgY2FsbElkOiAke2NhbGxJZH0sIGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyDljp8gY2xpZW50IOS4reWumuS5ieeahOS6i+S7tlxuICBwcml2YXRlIF9vblVzZXJTdGF0ZUNoYW5nZShjYWxsSWQ6IHN0cmluZywgdXNlcnM6IElTZXNzaW9uVXNlcltdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICB1c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XG4gICAgICBjb25zdCB7IHVzZXJJZCwgdXNlclN0YXRlLCBzeXN0ZW1TdGF0ZSB9ID0gdXNlcjtcbiAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVVc2VyU3RhdGVDaGFuZ2VkKHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZSxcbiAgICAgICAgcmVhc29uOiBzeXN0ZW1TdGF0ZSxcbiAgICAgIH0sIHRyYWNlSWQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICog5pS25Yiw6Ieq5bexIHN5c3RlbVN0YXRlIOS4uiA5OTnvvIznm7TmjqXnprvlvIDmiL/pl7RcbiAgICAgKiDlpITnkIbooqvlj6vmjqXlkKznmoTnnqzpl7TvvIzkuLvlj6vlkIzml7bmjILmlq3nmoTmg4XlhrXvvIzkuI3mjonnprvlvIDmiL/pl7TpgJror53kuI3kvJrnu5PmnZ9cbiAgICAgKi9cbiAgICB1c2Vycy5mb3JFYWNoKCh7IHVzZXJJZCwgc3lzdGVtU3RhdGUgfSkgPT4ge1xuICAgICAgaWYgKHVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCAmJiBzeXN0ZW1TdGF0ZSA9PT0gUkNDYWxsUGx1c1JlYXNvbi5BQk5PUk1BTF9FTkQpIHtcbiAgICAgICAgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ0xPU0VfXywgY2FsbElkLCB0cmFjZUlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uT3RoZXJNZW1iZXJJbnZpdGUoaW5mbzogSU90aGVyTWVtSW5mb1tdKSB7XG4gICAgaW5mby5mb3JFYWNoKChpbmZvKSA9PiB7XG4gICAgICBjb25zdCB7IHVzZXJJZCwgY2FsbElkIH0gPSBpbmZvO1xuICAgICAgY29uc3QgaW52aXRlclVzZXJJZCA9IHRoaXMuZ2V0TG9jYWxNYWluU2Vzc2lvbigpPy5nZXRJbnZpdGVyVXNlcklkKCk7XG4gICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZVVzZXJJbnZpdGVkKFt1c2VySWRdLCBpbnZpdGVyVXNlcklkISwgY2FsbElkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uUmVxdWVzdENoYW5nZU1lZGlhVHlwZShpbmZvOiBJQ2hhbmdlTWVkaWFUeXBlSW5mbywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgeyB1c2VySWQsIHRyYW5zYWN0aW9uSWQsIG1lZGlhVHlwZSB9ID0gaW5mbztcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVxdWVzdCh1c2VySWQsIHRyYW5zYWN0aW9uSWQsIG1lZGlhVHlwZSwgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9yZWNlaXZlTWVkaWFUeXBlQ2hhbmdlUmVzdWx0KGluZm86IElDaGFuZ2VNZWRpYVR5cGVJbmZvLCBjb2RlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdC5TRVJWRVJfQUxMT1dfTUVESUFfVFlQRSkge1xuICAgICAgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX0NIQU5HRV9NRURJQV9UWVBFX18sIGluZm8ubWVkaWFUeXBlLCB0cmFjZUlkKTtcbiAgICB9XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlc3VsdCh7XG4gICAgICAuLi5pbmZvLFxuICAgICAgY29kZSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQ2FsbFR5cGVDaGFuZ2UoY2FsbElkOiBzdHJpbmcsIGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25DYWxsVHlwZUNoYW5nZWQoY2FsbFR5cGUsIGNhbGxJZCwgdHJhY2VJZCk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIFJUQ1Jlc291cmNlVGFnIHtcbiAgLyoqXG4gICAqIOaZrumAmumfs+inhumikea1gVxuICAgKi9cbiAgTk9STUFMID0gJ1JvbmdDbG91ZFJUQycsXG4gIC8qKlxuICAgKiDlsY/luZXliIbkuqvmtYFcbiAgICovXG4gIFNDUkVFTiA9ICdTY3JlZW5TaGFyZSdcbn1cbiIsImltcG9ydCB7XG4gIFBsdWdpbkNvbnRleHQsIElSdW50aW1lLCBSVENNb2RlLCBCYXNpY0xvZ2dlciwgRXZlbnRFbWl0dGVyLCBpc0Jvb2xlYW4sXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIFJDUlRDUm9vbSxcbiAgUkNSVENDbGllbnQsXG4gIFJDUlRDQ29kZSxcbiAgUkNMb2NhbFRyYWNrLFxuICBSQ1JlbW90ZVRyYWNrLFxuICBSQ0xvY2FsQXVkaW9UcmFjayxcbiAgSVN1YnNjcmliZUF0dHIsXG4gIFJDUmVtb3RlVmlkZW9UcmFjayxcbiAgUkNSZW1vdGVBdWRpb1RyYWNrLFxuICBSQ0tpY2tSZWFzb24sXG4gIFJDVHJhY2ssXG4gIFJDTG9jYWxWaWRlb1RyYWNrLFxuICBJUHVibGlzaEF0dHJzLFxuICBJUkNSVENTdGF0ZVJlcG9ydCxcbiAgaGVscGVyLFxufSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHtcbiAgSUF1ZGlvQ29uZmlnLFxuICBJQ2FsbFBsdXNJbml0T3B0cyxcbiAgSVN0YXR1c1JlcG9ydExpc3RlbmVyLFxuICBJVmlkZW9Db25maWcsXG4gIFJDQ2FsbFBsdXNDb2RlLFxuICBSQ0NhbGxQbHVzRnJhbWVSYXRlLFxuICBSQ0NhbGxQbHVzTWVkaWFUeXBlLFxuICBSQ0NhbGxQbHVzUGFja2V0TG9zc1N0YXRzLFxuICBSQ0NhbGxQbHVzUmVzb2x1dGlvbixcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSVENSZXNvdXJjZVRhZyB9IGZyb20gJy4uL2VudW1zL1JUQ1Jlc291cmNlVGFnJztcbmltcG9ydCB7IHJldHJ5QXN5bmNGbiB9IGZyb20gJy4uL3V0aWxzL3JldHJ5JztcbmltcG9ydCB7IENhbGxIb29rc1R5cGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lDYWxsSG9va3MnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlYXNvbiB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzUmVhc29uJztcbmltcG9ydCB7IFJDQ2FsbEtpY2tFeHRyYSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVJUQ01vZHVsZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgSU1lZGlhTXV0ZUNoYW5nZUluZm8sIElNZW1iZXJJbmZvIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JUkNDYWxsQ2xpZW50JztcbmltcG9ydCB7IFJDQ2FsbEVuZ2luZSB9IGZyb20gJy4uL1JDQ2FsbEVuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIH0gZnJvbSAnLi9SQ0NhbGxQbHVzUmVwb3J0TW9kdWxlJztcbmltcG9ydCB7IGdldFVzZXJWaWRlb1ZpZXdJbmZvIH0gZnJvbSAnLi4vdXRpbHMvaGVscGVyJztcblxuaW50ZXJmYWNlIElKb2luUlRDUm9vbVJlcyB7XG4gIGNvZGU6IFJDUlRDQ29kZTtcbiAgcm9vbTogUkNSVENSb29tIHwgdW5kZWZpbmVkO1xuICB1c2VySWRzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRyYWNrczogUkNSZW1vdGVUcmFja1tdIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgSVN1YlJlcyB7XG4gIGNvZGU6IFJDUlRDQ29kZTtcbiAgZmFpbGVkTGlzdDogKElTdWJzY3JpYmVBdHRyKVtdIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgSVB1YlJlcyB7XG4gIGNvZGU6IFJDUlRDQ29kZTtcbiAgbGl2ZVVybDogc3RyaW5nIHwgdW5kZWZpbmVkXG59XG5cbmludGVyZmFjZSBSQ0tpY2tFeHRyYSB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGNsYXNzIFJUQ01vZHVsZSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBfX0lOTkVSX1JUQ19QUk9DRVNTX0ZBSUxFRF9fOiBzdHJpbmcgPSAnaW5uZXItcnRjLXByb2Nlc3MtZmFpbGVkJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX1JUQ19QRUVSQ09OTkVDVElPTl9BQk5PUk1BTF9DTE9TRV9fOiBzdHJpbmcgPSAnaW5uZXItcnRjLXBlZXJjb25uZWN0aW9uLWFibm9ybWFsLWNsb3NlJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX09OX1NFTEZfSk9JTkVEX186IHN0cmluZyA9ICdpbm5lci1vbi1zZWxmLWpvaW5lZCdcblxuICBzdGF0aWMgX19JTk5FUl9PTl9PVEhFUl9KT0lORURfXzogc3RyaW5nID0gJ2lubmVyLW9uLW90aGVyLWpvaW5lZCdcblxuICBzdGF0aWMgX19JTk5FUl9SRUNFSVZFX0ZJUlNUX0ZSQU1FX186IHN0cmluZyA9ICdpbm5lci1yZWNlaXZlLWZpcnN0LWZyYW1lJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX09OX0tJQ0tPRkZfXzogc3RyaW5nID0gJ2lubmVyLWtpY2tvZmYtZnJhbWUnXG5cbiAgc3RhdGljIF9fSU5ORVJfT05fREVWSUNFX0VOQUJMRV9DSEFOR0VfXzogc3RyaW5nID0gJ2lubmVyLW9uLWRldmljZS1lbmFibGUtY2hhbmdlJ1xuXG4gIC8qKlxuICAgKiBSQ1JUQyDlrp7kvotcbiAgICovXG4gIHB1YmxpYyBfcnRjQ2xpZW50OiBSQ1JUQ0NsaWVudFxuXG4gIC8qKlxuICAgKiDlt7HmlrnnmoTpn7Pop4bpopEgdHJhY2tzXG4gICAqL1xuICBwcml2YXRlIF9sb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXVxuXG4gIC8qKlxuICAgKiBSQ1JUQ1Jvb20g5a6e5L6LXG4gICAqL1xuICBwdWJsaWMgX3Jvb206IFJDUlRDUm9vbSB8IG51bGwgPSBudWxsXG5cbiAgcHJpdmF0ZSBfY2FsbElkOiBzdHJpbmcgPSAnJ1xuXG4gIHByaXZhdGUgX2NhbGxNZWRpYVR5cGUhOiBSQ0NhbGxQbHVzTWVkaWFUeXBlXG5cbiAgcHJpdmF0ZSBfdmlkZW9Db25maWc6IElWaWRlb0NvbmZpZyA9IHtcbiAgICByZXNvbHV0aW9uOiBSQ0NhbGxQbHVzUmVzb2x1dGlvbi5XNjQwX0g0ODAsXG4gICAgZnJhbWVSYXRlOiBSQ0NhbGxQbHVzRnJhbWVSYXRlLkZQU18xNSxcbiAgfVxuXG4gIHByaXZhdGUgX2F1ZGlvQ29uZmlnOiBJQXVkaW9Db25maWcgPSB7fVxuXG4gIHByaXZhdGUgX2lzUHViVGlueTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOinhumikemFjee9ruaYr+WQpuWPmOabtFxuICAgKi9cbiAgcHJpdmF0ZSBfdmlkZW9Db25maWdJc0NoYW5nZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOmfs+mikemFjee9ruaYr+WQpuWPmOabtFxuICAgKi9cbiAgcHJpdmF0ZSBfYXVkaW9Db25maWdJc0NoYW5nZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOWtmOWCqOiuvue9rueahOS6uuWRmOWSjOinhuWbvlxuICAgKi9cbiAgcHJpdmF0ZSBfdXNlclZpZXdNYXA6IHsgW3VzZXJJZDogc3RyaW5nXTogeyB2aWRlb1ZpZXc6IEhUTUxWaWRlb0VsZW1lbnQsIGlzVGlueTogYm9vbGVhbiB9IH0gPSB7fVxuXG4gIHByaXZhdGUgX2NhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXI6IElTdGF0dXNSZXBvcnRMaXN0ZW5lciB8IG51bGwgPSBudWxsXG5cbiAgcHJpdmF0ZSBfcmVtb3RlQXVkaW9FbmFibGU6IGJvb2xlYW4gPSB0cnVlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUGx1Z2luQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0T3B0czogSUNhbGxQbHVzSW5pdE9wdHMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jYWxsRW5naW5lOiBSQ0NhbGxFbmdpbmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVwb3J0QXBwRXZlbnRNb2R1bGU6IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcnRjQ2xpZW50ID0gX2luaXRPcHRzPy5ydGNDbGllbnQ7XG4gICAgdGhpcy5faXNQdWJUaW55ID0gX2luaXRPcHRzLmlzUHViVGlueSB8fCBmYWxzZTtcbiAgfVxuXG4gIHNldENhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXIobGlzdGVuZXI6IElTdGF0dXNSZXBvcnRMaXN0ZW5lcikge1xuICAgIHRoaXMuX2NhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5bmkYTlg4/lpLTotYTmupBcbiAgICog5YaF5a2Y5Lit5pyJ5pe277yM6L+U5Zue5YaF5a2Y5Lit55qE6KeG6L2oXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FtZXJhVmlkZW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbFRyYWNrfT4ge1xuICAgIGNvbnN0IGRlZmF1bHRWaWRlb1RyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSAoZGVmYXVsdFZpZGVvVHJhY2sgJiYgIXRoaXMuX3ZpZGVvQ29uZmlnSXNDaGFuZ2UpID8geyB0cmFjazogZGVmYXVsdFZpZGVvVHJhY2ssIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfSA6IGF3YWl0IHRoaXMuX2NyZWF0ZVZpZGVvVHJhY2sodHJhY2VJZCk7XG4gICAgdGhpcy5fdmlkZW9Db25maWdJc0NoYW5nZSA9IGZhbHNlO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgdHJhY2ssXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5bpuqblhYvpo47otYTmupBcbiAgICog5YaF5a2Y5Lit5pyJ5pe277yM6L+U5Zue5YaF5a2Y5Lit55qE6Z+z6L2oXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TWljcm9waG9uZUF1ZGlvVHJhY2sodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCB0cmFjaz86IFJDTG9jYWxUcmFja30+IHtcbiAgICBjb25zdCBkZWZhdWx0QXVkaW9UcmFjayA9IHRoaXMuZ2V0TG9jYWxBdWRpb1RyYWNrKCk7XG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gKGRlZmF1bHRBdWRpb1RyYWNrICYmICF0aGlzLl9hdWRpb0NvbmZpZ0lzQ2hhbmdlKSA/IHsgdHJhY2s6IGRlZmF1bHRBdWRpb1RyYWNrLCBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH0gOiBhd2FpdCB0aGlzLl9jcmVhdGVBdWRpb1RyYWNrKHRyYWNlSWQpO1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnSXNDaGFuZ2UgPSBmYWxzZTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgdHJhY2ssXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7pgJror53nsbvlnovliJvlu7rpn7PjgIHop4bpopHotYTmupBcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDpn7PpopHmiJbpn7Pop4bpopFcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVDYWxsTWVkaWFUcmFja3MobWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fY2FsbE1lZGlhVHlwZSA9IG1lZGlhVHlwZTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuZ2V0TWljcm9waG9uZUF1ZGlvVHJhY2sodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBpZiAobWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPX1ZJREVPKSB7XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuZ2V0Q2FtZXJhVmlkZW9UcmFjayh0cmFjZUlkKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICBwdWJsaWMgc2V0VmlkZW9Db25maWcodmlkZW9Db25maWc6IElWaWRlb0NvbmZpZykge1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnSXNDaGFuZ2UgPSB0cnVlO1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnID0gdmlkZW9Db25maWc7XG4gIH1cblxuICBwdWJsaWMgc2V0QXVkaW9Db25maWcoYXVkaW9Db25maWc6IElBdWRpb0NvbmZpZykge1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnSXNDaGFuZ2UgPSB0cnVlO1xuICAgIHRoaXMuX2F1ZGlvQ29uZmlnID0gYXVkaW9Db25maWc7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveUFsbFRyYWNrcyh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9ERVNUUk9ZX0FMTF9UUkFDS1NfTywgJycsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgdGhpcy5fbG9jYWxUcmFja3MubGVuZ3RoID0gMDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBbGxSZW1vdGVBdWRpb0VuYWJsZShlbmFibGU6IGJvb2xlYW4sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFVF9BTExfUkVNT1RFX0FVRElPX0VOQUJMRV9ULCBgZW5hYmxlOiAke2VuYWJsZX1gLCB0cmFjZUlkKTtcblxuICAgIGlmICghaXNCb29sZWFuKGVuYWJsZSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfUiwgYHBhcmFtIGVycm9yLCBlbmFibGU6IHR5cGUgaXMgYm9vbGVhbiwgdmFsdWU6ICR7ZW5hYmxlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZW1vdGVBdWRpb0VuYWJsZSA9IGVuYWJsZTtcblxuICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGNvbnN0IGF1ZGlvVHJhY2tzID0gdGhpcy5fcm9vbS5nZXRSZW1vdGVUcmFja3MoKS5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc0F1ZGlvVHJhY2soKSk7XG4gICAgYXVkaW9UcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIGlmIChlbmFibGUpIHtcbiAgICAgICAgdHJhY2sudW5tdXRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFjay5tdXRlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVzdHJveVRyYWNrKHRyYWNrOiBSQ0xvY2FsVHJhY2spIHtcbiAgICB0cmFjay5kZXN0cm95KCk7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9sb2NhbFRyYWNrcy5maW5kSW5kZXgoKGxvY2FsVHJhY2spID0+IGxvY2FsVHJhY2suZ2V0VHJhY2tJZCgpID09PSB0cmFjay5nZXRUcmFja0lkKCkpO1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICAvKipcbiAgICogc2Vzc2lvbiDov57mjqVcbiAgICovXG4gIGFzeW5jIHNlc3Npb25Db25uZWN0ZWQoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAvLyAxLiDliqDmiL/pl7RcbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIGNvbnN0IHsgY29kZSwgcm9vbSB9ID0gYXdhaXQgdGhpcy5qb2luUlRDUm9vbShjYWxsSWQsIHRyYWNlSWQpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9yb29tID0gcm9vbSE7XG4gICAgfVxuXG4gICAgLy8g5rOo5YaMIFJUQyDnm7jlhbPnm5HlkKxcbiAgICB0aGlzLl9jYWxsSWQgPSBjYWxsSWQ7XG4gICAgdGhpcy5fcmVnUlRDTGlzdGVuZXJzKCk7XG5cbiAgICBjb25zdCByb29tVXNlcnNJZCA9IHRoaXMuX3Jvb20/LmdldFJlbW90ZVVzZXJJZHMoKSB8fCBbXTtcbiAgICBpZiAocm9vbVVzZXJzSWQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fb25PdGhlck1lbUpvaW5lZChyb29tVXNlcnNJZC5tYXAoKHVzZXJJZCkgPT4gKHsgY2FsbElkLCB1c2VySWQgfSkpLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICAvLyAyLiDlj5HluIPmtYFcbiAgICBpZiAodGhpcy5fbG9jYWxUcmFja3MubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5lbWl0KENhbGxIb29rc1R5cGUub25CZWZvcmVQdWJsaXNoKTtcbiAgICAgIGNvbnN0IHB1YlBhcmFtcyA9IHRoaXMuX2lzUHViVGlueVxuICAgICAgICA/IHRoaXMuX2xvY2FsVHJhY2tzLm1hcCgodHJhY2spID0+ICh0cmFjay5pc1ZpZGVvVHJhY2soKSA/IHsgdHJhY2ssIGlzUHViVGlueTogdHJ1ZSB9IDogdHJhY2spKVxuICAgICAgICA6IHRoaXMuX2xvY2FsVHJhY2tzO1xuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLnB1Ymxpc2gocHViUGFyYW1zLCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHVibGlzaFJlcywgY29kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9QLCAnc2Vzc2lvbkNvbm5lY3RlZCBsb2NhbCB0cmFja3MgaXMgZW1wdHknLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU31gLCB0cmFjZUlkKTtcbiAgfVxuXG4gIGFzeW5jIHNlc3Npb25DbG9zZShjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DTE9TRV9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOmUgOavgeacrOerr+i1hOa6kFxuICAgICAqL1xuICAgIHRoaXMuZGVzdHJveUFsbFRyYWNrcyh0cmFjZUlkKTtcblxuICAgIGNvbnN0IGN1cnJlbnRSb29tSWQgPSB0aGlzLl9yb29tPy5nZXRSb29tSWQoKTtcbiAgICBpZiAodGhpcy5fcm9vbSAmJiBjYWxsSWQgPT09IGN1cnJlbnRSb29tSWQpIHtcbiAgICAgIC8vIOmAgOWHuuaIv+mXtFxuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQubGVhdmVSb29tKHRoaXMuX3Jvb20pO1xuICAgICAgLy8g5rOo6ZSA5YaF5a2Y5pWw5o2uXG4gICAgICB0aGlzLl9yZWxlYXNlU3RvcmVkRGF0YSgpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IsIGBsZWF2ZVJvb20gZmFpbGVkLCBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ0xPU0VfUiwgJ2xlYXZlUm9vbSBzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ0xPU0VfUiwgJ2xlYXZlUm9vbSB0aHJvdyBleGNlcHRpb246IG5vdCBpbiByb29tJywgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOemgeeUqOinhumikSB0cmFja1xuICAgKi9cbiAgYXN5bmMgZGlzYWJsZVZpZGVvVHJhY2soKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB8IFJDUlRDQ29kZSwgdHJhY2s/OiBSQ0xvY2FsVHJhY2t9PiB7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpO1xuICAgIGlmICghdHJhY2spIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLkNBTUVSQV9DTE9TRUQgfTtcbiAgICB9XG5cbiAgICAvLyDnpoHnlKjop4bpopFcbiAgICBjb25zdCBjb2RlID0gYXdhaXQgdHJhY2subXV0ZSgpO1xuXG4gICAgcmV0dXJuIHsgY29kZSwgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlkK/nlKjop4bpopF0cmFja1xuICAgKiAxLiDlkK/nlKjliY3lupTnlKjlsYLpnIDlhYjliJvlu7rop4bpopEgdHJhY2tcbiAgICovXG4gIGFzeW5jIGVuYWJsZVZpZGVvVHJhY2sodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB8IFJDUlRDQ29kZX0+IHtcbiAgICAvLyDojrflj5bmnKznq6/op4bpopEgdHJhY2tcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuQ0FNRVJBX0NMT1NFRCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWmguaenOi1hOa6kOayoeiiq+emgeeUqO+8jOi/lOWbnuaIkOWKn1xuICAgICAqL1xuICAgIGlmICghdHJhY2suaXNPd25lck11dGVkKCkpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlkK/nlKjotYTmupBcbiAgICAgKi9cbiAgICBjb25zdCBjb2RlID0gYXdhaXQgdHJhY2sudW5tdXRlKCk7XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneS4reWIh+aNouinhumikeiuvuWkh1xuICAgKi9cbiAgYXN5bmMgY2hhbmdlVmlkZW9EZXZpY2UodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsVHJhY2sgfT4ge1xuICAgIC8vIOaWsOiuvuWkh+eahOi9qFxuICAgIGNvbnN0IHJlY2VudFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcbiAgICAvLyDmlbTnkIblkI7nmoTovahcbiAgICBjb25zdCBsb2NhbFRyYWNrczogUkNMb2NhbFRyYWNrW10gPSBbXTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVDYW1lcmFWaWRlb1RyYWNrKFJUQ1Jlc291cmNlVGFnLk5PUk1BTCwgdGhpcy5fdmlkZW9Db25maWcpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gdGhpcy5fdmlkZW9Db25maWc7XG4gICAgKG1pbkJpdHJhdGUgfHwgbWF4Qml0cmF0ZSkgJiYgdHJhY2shLnNldEJpdHJhdGUobWF4Qml0cmF0ZSEsIG1pbkJpdHJhdGUhKTtcblxuICAgIGxldCBuZWVkRGVzdHJveVRyYWNrOiBSQ0xvY2FsVHJhY2s7XG4gICAgdGhpcy5fbG9jYWxUcmFja3MgJiYgdGhpcy5fbG9jYWxUcmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIGlmICh0cmFjay5pc1ZpZGVvVHJhY2soKSkge1xuICAgICAgICAvLyDotYTmupDph4rmlL5cbiAgICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgICAgICBuZWVkRGVzdHJveVRyYWNrID0gdHJhY2s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIOS7juacrOWcsOe8k+WtmOS4reWIoOmZpOmUgOavgeeahCB0cmFja1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzID0gdGhpcy5fbG9jYWxUcmFja3MuZmlsdGVyKChpdGVtKSA9PiBuZWVkRGVzdHJveVRyYWNrICYmIChpdGVtLmdldFRyYWNrSWQoKSAhPT0gbmVlZERlc3Ryb3lUcmFjay5nZXRUcmFja0lkKCkpKTtcblxuICAgIHJlY2VudFRyYWNrcy5wdXNoKHRyYWNrISk7XG5cbiAgICAvLyDnu5nmnKzlnLDliqDkuIrmlrDkuqfnlJ/nmoTop4bpopFcbiAgICBsb2NhbFRyYWNrcy5wdXNoKHRyYWNrISk7XG5cbiAgICB0aGlzLl9sb2NhbFRyYWNrcyA9IGxvY2FsVHJhY2tzO1xuXG4gICAgLy8g6YCa55+l5LiK5bGCIHRyYWNrUmVhZHlcbiAgICB0aGlzLl9vbkxvY2FsVHJhY2tSZWFkeShyZWNlbnRUcmFja3MsIHRyYWNlSWQpO1xuXG4gICAgLy8g5bey5Yqg5YWl5oi/6Ze0XG4gICAgaWYgKHRoaXMuX3Jvb20pIHtcbiAgICAgIC8vIOWPkeW4g+a1gVxuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tLnB1Ymxpc2gocmVjZW50VHJhY2tzKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjpn7PpopEgdHJhY2tcbiAgICovXG4gIGFzeW5jIGRpc2FibGVBdWRpb1RyYWNrKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfCBSQ1JUQ0NvZGUsIHRyYWNrPzogUkNMb2NhbFRyYWNrfT4ge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5nZXRMb2NhbEF1ZGlvVHJhY2soKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5NSUNST1BIT05FX0NMT1NFRCB9O1xuICAgIH1cblxuICAgIC8vIOemgeeUqOmfs+mikVxuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCB0cmFjay5tdXRlKCk7XG5cbiAgICByZXR1cm4geyBjb2RlLCB0cmFjayB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWqkuS9k+exu+Wei+WNh+OAgemZjVxuICAgKi9cbiAgYXN5bmMgY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfVCwgYG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG5cbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX3VwZ3JhZGVNZWRpYVR5cGUodHJhY2VJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX2Rvd25ncmFkZU1lZGlhVHlwZSh0cmFjZUlkKTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LmNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWNh+e6pyDpn7PpopEgLT4g6Z+z6KeG6aKRXG4gICAqIDEuIOS4muWKoeWxgumcgOimgeWFiOmAmui/hyBjcmVhdGVMb2NhbFRyYWNrcyDliJvlu7rmnKzlnLDop4bpopEgdHJhY2tcbiAgICogMi4gU0RLIOWPquWkhOeQhuWPkeW4g+inhumikSB0cmFja1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfdXBncmFkZU1lZGlhVHlwZSh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICAvLyAxLiDojrflj5bnvJPlrZjkuK3nmoTop4bpopEgdHJhY2tcbiAgICBsZXQgdHJhY2sgPSB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpO1xuICAgIGlmICghdHJhY2spIHtcbiAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2s6IG5ld1RyYWNrIH0gPSBhd2FpdCB0aGlzLl9jcmVhdGVWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBjcmVhdGUgdmlkZW8gdHJhY2sgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgICB0cmFjayA9IG5ld1RyYWNrO1xuICAgICAgY29uc3QgeyBtaW5CaXRyYXRlLCBtYXhCaXRyYXRlIH0gPSB0aGlzLl92aWRlb0NvbmZpZztcbiAgICAgIChtaW5CaXRyYXRlIHx8IG1heEJpdHJhdGUpICYmIHRyYWNrIS5zZXRCaXRyYXRlKG1heEJpdHJhdGUhLCBtaW5CaXRyYXRlISk7XG4gICAgfVxuICAgIC8vIDIuIOWPkeW4g+a1gVxuICAgIGNvbnN0IHB1YlBhcmFtcyA9IHRoaXMuX2lzUHViVGlueSA/IHsgdHJhY2s6IHRyYWNrISwgaXNQdWJUaW55OiB0cnVlIH0gOiB0cmFjayE7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLnB1Ymxpc2goW3B1YlBhcmFtc10sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHB1Ymxpc2ggZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpmY3nuqflpITnkIZcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2Rvd25ncmFkZU1lZGlhVHlwZSh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICAvLyAxLiDojrflj5bmnKzlnLDop4bpopEgdHJhY2tcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG5cbiAgICBpZiAodHJhY2spIHtcbiAgICAgIC8vIOWPlua2iOWPkeW4g+inhumikVxuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tIS51bnB1Ymxpc2goW3RyYWNrXSk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1IsIGB1bnB1Ymxpc2ggZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG5cbiAgICAgIC8vIOmHiuaUvuinhumikSB0cmFja1xuICAgICAgdGhpcy5kZXN0cm95VHJhY2sodHJhY2spO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliqDlhaUgUlRDIOaIv+mXtFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGpvaW5SVENSb29tKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCByb29tPzogUkNSVENSb29tLCB0cmFja3M/OiBSQ1JlbW90ZVRyYWNrW10gfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0pPSU5fUlRDX1JPT01fVCwgYGNhbGw6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHsgY29kZSwgcm9vbSwgdHJhY2tzIH0gPSBhd2FpdCByZXRyeUFzeW5jRm4gPElKb2luUlRDUm9vbVJlcz4oe1xuICAgICAgYXN5bmNGbjogdGhpcy5fcnRjQ2xpZW50LmpvaW5SVENSb29tLmJpbmQodGhpcy5fcnRjQ2xpZW50KSxcbiAgICAgIGZuQXJnczogW2NhbGxJZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGZhbHNlLCBSVENNb2RlLkNBTExdLFxuICAgIH0pO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0pPSU5fUlRDX1JPT01fUiwgYGNhbGxJZDogJHtjYWxsSWR9LCBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9vblJUQ01ldGhvZEZhaWwoUkNDYWxsUGx1c1JlYXNvbi5KT0lOX1JPT01fRVJSLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgdGhpcy5fcm9vbSA9IHJvb20hO1xuICAgIHRoaXMuX29uU2VsZkpvaW5lZCh7IGNhbGxJZCwgdXNlcklkOiB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpIH0sIHRyYWNlSWQpO1xuICAgIHRyYWNrcz8ubGVuZ3RoICYmIHRoaXMuX29uUmVtb3RlVHJhY2tQdWJsaXNoKHRyYWNrcyk7XG5cbiAgICB0aGlzLl9jYWxsSWQgPSBjYWxsSWQ7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgcm9vbSwgdHJhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICogUlRDIOiuoumYhVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN1YnNjcmliZVRyYWNrcyh0cmFja3M6IChJU3Vic2NyaWJlQXR0cilbXSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU1VCU0NSSUJFX1QsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHBhcmFtczogdHJhY2tzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCB7IHRyYWNrLCBzdWJUaW55IH0gPSBpdGVtO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRyYWNrSWQ6IHRyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgICBzdWJUaW55LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCByZXRyeUFzeW5jRm4gPElTdWJSZXM+KHtcbiAgICAgIGFzeW5jRm46IHRoaXMuX3Jvb20uc3Vic2NyaWJlLmJpbmQodGhpcy5fcm9vbSksXG4gICAgICBmbkFyZ3M6IFt0cmFja3NdLFxuICAgICAgb25FcnJvcjogKGNvZGUpID0+IHt9LFxuICAgIH0pO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25GZXRjaFJlbW90ZU1lZGlhRXJyb3IodHJhY2tzLCBjb2RlKTtcblxuICAgICAgdGhpcy5fb25SVENNZXRob2RGYWlsKFJDQ2FsbFBsdXNSZWFzb24uU1VCU0NSSUJFX0VSUiwgdHJhY2VJZCk7XG5cbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TVUJTQ1JJQkVfUiwgYGVycm9yQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NVQlNDUklCRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSVEMg5Y+W5raI6K6i6ZiFXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5zdWJzY3JpYmVUcmFja3ModHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1VOU1VCU0NSSUJFX1QsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHRyYWNrSWRzOiB0cmFja3MubWFwKCh0cmFjaykgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20udW5zdWJzY3JpYmUodHJhY2tzKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9VTlNVQlNDUklCRV9SLCBgZXJyb3JDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfVU5TVUJTQ1JJQkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICBwcml2YXRlIF9yZWxlYXNlU3RvcmVkRGF0YSgpIHtcbiAgICB0aGlzLl9yb29tID0gbnVsbDtcbiAgICB0aGlzLl9yZW1vdGVBdWRpb0VuYWJsZSA9IHRydWU7XG4gICAgdGhpcy5fdXNlclZpZXdNYXAgPSB7fTtcbiAgfVxuXG4gIGdldFJlbW90ZVRyYWNrcygpOiB7IFt1c2VySWQ6IHN0cmluZ106IFJDUmVtb3RlVHJhY2tbXX0ge1xuICAgIGNvbnN0IHRyYWNrczogeyBbdXNlcklkOiBzdHJpbmddOiBSQ1JlbW90ZVRyYWNrW119ID0ge307XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICByZXR1cm4gdHJhY2tzO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJJZHMgPSB0aGlzLl9yb29tLmdldFJlbW90ZVVzZXJJZHMoKTtcbiAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZDogc3RyaW5nKSA9PiB7XG4gICAgICB0cmFja3NbdXNlcklkXSA9IHRoaXMuX3Jvb20hLmdldFJlbW90ZVRyYWNrc0J5VXNlcklkKHVzZXJJZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYWNrcztcbiAgfVxuXG4gIGdldFJlbW90ZVRyYWNrKHVzZXJJZDogc3RyaW5nLCBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5fcm9vbT8uZ2V0UmVtb3RlVHJhY2tzQnlVc2VySWQodXNlcklkKS5maW5kKCh0cmFjaykgPT4gKChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8pID8gdHJhY2suaXNBdWRpb1RyYWNrKCkgOiB0cmFjay5pc1ZpZGVvVHJhY2soKSkpO1xuICB9XG5cbiAgLyoqID09PT09PeengeacieaWueazlT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuICAvKipcbiAgICogUlRDIOS6i+S7tuebkeWQrOazqOWGjFxuICAgKi9cbiAgcHJpdmF0ZSBfcmVnUlRDTGlzdGVuZXJzKCkge1xuICAgIC8vIOazqOWGjOaIv+mXtOS6i+S7tuebkeWQrFxuICAgIHRoaXMuX3Jvb20hLnJlZ2lzdGVyUm9vbUV2ZW50TGlzdGVuZXIoe1xuICAgICAgLyoqXG4gICAgICAgKiDmnKznq6/ooqvouKLlh7rmiL/pl7Tml7bop6blj5FcbiAgICAgICAqIEBkZXNjcmlwdGlvbiDooqvouKLlh7rmiL/pl7Tlj6/og73mmK/nlLHkuo7mnI3liqHnq6/otoXlh7rkuIDlrprml7bpl7TmnKrog73mlLbliLAgcnRjUGluZyDmtojmga/vvIzmiYDku6XorqTkuLrlt7Hmlrnnprvnur/jgIJcbiAgICAgICAqIOWPpuS4gOenjeWPr+iDveaYr+W3seaWuSBydGNQaW5nIOWksei0peasoeaVsOi2heWHuuS4iumZkO+8jOaVheiAjOS4u+WKqOaWree6v1xuICAgICAgICogQHBhcmFtIGJ5U2VydmVyXG4gICAgICAgKiDlvZPlgLzkuLogZmFsc2Ug5pe277yM6K+05piO5pys56uvIHJ0Y1Bpbmcg6LaF5pe2XG4gICAgICAgKiDlvZPlgLzkuLogdHJ1ZSDml7bvvIzor7TmmI7mnKznq6/mlLbliLDooqvouKLlh7rmiL/pl7TpgJrnn6VcbiAgICAgICAqL1xuICAgICAgb25LaWNrT2ZmOiAoYnlTZXJ2ZXI6IGJvb2xlYW4sIHN0YXRlPzogUkNLaWNrUmVhc29uIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIHRoaXMuX29uS2lja09mZihieVNlcnZlciwgdGhpcy5fcm9vbSEuZ2V0Um9vbUlkKCksIHN0YXRlKTtcbiAgICAgICAgdGhpcy5fcmVsZWFzZVN0b3JlZERhdGEoKTtcbiAgICAgIH0sXG4gICAgICAvLyDov5znq6/nlKjmiLfliqDlhaVcbiAgICAgIG9uVXNlckpvaW46ICh1c2VySWQ6IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB1c2VySWQubWFwKChpZCkgPT4gKHsgY2FsbElkOiB0aGlzLl9jYWxsSWQsIHVzZXJJZDogaWQgfSkpO1xuICAgICAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICAgICAgdGhpcy5fb25PdGhlck1lbUpvaW5lZChpbmZvLCB0cmFjZUlkKTtcbiAgICAgIH0sXG4gICAgICAvLyDov5znq6/nlKjmiLfnprvlvIBcbiAgICAgIG9uVXNlckxlYXZlOiAodXNlcklkczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQpID0+IHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLy8g6L+c56uv6LWE5rqQ5Y+R5biDXG4gICAgICBvblRyYWNrUHVibGlzaDogdGhpcy5fb25SZW1vdGVUcmFja1B1Ymxpc2guYmluZCh0aGlzKSxcbiAgICAgIC8vIOi/nOerr+i1hOa6kOWPlua2iOWPkeW4g1xuICAgICAgb25UcmFja1VucHVibGlzaDogdGhpcy5fb25UcmFja1VucHVibGlzaC5iaW5kKHRoaXMpLFxuICAgICAgLy8g6L+c56uv6LWE5rqQ5YeG5aSH5bCx57uqXG4gICAgICBvblRyYWNrUmVhZHk6ICh0cmFjazogUkNSZW1vdGVUcmFjaykgPT4ge1xuICAgICAgICB0aGlzLl9vblJlbW90ZVRyYWNrUmVhZHkoW3RyYWNrXSk7XG4gICAgICB9LFxuICAgICAgLy8g5Y+R5biD6ICF56aB55So44CB5ZCv55So6KeG6aKRXG4gICAgICBvblZpZGVvTXV0ZUNoYW5nZTogKHZpZGVvVHJhY2s6IFJDUmVtb3RlVmlkZW9UcmFjaykgPT4ge1xuICAgICAgICB0aGlzLl9vblZpZGVvTXV0ZUNoYWduZSh7XG4gICAgICAgICAgZnJvbVVzZXJJZDogdmlkZW9UcmFjay5nZXRVc2VySWQoKSxcbiAgICAgICAgICBtdXRlZDogdmlkZW9UcmFjay5pc093bmVyTXV0ZWQoKSxcbiAgICAgICAgICB0cmFja0lkOiB2aWRlb1RyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLy8g5Y+R5biD6ICF56aB55So44CB5ZCv55So6Z+z6aKRXG4gICAgICBvbkF1ZGlvTXV0ZUNoYW5nZTogKGF1ZGlvVHJhY2s6IFJDUmVtb3RlQXVkaW9UcmFjaykgPT4ge1xuICAgICAgICB0aGlzLl9vbkF1ZGlvTXV0ZUNoYW5nZSh7XG4gICAgICAgICAgZnJvbVVzZXJJZDogYXVkaW9UcmFjay5nZXRVc2VySWQoKSxcbiAgICAgICAgICBtdXRlZDogYXVkaW9UcmFjay5pc093bmVyTXV0ZWQoKSxcbiAgICAgICAgICB0cmFja0lkOiBhdWRpb1RyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgb25SVENQZWVyQ29ubmVjdGlvbkNsb3NlQnlFeGNlcHRpb246IHRoaXMuX29uUlRDUGVlckNvbm5lY3Rpb25DbG9zZUJ5RXhjZXB0aW9uLmJpbmQodGhpcyksXG4gICAgfSk7XG4gICAgLy8g5rOo5YaM6LSo6YeP5pWw5o2u5oql5ZGK55uR5ZCsXG4gICAgdGhpcy5fcm9vbSEucmVnaXN0ZXJSZXBvcnRMaXN0ZW5lcih7XG4gICAgICBvblN0YXRlUmVwb3J0OiB0aGlzLl9vblJUQ1N0YXRlUmVwb3J0LmJpbmQodGhpcyksXG4gICAgfSk7XG4gICAgLy8g5rOo5YaM6Z+z6YeP5LiK5oql5LqL5Lu2XG4gICAgdGhpcy5fcm9vbSEub25BdWRpb0xldmVsQ2hhbmdlKChhdWRpb0xldmVsUmVwb3J0TGlzdCkgPT4ge1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25Vc2VyQXVkaW9MZXZlbENoYW5nZWQoYXVkaW9MZXZlbFJlcG9ydExpc3QpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Mb2NhbFRyYWNrUmVhZHkodHJhY2tzOiBSQ0xvY2FsVHJhY2tbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25Vc2VyTWVkaWFBdmFpbGFibGUodHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uUmVtb3RlVHJhY2tSZWFkeSh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkge1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uVXNlck1lZGlhQXZhaWxhYmxlKHRyYWNrcyk7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX1JFQ0VJVkVfRklSU1RfRlJBTUVfXyk7XG4gIH1cblxuICBwcml2YXRlIF9vbktpY2tPZmYoYnlTZXJ2ZXI6IGJvb2xlYW4sIHJvb21JZDogc3RyaW5nLCBzdGF0ZT86IFJDS2lja1JlYXNvbiwga2lja0V4dHJhPzogUkNDYWxsS2lja0V4dHJhKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9LSUNLX09GRl9PLCBgcm9vbklkOiAke3Jvb21JZH0sIGJ5U2VydmVyOiAke2J5U2VydmVyfSwgc3RhdGU6ICR7c3RhdGV9LCBraWNrRXh0cmE6ICR7SlNPTi5zdHJpbmdpZnkoa2lja0V4dHJhKX1gKTtcbiAgICBsZXQgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24gPSBSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSO1xuICAgIGlmIChieVNlcnZlcikge1xuICAgICAgaWYgKGtpY2tFeHRyYSkge1xuICAgICAgICBzeXN0ZW1TdGF0ZSA9IGtpY2tFeHRyYS5raWNrUmVhc29uQ29kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICBjYXNlIFJDS2lja1JlYXNvbi5TRVJWRVJfS0lDSzpcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5LSUNLRURfQllfU0VSVkVSO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uT1RIRVJfS0lDSzpcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5PVEhFUl9DTElFTlRfSk9JTkVEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uSU1fRElTQ09OTkVDVEVEOlxuICAgICAgICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uSU1fTE9HT1VUOlxuICAgICAgICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkxPR09VVDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgUkNLaWNrUmVhc29uLk9USEVSX0NMSUVOVF9JTV9DT05ORUNURUQ6XG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IFJDQ2FsbFBsdXNSZWFzb24uT1RIRVJfQ0xJRU5UX0xPR0lOO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfT05fS0lDS09GRl9fLCBzeXN0ZW1TdGF0ZSwgcm9vbUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSVEMgUGVlciDlvILluLjlhbPpl61cbiAgICog56e75Yqo56uv5pyq5aSE55CG5q2k5Zue6LCD77yM5a6a5LmJIHN5c1N0YXR1cyDkuLogQ09OTkVDVElPTl9FUlJcbiAgICovXG4gIHByaXZhdGUgX29uUlRDUGVlckNvbm5lY3Rpb25DbG9zZUJ5RXhjZXB0aW9uKCkge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfUEVFUkNPTk5FQ1RJT05fRVhDRVBUX0NMT1NFX08sICcnLCB0cmFjZUlkKTtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfUlRDX1BFRVJDT05ORUNUSU9OX0FCTk9STUFMX0NMT1NFX18sIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfb25TZWxmSm9pbmVkKGluZm86IElNZW1iZXJJbmZvLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfT05fU0VMRl9KT0lORURfXywgaW5mby5jYWxsSWQsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25SZW1vdGVUcmFja1B1Ymxpc2godHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10pIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9vbkRldmljZUVuYWJsZUNoYW5nZSh0cmFja3MsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfUFVCTElTSF9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjYWxsSWQ6IHRoaXMuX2NhbGxJZCxcbiAgICAgIHRyYWNrSWRzOiB0cmFja3MubWFwKCh0cmFjaykgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCBuZWVkU3ViVHJhY2tzOiBJU3Vic2NyaWJlQXR0cltdID0gW107XG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIC8qKlxuICAgICAgICog5pS25Yiw6Z+z6aKR5pe277yM55u05o6l6K6i6ZiFXG4gICAgICAgKi9cbiAgICAgIGlmICh0cmFjay5pc0F1ZGlvVHJhY2soKSkge1xuICAgICAgICBuZWVkU3ViVHJhY2tzLnB1c2goeyB0cmFjaywgc3ViVGlueTogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZCh0aGlzLl9jYWxsSWQsIHRyYWNrKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXT8udmlkZW9WaWV3KSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlQ2FtZXJhU3RhdGVDaGFuZ2VkKHRoaXMuX2NhbGxJZCwgdHJhY2spO1xuICAgICAgICBjb25zdCB7IGlzVGlueSB9ID0gdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXTtcbiAgICAgICAgbmVlZFN1YlRyYWNrcy5wdXNoKHsgdHJhY2ssIHN1YlRpbnk6IGlzVGlueSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBuZWVkU3ViVHJhY2tzLmxlbmd0aCAmJiB0aGlzLnN1YnNjcmliZVRyYWNrcyhuZWVkU3ViVHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX29uVHJhY2tVbnB1Ymxpc2godHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10pIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9vbkRldmljZUVuYWJsZUNoYW5nZSh0cmFja3MsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfVU5QVUJMSVNIX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgdHJhY2tJZHM6IHRyYWNrcy5tYXAoKHRyYWNrKSA9PiB0cmFjay5nZXRUcmFja0lkKCkpLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGF3YWl0IHRoaXMudW5zdWJzY3JpYmVUcmFja3ModHJhY2tzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQXVkaW9NdXRlQ2hhbmdlKGluZm86IElNZWRpYU11dGVDaGFuZ2VJbmZvKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19FTkFCTEVfQ0hBTkdFX08sIEpTT04uc3RyaW5naWZ5KHsgaW5mbyB9KSwgdHJhY2VJZCk7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLl9yb29tIS5nZXRSZW1vdGVUcmFjayhpbmZvLnRyYWNrSWQpO1xuICAgIHRoaXMuX29uRGV2aWNlRW5hYmxlQ2hhbmdlKFt0cmFjayFdLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlbW90ZU1pY3JvcGhvbmVTdGF0ZUNoYW5nZWQodGhpcy5fY2FsbElkLCB0cmFjayEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25WaWRlb011dGVDaGFnbmUoaW5mbzogSU1lZGlhTXV0ZUNoYW5nZUluZm8pIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX1RSQUNLX0VOQUJMRV9DSEFOR0VfTywgSlNPTi5zdHJpbmdpZnkoeyBpbmZvIH0pLCB0cmFjZUlkKTtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuX3Jvb20hLmdldFJlbW90ZVRyYWNrKGluZm8udHJhY2tJZCk7XG4gICAgdGhpcy5fb25EZXZpY2VFbmFibGVDaGFuZ2UoW3RyYWNrIV0sIHRyYWNlSWQpO1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlQ2FtZXJhU3RhdGVDaGFuZ2VkKHRoaXMuX2NhbGxJZCwgdHJhY2shKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uUlRDU3RhdGVSZXBvcnQocmVwb3J0OiBJUkNSVENTdGF0ZVJlcG9ydCkge1xuICAgIGNvbnN0IHsgc2VuZGVycywgcmVjZWl2ZXJzIH0gPSByZXBvcnQ7XG4gICAgc2VuZGVycy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB7IGtpbmQsIHBhY2tldHNMb3N0UmF0ZSwgcnR0IH0gPSBpdGVtO1xuICAgICAgaWYgKHRoaXMuX2NhbGxNZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8gJiYga2luZCA9PT0gJ2F1ZGlvJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9jYWxsUGx1c1N0YXR1c1JlcG9ydExpc3RlbmVyPy5vblNlbmRQYWNrZXRMb3NzKHBhY2tldHNMb3N0UmF0ZSB8fCAwLCBydHQgfHwgMCk7XG4gICAgfSk7XG4gICAgcmVjZWl2ZXJzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdHJhY2tJZCwga2luZCwgcGFja2V0c0xvc3RSYXRlLCBiaXRyYXRlLFxuICAgICAgfSA9IGl0ZW07XG4gICAgICBpZiAodGhpcy5fY2FsbE1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJT19WSURFTyAmJiBraW5kID09PSAnYXVkaW8nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdXNlcklkIH0gPSBoZWxwZXIucGFyc2VUcmFja0lkKHRyYWNrSWQpO1xuICAgICAgY29uc3QgZGF0YToge1xuICAgICAgICBbdXNlcklkOiBzdHJpbmddOiBSQ0NhbGxQbHVzUGFja2V0TG9zc1N0YXRzO1xuICAgICAgfSA9IHt9O1xuICAgICAgaWYgKHBhY2tldHNMb3N0UmF0ZSkge1xuICAgICAgICBkYXRhW3VzZXJJZF0gPSB7XG4gICAgICAgICAgcGFja2V0TG9zdFJhdGU6IHBhY2tldHNMb3N0UmF0ZSxcbiAgICAgICAgICBiaXRSYXRlOiBiaXRyYXRlLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9jYWxsUGx1c1N0YXR1c1JlcG9ydExpc3RlbmVyPy5vblJlY2VpdmVQYWNrZXRMb3NzKGRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gKiBSVEMg5o6l5pS25pyA57uI5aSx6LSl5ZCO6ZyA6KaB6LCD55SoIGhhbmd1cCDmjILmlq3nmoTmg4XlhrVcbiAqL1xuICBwcml2YXRlIF9vblJUQ01ldGhvZEZhaWwoc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9SVENfUFJPQ0VTU19GQUlMRURfXywgc3lzdGVtU3RhdGUsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25PdGhlck1lbUpvaW5lZChpbmZvOiBJTWVtYmVySW5mb1tdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfT05fT1RIRVJfSk9JTkVEX18sIGluZm8sIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25EZXZpY2VFbmFibGVDaGFuZ2UodHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9PTl9ERVZJQ0VfRU5BQkxFX0NIQU5HRV9fLCB0cmFja3MsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuacrOWcsOmfs+mikSB0cmFjaywg5Yib5bu65oiQ5Yqf5ZCO5L+d5a2Y5pys5Zyw5bm25Zue6LCD6YCa55+lXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVBdWRpb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsQXVkaW9UcmFja30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzPy5zb21lKChpdGVtKSA9PiBpdGVtLmlzQXVkaW9UcmFjaygpKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX0FVRElPX1RSQUNLX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZU1pY3JvcGhvbmVBdWRpb1RyYWNrKFJUQ1Jlc291cmNlVGFnLk5PUk1BTCwgdGhpcy5fYXVkaW9Db25maWcpO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19SLCBgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBtaW5CaXRyYXRlLCBtYXhCaXRyYXRlIH0gPSB0aGlzLl9hdWRpb0NvbmZpZztcbiAgICAobWluQml0cmF0ZSB8fCBtYXhCaXRyYXRlKSAmJiB0cmFjayEuc2V0Qml0cmF0ZShtYXhCaXRyYXRlISwgbWluQml0cmF0ZSEpO1xuXG4gICAgLy8g5pys5qyh57yT5a2YXG4gICAgdGhpcy5fbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuICAgIC8vIOmAmuefpeS4iuWxglxuICAgIHRoaXMuX29uTG9jYWxUcmFja1JlYWR5KFt0cmFjayFdLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCB0cmFjayB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuacrOWcsOinhumikSB0cmFjaywg5Yib5bu65oiQ5Yqf5ZCO5L+d5a2Y5pys5Zyw5bm25Zue6LCD6YCa55+lXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVWaWRlb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsVmlkZW9UcmFja30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfVCwgJycsIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzPy5zb21lKChpdGVtKSA9PiBpdGVtLmlzVmlkZW9UcmFjaygpICYmICFpdGVtLmlzRGVzdHJveWVkKCkpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlQ2FtZXJhVmlkZW9UcmFjayhSVENSZXNvdXJjZVRhZy5OT1JNQUwsIHRoaXMuX3ZpZGVvQ29uZmlnKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfUiwgYGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gdGhpcy5fdmlkZW9Db25maWc7XG4gICAgKG1pbkJpdHJhdGUgfHwgbWF4Qml0cmF0ZSkgJiYgdHJhY2shLnNldEJpdHJhdGUobWF4Qml0cmF0ZSEsIG1pbkJpdHJhdGUhKTtcblxuICAgIC8vIOacrOasoee8k+WtmFxuICAgIHRoaXMuX2xvY2FsVHJhY2tzLnB1c2godHJhY2shKTtcbiAgICAvLyDpgJrnn6XkuIrlsYJcbiAgICB0aGlzLl9vbkxvY2FsVHJhY2tSZWFkeShbdHJhY2shXSwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfmnKzlnLDnvJPlrZjop4bpopEgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRMb2NhbFZpZGVvVHJhY2soKTogUkNMb2NhbFRyYWNrIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgbG9jYWxWaWRlb1RyYWNrOiBSQ0xvY2FsVHJhY2sgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzKSB7XG4gICAgICBbbG9jYWxWaWRlb1RyYWNrXSA9IHRoaXMuX2xvY2FsVHJhY2tzLmZpbHRlcigodHJhY2spID0+IHRyYWNrLmlzVmlkZW9UcmFjaygpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsVmlkZW9UcmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflvpfmnKzlnLDnvJPlrZjpn7PpopEgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRMb2NhbEF1ZGlvVHJhY2soKTogUkNMb2NhbFRyYWNrIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgbG9jYWxBdWRpb1RyYWNrOiBSQ0xvY2FsVHJhY2sgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzKSB7XG4gICAgICBbbG9jYWxBdWRpb1RyYWNrXSA9IHRoaXMuX2xvY2FsVHJhY2tzLmZpbHRlcigodHJhY2spID0+IHRyYWNrLmlzQXVkaW9UcmFjaygpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsQXVkaW9UcmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5HluIPmnKzlnLDotYTmupDnmoTpgLvovpFcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwdWJsaXNoKHRyYWNrczogKFJDTG9jYWxUcmFjayB8IElQdWJsaXNoQXR0cnMpW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUFVCTElTSF9ULCBgdHJhY2tzSWRzOiAke3RyYWNrcy5tYXAoKGl0ZW0pID0+ICgoaXRlbSBpbnN0YW5jZW9mIFJDTG9jYWxUcmFjaykgPyBpdGVtLmdldFRyYWNrSWQoKSA6IGl0ZW0udHJhY2suZ2V0VHJhY2tJZCgpKSl9YCwgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHJldHJ5QXN5bmNGbiA8SVB1YlJlcz4oe1xuICAgICAgYXN5bmNGbjogdGhpcy5fcm9vbSEucHVibGlzaC5iaW5kKHRoaXMuX3Jvb20pLFxuICAgICAgZm5BcmdzOiBbdHJhY2tzXSxcbiAgICAgIG9uRXJyb3I6IChjb2RlKSA9PiB7fSxcbiAgICB9KTtcblxuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fb25SVENNZXRob2RGYWlsKFJDQ2FsbFBsdXNSZWFzb24uUFVCTElTSF9FUlIsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BVQkxJU0hfUiwgYGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QVUJMSVNIX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNVQ0NFU1N9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgcHVibGljIHB1Ymxpc2hWaWRlb1RyYWNrKCkge1xuICAgIGNvbnN0IGRlZmF1bHRWaWRlb1RyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICBjb25zdCBwdWJQYXJhbXMgPSB0aGlzLl9pc1B1YlRpbnkgPyB7IHRyYWNrOiBkZWZhdWx0VmlkZW9UcmFjayEsIGlzUHViVGlueTogdHJ1ZSB9IDogZGVmYXVsdFZpZGVvVHJhY2shO1xuICAgIHJldHVybiB0aGlzLl9yb29tIS5wdWJsaXNoKFtwdWJQYXJhbXNdKTtcbiAgfVxuXG4gIHNldFZpZGVvVmlldyhsaXN0OiB7dXNlcklkOiBzdHJpbmcsIHZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCwgaXNUaW55PzogYm9vbGVhbn1bXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbmVlZFN1YlRyYWNrczogSVN1YnNjcmliZUF0dHJbXSA9IFtdO1xuICAgIGxpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgeyB1c2VySWQsIHZpZGVvRWxlbWVudCwgaXNUaW55ID0gZmFsc2UgfSA9IGl0ZW07XG4gICAgICB0aGlzLl91c2VyVmlld01hcFt1c2VySWRdID0ge1xuICAgICAgICB2aWRlb1ZpZXc6IHZpZGVvRWxlbWVudCxcbiAgICAgICAgaXNUaW55LFxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICog6K6+572u5pys56uv6KeG5Zu+5pe277yM5Y+q5a2Y5YKo5pWw5o2u77yM5peg6ZyA6K6i6ZiFXG4gICAgICAgKi9cbiAgICAgIGlmICh1c2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiDorr7nva7ov5znq6/op4blm77ml7bvvIzlpoLmnpzlt7Lnu4/liqDlhaXmiL/pl7TvvIzliJnojrflj5bov5znq6/otYTmupDnm7TmjqXorqLpmIVcbiAgICAgICAqL1xuICAgICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbW90ZVRyYWNrcyA9IHRoaXMuZ2V0UmVtb3RlVHJhY2tzKCk7XG4gICAgICBjb25zdCBzdWJQYXJhbXMgPSAocmVtb3RlVHJhY2tzW3VzZXJJZF0gfHwgW10pLm1hcCgodHJhY2spID0+ICh7XG4gICAgICAgIHRyYWNrLFxuICAgICAgICBzdWJUaW55OiBpc1RpbnksXG4gICAgICB9KSkuZmlsdGVyKCh7IHRyYWNrIH0pID0+ICF0cmFjay5pc1N1YnNjcmliZWQoKSk7XG4gICAgICBuZWVkU3ViVHJhY2tzLnB1c2goLi4uc3ViUGFyYW1zKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFVF9WSURFT19WSUVXX08sIEpTT04uc3RyaW5naWZ5KFxuICAgICAge1xuICAgICAgICB1c2VyVmlld01hcDogZ2V0VXNlclZpZGVvVmlld0luZm8odGhpcy5fdXNlclZpZXdNYXApLFxuICAgICAgICBuZWVkU3ViVHJhY2tJZHM6IG5lZWRTdWJUcmFja3MubWFwKCh7IHRyYWNrIH0pID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgICB9LFxuICAgICksIHRyYWNlSWQpO1xuXG4gICAgbmVlZFN1YlRyYWNrcy5sZW5ndGggJiYgdGhpcy5zdWJzY3JpYmVUcmFja3MobmVlZFN1YlRyYWNrcywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5Yig6Zmk6KeG5Zu+5pe277yM5Y+W5raI6K6i6ZiF6LWE5rqQXG4gICAqL1xuICByZW1vdmVWaWRlb1ZpZXcodXNlcklkczogc3RyaW5nW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHVuc3ViVHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10gPSBbXTtcbiAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB0cmFja3MgPSB0aGlzLmdldFJlbW90ZVRyYWNrcygpW3VzZXJJZF07XG4gICAgICBpZiAodHJhY2tzICYmIHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdmlkZW9UcmFjayA9IHRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc1ZpZGVvVHJhY2soKSk7XG4gICAgICAgIHZpZGVvVHJhY2subGVuZ3RoICYmIHVuc3ViVHJhY2tzLnB1c2godmlkZW9UcmFja1swXSk7XG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFTU9WRV9WSURFT19WSUVXX08sIEpTT04uc3RyaW5naWZ5KFxuICAgICAge1xuICAgICAgICB1c2VyVmlld01hcDogZ2V0VXNlclZpZGVvVmlld0luZm8odGhpcy5fdXNlclZpZXdNYXApLFxuICAgICAgICB1bnN1YlRyYWNrczogdW5zdWJUcmFja3MubWFwKCh0cmFjaykgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICAgIH0sXG4gICAgKSwgdHJhY2VJZCk7XG5cbiAgICBpZiAodW5zdWJUcmFja3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlVHJhY2tzKHVuc3ViVHJhY2tzLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5a2Y5YKo55qE5Lq65ZGY5ZKMIHZpZGVvIOWFg+e0oOaVsOaNrlxuICAgKi9cbiAgZ2V0VXNlclZpZXdNYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJWaWV3TWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIOaSreaUvuWqkuS9k+i1hOa6kFxuICAgKi9cbiAgYXN5bmMgcGxheU1lZGlhKHVzZXJJZDogc3RyaW5nLCBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIHZpZGVvVmlldzogSFRNTFZpZGVvRWxlbWVudCwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUExBWV9NRURJQV9ULCBgdXNlcklkOiAke3VzZXJJZH0sIG1lZGlhVHlwZTogJHttZWRpYVR5cGV9LCB2aWRlb1ZpZXc6ICR7dmlkZW9WaWV3Py5ub2RlTmFtZX1gLCB0cmFjZUlkKTtcbiAgICBsZXQgdHJhY2s6IFJDVHJhY2sgfCBudWxsID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiDljLrliIbmnKznq6/lkozov5znq69cbiAgICAgKi9cbiAgICBpZiAodXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKSB7XG4gICAgICB0cmFjayA9IChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8pID8gdGhpcy5nZXRMb2NhbEF1ZGlvVHJhY2soKSEgOiB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpITtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nXG4gICAgICB0cmFjayA9IHRoaXMuZ2V0UmVtb3RlVHJhY2tzKClbdXNlcklkXS5maWx0ZXIoKHRyYWNrKSA9PiAobWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPID8gdHJhY2suaXNBdWRpb1RyYWNrKCkgOiB0cmFjay5pc1ZpZGVvVHJhY2soKSkpWzBdO1xuICAgIH1cblxuICAgIGlmICghdHJhY2spIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QTEFZX01FRElBX1IsIGBlcnJvciBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLk1FRElBX1JFU09VUkNFX0lOVkFMSUVEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTUVESUFfUkVTT1VSQ0VfSU5WQUxJRUQgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBjb2RlIH0gPSB0cmFjay5pc0F1ZGlvVHJhY2soKSA/IGF3YWl0IHRyYWNrLnBsYXkoKSA6IGF3YWl0IHRyYWNrLnBsYXkodmlkZW9WaWV3KTtcbiAgICAgIC8qKlxuICAgICAgICog5aSE55CG6YCa6K+d5YmN6K6+572u5LqG6Z2Z6Z+z5omA5pyJ6L+c56uv6Z+z6aKR5rWBXG4gICAgICAgKi9cbiAgICAgIHRyYWNrLmlzQXVkaW9UcmFjaygpICYmICF0aGlzLl9yZW1vdGVBdWRpb0VuYWJsZSAmJiB0cmFjay5tdXRlKCk7XG5cbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUExBWV9NRURJQV9SLCBgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QTEFZX01FRElBX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuUExBWV9NRURJQV9GQUlMRUR9LCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9LGAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUExBWV9NRURJQV9GQUlMRUQgfTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHtcbiAgSVN1YnNjcmliZUF0dHIsXG4gIFJDTG9jYWxBdWRpb1RyYWNrLFxuICBSQ1JUQ0NvZGUsXG4gIFJDUmVtb3RlQXVkaW9UcmFjayxcbiAgUkNSZW1vdGVUcmFjayxcbiAgUkNUcmFjayxcbn0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZyc7XG5pbXBvcnQge1xuICBJQ2FsbFBsdXNFdmVudExpc3RlbmVyLFxuICBJUkNDYWxsUGx1c0NhbGxSZWNvcmQsXG4gIFJDQ2FsbFBsdXNNZWRpYVR5cGUsXG4gIFJDQ2FsbFBsdXNSZWFzb24sXG4gIFJDQ2FsbFBsdXNTZXNzaW9uLFxuICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSxcbiAgUkNDYWxsUGx1c1R5cGUsXG59IGZyb20gJy4uL2FwaS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQnO1xuXG5leHBvcnQgY2xhc3MgUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSB7XG4gIHByaXZhdGUgX2xpc3RlbmVyITogSUNhbGxQbHVzRXZlbnRMaXN0ZW5lclxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICkge1xuXG4gIH1cblxuICAvKipcbiAgICog54q25oCB5py65LqL5Lu25rOo5YaMXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJFdmVudExpc3RlbmVyKGxpc3RlbmVyOiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyKSB7XG4gICAgdGhpcy5fbGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgfVxuXG4gIC8qKlxuICAqIOWbnuiwg+W6lOeUqOWxguS6i+S7tlxuICAqIEBwYXJhbSBldmVudE5hbWVcbiAgKiBAcGFyYW0gYXR0cnNcbiAgKiBAcmV0dXJuc1xuICAqL1xuICBwcml2YXRlIGFzeW5jIF9jYWxsQXBwTGlzdGVuZXIoZXZlbnROYW1lOiBrZXlvZiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyLCAuLi5hdHRyczogYW55W10pIHtcbiAgICBjb25zdCBoYW5kbGUgPSB0aGlzLl9saXN0ZW5lcj8uW2V2ZW50TmFtZV0gYXMgRnVuY3Rpb247XG4gICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGhhbmRsZSguLi5hdHRycyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsKHNlc3Npb246IFJDQ2FsbFBsdXNTZXNzaW9uLCB0cmFjZUlkOiBzdHJpbmcsIGV4dHJhPzogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVjZWl2ZWRDYWxsJyxcbiAgICAgIGNhbGxJZDogc2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvblJlY2VpdmVkQ2FsbCcsIHNlc3Npb24sIGV4dHJhKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW90ZVVzZXJJbnZpdGVkKGludml0ZWVVc2VyTGlzdDogc3RyaW5nW10sIGludml0ZXJVc2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZW1vdGVVc2VySW52aXRlZCcsXG4gICAgICBpbnZpdGVlVXNlckxpc3QsXG4gICAgICBpbnZpdGVyVXNlcklkLFxuICAgICAgY2FsbElkLFxuICAgIH0pKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVtb3RlVXNlckludml0ZWQnLCBpbnZpdGVlVXNlckxpc3QsIGludml0ZXJVc2VySWQsIGNhbGxJZCk7XG4gIH1cblxuICBwdWJsaWMgb25DYWxsQ29ubmVjdGVkKHNlc3Npb246IFJDQ2FsbFBsdXNTZXNzaW9uKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uQ2FsbENvbm5lY3RlZCcsXG4gICAgICBjYWxsSWQ6IHNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgfSkpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25DYWxsQ29ubmVjdGVkJywgc2Vzc2lvbik7XG4gIH1cblxuICBwdWJsaWMgb25DYWxsVHlwZUNoYW5nZWQoY2FsbFR5cGU6IFJDQ2FsbFBsdXNUeXBlLCBjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uQ2FsbFR5cGVDaGFuZ2VkJyxcbiAgICAgIGNhbGxJZCxcbiAgICAgIGNhbGxUeXBlLFxuICAgIH0pLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uQ2FsbFR5cGVDaGFuZ2VkJywgY2FsbFR5cGUsIGNhbGxJZCk7XG4gIH1cblxuICAvKipcbiAgICog5aKe6YeP5LiK5oql6L+c56uv5Lq65ZGY54q25oCB5Y+Y5YyWXG4gICAqL1xuICBwdWJsaWMgb25SZW1vdGVVc2VyU3RhdGVDaGFuZ2VkKGRhdGE6IHtcbiAgICBjYWxsSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLFxuICAgIHJlYXNvbj86IFJDQ2FsbFBsdXNSZWFzb24sXG4gIH0sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgdXNlcklkLCB1c2VyU3RhdGUsIHJlYXNvbixcbiAgICB9ID0gZGF0YTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZW1vdGVVc2VyU3RhdGVDaGFuZ2VkJyxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHVzZXJJZCxcbiAgICAgIHVzZXJTdGF0ZSxcbiAgICAgIHJlYXNvbixcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvblJlbW90ZVVzZXJTdGF0ZUNoYW5nZWQnLCBjYWxsSWQsIHVzZXJJZCwgdXNlclN0YXRlLCByZWFzb24pO1xuICB9XG5cbiAgcHVibGljIG9uQ2FsbEVuZGVkKHNlc3Npb246IFJDQ2FsbFBsdXNTZXNzaW9uLCByZWFzb246IFJDQ2FsbFBsdXNSZWFzb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvbkNhbGxFbmRlZCcsXG4gICAgICBjYWxsSWQ6IHNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgICBjbG9zZVJlYXNvbjogcmVhc29uLFxuICAgIH0pLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uQ2FsbEVuZGVkJywgc2Vzc2lvbiwgcmVhc29uKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW90ZUNhbWVyYVN0YXRlQ2hhbmdlZChjYWxsSWQ6IHN0cmluZywgdHJhY2s6IFJDUmVtb3RlVHJhY2spIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZW1vdGVDYW1lcmFTdGF0ZUNoYW5nZWQnLFxuICAgICAgY2FsbElkLFxuICAgICAgdHJhY2tJZDogdHJhY2s/LmdldFRyYWNrSWQoKSxcbiAgICAgIGVuYWJsZTogdHJhY2s/LmlzT3duZXJNdXRlZCgpLFxuICAgIH0pKTtcbiAgICBjb25zdCB1c2VySWQgPSB0cmFjaz8uZ2V0VXNlcklkKCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvblJlbW90ZUNhbWVyYVN0YXRlQ2hhbmdlZCcsIGNhbGxJZCwgdXNlcklkLCB0cmFjaz8uaXNPd25lck11dGVkKCkpO1xuICB9XG5cbiAgcHVibGljIG9uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZChjYWxsSWQ6IHN0cmluZywgdHJhY2s6IFJDUmVtb3RlVHJhY2spIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZW1vdGVNaWNyb3Bob25lU3RhdGVDaGFuZ2VkJyxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHRyYWNrSWQ6IHRyYWNrPy5nZXRUcmFja0lkKCksXG4gICAgICBlbmFibGU6IHRyYWNrPy5pc093bmVyTXV0ZWQoKSxcbiAgICB9KSk7XG4gICAgY29uc3QgdXNlcklkID0gdHJhY2s/LmdldFVzZXJJZCgpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZW1vdGVNaWNyb3Bob25lU3RhdGVDaGFuZ2VkJywgY2FsbElkLCB1c2VySWQsIHRyYWNrPy5pc093bmVyTXV0ZWQoKSk7XG4gIH1cblxuICBwdWJsaWMgb25SZWNlaXZlZENhbGxSZWNvcmQocmVjb3JkOiBJUkNDYWxsUGx1c0NhbGxSZWNvcmQsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2FsbFJlY29yZCcsXG4gICAgICByZWNvcmQsXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENhbGxSZWNvcmQnLCByZWNvcmQpO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXF1ZXN0KHVzZXJJZDogc3RyaW5nLCB0cmFuc2FjdGlvbklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXF1ZXN0JyxcbiAgICAgIHVzZXJJZCxcbiAgICAgIHRyYW5zYWN0aW9uSWQsXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlcXVlc3QnLCB1c2VySWQsIHRyYW5zYWN0aW9uSWQsIG1lZGlhVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgb25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlc3VsdChpbmZvOiB7XG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgdHJhbnNhY3Rpb25JZDogc3RyaW5nLFxuICAgIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgICBjb2RlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0XG4gIH0sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHtcbiAgICAgIHVzZXJJZCwgdHJhbnNhY3Rpb25JZCwgbWVkaWFUeXBlLCBjb2RlLFxuICAgIH0gPSBpbmZvO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVzdWx0JyxcbiAgICAgIHVzZXJJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVzdWx0Jywge1xuICAgICAgdXNlcklkLCB0cmFuc2FjdGlvbklkLCBtZWRpYVR5cGUsIGNvZGUsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25SZWNlaXZlZENhbGxTdGFydFRpbWUoaW5mbzogeyBjYWxsSWQ6IHN0cmluZywgY2FsbFN0YXJ0VGltZTogbnVtYmVyIH0sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2FsbFN0YXJ0VGltZScsXG4gICAgICBpbmZvLFxuICAgIH0pLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVjZWl2ZWRDYWxsU3RhcnRUaW1lJywgaW5mbyk7XG4gIH1cblxuICBwdWJsaWMgb25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZShjYWxsSWQ6IHN0cmluZywgY2FsbEZpcnN0RnJhbWVUaW1lOiBudW1iZXIsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2FsbEZpcnN0RnJhbWVUaW1lJyxcbiAgICAgIGNhbGxJZCxcbiAgICAgIGNhbGxGaXJzdEZyYW1lVGltZSxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvblJlY2VpdmVkQ2FsbEZpcnN0RnJhbWVUaW1lJywgY2FsbElkLCBjYWxsRmlyc3RGcmFtZVRpbWUpO1xuICB9XG5cbiAgcHVibGljIG9uVXNlck1lZGlhQXZhaWxhYmxlKHRyYWNrczogUkNUcmFja1tdLCB0cmFjZUlkPzogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uVXNlck1lZGlhQXZhaWxhYmxlJyxcbiAgICAgIHRyYWNrSWRzOiB0cmFja3MubWFwKCh0cmFjaykgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIGNvbnN0IHVzZXJJZCA9IHRyYWNrLmdldFVzZXJJZCgpO1xuICAgICAgY29uc3QgbWVkaWFUeXBlID0gdHJhY2suaXNBdWRpb1RyYWNrKCkgPyBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPIDogUkNDYWxsUGx1c01lZGlhVHlwZS5WSURFTztcbiAgICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25Vc2VyTWVkaWFBdmFpbGFibGUnLCB1c2VySWQsIG1lZGlhVHlwZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25GZXRjaFJlbW90ZU1lZGlhRXJyb3IodHJhY2tzOiBJU3Vic2NyaWJlQXR0cltdLCBjb2RlOiBSQ1JUQ0NvZGUpIHtcbiAgICB0cmFja3MuZm9yRWFjaCgoeyB0cmFjayB9KSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25GZXRjaFJlbW90ZU1lZGlhRXJyb3InLCB1c2VySWQsIGNvZGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uVXNlckF1ZGlvTGV2ZWxDaGFuZ2VkKGF1ZGlvTGV2ZWxSZXBvcnRMaXN0OiB7XG4gICAgdHJhY2s6IFJDTG9jYWxBdWRpb1RyYWNrIHwgUkNSZW1vdGVBdWRpb1RyYWNrO1xuICAgIGF1ZGlvTGV2ZWw6IG51bWJlcjtcbiAgfVtdKSB7XG4gICAgYXVkaW9MZXZlbFJlcG9ydExpc3QuZm9yRWFjaCgoeyB0cmFjaywgYXVkaW9MZXZlbCB9KSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25Vc2VyQXVkaW9MZXZlbENoYW5nZWQnLCB1c2VySWQsIGF1ZGlvTGV2ZWwpO1xuICAgIH0pO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBDYWxsU2VydmVyRXJyb3JDb2RlIHtcbiAgLyoqXG4gICAqIOacquefpemUmeivr1xuICAgKi9cbiAgVU5LTk9XX0VSUiA9IDQxMDAwLFxuICAvKipcbiAgICog5pWw5o2u5bqT6ZSZ6K+vXG4gICAqL1xuICBEQl9FUlIgPSA0MTAwMSxcbiAgLyoqXG4gICAqIGpzb24g6ZSZ6K+vXG4gICAqL1xuICBKU09OX0VSUiA9IDQxMDAyLFxuICAvKipcbiAgICoganNvbiDmoLzlvI/plJnor69cbiAgICovXG4gIElOVkFMSURfSlNPTl9FUlIgPSA0MTAwMyxcbiAgLyoqXG4gICAqIOWPguaVsOS4ouWksVxuICAgKi9cbiAgTUlTU0lOR19QQVJBTVMgPSA0MTAwNCxcbiAgLyoqXG4gICAqIOWPguaVsOS4jeiDveS4uuepulxuICAgKi9cbiAgUEFSQU1TX1JFUVVJUkVEID0gNDEwMDUsXG4gIC8qKlxuICAgKiDmlbDmja7moLzlvI/plJnor69cbiAgICovXG4gIERBVEFfRk9STUFUX0VSUiA9IDQxMDA2LFxuICAvKipcbiAgICog5pa55rOV5pyq5a6e546wXG4gICAqL1xuICBNRVRIT0RfTk9UX0lNUExFTUVOVEVEID0gNDEwMDcsXG4gIC8qKlxuICAgKiBjYWxsIOS4jeWtmOWcqOaIluW3sue7k+adn1xuICAgKi9cbiAgQ0FMTF9OT1RfRVhJU1QgPSA0MTAxMCxcbiAgLyoqXG4gICAqIOWNleWRvCDooqvpgoDor7fogIXkuI3og73otoXov4fkuKTkurpcbiAgICovXG4gIFNJTkdBTF9FWENFRURfVFdPX0lOVklURUUgPSA0MTAxMSxcbiAgLyoqXG4gICAqIOe+pOe7hOWRvOWPq+i2hei/h+inhOWumuS6uuaVsO+8iOacgOWkmiAzMiDkurrvvIlcbiAgICovXG4gIEdST1VQX0VYQ0VFRFNfUVVPUlVNID0gNDEwMTIsXG4gIC8qKlxuICAgKiDmk43kvZzlt7Lov4fmnJ9cbiAgICovXG4gIE9QRVJBVElPTl9FWFBJUkVEID0gNDEwMTMsXG4gIC8qKlxuICAgKiDlvZPliY3orr7lpIfmraPlnKjlkbzlj6vkuK1cbiAgICovXG4gIERFVklDRV9JU19DQUxMSU5HID0gNDEwMTQsXG4gIC8qKlxuICAgKiDkuIrmiqXnmoQgc3RyZWFtUmVhZHlUaW1lIOaXoOaViFxuICAgKi9cbiAgUkVQT1JUX1NUUkVBTV9SRUFEWV9USU1FX0lTX0lOVkFMSUQgPSA0MTAxOCxcbiAgLyoqXG4gICAqIOS4jeiDveWRvOiHquW3sVxuICAgKi9cbiAgTk9UX0NBTExfWU9VUlNFTEYgPSA0MTAxOSxcbiAgLyoqXG4gICAqIOS8muivneeKtuaAgeS4jeWtmOWcqFxuICAgKi9cbiAgU0VTU0lPTl9TVEFUVVNfTk9UX0VYSVNUID0gNDEwMjAsXG4gIC8qKlxuICAgKiBoYW5ndXAg5pON5L2c5Zyo5b2T5YmN54q25oCB5LiN5YWB6K646LCD55SoXG4gICAqL1xuICBIQU5HVVBfTk9UX0FMTE9XID0gNDEwMjEsXG4gIC8qKlxuICAgKiBhY2NlcHQg5pON5L2c5Zyo5b2T5YmN54q25oCB5LiN5YWB6K646LCD55SoXG4gICAqL1xuICBBQ0NFUFRfTk9UX0FMTE9XID0gNDEwMjIsXG4gIC8qKlxuICAgKiDmk43kvZzlnKjlvZPliY3mlrnms5XkuI3lhYHorrjosIPnlKhcbiAgICovXG4gIE9QRVJBVElPTl9OT1RfQUxMT1cgPSA0MTAyNSxcbiAgLyoqXG4gICAqIOS4muWKoUlk5LiN5q2j56Gu5oiW6ICF5Lia5Yqh5bey57uT5p2fXG4gICAqL1xuICBUUkFOU0FDVElPTl9JRF9FUlIgPSA0MTEwMCxcbiAgLyoqXG4gICAqIOmfs+mikeWNh+e6p+inhumikeW3suiiq+WPkei1t+iAheWPlua2iFxuICAgKi9cbiAgVVBfVklERU9fQ0FOQ0VMRUQgPSA0MTA1MCxcbiAgLyoqXG4gICAqIOW9k+WJjemAmuivneW3sue7j+aYr+mfs+mikemAmuivne+8jOaXoOmcgOmZjee6p1xuICAgKi9cbiAgQ1VSUkVOVF9DQUxMX0lTX0FVRElPID0gNDEwNTEsXG4gIC8qKlxuICAgKiDlvZPliY3pgJror53lt7Lnu4/mmK/op4bpopHpgJror53vvIzml6DpnIDljYfnuqdcbiAgICovXG4gICBDVVJSRU5UX0NBTExfSVNfVklERU8gPSA0MTA1Mixcbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyLCBpc1N0cmluZyB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IElBbmRyb2lkUHVzaENvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ0NhbGxQbHVzQW5kcm9pZFB1c2hDb25maWdCdWlsZGVyIHtcbiAgcHJpdmF0ZSBfYW5kcm9pZFB1c2hDb25maWc6IElBbmRyb2lkUHVzaENvbmZpZyA9IHt9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiDorr7nva7lsI/nsbPnmoQgY2hhbm5lbElkXG4gICAqL1xuICBzZXRDaGFubmVsSWRNaShjaGFubmVsSWRNaTogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1N0cmluZyhjaGFubmVsSWRNaSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VUX0FORFJPSURfUFVTSF9DT05GSUdfTywgYGVycm9yTXNnOiBjaGFubmVsSWRNaSB0eXBlIGlzIHN0cmluZywgdmFsdWU6ICR7Y2hhbm5lbElkTWl9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fYW5kcm9pZFB1c2hDb25maWcuY2hhbm5lbElkTWkgPSBjaGFubmVsSWRNaTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7lsI/nsbMgTGFyZ2UgaWNvbiDpk77mjqVcbiAgICovXG4gIHNldE1pTGFyZ2VJY29uVXJsKG1pTGFyZ2VJY29uVXJsOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzU3RyaW5nKG1pTGFyZ2VJY29uVXJsKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PLCBgZXJyb3JNc2c6IG1pTGFyZ2VJY29uVXJsIHR5cGUgaXMgc3RyaW5nLCB2YWx1ZTogJHttaUxhcmdlSWNvblVybH1gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hbmRyb2lkUHVzaENvbmZpZy5taUxhcmdlSWNvblVybCA9IG1pTGFyZ2VJY29uVXJsO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruWNjuS4uueahCBjaGFubmVsSWRcbiAgICovXG4gIHNldENoYW5uZWxJZEhXKGNoYW5uZWxJZEhXOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzU3RyaW5nKGNoYW5uZWxJZEhXKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PLCBgZXJyb3JNc2c6IGNoYW5uZWxJZEhXIHR5cGUgaXMgc3RyaW5nLCB2YWx1ZTogJHtjaGFubmVsSWRIV31gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hbmRyb2lkUHVzaENvbmZpZy5jaGFubmVsSWRIVyA9IGNoYW5uZWxJZEhXO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruWNjuS4uuaOqOmAgea2iOaBr+WIhuexu1xuICAgKi9cbiAgc2V0Q2F0ZWdvcnlIVyhjYXRlZ29yeUhXOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzU3RyaW5nKGNhdGVnb3J5SFcpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFVF9BTkRST0lEX1BVU0hfQ09ORklHX08sIGBlcnJvck1zZzogY2F0ZWdvcnlIVyB0eXBlIGlzIHN0cmluZywgdmFsdWU6ICR7Y2F0ZWdvcnlIV31gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hbmRyb2lkUHVzaENvbmZpZy5jYXRlZ29yeUhXID0gY2F0ZWdvcnlIVztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7ljY7kuLrmjqjpgIHmtojmga/nuqfliKtcbiAgICovXG4gIHNldEltcG9ydGFuY2VIVyhpbXBvcnRhbmNlSFc6ICdOT1JNQUwnIHwgJ0xPVycpIHtcbiAgICBpZiAoaW1wb3J0YW5jZUhXICE9PSAnTE9XJyAmJiBpbXBvcnRhbmNlSFcgIT09ICdOT1JNQUwnKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFVF9BTkRST0lEX1BVU0hfQ09ORklHX08sIGBlcnJvck1zZzogaW1wb3J0YW5jZUhXIHZhbHVlIGlzIE5PUk1BTHxMT1csIHZhbHVlOiAke2ltcG9ydGFuY2VIV31gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hbmRyb2lkUHVzaENvbmZpZy5pbXBvcnRhbmNlSFcgPSBpbXBvcnRhbmNlSFc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5Y2O5Li66YCa55+l57G75Z6L55qE5o6o6YCB5omA5L2/55So55qE6YCa55+l5Zu+54mHIHVybFxuICAqL1xuICBzZXRJbWFnZVVybEhXKGltYWdlVXJsSFc6IHN0cmluZykge1xuICAgIGlmICghaXNTdHJpbmcoaW1hZ2VVcmxIVykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VUX0FORFJPSURfUFVTSF9DT05GSUdfTywgYGVycm9yTXNnOiBpbWFnZVVybEhXIHR5cGUgaXMgc3RyaW5nLCB2YWx1ZTogJHtpbWFnZVVybEhXfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2FuZHJvaWRQdXNoQ29uZmlnLmltYWdlVXJsSFcgPSBpbWFnZVVybEhXO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9riBPUFBPIOeahCBjaGFubmVsSWRcbiAgICovXG4gIHNldENoYW5uZWxJZE9QUE8oY2hhbm5lbElkT1BQTzogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1N0cmluZyhjaGFubmVsSWRPUFBPKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PLCBgZXJyb3JNc2c6IGNoYW5uZWxJZE9QUE8gdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2NoYW5uZWxJZE9QUE99YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fYW5kcm9pZFB1c2hDb25maWcuY2hhbm5lbElkT1BQTyA9IGNoYW5uZWxJZE9QUE87XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572uIHZpdm8g55qE57G75Z6LXG4gICAqL1xuICBzZXRUeXBlVml2byh0eXBlVml2bzogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1N0cmluZyh0eXBlVml2bykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VUX0FORFJPSURfUFVTSF9DT05GSUdfTywgYGVycm9yTXNnOiB0eXBlVml2byB0eXBlIGlzIHN0cmluZywgdmFsdWU6ICR7dHlwZVZpdm99YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fYW5kcm9pZFB1c2hDb25maWcudHlwZVZpdm8gPSB0eXBlVml2bztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva4gVml2byDliIbnsbtcbiAgICovXG4gIHNldENhdGVnb3J5Vml2byhjYXRlZ29yeVZpdm86IHN0cmluZykge1xuICAgIGlmICghaXNTdHJpbmcoY2F0ZWdvcnlWaXZvKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PLCBgZXJyb3JNc2c6IGNhdGVnb3J5Vml2byB0eXBlIGlzIHN0cmluZywgdmFsdWU6ICR7Y2F0ZWdvcnlWaXZvfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2FuZHJvaWRQdXNoQ29uZmlnLmNhdGVnb3J5Vml2byA9IGNhdGVnb3J5Vml2bztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAqIOiuvue9riBGQ00g5o6o6YCB5bmz5Y+w5rig6YGTIElEXG4gICovXG4gIHNldEZjbUNoYW5uZWxJZChmY21DaGFubmVsSWQ6IHN0cmluZykge1xuICAgIGlmICghaXNTdHJpbmcoZmNtQ2hhbm5lbElkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PLCBgZXJyb3JNc2c6IGZjbUNoYW5uZWxJZCB0eXBlIGlzIHN0cmluZywgdmFsdWU6ICR7ZmNtQ2hhbm5lbElkfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2FuZHJvaWRQdXNoQ29uZmlnLmZjbUNoYW5uZWxJZCA9IGZjbUNoYW5uZWxJZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva4gRkNNIOmAmuefpeexu+Wei+aOqOmAgeaXtuaJgOS9v+eUqOeahOWIhue7hCBpZFxuICAgKi9cbiAgc2V0RmNtQ29sbGFwc2VLZXkoZmNtQ29sbGFwc2VLZXk6IHN0cmluZykge1xuICAgIGlmICghaXNTdHJpbmcoZmNtQ29sbGFwc2VLZXkpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFVF9BTkRST0lEX1BVU0hfQ09ORklHX08sIGBlcnJvck1zZzogZmNtQ29sbGFwc2VLZXkgdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2ZjbUNvbGxhcHNlS2V5fWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2FuZHJvaWRQdXNoQ29uZmlnLmZjbUNvbGxhcHNlS2V5ID0gZmNtQ29sbGFwc2VLZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572uIEZDTSDpgJrnn6XnsbvlnovnmoTmjqjpgIHmiYDkvb/nlKjnmoTpgJrnn6Xlm77niYcgdXJsXG4gICAqL1xuICBzZXRGY21JbWFnZVVybChmY21JbWFnZVVybDogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1N0cmluZyhmY21JbWFnZVVybCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VUX0FORFJPSURfUFVTSF9DT05GSUdfTywgYGVycm9yTXNnOiBmY21JbWFnZVVybCB0eXBlIGlzIHN0cmluZywgdmFsdWU6ICR7ZmNtSW1hZ2VVcmx9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fYW5kcm9pZFB1c2hDb25maWcuZmNtSW1hZ2VVcmwgPSBmY21JbWFnZVVybDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva4gSE9OT1Ig5o6o6YCB57qn5YirXG4gICAqIExPVzog6LWE6K6v6JCl6ZSA57G75raI5oGv77yMTk9STUFMOiDmnI3liqHkuI7pgJrorq/nsbvmtojmga9cbiAgICovXG4gIHNldGltcG9ydGFuY2VIb25vcihpbXBvcnRhbmNlSG9ub3I6ICdOT1JNQUwnIHwgJ0xPVycpIHtcbiAgICBpZiAoaW1wb3J0YW5jZUhvbm9yICE9PSAnTE9XJyAmJiBpbXBvcnRhbmNlSG9ub3IgIT09ICdOT1JNQUwnKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFVF9BTkRST0lEX1BVU0hfQ09ORklHX08sIGBlcnJvck1zZzogaW1wb3J0YW5jZUhvbm9yIHZhbHVlIGlzIE5PUk1BTHxMT1csIHZhbHVlOiAke2ltcG9ydGFuY2VIb25vcn1gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hbmRyb2lkUHVzaENvbmZpZy5pbXBvcnRhbmNlSG9ub3IgPSBpbXBvcnRhbmNlSG9ub3I7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572uIEhPTk9SIOaOqOmAgeaJgOS9v+eUqOeahOmAmuefpeWbvueJhyB1cmxcbiAgICovXG4gIHNldGltYWdlVXJsSG9ub3IoaW1hZ2VVcmxIb25vcjogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1N0cmluZyhpbWFnZVVybEhvbm9yKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PLCBgZXJyb3JNc2c6IGltYWdlVXJsSG9ub3IgdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2ltYWdlVXJsSG9ub3J9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fYW5kcm9pZFB1c2hDb25maWcuaW1hZ2VVcmxIb25vciA9IGltYWdlVXJsSG9ub3I7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog5p6E5bu6IElBbmRyb2lkUHVzaENvbmZpZ1xuICAgKiBAcmV0dXJucyBJQW5kcm9pZFB1c2hDb25maWcg5a6J5Y2T5o6o6YCB6YWN572u5pWw5o2uXG4gICAqIOi/lOWbnuWAvOmcgOS8oOWFpSBzdGFydENhbGzjgIFpbnZpdGXjgIFoYW5ndXAg5pa55rOV55qEIHB1c2hDb25maWcuYW5kcm9pZENvbmZpZyDkuK1cbiAgICovXG4gIGJ1aWxkKCk6IElBbmRyb2lkUHVzaENvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FuZHJvaWRQdXNoQ29uZmlnO1xuICB9XG59XG4iLCIvKipcbiAqIGV4dHJhIOWGheWuueWwuuWvuOmZkOWItu+8mjEyOCBLQlxuICovXG5leHBvcnQgY29uc3QgTUFYX0VYVFJBX0JZVEVTID0gMTI4ICogMTAyNDtcbiIsImltcG9ydCB7XG4gIEJhc2ljTG9nZ2VyLCBnZXRVVUlELCBJUnVudGltZSwgaXNCb29sZWFuLCBpc051bWJlciwgaXNTdHJpbmcsIGlzVW5kZWZpbmVkLCBub3RFbXB0eUFycmF5LCBub3RFbXB0eVN0cmluZywgUGx1Z2luQ29udGV4dCwgUkNDb25uZWN0aW9uU3RhdHVzLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ1JlbW90ZVRyYWNrLCBSQ1JUQ0NvZGUsIGRldmljZSB9IGZyb20gJ0Byb25nY2xvdWQvcGx1Z2luLXJ0Yyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsUGx1c0NvZGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4vZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZyc7XG5pbXBvcnQge1xuICBSQ0NhbGxQbHVzRnJhbWVSYXRlLFxuICBSQ0NhbGxQbHVzUmVzb2x1dGlvbixcbiAgSUNhbGxQbHVzRXZlbnRMaXN0ZW5lcixcbiAgSUNhbGxQbHVzSW5pdE9wdHMsXG4gIElTdGF0dXNSZXBvcnRMaXN0ZW5lcixcbiAgSVJDQ2FsbFBsdXNHZXRDYWxsUmVjb3JkUmVzLFxuICBSQ0NhbGxQbHVzQ2FsbFVzZXIsXG4gIFJDQ2FsbFBsdXNNZWRpYVR5cGUsXG4gIFJDQ2FsbFBsdXNTZXNzaW9uLFxuICBSQ0NhbGxQbHVzVHlwZSxcbiAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUsXG4gIElBdWRpb0NvbmZpZyxcbiAgSVZpZGVvQ29uZmlnLFxuICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLFxuICBJUkNDYWxsUGx1c0NhbGxSZWNvcmQsXG4gIElSQ0NhbGxQbHVzUHVzaENvbmZpZyxcbn0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IFJDQXVkaW9Db25maWdCdWlsZGVyIGZyb20gJy4vUkNBdWRpb0NvbmZpZ0J1aWxkZXInO1xuaW1wb3J0IFJDVmlkZW9Db25maWdCdWlsZGVyIGZyb20gJy4vUkNWaWRlb0NvbmZpZ0J1aWxkZXInO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlYXNvbiB9IGZyb20gJy4vZW51bXMvUkNDYWxsUGx1c1JlYXNvbic7XG5pbXBvcnQge1xuICBnZXRCeXRlTGVuZ3RoLCBnZXRIYW5ndXBTeXN0ZW1TdGF0ZSwgaXNTdXBwb3J0TWVkaWFTZXJ2ZXIsIHZhbGlkYXRlQml0cmF0ZSwgdmFsaWRhdGVQdXNoQ29uZmlnLCB2YWxpZGF0ZVZpZGVvTm9kZU5hbWUsXG59IGZyb20gJy4uL3V0aWxzL2hlbHBlcic7XG5pbXBvcnQgUkNDYWxsUEx1c1N0YXRpc3RpY3MgZnJvbSAnLi4vbW9kdWxlcy9SQ0NhbGxQTHVzU3RhdGlzdGljcyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnJztcbmltcG9ydCB7XG4gIElIYW5ndXBGb3JCdXN5T3B0cywgSU1lbWJlckluZm8sXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyBSQ0NhbGxFbmdpbmUgfSBmcm9tICcuLi9SQ0NhbGxFbmdpbmUnO1xuaW1wb3J0IHsgUlRDTW9kdWxlIH0gZnJvbSAnLi4vbW9kdWxlcy9SVENNb2R1bGUnO1xuaW1wb3J0IHsgRm9yd2FyZFR5cGUgfSBmcm9tICcuLi9lbnVtcy9Gb3J3YXJkVHlwZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIH0gZnJvbSAnLi4vbW9kdWxlcy9SQ0NhbGxQbHVzUmVwb3J0TW9kdWxlJztcbmltcG9ydCB7IENhbGxTZXJ2ZXJFcnJvckNvZGUgfSBmcm9tICcuLi9lbnVtcy9DYWxsU2VydmVyRXJyb3JDb2RlJztcbmltcG9ydCBSQ0NhbGxQbHVzQW5kcm9pZFB1c2hDb25maWdCdWlsZGVyIGZyb20gJy4vUkNDYWxsUGx1c0FuZHJvaWRQdXNoQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgeyBNQVhfRVhUUkFfQllURVMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBSQ0NhbGxQbHVzQ2xpZW50IHtcbiAgLyoqXG4gICAqIOaRhOWDj+WktOmHh+mbhumFjee9rlxuICAgKi9cbiAgcHJpdmF0ZSBfdmlkZW9Db25maWc6IElWaWRlb0NvbmZpZyA9IHtcbiAgICByZXNvbHV0aW9uOiBSQ0NhbGxQbHVzUmVzb2x1dGlvbi5XNjQwX0g0ODAsXG4gICAgZnJhbWVSYXRlOiBSQ0NhbGxQbHVzRnJhbWVSYXRlLkZQU18xNSxcbiAgfVxuXG4gIC8qKlxuICAgKiDpuqblhYvpo47ph4fpm4bphY3nva5cbiAgICovXG4gIHByaXZhdGUgX2F1ZGlvQ29uZmlnOiBJQXVkaW9Db25maWcgPSB7fVxuXG4gIC8qKlxuICAgKiDnu5/orqHln4vngrnnsbtcbiAgICovXG4gIHByaXZhdGUgX2NhbGxQbHVzU3RhdGlzdGljczogUkNDYWxsUEx1c1N0YXRpc3RpY3NcblxuICAvKipcbiAgICogY2xpZW50IGNhbGxJZFxuICAgKi9cbiAgcHJpdmF0ZSBfY2xpZW50Q2FsbElkOiBzdHJpbmcgPSAnJ1xuXG4gIC8qKlxuICAgKiDmmK/lkKbkuLrkuLvliqjmjILmlq1cbiAgICovXG4gIHByaXZhdGUgX2lzTGF1bmNoSGFuZ3VwID0gZmFsc2VcblxuICAvKipcbiAgICog5ZG85Y+r6L+H56iL5Lit5oyC5patXG4gICAqL1xuICBwcml2YXRlIF9uZWVkSGFuZ3VwQ2FsbElkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuXG4gIHByaXZhdGUgX2NhbGxFbmdpbmU6IFJDQ2FsbEVuZ2luZTtcblxuICBwcml2YXRlIF9ydGNNb2R1bGU6IFJUQ01vZHVsZTtcblxuICAvKipcbiAgICog5LiK5oql5bqU55So5bGC5LqL5Lu25qih5Z2XXG4gICAqL1xuICBfcmVwb3J0QXBwRXZlbnRNb2R1bGU6IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGVcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250ZXh0OiBQbHVnaW5Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5pdE9wdHM6IElDYWxsUGx1c0luaXRPcHRzLFxuICApIHtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZSA9IG5ldyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlKF9sb2dnZXIpO1xuICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcyA9IG5ldyBSQ0NhbGxQTHVzU3RhdGlzdGljcyh0aGlzLl9sb2dnZXIsIHRoaXMuX2NvbnRleHQpO1xuICAgIC8vIOWIneWni+WMlueKtuaAgeacuuWunuS+i1xuICAgIHRoaXMuX2NhbGxFbmdpbmUgPSBuZXcgUkNDYWxsRW5naW5lKHRoaXMuX2NvbnRleHQsIHRoaXMuX3J1bnRpbWUsIHRoaXMuX2luaXRPcHRzLCB0aGlzLl9sb2dnZXIsIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlKTtcblxuICAgIHRoaXMuX3J0Y01vZHVsZSA9IG5ldyBSVENNb2R1bGUodGhpcy5fY29udGV4dCwgdGhpcy5fcnVudGltZSwgdGhpcy5faW5pdE9wdHMsIHRoaXMuX2xvZ2dlciwgdGhpcy5fY2FsbEVuZ2luZSwgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUpO1xuXG4gICAgdGhpcy5fcnRjTW9kdWxlLm9uKFJUQ01vZHVsZS5fX0lOTkVSX1JUQ19QUk9DRVNTX0ZBSUxFRF9fLCB0aGlzLl9ydGNQcm9jZXNzRmFpbEhhbmRsZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUub24oUlRDTW9kdWxlLl9fSU5ORVJfUlRDX1BFRVJDT05ORUNUSU9OX0FCTk9STUFMX0NMT1NFX18sIHRoaXMuX3BlZXJDb25uZWN0aW9uQWJub3JtYWxDbG9zZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUub24oUlRDTW9kdWxlLl9fSU5ORVJfT05fU0VMRl9KT0lORURfXywgdGhpcy5fc2VsZkpvaW5lZEhhbmRsZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUub24oUlRDTW9kdWxlLl9fSU5ORVJfT05fT1RIRVJfSk9JTkVEX18sIHRoaXMuX290aGVySm9pbmVkSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9SRUNFSVZFX0ZJUlNUX0ZSQU1FX18sIHRoaXMuX3JlY2VpdmVGaXJzdEZyYW1lSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9PTl9LSUNLT0ZGX18sIHRoaXMuX2tpY2tvZmZIYW5kbGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLm9uKFJUQ01vZHVsZS5fX0lOTkVSX09OX0RFVklDRV9FTkFCTEVfQ0hBTkdFX18sIHRoaXMuX3JlY2VpdmVEZXZpY2VFbmFibGVDaGFuZ2VIYW5kbGUuYmluZCh0aGlzKSk7XG5cbiAgICAvKipcbiAgICAgKiDpgJror53lu7rnq4vlkI7vvIxSVEMg5qih5Z2X6ZyA5Y+R5biD6LWE5rqQXG4gICAgICovXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5vbihSQ0NhbGxFbmdpbmUuX19JTk5FUl9TRVNTSU9OX0NPTk5FQ1RfXywgdGhpcy5fcnRjTW9kdWxlLnNlc3Npb25Db25uZWN0ZWQuYmluZCh0aGlzLl9ydGNNb2R1bGUpKTtcbiAgICAvKipcbiAgICAgKiDpgJror53mjILmlq3lkI7vvIxSVEMg5qih5Z2X6ZyA6YCA5Ye65oi/6Ze044CB5aSE55CG5YaF5a2Y5pWw5o2uXG4gICAgICovXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5vbihSQ0NhbGxFbmdpbmUuX19JTk5FUl9TRVNTSU9OX0NMT1NFX18sIHRoaXMuX3Nlc3Npb25DbG9zZUhhbmRsZS5iaW5kKHRoaXMpKTtcbiAgICAvKipcbiAgICAgKiDlpITnkIYgUlRDIOaooeWdl+WqkuS9k+WNh+mZjee6p+mAu+i+kVxuICAgICAqL1xuICAgIHRoaXMuX2NhbGxFbmdpbmUub24oUkNDYWxsRW5naW5lLl9fSU5ORVJfQ0hBTkdFX01FRElBX1RZUEVfXywgdGhpcy5fcnRjTW9kdWxlLmNoYW5nZU1lZGlhVHlwZS5iaW5kKHRoaXMuX3J0Y01vZHVsZSkpO1xuICAgIC8qKlxuICAgICAqIOaUtuWIsOmAmuivnemCgOivt+WQju+8jOmcgOS4iuaKpeWfi+eCuVxuICAgICAqL1xuICAgIHRoaXMuX2NhbGxFbmdpbmUub24oUkNDYWxsRW5naW5lLl9fSU5ORVJfSU5WSVRFX18sIChuZXdTZXNzaW9uLCBpbnZpdGVTb3VyY2UpID0+IHtcbiAgICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX1JFQ0VJVkVfQ0FMTF9TLCBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCArbmV3IERhdGUoKSwgbmV3U2Vzc2lvbiwgJycsIGludml0ZVNvdXJjZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Yqg5oi/6Ze044CB5Y+R5biD44CB6K6i6ZiF5aSx6LSl5pe26ZyA57uT5p2f6YCa6K+d77yM5bm25LiK5oql5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9ydGNQcm9jZXNzRmFpbEhhbmRsZShzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbWFpblNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgICBpZiAobWFpblNlc3Npb24pIHtcbiAgICAgIGNvbnN0IGNhbGxJZCA9IG1haW5TZXNzaW9uLmdldENhbGxJZCgpO1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5zeXN0ZW1TdGF0dXNVcCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgc3lzU3RhdHVzOiBzeXN0ZW1TdGF0ZSxcbiAgICAgICAgZm9yd2FyZDogRm9yd2FyZFR5cGUuQ1VSUkVOVCxcbiAgICAgIH0sIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzLnJlcG9ydFN0YXRpc3RpY3NEYXRhKFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfQUJOT1JNQUxfSEFOR1VQX1MsIFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsICtuZXcgRGF0ZSgpLCBtYWluU2Vzc2lvbik7XG4gICAgICB0aGlzLl9faW5uZXJIYW5ndXAoeyBjYWxsSWQsIHN5c3RlbVN0YXRlIH0sIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBydGMgcGVlckNvbm5lY3Rpb24g5byC5bi45pat5byA5pe26ZyA57uT5p2f6YCa6K+d77yM5bm25LiK5oql5Y6f5ZugXG4gICAqL1xuICBwcml2YXRlIF9wZWVyQ29ubmVjdGlvbkFibm9ybWFsQ2xvc2UodHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbWFpblNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgICBpZiAobWFpblNlc3Npb24pIHtcbiAgICAgIC8vIOS4iuaKpeeKtuaAgeiuqeWvueaWueefpemBk+iHquW3seemu+W8gOeahOWOn+WboFxuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5zeXN0ZW1TdGF0dXNVcCh7XG4gICAgICAgIGNhbGxJZDogbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgICAgIHN5c1N0YXR1czogUkNDYWxsUGx1c1JlYXNvbi5DT05ORUNUSU9OX0VSUixcbiAgICAgICAgZm9yd2FyZDogRm9yd2FyZFR5cGUuQ1VSUkVOVCxcbiAgICAgIH0sIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5lbmRDdXJyZW50U2Vzc2lvbihSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSLCBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOacrOerr+WKoOWFpSBSVEMg5oi/6Ze077yM6ZyA5pu05paw5pys5Lq6IE9OQ0FMTCDnirbmgIHvvIzph43mlrDmoKHml7ZcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3NlbGZKb2luZWRIYW5kbGUoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uQ2FsbENvbm5lY3RlZChzZXNzaW9uISk7XG5cbiAgICAvKipcbiAgICAgKiDmm7TmlrDoh6rlt7HnmoTnirbmgIFcbiAgICAgKi9cbiAgICBjb25zdCB2aWRlb1RyYWNrID0gdGhpcy5fcnRjTW9kdWxlLmdldExvY2FsVmlkZW9UcmFjaygpO1xuICAgIGNvbnN0IGF1ZGlvVHJhY2sgPSB0aGlzLl9ydGNNb2R1bGUuZ2V0TG9jYWxBdWRpb1RyYWNrKCk7XG4gICAgY29uc3QgY2FtZXJhRW5hYmxlID0gdmlkZW9UcmFjayA/ICF2aWRlb1RyYWNrLmlzT3duZXJNdXRlZCgpIDogZmFsc2U7XG4gICAgY29uc3QgbWljcm9waG9uZUVuYWJsZSA9IGF1ZGlvVHJhY2sgPyAhYXVkaW9UcmFjay5pc093bmVyTXV0ZWQoKSA6IGZhbHNlO1xuXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHVzZXJJZCwgUkNDYWxsUGx1c01lZGlhVHlwZS5WSURFTywgY2FtZXJhRW5hYmxlLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPLCBtaWNyb3Bob25lRW5hYmxlLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHNlbGZTdGF0ZSA9IFtcbiAgICAgIHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk9OQ0FMTCxcbiAgICAgICAgc3lzdGVtU3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24uT05DQUxMLFxuICAgICAgICBjYW1lcmFFbmFibGUsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGUsXG4gICAgICB9LFxuICAgIF07XG4gICAgdGhpcy5fY2FsbEVuZ2luZS51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgc2VsZlN0YXRlLCB0cmFjZUlkKTtcblxuICAgIC8vIOmHjeaWsOW8gOWni+agoeaXtumAu+i+kVxuICAgIHRoaXMuX2NhbGxFbmdpbmUuc3RhcnRUaW1lQ29ycmVjdGlvbih0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDov5znq6/kurrlkZjliqDlhaXmiL/pl7TvvIzmm7TmlrDov5znq6/kurrlkZjnirbmgIHlkozpgJror53nirbmgIHkuLogT05DQUxMXG4gICAqL1xuICBwcml2YXRlIF9vdGhlckpvaW5lZEhhbmRsZShpbmZvOiBJTWVtYmVySW5mb1tdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICAvLyDmm7TmlrDliqDlhaXmiL/pl7TkurrlkZjnirbmgIFcbiAgICBsZXQgY2FsbElkID0gJyc7XG4gICAgY29uc3QgdXNlcnNTdGF0ZSA9IGluZm8ubWFwKChpdGVtKSA9PiB7XG4gICAgICBjYWxsSWQgPSBpdGVtLmNhbGxJZDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVzZXJJZDogaXRlbS51c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuT05DQUxMLFxuICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5PTkNBTEwsXG4gICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLl9jYWxsRW5naW5lLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCB1c2Vyc1N0YXRlLCB0cmFjZUlkKTtcblxuICAgIC8vIOacieS6uuWPquWKoOaIv+mXtO+8jOS4jeWPkea1ge+8jOaVheatpOWkhOS5n+abtOaWsOS4uiBDT05ORUNURURcbiAgICBpZiAodGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk/LmdldFN0YXRlKCkgIT09IFJDQ2FsbFBsdXNDYWxsU3RhdGUuT05DQUxMKSB7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnVwZGF0ZU1haW5TZXNzaW9uU3RhdGUoUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLDpppbluKfkuIrmiqXnu5nkuJrliqHlsYJcbiAgICovXG4gIHByaXZhdGUgX3JlY2VpdmVGaXJzdEZyYW1lSGFuZGxlKHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0U3RhdGUoKSAhPT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUudXBkYXRlTWFpblNlc3Npb25TdGF0ZShSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCk7XG4gICAgfVxuXG4gICAgLy8g57uZIENhbGxTZXJ2ZXIg5LiK5oql5rWB5Yiw6L6+XG4gICAgdGhpcy5fY2FsbEVuZ2luZS51cEZpcnN0RnJhbWVUaW1lKHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiiq+i4ouWHuuaIv+mXtOaXtu+8jOmcgOe7k+adn+mAmuivnVxuICAgKi9cbiAgcHJpdmF0ZSBfa2lja29mZkhhbmRsZShzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbiwgcm9vbUlkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8qKlxuICAgICAqIOacrOerr+e9kee7nOaciemXrumimO+8jHBpbmcg5aSx6LSl5pe2XG4gICAgICovXG4gICAgaWYgKHN5c3RlbVN0YXRlID09PSBSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSKSB7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLmVuZEN1cnJlbnRTZXNzaW9uKHN5c3RlbVN0YXRlLCByb29tSWQsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDooqvmnI3liqHnq6/ouKLlh7rml7bnmoTlpITnkIZcbiAgICAgKi9cbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmIChtYWluU2Vzc2lvbikge1xuICAgICAgY29uc3QgY2FsbElkID0gbWFpblNlc3Npb24uZ2V0Q2FsbElkKCk7XG4gICAgICB0aGlzLl9jYWxsUGx1c1N0YXRpc3RpY3MucmVwb3J0U3RhdGlzdGljc0RhdGEoUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19BQk5PUk1BTF9IQU5HVVBfUywgUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgK25ldyBEYXRlKCksIG1haW5TZXNzaW9uLCB0aGlzLl9jbGllbnRDYWxsSWQpO1xuXG4gICAgICAvLyDkuIrmiqXnirbmgIHnm7TmjqXorqnlr7nmlrnnn6XpgZPoh6rlt7HnprvlvIDnmoTljp/lm6BcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuc3lzdGVtU3RhdHVzVXAoe1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIHN5c1N0YXR1czogc3lzdGVtU3RhdGUsXG4gICAgICAgIGZvcndhcmQ6IEZvcndhcmRUeXBlLkNVUlJFTlQsXG4gICAgICB9LCB0cmFjZUlkKTtcblxuICAgICAgLy8g55u05o6l57uT5p2f5bex5pa56YCa6K+dXG4gICAgICB0aGlzLl9jYWxsRW5naW5lLmVuZEN1cnJlbnRTZXNzaW9uKHN5c3RlbVN0YXRlLCByb29tSWQsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDov5znq6/otYTmupDpn7Pop4bpopHnirbmgIHlj5jljJbvvIzpnIDmm7TmlrAgc2Vzc2lvbiDkuK3kurrlkZjnmoTorr7lpIfnirbmgIFcbiAgICovXG4gIHByaXZhdGUgX3JlY2VpdmVEZXZpY2VFbmFibGVDaGFuZ2VIYW5kbGUodHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgY29uc3QgdXNlcklkID0gdHJhY2suZ2V0VXNlcklkKCk7XG4gICAgICBjb25zdCBtZWRpYVR5cGUgPSB0cmFjay5pc0F1ZGlvVHJhY2soKSA/IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gOiBSQ0NhbGxQbHVzTWVkaWFUeXBlLlZJREVPO1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHVzZXJJZCwgbWVkaWFUeXBlLCAhdHJhY2suaXNPd25lck11dGVkKCksIHRyYWNlSWQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneaMguaWreaXtu+8jOmcgOa4heepuuWGheWtmO+8jOemu+W8gOaIv+mXtFxuICAgKi9cbiAgcHJpdmF0ZSBfc2Vzc2lvbkNsb3NlSGFuZGxlKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICAvKipcbiAgICAgKiDku4XlnKjooqvliqjmjILmlq3ml7bmuIXnqbrliJvlu7rnmoTlrqLmiLfnq68gY2FsbElk77yMXG4gICAgICog5LiN5b2x5ZON5Li75Yqo5ZG85Y+r5ZCO5oyC5pat5pe25LiK5oqlIOWuouaIt+erryBjYWxsSWRcbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX2lzTGF1bmNoSGFuZ3VwKSB7XG4gICAgICB0aGlzLl9jbGllbnRDYWxsSWQgPSAnJztcbiAgICB9XG4gICAgdGhpcy5faXNMYXVuY2hIYW5ndXAgPSBmYWxzZTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNsb3NlKGNhbGxJZCwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5rOo5YaM5bqU55So5bGC5LqL5Lu2XG4gICAqIOWMheWQq+KAnOaUtuWIsOWRvOWPq+OAgemAmuivnee7k+adn+OAgemAmuivneS6uuWRmOeKtuaAgeWPmOabtOOAgemAmuivneexu+Wei+WPmOabtOKAneetieS6i+S7tlxuICAgKiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyIOWvueixoeivt+WPguiAgyBhcGlEb2NcbiAgICovXG4gIHNldENhbGxQbHVzRXZlbnRMaXN0ZW5lcihsaXN0ZW5lcjogSUNhbGxQbHVzRXZlbnRMaXN0ZW5lcikge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX0VWRU5UX0xJU1RFTkVSX08sIGxpc3RlbmVyID8gT2JqZWN0LmtleXMobGlzdGVuZXIpLmpvaW4oJywnKSA6IG51bGwpO1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLnJlZ2lzdGVyRXZlbnRMaXN0ZW5lcihsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICog5rOo5YaM6Z+z6KeG6aKR5LiK5LiL6KGM5Lii5YyF5pWw5o2u55uR5ZCsXG4gICAqIOavj+enkuS4iuaKpeS4gOasoVxuICAgKiBAcGFyYW0gbGlzdGVuZXIg57G75Z6L5Li6IElTdGF0dXNSZXBvcnRMaXN0ZW5lcu+8jOivpue7huWumuS5ieWPr+WPguiAgyBhcGlEb2NcbiAgICogQHBhcmFtIGxpc3RlbmVyLm9uU2VuZFBhY2tldExvc3MgIOWPkemAgeS4ouWMheeOh+S/oeaBr+Wbnuiwg1xuICAgKiBAcGFyYW0gbGlzdGVuZXIub25SZWNlaXZlUGFja2V0TG9zcyDmjqXmlLbkuKLljIXnjofkv6Hmga/lm57osINcbiAgICovXG4gIHNldFN0YXR1c1JlcG9ydExpc3RlbmVyKGxpc3RlbmVyOiBJU3RhdHVzUmVwb3J0TGlzdGVuZXIpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9TVEFUVVNfUkVQT1JUX0xJU1RFTkVSX08sIGxpc3RlbmVyID8gT2JqZWN0LmtleXMobGlzdGVuZXIpLmpvaW4oJywnKSA6IG51bGwpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRDYWxsUGx1c1N0YXR1c1JlcG9ydExpc3RlbmVyKGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7opoHop4LnnIvkurrlkZgo5YyF5ous6Ieq5bex5ZKM5a+55pa5KeeahOWqkuS9k+aSreaUvuWZqFxuICAgKiBAcGFyYW0gbGlzdCDkuLrkuIDkuKrliJfooajvvIzlj6/kvKDlhaXlpJrkurrnmoTlqpLkvZPmkq3mlL7lmahcbiAgICogQHBhcmFtIGl0ZW0udXNlcklkIOeUqOaItyBpZFxuICAgKiBAcGFyYW0gaXRlbS52aWRlb0VsZW1lbnQg5LiA5LiqIHZpZGVvIOWFg+e0oO+8jOeUqOS6juaSreaUvuinhumike+8jOmcgOimgeaMgui9veWcqOS4muWKoeWxgumhtemdouS4ilxuICAgKiBAcGFyYW0gaXRlbS5pc1Rpbnkg5piv5ZCm6KeC55yL5Yir5Lq655qE5bCP5rWB77yM5bCP56qX5Y+j5pe25Y+v5Lul6YWN572u5Li6IHRydWXvvIzlj6/oioLnnIHluKblrr3vvIx1c2VySWQg5Li66L+c56uv55So5oi35pe25pyJ5pWIXG4gICAqIEByZXR1cm5zIGNvZGUg6L+U5Zue5piv5ZCm6K6+572u5oiQ5YqfXG4gICAqL1xuICBzZXRWaWRlb1ZpZXcobGlzdDoge3VzZXJJZDogc3RyaW5nLCB2aWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQsIGlzVGlueT86IGJvb2xlYW59W10pOiB7IGNvZGU6IG51bWJlciB9IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1QsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGxpc3Q6IGxpc3QubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdXNlcklkLCB2aWRlb0VsZW1lbnQsIGlzVGlueSB9ID0gaXRlbTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgZWxlbWVudE5hbWU6IHZpZGVvRWxlbWVudD8ubm9kZU5hbWUsXG4gICAgICAgICAgaXNUaW55LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qOA5rWLXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eUFycmF5KGxpc3QpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fVklFV19SLCBgcGFyYW1zIGVyciwgbGlzdDogbm90IGVtcHR5IGFycmF5LCB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeShsaXN0KX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGxpc3QpIHtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCB2aWRlb0VsZW1lbnQgfSA9IGl0ZW07XG4gICAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX1ZJRVdfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7dXNlcklkfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIXZhbGlkYXRlVmlkZW9Ob2RlTmFtZSh2aWRlb0VsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IsIGBwYXJhbXMgZXJyLCB2aWRlb0VsZW1lbnQ6IG5lZWQgYSB2aWRlbyBlbGVtZW50LCB2YWx1ZTogJHt2aWRlb0VsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IHZpZGVvRWxlbWVudC5ub2RlTmFtZSA6IHZpZGVvRWxlbWVudH1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IsICdzdWNjZXMnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0VmlkZW9WaWV3KGxpc3QsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliKDpmaTmn5DkuKrkurrnmoTlqpLkvZPmkq3mlL7lmahcbiAgICog5LiN6KeC55yL5p+Q5Liq5Lq655qE6KeG6aKR5pe277yM5Lia5Yqh5bGC5Y+v5Lul55u05o6l56e76Zmk5a+55bqU55qEIHZpZGVvIOagh+etvu+8jFxuICAgKiDosIMgcmVtb3ZlVmlkZW9WaWV3IOaWueazle+8jFNESyDlhoXpg6jkvJrlgZzmraLmjqXmlLblr7nmlrnnmoTlqpLkvZPkvKDovpNcbiAgICogQHBhcmFtIHVzZXJJZHMg55So5oi3IGlkIOWIl+ihqFxuICAgKiBAcmV0dXJucyBjb2RlIOi/lOWbnuaYr+WQpuWIoOmZpOaIkOWKn1xuICAgKi9cbiAgcmVtb3ZlVmlkZW9WaWV3KHVzZXJJZHM6IHN0cmluZ1tdKTogeyBjb2RlOiBudW1iZXIgfSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19ULCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VySWRzLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOWPguaVsOajgOa1i1xuICAgICAqL1xuICAgIGlmICghKFxuICAgICAgbm90RW1wdHlBcnJheSh1c2VySWRzKVxuICAgICAgJiYgdXNlcklkcy5ldmVyeSgodXNlcklkKSA9PiBub3RFbXB0eVN0cmluZyh1c2VySWQpKVxuICAgICkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFTU9WRV9WSURFT19WSUVXX1IsIGBwYXJhbXMgZXJyLCB1c2VySWRzOiBub3QgZW1wdHkgYXJyYXksIHVzZXJJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkodXNlcklkcyl9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVNT1ZFX1ZJREVPX1ZJRVdfUiwgJ3N1Y2NlcycsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fcnRjTW9kdWxlLnJlbW92ZVZpZGVvVmlldyh1c2VySWRzLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog5pKt5pS+5oyH5a6a5Lq65ZGY55qE6Z+z6KeG6aKR5aqS5L2TXG4gICAqIOaSreaUvuafkOS4quS6uueahOinhumikeWJje+8jOivt+ehruS/neW3sue7j+iwg+eUqCBgc2V0VmlkZW9WaWV3YCDmlrnms5XkuLrlhbborr7nva7op4bpopHop4blm75cbiAgICogQHBhcmFtIHVzZXJJZCDmjIflrpropoHmn6XnnIvmn5DkuKrkurrnmoTlqpLkvZPotYTmupBcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDmjIflrprmkq3mlL7pn7PpopHov5jmmK/op4bpopFcbiAgICogQHJldHVybnMg6L+U5Zue5piv5ZCm5pKt5pS+5oiQ5YqfXG4gICAqL1xuICBhc3luYyBwbGF5TWVkaWEodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUExBWV9NRURJQV9ULCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB1c2VySWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyh1c2VySWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9QTEFZX01FRElBX1IsIGBwYXJhbXMgZXJyLCB1c2VySWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke3VzZXJJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKFJDQ2FsbFBsdXNNZWRpYVR5cGVbbWVkaWFUeXBlXSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgYHBhcmFtcyBlcnIsIG1lZGlhVHlwZSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS4jeaSreaUvuiHquW3seeahOWjsOmfs1xuICAgICAqL1xuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gJiYgdXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3kuJrliqHlsYLmmK/lkKborr7nva7ov4flvZPliY3kurrlkZjnmoTop4bpopHop4blm75cbiAgICAgKi9cbiAgICBjb25zdCB7IHZpZGVvVmlldyB9ID0gdGhpcy5fcnRjTW9kdWxlLmdldFVzZXJWaWV3TWFwKClbdXNlcklkXSB8fCB7fTtcbiAgICBpZiAobWVkaWFUeXBlICE9PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPICYmICF2aWRlb1ZpZXcpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuVklERU9fVklFV19OT1RfU0VUfSwgdmlkZW8gdmlldyBub3Qgc2V0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5WSURFT19WSUVXX05PVF9TRVQgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcnRjTW9kdWxlLnBsYXlNZWRpYSh1c2VySWQsIG1lZGlhVHlwZSwgdmlkZW9WaWV3LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rop4bpopHphY3nva7mnoTlu7rlmahcbiAgICogQHJldHVybnMgUkNWaWRlb0NvbmZpZ0J1aWxkZXIg55So5LqO5p6E6YCg6KeG6aKR6YeH6ZuG5pe255qE6YWN572u6aG577yM5Y+v5Lul6K6+572u5pGE5YOP5aS06K6+5aSHIGlk44CB5bin546H44CB5YiG6L6o546H562J77yMXG4gICAqIOiuvue9ruWujOmcgOiwgyBidWlsZCDmlrnms5XvvIzmnIDnu4jlnKggc2V0VmlkZW9Db25maWcg5ZCO55Sf5pWIXG4gICAqL1xuICBjcmVhdGVWaWRlb0NvbmZpZ0J1aWxkZXIoKTogUkNWaWRlb0NvbmZpZ0J1aWxkZXIge1xuICAgIHJldHVybiBuZXcgUkNWaWRlb0NvbmZpZ0J1aWxkZXIodGhpcy5fbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7op4bpopHphY3nva5cbiAgICog5LiL5qyh6YeH6ZuG5pe255Sf5pWI77yM5aaC5YiH5o2i5pGE5YOP5aS044CB6YeN5paw5bu656uL6YCa6K+dXG4gICAqL1xuICBzZXRWaWRlb0NvbmZpZyhjZmc6IElWaWRlb0NvbmZpZyk6IHsgY29kZTogbnVtYmVyIH0ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19ULCBKU09OLnN0cmluZ2lmeShjZmcpKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGZyYW1lUmF0ZSwgcmVzb2x1dGlvbiwgbWF4Qml0cmF0ZSwgbWluQml0cmF0ZSxcbiAgICB9ID0gY2ZnO1xuXG4gICAgaWYgKCFSQ0NhbGxQbHVzRnJhbWVSYXRlW2ZyYW1lUmF0ZV0pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiwgYHBhcmFtIGVycm9yLCBmcmFtZVJhdGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7ZnJhbWVSYXRlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoIVJDQ2FsbFBsdXNSZXNvbHV0aW9uW3Jlc29sdXRpb25dKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fQ09ORklHX1IsIGBwYXJhbSBlcnJvciwgcmVzb2x1dGlvbiBpcyBpbGxlZ2FsLCB2YWx1ZTogJHtyZXNvbHV0aW9ufWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGVycm9yTXNnIH0gPSB2YWxpZGF0ZUJpdHJhdGUobWluQml0cmF0ZSwgbWF4Qml0cmF0ZSk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiwgZXJyb3JNc2cpO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19SLCAnc3VjY2VzcycpO1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnID0geyAuLi5jZmcgfTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0VmlkZW9Db25maWcodGhpcy5fdmlkZW9Db25maWcpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rpn7PpopHphY3nva7mnoTlu7rlmahcbiAgICogQHJldHVybnMgUkNBdWRpb0NvbmZpZ0J1aWxkZXIg55So5LqO5p6E6YCg6Z+z6aKR6YeH6ZuG5pe255qE6YWN572u6aG577yM5Y+v5Lul6K6+572u6bqm5YWL6aOO6K6+5aSHIGlkXG4gICAqIOiuvue9ruWujOmcgOiwgyBidWlsZCDmlrnms5XvvIzmnIDnu4jlnKggc2V0QXVkaW9Db25maWcg5ZCO55Sf5pWIXG4gICAqL1xuICBjcmVhdGVBdWRpb0NvbmZpZ0J1aWxkZXIoKTogUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICAgIHJldHVybiBuZXcgUkNBdWRpb0NvbmZpZ0J1aWxkZXIodGhpcy5fbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rlronljZPmjqjpgIHkv6Hmga/mnoTlu7rlmahcbiAgICogQHJldHVybnMgUkNDYWxsUGx1c0FuZHJvaWRQdXNoQ29uZmlnQnVpbGRlciDnlKjkuo7mnoTpgKDlronljZPmjqjpgIHkv6HnmoTphY3nva7poblcbiAgICog6K6+572u5a6M6ZyA6LCDIGJ1aWxkIOaWueazleiOt+WPluiuvue9rueahCBhbmRyb2lkUHVzaENvbmZpZyDmlbDmja5cbiAgICog5pyA57uI6ZyA5oqKIGFuZHJvaWRQdXNoQ29uZmlnIOS8oOWFpSBzdGFydENhbGzjgIFpbnZpdGXjgIFoYW5ndXAg5pa55rOV55qEIHB1c2hDb25maWcuYW5kcm9pZENvbmZpZyDkuK1cbiAgICovXG4gIGNyZWF0ZUFuZHJvaWRQdXNoQ29uZmlnQnVpbGRlcigpOiBSQ0NhbGxQbHVzQW5kcm9pZFB1c2hDb25maWdCdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IFJDQ2FsbFBsdXNBbmRyb2lkUHVzaENvbmZpZ0J1aWxkZXIodGhpcy5fbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7pn7PpopHphY3nva5cbiAgICog5LiL5qyh6YeH6ZuG5pe255Sf5pWI77yM5aaC6YeN5paw5bu656uL6YCa6K+dXG4gICAqL1xuICBzZXRBdWRpb0NvbmZpZyhjZmc6IElBdWRpb0NvbmZpZyk6IHsgY29kZTogbnVtYmVyIH0ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19ULCBKU09OLnN0cmluZ2lmeShjZmcpKTtcbiAgICBjb25zdCB7IHNhbXBsZVJhdGUsIG1pbkJpdHJhdGUsIG1heEJpdHJhdGUgfSA9IGNmZztcbiAgICBpZiAoc2FtcGxlUmF0ZSAmJiAhaXNOdW1iZXIoc2FtcGxlUmF0ZSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9BVURJT19DT05GSUdfUiwgYHBhcmFtIGVycm9yLCBzYW1wbGVSYXRlOiB0eXBlIGlzIG51bWJlciwgdmFsdWU6ICR7c2FtcGxlUmF0ZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBlcnJvck1zZyB9ID0gdmFsaWRhdGVCaXRyYXRlKG1pbkJpdHJhdGUsIG1heEJpdHJhdGUpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfQVVESU9fQ09ORklHX1IsIGVycm9yTXNnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9BVURJT19DT05GSUdfUiwgJ3N1Y2Nlc3MnKTtcblxuICAgIHRoaXMuX2F1ZGlvQ29uZmlnID0geyAuLi5jZmcgfTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0QXVkaW9Db25maWcodGhpcy5fYXVkaW9Db25maWcpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5Hotbflkbzlj6tcbiAgICogQHBhcmFtIHVzZXJJZHMg6KKr5Y+r5Lq65ZGYIHVzZXJJZCDliJfooajvvIzljZXkurrlkbzlj6vku4XpnIDlnKjmlbDnu4TkuK3mlL7nva7lr7nmlrnkuIDkurrnmoQgdXNlcklkXG4gICAqIEBwYXJhbSB0eXBlIOWNleS6uuWRvOWPqyBvciDlpJrkurrlkbzlj6tcbiAgICogQHBhcmFtIG1lZGlhVHlwZSDpgJror53lqpLkvZPnsbvlnos6IOmfs+mikSBvciDpn7Pop4bpopFcbiAgICogQHBhcmFtIHB1c2hDb25maWcg56e75Yqo56uv5o6o6YCB5L+h5oGvXG4gICAqIEBwYXJhbSBleHRyYSDpmYTliqDkv6Hmga/vvIzkvJrpgI/kvKDnu5nooqvlkbzlj6vmlrlcbiAgICogQHJldHVybnMgY2FsbElkIOWRvOWPq+aIkOWKn+WQju+8jOS6p+eUn+eahOS8muivnSBpZFxuICAgKi9cbiAgYXN5bmMgc3RhcnRDYWxsKHVzZXJJZHM6IHN0cmluZ1tdLCBjYWxsVHlwZTogUkNDYWxsUGx1c1R5cGUgPSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSA9IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8sIHB1c2hDb25maWc/OiBJUkNDYWxsUGx1c1B1c2hDb25maWcsIGV4dHJhPzogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgY2FsbElkPzogc3RyaW5nIH0+IHtcbiAgICB0aGlzLl9jbGllbnRDYWxsSWQgPSBnZXRVVUlEKCk7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gK25ldyBEYXRlKCk7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1QsIGB1c2VySWRzOiAke3VzZXJJZHMuam9pbignLCcpfSwgY2FsbFR5cGU6ICR7Y2FsbFR5cGV9LCBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfSwgcHVzaENvbmZpZzogJHtwdXNoQ29uZmlnfSwgZXh0cmE6ICR7ZXh0cmF9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDb25uZWN0aW9uU3RhdHVzKCkgIT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNJR05BTF9ESVNDT05ORUNURUQgfTtcbiAgICB9XG5cbiAgICBjb25zdCBuYXZpSW5mbyA9IHRoaXMuX2NvbnRleHQuZ2V0TmF2aUluZm8oKTtcbiAgICBpZiAoIW5hdmlJbmZvIHx8ICFpc1N1cHBvcnRNZWRpYVNlcnZlcihuYXZpSW5mbykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPguaVsOagoemqjFxuICAgICAqL1xuICAgIGlmICghKFxuICAgICAgbm90RW1wdHlBcnJheSh1c2VySWRzKVxuICAgICAgJiYgdXNlcklkcy5ldmVyeSgodXNlcklkKSA9PiBub3RFbXB0eVN0cmluZyh1c2VySWQpKVxuICAgICkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZHM6IG5vdCBlbXB0eSBhcnJheSwgdXNlcklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKGlzVW5kZWZpbmVkKFJDQ2FsbFBsdXNUeXBlW2NhbGxUeXBlXSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHBhcmFtcyBlcnIsIGNhbGxUeXBlIGlzIGlsbGVnYWwsIHZhbHVlOiAke2NhbGxUeXBlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQoUkNDYWxsUGx1c01lZGlhVHlwZVttZWRpYVR5cGVdKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgbWVkaWFUeXBlIGlzIGlsbGVnYWwsIHZhbHVlOiAke21lZGlhVHlwZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKHB1c2hDb25maWcpIHtcbiAgICAgIGNvbnN0IHJlcyA9IHZhbGlkYXRlUHVzaENvbmZpZyhwdXNoQ29uZmlnKTtcbiAgICAgIGlmIChyZXMuY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBwYXJhbXMgZXJyLCBwdXNoQ29uZmlnIGlzIGlsbGVnYWwsIG1zZzogJHtyZXMuZXJyb3JNc2d9YCwgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4dHJhKSB7XG4gICAgICBpZiAoIWlzU3RyaW5nKGV4dHJhKSkge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBwYXJhbXMgZXJyLCBleHRyYSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHtleHRyYX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdldEJ5dGVMZW5ndGgoZXh0cmEpID4gTUFYX0VYVFJBX0JZVEVTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgJ3BhcmFtcyBlcnIsIGV4dHJhIG1heCBzaXplIGlzIDEyOEtCJywgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y2V6IGKIHVzZXJJZHMg6ZW/5bqm5LiN6IO96LaF6L+HIDFcbiAgICAgKi9cbiAgICBpZiAodXNlcklkcy5sZW5ndGggPiAxICYmIGNhbGxUeXBlID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHBhcmFtcyBlcnIsIFlvdSBjYW4gb25seSBjYWxsIG9uZSBwZXJzb24gaW4gYSBzaW5nbGUgY2FsbCwgdXNlcklkczogJHt1c2VySWRzLmpvaW4oJywnKX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLy8g5bey5a2Y5ZyoIHNlc3Npb24g5LiN5YWB6K645YaN5Y+R6LW35ZG85Y+rXG4gICAgaWYgKHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNFU1NJT05fRVhJU1R9LCBzZXNzaW9uIGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TRVNTSU9OX0VYSVNUIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6Z+z6KeG6aKR6YCa6K+d77yM6ZyA5o+Q5YmN6YeH6ZuG6Z+z6KeG6aKR6LWE5rqQXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5jcmVhdGVDYWxsTWVkaWFUcmFja3MobWVkaWFUeXBlLCB0cmFjZUlkKTtcbiAgICBpZiAoZ2V0TWVkaWFUcmFja3NDb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBjcmVhdGUgbWVpZGEgdHJhY2tzIGVycm9yIGNvZGU6ICR7Z2V0TWVkaWFUcmFja3NDb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogZ2V0TWVkaWFUcmFja3NDb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLnN0YXJ0Q2FsbCh7XG4gICAgICB0b1VzZXJzOiB1c2VySWRzLm1hcCgodXNlcklkKSA9PiAoeyB1c2VySWQgfSkpLFxuICAgICAgY2FsbFR5cGUsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjYWxsSWQ6IHRoaXMuX2NsaWVudENhbGxJZCxcbiAgICAgIHB1c2hDb25maWcsXG4gICAgICBleHRyYTogSlNPTi5zdHJpbmdpZnkoeyB1c2VySWQ6IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIGV4dHJhIH0pLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzLnJlcG9ydFN0YXRpc3RpY3NEYXRhKFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfU1RBUlRfQ0FMTF9TLCBjb2RlLCBzdGFydFRpbWUsIG51bGwsIHRoaXMuX2NsaWVudENhbGxJZCwgbnVsbCwgeyBtZWRpYVR5cGUsIGNhbGxUeXBlLCBjYWxsSWQ6IGRhdGE/LmNhbGxJZCB8fCAnJyB9KTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9ydGNNb2R1bGUuZGVzdHJveUFsbFRyYWNrcyh0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5ZG85Y+r6L+H56iL5Lit5oyC5patXG4gICAgICovXG4gICAgY29uc3QgeyBjYWxsSWQsIGNsaWVudENhbGxJZCB9ID0gZGF0YSE7XG4gICAgaWYgKHRoaXMuX25lZWRIYW5ndXBDYWxsSWQgPT09IGNsaWVudENhbGxJZCkge1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5jbGVhckFsbFRpbWVyKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLmhhbmd1cCh7IGNhbGxJZCB9LCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgdGhlICR7Y2FsbElkfSBjYWxsIGhhcyBiZWVuIGhhbmd1cGAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGlmIChjYWxsVHlwZSA9PT0gUkNDYWxsUGx1c1R5cGUuTVVMVEkpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ29ubmVjdGVkKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIEpTT04uc3RyaW5naWZ5KHsgZGF0YSwgY29kZSB9KSwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgY2FsbElkIH07XG4gIH1cblxuICAvKipcbiAgICog55u05o6l5Yqg5YWl6L+b6KGM5Lit55qE576k57uE6YCa6K+dXG4gICAqIEBwYXJhbSBjYWxsSWQg6YCa6K+dIGlkXG4gICAqL1xuICBhc3luYyBqb2luTXVsdGlDYWxsKGNhbGxJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fY29udGV4dC5nZXRDb25uZWN0aW9uU3RhdHVzKCkgIT09IFJDQ29ubmVjdGlvblN0YXR1cy5DT05ORUNURUQpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCB9O1xuICAgIH1cblxuICAgIGNvbnN0IG5hdmlJbmZvID0gdGhpcy5fY29udGV4dC5nZXROYXZpSW5mbygpO1xuICAgIGlmICghbmF2aUluZm8gfHwgIWlzU3VwcG9ydE1lZGlhU2VydmVyKG5hdmlJbmZvKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKGNhbGxJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgcGFyYW1zIGVyciwgY2FsbElkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZTogZ2V0U2Vzc2lvbkNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbFNlc3Npb24oeyBjYWxsSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGdldFNlc3Npb25Db2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYGdldCBjYWxsIGRhdGEgZXJyb3IsIGNvZGU6ICR7Z2V0U2Vzc2lvbkNvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBnZXRTZXNzaW9uQ29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgbWVkaWFUeXBlIH0gPSBkYXRhITtcblxuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKG1haW5TZXNzaW9uICYmIG1haW5TZXNzaW9uLmdldENhbGxJZCgpICE9PSBjYWxsSWQpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNFU1NJT05fRVhJU1QgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpn7Pop4bpopHpgJror53vvIzpnIDmj5DliY3ph4fpm4bpn7Pop4bpopHotYTmupBcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICAgIGlmIChnZXRNZWRpYVRyYWNrc0NvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgY3JlYXRlIG1laWRhIHRyYWNrcyBlcnJvciBjb2RlOiAke2dldE1lZGlhVHJhY2tzQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5qb2luQ2FsbCh7XG4gICAgICBjYWxsSWQsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX3J0Y01vZHVsZS5kZXN0cm95QWxsVHJhY2tzKHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNVQ0NFU1N9YCwgdHJhY2VJZCk7XG4gICAgYXdhaXQgdGhpcy5fcnRjTW9kdWxlLnNlc3Npb25Db25uZWN0ZWQoY2FsbElkLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit6YKA6K+35LuW5Lq6XG4gICAqIOWNleS6uumAmuivneS4remCgOivt+S7luS6uuS8muW8leWPkemAmuivneexu+Wei+WPmOabtFxuICAgKiBAcGFyYW0gdXNlcklkcyDooqvpgoDor7fkurrliJfooahcbiAgICogQHBhcmFtIHB1c2hDb25maWcg56e75Yqo56uv5o6o6YCB5L+h5oGvXG4gICAqIEBwYXJhbSBleHRyYSDpmYTliqDkv6Hmga/vvIzkvJrpgI/kvKDnu5nooqvpgoDor7fmlrlcbiAgICogQHJldHVybnMgYnVzeVVzZXJzIOi/lOWbnuW/mee6v+S6uuWRmOWIl+ihqFxuICAgKi9cbiAgYXN5bmMgaW52aXRlKHVzZXJJZHM6IHN0cmluZ1tdLCBwdXNoQ29uZmlnPzogSVJDQ2FsbFBsdXNQdXNoQ29uZmlnLCBleHRyYT86IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIGJ1c3lVc2Vycz86IFJDQ2FsbFBsdXNDYWxsVXNlcltdIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9ULCBgY2FsbElkOiAke3VzZXJJZHMuam9pbignLCcpfSwgcHVzaENvbmZpZzogJHtwdXNoQ29uZmlnfSwgZXh0cmE6ICR7ZXh0cmF9YCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIShcbiAgICAgIG5vdEVtcHR5QXJyYXkodXNlcklkcylcbiAgICAgICYmIHVzZXJJZHMuZXZlcnkoKHVzZXJJZCkgPT4gbm90RW1wdHlTdHJpbmcodXNlcklkKSlcbiAgICApKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9JTlZJVEVfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZHM6IG5vdCBlbXB0eSBhcnJheSwgdXNlcklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKHB1c2hDb25maWcpIHtcbiAgICAgIGNvbnN0IHJlcyA9IHZhbGlkYXRlUHVzaENvbmZpZyhwdXNoQ29uZmlnKTtcbiAgICAgIGlmIChyZXMuY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9JTlZJVEVfUiwgYHBhcmFtcyBlcnIsIHB1c2hDb25maWcgaXMgaWxsZWdhbCwgbXNnOiAke3Jlcy5lcnJvck1zZ31gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXh0cmEpIHtcbiAgICAgIGlmICghaXNTdHJpbmcoZXh0cmEpKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9SLCBgcGFyYW1zIGVyciwgZXh0cmEgaXMgaWxsZWdhbCwgdmFsdWU6ICR7ZXh0cmF9YCwgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRCeXRlTGVuZ3RoKGV4dHJhKSA+IE1BWF9FWFRSQV9CWVRFUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9JTlZJVEVfUiwgJ3BhcmFtcyBlcnIsIGV4dHJhIG1heCBzaXplIGlzIDEyOEtCJywgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+R6LW36YKA6K+3XG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmludml0ZSh7XG4gICAgICB0b1VzZXJzOiB1c2VySWRzLm1hcCgodXNlcklkKSA9PiAoe1xuICAgICAgICB1c2VySWQsXG4gICAgICB9KSksXG4gICAgICBwdXNoQ29uZmlnLFxuICAgICAgZXh0cmE6IEpTT04uc3RyaW5naWZ5KHsgdXNlcklkOiB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBleHRyYSB9KSxcbiAgICB9LCB0cmFjZUlkKTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9JTlZJVEVfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgYnVzeVVzZXJzID0gW107XG4gICAgaWYgKGRhdGEhLmJ1c3lsaW5lVXNlcnM/Lmxlbmd0aCkge1xuICAgICAgYnVzeVVzZXJzLnB1c2goLi4uZGF0YSEuYnVzeWxpbmVVc2Vycy5tYXAoKHVzZXIpID0+ICh7XG4gICAgICAgIHVzZXJJZDogdXNlci51c2VySWQsXG4gICAgICAgIHN0YXRlOiB1c2VyLnNlc3Npb25TdGF0dXMsXG4gICAgICB9KSkpO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1IsIGBzdWNjZXNzIGJ1c3lVc2VyczogJHtKU09OLnN0cmluZ2lmeShidXN5VXNlcnMpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgYnVzeVVzZXJzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5o6l5ZCs6YCa6K+dXG4gICAqIEBwYXJhbSBjYWxsSWQg6YCa6K+dIGlkXG4gICAqL1xuICBhc3luYyBhY2NlcHQoY2FsbElkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9jb250ZXh0LmdldENvbm5lY3Rpb25TdGF0dXMoKSAhPT0gUkNDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNJR05BTF9ESVNDT05ORUNURUR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVEIH07XG4gICAgfVxuXG4gICAgY29uc3QgbmF2aUluZm8gPSB0aGlzLl9jb250ZXh0LmdldE5hdmlJbmZvKCk7XG4gICAgaWYgKCFuYXZpSW5mbyB8fCAhaXNTdXBwb3J0TWVkaWFTZXJ2ZXIobmF2aUluZm8pKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPguaVsOagoemqjFxuICAgICAqL1xuICAgIGlmICghbm90RW1wdHlTdHJpbmcoY2FsbElkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBwYXJhbXMgZXJyLCBjYWxsSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5piv5ZCm5a2Y5Zyo6YCa6K+dXG4gICAgICog6ZyA5LuO5b2T5YmN6YCa6K+d6I635Y+WIG1laWRhVHlwZVxuICAgICAqL1xuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgY29uc3QgaG9sZFNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldEhvbGRTZXNzaW9uKGNhbGxJZCk7XG4gICAgaWYgKCFtYWluU2Vzc2lvbiAmJiAhaG9sZFNlc3Npb24pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgZXJyQ29kZSA6ICR7UkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEx9LCBzZXNzaW9uIG5vdCBleGlzdGAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDljLrliIbmjqXlkKwgbWFpblNlc3Npb24g5ZKMIGhvbGRTZXNzaW9uXG4gICAgICog5aaC5p6c5o6l5ZCsIGhvbGRTZXNzaW9u77yM6ZyA5YWI5oyC5patIG1haW5TZXNzaW9uXG4gICAgICovXG4gICAgY29uc3QgaXNBY2NlcHRIb2xkU2Vzc2lvbiA9IGNhbGxJZCA9PT0gaG9sZFNlc3Npb24/LmdldENhbGxJZCgpO1xuICAgIGlmIChpc0FjY2VwdEhvbGRTZXNzaW9uKSB7XG4gICAgICBjb25zdCB7IGNvZGU6IGhhbmd1cE1haW5TZXNzaW9uQ29kZSB9ID0gYXdhaXQgdGhpcy5oYW5ndXAobWFpblNlc3Npb24hLmdldENhbGxJZCgpKTtcbiAgICAgIGlmIChoYW5ndXBNYWluU2Vzc2lvbkNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBoYW5ndXAgbWFpblNlc3Npb24gZXJyb3IgY29kZTogJHtoYW5ndXBNYWluU2Vzc2lvbkNvZGV9YCwgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IGhhbmd1cE1haW5TZXNzaW9uQ29kZSB9O1xuICAgICAgfVxuICAgICAgdGhpcy5fY2FsbEVuZ2luZS51cGdyYWRlTWFpblNlc3Npb24oY2FsbElkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpn7Pop4bpopHpgJror53vvIzpnIDmj5DliY3ph4fpm4bpn7Pop4bpopHotYTmupBcbiAgICAgKi9cbiAgICBjb25zdCBtZWRpYVR5cGUgPSBtYWluU2Vzc2lvbiEuZ2V0TWVkaWFUeXBlKCk7XG4gICAgY29uc3QgeyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5jcmVhdGVDYWxsTWVkaWFUcmFja3MobWVkaWFUeXBlLCB0cmFjZUlkKTtcbiAgICBpZiAoZ2V0TWVkaWFUcmFja3NDb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYGNyZWF0ZSBtZWlkYSB0cmFja3MgZXJyb3IgY29kZTogJHtnZXRNZWRpYVRyYWNrc0NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj5HotbfmjqXlkKxcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuYWNjZXB0KHtcbiAgICAgIGNhbGxJZCxcbiAgICB9LCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX0FDQ0VQVF9DQUxMX1MsIGNvZGUsIHN0YXJ0VGltZSwgbWFpblNlc3Npb24pO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX3J0Y01vZHVsZS5kZXN0cm95QWxsVHJhY2tzKHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLnNlc3Npb25Db25uZWN0ZWQoY2FsbElkLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9faW5uZXJIYW5ndXAob3B0czogSUhhbmd1cEZvckJ1c3lPcHRzLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7IGNhbGxJZCB9ID0gb3B0cztcblxuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0SXNMb2NhbENsaWVudEhhbmd1cCh0cnVlKTtcbiAgICB0aGlzLl9jYWxsRW5naW5lLmNsZWFyQWxsVGltZXIoY2FsbElkLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5oYW5ndXAob3B0cywgdHJhY2VJZCk7XG5cbiAgICBpZiAoY29kZSA9PT0gQ2FsbFNlcnZlckVycm9yQ29kZS5DQUxMX05PVF9FWElTVCkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTICYmIGNhbGxJZCA9PT0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk/LmdldENhbGxJZCgpKSB7XG4gICAgICBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNsb3NlKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOaMguaWremAmuivnVxuICAgKiBAcGFyYW0gY2FsbElkIOS4uuWPr+mAieWPguaVsO+8jOS4jeS8oOaXtu+8jOaMguaWreato+WcqOi/m+ihjOeahOS4uyBzZXNzaW9u77yM5Lyg5YWl5pe25Y+v5oyH5a6a5oyC5pat5Li76YCa6K+d5oiW5pqC5pyq5bu656uL6L+e5o6l55qE6YCa6K+dXG4gICAqIOaaguacquW7uueri+i/nuaOpeeahOmAmuivne+8muaMh+W3suWcqOmAmuivneS4reaXtu+8jOaUtuWIsOWRvOWPq+S9huaaguacquaOpeWQrOeahOmAmuivnVxuICAgKiBAcGFyYW0gcHVzaENvbmZpZyDnp7vliqjnq6/mjqjpgIHkv6Hmga9cbiAgICovXG4gIGFzeW5jIGhhbmd1cChjYWxsSWQ/OiBzdHJpbmcsIHB1c2hDb25maWc/OiBJUkNDYWxsUGx1c1B1c2hDb25maWcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9ULCBgY2FsbElkOiAke2NhbGxJZH0sIHB1c2hDb25maWc6ICR7cHVzaENvbmZpZ31gLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKCFtYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDnsbvlnovmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoY2FsbElkICYmICFpc1N0cmluZyhjYWxsSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZDogdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKHB1c2hDb25maWcpIHtcbiAgICAgIGNvbnN0IHJlcyA9IHZhbGlkYXRlUHVzaENvbmZpZyhwdXNoQ29uZmlnKTtcbiAgICAgIGlmIChyZXMuY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgYHBhcmFtcyBlcnIsIHB1c2hDb25maWcgaXMgaWxsZWdhbCwgbXNnOiAke3Jlcy5lcnJvck1zZ31gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtYWluU2Vzc2lvbkNhbGxJZCA9IG1haW5TZXNzaW9uLmdldENhbGxJZCgpO1xuXG4gICAgLyoqXG4gICAgICog5qCh6aqM5Lyg5YWl55qEIGNhbGxJZCDmmK/lkKbmraPnoa5cbiAgICAgKi9cbiAgICBpZiAoY2FsbElkICYmIGNhbGxJZCAhPT0gbWFpblNlc3Npb25DYWxsSWQgJiYgIXRoaXMuX2NhbGxFbmdpbmUuZ2V0SG9sZFNlc3Npb24oY2FsbElkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1IsIGBwYXJhbXMgZXJyLCBjYWxsSWQgaXMgaW52YWxpZCwgdmFsdWU6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuQ0FMTF9JRF9JTlZBTElEIH07XG4gICAgfVxuXG4gICAgdGhpcy5faXNMYXVuY2hIYW5ndXAgPSB0cnVlO1xuXG4gICAgdGhpcy5fbmVlZEhhbmd1cENhbGxJZCA9IGNhbGxJZCB8fCBtYWluU2Vzc2lvbkNhbGxJZDtcbiAgICBjb25zdCBob2xkU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0SG9sZFNlc3Npb24odGhpcy5fbmVlZEhhbmd1cENhbGxJZCk7XG4gICAgY29uc3QgaGFuZ3VwU2Vzc2lvbiA9IGhvbGRTZXNzaW9uIHx8IG1haW5TZXNzaW9uO1xuXG4gICAgLyoqXG4gICAgICog6I635Y+W5oyC5pat5pe255qE5Lq65ZGY57O757uf54q25oCBXG4gICAgICovXG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgdXNlclN0YXRlID0gbWFpblNlc3Npb24uZ2V0VXNlckxpc3QoKS5maWx0ZXIoKHVzZXJJbmZvKSA9PiB1c2VySW5mby51c2VySWQgPT09IGN1cnJlbnRVc2VySWQpWzBdLnN0YXRlO1xuICAgIGNvbnN0IGlzQ2FsbGVlID0gW21haW5TZXNzaW9uLmdldENyZWF0b3JVc2VySWQoKSwgbWFpblNlc3Npb24uZ2V0SW52aXRlclVzZXJJZCgpXS5pbmNsdWRlcyhjdXJyZW50VXNlcklkKTtcbiAgICBjb25zdCBzeXN0ZW1TdGF0ZSA9IGdldEhhbmd1cFN5c3RlbVN0YXRlKHVzZXJTdGF0ZSwgaXNDYWxsZWUpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9faW5uZXJIYW5ndXAoe1xuICAgICAgY2FsbElkOiB0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkLFxuICAgICAgc3lzdGVtU3RhdGUsXG4gICAgICBwdXNoQ29uZmlnLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5LiK5oql5oyC5pat5Z+L54K55pWw5o2uXG4gICAgICovXG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzLnJlcG9ydFN0YXRpc3RpY3NEYXRhKFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfSEFOR1VQX0NBTExfUywgY29kZSwgc3RhcnRUaW1lLCBoYW5ndXBTZXNzaW9uLCB0aGlzLl9jbGllbnRDYWxsSWQpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9SLCBgc2lnbmFsIGVycm9yIGNvZGUgOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbmVlZEhhbmd1cENhbGxJZCA9IG51bGw7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit5Y+R6LW35aqS5L2T57G75Z6L5Y+Y5pu06K+35rGCXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUg5aqS5L2T57G75Z6LXG4gICAqIEByZXR1cm5zIHRyYW5zYWN0aW9uSWQg5a6i5oi356uv5ZKM5pyN5Yqh56uv5Lqk5LqS55qE5LqL5YqhIGlk77yM5Zyo5Y+W5raI5oiW5bqU562U5aqS5L2T57G75Z6L5YiH5o2i5pe25Lyg5YWlXG4gICAqL1xuICBhc3luYyByZXF1ZXN0Q2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIHRyYW5zYWN0aW9uSWQ/OiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9ULCBgbWVkaWFUeXBlOiAke21lZGlhVHlwZX1gLCB0cmFjZUlkKTtcblxuICAgIGlmIChpc1VuZGVmaW5lZChSQ0NhbGxQbHVzTWVkaWFUeXBlW21lZGlhVHlwZV0pKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBwYXJhbXMgZXJyLCBtZWRpYVR5cGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7bWVkaWFUeXBlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuZ2V0Q3VycmVudENhbGxTZXNzaW9uKCk7XG4gICAgY29uc3Qgb2xkTWVkaWFUeXBlID0gbWFpblNlc3Npb24/LmdldE1lZGlhVHlwZSgpO1xuXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gb2xkTWVkaWFUeXBlKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBlcnJvciBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLk1FRElBVFlQRV9JTlZBTElEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTUVESUFUWVBFX0lOVkFMSUQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3mmK/lkKblnKjpgJror53kuK1cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBlcnJvciBjb2RlIDogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTH0sIHNlc3Npb24gbm90IGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPkei1t+WqkuS9k+exu+Wei+WIh+aNolxuICAgICAqL1xuICAgIGNvbnN0IHRvVXNlcklkcyA9IG1haW5TZXNzaW9uPy5nZXRVc2VyTGlzdCgpLmZpbHRlcigodXNlcikgPT4gdXNlci51c2VySWQgIT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpLm1hcCgodXNlcikgPT4gdXNlci51c2VySWQpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5yZXF1ZXN0Q2hhbmdlTWVkaWFUeXBlKHsgbWVkaWFUeXBlLCB0b1VzZXJJZHM6IHRvVXNlcklkcyB8fCBbXSB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUVVFU1RfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHN1Y2Nlc3MgdHJhbnNhY3Rpb25JZDogJHtkYXRhIS50cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgdHJhbnNhY3Rpb25JZDogZGF0YSEudHJhbnNhY3Rpb25JZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPlua2iOWIh+aNouWqkuS9k+exu+Wei+WPmOabtOivt+axglxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCDlrqLmiLfnq6/lkozmnI3liqHnq6/kuqTkupLnmoTkuovliqEgaWTvvIzkuLrlj5HotbflqpLkvZPnsbvlnovlj5jmm7Tor7fmsYLov5Tlm57nmoQgdHJhbnNhY3Rpb25JZFxuICAgKi9cbiAgYXN5bmMgY2FuY2VsQ2hhbmdlTWVkaWFUeXBlKHRyYW5zYWN0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1QsIGB0cmFuc2FjdGlvbklkOiAke3RyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKHRyYW5zYWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHBhcmFtIGVycm9yLCB0cmFuc2FjdGlvbklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHt0cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3mmK/lkKblnKjpgJror53kuK1cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEVfUiwgYGVycm9yIGNvZGUgOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfSwgc2Vzc2lvbiBub3QgZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+W5raI5aqS5L2T57G75Z6L5YiH5o2iXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmNhbmNlbENoYW5nZU1lZGlhVHlwZSh7IHRyYW5zYWN0aW9uSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovlj5jmm7TlupTnrZRcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQg5a6i5oi356uv5ZKM5pyN5Yqh56uv5Lqk5LqS55qE5LqL5YqhIGlk77yM5Li6IG9uUmVjZWl2ZWRDaGFuZ2VUb1ZpZGVvIOebkeWQrOaUtuWIsCB0cmFuc2FjdGlvbklkIOWPguaVsOWAvFxuICAgKi9cbiAgYXN5bmMgcmVwbHlDaGFuZ2VNZWRpYVR5cGUodHJhbnNhY3Rpb25JZDogc3RyaW5nLCBpc0FncmVlOiBib29sZWFuKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9ULCBgdHJhbnNhY3Rpb25JZDogJHt0cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyh0cmFuc2FjdGlvbklkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVQTFlfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHBhcmFtIGVycm9yLCB0cmFuc2FjdGlvbklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHt0cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG4gICAgaWYgKCFpc0Jvb2xlYW4oaXNBZ3JlZSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBwYXJhbSBlcnJvciwgaXNBZ3JlZTogdHlwZSBpcyBib29sZWFuLCB2YWx1ZTogJHtpc0FncmVlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3mmK/lkKblnKjpgJror53kuK1cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgZXJyb3IgY29kZSA6ICR7UkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEx9LCBzZXNzaW9uIG5vdCBleGlzdGAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUucmVzcG9uc2VDaGFuZ2VNZWRpYVR5cGUoe1xuICAgICAgdHJhbnNhY3Rpb25JZCxcbiAgICAgIGFncmVlOiBpc0FncmVlLFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc2lnbmFsIGVycm9yOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3ov5vooYzkuK3nmoTpgJror51cbiAgICogQHJldHVybnMgUkNDYWxsUGx1c1Nlc3Npb24g5a+56LGh5oiWIG51bGwg5Li65b2T5YmN5q2j5Zyo6L+b6KGM55qE6YCa6K+d5a+56LGhXG4gICAqL1xuICBnZXRDdXJyZW50Q2FsbFNlc3Npb24oKTogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gIH1cblxuICAvKipcbiAgICog5LuO5pyN5Yqh5Zmo6I635Y+W5pyq57uT5p2f55qE6YCa6K+d6K6w5b2VXG4gICAqIEByZXR1cm5zIHJlY29yZHMg5LiA57uE5pyq57uT5p2f55qE6YCa6K+d6K6w5b2VXG4gICAqL1xuICBhc3luYyBnZXRBdmFpbGFibGVDYWxsUmVjb3Jkc0Zyb21TZXJ2ZXIoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgcmVjb3Jkcz86IElSQ0NhbGxQbHVzQ2FsbFJlY29yZFtdIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9BVkFJTEFCTEVfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRPcGVuQ2FsbExpc3QodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9BVkFJTEFCTEVfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiwgYHN1Y2Nlc3MsIGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICByZWNvcmRzOiBkYXRhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5YiG6aG15p+l5om+5b2T5YmN55So5oi355qE5YWo6YOo6YCa6K+d6K6w5b2VXG4gICAqIEBwYXJhbSBzdGFydFRpbWVzdGFtcCDotbflp4vml7bpl7TmiLPvvIxcbiAgICog6aaW5qyh6I635Y+W5Y+v5LygIC0x77yM5YCS5bqP5pe277yM6L+U5Zue5pyA5paw55qE6YCa6K+d6K6w5b2V77yM5q2j5bqP5pe277yM6L+U5Zue5pyA5pep55qE6YCa6K+d6K6w5b2VXG4gICAqIG9yZGVyIOS4uuato+W6j+aXtu+8jOi/lOWbnuWkp+S6juatpOaXtumXtOaIs+eahOmAmuivneiusOW9lVxuICAgKiBvcmRlciDkuLrlgJLluo/ml7bvvIzov5Tlm57lsI/kuo7mraTml7bpl7TmiLPnmoTpgJror53orrDlvZVcbiAgICogQHBhcmFtIGNvdW50IOavj+asoeiOt+WPlueahOaVsOmHj1xuICAgKiBAcGFyYW0gb3JkZXIg5q2j5bqP5oiW5YCS5bqP6I635Y+W77yM6buY6K6k5Li65q2j5bqPXG4gICAqIDAg5Li65q2j5bqP77yM5ZCR5byA5aeL5pe26Ze05oiz5LmL5ZCO5p+l6K+iXG4gICAqIDEg5Li65YCS5bqP77yM5ZCR5byA5aeL5pe26Ze05oiz5LmL5YmN5p+l6K+iXG4gICAqIEByZXR1cm5zIHJlc3VsdC5oYXNNb3JlIOaYr+WQpuacieabtOWkmumAmuivneiusOW9lVxuICAgKiBAcmV0dXJucyByZXN1bHQubGlzdCDpgJror53orrDlvZXliJfooajvvIznsbvlnovkuLogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkW13vvIzlj6/pgJrov4cgYXBpRG9jIOafpeeci+WFt+S9k+WMheWQq+Wtl+autVxuICAgKiBAcmV0dXJucyByZXN1bHQuc3luY1RpbWUgaGFzTW9yZSDkuLogdHJ1ZSDml7bvvIznu6fnu63ojrflj5bpgJror53orrDlvZXpnIDkvKDlhaXnmoTml7bpl7TmiLNcbiAgICovXG4gIGFzeW5jIGdldENhbGxSZWNvcmRzKHN0YXJ0VGltZXN0YW1wOiBudW1iZXIsIGNvdW50OiBudW1iZXIsIG9yZGVyOiAwfDEgPSAwKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgcmVzdWx0PzogSVJDQ2FsbFBsdXNHZXRDYWxsUmVjb3JkUmVzIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfVCwgYHN0YXJ0VGltZXN0YW1wOiAke3N0YXJ0VGltZXN0YW1wfSwgY291bnQ6ICR7Y291bnR9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIShpc051bWJlcihzdGFydFRpbWVzdGFtcCkgJiYgc3RhcnRUaW1lc3RhbXAgPj0gMCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfUiwgYHBhcmFtcyBlcnJvciwgc3RhcnRUaW1lc3RhbXA6IGlzIGEgbnVtYmVyID49IDAsIHZhbHVlOiAke3N0YXJ0VGltZXN0YW1wfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoIShpc051bWJlcihjb3VudCkgJiYgY291bnQgPiAwKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19SLCBgcGFyYW1zIGVycm9yLCBjb3VudDogaXMgYSBudW1iZXIgPj0gMCwgdmFsdWU6ICR7Y291bnR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRDYWxsTG9nTGlzdCh7XG4gICAgICB0aW1lc3RhbXA6IHN0YXJ0VGltZXN0YW1wLFxuICAgICAgY291bnQsXG4gICAgICBvcmRlcixcbiAgICB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIHJlc3VsdDogZGF0YSEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOmbhuWQiOaJuemHj+WIoOmZpOmAmuivneiusOW9lVxuICAgKiBAcGFyYW0gY2FsbElkcyBjYWxsSWQg5YiX6KGoXG4gICAqL1xuICBhc3luYyBkZWxldGVDYWxsUmVjb3Jkc0Zyb21TZXJ2ZXIoY2FsbElkczogc3RyaW5nW10pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9DQUxMX1JFQ09SRFNfQllfQ0FMTElEX1QsIGBjYWxsSWRzOiAke2NhbGxJZHMuam9pbignLCcpfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCEoXG4gICAgICBub3RFbXB0eUFycmF5KGNhbGxJZHMpXG4gICAgICAmJiBjYWxsSWRzLmV2ZXJ5KChjYWxsSWQpID0+IG5vdEVtcHR5U3RyaW5nKGNhbGxJZCkpXG4gICAgKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0NBTExfUkVDT1JEU19CWV9DQUxMSURfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZHM6IG5vdCBlbXB0eSBhcnJheSwgY2FsbElkOiBub3QgZW1wdHkgc3RyaW5nLCBjYWxsSWRzOiAke0pTT04uc3RyaW5naWZ5KGNhbGxJZHMpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZGVsZXRlQ2FsbExvZyhjYWxsSWRzLCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0NBTExfUkVDT1JEU19CWV9DQUxMSURfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5riF56m65omA5pyJ6YCa6K+d6K6w5b2VXG4gICAqL1xuICBhc3luYyBkZWxldGVBbGxDYWxsUmVjb3Jkc0Zyb21TZXJ2ZXIoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUucmVtb3ZlQWxsQ2FsbExvZyh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0FMTF9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvIDlkK/mkYTlg4/lpLRcbiAgICogQGRlc2NyaXB0aW9uIOmAmuivnei/h+eoi+S4reaJk+W8gOaRhOWDj+WktO+8jOWmguaenOaJqeaVo+i1hOa6kOWksei0pe+8jOWNs+WvueaWueayoeaUtuWIsOacrOerr+aJk+W8gOaRhOWDj+WktOeahOmAmuefpeaXtu+8jOatpOasoeihjOS4uuWksei0pVxuICAgKiBAcmV0dXJucyB0cmFjayDmkYTlg4/lpLTop4bpopHotYTmupBcbiAgICovXG4gIGFzeW5jIHN0YXJ0Q2FtZXJhKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOiOt+WPluaRhOWDj+WktOi1hOa6kFxuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5nZXRDYW1lcmFWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgYGNyZWF0ZSB2aWRlbyB0cmFjayBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU8sIHRydWUsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCF0cmFjaz8uaXNQdWJsaXNoZWQoKSAmJiB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0U3RhdGUoKSA9PT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLnB1Ymxpc2hWaWRlb1RyYWNrKCk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsIGBwdWJsaXNoIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlkK/nlKjotYTmupBcbiAgICAgKiDmianmlaPlkK/nlKjotYTmupDmtojmga/vvIzlpoLmnpzlpLHotKXvvIzliJkgc3RhcnRDYW1lcmEg6KGM5Li65aSx6LSlXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlOiB1bm11dGVDb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuZW5hYmxlVmlkZW9UcmFjayh0cmFjZUlkKTtcbiAgICBpZiAodW5tdXRlQ29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MgJiYgdW5tdXRlQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHt1bm11dGVDb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogdW5tdXRlQ29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWFs+mXreaRhOWDj+WktFxuICAgKi9cbiAgYXN5bmMgc3RvcENhbWVyYSgpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfQ0FNRVJBX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5kaXNhYmxlVmlkZW9UcmFjaygpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgJiYgY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfQ0FNRVJBX1IsIGBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fcnRjTW9kdWxlLmRlc3Ryb3lUcmFjayh0cmFjayEpO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLlZJREVPLCBmYWxzZSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX0NBTUVSQV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliIfmjaLmkYTlg4/lpLRcbiAgICog5YiH5o2i5oiQ5Yqf5ZCOIGBJQ2FsbFBsdXNFdmVudExpc3RlbmVyYCDnm5HlkKzlmajnmoQgYG9uVXNlck1lZGlhQXZhaWxhYmxlYCDkuK3kvJrmlLbliLDmlrDliIfmjaLnmoTmkYTlg4/lpLTotYTmupDlj6/mkq3mlL7vvIzmraTml7bosIPnlKggYGNhbGxQbHVzQ2xpZW50LnBsYXlNZWRpYSgpYCDlj6/mmL7npLrmlrDmkYTlg4/lpLTnmoTnlLvpnaJcbiAgICogQHBhcmFtIGNhbWVyYUlkIOa1j+iniOWZqOS4reWPluW+l+eahOaRhOWDj+WktOiuvuWkhyBpZO+8jOWPr+iwgyBwbHVnaW4tcnRjIOeahCBnZXRDYW1lcmFzIOaWueazleWPluW+l1xuICAgKiBAZGVzY3JpcHRpb24g6YCa6K+d5YmN5ZKM6YCa6K+d5Lit6YO95Y+v6LCD55SoXG4gICAqL1xuICBhc3luYyBzd2l0Y2hDYW1lcmEoY2FtZXJhSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1QsIGBjYW1lcmFJZDogJHtjYW1lcmFJZH1gLCB0cmFjZUlkKTtcblxuICAgIGlmICghbm90RW1wdHlTdHJpbmcoY2FtZXJhSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsIGBwYXJhbSBlcnJvciwgY2FtZXJhSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke2NhbWVyYUlkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBpZiAoc2Vzc2lvbi5nZXRNZWRpYVR5cGUoKSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfVklERU9fQ0FMTH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9WSURFT19DQUxMIH07XG4gICAgfVxuXG4gICAgdGhpcy5fdmlkZW9Db25maWcuY2FtZXJhSWQgPSBjYW1lcmFJZDtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0VmlkZW9Db25maWcodGhpcy5fdmlkZW9Db25maWcpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuY2hhbmdlVmlkZW9EZXZpY2UodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiwgYGNhbGwgY2xpZW50IGNoYW5nZVZpZGVvRGV2aWNlIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOW8gOWQr+m6puWFi+mjjlxuICAgKiBAZGVzY3JpcHRpb24g6YCa6K+d6L+H56iL5Lit5omT5byA6bqm5YWL6aOO77yM5aaC5p6c5omp5pWj6LWE5rqQ5aSx6LSl77yM5Y2z5a+55pa55rKh5pS25Yiw5pys56uv5omT5byA6bqm5YWL6aOO55qE6YCa55+l5pe277yM5q2k5qyh6KGM5Li65aSx6LSlXG4gICAqL1xuICBhc3luYyBzdGFydE1pY3JvcGhvbmUoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5nZXRNaWNyb3Bob25lQXVkaW9UcmFjayh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCBgY3JlYXRlIG1pY3JvcGhvbmUgYXVkaW8gdHJhY2sgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPLCB0cnVlLCB0cmFjZUlkKTtcblxuICAgIGlmICghdHJhY2shLmlzT3duZXJNdXRlZCgpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX01JQ1JPUEhPTkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB1bm11dGVDb2RlID0gYXdhaXQgdHJhY2shLnVubXV0ZSgpO1xuICAgIGlmICh1bm11dGVDb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IHVubXV0ZUNvZGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5YWz6Zet6bqm5YWL6aOOXG4gICAqIEBkZXNjcmlwdGlvbiDpgJror53ov4fnqIvkuK3lhbPpl63puqblhYvpo47vvIzlpoLmnpzmianmlaPotYTmupDlpLHotKXvvIzljbPlr7nmlrnmsqHmlLbliLDmnKznq6/lhbPpl63puqblhYvpo47nmoTpgJrnn6Xml7bvvIzmraTmrKHooYzkuLrlpLHotKVcbiAgICovXG4gIGFzeW5jIHN0b3BNaWNyb3Bob25lKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RPUF9NSUNST1BIT05FX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmRpc2FibGVBdWRpb1RyYWNrKCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgJiYgY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfTUlDUk9QSE9ORV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTywgZmFsc2UsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX01JQ1JPUEhPTkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog6bqm5YWL6aOO5piv5ZCm5byA5ZCvXG4gICAqL1xuICBpc01pY3JvcGhvbmVFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5fcnRjTW9kdWxlLmdldExvY2FsQXVkaW9UcmFjaygpO1xuICAgIHJldHVybiAhIXRyYWNrICYmICF0cmFjay5pc093bmVyTXV0ZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7miYDmnInov5znq6/pn7PpopHmtYHmmK/lkKblj6/nlKhcbiAgICogQHBhcmFtIGVuYWJsZSDkuLogdHJ1ZSDml7bvvIzlkK/nlKjmiYDmnInov5znq6/pn7PpopHmtYHvvJvkuLogZmFsc2Ug5pe277yM6Z2Z6Z+z5omA5pyJ6L+c56uv6Z+z6aKR5rWBXG4gICAqL1xuICBhc3luYyBzZXRBbGxSZW1vdGVBdWRpb0VuYWJsZShlbmFibGU6IGJvb2xlYW4pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICByZXR1cm4gdGhpcy5fcnRjTW9kdWxlLnNldEFsbFJlbW90ZUF1ZGlvRW5hYmxlKGVuYWJsZSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIFNESyDniYjmnKzkv6Hmga9cbiAgICogQHJldHVybnMgU0RLIOeJiOacrOWPt1xuICAgKi9cbiAgZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBfX1ZFUlNJT05fXztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bmkYTlg4/lpLTliJfooahcbiAgICovXG4gIGFzeW5jIGdldENhbWVyYXMoKSB7XG4gICAgY29uc3QgY2FtZXJhcyA9IGF3YWl0IGRldmljZS5nZXRDYW1lcmFzKCk7XG4gICAgcmV0dXJuIGNhbWVyYXM7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6bqm5YWL6aOO5YiX6KGoXG4gICAqL1xuICBhc3luYyBnZXRNaWNyb3Bob25lcygpIHtcbiAgICBjb25zdCBtaWNyb3Bob25lcyA9IGF3YWl0IGRldmljZS5nZXRNaWNyb3Bob25lcygpO1xuICAgIHJldHVybiBtaWNyb3Bob25lcztcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgaXNGdW5jdGlvbiwgaXNPYmplY3QsIGlzVW5kZWZpbmVkLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBJUkNDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lJbmRleCc7XG5pbXBvcnQgeyBJVmFsaWRhdGVSZXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lWYWxpZGF0aW9uJztcbmltcG9ydCB7IElDYWxsUGx1c0V2ZW50TGlzdGVuZXIsIFJDQ2FsbFBsdXNDb2RlIH0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5cbi8qKlxuICog5Yid5aeL5YyW5Y+C5pWw5qCh6aqMXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUluaXRPcHRzID0gKG9wdHM6IElSQ0NhbGxJbml0T3B0aW9ucyk6IElWYWxpZGF0ZVJlcyA9PiB7XG4gIGlmICghb3B0cykge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBtaXNzaW5nIHBhcmFtZXRlciAtPiBvcHRpb25zJyB9O1xuICB9XG4gIGlmICghaXNPYmplY3Qob3B0cykpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcgfTtcbiAgfVxuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvcHRzKTtcbiAgLy8g5b+F5Lyg5Y+C5pWw6aqM6K+BXG4gIGlmICgha2V5cy5pbmNsdWRlcygncnRjQ2xpZW50JykpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOU1RBTExfUlRDX1BMVUdJTiB9O1xuICB9XG4gIGlmICghaXNPYmplY3Qob3B0cy5ydGNDbGllbnQpKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ3J0Y0NsaWVudFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ29iamVjdFxcJycgfTtcbiAgfVxuXG4gIHJldHVybiB7IGlzTGVnYWw6IHRydWUgfTtcbn07XG5cbi8qKlxuICogcmVnaXN0ZXJDYWxsRXZlbnRMaXN0ZW5lciDlj4LmlbDmoKHpqoxcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTGlzdGVuZXIgPSAobGlzdGVuZXI6IElDYWxsUGx1c0V2ZW50TGlzdGVuZXIpOiBJVmFsaWRhdGVSZXMgPT4ge1xuICBpZiAoIWxpc3RlbmVyKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogJ21pc3NpbmcgcGFyYW1ldGVyIC0+IGxpc3RlbmVyJyB9O1xuICB9XG5cbiAgLy8g5qCh6aqM5piv5ZCm57y65bCR5b+F6KaB55uR5ZCs5Zue6LCD5rOo5YaMXG4gIGNvbnN0IHJlcXVpcmVkS2V5cyA9IFsnb25JbnZpdGUnLCAnb25TZXNzaW9uQ2xvc2UnLCAnb25SZW1vdGVUcmFja1JlYWR5J107XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMobGlzdGVuZXIpO1xuICBjb25zdCBtaXNzaW5nS2V5czogc3RyaW5nW10gPSBbXTtcbiAgcmVxdWlyZWRLZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGlmICgha2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBtaXNzaW5nS2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICB9KTtcbiAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCkge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6IGBtaXNzaW5nIHBhcmFtZXRlciAtPiBcIiR7bWlzc2luZ0tleXMuam9pbignLCcpfVwiYCB9O1xuICB9XG5cbiAgbGV0IHJlczogSVZhbGlkYXRlUmVzID0geyBpc0xlZ2FsOiB0cnVlIH07XG5cbiAgLy8g5qCh6aqM5b+F6KaB55uR5ZCs5piv5ZCm5pivIGZ1bmN0aW9uIOexu+Wei1xuICBmb3IgKGNvbnN0IGtleSBvZiByZXF1aXJlZEtleXMpIHtcbiAgICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXJbPGtleW9mIElDYWxsUGx1c0V2ZW50TGlzdGVuZXI+a2V5XSkpIHtcbiAgICAgIHJlcyA9IHsgaXNMZWdhbDogZmFsc2UsIG1zZzogYCcke2tleX0nIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgJ2Z1bmN0aW9uJ2AgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuIiwiaW1wb3J0IHtcbiAgSVBsdWdpbkdlbmVyYXRvciwgSVJ1bnRpbWUsIGlzVW5kZWZpbmVkLCBMb2dMLCBQbHVnaW5Db250ZXh0LCBWZXJzaW9uTWFuYWdlLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ2xpZW50IH0gZnJvbSAnLi9jb3JlL2FwaS9SQ0NhbGxQbHVzQ2xpZW50JztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uIH0gZnJvbSAnLi9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24nO1xuaW1wb3J0IHsgdmFsaWRhdGVJbml0T3B0cyB9IGZyb20gJy4vY29yZS91dGlscy92YWxpZGF0aW9uJztcbmltcG9ydCB7IElDYWxsUGx1c0luaXRPcHRzIH0gZnJvbSAnLi9jb3JlL2FwaS9pbnRlcmZhY2UnO1xuaW1wb3J0IFJDQXVkaW9Db25maWdCdWlsZGVyIGZyb20gJy4vY29yZS9hcGkvUkNBdWRpb0NvbmZpZ0J1aWxkZXInO1xuaW1wb3J0IFJDVmlkZW9Db25maWdCdWlsZGVyIGZyb20gJy4vY29yZS9hcGkvUkNWaWRlb0NvbmZpZ0J1aWxkZXInO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4vY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZyc7XG5pbXBvcnQgUkNDYWxsUGx1c0FuZHJvaWRQdXNoQ29uZmlnQnVpbGRlciBmcm9tICcuL2NvcmUvYXBpL1JDQ2FsbFBsdXNBbmRyb2lkUHVzaENvbmZpZ0J1aWxkZXInO1xuXG5jb25zdCBpbnN0YWxsZXI6IElQbHVnaW5HZW5lcmF0b3I8UkNDYWxsUGx1c0NsaWVudCwgSUNhbGxQbHVzSW5pdE9wdHM+ID0ge1xuICB0YWc6ICdSQ0NhbGxQbHVzJyxcbiAgdmVyaWZ5KHJ1bnRpbWU6IElSdW50aW1lKSB7XG4gICAgVmVyc2lvbk1hbmFnZS5hZGQoJ3BsdWdpbi1jYWxsLXBsdXMnLCBfX1ZFUlNJT05fXyk7XG4gICAgaWYgKCFWZXJzaW9uTWFuYWdlLnZhbGlkRW5naW5lKF9fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fXykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFRoZSBjdXJyZW50IGVuZ2luZSB2ZXJzaW9uICcke1ZlcnNpb25NYW5hZ2UuZ2V0SW5mbygpLmVuZ2luZX0nIGVycm9yLCBwbHVnaW4tY2FsbC1wbHVzIHJlcXVpcmVkIGVuZ2luZSB2ZXJzaW9uIGF0IGxlYXN0ICcke19fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fX30nLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBzZXR1cChjb250ZXh0OiBQbHVnaW5Db250ZXh0LCBydW50aW1lOiBJUnVudGltZSwgb3B0aW9uczogSUNhbGxQbHVzSW5pdE9wdHMpOiBSQ0NhbGxQbHVzQ2xpZW50IHtcbiAgICAvLyDliJ3lp4vljJblj4LmlbDmoKHpqoxcbiAgICBjb25zdCB2YWxpZGF0ZVJlcyA9IHZhbGlkYXRlSW5pdE9wdHMob3B0aW9ucyk7XG4gICAgaWYgKCF2YWxpZGF0ZVJlcy5pc0xlZ2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtDYWxsUGx1c0xpYiBpbnN0YWxsZXIgc3RldXBdJHt2YWxpZGF0ZVJlcy5tc2d9YCk7XG4gICAgfVxuXG4gICAgLy8g5Yib5bu6IGVuZ2luZSBsb2dnZXJcbiAgICBjb25zdCBlbmdpbmVMb2dnZXIgPSBjb250ZXh0LmNyZWF0ZUxvZ2dlcignQ2FsbFBsdXNMaWInLCAnUlRDJyk7XG4gICAgLy8g6K6+572uIOi+k+WHuue6p+WIq1xuICAgIGNvbnN0IG91dHB1dExldmVsID0gaXNVbmRlZmluZWQob3B0aW9ucy5sb2dPdXRwdXRMZXZlbCkgPyBMb2dMLldBUk4gOiBvcHRpb25zLmxvZ091dHB1dExldmVsO1xuICAgIGVuZ2luZUxvZ2dlci5zZXRPdXRwdXRMZXZlbChvdXRwdXRMZXZlbCk7XG4gICAgZW5naW5lTG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOREVYX0lOU1RBTExfQ0FMTF9QTFVTX1BMVUdJTl9PLCBgQ2FsbFBsdXMgVmVyc2lvbjogJHtfX1ZFUlNJT05fX30sIENvbW1pdDogJHtfX0NPTU1JVF9JRF9ffWApO1xuXG4gICAgcmV0dXJuIG5ldyBSQ0NhbGxQbHVzQ2xpZW50KGNvbnRleHQsIGVuZ2luZUxvZ2dlciwgcnVudGltZSwgb3B0aW9ucyk7XG4gIH0sXG59O1xuXG5leHBvcnQge1xuICBpbnN0YWxsZXIsXG4gIC8qIGNsYXNzICovXG4gIFJDQ2FsbFBsdXNDbGllbnQsXG4gIFJDQ2FsbFBsdXNTZXNzaW9uLFxuICBSQ0F1ZGlvQ29uZmlnQnVpbGRlcixcbiAgUkNWaWRlb0NvbmZpZ0J1aWxkZXIsXG4gIFJDQ2FsbFBsdXNBbmRyb2lkUHVzaENvbmZpZ0J1aWxkZXIsXG59O1xuLyoqXG4gKiDlr7zlh7rmnprkuL7lkozmjqXlj6PlrprkuYlcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL2FwaS9pbnRlcmZhY2UnO1xuIl0sIm5hbWVzIjpbIlJDQ2FsbFBsdXNDb2RlIiwiUkNDYWxsUGx1c0xvZ2dlclRhZyIsIlJDQ2FsbFBsdXNTZXNzaW9uIiwiX3Nlc3Npb24iLCJfY2FsbEVuZ2luZSIsIl9sb2dnZXIiLCJfX3B1YmxpY0ZpZWxkIiwidXNlciIsInVzZXJJZCIsInVzZXJTdGF0ZSIsImNhbWVyYUVuYWJsZSIsIm1pY3JvcGhvbmVFbmFibGUiLCJ0cmFjZUlkIiwiY29kZSIsImNsaWVudFN0YXJ0VGltZSIsImRhdGEiLCJSQ0NhbGxQbHVzVHlwZSIsIlJDQ2FsbFBsdXNUeXBlMiIsIlJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIiwiUkNDYWxsUGx1c01lZGlhVHlwZSIsIlJDQ2FsbFBsdXNNZWRpYVR5cGUyIiwiUkNDYWxsUGx1c0NhbGxTdGF0ZSIsIlJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQiLCJSQ0NhbGxQbHVzUmVhc29uIiwiUkNBdWRpb0NvbmZpZ0J1aWxkZXIiLCJtaWNyb3Bob25lSWQiLCJtaW4iLCJtYXgiLCJpc051bWJlciIsInNhbXBsZVJhdGUiLCJSQ1ZpZGVvQ29uZmlnQnVpbGRlciIsIlJDQ2FsbFBsdXNSZXNvbHV0aW9uIiwiUkNDYWxsUGx1c0ZyYW1lUmF0ZSIsImZwcyIsInJlc29sdXRpb24iLCJjYW1lcmFJZCIsInRyYW4yQ2FsbExvZyIsImNhbGxMb2dMaXN0IiwiY2FsbElkIiwiY2FsbFR5cGUiLCJjYWxsRGlyIiwibWVkaWFUeXBlIiwiY2FsbGluZ1VzZXJJZCIsImNhbGxVc2VySWRzIiwiY2FsbFN0YXR1cyIsInNlc3Npb25TdGF0dXMiLCJzdGFydFRpbWUiLCJlbmRUaW1lIiwiZHVyYXRpb24iLCJzeW5jVGltZSIsInN5c1N0YXR1cyIsImNydFRpbWUiLCJwYXJzZVN0YXR1c0RhdGEiLCJyaW5naW5nRGF0YSIsImhhbmd1cERhdGEiLCJhY2NlcHREYXRhIiwib3RoZXJJbnZpdGVkRGF0YSIsIml0ZW0iLCJ2YWxpZGF0ZVZpZGVvTm9kZU5hbWUiLCJlbGVtZW50IiwidmFsaWRhdGVTeXNTdGF0ZSIsImNydFN0YXRlIiwibmV3U3RhdGUiLCJpc0luVmFsaWQiLCJpbnZhbGlkU3RhdGVzIiwidmFsaWRhdGVVc2VyU3RhdGUiLCJnZXRIYW5ndXBTeXN0ZW1TdGF0ZSIsImlzQ2FsbGVlIiwic3lzdGVtU3RhdGUiLCJpc1N1cHBvcnRNZWRpYVNlcnZlciIsIm5hdmlJbmZvIiwidm9pcENhbGxJbmZvIiwic3RyYXRlZ3kiLCJ2YWxpZGF0ZUJpdHJhdGUiLCJtaW5CaXRyYXRlIiwibWF4Qml0cmF0ZSIsImdldFVzZXJWaWRlb1ZpZXdJbmZvIiwidXNlclZpZXdNYXAiLCJ1c2VyVmlld01hcEluZm8iLCJ2aWRlb1ZpZXciLCJpc1RpbnkiLCJwdXNoQ29uZmlnc1RvSlNPTiIsImlPU0NvbmZpZyIsImFuZHJvaWRDb25maWciLCJjbGllbnRDYWxsSWQiLCJ0aHJlYWRJZCIsImFwbnNDb2xsYXBzZUlkIiwicmljaE1lZGlhVXJpIiwiY2hhbm5lbElkTWkiLCJjaGFubmVsSWRIVyIsImNoYW5uZWxJZE9QUE8iLCJ0eXBlVml2byIsImZjbUNoYW5uZWxJZCIsImZjbUNvbGxhcHNlS2V5IiwiZmNtSW1hZ2VVcmwiLCJtaUxhcmdlSWNvblVybCIsImltcG9ydGFuY2VIVyIsImNhdGVnb3J5SFciLCJpbWFnZVVybEhXIiwiY2F0ZWdvcnlWaXZvIiwiaW1wb3J0YW5jZUhvbm9yIiwiaW1hZ2VVcmxIb25vciIsIkFQTlMiLCJIVyIsInB1c2hDb25nZmlncyIsIkZDTSIsIk1JIiwiT1BQTyIsIlZJVk8iLCJIT05PUiIsInRyYW5zU2VydmVyUHVzaEV4dCIsInB1c2hDb25maWciLCJwdXNoVGl0bGUiLCJkaXNhYmxlUHVzaFRpdGxlIiwidGVtcGxhdGVJZCIsInB1c2hFeHQiLCJpc0Jvb2xlYW4iLCJ2YWxpZGF0ZVB1c2hDb25maWciLCJwdXNoQ29uZmlnS2V5cyIsImtleSIsImluZGV4IiwiaXNVbmRlZmluZWQiLCJpc1N0cmluZyIsInZhbGlkYXRlSU9TQ29uZmlnUmVzIiwidmFsaWRhdGVJT1NDb25maWciLCJ2YWxpZGF0ZUFuZHJvaWRDb25maWdSZXMiLCJ2YWxpZGF0ZUFuZHJvaWRDb25maWciLCJhbmRyb2lkQ29uZmlnS2V5cyIsImdldEJ5dGVMZW5ndGgiLCJzdHIiLCJjaGFyc2V0IiwidG90YWwiLCJjYWxjdWxhdGVVVEYxNkJ5dGVMZW5ndGgiLCJjYWxjdWxhdGVVVEY4Qnl0ZUxlbmd0aCIsImNoYXRDb2RlIiwiaSIsIlJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnIiwiUkNDYWxsUEx1c1N0YXRpc3RpY3MiLCJfY29udGV4dCIsInRhZyIsInNlc3Npb24iLCJpbnZpdGVTb3VyY2UiLCJleHRyYSIsIm5vd1RpbWUiLCJjb21tb25EYXRhIiwiRGlhbG9nQWN0aW9uIiwiRGlhbG9nVHlwZSIsIlNlY3JldENhbGxUeXBlIiwiU2VjcmV0Q2FsbFR5cGUyIiwiQ2FsbFRpbWVyRXZlbnRUeXBlIiwiUkNDYWxsSW5uZXJTZXNzaW9uIiwiRXZlbnRFbWl0dGVyIiwiX2NhbGxJZCIsIl9zdGF0ZSIsIl9jYWxsVHlwZSIsIl9tZWRpYVR5cGUiLCJfc3RhcnRDYWxsZXJJZCIsIl9jYWxsZXJJZCIsIl9jYWxsVXNlcnMiLCJlbmFibGUiLCJ1c2VycyIsImNoYW5nZWRVc2VycyIsIm5ld1VzZXJTdGF0ZSIsIm5ld1N0YXRlVGltZSIsIm5ld1N5c1N0YXRlIiwiaGFzVXNlciIsIm9sZFN0YXRlVGltZSIsIm9sZFN5c3RlbVN0YXRlIiwib2xkVXNlclN0YXRlIiwiaXNJbnZhbGlkU3lzU3RhdGUiLCJpc0ludmFsaWRVc2VyU3RhdGUiLCJpc0ludmFsaWRPbnBob25lRW5kIiwiZXJyIiwic3RhdGUiLCJ0eXBlIiwidGltZXJJZCIsImlzTG9jYWxDbGllbnRIYW5ndXAiLCJDYWxsU2VydmVyQWN0aW9uIiwidGltZXJTZXRUaW1lb3V0IiwiZnVuYyIsInRpbWVvdXQiLCJzbGVlcCIsIm1pbGxpc2Vjb25kIiwicmVzb2x2ZSIsIm5lZWRSZXRyeUNvZGUiLCJFcnJvckNvZGUiLCJSQ1JUQ0NvZGUiLCJyZXRyeUFzeW5jRm4iLCJhc3luY0ZuIiwiZm5BcmdzIiwiY3VycmVudFJldHJ5VGltZSIsIm1heER1cmF0aW9uIiwiaW50ZXJ2YWxzIiwib25FcnJvciIsInJlcyIsIml0diIsIkNhbGxIb29rc1R5cGUiLCJQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbiIsIlB1Ykludml0ZUNhbGxNaXNzUmVmZXIiLCJTaWduYWxUcmFuc3BvcnRlciIsIl9ydW50aW1lIiwiX2luaXRPcHRzIiwiX3RpbWVDb3JyZWN0aW9uZXIiLCJnZXRVVUlEMjIiLCJsaXN0ZW5lciIsIm1zZyIsInRvVXNlcnMiLCJzZWNyZXRDaGF0IiwidGFyZ2V0VHlwZSIsInRhcmdldElkIiwibmlja05hbWUiLCJvbGRSb29tSWQiLCJjYWxsSWRzIiwib3B0cyIsIlJDQ29ubmVjdGlvblN0YXR1cyIsIm9wdGlvbnMiLCJ2YWx1ZSIsInJlc3VsdCIsInNlcnZlclZhbCIsInBhcnNlZERhdGEiLCJpbmZvIiwiZGV2aWNlSWQiLCJpc051bGwiLCJpc0RpcmVjdGx5IiwiY3VycmVudFVJZCIsImN1cnJlbnRVc2VyIiwiZGlhbG9nVHlwZSIsImNhbGxTZXNzaW9uVXNlcnMiLCJ0b0RldmljZUlkIiwiY2FsbERpYWxvZ0VudGl0eXMiLCJzdHJpbmcxMHRvNjQiLCJudW1iZXIiLCJjaGFycyIsInJhZGl4IiwicXV0aWVudCIsImFyciIsIm1vZCIsImdldFVVSUQiLCJjIiwiciIsInV1aWQiLCJDQUxMX0RCX05BTUUiLCJEQl9WRVJTSU9OIiwibG9nZ2VyIiwiX1JDQ2FsbEluZGV4REIiLCJyZXEiLCJldiIsIm9iak5hbWUiLCJfYSIsInZhbCIsInJlamVjdCIsIlJDQ2FsbEluZGV4REIiLCJBYm5vcm1hbENhbGwiLCJvYmpTdG9yZSIsInVzZXJBYm5vcm1hbENhbGxJZHMiLCJpZCIsIkNhbGxTZXJ2ZXJFdmVudFR5cGUiLCJSQ0NhbGxQbHVzSW5uZXJDb2RlIiwiVGltZUNvcnJlY3Rpb25lciIsIl9zaW5nbGVDYWxsRHVyYXRpb25FdiIsInNlcnZlclN0YXJ0VGltZSIsImN1cnJlbnRSVFQiLCJjbGllbnRGaXJzdEZyYW1lVGltZSIsIkZvcndhcmRUeXBlIiwiUkNDYWxsUGx1c0ludml0ZVNvdXJjZSIsIlJDQ2FsbERpcmVjdGlvbiIsIkNBTExfVElNRV9PVVQiLCJfUkNDYWxsRW5naW5lIiwiX3JlcG9ydEFwcEV2ZW50TW9kdWxlIiwiY3VycmVudFVzZXJJZCIsImJ1c3lsaW5lVXNlcnMiLCJpbnZpdGVyVGltZXJJZCIsInNlbGZTdGF0ZSIsImludml0ZWVzU3RhdGUiLCJidXN5VXNlcnNTdGF0ZSIsImJ1c3lVc2VySWQiLCJpbnZpdGVkVXNlcnNTdGF0ZSIsImJ1c3lsaW5lVXNlcnNTdGF0ZSIsImV4dHJhS2V5VmFsIiwidHJhbnNhY3Rpb25JZCIsInJlcU1lZGlhVHlwZSIsInRpbWVzdGFtcCIsImNvdW50Iiwib3JkZXIiLCJjYWxsTG9nIiwicmVzRGF0YSIsImxpc3QiLCJ1c2VyU2Vzc2lvblN0YXR1cyIsImNhbGxEaXJlY3Rpb24iLCJzZXNzaW9uVXNlcnMiLCJpbm5lclNlc3Npb24iLCJuZXdVc2VycyIsImlzSWRsZSIsIm5vdyIsImRlbGF5VGltZSIsInN0cmVhbVJlYWR5VGltZSIsImN1cnJlbnRVc2VyU3lzdGVtU3RhdGUiLCJob2xkQ2FsbElkIiwic3RhdGVUaW1lIiwiaW52aXRlVXNlcklkIiwiaW52aXRlZVRpbWVySWQiLCJjYWxsUGx1c1Nlc3Npb24iLCJvdGhlcnNTdGF0ZSIsInN0YXR1c1RpbWUiLCJvdGhlckludml0ZWRNZW1iZXIiLCJfYiIsIl9jIiwiaW52aXRlZE1lbWJlciIsInVzZXJzU3RhdGUiLCJjYWxsU2Vzc2lvbmFTdGF0dXMiLCJzZXNzaW9uU3RhdGUiLCJ1bk5lZWRVcFN0YXRlIiwic3RhcnRDYWxsZXJJZCIsIl9kIiwic2VsZkVuZCIsInN0YXRlcyIsImlzTWFpblNlc3Npb24iLCJjdXJyZW50VXNlclNhdGUiLCJldmVudEFyZ3MiLCJldmVudFR5cGUiLCJmaXJzdEZyYW1lVGltZSIsImFjdGlvbiIsInByb21vdGVySWQiLCJyZWFzb24iLCJjdXJyZW50Q2FsbElkIiwib2xkVHJhbnNJZCIsIm9sZEFjdGlvbiIsIk9sZE1lZGlhVHlwZSIsImNoYW5nZU1lZGlhVHlwZVJlc3VsdCIsIl9lIiwiaXNTZWxmSGFuZ3VwIiwiY2xvc2VkU2Vzc2lvbiIsImNydFVzZXJEYXRhIiwiaGFuZ3VwUmVhc29uIiwiaXNOZWVkVXAiLCJpbnZpdGVyVXNlcklkIiwiUkNDYWxsRW5naW5lIiwiUlRDUmVzb3VyY2VUYWciLCJfUlRDTW9kdWxlIiwiZGVmYXVsdFZpZGVvVHJhY2siLCJ0cmFjayIsImRlZmF1bHRBdWRpb1RyYWNrIiwidmlkZW9Db25maWciLCJhdWRpb0NvbmZpZyIsImxvY2FsVHJhY2siLCJyb29tIiwicm9vbVVzZXJzSWQiLCJwdWJQYXJhbXMiLCJjdXJyZW50Um9vbUlkIiwicmVjZW50VHJhY2tzIiwibG9jYWxUcmFja3MiLCJuZWVkRGVzdHJveVRyYWNrIiwibmV3VHJhY2siLCJ0cmFja3MiLCJSVENNb2RlIiwic3ViVGlueSIsImJ5U2VydmVyIiwidXNlcklkcyIsInZpZGVvVHJhY2siLCJhdWRpb1RyYWNrIiwiYXVkaW9MZXZlbFJlcG9ydExpc3QiLCJyb29tSWQiLCJraWNrRXh0cmEiLCJSQ0tpY2tSZWFzb24iLCJuZWVkU3ViVHJhY2tzIiwicmVwb3J0Iiwic2VuZGVycyIsInJlY2VpdmVycyIsImtpbmQiLCJwYWNrZXRzTG9zdFJhdGUiLCJydHQiLCJ0cmFja0lkIiwiYml0cmF0ZSIsImhlbHBlciIsImxvY2FsVmlkZW9UcmFjayIsImxvY2FsQXVkaW9UcmFjayIsIlJDTG9jYWxUcmFjayIsInZpZGVvRWxlbWVudCIsInN1YlBhcmFtcyIsInVuc3ViVHJhY2tzIiwiZXJyb3IiLCJSVENNb2R1bGUiLCJSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIiwiZXZlbnROYW1lIiwiYXR0cnMiLCJoYW5kbGUiLCJpbnZpdGVlVXNlckxpc3QiLCJyZWNvcmQiLCJjYWxsRmlyc3RGcmFtZVRpbWUiLCJhdWRpb0xldmVsIiwiQ2FsbFNlcnZlckVycm9yQ29kZSIsIlJDQ2FsbFBsdXNBbmRyb2lkUHVzaENvbmZpZ0J1aWxkZXIiLCJNQVhfRVhUUkFfQllURVMiLCJSQ0NhbGxQbHVzQ2xpZW50IiwibmV3U2Vzc2lvbiIsIm1haW5TZXNzaW9uIiwibm90RW1wdHlBcnJheSIsIm5vdEVtcHR5U3RyaW5nIiwiY2ZnIiwiZnJhbWVSYXRlIiwiZXJyb3JNc2ciLCJnZXRNZWRpYVRyYWNrc0NvZGUiLCJnZXRTZXNzaW9uQ29kZSIsImJ1c3lVc2VycyIsImhvbGRTZXNzaW9uIiwiaGFuZ3VwTWFpblNlc3Npb25Db2RlIiwibWFpblNlc3Npb25DYWxsSWQiLCJoYW5ndXBTZXNzaW9uIiwidXNlckluZm8iLCJvbGRNZWRpYVR5cGUiLCJ0b1VzZXJJZHMiLCJpc0FncmVlIiwic3RhcnRUaW1lc3RhbXAiLCJ1bm11dGVDb2RlIiwiZGV2aWNlIiwidmFsaWRhdGVJbml0T3B0cyIsImlzT2JqZWN0IiwiaW5zdGFsbGVyIiwicnVudGltZSIsIlZlcnNpb25NYW5hZ2UiLCJjb250ZXh0IiwidmFsaWRhdGVSZXMiLCJlbmdpbmVMb2dnZXIiLCJvdXRwdXRMZXZlbCIsIkxvZ0wiXSwibWFwcGluZ3MiOiI2Z0JBR08sTUFBTUEsRUFBaUIsQ0FJNUIsUUFBUyxFQUlULFlBQWEsTUFJYixjQUFlLE1BSWYsWUFBYSxNQUliLGtCQUFtQixNQUluQixlQUFnQixNQUloQix3QkFBeUIsTUFJekIsa0JBQW1CLE1BSW5CLGdCQUFpQixNQUlqQix1QkFBd0IsTUFJeEIsZ0JBQWlCLE1BSWpCLHFDQUFzQyxNQUl0QyxvQkFBcUIsTUFJckIsY0FBZSxNQUlmLGtCQUFtQixNQUluQix3QkFBeUIsTUFJekIsdUJBQXdCLE1BSXhCLGtCQUFtQixNQUluQixtQkFBb0IsS0FDdEIsRUNoRlksSUFBQUMsR0FBQUEsSUFDVkEsRUFBQSxtQ0FBcUMscUNBSXJDQSxFQUFBLHVDQUF5Qyx5Q0FJekNBLEVBQUEsd0NBQTBDLDBDQUkxQ0EsRUFBQSwrQ0FBaUQsaURBQ2pEQSxFQUFBLGdEQUFrRCxrREFJbERBLEVBQUEscUNBQXVDLHVD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
|
|
1
|
+
(function(m,S){typeof exports=="object"&&typeof module<"u"?S(exports,require("@rongcloud/engine"),require("@rongcloud/plugin-rtc")):typeof define=="function"&&define.amd?define(["exports","@rongcloud/engine","@rongcloud/plugin-rtc"],S):(m=typeof globalThis<"u"?globalThis:m||self,S(m.CallPlus={},m.RCEngine,m.RCRTC))})(this,function(m,S,N){"use strict";var Qe=Object.defineProperty;var Xe=(m,S,N)=>S in m?Qe(m,S,{enumerable:!0,configurable:!0,writable:!0,value:N}):m[S]=N;var C=(m,S,N)=>(Xe(m,typeof S!="symbol"?S+"":S,N),N);const E={SUCCESS:0,PARAM_ERROR:80001,SESSION_EXIST:80002,NOT_IN_CALL:80003,MEDIATYPE_INVALID:80004,NOT_VIDEO_CALL:80005,RTC_SERVICE_UNAVAILABLE:80006,USER_LIST_INVAILD:80007,CALL_ID_INVALID:80008,TRANSACTION_ID_INVALID:80009,USER_ID_INVALID:80010,SINGLE_CALL_NOT_SUPPORT_MULTI_PERSON:80011,SIGNAL_DISCONNECTED:80012,CAMERA_CLOSED:80100,MICROPHONE_CLOSED:80101,MEDIA_RESOURCE_INVALIED:80102,NOT_INSTALL_RTC_PLUGIN:80103,PLAY_MEDIA_FAILED:80104,VIDEO_VIEW_NOT_SET:80105};var n=(_=>(_.L_INDEX_INSTALL_CALL_PLUS_PLUGIN_O="L-index_install_call_plus_plugin-O",_.L_CALLPLUS_CLIENT_SET_EVENT_LISTENER_O="L-callplus_client_set_event_listener-O",_.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O="L-callplus_client_call_event_listener-O",_.L_CALLPLUS_CLIENT_SET_STATUS_REPORT_LISTENER_O="L-callplus_client_set_status_report_listener-O",_.L_CALLPLUS_CLIENT_CALL_STATUS_REPORT_LISTENER_O="L-callplus_client_call_status_report_listener-O",_.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_T="L-callplus_client_set_video_config-T",_.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R="L-callplus_client_set_video_config-R",_.L_CALLPLUS_VIDEO_CONFIG_SET_FRAME_RATE_O="L-callplus_video_config_set_frame_rate-O",_.L_CALLPLUS_VIDEO_CONFIG_SET_RESOLUTION_O="L-callplus_video_config_set_resolution-O",_.L_CALLPLUS_VIDEO_CONFIG_SET_BITRATE_O="L-callplus_video_config_set_bitrate-O",_.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_T="L-callplus_client_set_audio_config-T",_.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R="L-callplus_client_set_audio_config-R",_.L_CALLPLUS_AUDIO_CONFIG_SET_BITRATE_O="L-callplus_audio_config_set_bitrate-O",_.L_CALLPLUS_AUDIO_CONFIG_SET_SAMPLE_RATE_O="L-callplus_audio_config_set_sample_rate-O",_.L_CALLPLUS_CLIENT_PREVIEW_T="L-callplus_client_preview-T",_.L_CALLPLUS_CLIENT_PREVIEW_R="L-callplus_client_preview-R",_.L_CALLPLUS_CLIENT_START_CALL_T="L-callplus_client_start_call-T",_.L_CALLPLUS_CLIENT_START_CALL_R="L-callplus_client_start_call-R",_.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_T="L-callplus_client_join_multi_call-T",_.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R="L-callplus_client_join_multi_call-R",_.L_CALLPLUS_CLIENT_ACCEPT_T="L-callplus_client_accept-T",_.L_CALLPLUS_CLIENT_ACCEPT_R="L-callplus_client_accept-R",_.L_CALLPLUS_CLIENT_HANGUP_T="L-callplus_client_hangup-T",_.L_CALLPLUS_CLIENT_HANGUP_R="L-callplus_client_hangup-R",_.L_CALLPLUS_CLIENT_INVITE_T="L-callplus_client_invite-T",_.L_CALLPLUS_CLIENT_INVITE_R="L-callplus_client_invite-R",_.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_T="L-callplus_client_request_change_media_type-T",_.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R="L-callplus_client_request_change_media_type-R",_.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_T="L-callplus_client_cancel_change_media_type-T",_.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R="L-callplus_client_cancel_change_media_type-R",_.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_T="L-callplus_client_reply_change_media_type-T",_.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R="L-callplus_client_reply_change_media_type-R",_.L_CALLPLUS_CLIENT_GET_CURRENT_CALL_SESSION_T="L-callplus_client_get_current_call_session-T",_.L_CALLPLUS_CLIENT_GET_CURRENT_CALL_SESSION_R="L-callplus_client_get_current_call_session-R",_.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_T="L-callplus_client_get_available_call_sessions_from_server-T",_.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R="L-callplus_client_get_available_call_sessions_from_server-R",_.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_T="L-callplus_client_get_call_records-T",_.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R="L-callplus_client_get_call_records-R",_.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_T="L-callplus_client_delete_call_records_by_callId-T",_.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R="L-callplus_client_delete_call_records_by_callId-R",_.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_T="L-callplus_client_delete_all_call_records_from_server-T",_.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R="L-callplus_client_delete_all_call_records_from_server-R",_.L_CALLPLUS_CLIENT_START_CAMERA_T="L-callplus_client_start_camera-T",_.L_CALLPLUS_CLIENT_START_CAMERA_R="L-callplus_client_start_camera-R",_.L_CALLPLUS_CLIENT_STOP_CAMERA_T="L-callplus_client_stop_camera-T",_.L_CALLPLUS_CLIENT_STOP_CAMERA_R="L-callplus_client_stop_camera-R",_.L_CALLPLUS_CLIENT_SWITCH_CAMERA_T="L-callplus_client_switch_camera-T",_.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R="L-callplus_client_switch_camera-R",_.L_CALLPLUS_CLIENT_START_MICROPHONE_T="L-callplus_client_start_microphone-T",_.L_CALLPLUS_CLIENT_START_MICROPHONE_R="L-callplus_client_start_microphone-R",_.L_CALLPLUS_CLIENT_STOP_MICROPHONE_T="L-callplus_client_stop_microphone-T",_.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R="L-callplus_client_stop_microphone-R",_.L_CALLPLUS_CLIENT_SWITCH_MICROPHONE_T="L-callplus_client_switch_microphone-T",_.L_CALLPLUS_CLIENT_SWITCH_MICROPHONE_R="L-callplus_client_switch_microphone-R",_.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_T="L-callplus_client_set_video_view-T",_.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R="L-callplus_client_set_video_view-R",_.L_RTC_MODULE_SET_VIDEO_VIEW_O="L-rtc_module_set_video_view-O",_.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_T="L-callplus_client_remove_video_view-T",_.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R="L-callplus_client_remove_video_view-R",_.L_RTC_MODULE_REMOVE_VIDEO_VIEW_O="L-rtc_module_remove_video_view-O",_.L_CALLPLUS_CLIENT_PLAY_MEDIA_T="L-callplus_client_play_media-T",_.L_CALLPLUS_CLIENT_PLAY_MEDIA_R="L-callplus_client_play_media-R",_.L_RTC_MODULE_PLAY_MEDIA_T="L-rtc_module_play_media-T",_.L_RTC_MODULE_PLAY_MEDIA_R="L-rtc_module_play_media-R",_.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_T="L-rtc_module_set_all_remote_audio_enbale-T",_.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R="L-rtc_module_set_all_remote_audio_enable-R",_.L_RTC_MODULE_SUBSCRIBE_T="L-rtc_module_subscribe-T",_.L_RTC_MODULE_SUBSCRIBE_R="L-rtc_module_subscribe-R",_.L_RTC_MODULE_UNSUBSCRIBE_T="L-rtc_module_unsubscribe-T",_.L_RTC_MODULE_UNSUBSCRIBE_R="L-rtc_module_unsubscribe-R",_.L_RTC_MODULE_PUBLISH_T="L-rtc_module_publish-T",_.L_RTC_MODULE_PUBLISH_R="L-rtc_module_publish-R",_.L_RTC_MODULE_UNPUBLISH_T="L-rtc_module_unpublish-T",_.L_RTC_MODULE_UNPUBLISH_R="L-rtc_module_unpublish-R",_.L_RTC_MODULE_DESTROY_ALL_TRACKS_O="L-rtc_module_destroy_all_tracks-O",_.L_RTC_MODULE_SESSION_CONNECT_T="L-rtc_module_session_connect-T",_.L_RTC_MODULE_SESSION_CONNECT_P="L-rtc_module_session_connect-P",_.L_RTC_MODULE_SESSION_CONNECT_R="L-rtc_module_session_connect-R",_.L_RTC_MODULE_SESSION_CLOSE_T="L-rtc_module_session_close-T",_.L_RTC_MODULE_SESSION_CLOSE_P="L-rtc_module_session_close-P",_.L_RTC_MODULE_SESSION_CLOSE_R="L-rtc_module_session_close-R",_.L_RTC_MODULE_CREATE_VIDEO_TRACK_T="L-rtc_module_create_video_track-T",_.L_RTC_MODULE_CREATE_VIDEO_TRACK_R="L-rtc_module_create_video_track-R",_.L_RTC_MODULE_CREATE_AUDIO_TRACK_T="L-rtc_module_create_audio_track-T",_.L_RTC_MODULE_CREATE_AUDIO_TRACK_R="L-rtc_module_create_audio_track-R",_.L_RTC_MODULE_RECEIVE_TRACK_PUBLISH_O="L-rtc_module_receive_track_publish-O",_.L_RTC_MODULE_RECEIVE_TRACK_UNPUBLISH_O="L-rtc_module_receive_track_unpublish-O",_.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O="L-rtc_module_receive_track_enable_change-O",_.L_RTC_MODULE_RECEIVE_KICK_OFF_O="L-rtc_module_receive_kick_off-O",_.L_RTC_MODULE_RECEIVE_PEERCONNECTION_EXCEPT_CLOSE_O="L-rtc_module_receive_peerconnection_except_close-O",_.L_RTC_MODULE_CHANGE_MEDIA_TYPE_T="L-rtc_module_change_media_type-T",_.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R="L-rtc_module_change_media_type-R",_.L_RTC_MODULE_JOIN_RTC_ROOM_T="L-rtc_module_join_rtc_room-T",_.L_RTC_MODULE_JOIN_RTC_ROOM_R="L-rtc_module_join_rtc_room-R",_.L_RTC_MODULE_QUIT_RTC_ROOM_T="L-rtc_module_quit_rtc_room-T",_.L_RTC_MODULE_QUIT_RTC_ROOM_R="L-rtc_module_quit_rtc_room-R",_.L_RTC_MODULE_CREATE_CALL_MEDIA_TRACKS_P="L-rtc_module_create_call_media_tracks-P",_.L_SIGNAL_TRANSPORTER_SINGLE_CALL_T="L-signal_transporter_single_call-T",_.L_SIGNAL_TRANSPORTER_GROUP_CALL_T="L-signal_transporter_group_call-T",_.L_SIGNAL_TRANSPORTER_INVITE_T="L-signal_transporter_invite-T",_.L_SIGNAL_TRANSPORTER_RING_T="L-signal_transporter_ring-T",_.L_SIGNAL_TRANSPORTER_ACCEPT_T="L-signal_transporter_accept-T",_.L_SIGNAL_TRANSPORTER_ACCEPT_R="L-signal_transporter_accept-R",_.L_SIGNAL_TRANSPORTER_JOIN_CALL_T="L-signal_transporter_join_call-T",_.L_SIGNAL_TRANSPORTER_HANGUP_T="L-signal_transporter_hangup-T",_.L_SIGNAL_TRANSPORTER_CALL_STATUS_UP_T="L-signal_transporter_call_status_up-T",_.L_SIGNAL_TRANSPORTER_CALL_EVENT_UP_T="L-signal_transporter_call_event_up-T",_.L_SIGNAL_TRANSPORTER_CALL_DIALOG_UP_T="L-signal_transporter_call_dialog_up-T",_.L_SIGNAL_TRANSPORTER_DELETE_CALL_RECORD_T="L-signal_transporter_delete_call_record-T",_.L_SIGNAL_TRANSPORTER_GET_CALL_RECORD_T="L-signal_transporter_get_call_record-T",_.L_SIGNAL_TRANSPORTER_GET_CALL_SERVER_TIME_T="L-signal_transporter_get_call_server_time-T",_.L_SIGNAL_TRANSPORTER_GET_CALL_TIME_INFO_T="L-signal_transporter_get_call_time_info-T",_.L_SIGNAL_TRANSPORTER_GET_AVAILABLE_CALL_LIST_T="L-signal_transporter_get_available_call_list-T",_.L_SIGNAL_TRANSPORTER_CLEAR_CALL_RECORD_T="L-signal_transporter_clear_call_record-T",_.L_SIGNAL_TRANSPORTER_GET_CALL_INFO_BY_CALLID_T="L-signal_transporter_get_call_info_by_callId-T",_.L_SIGNAL_TRANSPORTER_USER_SYSTEM_STATE_UP_T="L-signal_transporter_user_system_state_up-T",_.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_SIGNAL_DATA_O="L-signal_transporter_receive_call_signal_data-O",_.L_SIGNAL_TRANSPORTER_IM_STATE_CHANGE_O="L-signal_transporter_im_state_change-O",_.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O="L-signal_transporter_receive_invite-O",_.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O="L-signal_transporter_receive_call_status-O",_.L_SIGNAL_TRANSPORTER_RECEIVE_MISS_MESSAGE_O="L-signal_transporter_receive_miss_message-O",_.L_CALL_ENGINE_UPDATE_USERS_STATE_O="L-call_engine_update_users_state-O",_.L_CALL_ENGINE_IM_STATE_CHANGE_O="L-call_engine_im_state_change-O",_.L_CALL_ENGINE_CALL_TIMEOUT_O="L-call_engine_call_timeout-O",_.L_CALL_ENGINE_START_CALL_TIMER_O="L-call_engine_start_call_timer-O",_.L_CALL_ENGINE_STOP_CALL_TIMER_O="L-call_engine_stop_call_timer-O",_.L_CALL_ENGINE_UP_ON_PHONE_END_T="L-call_engine_up_on_phone_end-T",_.L_CALL_ENGINE_UP_ON_PHONE_END_R="L-call_engine_up_on_phone_end-R",_.L_CALL_ENGINE_RECEIVE_FIRST_FRAME_TIME_O="L-call_engine_receive_first_frame_time-O",_.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O="L-call_engine_receive_mediatype_change-O",_.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O="L-call_engine_receive_close_session-O",_.L_CALL_ENGINE_RECEIVE_CALL_RECORD_O="L-call_engine_receive_call_record-O",_.L_CALL_ENGINE_RECEIVE_COMPLEMENTARY_DATA_O="L-call_engine_receive_complementary_data-O",_.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_T="L-call_engine_create_session_by_server-T",_.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R="L-call_engine_create_session_by_server-R",_.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_T="L-call_engine_up_first_frame_time-T",_.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_R="L-call_engine_up_first_frame_time-R",_.L_TIME_CORRECT_START_O="L-time_correct_start-O",_.L_TIME_CORRECT_STOP_O="L-time_correct_stop-O",_.L_TIME_CORRECT_RESTART_O="L-time_correct_restart-O",_.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_T="L-time_correct_get_call_client_time_by_server-T",_.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_P="L-time_correct_get_call_client_time_by_server-P",_.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R="L-time_correct_get_call_client_time_by_server-R",_.L_TIME_CORRECT_CALC_CLIENT_START_TIME_T="L-time_correct_calc_client_start_time-T",_.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R="L-time_correct_calc_client_start_time-R",_.L_TIME_CORRECT_SET_DELTA_TIME_O="L-time_correct_set_delta_time-O",_.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_T="L-time_correct_loop_correct_client_time-T",_.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R="L-time_correct_loop_correct_client_time-R",_.L_INNER_SESSION_UPDATE_USER_STATE_O="L-inner_session_update_user_state-O",_.L_INNER_SESSION_SET_USER_DEVICE_ENABLE_O="L-inner_session_set_user_device_enable-O",_.L_CALLPLUS_SESSION_GET_CREATE_TIME_T="L-callplus_session_get_create_time-T",_.L_CALLPLUS_SESSION_GET_CREATE_TIME_R="L-callplus_session_get_create_time-R",_.L_CALLPLUS_SESSION_GET_DURATION_T="L-callplus_session_get_duration-T",_.L_CALLPLUS_SESSION_GET_DURATION_R="L-callplus_session_get_duration-R",_.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O="L-callplus_set_android_push_config-O",_))(n||{});class K{constructor(i,e,t){C(this,"_startTime",0);C(this,"_duration",0);C(this,"_callId","");this._session=i,this._callEngine=e,this._logger=t,this._callId=this._session.getCallId()}getCallId(){return this._callId}getState(){return this._session.getSessionState()}getCallType(){return this._session.getCallType()}getMediaType(){return this._session.getMediaType()}getUserList(){return this._session.getUserList().map(i=>{const{userId:e,userState:t,cameraEnable:s,microphoneEnable:r}=i;return{userId:e,state:t,cameraEnable:s,microphoneEnable:r}})}getCreatorUserId(){return this._session.getStartCallerId()}getInviterUserId(){return this._session.getCallerId()}async getCreateTimestamp(){const i=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_SESSION_GET_CREATE_TIME_T,"",i),this._startTime)return{code:E.SUCCESS,startTime:this._startTime};const{code:e,clientStartTime:t}=await this._callEngine.getCallStaringTime({callId:this._callId},i);return e!==E.SUCCESS?(this._logger.error(n.L_CALLPLUS_SESSION_GET_CREATE_TIME_R,`errCode: ${e}`,i),{code:e}):(this._logger.info(n.L_CALLPLUS_SESSION_GET_CREATE_TIME_R,"success",i),this._startTime=t,{code:E.SUCCESS,startTime:this._startTime})}async getDuration(){const i=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_SESSION_GET_DURATION_T,"",i),this._duration)return this._logger.info(n.L_CALLPLUS_SESSION_GET_DURATION_R,`code: ${E.SUCCESS}, duration: ${this._duration}`,i),{code:E.SUCCESS,duration:this._duration};const{code:e,data:t}=await this._callEngine.getCallTimeInfo(this._callId,i);return e!==E.SUCCESS?(this._logger.error(n.L_CALLPLUS_SESSION_GET_DURATION_R,`code: ${e}`,i),{code:e}):(this._logger.info(n.L_CALLPLUS_SESSION_GET_DURATION_R,`code: ${E.SUCCESS}, duration: ${t.duration}`,i),this._duration=t.duration,{code:E.SUCCESS,duration:this._duration})}}var M=(_=>(_[_.SINGLE=0]="SINGLE",_[_.MULTI=1]="MULTI",_))(M||{}),A=(_=>(_[_.IDLE=0]="IDLE",_[_.CALLING=100]="CALLING",_[_.INVITED=101]="INVITED",_[_.RINGING=102]="RINGING",_[_.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",_[_.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",_[_.CONNECTING=200]="CONNECTING",_[_.ONCALL=300]="ONCALL",_[_.ONPHONE=301]="ONPHONE",_[_.ENDED=1e3]="ENDED",_[_.NO_ANSWER=1001]="NO_ANSWER",_[_.MISSED=1002]="MISSED",_[_.CANCELLED=1003]="CANCELLED",_[_.DECLINED=1004]="DECLINED",_[_.ERROR=2e3]="ERROR",_))(A||{}),U=(_=>(_[_.AUDIO=0]="AUDIO",_[_.AUDIO_VIDEO=1]="AUDIO_VIDEO",_[_.VIDEO=2]="VIDEO",_))(U||{}),p=(_=>(_[_.IDLE=0]="IDLE",_[_.CALLING=100]="CALLING",_[_.INVITED=101]="INVITED",_[_.RINGING=102]="RINGING",_[_.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",_[_.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",_[_.CONNECTING=200]="CONNECTING",_[_.ONCALL=300]="ONCALL",_[_.ENDED=1e3]="ENDED",_[_.NOANSWER=1001]="NOANSWER",_[_.MISSED=1002]="MISSED",_[_.CANCELED=1003]="CANCELED",_[_.DECLINED=1004]="DECLINED",_[_.ERROR=2e3]="ERROR",_))(p||{}),F=(_=>(_[_.CANCEL_CHANGE_MEDIA_TYPE=0]="CANCEL_CHANGE_MEDIA_TYPE",_[_.REFUSE_CHANGE_MEDIA_TYPE=1]="REFUSE_CHANGE_MEDIA_TYPE",_[_.SERVER_ALLOW_MEDIA_TYPE=2]="SERVER_ALLOW_MEDIA_TYPE",_[_.CHANGE_MEDIA_TYPE_TIMEOUT=3]="CHANGE_MEDIA_TYPE_TIMEOUT",_))(F||{}),R=(_=>(_[_.IDLE=0]="IDLE",_[_.CALLING=100]="CALLING",_[_.INVITED=101]="INVITED",_[_.RINGING=102]="RINGING",_[_.BUSYLINE_RINGING=103]="BUSYLINE_RINGING",_[_.BUSYLINE_WAIT=104]="BUSYLINE_WAIT",_[_.CONNECTING=200]="CONNECTING",_[_.ONCALL=300]="ONCALL",_[_.ON_PHONE=301]="ON_PHONE",_[_.ON_PHONE_END=302]="ON_PHONE_END",_[_.ON_DEVICE_DISABLE=303]="ON_DEVICE_DISABLE",_[_.ON_DEVICE_ENABLE=304]="ON_DEVICE_ENABLE",_[_.ABNORMAL_END=999]="ABNORMAL_END",_[_.ENDED=1e3]="ENDED",_[_.NO_ANSWER=1001]="NO_ANSWER",_[_.MISSED=1002]="MISSED",_[_.CANCELLED=1003]="CANCELLED",_[_.DECLINED=1004]="DECLINED",_[_.OTHER_CLIENT_CALLING=1010]="OTHER_CLIENT_CALLING",_[_.OTHER_CLIENT_ACCEPT=1011]="OTHER_CLIENT_ACCEPT",_[_.JOIN_ROOM_ERR=1105]="JOIN_ROOM_ERR",_[_.PUBLISH_ERR=1106]="PUBLISH_ERR",_[_.SUBSCRIBE_ERR=1107]="SUBSCRIBE_ERR",_[_.ACCEPT_CARRIER=1108]="ACCEPT_CARRIER",_[_.KICKED_BY_SERVER=1109]="KICKED_BY_SERVER",_[_.CONNECTION_ERR=1110]="CONNECTION_ERR",_[_.LOGOUT=1111]="LOGOUT",_[_.OTHER_CLIENT_LOGIN=1112]="OTHER_CLIENT_LOGIN",_[_.OTHER_CLIENT_JOINED=1113]="OTHER_CLIENT_JOINED",_[_.OTHER_CLIENT_IN_ROOM=1114]="OTHER_CLIENT_IN_ROOM",_[_.OTHER_CLIENT_HANGUP=1151]="OTHER_CLIENT_HANGUP",_[_.REMOTE_JOIN_RTC_ERROR=1205]="REMOTE_JOIN_RTC_ERROR",_[_.REMOTE_PUBLISH_ERROR=1206]="REMOTE_PUBLISH_ERROR",_[_.REMOTE_SUBSCRIBE_ERROR=1207]="REMOTE_SUBSCRIBE_ERROR",_[_.REMOTE_KICKED_BY_SERVER=1209]="REMOTE_KICKED_BY_SERVER",_[_.REMOTE_CONNECTION_ERROR=1210]="REMOTE_CONNECTION_ERROR",_[_.REMOTE_LOGOUT=1211]="REMOTE_LOGOUT",_[_.REMOTE_OTHER_CLIENT_LOGIN=1212]="REMOTE_OTHER_CLIENT_LOGIN",_[_.REMOTE_OTHER_JOINED_RTC=1213]="REMOTE_OTHER_JOINED_RTC",_[_.REMOTE_OTHER_CLIENT_IN_RTC=1214]="REMOTE_OTHER_CLIENT_IN_RTC",_))(R||{});class Te{constructor(i){C(this,"_audioConfig",{});this._logger=i}setDefaultMicrophoneId(i){return this._audioConfig.microphoneId=i,this}setBitrate(i,e){return!S.isNumber(i)||!S.isNumber(e)||e<=0||i<=0||e<i?(this._logger.error(n.L_CALLPLUS_AUDIO_CONFIG_SET_BITRATE_O,`params error -> max: ${e},min: ${i}, max and min is a number > 0, max should > min`),this):(this._audioConfig.minBitrate=i,this._audioConfig.maxBitrate=e,this)}setSampleRate(i){return S.isNumber(i)?(this._audioConfig.sampleRate=i,this):(this._logger.error(n.L_CALLPLUS_AUDIO_CONFIG_SET_SAMPLE_RATE_O,`params error -> sampleRate: ${i}`),this)}build(){return this._audioConfig}}class Ie{constructor(i){C(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});this._logger=i}setFrameRate(i){return N.RCFrameRate[i]?(this._videoConfig.frameRate=i,this):(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_FRAME_RATE_O,`params error -> fps: ${i}`),this)}setVideoResolution(i){return N.RCResolution[i]?(this._videoConfig.resolution=i,this):(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_RESOLUTION_O,`params error -> resolution: ${i}`),this)}setDefaultCameraId(i){return this._videoConfig.cameraId=i,this}setBitrate(i,e){return!S.isNumber(i)||!S.isNumber(e)||e<=0||i<=0||e<i?(this._logger.error(n.L_CALLPLUS_VIDEO_CONFIG_SET_BITRATE_O,`params error -> max: ${e},min: ${i}, max and min is a number > 0, max should > min`),this):(this._videoConfig.minBitrate=i,this._videoConfig.maxBitrate=e,this)}build(){return this._videoConfig}}const Ce=_=>{const{callId:i,callType:e,callDir:t,mediaType:s,callingUserId:r,callUserIds:o,callStatus:a,sessionStatus:L,startTime:c,endTime:l,duration:T,syncTime:I,sysStatus:h,crtTime:d}=_;return{callId:i,callType:e,callDirection:t,mediaType:s,callerUserId:r,callUserIds:o,sessionState:a,userState:L,startTimestamp:c,endTimestamp:l,duration:T,syncTimestamp:I,systemState:h,createTimestamp:d}},Ue=_=>{const{callId:i}=_,e=[],t=[],s=[],r=[];return _.callSessionUsers.forEach(o=>{const{userId:a,sessionStatus:L,sysStatus:c}=o;switch(L){case A.INVITED:r.push({callId:i,userId:a,userState:L});break;case A.RINGING:e.push({callId:i,fromUserId:a});break;case A.CONNECTING:s.push({fromUserId:a});break;case A.CANCELLED:case A.DECLINED:case A.ENDED:case A.IDLE:t.push({callId:i,fromUserId:a,userState:L,systemState:c});break}}),{ringingData:e,hangupData:t,acceptData:s,otherInvitedData:r}},fe=_=>_&&_.nodeName&&_.nodeName.toUpperCase()==="VIDEO",pe=(_,i)=>{let e=!1;const t=[R.INVITED,R.RINGING,R.BUSYLINE_RINGING,R.BUSYLINE_WAIT,R.CONNECTING,R.ONCALL];return _===R.ONCALL&&t.includes(i)&&(e=!0),e},Me=(_,i)=>{let e=!1;const t=[A.INVITED,A.RINGING,A.BUSYLINE_RINGING,A.BUSYLINE_WAIT,A.CONNECTING,A.ONCALL];return _===A.ONCALL&&t.includes(i)&&(e=!0),e},De=(_,i)=>{let e;switch(_){case A.CALLING:e=R.CANCELLED;break;case A.RINGING:case A.INVITED:e=R.DECLINED;break;case A.CONNECTING:e=i?R.DECLINED:R.CANCELLED;break;case A.ONCALL:e=R.ENDED;break}return e},se=_=>{const{voipCallInfo:i}=_;if(!i)return!1;const{strategy:e}=JSON.parse(i);return e===1},de=(_,i)=>(_||_===0)&&(!S.isNumber(_)||_<=0)?{code:E.PARAM_ERROR,errorMsg:`params error -> minBitrate: a number of > 0, value: ${_}`}:(i||i===0)&&(!S.isNumber(i)||i<=0)?{code:E.PARAM_ERROR,errorMsg:`params error -> maxBitrate: a number of > 0, value: ${i}`}:_&&i&&i<_?{code:E.PARAM_ERROR,errorMsg:`params error -> maxBitrate: ${i}, minBitrate: ${_}, maxBitrate should > minBitrate`}:{code:E.SUCCESS},he=_=>{const i=[];for(const e in _){const{videoView:t,isTiny:s}=_[e];i.push({userId:e,videoView:t.nodeName,isTiny:s})}return i},ye=(_={},i={},e)=>{const{threadId:t,apnsCollapseId:s,richMediaUri:r}=_,{channelIdMi:o,channelIdHW:a,channelIdOPPO:L,typeVivo:c,fcmChannelId:l,fcmCollapseKey:T,fcmImageUrl:I,importanceHW:h,categoryHW:d,imageUrlHW:u,categoryVivo:O,importanceHonor:f,imageUrlHonor:v}=i,D={};t&&(D["thread-id"]=t),D["apns-collapse-id"]=s||e,r&&(D.richMediaUri=r);const y={};a&&(y.channelId=a),u&&(y.image=u),d&&(y.category=d),y.importance=h||"NORMAL";const P=[{HW:y},{APNS:D}];let w;(T||I||l)&&(w={},T&&(w.collapse_key=T),I&&(w.imageUrl=I),l&&(w.channelId=l),P[0].FCM=w);let W;o&&(W={},o&&(W.channelId=o),P[0].MI=W);let ee;L&&(ee={},ee.channelId=L,P[0].OPPO=ee);let _e;(c||O)&&(_e={},c&&(_e.classification=c),O&&(_e.category=O),P[0].VIVO=_e);let ie;return(f||v)&&(ie={},f&&(ie.importance=f),v&&(ie.image=v),P[0].HONOR=ie),JSON.stringify(P)},re=(_,i)=>{const{pushTitle:e="",iOSConfig:t,androidConfig:s,disablePushTitle:r,templateId:o}=_,a={pushConfigs:ye(t,s,i)};return S.isBoolean(r)&&(a.disableTitle=r),e&&(a.title=e),o&&(a.templateId=o),JSON.stringify(a)},te=_=>{const i=["pushTitle","iOSConfig","androidConfig","disablePushTitle","templateId"];if(!Object.keys(_).every(a=>i.includes(a)))return{code:E.PARAM_ERROR,errorMsg:`right key: ${i.join(",")}`};for(let a=0;a<i.length;a++){const L=i[a];if(L==="disablePushTitle"){if(!S.isUndefined(_[L])&&!S.isBoolean(_[L]))return{code:E.PARAM_ERROR,errorMsg:`${L} type is boolean`}}else if((L==="pushTitle"||L==="templateId")&&_[L]&&!S.isString(_[L]))return{code:E.PARAM_ERROR,errorMsg:`${L} type is string`}}const{iOSConfig:t,androidConfig:s}=_,r=Pe(t||{});if(r.code!==E.SUCCESS)return r;const o=ve(s||{});return o.code!==E.SUCCESS?o:{code:E.SUCCESS}},Pe=_=>{const{threadId:i,richMediaUri:e}=_||{};return i&&!S.isString(i)?{code:E.PARAM_ERROR,errorMsg:"iOSConfig.threadId type is string"}:e&&!S.isString(e)?{code:E.PARAM_ERROR,errorMsg:"iOSConfig.richMediaUri type is string"}:{code:E.SUCCESS}},ve=_=>{const i=["channelIdMi","channelIdHW","categoryHW","importanceHW","imageUrlHW","channelIdOPPO","typeVivo","categoryVivo","fcmChannelId","fcmCollapseKey","fcmImageUrl","importanceHonor","imageUrlHonor"];if(!Object.keys(_).every(t=>i.includes(t)))return{code:E.PARAM_ERROR,errorMsg:`right key: ${i.join(",")}`};for(let t=0;t<i.length;t++){const s=i[t];if(s==="importanceHW"||s==="importanceHonor"){if(_[s]&&_[s]!=="LOW"&&_[s]!=="NORMAL")return{code:E.PARAM_ERROR,errorMsg:`androidConfig.${s} value is NORMAL|LOW`}}else if(_[s]&&!S.isString(_[s]))return{code:E.PARAM_ERROR,errorMsg:`androidConfig.${s} type is string`}}return{code:E.SUCCESS}},Ae=(_,i="utf-8")=>{let e=0;return i==="utf-16"?e=Ve(_):e=Ge(_),e},Ve=_=>{let i=0,e;for(let t=0,s=_.length;t<s;t++)e=_.charCodeAt(t),e<=65535?i+=2:i+=4;return i},Ge=_=>{let i=0,e;for(let t=0,s=_.length;t<s;t++)e=_.charCodeAt(t),e<127?i+=1:e<=2047?i+=2:e<=65535?i+=3:i+=4;return i};var x=(_=>(_.L_QS_START_CALL_S="Call-start-S",_.L_QS_ACCEPT_CALL_S="Call-accept-S",_.L_QS_HANGUP_CALL_S="Call-hangup-S",_.L_QS_RECEIVE_CALL_S="Call-recv-S",_.L_QS_ABNORMAL_HANGUP_S="Call-interrupt-S",_))(x||{});class be{constructor(i,e){this._logger=i,this._context=e}reportStatisticsData(i,e,t,s,r,o,a){const L=+new Date,{mediaType:c,callType:l,callId:T}=s?{mediaType:s.getMediaType(),callType:s.getCallType(),callId:s.getCallId()}:a,I={cr:"unknown",net:"unknown",cod:e,mtp:c,ctp:l,cid:T,time:L,uid:this._context.getCurrentId()};r&&Object.assign(I,{ccid:r});let h=null;switch(i){case x.L_QS_RECEIVE_CALL_S:h={...I,rf:o};break;case x.L_QS_ABNORMAL_HANGUP_S:h={...I};break;default:h={...I,dur:L-t}}this._logger.info("L-call-plus-statistic",JSON.stringify(h),i),this._logger.__statistics(i,JSON.stringify(h))}}var $=(_=>(_.REQUEST="request",_.ACCEPT="accept",_.REFUSE="refuse",_.CANCEL="cancel",_.NOTICE="notice",_.TIMEOUT="timeout",_))($||{}),j=(_=>(_[_.SWITCH_MEDIA_TYPE=1]="SWITCH_MEDIA_TYPE",_))(j||{}),ne=(_=>(_[_.NORMAL=0]="NORMAL",_[_.SECRET=1]="SECRET",_))(ne||{}),oe=(_=>(_.INVITER="inviter",_.INVITEE="invitee",_))(oe||{});class ae extends S.EventEmitter{constructor(e,t,s,r,o,a,L,c){super();C(this,"_reqMediaType");C(this,"_inviterTimerId");C(this,"_inviteeTimerId");C(this,"_oldDialogData");C(this,"isLocalClientHangup",!1);this._callId=e,this._state=t,this._callType=s,this._mediaType=r,this._startCallerId=o,this._callerId=a,this._callUsers=L,this._logger=c}getCallId(){return this._callId}getSessionState(){return this._state}getCallType(){return this._callType}getMediaType(){return this._mediaType}getStartCallerId(){return this._startCallerId}getCallerId(){return this._callerId}getUserList(){return this._callUsers}getReqMediaType(){return this._reqMediaType}getInviterTimerId(){return this._inviterTimerId}getInviteeTimerId(){return this._inviteeTimerId}getAllTimerIds(){return[this._inviterTimerId,this._inviteeTimerId]}setUserDeviceEnable(e,t,s,r){this._logger.info(n.L_INNER_SESSION_SET_USER_DEVICE_ENABLE_O,`userId: ${e}, mediaType: ${t}, enable: ${s}`,r);const o=this._callUsers.find(a=>e===a.userId);t===U.AUDIO?o.microphoneEnable=s:o.cameraEnable=s}updateUserList(e,t){const s=[];return e.forEach(r=>{const{userState:o,stateTime:a,systemState:L}=r;if([A.CALLING,A.INVITED,A.BUSYLINE_WAIT].includes(o))this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`push user: ${JSON.stringify(r)}`,t),this._callUsers.push(r),s.push(r);else{let l=!1;for(let T=0;T<this._callUsers.length;T++){const{userId:I,stateTime:h,systemState:d,userState:u}=this._callUsers[T];if(I===r.userId){l=!0;const O=pe(d,L),f=Me(u,o),v=L===R.ON_PHONE_END&&d!==R.ON_PHONE&&o!==A.IDLE;if(a&&h&&a<h||O&&f){try{this._logger.warn(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`timeout user state: old:${JSON.stringify({userId:I,oldStateTime:h,oldSystemState:d,oldUserState:u})}; new:${JSON.stringify(r)}`,t)}catch(D){this._logger.error(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList err: ${D.message}`,t)}break}else{this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList -> cover ${JSON.stringify(r)}`,t),this._callUsers[T]=r,!v&&s.push(r);break}}}l||(this._logger.info(n.L_INNER_SESSION_UPDATE_USER_STATE_O,`updateUserList -> no user push ${JSON.stringify(r)}`,t),this._callUsers.push(r),s.push(r))}}),s}setOldDialogData(e){this._oldDialogData=e}updateSessionState(e){this._state=e}updateCallType(e){this._callType=e}updateMediaType(e){this._mediaType=e}updateReqMediaType(e){this._reqMediaType=e}updateTimerId(e,t){e==="inviter"?this._inviterTimerId=t:this._inviteeTimerId=t}getOldDialogData(){return this._oldDialogData}setIsLocalClientHangup(e){this.isLocalClientHangup=e}getIsLocalClientHangup(){return this.isLocalClientHangup}}var g=(_=>(_.START_SINGLE_CALL="startSingleCall",_.START_GROUP_CALL="startGroupCall",_.INVITE_CALL="inviteCall",_.PUB_INVITE_CALL="pubInviteCall",_.RINGING_CALL="ringCall",_.ACCEPT_CALL="acceptCall",_.JOIN_CALL="joinCall",_.HANGUP_CALL="hangupCall",_.STATUS_UP_CALL="statusUpCall",_.STATUS_DOWN_CALL="statusDownCall",_.EVENT_UP_CALL="eventUpCall",_.EVENT_DOWN_CALL="eventDownCall",_.DIALOG_UP_CALL="dialogUpCall",_.DIALOG_DOWN_CALL="dialogDownCall",_.GET_CALL_USER_SESSION_LIST="getCallUSerSessionList",_.SYNC_CALL_LOG="syncCallLog",_.PUB_CALL_LOG="pubCallLog",_.DEL_CALL_LOG="deleteCallLog",_.QRY_CALL_STATE="queryUserHasCall",_.QRY_SRV_TIMESTAMP="getCallSrvTimeStamp",_.GET_CALL_STATE_LIST="getUserCallStateList",_.CLEAR_CALL_LOG="cleanCallLog",_.GET_CALL_SESSION="getCallSession",_.GET_CALL_TIME_INFO="getCallTimeInfo",_.END_ABNORMAL_CALL="endUserAbnormalCalls",_.SYS_STATUS_UP="sysStatusUp",_.UP_CALL_LOG_READED="upCallLogReaded",_.PUB_CALL_LOG_READED="pubCallLogReaded",_.PUB_NACK_SEQ_ID="pubNACKSeqId",_.GET_USER_CALL_SESSION_ID_LIST="getUserCallSessionIdList",_))(g||{});const Ee=(_,i)=>setTimeout(_,i),we=_=>new Promise(i=>{setTimeout(i,_)}),$e=[S.ErrorCode.RC_NET_CHANNEL_INVALID,S.ErrorCode.RC_NET_UNAVAILABLE,S.ErrorCode.RC_MSG_RESP_TIMEOUT,N.RCRTCCode.SIGNAL_DISCONNECTED,N.RCRTCCode.REQUEST_FAILED],q=async({asyncFn:_,fnArgs:i,currentRetryTime:e=Date.now(),maxDuration:t=60*1e3,intervals:s=[2*1e3,4*1e3,8*1e3,16*1e3,32*1e3,64*1e3],index:r=0,onError:o})=>{const a=await _(...i),L=2*1e3;return a.code===E.SUCCESS||!$e.includes(a.code)||Date.now()+L-e>t?a:(o&&o(a.code),await we(L),q({asyncFn:_,fnArgs:i,currentRetryTime:e,maxDuration:t,intervals:s,index:r,onError:o}))};var Y=(_=>(_.onBeforePublish="onBeforePublish",_.onPublishRes="onPublishRes",_.onPubInviteCall="onPubInviteCall",_.onPubInviteCallPullKv="onPubInviteCallPullKv",_.onPubInviteCallMiss="onPubInviteCallMiss",_))(Y||{}),Le=(_=>(_.NOT_CURRENT_DEVICEID="not current device id",_.SECRET_CALL="secret call",_.NOT_INVITEE="not an invitee",_))(Le||{}),Q=(_=>(_.PUB_INVITE="pubinvitecall",_.PULL_KV_INVITE="pullkv_invitecall",_.PUSH="system_pubsh",_))(Q||{});const Ne=128*1024,Re="RC:CallPlusMiss";class Be extends S.EventEmitter{constructor(e,t,s,r,o,a){super();C(this,"_listener");C(this,"_needRetryActions",[g.START_SINGLE_CALL,g.START_GROUP_CALL,g.ACCEPT_CALL,g.JOIN_CALL,g.EVENT_UP_CALL]);C(this,"_sessionId","");this._context=e,this._runtime=t,this._initOpts=s,this._timeCorrectioner=r,this._logger=o,this._reportAppEventModule=a,this._context.onCallInfo=this._onRecvCallSignal.bind(this),this._context.onconnectionstatechange=this._onIMConnectionStateChange.bind(this),this._context.onmessage=this._onMessage.bind(this),this._sessionId=S.getUUID22()}_onMessage(e){if([Re].includes(e.messageType)){const{content:{callId:s,mediaType:r,startTime:o,callSessionUsers:a},targetId:L,senderUserId:c}=e,l=this._context.getCurrentId();if(!localStorage.getItem(`missMessageMap-${l}-${s}`)){const I={callId:s,callerUserId:c,targetId:L,mediaType:r,firstFrameTime:0,callStartTime:o-this._timeCorrectioner.getLocalDelayTime(),callEndTime:0,hangupReason:a.filter(({userId:d})=>d===l)[0].sessionStatus};this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_MISS_MESSAGE_O,`receive miss message: ${JSON.stringify(e)}`);const h=Object.assign(e,{content:JSON.stringify(I)});this._reportAppEventModule.onReceivedCallPlusSummaryMessage(h),localStorage.setItem(`missMessageMap-${l}-${s}`,s)}return!0}return!1}getSessionId(){return this._sessionId}registerListener(e){this._listener=e}async startCall(e,t){const{clientCallId:s,callType:r,toUsers:o,mediaType:a,secretChat:L,targetType:c,targetId:l,nickName:T,oldRoomId:I,pushExt:h,extra:d}=e;return r===M.SINGLE?this.startSingleCall({clientCallId:s,toUserId:o[0].userId,mediaType:a,secretChat:L,targetType:c,targetId:l,oldRoomId:I,toOrgId:o[0].orgId||"",pushExt:h,extra:d},t):this.startGroupCall({clientCallId:s,toUsers:o,mediaType:a,targetType:c,targetId:l,nickName:T,oldRoomId:I,pushExt:h,extra:d},t)}async startSingleCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_SINGLE_CALL_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(this._context.getCurrentId(),g.START_SINGLE_CALL,e)}async startGroupCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GROUP_CALL_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(this._context.getCurrentId(),g.START_GROUP_CALL,e)}async inviteCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_INVITE_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,g.INVITE_CALL,e)}async ringingCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_RING_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,g.RINGING_CALL,e)}async acceptCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_ACCEPT_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,g.ACCEPT_CALL,e)}async joinCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_JOIN_CALL_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,g.JOIN_CALL,e)}async hangupCall(e,t){this._logger.info(n.L_SIGNAL_TRANSPORTER_HANGUP_T,`params: ${JSON.stringify(e)}`,t);const{code:s}=await this._sendCallSignal(e.callId,g.HANGUP_CALL,e);return s===E.NOT_IN_CALL?{code:E.SUCCESS}:{code:s}}async statusUpCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_STATUS_UP_T,`call status up params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,g.STATUS_UP_CALL,e)}async eventUpCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_EVENT_UP_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,g.EVENT_UP_CALL,e)}async dialogUpCall(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_CALL_DIALOG_UP_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,g.DIALOG_UP_CALL,e)}async deleteCallRecord(e,t,s){return this._logger.info(n.L_SIGNAL_TRANSPORTER_DELETE_CALL_RECORD_T,`callIds: ${JSON.stringify(t)}`,s),this._sendCallSignal(e,g.DEL_CALL_LOG,{callIds:t})}async syncCallLog(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_RECORD_T,`params: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.userId,g.SYNC_CALL_LOG,e)}async queryUserHasCall(){const e=this._context.getCurrentId();return this._sendCallSignal(e,g.QRY_CALL_STATE,null)}async getCallServerTimestamp(e){const t=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_SERVER_TIME_T,`userId: ${t}`,e),this._sendCallSignal(t,g.QRY_SRV_TIMESTAMP,null)}async getCallTimeInfo(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_TIME_INFO_T,`callId: ${e}`,t),this._sendCallSignal(e,g.GET_CALL_TIME_INFO,{callId:e})}async getUserCallStateList(e){const t=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_AVAILABLE_CALL_LIST_T,`userId: ${t}`,e),this._sendCallSignal(t,g.GET_CALL_STATE_LIST,null)}async clearCallRecord(e){const t=this._context.getCurrentId();return this._logger.info(n.L_SIGNAL_TRANSPORTER_CLEAR_CALL_RECORD_T,`userId: ${t}`,e),this._sendCallSignal(t,g.CLEAR_CALL_LOG,null)}async getCallSession(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_GET_CALL_INFO_BY_CALLID_T,`callId: ${e.callId}`,t),this._sendCallSignal(e.callId,g.GET_CALL_SESSION,e)}async sysStatusUp(e,t){return this._logger.info(n.L_SIGNAL_TRANSPORTER_USER_SYSTEM_STATE_UP_T,`opts: ${JSON.stringify(e)}`,t),this._sendCallSignal(e.callId,g.SYS_STATUS_UP,e)}async upCallLogReaded(e){const t=this._context.getCurrentId();return this._sendCallSignal(t,g.UP_CALL_LOG_READED,e)}async endUserAbnormalCalls(e){return this._sendCallSignal(this._context.getCurrentId(),g.END_ABNORMAL_CALL,e)}_onIMConnectionStateChange(e){const t=this._logger.createTraceId();this._logger.info(n.L_SIGNAL_TRANSPORTER_IM_STATE_CHANGE_O,`state: ${e}`,t),this._listener.onIMStateChange(e),e===S.RCConnectionStatus.CONNECTED?this._timeCorrectioner.start(t):this._timeCorrectioner.stop(t)}async _sendCallSignal(e,t,s){const r=s?JSON.stringify({...s,sessionId:this._sessionId}):"";let o;this._needRetryActions.includes(t)?o=await q({asyncFn:this._context.setCallInfo.bind(this._context),fnArgs:[e,t,r]}):o=await this._context.setCallInfo(e,t,r);const{code:a,data:L}=o;if(a!==S.ErrorCode.SUCCESS)return{code:a};const{value:c}=L,l=JSON.parse(c).data;return{code:E.SUCCESS,data:l}}_onRecvCallSignal(e){const t=this._logger.createTraceId();this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_SIGNAL_DATA_O,`data: ${e}`,t),JSON.parse(e).list.forEach(r=>{const{key:o}=r,a=JSON.parse(r.value);switch(o){case g.PUB_INVITE_CALL:this._onPubInviteCall(a,t,!0);break;case g.STATUS_DOWN_CALL:this._onStatusDownCall(a,t);break;case g.EVENT_DOWN_CALL:this._onEventDownCall(a,t);break;case g.DIALOG_DOWN_CALL:this._onDialogDownCall(a,t);break;case g.PUB_CALL_LOG:this._onPubCallLog(a,t);break;case g.PUB_CALL_LOG_READED:break;case g.PUB_NACK_SEQ_ID:break;default:this._onConpensationData(a,t);break}})}_isValidData(e){return!!(S.isNull(e)||S.isString(e)&&((e==null?void 0:e.length)===0||e===this._sessionId))}_onPubInviteCall(e,t,s=!0){try{const r=this._context.getCurrentId(),o=e.callSessionUsers.find(L=>L.userId===r),a=this._context.getConnectionStatus();this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`currentUser: ${JSON.stringify(o)}, currentUserId: ${r}, state: ${a}`,t)}catch(r){this._logger.error(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`error: ${r.message}`,t)}if(!this._isValidData(e.toDeviceId||"")){this._logger.warn(n.L_SIGNAL_TRANSPORTER_RECEIVE_INVITE_O,`not current deviceId -> deviceInfo: ${JSON.stringify({toDeviceId:e.toDeviceId,clientDeviceId:this._sessionId})}`,t);const r={extra:JSON.stringify(e),reason:Le.NOT_CURRENT_DEVICEID,refer:s?Q.PUB_INVITE:Q.PULL_KV_INVITE};this.emit(Y.onPubInviteCallMiss,Object.assign(e,r));return}this._listener.onInvite(e,s,t),s?this.emit(Y.onPubInviteCall,Object.assign(e,{extra:JSON.stringify(e)})):this.emit(Y.onPubInviteCallPullKv,Object.assign(e,{extra:JSON.stringify(e)}))}_onStatusDownCall(e,t){if(e.callSessionUsers=e.callSessionUsers.filter(s=>!!s.changed),this._logger.info(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O,"",t),!this._isValidData(e.toDeviceId||"")){this._logger.warn(n.L_SIGNAL_TRANSPORTER_RECEIVE_CALL_STATUS_O,`not current deviceId -> deviceInfo: ${JSON.stringify({toDeviceId:e.toDeviceId,clientDeviceId:this._sessionId})}`,t),this._listener.onOtherClientStatusDown(e,t);return}this._listener.onStatusDown(e,t,this._sessionId)}_onEventDownCall(e,t){this._listener.onEventDown(e,t)}_onDialogDownCall(e,t){const{dialogType:s}=e;s===j.SWITCH_MEDIA_TYPE&&this._listener.onSwitchMediaType(e,t)}_onPubCallLog(e,t){this._logger.info(n.L_CALL_ENGINE_RECEIVE_CALL_RECORD_O,`call record: ${JSON.stringify(e)}`,t),this._listener.onRecvCallEndLog(e,t)}_onConpensationData(e,t){this._logger.info(n.L_CALL_ENGINE_RECEIVE_COMPLEMENTARY_DATA_O,"",t);const{callId:s,callType:r,mediaType:o,secretChat:a,duration:L,callStatus:c,callingUserId:l,callSessionUsers:T,toDeviceId:I,callDialogEntitys:h,extra:d}=e;T.some(O=>O.sessionStatus===A.INVITED&&O.userId===this._context.getCurrentId())?this._onPubInviteCall({callId:s,toDeviceId:I,callType:r,mediaType:o,inviteUserId:l,callingUserId:l,callSessionUsers:T,secretChat:a,extra:d},t,!0):this._onStatusDownCall({callId:s,toDeviceId:I,callStatus:c,duration:L,callSessionUsers:T},t),h.length>0&&h.forEach(O=>this._onDialogDownCall(O,t),this)}}const He=_=>{const i="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ+/".split(""),e=i.length+1;let t=+_;const s=[];do{const r=t%e;t=(t-r)/e,s.unshift(i[r])}while(t);return s.join("")},ke=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,_=>{const i=Math.random()*16|0;return(_==="x"?i:i&3|8).toString(16)}),Fe=()=>{let _=ke();return _=`${_.replace(/-/g,"")}0`,_=parseInt(_,16),_=He(_),_.length>22&&(_=_.slice(0,22)),_},xe="RC_CALLPLUS",Ye=1;let B;const V=class V{static init(i,e){B=i,this.isSupport()||B.info("[RCCallIndexDB]","IndexDB is not support in the current environment");const t=window.indexedDB.open(xe,Ye);t.onerror=s=>{B.warn("[RCCallIndexDB]",`open indexDB req failed -> ${s.target.error}`)},t.onsuccess=s=>{this._db=s.target.result,this._db&&(this._db.onclose=r=>{B.warn("[RCCallIndexDB]",`The db ${this._db.name} has unexpectedly closed. ${r}`),this.unInit()},this._db.onerror=r=>{B.warn("[RCCallIndexDB]",`The db ${this._db.name} has opening error. ${r}`),this.unInit()},this._db.onabort=r=>{B.warn("[RCCallIndexDB]",`The db ${this._db.name} has opening aborted. ${r}`),this.unInit()}),V._instance=new V,e.onSuccess()},t.onupgradeneeded=s=>{this._db=s.target.result,V.createObjStore("CallBW_AbnormalCall",{keyPath:"userId"})}}static unInit(){this._db=null,this._instance=null}static getInstance(){return this._instance}static isSupport(){return!(typeof window>"u"||!window||!window.indexedDB)}static createObjStore(i,e){var t;(t=V._db)!=null&&t.objectStoreNames.contains(i)?B.debug("[RCCallIndexDB]",`createObjStore ${i} already exists`):V._db.createObjectStore(i,e)}addValue(i,e){return new Promise((t,s)=>{if(!V._db){t(!1);return}const o=V._db.transaction([i],"readwrite").objectStore(i).add(e);o.onsuccess=()=>{t(!0)},o.onerror=()=>{B.debug("[RCCallIndexDB]","addValue failed"),t(!1)}})}readByKey(i,e){return new Promise((t,s)=>{if(!V._db){t(null);return}const o=V._db.transaction([i]).objectStore(i).get(e);o.onsuccess=()=>{t(o.result)},o.onerror=a=>{B.warn("[RCCallIndexDB]",`readByKey onerror -> ${a}`),t(null)}})}updateByKey(i,e,t){return new Promise((s,r)=>{if(!V._db){s(!1);return}const a=V._db.transaction([i],"readwrite").objectStore(i).put(t);a.onsuccess=()=>{s(!0)},a.onerror=L=>{s(!1),B.warn("[RCCallIndexDB]",`updateByKey onerror -> ${L}`)}})}removeByKey(i,e){return new Promise((t,s)=>{if(!V._db){t(!1);return}const o=V._db.transaction([i],"readwrite").objectStore(i).delete(e);o.onsuccess=()=>{t(!0)},o.onerror=a=>{t(!1),B.warn("[RCCallIndexDB]",`removeByKey onerror -> ${a}`)}})}};C(V,"_db",null),C(V,"_instance",null);let X=V;class Je{constructor(i,e){C(this,"_localStore");C(this,"_indexDBStore");C(this,"_storeKey","CallBW_AbnormalCall");C(this,"_isSupportIndexDB");if(this._runtime=i,this._logger=e,this._isSupportIndexDB=X.isSupport(),this._isSupportIndexDB){X.init(this._logger,{onSuccess:()=>{this._indexDBStore=X.getInstance()}});return}this._localStore=i.localStorage}addAbnormallCallId(i,e){(this._isSupportIndexDB?this._addByIndexDB:this._addByLocalStore).call(this,i,e)}removeAbnormalCallIds(i,e){(this._isSupportIndexDB?this._removeByIndexDB:this._removeByLocalStore).call(this,i,e)}getAbnormalCallIds(i){return(this._isSupportIndexDB?this._getByIndexDB:this._getByLocalStore).call(this,i)}_addByLocalStore(i,e){try{const t=JSON.parse(this._localStore.getItem(this._storeKey)||"{}");let s=t[i];s?s.push(e):s=[e],t[i]=s,this._localStore.setItem(this._storeKey,JSON.stringify(t))}catch(t){this._logger.warn("[AbnormalCall]",`_addByLocalStore err: ${t.message}`)}}_removeByLocalStore(i,e){try{const t=JSON.parse(this._localStore.getItem(this._storeKey)||"{}");let s=t[i];s&&(s=s.filter(r=>!e.includes(r)),s.length>0?t[i]=s:delete t[i],this._localStore.setItem(this._storeKey,JSON.stringify(t)))}catch(t){this._logger.warn("[AbnormalCall]",`_removeByLocalStore err: ${t.message}`)}}_getByLocalStore(i){let e=null;try{const s=JSON.parse(this._localStore.getItem(this._storeKey)||"{}")[i];s&&(e=s)}catch(t){this._logger.warn("[AbnormalCall]",`_getByLocalStore err: ${t.message}`)}return Promise.resolve(e)}async _addByIndexDB(i,e){try{const t=await this._indexDBStore.readByKey(this._storeKey,i);t?(t.callIds.push(e),this._indexDBStore.updateByKey(this._storeKey,i,{userId:i,callIds:t.callIds})):this._indexDBStore.addValue(this._storeKey,{userId:i,callIds:[e]})}catch(t){this._logger.warn("[AbnormalCall]",`_addByIndexDB err: ${t.message}`)}}async _removeByIndexDB(i,e){try{const t=await this._indexDBStore.readByKey(this._storeKey,i);t&&(t.callIds=t.callIds.filter(s=>!e.includes(s)),t.callIds.length>0?this._indexDBStore.updateByKey(this._storeKey,i,{userId:i,callIds:t.callIds}):this._indexDBStore.removeByKey(this._storeKey,i))}catch(t){this._logger.warn("[AbnormalCall]",`_removeByIndexDB err: ${t.message}`)}}async _getByIndexDB(i){let e=null;try{e=await this._indexDBStore.readByKey(this._storeKey,i)}catch(t){this._logger.warn("[AbnormalCall]",`_getByIndexDB err: ${t.message}`)}return e?e.callIds:null}}var ce=(_=>(_[_.PROMPT=0]="PROMPT",_[_.CALL_DURATION=10]="CALL_DURATION",_[_.FIRST_FRAME=20]="FIRST_FRAME",_))(ce||{}),b=(_=>(_[_.SUCCESS=0]="SUCCESS",_[_.INVALID_RESPONSE_TIME=80170]="INVALID_RESPONSE_TIME",_[_.NONOPTIMAL_RES_TIME=80171]="NONOPTIMAL_RES_TIME",_))(b||{});class We{constructor(i,e,t){C(this,"_RTT",0);C(this,"_validMinRTT",200);C(this,"_validMaxRTT",1e3);C(this,"_deltaTime",0);C(this,"_timerId",null);C(this,"_interval",2*1e3);C(this,"_maxRetryTimes",8);C(this,"_startTimes",0);C(this,"_retryTimesInCall",0);C(this,"_maxRetryTimesInCall",3);this._callEngine=i,this._logger=e,this._singleCallDurationEv=t}async getCallClientTimeByServer(i,e){this._logger.info(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_T,`callId: ${i}`,e),(!this._RTT||this._RTT>this._validMinRTT)&&await this._getDeltaTime(e),this._RTT>this._validMaxRTT&&this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${b.INVALID_RESPONSE_TIME}`,e);const{code:t,data:s}=await this._callEngine.getCallTimeInfo(i,e);if(t!==E.SUCCESS)return this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${t}`,e),{code:t};const{startTime:r}=s,o=Math.floor(r-this._deltaTime);let L=(Date.now()+this._deltaTime-r)/1e3;return L<0&&(this._logger.warn(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_P,`invalid duration: ${L}`,e),L=0),L=Math.floor(L),this._RTT>this._validMinRTT&&this._RTT<=this._validMaxRTT&&this._logger.error(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,`code: ${b.NONOPTIMAL_RES_TIME}`,e),this._logger.info(n.L_TIME_CORRECT_GET_CALL_CLIENT_TIME_BY_SERVER_R,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime,serverStartTime:r,clientStartTime:o,duration:L}),e),{code:t,duration:L,clientStartTime:o}}calcClientStartTime(i,e,t){if(this._logger.info(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_T,`callId: ${i}, startTime: ${e}`,t),this._RTT>this._validMaxRTT)return this._logger.error(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R,`code: ${b.INVALID_RESPONSE_TIME}`,t),this._loopCorrectClientTime(i,t),{code:b.INVALID_RESPONSE_TIME};const s=Math.floor(e-this._deltaTime);return this._logger.info(n.L_TIME_CORRECT_CALC_CLIENT_START_TIME_R,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime,startT:e,clientStartTime:s}),t),this._RTT>this._validMinRTT&&(this._retryTimesInCall=0,this._loopCorrectClientTime(i,t)),{code:b.SUCCESS,clientStartTime:s}}start(i){this._timerId||this._startTimes>=this._maxRetryTimes||(this._logger.info(n.L_TIME_CORRECT_START_O,`timerId: ${this._timerId}`),this._startTimes++,this._getDeltaTime(i),this._timerId=Ee(()=>{this._timerId=null,this.start(i)},this._interval))}stop(i){this._logger.info(n.L_TIME_CORRECT_STOP_O,`timerId: ${this._timerId}`,i),this._timerId&&clearTimeout(this._timerId),this._timerId=null,this._startTimes=0}restart(i){this._logger.info(n.L_TIME_CORRECT_RESTART_O,`legal rtt time, RTT: ${this._RTT}, validMinRTT: ${this._validMinRTT}`,i),!(this._RTT<this._validMinRTT)&&(this.stop(i),this.start(i))}getLocalDelayTime(){return Math.round(this._deltaTime)}getRTT(){return this._RTT}async _getDeltaTime(i){const e=Date.now(),{code:t,data:s}=await this._callEngine.getCallServerTimestamp(i),r=Date.now();if(t!==E.SUCCESS)return{code:t};const o=r-e;return(o<this._RTT||this._RTT===0)&&o<=this._validMaxRTT&&(this._RTT=o),o<this._validMinRTT&&this.stop(i),this._deltaTime=s-e-this._RTT/2,this._logger.info(n.L_TIME_CORRECT_SET_DELTA_TIME_O,JSON.stringify({rtt:this._RTT,deltaT:this._deltaTime}),i),{code:t,delayTime:this._deltaTime}}async _getDeltaTimeInCall(i,e){const t=Date.now(),{code:s,data:r}=await this._callEngine.getCallTimeInfo(i,e),o=Date.now();if(s!==E.SUCCESS)return{code:s};const a=o-t;a<this._RTT&&(this._RTT=a),this._deltaTime=r.syncTime-t-this._RTT/2,this._logger.info(n.L_TIME_CORRECT_SET_DELTA_TIME_O,JSON.stringify({callId:i,rtt:this._RTT,deltaT:this._deltaTime}),e);const L=Math.floor(r.startTime-this._deltaTime),c=Math.floor(r.firstFrametime-this._deltaTime);return a<this._validMinRTT?{code:b.SUCCESS,clientStartTime:L,clientFirstFrameTime:c}:{code:b.INVALID_RESPONSE_TIME,clientStartTime:L,clientFirstFrameTime:c}}async _loopCorrectClientTime(i,e){this.stop(e),this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_T,`callId: ${i}`,e);const{code:t,clientStartTime:s,clientFirstFrameTime:r}=await this._getDeltaTimeInCall(i,e);if(t===b.SUCCESS){this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R,`code: ${E.SUCCESS}`,e),this._singleCallDurationEv(i,s,r,e);return}if(this._retryTimesInCall>this._maxRetryTimesInCall&&t===b.INVALID_RESPONSE_TIME){this._logger.info(n.L_TIME_CORRECT_LOOP_CORRECT_CLINET_TIME_R,`code: ${b.INVALID_RESPONSE_TIME}`,e),this._singleCallDurationEv(i,s,r,e);return}this._retryTimesInCall>this._maxRetryTimesInCall||(this._retryTimesInCall++,setTimeout(()=>{this._loopCorrectClientTime(i,e)},this._interval))}}var z=(_=>(_[_.SOON_AFETER=0]="SOON_AFETER",_[_.CURRENT=1]="CURRENT",_))(z||{}),le=(_=>(_[_.PUB_INVITE_CALL=0]="PUB_INVITE_CALL",_[_.PULL_KV_INVITE_CALL=1]="PULL_KV_INVITE_CALL",_[_.SYSTEM_PUSH=2]="SYSTEM_PUSH",_))(le||{}),Se=(_=>(_[_.OUT=-1]="OUT",_[_.GROUP=0]="GROUP",_[_.IN=1]="IN",_))(Se||{});const ue=60*1e3,H=class H extends S.EventEmitter{constructor(e,t,s,r,o){super();C(this,"_mainSession",null);C(this,"_holdSessions",[]);C(this,"_signalModule");C(this,"_abnormalModule");C(this,"_isUpFirstFrameTime",!1);C(this,"_callStartMap",{});C(this,"_timeCorrectioner");C(this,"_clientCallId","");this._context=e,this._runtime=t,this._initOpts=s,this._logger=r,this._reportAppEventModule=o,this._timeCorrectioner=new We(this,r,this._onRecvSinCallDuration.bind(this)),this._signalModule=new Be(e,t,s,this._timeCorrectioner,this._logger,this._reportAppEventModule),this._signalModule.registerListener({onInvite:this._onInvite.bind(this),onStatusDown:this._onStatusDown.bind(this),onOtherClientStatusDown:this._onOtherClientStatusDown.bind(this),onEventDown:this._onEventDown.bind(this),onSwitchMediaType:this._onSwitchMediaType.bind(this),onRecvCallEndLog:this._onRecvCallEndLog.bind(this),onIMStateChange:this._onIMStateChange.bind(this)}),this._abnormalModule=new Je(t,r)}async startCall(e,t){const s=this._context.getCurrentId(),{callType:r,mediaType:o,toUsers:a,targetId:L,targetType:c,oldRoomId:l,pushConfig:T,extra:I}=e;this._clientCallId=e.callId;const h=T?re(T,this._clientCallId):"",{code:d,data:u}=await this._signalModule.startCall({clientCallId:this._clientCallId,callType:r,mediaType:o,toUsers:a,secretChat:ne.NORMAL,targetType:c,targetId:L,oldRoomId:l,pushExt:h,extra:I},t);if(d!==E.SUCCESS)return{code:d};const{callId:O,busylineUsers:f}=u;if(this._abnormalModule.addAbnormallCallId(s,O),this._mainSession=new ae(O,p.INVITED,r,o,s,s,[],this._logger),r===M.SINGLE){const P=this._startTimer(u.callId,A.NO_ANSWER,t);this._mainSession.updateTimerId(oe.INVITER,P)}const v={userId:s,userState:A.CALLING,systemState:R.CALLING,targetType:c,targetId:L,cameraEnable:!1,microphoneEnable:!1};let D=a.map(({userId:P,targetType:w,targetId:W})=>({userId:P,userState:A.INVITED,systemState:R.INVITED,targetType:w,targetId:W,cameraEnable:!1,microphoneEnable:!1})),y=[];return f&&(y=f.map(P=>{const{targetType:w,targetId:W}=D.find(ee=>ee.userId===P.userId);return{userId:P.userId,userState:P.sessionStatus,systemState:R.BUSYLINE_RINGING,targetType:w,targetId:W,cameraEnable:!1,microphoneEnable:!1}}),D=D.filter(({userId:P})=>y.every(({userId:w})=>w!==P))),setTimeout(()=>{this.updateUsersState(O,[v,...D,...y],t)}),{code:d,data:u}}async invite(e,t){var T;if(!this._mainSession)return{code:E.NOT_IN_CALL};const{toUsers:s,pushConfig:r,extra:o}=e,a=r?re(r,this._clientCallId):"",L=this._mainSession.getCallId(),{code:c,data:l}=await this._signalModule.inviteCall({callId:L,toUsers:s,pushExt:a,extra:o},t);if(c===E.SUCCESS){this._mainSession.getCallType()===M.SINGLE&&(this._mainSession.updateCallType(M.MULTI),this._onCallTypeChange(this._mainSession.getCallId(),M.MULTI,t));let I=s.map(({userId:d,targetType:u,targetId:O})=>({userId:d,userState:A.INVITED,systemState:R.INVITED,targetType:u,targetId:O,cameraEnable:!1,microphoneEnable:!1})),h=[];l.busylineUsers&&(h=(T=l.busylineUsers)==null?void 0:T.map(d=>{const{targetType:u,targetId:O}=I.find(f=>f.userId===d.userId);return{userId:d.userId,userState:d.sessionStatus,systemState:R.BUSYLINE_RINGING,targetType:u,targetId:O,cameraEnable:!1,microphoneEnable:!1}}),I=I.filter(({userId:d})=>h.every(({userId:u})=>u!==d))),this.updateUsersState(L,[...I,...h],t)}return{code:c,data:l}}clearAllTimer(e,t){[this._mainSession,...this._holdSessions].forEach(s=>{s&&s.getCallId()===e&&s.getAllTimerIds().forEach(r=>this._stopTimer.bind(this)(r,t))})}async hangup(e,t){const{callId:s,systemState:r,pushConfig:o}=e,a=o?re(o,this._clientCallId):"";return this._signalModule.hangupCall({callId:s,sysStatus:r,pushExt:a},t)}async accept(e,t){if(!this._mainSession)return{code:E.NOT_IN_CALL};const{callId:s}=e,{code:r}=await this._signalModule.acceptCall({callId:s},t);return this._stopTimer(this._mainSession.getInviteeTimerId(),t),r!==E.SUCCESS?{code:r}:(this._clearMobileOnPhone(e.callId,t),this._mainSession.updateSessionState(p.CONNECTING),{code:r})}async joinCall(e,t){const s=this._context.getCurrentId();this._mainSession&&this._stopTimer(this._mainSession.getInviteeTimerId(),t);const{code:r}=await this._signalModule.joinCall({callId:e.callId},t);return r!==E.SUCCESS?{code:r}:(this._abnormalModule.addAbnormallCallId(s,e.callId),this._mainSession?this._clearMobileOnPhone(e.callId,t):await this._createSessionByServer(e.callId,t,!0),{code:r})}async requestChangeMediaType(e,t){if(!this._mainSession)return{code:E.NOT_IN_CALL};const s={mediaType:e.mediaType};this._mainSession.updateReqMediaType(e.mediaType);const r=Fe(),{code:o}=await this._signalModule.dialogUpCall({transactionId:r,callId:this._mainSession.getCallId(),toUserIds:e.toUserIds,dialogType:j.SWITCH_MEDIA_TYPE,action:$.REQUEST,extraKeyVal:s},t);return o!==E.SUCCESS?{code:o}:{code:E.SUCCESS,data:{transactionId:r}}}async responseChangeMediaType(e,t){if(!this._mainSession)return{code:E.NOT_IN_CALL};const s=this._mainSession.getReqMediaType();return e.agree&&(this._mainSession.updateMediaType(s),this._mainSession.updateReqMediaType(null)),this._signalModule.dialogUpCall({transactionId:e.transactionId,callId:this._mainSession.getCallId(),dialogType:j.SWITCH_MEDIA_TYPE,action:e.agree?$.ACCEPT:$.REFUSE},t)}async cancelChangeMediaType(e,t){return this._mainSession?this._signalModule.dialogUpCall({transactionId:e.transactionId,callId:this._mainSession.getCallId(),dialogType:j.SWITCH_MEDIA_TYPE,action:$.CANCEL},t):{code:E.NOT_IN_CALL}}async getCallLogList(e,t){const s=this._context.getCurrentId(),{timestamp:r,count:o,order:a}=e,{code:L,data:c}=await this._signalModule.syncCallLog({userId:s,syncTime:r,count:o,order:a},t);if(L!==E.SUCCESS)return{code:L};const l=c.callLogList.map(T=>Ce(T));return{code:E.SUCCESS,data:{hasMore:!!(c!=null&&c.hasMore),syncTime:a===0?c.maxTime:c.minTime,list:l}}}async deleteCallLog(e,t){const s=this._context.getCurrentId();return this._signalModule.deleteCallRecord(s,e,t)}async getCallServerTimestamp(e){const{code:t,data:s}=await this._signalModule.getCallServerTimestamp(e);return t!==E.SUCCESS?{code:t}:{code:t,data:s.syncTime}}async getCallTimeInfo(e,t){return this._signalModule.getCallTimeInfo(e,t)}async getOpenCallList(e){const t=this._context.getCurrentId(),{code:s,data:r}=await this._signalModule.getUserCallStateList(e);if(s!==E.SUCCESS)return{code:s};const o=r.callStateList.map(a=>{const{callId:L,callType:c,mediaType:l,callingUserId:T,callUserIds:I,callStatus:h,crtTime:d,userSessionStatus:u,startTime:O,syncTime:f}=a,v=T===t?Se.OUT:Se.IN,{clientStartTime:D=O}=this._timeCorrectioner.calcClientStartTime(L,O,e);return{callId:L,callType:c,callDirection:v,mediaType:l,callerUserId:T,callUserIds:I,sessionState:h,userState:u,startTimestamp:O,endTimestamp:0,duration:Math.floor((+new Date-D)/1e3),syncTimestamp:f,systemState:0,createTimestamp:d}});return{code:s,data:o}}async removeAllCallLog(e){const{code:t}=await this._signalModule.clearCallRecord(e);return t!==E.SUCCESS?{code:t}:{code:t}}async getCallSession(e,t){const{code:s,data:r}=await this._signalModule.getCallSession(e,t);if(s!==E.SUCCESS)return{code:s};const{callId:o,callingUserId:a,callType:L,mediaType:c,callStatus:l,callSessionUsers:T,startTime:I,duration:h,syncTime:d}=r,u=T.map(O=>{const{userId:f,sessionStatus:v,sysStatus:D,targetType:y,targetId:P}=O;return{userId:f,userState:v,systemState:D,targetType:y,targetId:P,cameraEnable:!1,microphoneEnable:!1}});return{code:s,data:{callId:o,startCallerId:a,callType:L,mediaType:c,sessionState:l,callSessionUsers:u,startTime:I,duration:h,syncTime:d}}}getHoldSession(e){const t=this._holdSessions.find(s=>s&&s.getCallId()===e);return t?new K(t,this,this._logger):null}getLocalMainSession(){return this._mainSession?new K(this._mainSession,this,this._logger):null}updateMainSessionState(e){var t;(t=this._mainSession)==null||t.updateSessionState(e)}setIsLocalClientHangup(e){var t;(t=this._mainSession)==null||t.setIsLocalClientHangup(e)}updateUsersState(e,t,s){this._logger.info(n.L_CALL_ENGINE_UPDATE_USERS_STATE_O,`updateUsersState -> users: ${JSON.stringify(t)}`,s);const r=[this._mainSession,...this._holdSessions].find(a=>(a==null?void 0:a.getCallId())===e),o=[];if(r){const a=t.map(L=>{const c=r.getUserList().filter(({userId:h})=>h===L.userId)[0]||{},l=L.userState===A.IDLE,{cameraEnable:T=!1,microphoneEnable:I=!1}=l?{cameraEnable:!1,microphoneEnable:!1}:c;return{...L,cameraEnable:T,microphoneEnable:I}});o.push(...r.updateUserList(a,s))}else o.push(...t);o.length>0&&this._onUserStateChange(e,o,s)}setUserDeviceEnable(e,t,s,r){var o;(o=this._mainSession)==null||o.setUserDeviceEnable(e,t,s,r)}async getCallStaringTime(e,t){return this._timeCorrectioner.getCallClientTimeByServer(e.callId,t)}async systemStatusUp(e,t){return this._signalModule.sysStatusUp(e,t)}async upFirstFrameTime(e){if(!this._mainSession||this._mainSession&&this._mainSession.getCallType()!==M.SINGLE||this._isUpFirstFrameTime)return{code:E.SUCCESS};const s=Date.now(),r=this._timeCorrectioner.getLocalDelayTime(),o=Math.floor(s+r);this._logger.info(n.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_T,`now: ${s}; delay: ${r}; streamReadyTime: ${o}`,e),this._isUpFirstFrameTime=!0;const a=this._mainSession.getCallId(),{code:L}=await this._signalModule.eventUpCall({callId:a,eventType:ce.FIRST_FRAME,eventArgs:{streamReadyTime:o},eventTime:Date.now()},e);return this._logger.info(n.L_CALL_ENGINE_UP_FIRST_FRAME_TIME_R,`code: ${L}`,e),{code:L}}endCurrentSession(e,t,s){const r=this._context.getCurrentId();if(this._mainSession&&this._mainSession.getCallId()===t){const o=this._mainSession.getUserList().map(L=>{let{userId:c,systemState:l,targetType:T,targetId:I}=L;return c===r&&(l=e),{userId:c,sessionStatus:A.ENDED,statusTime:Date.now(),duration:0,changed:1,inviteUserId:this._mainSession.getStartCallerId(),sysStatus:l,targetType:T,targetId:I}}),a={callId:this._mainSession.getCallId(),toDeviceId:this._signalModule.getSessionId(),callStatus:p.ENDED,duration:0,callSessionUsers:o};this._onStatusDown(a,s)}}startTimeCorrection(e){this._timeCorrectioner.restart(e)}getDelayTimeInfo(){return{delayTime:this._timeCorrectioner.getLocalDelayTime(),rtt:this._timeCorrectioner.getRTT()}}upgradeMainSession(e){var s;const t=this._holdSessions.findIndex(r=>r.getCallId()===e);this._mainSession=(s=this._holdSessions.splice(t,1))==null?void 0:s[0]}async endCurrentUserAbnormalCalls(e){const t=this._context.getCurrentId(),s=await this._abnormalModule.getAbnormalCallIds(t);if(!s)return{code:E.SUCCESS};const{code:r}=await this._signalModule.endUserAbnormalCalls({callIds:s,allDevice:e.allDevice?1:0});return r===E.SUCCESS&&this._abnormalModule.removeAbnormalCallIds(t,s),{code:r}}_onIMStateChange(e){const t=this._logger.createTraceId();let s=0;e===S.RCConnectionStatus.DISCONNECTED&&this._mainSession&&this._mainSession.getSessionState()!==p.ONCALL&&(s=Ee(()=>{var r;this._logger.info(n.L_CALL_ENGINE_IM_STATE_CHANGE_O,"endCurrentSession, IM disconnected for more than 60s",t),this.endCurrentSession(R.CONNECTION_ERR,(r=this._mainSession)==null?void 0:r.getCallId(),t)},ue)),e===S.RCConnectionStatus.CONNECTED&&(s&&clearTimeout(s),this.endCurrentUserAbnormalCalls({allDevice:!0}))}_handleCallTimeout(e,t,s){this._logger.warn(n.L_CALL_ENGINE_CALL_TIMEOUT_O,`call timeout callId: ${e}, userState: ${t}`,s);const r=[this._mainSession,...this._holdSessions].find(a=>a&&a.getCallId()===e);if(!r){this._logger.warn(n.L_CALL_ENGINE_CALL_TIMEOUT_O,`handleCallTimeout without session, callId: ${e}`,s);return}const o=this._context.getCurrentId();this._onStatusDown({callId:e,toDeviceId:this._signalModule.getSessionId(),callStatus:p.ENDED,duration:0,callSessionUsers:r.getUserList().map(a=>{const{userId:L,targetType:c,targetId:l,stateTime:T}=a;let I,h;return L===o?(I=t===A.MISSED?R.MISSED:R.NO_ANSWER,h=t===A.MISSED?A.MISSED:A.NO_ANSWER):(I=t===A.MISSED?R.NO_ANSWER:R.MISSED,h=t===A.MISSED?A.NO_ANSWER:A.MISSED),{userId:L,sessionStatus:h,statusTime:T?T+1:Date.now(),duration:0,changed:1,inviteUserId:r.getCallerId(),sysStatus:I,targetType:c,targetId:l}})},s)}_startTimer(e,t,s){const r=Ee(()=>{this._handleCallTimeout(e,t,s),this._signalModule.statusUpCall({callId:e,sessionStatus:t},s)},ue);return this._logger.info(n.L_CALL_ENGINE_START_CALL_TIMER_O,`callId: ${e}, timerId: ${r}`,s),r}_stopTimer(e,t){clearTimeout(e),this._logger.info(n.L_CALL_ENGINE_STOP_CALL_TIMER_O,`timerId: ${e}`,t)}_onInvite(e,t,s){this._clientCallId=S.getUUID();const r=this._context.getCurrentId(),{callSessionUsers:o,secretChat:a,extra:L="{}"}=e;if(a===ne.SECRET){this.emit(Y.onPubInviteCallMiss,Object.assign(e,{extra:JSON.stringify(e),reason:Le.SECRET_CALL,refer:t?Q.PUB_INVITE:Q.PULL_KV_INVITE}));return}o.some(l=>l.userId===r)&&this._selfIsInviteeHandle(e,t,s,L),this._othersIsInviteeHandle(e,s)}_selfIsInviteeHandle(e,t,s,r){const{callId:o,inviteUserId:a,callType:L,mediaType:c,callSessionUsers:l}=e,T=this._context.getCurrentId();this._abnormalModule.addAbnormallCallId(T,o);const I=new ae(o,p.RINGING,L,c,a,a,[],this._logger);this._signalModule.ringingCall({callId:o},s);const h=this._startTimer(o,A.MISSED,s);I.updateTimerId(oe.INVITEE,h),this._mainSession?(this._holdSessions.push(I),this._mainSession.updateSessionState(p.BUSYLINE_WAIT)):this._mainSession=I;const d=new K(I,this,this._logger);this._reportAppEventModule.onReceivedCall(d,s,JSON.parse(r||"{}").extra);const u=t?le.PUB_INVITE_CALL:le.PULL_KV_INVITE_CALL;this.emit(H.__INNER_INVITE__,d,u);const O=l.map(({userId:f,sessionStatus:v,sysStatus:D,targetType:y,targetId:P,statusTime:w})=>({userId:f,userState:v,systemState:D,targetType:y,targetId:P,stateTime:w,cameraEnable:!1,microphoneEnable:!1}));this.updateUsersState(o,O,s)}_othersIsInviteeHandle(e,t){var T,I,h;const{callId:s,inviteUserId:r,callSessionUsers:o}=e,a=this._context.getCurrentId(),L=o.filter(d=>d.userId!==a&&d.userId!==r&&d.sessionStatus===A.INVITED);if(!L.length)return;((T=this._mainSession)==null?void 0:T.getCallType())===M.SINGLE&&((I=this._mainSession)==null?void 0:I.getCallId())===s&&(this._onCallTypeChange(this._mainSession.getCallId(),M.MULTI,t),(h=this._mainSession)==null||h.updateCallType(M.MULTI));const c=[],l=[];L.forEach(d=>{const{userId:u,sessionStatus:O,sysStatus:f}=d;c.push({callId:s,userId:u,userState:O}),l.push({userId:u,userState:O,systemState:f,cameraEnable:!1,microphoneEnable:!1})}),this._onOtherMemberInvite(c),this.updateUsersState(s,l,t)}_onHangup(e,t,s){this._mainSession&&e.forEach(r=>{r.callId===this._mainSession.getCallId()&&(r.userState===A.CANCELLED?this._stopTimer(this._mainSession.getInviteeTimerId(),s):this._stopTimer(this._mainSession.getInviterTimerId(),s))})}_onAccept(e,t){var L,c,l,T;const s=(L=this._mainSession)==null?void 0:L.getSessionState(),r=[p.CONNECTING,p.ONCALL,p.BUSYLINE_WAIT];if(((c=this._mainSession)==null?void 0:c.getCallType())===M.SINGLE&&s&&r.includes(s))return;const o=this._mainSession.getStartCallerId(),a=this._context.getCurrentId();((l=this._mainSession)==null?void 0:l.getCallType())===M.SINGLE&&o===a&&e.filter(h=>h.fromUserId!==a)&&this.emit(H.__INNER_SESSION_CONNECT__,this.getLocalMainSession().getCallId(),t),(T=this._mainSession)==null||T.updateSessionState(p.CONNECTING),this._stopTimer(this._mainSession.getInviterTimerId(),t)}async _onStatusDown(e,t){var h,d;const{callStatus:s,startTime:r,callId:o}=e;if(o!==((h=this._mainSession)==null?void 0:h.getCallId()))return;if(this._callStartMap[o]=this._callStartMap[o]||{},!this._callStartMap[o].isReceiveCallStartTime&&s===p.ONCALL){this._callStartMap[o].isReceiveCallStartTime=!0;const{code:u,clientStartTime:O}=this._timeCorrectioner.calcClientStartTime(o,r,t);u===b.SUCCESS&&(this._callStartMap[o].callStartTime=O,this._reportAppEventModule.onReceivedCallStartTime({callId:o,callStartTime:O},t))}let a=!1;const L=this._context.getCurrentId(),c=e.callSessionUsers.map(u=>([A.IDLE,A.DECLINED,A.MISSED,A.NO_ANSWER,A.CANCELLED].includes(u.sessionStatus)&&u.sysStatus!==R.CANCELLED&&u.userId===L&&(a=!0),{userId:u.userId,userState:u.sessionStatus,systemState:u.sysStatus,stateTime:u.statusTime,cameraEnable:!1,microphoneEnable:!1}));if(c.length>0&&this.updateUsersState(o,c,t),!this._mainSession&&!this._holdSessions.length)return;const{hangupData:l,acceptData:T,otherInvitedData:I}=Ue(e);l.length>0&&this._onHangup(l,e.callStatus,t),T.length>0&&this._onAccept(T,t),I.length>0&&((d=this._mainSession)==null?void 0:d.getCallType())===M.MULTI&&this._onOtherMemberInvite(I),(e.callStatus===p.ENDED||a)&&this._onSessionClose(e,t,a)}_onOtherClientStatusDown(e,t){var L,c,l;const s=this._context.getCurrentId(),{callId:r,callSessionUsers:o}=e,a=o.find(({userId:T})=>T===s);if(a&&(this._mainSession||this._holdSessions.length)){const{userId:T,sessionStatus:I,statusTime:h}=a;if(I===A.CONNECTING){const d=[A.ONCALL,A.CONNECTING],u=((L=this._mainSession)==null?void 0:L.getCallId())===r,O=(l=(c=this._mainSession)==null?void 0:c.getUserList().find(v=>v.userId===s))==null?void 0:l.userState;u&&O&&d.includes(O)||(this.updateUsersState(r,[{userId:T,userState:I,systemState:R.OTHER_CLIENT_ACCEPT,stateTime:h,cameraEnable:!1,microphoneEnable:!1}],t),this._onSessionClose(e,t,!1))}}}async _onEventDown(e,t){var a;const{callId:s,eventArgs:r,eventType:o}=e;if(o===ce.CALL_DURATION&&s===((a=this._mainSession)==null?void 0:a.getCallId())){const{firstFrameTime:L}=r,{code:c,clientStartTime:l}=this._timeCorrectioner.calcClientStartTime(s,L,t);this._logger.info(n.L_CALL_ENGINE_RECEIVE_FIRST_FRAME_TIME_O,`clientFirstFrameTime: ${l}`,t),c===b.SUCCESS&&(this._callStartMap[s].firstFrameTime=l,this._reportAppEventModule.onReceivedCallFirstFrameTime(s,l,t))}}_onRecvSinCallDuration(e,t,s,r){var o;((o=this._mainSession)==null?void 0:o.getCallId())===e&&(this._callStartMap[e].callStartTime=t,this._callStartMap[e].firstFrameTime=s,this._reportAppEventModule.onReceivedCallStartTime({callId:e,callStartTime:t},r),this._reportAppEventModule.onReceivedCallFirstFrameTime(e,s,r))}_onSwitchMediaType(e,t){var u,O,f,v,D;const{callId:s,action:r,extraKeyVal:o,transactionId:a,promoterId:L}=e,{mediaType:c,reason:l}=o,T=(u=this._mainSession)==null?void 0:u.getCallId();if(s!==T){this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,`not current session callId: ${T}, recvCallId: ${s}`,t);return}const{transactionId:I,action:h,mediaType:d}=((O=this._mainSession)==null?void 0:O.getOldDialogData())||{};if(I===a&&h===r&&d===c){this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,"duplicate dialog data",t);return}if(this._logger.info(n.L_CALL_ENGINE_RECEIVE_MEDIATYPE_CHANGE_O,`action: ${r}, reason: ${l}`,t),(f=this._mainSession)==null||f.setOldDialogData({transactionId:a,action:r,mediaType:c}),r===$.REQUEST)this._onRequestChangeMediaType({transactionId:a,userId:L,mediaType:c},t);else{let y=null;switch(l){case $.CANCEL:y=F.CANCEL_CHANGE_MEDIA_TYPE;break;case $.ACCEPT:y=F.SERVER_ALLOW_MEDIA_TYPE,(v=this._mainSession)==null||v.updateMediaType(this._mainSession.getReqMediaType()),(D=this._mainSession)==null||D.updateReqMediaType(null);break;case $.REFUSE:y=F.REFUSE_CHANGE_MEDIA_TYPE;break;case $.TIMEOUT:y=F.CHANGE_MEDIA_TYPE_TIMEOUT;break}F[y]&&this._receiveMediaTypeChangeResult({transactionId:a,userId:L,mediaType:c},y,t)}r===$.NOTICE&&c===U.AUDIO&&!l&&this._receiveMediaTypeChangeResult({transactionId:a,userId:L,mediaType:c},F.SERVER_ALLOW_MEDIA_TYPE,t)}_onRecvCallEndLog(e,t){const s=Ce(e);this._reportAppEventModule.onReceivedCallRecord(s,t)}_onSessionClose(e,t,s){const{callId:r}=e,o=this._context.getCurrentId();this._abnormalModule.removeAbnormalCallIds(o,[r]);let a=[this._mainSession,...this._holdSessions].find(l=>l&&l.getCallId()===r);if(!a){this._logger.warn(n.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O,`unexpect session callId -> ${r}`,t);return}this._logger.warn(n.L_CALL_ENGINE_RECEIVE_CLOSE_SESSION_O,`callId: ${r}`,t),this.emit(H.__INNER_SESSION_CLOSE__,r,t);const L=a.getUserList().find(l=>l.userId===o);let c;s&&e.toDeviceId!==this._signalModule.getSessionId()?c=a.getIsLocalClientHangup()?L.systemState:R.OTHER_CLIENT_HANGUP:c=L.systemState,this._reportAppEventModule.onCallEnded(new K(a,this,this._logger),c,t),this._reportCallPlusSummaryMessage(a,r,c),this._mainSession&&this._mainSession.getCallId()===r&&(this._mainSession.getAllTimerIds().forEach(l=>this._stopTimer.bind(this)(l,t)),a.getCallType()===M.SINGLE&&(this._isUpFirstFrameTime=!1),delete this._callStartMap[r]),this._removeSession(r)}_reportCallPlusSummaryMessage(e,t,s){const r=this._context.getCurrentId(),o=e.getUserList().filter(({userId:c})=>c!==r)[0].userId,a=e.getStartCallerId();if(!localStorage.getItem(`missMessageMap-${r}-${t}`)){const c={callId:t,callerUserId:a,targetId:o,mediaType:e.getMediaType(),firstFrameTime:this._callStartMap[t].firstFrameTime||0,callStartTime:this._callStartMap[t].callStartTime||0,callEndTime:this._callStartMap[t].callStartTime?+new Date-this._timeCorrectioner.getLocalDelayTime():0,hangupReason:s};this._reportAppEventModule.onReceivedCallPlusSummaryMessage({messageType:Re,content:JSON.stringify(c),senderUserId:a,targetId:o,channelId:"",conversationType:S.ConversationType.PRIVATE,sentTime:+new Date-this._timeCorrectioner.getLocalDelayTime(),receivedTime:+new Date-this._timeCorrectioner.getLocalDelayTime(),messageUId:"",messageDirection:a===r?S.MessageDirection.SEND:S.MessageDirection.RECEIVE,isPersited:!0,isCounted:!1,isOffLineMessage:!1,canIncludeExpansion:!1,receivedStatus:S.ReceivedStatus.READ,isStatusMessage:!1,isMentioned:!1,expansion:null,disableNotification:!1}),localStorage.setItem(`missMessageMap-${r}-${t}`,t)}}_removeSession(e){var t;if(e===((t=this._mainSession)==null?void 0:t.getCallId()))this._mainSession=null;else{const s=this._holdSessions.findIndex(r=>(r==null?void 0:r.getCallId())===e);this._holdSessions.splice(s,1)}}async _createSessionByServer(e,t,s=!1){this._logger.info(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_T,`callId: ${e}`,t);const{code:r,data:o}=await this.getCallSession({callId:e},t);if(r!==E.SUCCESS){this._logger.error(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R,`errcode: ${r}`,t);return}this._logger.info(n.L_CALL_ENGINE_CREATE_SESSION_BY_SERVER_R,`code: ${r}, data: ${JSON.stringify(o)}`,t);const{callType:a,mediaType:L,callSessionUsers:c,startCallerId:l}=o;this._mainSession=new ae(e,p.CONNECTING,a,L,l,l,[],this._logger),s&&this._clearMobileOnPhone(e,t),this.updateUsersState(e,c,t)}async _clearMobileOnPhone(e,t){const s=[this._mainSession,...this._holdSessions].find(r=>(r==null?void 0:r.getCallId())===e);if(s&&s.getCallType()===M.MULTI){this._logger.info(n.L_CALL_ENGINE_UP_ON_PHONE_END_T,`callId: ${e}`,t);const{code:r}=await this.systemStatusUp({callId:e,sysStatus:R.ON_PHONE_END,forward:z.CURRENT},t);r===E.SUCCESS?this._logger.info(n.L_CALL_ENGINE_UP_ON_PHONE_END_R,`callId: ${e}`,t):this._logger.warn(n.L_CALL_ENGINE_UP_ON_PHONE_END_R,`callId: ${e}, errCode: ${r}`,t)}}_onUserStateChange(e,t,s){const r=this._context.getCurrentId();t.forEach(o=>{const{userId:a,userState:L,systemState:c}=o;a!==r&&this._reportAppEventModule.onRemoteUserStateChanged({callId:e,userId:a,userState:L,reason:c},s)}),t.forEach(({userId:o,systemState:a})=>{o===r&&a===R.ABNORMAL_END&&this.emit(H.__INNER_SESSION_CLOSE__,e,s)})}_onOtherMemberInvite(e){e.forEach(t=>{var a;const{userId:s,callId:r}=t,o=(a=this.getLocalMainSession())==null?void 0:a.getInviterUserId();this._reportAppEventModule.onRemoteUserInvited([s],o,r)})}_onRequestChangeMediaType(e,t){const{userId:s,transactionId:r,mediaType:o}=e;this._reportAppEventModule.onReceivedChangeMediaTypeRequest(s,r,o,t)}_receiveMediaTypeChangeResult(e,t,s){t===F.SERVER_ALLOW_MEDIA_TYPE&&this.emit(H.__INNER_CHANGE_MEDIA_TYPE__,e.mediaType,s),this._reportAppEventModule.onReceivedChangeMediaTypeResult({...e,code:t},s)}_onCallTypeChange(e,t,s){this._reportAppEventModule.onCallTypeChanged(t,e,s)}};C(H,"__INNER_SESSION_CLOSE__","inner-session-close"),C(H,"__INNER_SESSION_CONNECT__","inner-session-connect"),C(H,"__INNER_CHANGE_MEDIA_TYPE__","inner-change-media-type"),C(H,"__INNER_INVITE__","inner-invite");let J=H;var Z=(_=>(_.NORMAL="RongCloudRTC",_.SCREEN="ScreenShare",_))(Z||{});const G=class G extends S.EventEmitter{constructor(e,t,s,r,o,a){super();C(this,"_rtcClient");C(this,"_localTracks",[]);C(this,"_room",null);C(this,"_callId","");C(this,"_callMediaType");C(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});C(this,"_audioConfig",{});C(this,"_isPubTiny",!1);C(this,"_videoConfigIsChange",!1);C(this,"_audioConfigIsChange",!1);C(this,"_userViewMap",{});C(this,"_callPlusStatusReportListener",null);C(this,"_remoteAudioEnable",!0);this._context=e,this._runtime=t,this._initOpts=s,this._logger=r,this._callEngine=o,this._reportAppEventModule=a,this._rtcClient=s==null?void 0:s.rtcClient,this._isPubTiny=s.isPubTiny||!1}setCallPlusStatusReportListener(e){this._callPlusStatusReportListener=e}async getCameraVideoTrack(e){const t=this.getLocalVideoTrack(),{code:s,track:r}=t&&!this._videoConfigIsChange?{track:t,code:E.SUCCESS}:await this._createVideoTrack(e);return this._videoConfigIsChange=!1,s!==E.SUCCESS?{code:s}:{code:E.SUCCESS,track:r}}async getMicrophoneAudioTrack(e){const t=this.getLocalAudioTrack(),{code:s,track:r}=t&&!this._audioConfigIsChange?{track:t,code:E.SUCCESS}:await this._createAudioTrack(e);return this._audioConfigIsChange=!1,s!==E.SUCCESS?{code:s}:{code:E.SUCCESS,track:r}}async createCallMediaTracks(e,t){this._callMediaType=e;const{code:s}=await this.getMicrophoneAudioTrack(t);if(s!==E.SUCCESS)return{code:s};if(e===U.AUDIO_VIDEO){const{code:r}=await this.getCameraVideoTrack(t);r!==E.SUCCESS&&this._logger.warn(n.L_RTC_MODULE_CREATE_CALL_MEDIA_TRACKS_P,`get camera video track error code: ${r}`,t)}return{code:E.SUCCESS}}setVideoConfig(e){this._videoConfigIsChange=!0,this._videoConfig=e}setAudioConfig(e){this._audioConfigIsChange=!0,this._audioConfig=e}destroyAllTracks(e){this._logger.info(n.L_RTC_MODULE_DESTROY_ALL_TRACKS_O,"",e),this._localTracks.forEach(t=>{t.destroy()}),this._localTracks.length=0}setAllRemoteAudioEnable(e,t){return this._logger.info(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_T,`enable: ${e}`,t),S.isBoolean(e)?(this._remoteAudioEnable=e,this._room?(this._room.getRemoteTracks().filter(r=>r.isAudioTrack()).forEach(r=>{e?r.unmute():r.mute()}),this._logger.info(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R,"success",t),{code:E.SUCCESS}):{code:E.SUCCESS}):(this._logger.error(n.L_RTC_MODULE_SET_ALL_REMOTE_AUDIO_ENABLE_R,`param error, enable: type is boolean, value: ${e}`),{code:E.PARAM_ERROR})}async destroyTrack(e){e.destroy();const t=this._localTracks.findIndex(s=>s.getTrackId()===e.getTrackId());this._localTracks.splice(t,1)}async sessionConnected(e,t){var r;if(this._logger.info(n.L_RTC_MODULE_SESSION_CONNECT_T,`callId: ${e}`,t),!this._room){const{code:o,room:a}=await this.joinRTCRoom(e,t);if(o!==E.SUCCESS)return;this._room=a}this._callId=e,this._regRTCListeners();const s=((r=this._room)==null?void 0:r.getRemoteUserIds())||[];if(s.length>0&&this._onOtherMemJoined(s.map(o=>({callId:e,userId:o})),t),this._localTracks.length>0){this.emit(Y.onBeforePublish);const o=this._isPubTiny?this._localTracks.map(L=>L.isVideoTrack()?{track:L,isPubTiny:!0}:L):this._localTracks,{code:a}=await this.publish(o,t);this.emit(Y.onPublishRes,a)}else this._logger.warn(n.L_RTC_MODULE_SESSION_CONNECT_P,"sessionConnected local tracks is empty",t);this._logger.info(n.L_RTC_MODULE_SESSION_CONNECT_R,`code: ${E.SUCCESS}`,t)}async sessionClose(e,t){var r;this._logger.info(n.L_RTC_MODULE_SESSION_CLOSE_T,`callId: ${e}`,t),this.destroyAllTracks(t);const s=(r=this._room)==null?void 0:r.getRoomId();if(this._room&&e===s){const{code:o}=await this._rtcClient.leaveRoom(this._room);if(this._releaseStoredData(),o!==N.RCRTCCode.SUCCESS){this._logger.error(n.L_RTC_MODULE_SESSION_CLOSE_R,`leaveRoom failed, code: ${o}`,t);return}this._logger.info(n.L_RTC_MODULE_SESSION_CLOSE_R,"leaveRoom success",t)}else this._logger.warn(n.L_RTC_MODULE_SESSION_CLOSE_R,"leaveRoom throw exception: not in room",t)}async disableVideoTrack(){const e=this.getLocalVideoTrack();return e?{code:await e.mute(),track:e}:{code:E.CAMERA_CLOSED}}async enableVideoTrack(e){const t=this.getLocalVideoTrack();return t?t.isOwnerMuted()?{code:await t.unmute()}:{code:E.SUCCESS}:{code:E.CAMERA_CLOSED}}async changeVideoDevice(e){const t=[],s=[],{code:r,track:o}=await this._rtcClient.createCameraVideoTrack(Z.NORMAL,this._videoConfig);if(r!==N.RCRTCCode.SUCCESS)return{code:r};const{minBitrate:a,maxBitrate:L}=this._videoConfig;(a||L)&&o.setBitrate(L,a);let c;if(this._localTracks&&this._localTracks.forEach(l=>{l.isVideoTrack()?(l.destroy(),c=l):s.push(l)}),this._localTracks=this._localTracks.filter(l=>c&&l.getTrackId()!==c.getTrackId()),t.push(o),s.push(o),this._localTracks=s,this._onLocalTrackReady(t,e),this._room){const{code:l}=await this._room.publish(t);if(l!==N.RCRTCCode.SUCCESS)return{code:l}}return{code:E.SUCCESS,track:o}}async changeAudioDevice(e){const t=[],s=[],r={...this._audioConfig,micphoneId:this._audioConfig.microphoneId},{code:o,track:a}=await this._rtcClient.createMicrophoneAudioTrack(Z.NORMAL,r);if(o!==N.RCRTCCode.SUCCESS)return{code:o};if(this._localTracks&&this._localTracks.forEach(L=>{L.isAudioTrack()||s.push(L)}),t.push(a),s.push(a),this._localTracks=s,this._onLocalTrackReady(t,e),this._room){const{code:L}=await this._room.publish(t);if(L!==N.RCRTCCode.SUCCESS)return{code:L}}return{code:E.SUCCESS}}async disableAudioTrack(){const e=this.getLocalAudioTrack();return e?{code:await e.mute(),track:e}:{code:E.MICROPHONE_CLOSED}}async changeMediaType(e,t){this._logger.info(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_T,`mediaType: ${e}`,t);let s;e===U.AUDIO_VIDEO?s=await this._upgradeMediaType(t):s=await this._downgradeMediaType(t),s.code===E.SUCCESS&&this._logger.info(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,"success",t)}async _upgradeMediaType(e){let t=this.getLocalVideoTrack();if(!t){const{code:o,track:a}=await this._createVideoTrack(e);if(o!==E.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`create video track errCode: ${o}`,e),{code:o};t=a;const{minBitrate:L,maxBitrate:c}=this._videoConfig;(L||c)&&t.setBitrate(c,L)}const s=this._isPubTiny?{track:t,isPubTiny:!0}:t,{code:r}=await this.publish([s],e);return r!==E.SUCCESS&&this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`publish errCode: ${r}`,e),{code:r}}async _downgradeMediaType(e){const t=this.getLocalVideoTrack();if(t){const{code:s}=await this._room.unpublish([t]);if(s!==N.RCRTCCode.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CHANGE_MEDIA_TYPE_R,`unpublish errCode: ${s}`,e),{code:s};this.destroyTrack(t)}return{code:E.SUCCESS}}async joinRTCRoom(e,t){this._logger.info(n.L_RTC_MODULE_JOIN_RTC_ROOM_T,`call: ${e}`,t);const{code:s,room:r,tracks:o}=await q({asyncFn:this._rtcClient.joinRTCRoom.bind(this._rtcClient),fnArgs:[e,void 0,void 0,!1,S.RTCMode.CALL]});return s!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_JOIN_RTC_ROOM_R,`callId: ${e}, errCode: ${s}`,t),this._onRTCMethodFail(R.JOIN_ROOM_ERR,t),{code:s}):(this._logger.info(n.L_RTC_MODULE_JOIN_RTC_ROOM_R,"success",t),this._room=r,this._onSelfJoined({callId:e,userId:this._context.getCurrentId()},t),o!=null&&o.length&&this._onRemoteTrackPublish(o),this._callId=e,{code:E.SUCCESS,room:r,tracks:o})}async subscribeTracks(e,t){if(this._logger.info(n.L_RTC_MODULE_SUBSCRIBE_T,JSON.stringify({params:e.map(r=>{const{track:o,subTiny:a}=r;return{trackId:o.getTrackId(),subTiny:a}})}),t),!this._room)return{code:E.SUCCESS};const{code:s}=await q({asyncFn:this._room.subscribe.bind(this._room),fnArgs:[e],onError:r=>{}});return s!==N.RCRTCCode.SUCCESS?(this._reportAppEventModule.onFetchRemoteMediaError(e,s),this._onRTCMethodFail(R.SUBSCRIBE_ERR,t),this._logger.error(n.L_RTC_MODULE_SUBSCRIBE_R,`errorCode: ${s}`,t),{code:s}):(this._logger.info(n.L_RTC_MODULE_SUBSCRIBE_R,"success",t),{code:E.SUCCESS})}async unsubscribeTracks(e,t){if(this._logger.info(n.L_RTC_MODULE_UNSUBSCRIBE_T,JSON.stringify({trackIds:e.map(r=>r.getTrackId())}),t),!this._room)return{code:E.SUCCESS};const{code:s}=await this._room.unsubscribe(e);return s!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_UNSUBSCRIBE_R,`errorCode: ${s}`,t),{code:s}):(this._logger.info(n.L_RTC_MODULE_UNSUBSCRIBE_R,"success",t),{code:E.SUCCESS})}_releaseStoredData(){this._room=null,this._remoteAudioEnable=!0,this._userViewMap={}}getRemoteTracks(){const e={};return this._room&&this._room.getRemoteUserIds().forEach(s=>{e[s]=this._room.getRemoteTracksByUserId(s)}),e}getRemoteTrack(e,t){var s;return(s=this._room)==null?void 0:s.getRemoteTracksByUserId(e).find(r=>t===U.AUDIO?r.isAudioTrack():r.isVideoTrack())}getRTCSessionId(){return this._room?this._room.getSessionId():null}_regRTCListeners(){this._room.registerRoomEventListener({onKickOff:(e,t)=>{this._onKickOff(e,this._room.getRoomId(),t),this._releaseStoredData()},onUserJoin:e=>{const t=e.map(r=>({callId:this._callId,userId:r})),s=this._logger.createTraceId();this._onOtherMemJoined(t,s)},onUserLeave:e=>{e.forEach(t=>{delete this._userViewMap[t]})},onTrackPublish:this._onRemoteTrackPublish.bind(this),onTrackUnpublish:this._onTrackUnpublish.bind(this),onTrackReady:e=>{this._onRemoteTrackReady([e])},onVideoMuteChange:e=>{this._onVideoMuteChagne({fromUserId:e.getUserId(),muted:e.isOwnerMuted(),trackId:e.getTrackId()})},onAudioMuteChange:e=>{this._onAudioMuteChange({fromUserId:e.getUserId(),muted:e.isOwnerMuted(),trackId:e.getTrackId()})},onRTCPeerConnectionCloseByException:this._onRTCPeerConnectionCloseByException.bind(this)}),this._room.registerReportListener({onStateReport:this._onRTCStateReport.bind(this)}),this._room.onAudioLevelChange(e=>{this._reportAppEventModule.onUserAudioLevelChanged(e)})}_onLocalTrackReady(e,t){this._reportAppEventModule.onUserMediaAvailable(e,t)}_onRemoteTrackReady(e){this._reportAppEventModule.onUserMediaAvailable(e),this.emit(G.__INNER_RECEIVE_FIRST_FRAME__)}_onKickOff(e,t,s,r){this._logger.info(n.L_RTC_MODULE_RECEIVE_KICK_OFF_O,`roonId: ${t}, byServer: ${e}, state: ${s}, kickExtra: ${JSON.stringify(r)}`);let o=R.CONNECTION_ERR;if(e)if(r)o=r.kickReasonCode;else switch(s){case N.RCKickReason.SERVER_KICK:o=R.KICKED_BY_SERVER;break;case N.RCKickReason.OTHER_KICK:o=R.OTHER_CLIENT_JOINED;break;case N.RCKickReason.IM_DISCONNECTED:o=R.CONNECTION_ERR;break;case N.RCKickReason.IM_LOGOUT:o=R.LOGOUT;break;case N.RCKickReason.OTHER_CLIENT_IM_CONNECTED:o=R.OTHER_CLIENT_LOGIN;break}this.emit(G.__INNER_ON_KICKOFF__,o,t)}_onRTCPeerConnectionCloseByException(){const e=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_PEERCONNECTION_EXCEPT_CLOSE_O,"",e),this.emit(G.__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__,e)}async _onSelfJoined(e,t){this.emit(G.__INNER_ON_SELF_JOINED__,e.callId,t)}_onRemoteTrackPublish(e){const t=this._logger.createTraceId();this._onDeviceEnableChange(e,t),this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_PUBLISH_O,JSON.stringify({callId:this._callId,trackIds:e.map(r=>r.getTrackId())}),t);const s=[];e.forEach(r=>{var a;const o=r.getUserId();if(r.isAudioTrack())s.push({track:r,subTiny:!1}),this._reportAppEventModule.onRemoteMicrophoneStateChanged(this._callId,r);else if((a=this._userViewMap[o])!=null&&a.videoView){this._reportAppEventModule.onRemoteCameraStateChanged(this._callId,r);const{isTiny:L}=this._userViewMap[o];s.push({track:r,subTiny:L})}}),s.length&&this.subscribeTracks(s,t)}async _onTrackUnpublish(e){const t=this._logger.createTraceId();this._onDeviceEnableChange(e,t),this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_UNPUBLISH_O,JSON.stringify({callId:this._callId,trackIds:e.map(s=>s.getTrackId())}),t),await this.unsubscribeTracks(e,t)}_onAudioMuteChange(e){const t=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O,JSON.stringify({info:e}),t);const s=this._room.getRemoteTrack(e.trackId);this._onDeviceEnableChange([s],t),this._reportAppEventModule.onRemoteMicrophoneStateChanged(this._callId,s)}_onVideoMuteChagne(e){const t=this._logger.createTraceId();this._logger.info(n.L_RTC_MODULE_RECEIVE_TRACK_ENABLE_CHANGE_O,JSON.stringify({info:e}),t);const s=this._room.getRemoteTrack(e.trackId);this._onDeviceEnableChange([s],t),this._reportAppEventModule.onRemoteCameraStateChanged(this._callId,s)}_onRTCStateReport(e){const{senders:t,receivers:s}=e;t.forEach(r=>{var c;const{kind:o,packetsLostRate:a,rtt:L}=r;this._callMediaType===U.AUDIO_VIDEO&&o==="audio"||(c=this._callPlusStatusReportListener)==null||c.onSendPacketLoss(a||0,L||0)}),s.forEach(r=>{var I;const{trackId:o,kind:a,packetsLostRate:L,bitrate:c}=r;if(this._callMediaType===U.AUDIO_VIDEO&&a==="audio")return;const{userId:l}=N.helper.parseTrackId(o),T={};L&&(T[l]={packetLostRate:L,bitRate:c},(I=this._callPlusStatusReportListener)==null||I.onReceivePacketLoss(T))})}_onRTCMethodFail(e,t){this.emit(G.__INNER_RTC_PROCESS_FAILED__,e,t)}_onOtherMemJoined(e,t){this.emit(G.__INNER_ON_OTHER_JOINED__,e,t)}_onDeviceEnableChange(e,t){this.emit(G.__INNER_ON_DEVICE_ENABLE_CHANGE__,e,t)}async _createAudioTrack(e){var L;if(this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_T,"",e),(L=this._localTracks)!=null&&L.some(c=>c.isAudioTrack()))return this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,"success",e),{code:E.SUCCESS};const t=Object.assign(this._audioConfig,{micphoneId:this._audioConfig.microphoneId}),{code:s,track:r}=await this._rtcClient.createMicrophoneAudioTrack(Z.NORMAL,t);if(s!==N.RCRTCCode.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,`errCode: ${s}`,e),{code:s};this._logger.info(n.L_RTC_MODULE_CREATE_AUDIO_TRACK_R,"success",e);const{minBitrate:o,maxBitrate:a}=this._audioConfig;return(o||a)&&r.setBitrate(a,o),this._localTracks.push(r),this._onLocalTrackReady([r],e),{code:E.SUCCESS,track:r}}async _createVideoTrack(e){var a;if(this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_T,"",e),(a=this._localTracks)!=null&&a.some(L=>L.isVideoTrack()&&!L.isDestroyed()))return this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,"success",e),{code:E.SUCCESS};const{code:t,track:s}=await this._rtcClient.createCameraVideoTrack(Z.NORMAL,this._videoConfig);if(t!==N.RCRTCCode.SUCCESS)return this._logger.error(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,`errCode: ${t}`,e),{code:t};this._logger.info(n.L_RTC_MODULE_CREATE_VIDEO_TRACK_R,"success",e);const{minBitrate:r,maxBitrate:o}=this._videoConfig;return(r||o)&&s.setBitrate(o,r),this._localTracks.push(s),this._onLocalTrackReady([s],e),{code:E.SUCCESS,track:s}}getLocalVideoTrack(){let e;return this._localTracks&&([e]=this._localTracks.filter(t=>t.isVideoTrack())),e}getLocalAudioTrack(){let e;return this._localTracks&&([e]=this._localTracks.filter(t=>t.isAudioTrack())),e}async publish(e,t){this._logger.info(n.L_RTC_MODULE_PUBLISH_T,`tracksIds: ${e.map(r=>r instanceof N.RCLocalTrack?r.getTrackId():r.track.getTrackId())}`,t);const{code:s}=await q({asyncFn:this._room.publish.bind(this._room),fnArgs:[e],onError:r=>{}});return s!==N.RCRTCCode.SUCCESS?(this._onRTCMethodFail(R.PUBLISH_ERR,t),this._logger.error(n.L_RTC_MODULE_PUBLISH_R,`errCode: ${s}`,t),{code:s}):(this._logger.info(n.L_RTC_MODULE_PUBLISH_R,`code: ${E.SUCCESS}`,t),{code:E.SUCCESS})}publishVideoTrack(){const e=this.getLocalVideoTrack(),t=this._isPubTiny?{track:e,isPubTiny:!0}:e;return this._room.publish([t])}setVideoView(e,t){const s=[];e.forEach(r=>{const{userId:o,videoElement:a,isTiny:L=!1}=r;if(this._userViewMap[o]={videoView:a,isTiny:L},o===this._context.getCurrentId()||!this._room)return;const l=(this.getRemoteTracks()[o]||[]).map(T=>({track:T,subTiny:L})).filter(({track:T})=>!T.isSubscribed());s.push(...l)}),this._logger.info(n.L_RTC_MODULE_SET_VIDEO_VIEW_O,JSON.stringify({userViewMap:he(this._userViewMap),needSubTrackIds:s.map(({track:r})=>r.getTrackId())}),t),s.length&&this.subscribeTracks(s,t)}removeVideoView(e,t){const s=[];e.forEach(r=>{const o=this.getRemoteTracks()[r];if(o&&o.length){const a=o.filter(L=>L.isVideoTrack());a.length&&s.push(a[0])}delete this._userViewMap[r]}),this._logger.info(n.L_RTC_MODULE_REMOVE_VIDEO_VIEW_O,JSON.stringify({userViewMap:he(this._userViewMap),unsubTracks:s.map(r=>r.getTrackId())}),t),s.length&&this.unsubscribeTracks(s,t)}getUserViewMap(){return this._userViewMap}async playMedia(e,t,s,r){this._logger.info(n.L_RTC_MODULE_PLAY_MEDIA_T,`userId: ${e}, mediaType: ${t}, videoView: ${s==null?void 0:s.nodeName}`,r);let o=null;if(e===this._context.getCurrentId()?o=t===U.AUDIO?this.getLocalAudioTrack():this.getLocalVideoTrack():o=this.getRemoteTracks()[e].filter(a=>t===U.AUDIO?a.isAudioTrack():a.isVideoTrack())[0],!o)return this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`error code: ${E.MEDIA_RESOURCE_INVALIED}`,r),{code:E.MEDIA_RESOURCE_INVALIED};try{const{code:a}=o.isAudioTrack()?await o.play():await o.play(s);return o.isAudioTrack()&&!this._remoteAudioEnable&&o.mute(),a!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`errCode: ${a}`,r),{code:a}):(this._logger.info(n.L_RTC_MODULE_PLAY_MEDIA_R,"success",r),{code:E.SUCCESS})}catch(a){return this._logger.error(n.L_RTC_MODULE_PLAY_MEDIA_R,`errCode: ${E.PLAY_MEDIA_FAILED}, message: ${a.message},`,r),{code:E.PLAY_MEDIA_FAILED}}}};C(G,"__INNER_RTC_PROCESS_FAILED__","inner-rtc-process-failed"),C(G,"__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__","inner-rtc-peerconnection-abnormal-close"),C(G,"__INNER_ON_SELF_JOINED__","inner-on-self-joined"),C(G,"__INNER_ON_OTHER_JOINED__","inner-on-other-joined"),C(G,"__INNER_RECEIVE_FIRST_FRAME__","inner-receive-first-frame"),C(G,"__INNER_ON_KICKOFF__","inner-kickoff-frame"),C(G,"__INNER_ON_DEVICE_ENABLE_CHANGE__","inner-on-device-enable-change");let k=G;class Ke{constructor(i){C(this,"_listener");this._logger=i}registerEventListener(i){this._listener=i}async _callAppListener(i,...e){var s;const t=(s=this._listener)==null?void 0:s[i];if(t)try{await t(...e)}catch(r){this._logger.error(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({name:r.name,message:r.message}))}}onReceivedCall(i,e,t){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCall",callId:i.getCallId()}),e),this._callAppListener("onReceivedCall",i,t)}onRemoteUserInvited(i,e,t){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteUserInvited",inviteeUserList:i,inviterUserId:e,callId:t})),this._callAppListener("onRemoteUserInvited",i,e,t)}onCallConnected(i){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallConnected",callId:i.getCallId()})),this._callAppListener("onCallConnected",i)}onCallTypeChanged(i,e,t){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallTypeChanged",callId:e,callType:i}),t),this._callAppListener("onCallTypeChanged",i,e)}onRemoteUserStateChanged(i,e){const{callId:t,userId:s,userState:r,reason:o}=i;this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteUserStateChanged",callId:t,userId:s,userState:r,reason:o}),e),this._callAppListener("onRemoteUserStateChanged",t,s,r,o)}onCallEnded(i,e,t){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onCallEnded",callId:i.getCallId(),closeReason:e}),t),this._callAppListener("onCallEnded",i,e)}onRemoteCameraStateChanged(i,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteCameraStateChanged",callId:i,trackId:e==null?void 0:e.getTrackId(),enable:e==null?void 0:e.isOwnerMuted()}));const t=e==null?void 0:e.getUserId();this._callAppListener("onRemoteCameraStateChanged",i,t,e==null?void 0:e.isOwnerMuted())}onRemoteMicrophoneStateChanged(i,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onRemoteMicrophoneStateChanged",callId:i,trackId:e==null?void 0:e.getTrackId(),enable:e==null?void 0:e.isOwnerMuted()}));const t=e==null?void 0:e.getUserId();this._callAppListener("onRemoteMicrophoneStateChanged",i,t,e==null?void 0:e.isOwnerMuted())}onReceivedCallRecord(i,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallRecord",record:i}),e),this._callAppListener("onReceivedCallRecord",i)}onReceivedChangeMediaTypeRequest(i,e,t,s){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedChangeMediaTypeRequest",userId:i,transactionId:e}),s),this._callAppListener("onReceivedChangeMediaTypeRequest",i,e,t)}onReceivedChangeMediaTypeResult(i,e){const{userId:t,transactionId:s,mediaType:r,code:o}=i;this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedChangeMediaTypeResult",userId:t,mediaType:r}),e),this._callAppListener("onReceivedChangeMediaTypeResult",{userId:t,transactionId:s,mediaType:r,code:o})}onReceivedCallStartTime(i,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallStartTime",info:i}),e),this._callAppListener("onReceivedCallStartTime",i)}onReceivedCallFirstFrameTime(i,e,t){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onReceivedCallFirstFrameTime",callId:i,callFirstFrameTime:e}),t),this._callAppListener("onReceivedCallFirstFrameTime",i,e)}onUserMediaAvailable(i,e){this._logger.info(n.L_CALLPLUS_CLIENT_CALL_EVENT_LISTENER_O,JSON.stringify({eventType:"onUserMediaAvailable",trackIds:i.map(t=>t.getTrackId())}),e),i.forEach(t=>{const s=t.getUserId(),r=t.isAudioTrack()?U.AUDIO:U.VIDEO;this._callAppListener("onUserMediaAvailable",s,r)})}onFetchRemoteMediaError(i,e){i.forEach(({track:t})=>{const s=t.getUserId();this._callAppListener("onFetchRemoteMediaError",s,e)})}onUserAudioLevelChanged(i){i.forEach(({track:e,audioLevel:t})=>{const s=e.getUserId();this._callAppListener("onUserAudioLevelChanged",s,t)})}onReceivedCallPlusSummaryMessage(i){this._callAppListener("onReceivedCallPlusSummaryMessage",i)}}var Oe=(_=>(_[_.UNKNOW_ERR=41e3]="UNKNOW_ERR",_[_.DB_ERR=41001]="DB_ERR",_[_.JSON_ERR=41002]="JSON_ERR",_[_.INVALID_JSON_ERR=41003]="INVALID_JSON_ERR",_[_.MISSING_PARAMS=41004]="MISSING_PARAMS",_[_.PARAMS_REQUIRED=41005]="PARAMS_REQUIRED",_[_.DATA_FORMAT_ERR=41006]="DATA_FORMAT_ERR",_[_.METHOD_NOT_IMPLEMENTED=41007]="METHOD_NOT_IMPLEMENTED",_[_.CALL_NOT_EXIST=41010]="CALL_NOT_EXIST",_[_.SINGAL_EXCEED_TWO_INVITEE=41011]="SINGAL_EXCEED_TWO_INVITEE",_[_.GROUP_EXCEEDS_QUORUM=41012]="GROUP_EXCEEDS_QUORUM",_[_.OPERATION_EXPIRED=41013]="OPERATION_EXPIRED",_[_.DEVICE_IS_CALLING=41014]="DEVICE_IS_CALLING",_[_.REPORT_STREAM_READY_TIME_IS_INVALID=41018]="REPORT_STREAM_READY_TIME_IS_INVALID",_[_.NOT_CALL_YOURSELF=41019]="NOT_CALL_YOURSELF",_[_.SESSION_STATUS_NOT_EXIST=41020]="SESSION_STATUS_NOT_EXIST",_[_.HANGUP_NOT_ALLOW=41021]="HANGUP_NOT_ALLOW",_[_.ACCEPT_NOT_ALLOW=41022]="ACCEPT_NOT_ALLOW",_[_.OPERATION_NOT_ALLOW=41025]="OPERATION_NOT_ALLOW",_[_.TRANSACTION_ID_ERR=41100]="TRANSACTION_ID_ERR",_[_.UP_VIDEO_CANCELED=41050]="UP_VIDEO_CANCELED",_[_.CURRENT_CALL_IS_AUDIO=41051]="CURRENT_CALL_IS_AUDIO",_[_.CURRENT_CALL_IS_VIDEO=41052]="CURRENT_CALL_IS_VIDEO",_))(Oe||{});class ge{constructor(i){C(this,"_androidPushConfig",{});this._logger=i}setChannelIdMi(i){return S.isString(i)?(this._androidPushConfig.channelIdMi=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: channelIdMi type is string, value: ${i}`),this)}setMiLargeIconUrl(i){return this._logger.warn(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,"`setMiLargeIconUrl` has been deprecated."),this}setChannelIdHW(i){return S.isString(i)?(this._androidPushConfig.channelIdHW=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: channelIdHW type is string, value: ${i}`),this)}setCategoryHW(i){return S.isString(i)?(this._androidPushConfig.categoryHW=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: categoryHW type is string, value: ${i}`),this)}setImportanceHW(i){return i!=="LOW"&&i!=="NORMAL"?(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: importanceHW value is NORMAL|LOW, value: ${i}`),this):(this._androidPushConfig.importanceHW=i,this)}setImageUrlHW(i){return S.isString(i)?(this._androidPushConfig.imageUrlHW=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: imageUrlHW type is string, value: ${i}`),this)}setChannelIdOPPO(i){return S.isString(i)?(this._androidPushConfig.channelIdOPPO=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: channelIdOPPO type is string, value: ${i}`),this)}setTypeVivo(i){return S.isString(i)?(this._androidPushConfig.typeVivo=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: typeVivo type is string, value: ${i}`),this)}setCategoryVivo(i){return S.isString(i)?(this._androidPushConfig.categoryVivo=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: categoryVivo type is string, value: ${i}`),this)}setFcmChannelId(i){return S.isString(i)?(this._androidPushConfig.fcmChannelId=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: fcmChannelId type is string, value: ${i}`),this)}setFcmCollapseKey(i){return S.isString(i)?(this._androidPushConfig.fcmCollapseKey=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: fcmCollapseKey type is string, value: ${i}`),this)}setFcmImageUrl(i){return S.isString(i)?(this._androidPushConfig.fcmImageUrl=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: fcmImageUrl type is string, value: ${i}`),this)}setimportanceHonor(i){return i!=="LOW"&&i!=="NORMAL"?(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: importanceHonor value is NORMAL|LOW, value: ${i}`),this):(this._androidPushConfig.importanceHonor=i,this)}setimageUrlHonor(i){return S.isString(i)?(this._androidPushConfig.imageUrlHonor=i,this):(this._logger.error(n.L_CALLPLUS_SET_ANDROID_PUSH_CONFIG_O,`errorMsg: imageUrlHonor type is string, value: ${i}`),this)}build(){return this._androidPushConfig}}class me{constructor(i,e,t,s){C(this,"_videoConfig",{resolution:N.RCResolution.W640_H480,frameRate:N.RCFrameRate.FPS_15});C(this,"_audioConfig",{});C(this,"_callPlusStatistics");C(this,"_clientCallId","");C(this,"_isLaunchHangup",!1);C(this,"_needHangupCallId",null);C(this,"_callEngine");C(this,"_rtcModule");C(this,"_reportAppEventModule");this._context=i,this._logger=e,this._runtime=t,this._initOpts=s,this._reportAppEventModule=new Ke(e),this._callPlusStatistics=new be(this._logger,this._context),this._callEngine=new J(this._context,this._runtime,this._initOpts,this._logger,this._reportAppEventModule),this._rtcModule=new k(this._context,this._runtime,this._initOpts,this._logger,this._callEngine,this._reportAppEventModule),this._rtcModule.on(k.__INNER_RTC_PROCESS_FAILED__,this._rtcProcessFailHandle.bind(this)),this._rtcModule.on(k.__INNER_RTC_PEERCONNECTION_ABNORMAL_CLOSE__,this._peerConnectionAbnormalClose.bind(this)),this._rtcModule.on(k.__INNER_ON_SELF_JOINED__,this._selfJoinedHandle.bind(this)),this._rtcModule.on(k.__INNER_ON_OTHER_JOINED__,this._otherJoinedHandle.bind(this)),this._rtcModule.on(k.__INNER_RECEIVE_FIRST_FRAME__,this._receiveFirstFrameHandle.bind(this)),this._rtcModule.on(k.__INNER_ON_KICKOFF__,this._kickoffHandle.bind(this)),this._rtcModule.on(k.__INNER_ON_DEVICE_ENABLE_CHANGE__,this._receiveDeviceEnableChangeHandle.bind(this)),this._callEngine.on(J.__INNER_SESSION_CONNECT__,this._rtcModule.sessionConnected.bind(this._rtcModule)),this._callEngine.on(J.__INNER_SESSION_CLOSE__,this._sessionCloseHandle.bind(this)),this._callEngine.on(J.__INNER_CHANGE_MEDIA_TYPE__,this._rtcModule.changeMediaType.bind(this._rtcModule)),this._callEngine.on(J.__INNER_INVITE__,(r,o)=>{this._callPlusStatistics.reportStatisticsData(x.L_QS_RECEIVE_CALL_S,E.SUCCESS,+new Date,r,"",o)})}_rtcProcessFailHandle(i,e){const t=this._callEngine.getLocalMainSession();if(t){const s=t.getCallId();this._callEngine.systemStatusUp({callId:s,sysStatus:i,forward:z.CURRENT},e),this._callPlusStatistics.reportStatisticsData(x.L_QS_ABNORMAL_HANGUP_S,E.SUCCESS,+new Date,t),this.__innerHangup({callId:s,systemState:i},e)}}_peerConnectionAbnormalClose(i){const e=this._callEngine.getLocalMainSession();e&&(this._callEngine.systemStatusUp({callId:e.getCallId(),sysStatus:R.CONNECTION_ERR,forward:z.CURRENT},i),this._callEngine.endCurrentSession(R.CONNECTION_ERR,e.getCallId(),i))}async _selfJoinedHandle(i,e){const t=this._context.getCurrentId(),s=this._callEngine.getLocalMainSession();this._reportAppEventModule.onCallConnected(s);const r=this._rtcModule.getLocalVideoTrack(),o=this._rtcModule.getLocalAudioTrack(),a=r?!r.isOwnerMuted():!1,L=o?!o.isOwnerMuted():!1;this._callEngine.setUserDeviceEnable(t,U.VIDEO,a,e),this._callEngine.setUserDeviceEnable(t,U.AUDIO,L,e);const c=[{userId:t,userState:A.ONCALL,systemState:R.ONCALL,cameraEnable:a,microphoneEnable:L}];this._callEngine.updateUsersState(i,c,e),this._callEngine.startTimeCorrection(e)}_otherJoinedHandle(i,e){var r;let t="";const s=i.map(o=>(t=o.callId,{userId:o.userId,userState:A.ONCALL,systemState:R.ONCALL,cameraEnable:!1,microphoneEnable:!1}));this._callEngine.updateUsersState(t,s,e),((r=this._callEngine.getLocalMainSession())==null?void 0:r.getState())!==p.ONCALL&&this._callEngine.updateMainSessionState(p.ONCALL)}_receiveFirstFrameHandle(i){var e;((e=this._callEngine.getLocalMainSession())==null?void 0:e.getState())!==p.ONCALL&&this._callEngine.updateMainSessionState(p.ONCALL),this._callEngine.upFirstFrameTime(i)}_kickoffHandle(i,e,t){if(i===R.CONNECTION_ERR){this._callEngine.endCurrentSession(i,e,t);return}const s=this._callEngine.getLocalMainSession();if(s){const r=s.getCallId();this._callPlusStatistics.reportStatisticsData(x.L_QS_ABNORMAL_HANGUP_S,E.SUCCESS,+new Date,s,this._clientCallId),this._callEngine.systemStatusUp({callId:r,sysStatus:i,forward:z.CURRENT},t),this._callEngine.endCurrentSession(i,e,t)}}_receiveDeviceEnableChangeHandle(i,e){i.forEach(t=>{const s=t.getUserId(),r=t.isAudioTrack()?U.AUDIO:U.VIDEO;this._callEngine.setUserDeviceEnable(s,r,!t.isOwnerMuted(),e)})}_sessionCloseHandle(i,e){this._isLaunchHangup||(this._clientCallId=""),this._isLaunchHangup=!1,this._rtcModule.sessionClose(i,e)}setCallPlusEventListener(i){this._logger.info(n.L_CALLPLUS_CLIENT_SET_EVENT_LISTENER_O,i?Object.keys(i).join(","):null),this._reportAppEventModule.registerEventListener(i)}setStatusReportListener(i){this._logger.info(n.L_CALLPLUS_CLIENT_SET_STATUS_REPORT_LISTENER_O,i?Object.keys(i).join(","):null),this._rtcModule.setCallPlusStatusReportListener(i)}setVideoView(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_T,JSON.stringify({list:i.map(t=>{const{userId:s,videoElement:r,isTiny:o}=t;return{userId:s,elementName:r==null?void 0:r.nodeName,isTiny:o}})}),e),!S.notEmptyArray(i))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, list: not empty array, value: ${JSON.stringify(i)}`,e),{code:E.PARAM_ERROR};for(const t of i){const{userId:s,videoElement:r}=t;if(!S.notEmptyString(s))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, userId: not empty string, value: ${s}`,e),{code:E.PARAM_ERROR};if(!fe(r))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,`params err, videoElement: need a video element, value: ${r instanceof HTMLElement?r.nodeName:r}`,e),{code:E.PARAM_ERROR}}return this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_VIEW_R,"succes",e),this._rtcModule.setVideoView(i,e),{code:E.SUCCESS}}removeVideoView(i){const e=this._logger.createTraceId();return this._logger.info(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_T,JSON.stringify({userIds:i}),e),S.notEmptyArray(i)&&i.every(t=>S.notEmptyString(t))?(this._logger.info(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R,"succes",e),this._rtcModule.removeVideoView(i,e),{code:E.SUCCESS}):(this._logger.error(n.L_CALLPLUS_CLIENT_REMOVE_VIDEO_VIEW_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(i)}`,e),{code:E.PARAM_ERROR})}async playMedia(i,e){const t=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_T,JSON.stringify({userId:i,mediaType:e}),t),!S.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`params err, userId: not empty string, value: ${i}`,t),{code:E.PARAM_ERROR};if(S.isUndefined(U[e]))return this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`params err, mediaType is illegal, value: ${e}`,t),{code:E.PARAM_ERROR};if(e===U.AUDIO&&i===this._context.getCurrentId())return this._logger.info(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,"success",t),{code:E.SUCCESS};const{videoView:s}=this._rtcModule.getUserViewMap()[i]||{};return e!==U.AUDIO&&!s?(this._logger.error(n.L_CALLPLUS_CLIENT_PLAY_MEDIA_R,`errCode: ${E.VIDEO_VIEW_NOT_SET}, video view not set`,t),{code:E.VIDEO_VIEW_NOT_SET}):this._rtcModule.playMedia(i,e,s,t)}createVideoConfigBuilder(){return new Ie(this._logger)}setVideoConfig(i){this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_T,JSON.stringify(i));const{frameRate:e,resolution:t,maxBitrate:s,minBitrate:r}=i;if(!N.RCFrameRate[e])return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,`param error, frameRate is illegal, value: ${e}`),{code:E.PARAM_ERROR};if(!N.RCResolution[t])return this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,`param error, resolution is illegal, value: ${t}`),{code:E.PARAM_ERROR};const{code:o,errorMsg:a}=de(r,s);return o!==E.SUCCESS&&this._logger.error(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,a),this._logger.info(n.L_CALLPLUS_CLIENT_SET_VIDEO_CONFIG_R,"success"),this._videoConfig={...i},this._rtcModule.setVideoConfig(this._videoConfig),{code:E.SUCCESS}}createAudioConfigBuilder(){return new Te(this._logger)}createAndroidPushConfigBuilder(){return new ge(this._logger)}setAudioConfig(i){this._logger.info(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_T,JSON.stringify(i));const{sampleRate:e,minBitrate:t,maxBitrate:s}=i;if(e&&!S.isNumber(e))return this._logger.error(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,`param error, sampleRate: type is number, value: ${e}`),{code:E.PARAM_ERROR};const{code:r,errorMsg:o}=de(t,s);return r!==E.SUCCESS&&this._logger.error(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,o),this._logger.info(n.L_CALLPLUS_CLIENT_SET_AUDIO_CONFIG_R,"success"),this._audioConfig={...i},this._rtcModule.setAudioConfig(this._audioConfig),{code:E.SUCCESS}}async startCall(i,e=M.SINGLE,t=U.AUDIO_VIDEO,s,r){this._clientCallId=S.getUUID();const o=+new Date,a=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_T,`userIds: ${i.join(",")}, callType: ${e}, mediaType: ${t}, pushConfig: ${s}, extra: ${r}`,a),this._context.getConnectionStatus()!==S.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${E.SIGNAL_DISCONNECTED}`,a),{code:E.SIGNAL_DISCONNECTED};const L=this._context.getNaviInfo();if(!L||!se(L))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${E.RTC_SERVICE_UNAVAILABLE}`,a),{code:E.RTC_SERVICE_UNAVAILABLE};if(!(S.notEmptyArray(i)&&i.every(d=>S.notEmptyString(d))))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(i)}`,a),{code:E.PARAM_ERROR};if(S.isUndefined(M[e]))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, callType is illegal, value: ${e}`,a),{code:E.PARAM_ERROR};if(S.isUndefined(U[t]))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, mediaType is illegal, value: ${t}`,a),{code:E.PARAM_ERROR};if(s){const d=te(s);if(d.code!==E.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, pushConfig is illegal, msg: ${d.errorMsg}`,a),{code:E.PARAM_ERROR}}if(r){if(!S.isString(r))return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, extra is illegal, value: ${r}`,a),{code:E.PARAM_ERROR};if(Ae(r)>Ne)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,"params err, extra max size is 128KB",a),{code:E.PARAM_ERROR}}if(i.length>1&&e===M.SINGLE)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`params err, You can only call one person in a single call, userIds: ${i.join(",")}`,a),{code:E.PARAM_ERROR};if(this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`errCode: ${E.SESSION_EXIST}, session exist`,a),{code:E.SESSION_EXIST};const{code:c}=await this._rtcModule.createCallMediaTracks(t,a);if(c!==E.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`create meida tracks error code: ${c}`,a),{code:c};const{code:l,data:T}=await this._callEngine.startCall({toUsers:i.map(d=>({userId:d})),callType:e,mediaType:t,callId:this._clientCallId,pushConfig:s,extra:JSON.stringify({userId:this._context.getCurrentId(),extra:r})},a);if(this._callPlusStatistics.reportStatisticsData(x.L_QS_START_CALL_S,l,o,null,this._clientCallId,null,{mediaType:t,callType:e,callId:(T==null?void 0:T.callId)||""}),l!==E.SUCCESS)return this._rtcModule.destroyAllTracks(a),this._logger.error(n.L_CALLPLUS_CLIENT_START_CALL_R,`signal error code: ${l}`,a),{code:l};const{callId:I,clientCallId:h}=T;return this._needHangupCallId===h?(this._callEngine.clearAllTimer(I,a),this._callEngine.hangup({callId:I},a),this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_R,`the ${I} call has been hangup`,a),{code:E.SUCCESS}):(e===M.MULTI&&await this._rtcModule.sessionConnected(I,a),this._logger.info(n.L_CALLPLUS_CLIENT_START_CALL_R,JSON.stringify({data:T,code:l}),a),{code:E.SUCCESS,callId:I})}async joinMultiCall(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_T,`callId: ${i}`,e),this._context.getConnectionStatus()!==S.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${E.SIGNAL_DISCONNECTED}`,e),{code:E.SIGNAL_DISCONNECTED};const t=this._context.getNaviInfo();if(!t||!se(t))return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${E.RTC_SERVICE_UNAVAILABLE}`,e),{code:E.RTC_SERVICE_UNAVAILABLE};if(!S.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`params err, callId: not empty string, value: ${i}`,e),{code:E.PARAM_ERROR};const{code:s,data:r}=await this._callEngine.getCallSession({callId:i},e);if(s!==E.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`get call data error, code: ${s}`,e),{code:s};const{mediaType:o}=r,a=this._callEngine.getLocalMainSession();if(a&&a.getCallId()!==i)return{code:E.SESSION_EXIST};const{code:L}=await this._rtcModule.createCallMediaTracks(o,e);if(L!==E.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`create meida tracks error code: ${L}`,e),{code:L};const{code:c}=await this._callEngine.joinCall({callId:i,mediaType:o},e);return c!==E.SUCCESS?(this._rtcModule.destroyAllTracks(e),this._logger.error(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`signal error code: ${c}`,e),{code:c}):(this._logger.info(n.L_CALLPLUS_CLIENT_JOIN_MULTI_CALL_R,`code: ${E.SUCCESS}`,e),await this._rtcModule.sessionConnected(i,e),{code:E.SUCCESS})}async invite(i,e,t){var L;const s=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_INVITE_T,`callId: ${i.join(",")}, pushConfig: ${e}, extra: ${t}`,s),!(S.notEmptyArray(i)&&i.every(c=>S.notEmptyString(c))))return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`params err, userIds: not empty array, userId: not empty string, value: ${JSON.stringify(i)}`,s),{code:E.PARAM_ERROR};if(e){const c=te(e);if(c.code!==E.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`params err, pushConfig is illegal, msg: ${c.errorMsg}`,s),{code:E.PARAM_ERROR}}if(t){if(!S.isString(t))return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`params err, extra is illegal, value: ${t}`,s),{code:E.PARAM_ERROR};if(Ae(t)>Ne)return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,"params err, extra max size is 128KB",s),{code:E.PARAM_ERROR}}const{code:r,data:o}=await this._callEngine.invite({toUsers:i.map(c=>({userId:c})),pushConfig:e,extra:JSON.stringify({userId:this._context.getCurrentId(),extra:t})},s);if(r!==E.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_INVITE_R,`signal error code: ${r}`,s),{code:r};const a=[];return(L=o.busylineUsers)!=null&&L.length&&a.push(...o.busylineUsers.map(c=>({userId:c.userId,state:c.sessionStatus}))),this._logger.info(n.L_CALLPLUS_CLIENT_INVITE_R,`success busyUsers: ${JSON.stringify(a)}`,s),{code:E.SUCCESS,busyUsers:a}}async accept(i,e){const t=+new Date,s=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_ACCEPT_T,`callId: ${i}, pushConfig: ${e}`,s),this._context.getConnectionStatus()!==S.RCConnectionStatus.CONNECTED)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode: ${E.SIGNAL_DISCONNECTED}`,s),{code:E.SIGNAL_DISCONNECTED};const r=this._context.getNaviInfo();if(!r||!se(r))return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode: ${E.RTC_SERVICE_UNAVAILABLE}`,s),{code:E.RTC_SERVICE_UNAVAILABLE};if(!S.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`params err, callId: not empty string, value: ${i}`,s),{code:E.PARAM_ERROR};if(e){const I=te(e);if(I.code!==E.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`params err, pushConfig is illegal, msg: ${I.errorMsg}`,s),{code:E.PARAM_ERROR}}const o=this._callEngine.getLocalMainSession(),a=this._callEngine.getHoldSession(i);if(!o&&!a)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`errCode : ${E.NOT_IN_CALL}, session not exist`,s),{code:E.NOT_IN_CALL};if(i===(a==null?void 0:a.getCallId())){const{code:I}=await this.hangup(o.getCallId());if(I!==E.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`hangup mainSession error code: ${I}`,s),{code:I};this._callEngine.upgradeMainSession(i)}const c=o.getMediaType(),{code:l}=await this._rtcModule.createCallMediaTracks(c,s);if(l!==E.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`create meida tracks error code: ${l}`,s),{code:l};const{code:T}=await this._callEngine.accept({callId:i},s);return this._callPlusStatistics.reportStatisticsData(x.L_QS_ACCEPT_CALL_S,T,t,o),T!==E.SUCCESS?(this._rtcModule.destroyAllTracks(s),this._logger.error(n.L_CALLPLUS_CLIENT_ACCEPT_R,`signal error code: ${T}`,s),{code:T}):(this._logger.info(n.L_CALLPLUS_CLIENT_ACCEPT_R,"success",s),this._rtcModule.sessionConnected(i,s),{code:E.SUCCESS})}async __innerHangup(i,e){var r;const{callId:t}=i;this._callEngine.setIsLocalClientHangup(!0),this._callEngine.clearAllTimer(t,e);const{code:s}=await this._callEngine.hangup(i,e);return s===Oe.CALL_NOT_EXIST?{code:E.SUCCESS}:(s===E.SUCCESS&&t===((r=this._callEngine.getLocalMainSession())==null?void 0:r.getCallId())&&await this._rtcModule.sessionClose(t,e),{code:s})}async hangup(i,e){const t=+new Date,s=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_HANGUP_T,`callId: ${i}, pushConfig: ${e}`,s);const r=this._callEngine.getLocalMainSession();if(!r)return{code:E.NOT_IN_CALL};if(i&&!S.isString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, callId: type is string, value: ${i}`,s),{code:E.PARAM_ERROR};if(e){const d=te(e);if(d.code!==E.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, pushConfig is illegal, msg: ${d.errorMsg}`,s),{code:E.PARAM_ERROR}}const o=r.getCallId();if(i&&i!==o&&!this._callEngine.getHoldSession(i))return this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`params err, callId is invalid, value: ${i}`,s),{code:E.CALL_ID_INVALID};this._isLaunchHangup=!0,this._needHangupCallId=i||o;const L=this._callEngine.getHoldSession(this._needHangupCallId)||r,c=this._context.getCurrentId(),l=r.getUserList().filter(d=>d.userId===c)[0].state,T=[r.getCreatorUserId(),r.getInviterUserId()].includes(c),I=De(l,T),{code:h}=await this.__innerHangup({callId:this._needHangupCallId,systemState:I,pushConfig:e},s);return this._callPlusStatistics.reportStatisticsData(x.L_QS_HANGUP_CALL_S,h,t,L,this._clientCallId),h!==E.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_HANGUP_R,`signal error code : ${h}`,s),{code:h}):(this._needHangupCallId=null,this._logger.info(n.L_CALLPLUS_CLIENT_HANGUP_R,"success",s),{code:E.SUCCESS})}async requestChangeMediaType(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_T,`mediaType: ${i}`,e),S.isUndefined(U[i]))return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`params err, mediaType is illegal, value: ${i}`,e),{code:E.PARAM_ERROR};const t=this.getCurrentCallSession(),s=t==null?void 0:t.getMediaType();if(i===s)return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`error code: ${E.MEDIATYPE_INVALID}`,e),{code:E.MEDIATYPE_INVALID};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`error code : ${E.NOT_IN_CALL}, session not exist`,e),{code:E.NOT_IN_CALL};const r=t==null?void 0:t.getUserList().filter(L=>L.userId!==this._context.getCurrentId()).map(L=>L.userId),{code:o,data:a}=await this._callEngine.requestChangeMediaType({mediaType:i,toUserIds:r||[]},e);return o!==E.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`signal error code: ${o}`,e),{code:o}):(this._logger.info(n.L_CALLPLUS_CLIENT_REQUEST_CHANGE_MEDIA_TYPE_R,`success transactionId: ${a.transactionId}`,e),{code:E.SUCCESS,transactionId:a.transactionId})}async cancelChangeMediaType(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_T,`transactionId: ${i}`,e),!S.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`param error, transactionId: not empty string, value: ${i}`,e),{code:E.PARAM_ERROR};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`error code : ${E.NOT_IN_CALL}, session not exist`,e),{code:E.NOT_IN_CALL};const{code:t}=await this._callEngine.cancelChangeMediaType({transactionId:i},e);return t!==E.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,`signal error code: ${t}`,e),{code:t}):(this._logger.info(n.L_CALLPLUS_CLIENT_CANCEL_CHANGE_MEDIA_TYPE_R,"success",e),{code:E.SUCCESS})}async replyChangeMediaType(i,e){const t=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_T,`transactionId: ${i}`,t),!S.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`param error, transactionId: not empty string, value: ${i}`,t),{code:E.PARAM_ERROR};if(!S.isBoolean(e))return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`param error, isAgree: type is boolean, value: ${e}`,t),{code:E.PARAM_ERROR};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`error code : ${E.NOT_IN_CALL}, session not exist`,t),{code:E.NOT_IN_CALL};const{code:s}=await this._callEngine.responseChangeMediaType({transactionId:i,agree:e},t);return s!==E.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,`signal error: ${s}`,t),{code:s}):(this._logger.info(n.L_CALLPLUS_CLIENT_REPLY_CHANGE_MEDIA_TYPE_R,"success",t),{code:E.SUCCESS})}getCurrentCallSession(){return this._callEngine.getLocalMainSession()}async getAvailableCallRecordsFromServer(){const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_T,"",i);const{code:e,data:t}=await this._callEngine.getOpenCallList(i);return e!==E.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R,`signal error code: ${e}`,i),{code:e}):(this._logger.info(n.L_CALLPLUS_CLIENT_GET_AVAILABLE_CALL_RECORDS_FROM_SERVER_R,`success, data: ${JSON.stringify(t)}`,i),{code:E.SUCCESS,records:t})}async getCallRecords(i,e,t=0){const s=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_T,`startTimestamp: ${i}, count: ${e}`,s),!(S.isNumber(i)&&i>=0))return this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`params error, startTimestamp: is a number >= 0, value: ${i}`,s),{code:E.PARAM_ERROR};if(!(S.isNumber(e)&&e>0))return this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`params error, count: is a number >= 0, value: ${e}`,s),{code:E.PARAM_ERROR};const{code:r,data:o}=await this._callEngine.getCallLogList({timestamp:i,count:e,order:t},s);return r!==E.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,`signal error code: ${r}`,s),{code:r}):(this._logger.info(n.L_CALLPLUS_CLIENT_GET_CALL_RECORDS_R,"success",s),{code:E.SUCCESS,result:o})}async deleteCallRecordsFromServer(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_T,`callIds: ${i.join(",")}`,e),!(S.notEmptyArray(i)&&i.every(s=>S.notEmptyString(s))))return this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,`params err, callIds: not empty array, callId: not empty string, callIds: ${JSON.stringify(i)}`,e),{code:E.PARAM_ERROR};const{code:t}=await this._callEngine.deleteCallLog(i,e);return t!==E.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,`signal error code: ${t}`,e),{code:t}):(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_CALL_RECORDS_BY_CALLID_R,"success",e),{code:E.SUCCESS})}async deleteAllCallRecordsFromServer(){const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_T,"",i);const{code:e}=await this._callEngine.removeAllCallLog(i);return e!==E.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R,`signal error code: ${e}`,i),{code:e}):(this._logger.info(n.L_CALLPLUS_CLIENT_DELETE_ALL_CALL_RECORDS_FROM_SERVER_R,"success",i),{code:E.SUCCESS})}async startCamera(){var r;const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_T,"",i);const{code:e,track:t}=await this._rtcModule.getCameraVideoTrack(i);if(e!==E.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`create video track error code: ${e}`,i),{code:e};if(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),U.VIDEO,!0,i),!(t!=null&&t.isPublished())&&((r=this._callEngine.getLocalMainSession())==null?void 0:r.getState())===p.ONCALL){const{code:o}=await this._rtcModule.publishVideoTrack();return o!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`publish error code: ${o}`,i),{code:o}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_R,"success",i),{code:E.SUCCESS})}const{code:s}=await this._rtcModule.enableVideoTrack(i);return s!==N.RCRTCCode.SUCCESS&&s!==E.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_CAMERA_R,`signal error code: ${s}`,i),{code:s}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_CAMERA_R,"success",i),{code:E.SUCCESS})}async stopCamera(){const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_STOP_CAMERA_T,"",i);const{code:e,track:t}=await this._rtcModule.disableVideoTrack();return e!==E.SUCCESS&&e!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_STOP_CAMERA_R,`error code: ${e}`,i),{code:e}):(this._rtcModule.destroyTrack(t),this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),U.VIDEO,!1,i),this._logger.info(n.L_CALLPLUS_CLIENT_STOP_CAMERA_R,"success",i),{code:E.SUCCESS})}async switchCamera(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_T,`cameraId: ${i}`,e),!S.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`param error, cameraId: not empty string, value: ${i}`,e),{code:E.PARAM_ERROR};const t=this._callEngine.getLocalMainSession();if(!t)return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`errCode: ${E.NOT_IN_CALL}`,e),{code:E.NOT_IN_CALL};if(t.getMediaType()===U.AUDIO)return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`errCode: ${E.NOT_VIDEO_CALL}`,e),{code:E.NOT_VIDEO_CALL};this._videoConfig.cameraId=i,this._rtcModule.setVideoConfig(this._videoConfig);const{code:s}=await this._rtcModule.changeVideoDevice(e);return s!==E.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,`call client changeVideoDevice error code: ${s}`,e),{code:s}):(this._logger.info(n.L_CALLPLUS_CLIENT_SWITCH_CAMERA_R,"success",e),{code:E.SUCCESS})}async startMicrophone(){const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_T,"",i);const{code:e,track:t}=await this._rtcModule.getMicrophoneAudioTrack(i);if(e!==E.SUCCESS)return this._logger.error(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,`create microphone audio track error code: ${e}`,i),{code:e};if(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),U.AUDIO,!0,i),!t.isOwnerMuted())return this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,"success",i),{code:E.SUCCESS};const s=await t.unmute();return s!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,`signal error code: ${e}`,i),{code:s}):(this._logger.info(n.L_CALLPLUS_CLIENT_START_MICROPHONE_R,"success",i),{code:E.SUCCESS})}async stopMicrophone(){const i=this._logger.createTraceId();this._logger.info(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_T,"",i);const{code:e}=await this._rtcModule.disableAudioTrack();return e!==E.SUCCESS&&e!==N.RCRTCCode.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R,`signal error code: ${e}`,i),{code:e}):(this._callEngine.setUserDeviceEnable(this._context.getCurrentId(),U.AUDIO,!1,i),this._logger.info(n.L_CALLPLUS_CLIENT_STOP_MICROPHONE_R,"success",i),{code:E.SUCCESS})}isMicrophoneEnabled(){const i=this._rtcModule.getLocalAudioTrack();return!!i&&!i.isOwnerMuted()}async setAllRemoteAudioEnable(i){const e=this._logger.createTraceId();return this._rtcModule.setAllRemoteAudioEnable(i,e)}getVersion(){return"2.1.1"}async getCameras(){return await N.device.getCameras()}async getMicrophones(){return await N.device.getMicrophones()}getRTCSessionId(){return this._rtcModule.getRTCSessionId()}async switchMicrophone(i){const e=this._logger.createTraceId();if(this._logger.info(n.L_CALLPLUS_CLIENT_SWITCH_MICROPHONE_T,`microphoneId: ${i}`,e),!S.notEmptyString(i))return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_MICROPHONE_R,`param error, microphoneId: not empty string, value: ${i}`,e),{code:E.PARAM_ERROR};if(!this._callEngine.getLocalMainSession())return this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_MICROPHONE_R,`errCode: ${E.NOT_IN_CALL}`,e),{code:E.NOT_IN_CALL};this._audioConfig.microphoneId=i,this._rtcModule.setAudioConfig(this._audioConfig);const{code:s}=await this._rtcModule.changeAudioDevice(e);return s!==E.SUCCESS?(this._logger.error(n.L_CALLPLUS_CLIENT_SWITCH_MICROPHONE_R,`call client changeAudioDevice error code: ${s}`,e),{code:s}):(this._logger.info(n.L_CALLPLUS_CLIENT_SWITCH_MICROPHONE_R,"success",e),{code:E.SUCCESS})}}const je=_=>_?S.isObject(_)?Object.keys(_).includes("rtcClient")?S.isObject(_.rtcClient)?{isLegal:!0}:{isLegal:!1,msg:"Initialization 'rtcClient' parameter must be of type 'object'"}:{isLegal:!1,code:E.NOT_INSTALL_RTC_PLUGIN}:{isLegal:!1,msg:"Initialization options must be an object"}:{isLegal:!1,msg:"Initialization missing parameter -> options"},qe={tag:"RCCallPlus",verify(_){return S.VersionManage.add("plugin-call-plus","2.1.1"),S.VersionManage.validEngine("5.8.2")?!0:(console.error(`The current engine version '${S.VersionManage.getInfo().engine}' error, plugin-call-plus required engine version at least '5.8.2'.`),!1)},setup(_,i,e){const t=je(e);if(!t.isLegal)throw new Error(`[CallPlusLib installer steup]${t.msg}`);const s=_.createLogger("CallPlusLib","RTC"),r=S.isUndefined(e.logOutputLevel)?S.LogL.WARN:e.logOutputLevel;return s.setOutputLevel(r),s.warn(n.L_INDEX_INSTALL_CALL_PLUS_PLUGIN_O,"CallPlus Version: 2.1.1, Commit: c60b5ff4754bb8baf1c04c67078adbd6bdaea06a"),new me(_,s,i,e)}};Object.defineProperty(m,"RCCallPlusFrameRate",{enumerable:!0,get:()=>N.RCFrameRate}),Object.defineProperty(m,"RCCallPlusResolution",{enumerable:!0,get:()=>N.RCResolution}),m.RCAudioConfigBuilder=Te,m.RCCallPlusAndroidPushConfigBuilder=ge,m.RCCallPlusCallState=p,m.RCCallPlusClient=me,m.RCCallPlusCode=E,m.RCCallPlusMediaType=U,m.RCCallPlusMediaTypeChangeResult=F,m.RCCallPlusReason=R,m.RCCallPlusSession=K,m.RCCallPlusSessionUserState=A,m.RCCallPlusType=M,m.RCVideoConfigBuilder=Ie,m.installer=qe,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"})});
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxTZXNzaW9uU3RhdGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvYXBpL2VudW1zL1JDQ2FsbFBsdXNSZWFzb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNBdWRpb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNWaWRlb0NvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9oZWxwZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9SQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvUkNDYWxsUEx1c1N0YXRpc3RpY3MudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9EaWFsb2dUeXBlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvU2VjcmV0Q2FsbFR5cGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JDQ2FsbElubmVyU2Vzc2lvbi50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL0NhbGxTZXJ2ZXJBY3Rpb24udHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy90aW1lcnMudHMiLCIuLi8uLi8uLi9zcmMvY29yZS91dGlscy9yZXRyeS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2ludGVyZmFjZXMvSUNhbGxIb29rcy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2FwaS9jb25zdGFudHMudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1NpZ25hbFRyYW5zcG9ydGVyLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvdXRpbHMvcmFuZG9tLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvdXRpbHMvaW5kZXhEQi50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL21vZHVsZXMvQWJub3JtYWxDYWxsLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvZW51bXMvQ2FsbFNlcnZlckV2ZW50VHlwZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL1JDQ2FsbFBsdXNJbm5lckNvZGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1RpbWVDb3JyZWN0aW9uZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9Gb3J3YXJkVHlwZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2ludGVyZmFjZXMvSUNhbGxQbHVzU3RhdGlzdGljcy50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL1JDQ2FsbERpcmVjdGlvbi50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL1JDQ2FsbEVuZ2luZS50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL2VudW1zL1JUQ1Jlc291cmNlVGFnLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvbW9kdWxlcy9SVENNb2R1bGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9tb2R1bGVzL1JDQ2FsbFBsdXNSZXBvcnRNb2R1bGUudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9lbnVtcy9DYWxsU2VydmVyRXJyb3JDb2RlLnRzIiwiLi4vLi4vLi4vc3JjL2NvcmUvYXBpL1JDQ2FsbFBsdXNBbmRyb2lkUHVzaENvbmZpZ0J1aWxkZXIudHMiLCIuLi8uLi8uLi9zcmMvY29yZS9hcGkvUkNDYWxsUGx1c0NsaWVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3V0aWxzL3ZhbGlkYXRpb24udHMiLCIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZW51bVxuICovXG5leHBvcnQgY29uc3QgUkNDYWxsUGx1c0NvZGUgPSB7XG4gIC8qKlxuICAgKiDmiJDlip9cbiAgICovXG4gIFNVQ0NFU1M6IDAsXG4gIC8qKlxuICAgKiDlj4LmlbDplJnor69cbiAgICovXG4gIFBBUkFNX0VSUk9SOiA4MDAwMSxcbiAgLyoqXG4gICAqIOWtmOWcqOacque7k+adn+eahCBzZXNzaW9uXG4gICAqL1xuICBTRVNTSU9OX0VYSVNUOiA4MDAwMixcbiAgLyoqXG4gICAqIOacquWKoOWFpemAmuivnVxuICAgKi9cbiAgTk9UX0lOX0NBTEw6IDgwMDAzLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L6KKr56aB5q2iXG4gICAqL1xuICBNRURJQVRZUEVfSU5WQUxJRDogODAwMDQsXG4gIC8qKlxuICAgKiDlvZPliY3kuI3mmK/op4bpopHpgJror51cbiAgICovXG4gIE5PVF9WSURFT19DQUxMOiA4MDAwNSxcbiAgLyoqXG4gICAqIOW8gOmAmueahOmfs+inhumikeacjeWKoeayoeacieWPiuaXtueUn+aViOaIlumfs+inhumikeacjeWKoeW3suWFs+mXrVxuICAgKi9cbiAgUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEU6IDgwMDA2LFxuICAvKipcbiAgICog6LCD55So5Ye95pWw5pe277yM5Lyg5YWl55qE55So5oi35YiX6KGo5Li656m66ZSZ6K+vXG4gICAqL1xuICBVU0VSX0xJU1RfSU5WQUlMRDogODAwMDcsXG4gIC8qKlxuICAgKiDosIPnlKjlh73mlbDml7bvvIzkvKDlhaXnmoTpgJror50gSWQg5Li656m66ZSZ6K+vXG4gICAqL1xuICBDQUxMX0lEX0lOVkFMSUQ6IDgwMDA4LFxuICAvKipcbiAgICog5LqL5YqhIElkIOS4uuepuumUmeivr1xuICAgKi9cbiAgVFJBTlNBQ1RJT05fSURfSU5WQUxJRDogODAwMDksXG4gIC8qKlxuICAgKiDosIPnlKjlh73mlbDml7bvvIzkvKDlhaXnmoTnlKjmiLcgSWQg5Li656m66ZSZ6K+vXG4gICAqL1xuICBVU0VSX0lEX0lOVkFMSUQ6IDgwMDEwLFxuICAvKipcbiAgICog5Y+R6LW35Y2V5Lq65ZG85Y+r5pe277yM5Lq65ZGY5YiX6KGo5Lit5Y+q6IO95pyJ5LiA5Liq5Lq6XG4gICAqL1xuICBTSU5HTEVfQ0FMTF9OT1RfU1VQUE9SVF9NVUxUSV9QRVJTT046IDgwMDExLFxuICAvKipcbiAgICogaW0g5pyq6L+e5o6lXG4gICAqL1xuICBTSUdOQUxfRElTQ09OTkVDVEVEOiA4MDAxMixcbiAgLyoqXG4gICAqIOaRhOWDj+WktOacquaJk+W8gFxuICAgKi9cbiAgQ0FNRVJBX0NMT1NFRDogODAxMDAsXG4gIC8qKlxuICAgKiDpuqblhYvpo47mnKrmiZPlvIBcbiAgICovXG4gIE1JQ1JPUEhPTkVfQ0xPU0VEOiA4MDEwMSxcbiAgLyoqXG4gICAqIOaXoOWqkuS9k+i1hOa6kFxuICAgKi9cbiAgTUVESUFfUkVTT1VSQ0VfSU5WQUxJRUQ6IDgwMTAyLFxuICAvKipcbiAgICog5pyqIGluc3RhbGwgUlRDIOaPkuS7tlxuICAgKi9cbiAgTk9UX0lOU1RBTExfUlRDX1BMVUdJTjogODAxMDMsXG4gIC8qKlxuICAgKiDmkq3mlL7lvILluLhcbiAgICovXG4gIFBMQVlfTUVESUFfRkFJTEVEOiA4MDEwNCxcbiAgLyoqXG4gICAqIOaSreaUvuinhumikemcgOimgSB2aWRlbyDlhYPntKBcbiAgICovXG4gIFZJREVPX1ZJRVdfTk9UX1NFVDogODAxMDUsXG59IGFzIGNvbnN0O1xuIiwiZXhwb3J0IGVudW0gUkNDYWxsUGx1c0xvZ2dlclRhZyB7XG4gIExfSU5ERVhfSU5TVEFMTF9DQUxMX1BMVVNfUExVR0lOX08gPSAnTC1pbmRleF9pbnN0YWxsX2NhbGxfcGx1c19wbHVnaW4tTycsXG4gIC8qKlxuICAgKiDkuJrliqHlsYLkuovku7bms6jlhoxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9FVkVOVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF9ldmVudF9saXN0ZW5lci1PJyxcbiAgLyoqXG4gICAqIOS4muWKoeWxguS6i+S7tuiwg+eUqFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbGxfZXZlbnRfbGlzdGVuZXItTycsXG4gIC8qKlxuICAgKiDpgJror53otKjph4/mlbDmja7nm5HlkKzms6jlhoxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9TVEFUVVNfUkVQT1JUX0xJU1RFTkVSX08gPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3N0YXR1c19yZXBvcnRfbGlzdGVuZXItTycsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfU1RBVFVTX1JFUE9SVF9MSVNURU5FUl9PID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbGxfc3RhdHVzX3JlcG9ydF9saXN0ZW5lci1PJyxcbiAgLyoqXG4gICAqIOiuvue9ruaRhOWDj+WktOinhumikemFjee9rumhuVxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF92aWRlb19jb25maWctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zZXRfdmlkZW9fY29uZmlnLVInLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfRlJBTUVfUkFURV9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9mcmFtZV9yYXRlLU8nLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfUkVTT0xVVElPTl9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9yZXNvbHV0aW9uLU8nLFxuICBMX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfQklUUkFURV9PID0gJ0wtY2FsbHBsdXNfdmlkZW9fY29uZmlnX3NldF9iaXRyYXRlLU8nLFxuICAvKipcbiAgICog6K6+572u6bqm5YWL6aOO6Z+z6aKR6YWN572u6aG5XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TRVRfQVVESU9fQ09ORklHX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X2F1ZGlvX2NvbmZpZy1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3NldF9hdWRpb19jb25maWctUicsXG4gIExfQ0FMTFBMVVNfQVVESU9fQ09ORklHX1NFVF9CSVRSQVRFX08gPSAnTC1jYWxscGx1c19hdWRpb19jb25maWdfc2V0X2JpdHJhdGUtTycsXG4gIExfQ0FMTFBMVVNfQVVESU9fQ09ORklHX1NFVF9TQU1QTEVfUkFURV9PID0gJ0wtY2FsbHBsdXNfYXVkaW9fY29uZmlnX3NldF9zYW1wbGVfcmF0ZS1PJyxcbiAgLyoqXG4gICAqIOmihOiniFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfUFJFVklFV19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3ByZXZpZXctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1BSRVZJRVdfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9wcmV2aWV3LVInLFxuICAvKipcbiAgICog5byA5aeL5ZG85Y+rXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc3RhcnRfY2FsbC1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X2NhbGwtUicsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror53ku7vliqFcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2pvaW5fbXVsdGlfY2FsbC1UJyxcbiAgLyoqXG4gICAqIOWKoOWFpemAmuivnee7k+aenFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IgPSAnTC1jYWxscGx1c19jbGllbnRfam9pbl9tdWx0aV9jYWxsLVInLFxuICAvKipcbiAgICog5o6l5ZCs6YCa6K+d5Lu75YqhXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9hY2NlcHQtVCcsXG4gIC8qKlxuICAgKiDmjqXlkKzpgJror53nu5PmnpxcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2FjY2VwdC1SJyxcbiAgLyoqXG4gICAqIOaMguaWrVxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1QgPSAnTC1jYWxscGx1c19jbGllbnRfaGFuZ3VwLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9oYW5ndXAtUicsXG4gIC8qKlxuICAgKiDpgoDor7dcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2ludml0ZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1IgPSAnTC1jYWxscGx1c19jbGllbnRfaW52aXRlLVInLFxuICAvKipcbiAgICog5Y+R6LW35aqS5L2T57G75Z6L5YiH5o2i6K+35rGCXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1QgPSAnTC1jYWxscGx1c19jbGllbnRfcmVxdWVzdF9jaGFuZ2VfbWVkaWFfdHlwZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcXVlc3RfY2hhbmdlX21lZGlhX3R5cGUtUicsXG4gIC8qKlxuICAgKiDlj5bmtojlqpLkvZPnsbvlnovliIfmjaLor7fmsYJcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2NhbmNlbF9jaGFuZ2VfbWVkaWFfdHlwZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1IgPSAnTC1jYWxscGx1c19jbGllbnRfY2FuY2VsX2NoYW5nZV9tZWRpYV90eXBlLVInLFxuICAvKipcbiAgICog5aqS5L2T57G75Z6L5YiH5o2i5bqU562UXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcGx5X2NoYW5nZV9tZWRpYV90eXBlLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlcGx5X2NoYW5nZV9tZWRpYV90eXBlLVInLFxuICAvKipcbiAgICog6I635Y+W5b2T5YmN6L+b6KGM5Lit55qE6YCa6K+d5Lu75YqhXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQ1VSUkVOVF9DQUxMX1NFU1NJT05fVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfY3VycmVudF9jYWxsX3Nlc3Npb24tVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DVVJSRU5UX0NBTExfU0VTU0lPTl9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2dldF9jdXJyZW50X2NhbGxfc2Vzc2lvbi1SJyxcbiAgLyoqXG4gICAqIOiOt+WPluacque7k+adn+eahOmAmuivneWIl+ihqFxuICAgKiBBdmFpbGFibGVDYWxsU2Vzc2lvbnNGcm9tU2VydmVyXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQVZBSUxBQkxFX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2dldF9hdmFpbGFibGVfY2FsbF9zZXNzaW9uc19mcm9tX3NlcnZlci1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfYXZhaWxhYmxlX2NhbGxfc2Vzc2lvbnNfZnJvbV9zZXJ2ZXItUicsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53orrDlvZVcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9nZXRfY2FsbF9yZWNvcmRzLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9HRVRfQ0FMTF9SRUNPUkRTX1IgPSAnTC1jYWxscGx1c19jbGllbnRfZ2V0X2NhbGxfcmVjb3Jkcy1SJyxcbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg5riF55CG6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9jYWxsX3JlY29yZHNfYnlfY2FsbElkLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9jYWxsX3JlY29yZHNfYnlfY2FsbElkLVInLFxuICAvKipcbiAgICog5riF55CG5omA5pyJ6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9hbGxfY2FsbF9yZWNvcmRzX2Zyb21fc2VydmVyLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X2RlbGV0ZV9hbGxfY2FsbF9yZWNvcmRzX2Zyb21fc2VydmVyLVInLFxuICAvKipcbiAgICog5omT5byA5pGE5YOP5aS0XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdGFydF9jYW1lcmEtVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTUVSQV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X2NhbWVyYS1SJyxcbiAgLyoqXG4gICAqIOWFs+mXreaRhOWDj+WktFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdG9wX2NhbWVyYS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9DQU1FUkFfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zdG9wX2NhbWVyYS1SJyxcbiAgLyoqXG4gICAqIOWIh+aNouaRhOWDj+WktFxuICAgKi9cbiAgTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N3aXRjaF9jYW1lcmEtVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiA9ICdMLWNhbGxwbHVzX2NsaWVudF9zd2l0Y2hfY2FtZXJhLVInLFxuICAvKipcbiAgICog5omT5byA6bqm5YWL6aOOXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc3RhcnRfbWljcm9waG9uZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0YXJ0X21pY3JvcGhvbmUtUicsXG4gIC8qKlxuICAgKiDlhbPpl63puqblhYvpo45cbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfTUlDUk9QSE9ORV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N0b3BfbWljcm9waG9uZS1UJyxcbiAgTF9DQUxMUExVU19DTElFTlRfU1RPUF9NSUNST1BIT05FX1IgPSAnTC1jYWxscGx1c19jbGllbnRfc3RvcF9taWNyb3Bob25lLVInLFxuICAvKipcbiAgICog5YiH5o2i6bqm5YWL6aOOXG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfTUlDUk9QSE9ORV9UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N3aXRjaF9taWNyb3Bob25lLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfTUlDUk9QSE9ORV9SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3N3aXRjaF9taWNyb3Bob25lLVInLFxuICAvKipcbiAgICog6K6+572uIHZpZGVvIHZpZXdcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1QgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3ZpZGVvX3ZpZXctVCcsXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IgPSAnTC1jYWxscGx1c19jbGllbnRfc2V0X3ZpZGVvX3ZpZXctUicsXG4gIExfUlRDX01PRFVMRV9TRVRfVklERU9fVklFV19PID0gJ0wtcnRjX21vZHVsZV9zZXRfdmlkZW9fdmlldy1PJyxcbiAgLyoqXG4gICAqIOWIoOmZpCB2aWRlbyB2aWV3XG4gICAqL1xuICBMX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19UID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlbW92ZV92aWRlb192aWV3LVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19SID0gJ0wtY2FsbHBsdXNfY2xpZW50X3JlbW92ZV92aWRlb192aWV3LVInLFxuICBMX1JUQ19NT0RVTEVfUkVNT1ZFX1ZJREVPX1ZJRVdfTyA9ICdMLXJ0Y19tb2R1bGVfcmVtb3ZlX3ZpZGVvX3ZpZXctTycsXG4gIC8qKlxuICAgKiDmkq3mlL7lqpLkvZNcbiAgICovXG4gIExfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfVCA9ICdMLWNhbGxwbHVzX2NsaWVudF9wbGF5X21lZGlhLVQnLFxuICBMX0NBTExQTFVTX0NMSUVOVF9QTEFZX01FRElBX1IgPSAnTC1jYWxscGx1c19jbGllbnRfcGxheV9tZWRpYS1SJyxcbiAgTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfVCA9ICdMLXJ0Y19tb2R1bGVfcGxheV9tZWRpYS1UJyxcbiAgTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiA9ICdMLXJ0Y19tb2R1bGVfcGxheV9tZWRpYS1SJyxcbiAgLyoqXG4gICAqIOmdmemfs+i/nOerr+mfs+mikVxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1NFVF9BTExfUkVNT1RFX0FVRElPX0VOQUJMRV9UID0gJ0wtcnRjX21vZHVsZV9zZXRfYWxsX3JlbW90ZV9hdWRpb19lbmJhbGUtVCcsXG4gIExfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfUiA9ICdMLXJ0Y19tb2R1bGVfc2V0X2FsbF9yZW1vdGVfYXVkaW9fZW5hYmxlLVInLFxuICAvKipcbiAgICog6K6i6ZiFXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfU1VCU0NSSUJFX1QgPSAnTC1ydGNfbW9kdWxlX3N1YnNjcmliZS1UJyxcbiAgTF9SVENfTU9EVUxFX1NVQlNDUklCRV9SID0gJ0wtcnRjX21vZHVsZV9zdWJzY3JpYmUtUicsXG4gIC8qKlxuICAgKiDlj5bmtojorqLpmIVcbiAgICovXG4gIExfUlRDX01PRFVMRV9VTlNVQlNDUklCRV9UID0gJ0wtcnRjX21vZHVsZV91bnN1YnNjcmliZS1UJyxcbiAgTF9SVENfTU9EVUxFX1VOU1VCU0NSSUJFX1IgPSAnTC1ydGNfbW9kdWxlX3Vuc3Vic2NyaWJlLVInLFxuICAvKipcbiAgICog5Li75Yqo5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUFVCTElTSF9UID0gJ0wtcnRjX21vZHVsZV9wdWJsaXNoLVQnLFxuICBMX1JUQ19NT0RVTEVfUFVCTElTSF9SID0gJ0wtcnRjX21vZHVsZV9wdWJsaXNoLVInLFxuICAvKipcbiAgICog5Y+W5raI5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfVU5QVUJMSVNIX1QgPSAnTC1ydGNfbW9kdWxlX3VucHVibGlzaC1UJyxcbiAgTF9SVENfTU9EVUxFX1VOUFVCTElTSF9SID0gJ0wtcnRjX21vZHVsZV91bnB1Ymxpc2gtUicsXG4gIC8qKlxuICAgKiDplIDmr4HmiYDmnInpn7Pop4bpopHotYTmupBcbiAgICovXG4gIExfUlRDX01PRFVMRV9ERVNUUk9ZX0FMTF9UUkFDS1NfTyA9ICdMLXJ0Y19tb2R1bGVfZGVzdHJveV9hbGxfdHJhY2tzLU8nLFxuICAvKipcbiAgICogc2Vzc2lvbiDlu7rnq4vlkI4gUlRDIOaooeWdl+eahOWkhOeQhlxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1NFU1NJT05fQ09OTkVDVF9UID0gJ0wtcnRjX21vZHVsZV9zZXNzaW9uX2Nvbm5lY3QtVCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUCA9ICdMLXJ0Y19tb2R1bGVfc2Vzc2lvbl9jb25uZWN0LVAnLFxuICBMX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY29ubmVjdC1SJyxcbiAgLyoqXG4gICAqIHNlc3Npb24g57uT5p2f5ZCOIFJUQyDmqKHlnZfnmoTlpITnkIZcbiAgICovXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1QgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtVCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1AgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtUCcsXG4gIExfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IgPSAnTC1ydGNfbW9kdWxlX3Nlc3Npb25fY2xvc2UtUicsXG4gIC8qKlxuICAgKiDliJvlu7rop4bpopHotYTmupBcbiAgICovXG4gIExfUlRDX01PRFVMRV9DUkVBVEVfVklERU9fVFJBQ0tfVCA9ICdMLXJ0Y19tb2R1bGVfY3JlYXRlX3ZpZGVvX3RyYWNrLVQnLFxuICBMX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IgPSAnTC1ydGNfbW9kdWxlX2NyZWF0ZV92aWRlb190cmFjay1SJyxcbiAgLyoqXG4gICAqIOWIm+W7uumfs+mikei1hOa6kFxuICAgKi9cbiAgTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19UID0gJ0wtcnRjX21vZHVsZV9jcmVhdGVfYXVkaW9fdHJhY2stVCcsXG4gIExfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiA9ICdMLXJ0Y19tb2R1bGVfY3JlYXRlX2F1ZGlvX3RyYWNrLVInLFxuICAvKipcbiAgICog5pS25Yiw6LWE5rqQ5Y+R5biDXG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19QVUJMSVNIX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfcHVibGlzaC1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOi1hOa6kOWPlua2iOWPkeW4g1xuICAgKi9cbiAgTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfVU5QVUJMSVNIX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfdW5wdWJsaXNoLU8nLFxuICAvKipcbiAgICog5pS25Yiw6LWE5rqQ54q25oCB5Y+Y5pu0XG4gICAqL1xuICBMX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19FTkFCTEVfQ0hBTkdFX08gPSAnTC1ydGNfbW9kdWxlX3JlY2VpdmVfdHJhY2tfZW5hYmxlX2NoYW5nZS1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsOiiq+i4ouWHuuaIv+mXtFxuICAgKi9cbiAgTF9SVENfTU9EVUxFX1JFQ0VJVkVfS0lDS19PRkZfTyA9ICdMLXJ0Y19tb2R1bGVfcmVjZWl2ZV9raWNrX29mZi1PJyxcbiAgLyoqXG4gICAqIOaUtuWIsCBwZWVyY29ubmVjdGlvbiDlvILluLjlhbPpl61cbiAgICovXG4gIExfUlRDX01PRFVMRV9SRUNFSVZFX1BFRVJDT05ORUNUSU9OX0VYQ0VQVF9DTE9TRV9PID0gJ0wtcnRjX21vZHVsZV9yZWNlaXZlX3BlZXJjb25uZWN0aW9uX2V4Y2VwdF9jbG9zZS1PJyxcbiAgLyoqXG4gICAqIOWIh+aNouWqkuS9k+exu+Wei1xuICAgKi9cbiAgTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1QgPSAnTC1ydGNfbW9kdWxlX2NoYW5nZV9tZWRpYV90eXBlLVQnLFxuICBMX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfUiA9ICdMLXJ0Y19tb2R1bGVfY2hhbmdlX21lZGlhX3R5cGUtUicsXG4gIC8qKlxuICAgKiDliqDlhaXmiL/pl7RcbiAgICovXG4gIExfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1QgPSAnTC1ydGNfbW9kdWxlX2pvaW5fcnRjX3Jvb20tVCcsXG4gIExfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1IgPSAnTC1ydGNfbW9kdWxlX2pvaW5fcnRjX3Jvb20tUicsXG4gIC8qKlxuICAgKiDpgIDlh7rmiL/pl7RcbiAgICovXG4gIExfUlRDX01PRFVMRV9RVUlUX1JUQ19ST09NX1QgPSAnTC1ydGNfbW9kdWxlX3F1aXRfcnRjX3Jvb20tVCcsXG4gIExfUlRDX01PRFVMRV9RVUlUX1JUQ19ST09NX1IgPSAnTC1ydGNfbW9kdWxlX3F1aXRfcnRjX3Jvb20tUicsXG4gIC8qKlxuICAgKiDliJvlu7rpgJror53pnIDopoHnmoTlqpLkvZPotYTmupBcbiAgICovXG4gIExfUlRDX01PRFVMRV9DUkVBVEVfQ0FMTF9NRURJQV9UUkFDS1NfUCA9ICdMLXJ0Y19tb2R1bGVfY3JlYXRlX2NhbGxfbWVkaWFfdHJhY2tzLVAnLFxuICAvLyBzaWduYWwg5qih5Z2X5pel5b+X5qCH562+XG4gIC8qKlxuICAgKiDlvIDlp4vlkbzlj6tcbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX1NJTkdMRV9DQUxMX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfc2luZ2xlX2NhbGwtVCcsXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0dST1VQX0NBTExfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9ncm91cF9jYWxsLVQnLFxuICAvKipcbiAgICog6YKA6K+3XG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9JTlZJVEVfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9pbnZpdGUtVCcsXG4gIC8qKlxuICAgKiDlk43pk4NcbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX1JJTkdfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9yaW5nLVQnLFxuICAvKipcbiAgICog5o6l5ZCsXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9BQ0NFUFRfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9hY2NlcHQtVCcsXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0FDQ0VQVF9SID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2FjY2VwdC1SJyxcbiAgLyoqXG4gICAqIOWKoOWFpemAmuivnVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfSk9JTl9DQUxMX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfam9pbl9jYWxsLVQnLFxuICAvKipcbiAgICog5oyC5pat6YCa6K+dXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9IQU5HVVBfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9oYW5ndXAtVCcsXG4gIC8qKlxuICAgKiDpgJror53nirbmgIHkuIrmiqVcbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0NBTExfU1RBVFVTX1VQX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfY2FsbF9zdGF0dXNfdXAtVCcsXG4gIC8qKlxuICAgKiDpgJror53kuovku7bkuIrmiqVcbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0NBTExfRVZFTlRfVVBfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9jYWxsX2V2ZW50X3VwLVQnLFxuICAvKipcbiAgICog6YCa6K+d5a+56K+d5LqL5Lu25LiK5oqlXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX0RJQUxPR19VUF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2NhbGxfZGlhbG9nX3VwLVQnLFxuICAvKipcbiAgICog5Yig6Zmk6YCa6K+d6K6w5b2VXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9ERUxFVEVfQ0FMTF9SRUNPUkRfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9kZWxldGVfY2FsbF9yZWNvcmQtVCcsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53orrDlvZVcbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX1JFQ09SRF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2dldF9jYWxsX3JlY29yZC1UJyxcbiAgLyoqXG4gICAqIOafpeivoiBjYWxsIHNlcnZlciDlvZPliY3ml7bpl7TmiLNcbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX1NFUlZFUl9USU1FX1QgPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfZ2V0X2NhbGxfc2VydmVyX3RpbWUtVCcsXG4gIC8qKlxuICAgKiDojrflj5bmjIflrprpgJror53nmoTml7bpl7Tkv6Hmga9cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX1RJTUVfSU5GT19UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2dldF9jYWxsX3RpbWVfaW5mby1UJyxcbiAgLyoqXG4gICAqIOiOt+WPlueUqOaIt+acque7k+adn+eahOmAmuivneWIl+ihqOS/oeaBr1xuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0FWQUlMQUJMRV9DQUxMX0xJU1RfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9nZXRfYXZhaWxhYmxlX2NhbGxfbGlzdC1UJyxcbiAgLyoqXG4gICAqIOa4hemZpOmAmuivneiusOW9lVxuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0xFQVJfQ0FMTF9SRUNPUkRfVCA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9jbGVhcl9jYWxsX3JlY29yZC1UJyxcbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg6I635Y+W6YCa6K+d5L+h5oGvXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQ0FMTF9JTkZPX0JZX0NBTExJRF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX2dldF9jYWxsX2luZm9fYnlfY2FsbElkLVQnLFxuICAvKipcbiAgICog55So5oi357O757uf54q25oCB5LiK5oqlXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9VU0VSX1NZU1RFTV9TVEFURV9VUF9UID0gJ0wtc2lnbmFsX3RyYW5zcG9ydGVyX3VzZXJfc3lzdGVtX3N0YXRlX3VwLVQnLFxuICAvKipcbiAgICog5pS25YiwIGNhbGwgc2lnbmFsIOa2iOaBr1xuICAgKi9cbiAgTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9DQUxMX1NJR05BTF9EQVRBX08gPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfcmVjZWl2ZV9jYWxsX3NpZ25hbF9kYXRhLU8nLFxuICAvKipcbiAgICogaW0g54q25oCB5Y+Y5YyWXG4gICAqL1xuICBMX1NJR05BTF9UUkFOU1BPUlRFUl9JTV9TVEFURV9DSEFOR0VfTyA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9pbV9zdGF0ZV9jaGFuZ2UtTycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53pgoDor7dcbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfSU5WSVRFX08gPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfcmVjZWl2ZV9pbnZpdGUtTycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror53nirbmgIHlj5jmm7RcbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfQ0FMTF9TVEFUVVNfTyA9ICdMLXNpZ25hbF90cmFuc3BvcnRlcl9yZWNlaXZlX2NhbGxfc3RhdHVzLU8nLFxuICAvKipcbiAgICog5pS25YiwIENhbGwgUGx1cyDnprvnur/mtojmga9cbiAgICovXG4gIExfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfTUlTU19NRVNTQUdFX08gPSAnTC1zaWduYWxfdHJhbnNwb3J0ZXJfcmVjZWl2ZV9taXNzX21lc3NhZ2UtTycsXG4gIC8qKlxuICAgKiBjYWxsIGVuZ2luZSDmm7TmlrDkurrlkZjnirbmgIFcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfVVBEQVRFX1VTRVJTX1NUQVRFX08gPSAnTC1jYWxsX2VuZ2luZV91cGRhdGVfdXNlcnNfc3RhdGUtTycsXG4gIC8qKlxuICAgKiBpbSDnirbmgIHlj5jmm7RcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfSU1fU1RBVEVfQ0hBTkdFX08gPSAnTC1jYWxsX2VuZ2luZV9pbV9zdGF0ZV9jaGFuZ2UtTycsXG4gIC8qKlxuICAgKiDlj5Hotbflkbzlj6vjgIHmlLbliLDpgoDor7fotoXml7ZcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfQ0FMTF9USU1FT1VUX08gPSAnTC1jYWxsX2VuZ2luZV9jYWxsX3RpbWVvdXQtTycsXG4gIC8qKlxuICAgKiDlvIDlkK/pgJror53lrprml7blmahcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfU1RBUlRfQ0FMTF9USU1FUl9PID0gJ0wtY2FsbF9lbmdpbmVfc3RhcnRfY2FsbF90aW1lci1PJyxcbiAgLyoqXG4gICAqIOa4hemZpOmAmuivneWumuaXtuWZqFxuICAgKi9cbiAgTF9DQUxMX0VOR0lORV9TVE9QX0NBTExfVElNRVJfTyA9ICdMLWNhbGxfZW5naW5lX3N0b3BfY2FsbF90aW1lci1PJyxcbiAgLyoqXG4gICAqIOS4iuaKpSBvblBob25lRW5kXG4gICAqL1xuICBMX0NBTExfRU5HSU5FX1VQX09OX1BIT05FX0VORF9UID0gJ0wtY2FsbF9lbmdpbmVfdXBfb25fcGhvbmVfZW5kLVQnLFxuICBMX0NBTExfRU5HSU5FX1VQX09OX1BIT05FX0VORF9SID0gJ0wtY2FsbF9lbmdpbmVfdXBfb25fcGhvbmVfZW5kLVInLFxuICAvKipcbiAgICog5pS25Yiw6aaW5bin5pe26Ze05LiL5Y+RXG4gICAqL1xuICBMX0NBTExfRU5HSU5FX1JFQ0VJVkVfRklSU1RfRlJBTUVfVElNRV9PID0gJ0wtY2FsbF9lbmdpbmVfcmVjZWl2ZV9maXJzdF9mcmFtZV90aW1lLU8nLFxuICAvKipcbiAgICog5pS25Yiw5aqS5L2T57G75Z6L5YiH5o2i5LqL5Lu2XG4gICAqL1xuICBMX0NBTExfRU5HSU5FX1JFQ0VJVkVfTUVESUFUWVBFX0NIQU5HRV9PID0gJ0wtY2FsbF9lbmdpbmVfcmVjZWl2ZV9tZWRpYXR5cGVfY2hhbmdlLU8nLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+d57uT5p2fXG4gICAqL1xuICBMX0NBTExfRU5HSU5FX1JFQ0VJVkVfQ0xPU0VfU0VTU0lPTl9PID0gJ0wtY2FsbF9lbmdpbmVfcmVjZWl2ZV9jbG9zZV9zZXNzaW9uLU8nLFxuICAvKipcbiAgICog5pS25Yiw6YCa6K+d5pel5b+XXG4gICAqL1xuICBMX0NBTExfRU5HSU5FX1JFQ0VJVkVfQ0FMTF9SRUNPUkRfTyA9ICdMLWNhbGxfZW5naW5lX3JlY2VpdmVfY2FsbF9yZWNvcmQtTycsXG4gIC8qKlxuICAgKiDmlLbliLDooaXlgb/mlbDmja5cbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfUkVDRUlWRV9DT01QTEVNRU5UQVJZX0RBVEFfTyA9ICdMLWNhbGxfZW5naW5lX3JlY2VpdmVfY29tcGxlbWVudGFyeV9kYXRhLU8nLFxuICAvKipcbiAgICog5Yib5bu6IHNlc3Npb25cbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfQ1JFQVRFX1NFU1NJT05fQllfU0VSVkVSX1QgPSAnTC1jYWxsX2VuZ2luZV9jcmVhdGVfc2Vzc2lvbl9ieV9zZXJ2ZXItVCcsXG4gIExfQ0FMTF9FTkdJTkVfQ1JFQVRFX1NFU1NJT05fQllfU0VSVkVSX1IgPSAnTC1jYWxsX2VuZ2luZV9jcmVhdGVfc2Vzc2lvbl9ieV9zZXJ2ZXItUicsXG4gIC8qKlxuICAgKiDkuIrmiqXpppbluKfml7bpl7RcbiAgICovXG4gIExfQ0FMTF9FTkdJTkVfVVBfRklSU1RfRlJBTUVfVElNRV9UID0gJ0wtY2FsbF9lbmdpbmVfdXBfZmlyc3RfZnJhbWVfdGltZS1UJyxcbiAgTF9DQUxMX0VOR0lORV9VUF9GSVJTVF9GUkFNRV9USU1FX1IgPSAnTC1jYWxsX2VuZ2luZV91cF9maXJzdF9mcmFtZV90aW1lLVInLFxuICAvKipcbiAgICog5byA5ZCv5pe26Ze05qCh5q2jXG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9TVEFSVF9PID0gJ0wtdGltZV9jb3JyZWN0X3N0YXJ0LU8nLFxuICAvKipcbiAgICog5YGc5q2i5qCh5pe2XG4gICAqL1xuICBMX1RJTUVfQ09SUkVDVF9TVE9QX08gPSAnTC10aW1lX2NvcnJlY3Rfc3RvcC1PJyxcbiAgLyoqXG4gICAqIOmHjeaWsOW8gOWQr+agoeaXtlxuICAgKi9cbiAgTF9USU1FX0NPUlJFQ1RfUkVTVEFSVF9PID0gJ0wtdGltZV9jb3JyZWN0X3Jlc3RhcnQtTycsXG4gIC8qKlxuICAgKiDku47mnI3liqHnq6/ojrflj5bpgJror53ml7bplb/jgIHpgJror53lvIDlp4vml7bpl7RcbiAgICovXG4gIExfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9UID0gJ0wtdGltZV9jb3JyZWN0X2dldF9jYWxsX2NsaWVudF90aW1lX2J5X3NlcnZlci1UJyxcbiAgTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1AgPSAnTC10aW1lX2NvcnJlY3RfZ2V0X2NhbGxfY2xpZW50X3RpbWVfYnlfc2VydmVyLVAnLFxuICBMX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfUiA9ICdMLXRpbWVfY29ycmVjdF9nZXRfY2FsbF9jbGllbnRfdGltZV9ieV9zZXJ2ZXItUicsXG4gIC8qKlxuICAgKiDorqHnrpflrqLmiLfnq6/lvIDlp4vml7bpl7RcbiAgICovXG4gIExfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfVCA9ICdMLXRpbWVfY29ycmVjdF9jYWxjX2NsaWVudF9zdGFydF90aW1lLVQnLFxuICBMX1RJTUVfQ09SUkVDVF9DQUxDX0NMSUVOVF9TVEFSVF9USU1FX1IgPSAnTC10aW1lX2NvcnJlY3RfY2FsY19jbGllbnRfc3RhcnRfdGltZS1SJyxcbiAgLyoqXG4gICAqIOWtmOWCqOWuouaIt+err+WSjOacjeWKoeerr+aXtumXtOWBj+W3rlxuICAgKi9cbiAgTF9USU1FX0NPUlJFQ1RfU0VUX0RFTFRBX1RJTUVfTyA9ICdMLXRpbWVfY29ycmVjdF9zZXRfZGVsdGFfdGltZS1PJyxcbiAgLyoqXG4gICAqIOW+queOr+S4ieasoeagoeato+e7meWuouaIt+err+eahOaXtumXtFxuICAgKi9cbiAgTF9USU1FX0NPUlJFQ1RfTE9PUF9DT1JSRUNUX0NMSU5FVF9USU1FX1QgPSAnTC10aW1lX2NvcnJlY3RfbG9vcF9jb3JyZWN0X2NsaWVudF90aW1lLVQnLFxuICBMX1RJTUVfQ09SUkVDVF9MT09QX0NPUlJFQ1RfQ0xJTkVUX1RJTUVfUiA9ICdMLXRpbWVfY29ycmVjdF9sb29wX2NvcnJlY3RfY2xpZW50X3RpbWUtUicsXG4gIC8qKlxuICAgKiBzZXNzaW9uIOWGhemDqOabtOaWsOS6uuWRmOeKtuaAgVxuICAgKi9cbiAgTF9JTk5FUl9TRVNTSU9OX1VQREFURV9VU0VSX1NUQVRFX08gPSAnTC1pbm5lcl9zZXNzaW9uX3VwZGF0ZV91c2VyX3N0YXRlLU8nLFxuICAvKipcbiAgICog6K6+572uIHNlc3Npb24g5Lq65ZGY6K6+5aSH54q25oCBXG4gICAqL1xuICBMX0lOTkVSX1NFU1NJT05fU0VUX1VTRVJfREVWSUNFX0VOQUJMRV9PID0gJ0wtaW5uZXJfc2Vzc2lvbl9zZXRfdXNlcl9kZXZpY2VfZW5hYmxlLU8nLFxuICAvKipcbiAgICog6I635Y+W6YCa6K+d5byA5aeL5pe26Ze0XG4gICAqL1xuICBMX0NBTExQTFVTX1NFU1NJT05fR0VUX0NSRUFURV9USU1FX1QgPSAnTC1jYWxscGx1c19zZXNzaW9uX2dldF9jcmVhdGVfdGltZS1UJyxcbiAgTF9DQUxMUExVU19TRVNTSU9OX0dFVF9DUkVBVEVfVElNRV9SID0gJ0wtY2FsbHBsdXNfc2Vzc2lvbl9nZXRfY3JlYXRlX3RpbWUtUicsXG4gIC8qKlxuICAgKiDojrflj5bpgJror53ml7bplb9cbiAgICovXG4gIExfQ0FMTFBMVVNfU0VTU0lPTl9HRVRfRFVSQVRJT05fVCA9ICdMLWNhbGxwbHVzX3Nlc3Npb25fZ2V0X2R1cmF0aW9uLVQnLFxuICBMX0NBTExQTFVTX1NFU1NJT05fR0VUX0RVUkFUSU9OX1IgPSAnTC1jYWxscGx1c19zZXNzaW9uX2dldF9kdXJhdGlvbi1SJyxcbiAgLyoqXG4gICAqIOiuvue9ruWuieWNk+aOqOmAgemFjee9rumhuVxuICAgKi9cbiAgTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PID0gJ0wtY2FsbHBsdXNfc2V0X2FuZHJvaWRfcHVzaF9jb25maWctTycsXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIFJDQ2FsbFBsdXNUeXBlLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSwgUkNDYWxsUGx1c01lZGlhVHlwZSwgUkNDYWxsUGx1c0NhbGxTdGF0ZSxcbn0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxJbm5lclNlc3Npb24gfSBmcm9tICcuL1JDQ2FsbElubmVyU2Vzc2lvbic7XG5pbXBvcnQgeyBSQ0NhbGxFbmdpbmUgfSBmcm9tICcuLi9SQ0NhbGxFbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NvZGUgfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c0NvZGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuLyoqXG4gKiDlr7nlpJYgc2Vzc2lvbiDlrp7kvovvvIzku4XmnInojrflj5bmlrnms5XvvIzml6Dms5Xkv67mlLlcbiAqL1xuZXhwb3J0IGNsYXNzIFJDQ2FsbFBsdXNTZXNzaW9uIHtcbiAgcHJpdmF0ZSBfc3RhcnRUaW1lOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSBfZHVyYXRpb246IG51bWJlciA9IDBcblxuICBwcml2YXRlIF9jYWxsSWQ6IHN0cmluZyA9ICcnXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2Vzc2lvbjogUkNDYWxsSW5uZXJTZXNzaW9uLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxFbmdpbmU6IFJDQ2FsbEVuZ2luZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHtcbiAgICB0aGlzLl9jYWxsSWQgPSB0aGlzLl9zZXNzaW9uLmdldENhbGxJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBDYWxsSWRcbiAgICovXG4gIHB1YmxpYyBnZXRDYWxsSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBzZXNzaW9uIOeKtuaAgVxuICAgKi9cbiAgcHVibGljIGdldFN0YXRlKCk6IFJDQ2FsbFBsdXNDYWxsU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uLmdldFNlc3Npb25TdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneexu+Wei1xuICAgKi9cbiAgcHVibGljIGdldENhbGxUeXBlKCk6IFJDQ2FsbFBsdXNUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRDYWxsVHlwZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneWqkuS9k+exu+Wei1xuICAgKi9cbiAgcHVibGljIGdldE1lZGlhVHlwZSgpOiBSQ0NhbGxQbHVzTWVkaWFUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRNZWRpYVR5cGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53kurrlkZjliJfooahcbiAgICovXG4gIHB1YmxpYyBnZXRVc2VyTGlzdCgpOiB7IHVzZXJJZDogc3RyaW5nLCBzdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRVc2VyTGlzdCgpLm1hcCgodXNlcikgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICB1c2VySWQsIHVzZXJTdGF0ZSwgY2FtZXJhRW5hYmxlLCBtaWNyb3Bob25lRW5hYmxlLFxuICAgICAgfSA9IHVzZXI7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHN0YXRlOiB1c2VyU3RhdGUsXG4gICAgICAgIGNhbWVyYUVuYWJsZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6YCa6K+d5Y+R6LW36ICFIHVzZXJJZFxuICAgKi9cbiAgZ2V0Q3JlYXRvclVzZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uLmdldFN0YXJ0Q2FsbGVySWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53pgoDor7fogIUgdXNlcklkXG4gICAqIOWRvOWFpeacieWAvO+8jOWRvOWHuuaXtu+8jOWAvOS4uuacrOWcsOeUqOaItyBVc2VySWRcbiAgICovXG4gIGdldEludml0ZXJVc2VySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbi5nZXRDYWxsZXJJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivnei1t+Wni+aXtumXtFxuICAgKi9cbiAgYXN5bmMgZ2V0Q3JlYXRlVGltZXN0YW1wKCk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgc3RhcnRUaW1lPzogbnVtYmVyfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVNTSU9OX0dFVF9DUkVBVEVfVElNRV9ULCAnJywgdHJhY2VJZCk7XG4gICAgaWYgKHRoaXMuX3N0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgc3RhcnRUaW1lOiB0aGlzLl9zdGFydFRpbWUgfTtcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlLCBjbGllbnRTdGFydFRpbWUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZ2V0Q2FsbFN0YXJpbmdUaW1lKHsgY2FsbElkOiB0aGlzLl9jYWxsSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VTU0lPTl9HRVRfQ1JFQVRFX1RJTUVfUiwgYGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VTU0lPTl9HRVRfQ1JFQVRFX1RJTUVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSBjbGllbnRTdGFydFRpbWUhO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgc3RhcnRUaW1lOiB0aGlzLl9zdGFydFRpbWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53ml7bplb9cbiAgICog6YCa6K+d5pyq57uT5p2f5YmN77yM5YC85Li6IDBcbiAgICovXG4gIGFzeW5jIGdldER1cmF0aW9uKCk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZHVyYXRpb24/OiBudW1iZXJ9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFU1NJT05fR0VUX0RVUkFUSU9OX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9kdXJhdGlvbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFU1NJT05fR0VUX0RVUkFUSU9OX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNVQ0NFU1N9LCBkdXJhdGlvbjogJHt0aGlzLl9kdXJhdGlvbn1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIGR1cmF0aW9uOiB0aGlzLl9kdXJhdGlvbiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRDYWxsVGltZUluZm8odGhpcy5fY2FsbElkLCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVNTSU9OX0dFVF9EVVJBVElPTl9SLCBgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVNTSU9OX0dFVF9EVVJBVElPTl9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfSwgZHVyYXRpb246ICR7ZGF0YSEuZHVyYXRpb259YCwgdHJhY2VJZCk7XG4gICAgdGhpcy5fZHVyYXRpb24gPSBkYXRhIS5kdXJhdGlvbjtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLl9kdXJhdGlvbixcbiAgICB9O1xuICB9XG59XG4iLCIvKipcbiAqIOWRvOWPq+exu+Wei1xuICovXG5leHBvcnQgZW51bSBSQ0NhbGxQbHVzVHlwZSB7XG4gIC8qKlxuICAgKiDljZXlkbxcbiAgICovXG4gIFNJTkdMRSxcbiAgLyoqXG4gICAqIOWkmuS6uuWRvOWPq1xuICAgKi9cbiAgTVVMVElcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIHtcbiAgLyoqXG4gICAqIElETEVcbiAgICovXG4gIElETEUgPSAwLFxuICAvKipcbiAgICog5Y+R6LW35ZG85Y+rXG4gICAqL1xuICBDQUxMSU5HID0gMTAwLFxuICAvKipcbiAgICog6KKr6YKA6K+3XG4gICAqL1xuICBJTlZJVEVEID0gMTAxLFxuICAvKipcbiAgICog5ZON6ZODXG4gICAqL1xuICBSSU5HSU5HID0gMTAyLFxuICAvKipcbiAgICog5bex5pa55b+Z56KM55u05o6l5oyC5patXG4gICAqL1xuICBCVVNZTElORV9SSU5HSU5HID0gMTAzLFxuICAvKipcbiAgICog5bex5pa55b+Z56KM562J5b6F5o6l5ZCs5YW25LuW6YCa6K+dXG4gICAqL1xuICBCVVNZTElORV9XQUlUID0gMTA0LFxuICAvKipcbiAgICog6YCa6K+d6L+e5o6l5LitXG4gICAqL1xuICBDT05ORUNUSU5HID0gMjAwLFxuICAvKipcbiAgICog5q2j5Zyo6YCa6K+d5LitXG4gICAqL1xuICBPTkNBTEwgPSAzMDAsXG4gIC8qKlxuICAgKiDmraPlnKjns7vnu5/pgJror53kuK1cbiAgICovXG4gIE9OUEhPTkUgPSAzMDEsXG4gIC8qKlxuICAgKiDpgJror53nu5PmnZ9cbiAgICovXG4gIEVOREVEID0gMTAwMCxcbiAgLyoqXG4gICAqIOi/nOerr+acquaOpeWQrFxuICAgKi9cbiAgTk9fQU5TV0VSID0gMTAwMSxcbiAgLyoqXG4gICAqIOW3seerr+i2heaXtuacquaOpeWQrFxuICAgKi9cbiAgTUlTU0VEID0gMTAwMixcbiAgLyoqXG4gICAqIOmAmuivneWPlua2iFxuICAgKi9cbiAgQ0FOQ0VMTEVEID0gMTAwMyxcbiAgLyoqXG4gICAqIOmAmuivneaLkue7nVxuICAgKi9cbiAgREVDTElORUQgPSAxMDA0LFxuICAvKipcbiAgICog5byC5bi4XG4gICAqL1xuICBFUlJPUiA9IDIwMDBcbn1cbiIsIi8qKlxuICog5ZG85Y+r5aqS5L2T57G75Z6LXG4gKi9cbmV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNNZWRpYVR5cGUge1xuICAvKipcbiAgICog6Z+z6aKRXG4gICAqL1xuICBBVURJTyxcbiAgLyoqXG4gICAqIOmfs+inhumikVxuICAgKi9cbiAgQVVESU9fVklERU8sXG4gIC8qKlxuICAgKiDop4bpopFcbiAgICovXG4gIFZJREVPLFxufVxuIiwiLyoqXG4gKiDpgJror53nirbmgIFcbiAqL1xuZXhwb3J0IGVudW0gUkNDYWxsUGx1c0NhbGxTdGF0ZSB7XG4gIC8qKlxuICAgKiDliJ3lp4vnirbmgIFcbiAgICovXG4gIElETEUgPSAwLFxuICAvKipcbiAgICog5q2j5Zyo5ZG85Y+rXG4gICAqL1xuICBDQUxMSU5HID0gMTAwLFxuICAvKipcbiAgICog6KKr6YKA6K+3XG4gICAqL1xuICBJTlZJVEVEID0gMTAxLFxuICAvKipcbiAgICog5ZON6ZODXG4gICAqL1xuICBSSU5HSU5HID0gMTAyLFxuICAvKipcbiAgICog5b+Z57q/5ZON6ZODXG4gICAqL1xuICBCVVNZTElORV9SSU5HSU5HID0gMTAzLFxuICAvKipcbiAgICog5b+Z57q/562J5b6FXG4gICAqL1xuICBCVVNZTElORV9XQUlUID0gMTA0LFxuICAvKipcbiAgICog6YCa6K+d6L+e5o6l5LitXG4gICAqL1xuICBDT05ORUNUSU5HID0gMjAwLFxuICAvKipcbiAgICog6YCa6K+d5LitXG4gICAqL1xuICBPTkNBTEwgPSAzMDAsXG4gIC8qKlxuICAgKiDpgJror53nu5PmnZ9cbiAgICovXG4gIEVOREVEID0gMTAwMCxcbiAgLyoqXG4gICAqIOi/nOerr+acquaOpeWQrFxuICAgKi9cbiAgTk9BTlNXRVIgPSAxMDAxLFxuICAvKipcbiAgICog5bex56uv5pyq5o6l5ZCsXG4gICAqL1xuICBNSVNTRUQgPSAxMDAyLFxuICAvKipcbiAgICog5bex56uv5Y+W5raI6YCa6K+dXG4gICAqL1xuICBDQU5DRUxFRCA9IDEwMDMsXG4gIC8qKlxuICAgKiDov5znq6/mi5Lnu51cbiAgICovXG4gIERFQ0xJTkVEID0gMTAwNCxcblxuICBFUlJPUiA9IDIwMDBcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQge1xuICAvKipcbiAgICog6K+35rGC5pa55Y+W5raI5aqS5L2T57G75Z6L5Y+Y5pu0XG4gICAqL1xuICBDQU5DRUxfQ0hBTkdFX01FRElBX1RZUEUgPSAwLFxuICAvKipcbiAgICog5bqU562U5pa55ouS57ud5aqS5L2T57G75Z6L5YiH5o2iXG4gICAqL1xuICBSRUZVU0VfQ0hBTkdFX01FRElBX1RZUEUgPSAxLFxuICAvKipcbiAgICog5pyN5Yqh5Luy6KOB5YWB6K645aqS5L2T57G75Z6L5YiH5o2iXG4gICAqL1xuICBTRVJWRVJfQUxMT1dfTUVESUFfVFlQRSA9IDIsXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovliIfmjaLotoXml7ZcbiAgICovXG4gIENIQU5HRV9NRURJQV9UWVBFX1RJTUVPVVQgPSAzLFxufVxuIiwiZXhwb3J0IGVudW0gUkNDYWxsUGx1c1JlYXNvbiB7XG4gIElETEUgPSAwLFxuICBDQUxMSU5HID0gMTAwLFxuICBJTlZJVEVEID0gMTAxLFxuICBSSU5HSU5HID0gMTAyLFxuICBCVVNZTElORV9SSU5HSU5HID0gMTAzLFxuICBCVVNZTElORV9XQUlUID0gMTA0LFxuICBDT05ORUNUSU5HID0gMjAwLFxuICBPTkNBTEwgPSAzMDAsXG4gIE9OX1BIT05FID0gMzAxLFxuICBPTl9QSE9ORV9FTkQgPSAzMDIsXG4gIC8qKlxuICAgKiDovpPlhaXorr7lpIfkuI3lj6/nlKhcbiAgICovXG4gIE9OX0RFVklDRV9ESVNBQkxFID0gMzAzLFxuICAvKipcbiAgICog6L6T5YWl6K6+5aSH5Y+v55SoXG4gICAqL1xuICBPTl9ERVZJQ0VfRU5BQkxFID0gMzA0LFxuICAvKipcbiAgICog5pys56uv5byC5bi456a75byAXG4gICAqL1xuICBBQk5PUk1BTF9FTkQgPSA5OTksXG4gIC8qKlxuICAgKiDpgJror53nu5PmnZ9cbiAgICovXG4gIEVOREVEID0gMTAwMCxcbiAgLyoqXG4gICAqIOi/nOerr+acquaOpeWQrFxuICAgKi9cbiAgTk9fQU5TV0VSID0gMTAwMSxcbiAgLyoqXG4gICAqIOW3seerr+acquaOpeWQrFxuICAgKi9cbiAgTUlTU0VEID0gMTAwMixcbiAgLyoqXG4gICAqIOW3seerr+mAmuivneWPlua2iFxuICAgKi9cbiAgQ0FOQ0VMTEVEID0gMTAwMyxcbiAgLyoqXG4gICAqIOi/nOerr+aLkue7nVxuICAgKi9cbiAgREVDTElORUQgPSAxMDA0LFxuICAvKipcbiAgICog5YW25LuW56uv5ZG85Ye6KOW9k+WJjeerr+iiq+i4oilcbiAgICovXG4gIE9USEVSX0NMSUVOVF9DQUxMSU5HID0gMTAxMCxcbiAgLyoqXG4gICAqIOWFtuS7luerr+W3suaOpeWQrFxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0FDQ0VQVCA9IDEwMTEsXG4gIC8qKlxuICAgKiDliqDlhaUgUlRDIOaIv+mXtOWksei0pVxuICAgKi9cbiAgSk9JTl9ST09NX0VSUiA9IDExMDUsXG4gIC8qKlxuICAgKiDlj5HluIPotYTmupDlpLHotKVcbiAgICovXG4gIFBVQkxJU0hfRVJSID0gMTEwNixcbiAgLyoqXG4gICAqIOiuoumYhei1hOa6kOWksei0pVxuICAgKi9cbiAgU1VCU0NSSUJFX0VSUiA9IDExMDcsXG4gIC8qKlxuICAgKiDmjqXlkKzns7vnu5/pgJror51cbiAgICovXG4gIEFDQ0VQVF9DQVJSSUVSID0gMTEwOCxcbiAgLyoqXG4gICAqIOiiq+emgeatoumAmuivnVxuICAgKi9cbiAgS0lDS0VEX0JZX1NFUlZFUiA9IDExMDksXG4gIC8qKlxuICAgKiBSVEMgUGluZyDlpLHotKXooqvouKLlh7rmiL/pl7RcbiAgICovXG4gIENPTk5FQ1RJT05fRVJSID0gMTExMCxcbiAgLyoqXG4gICAqIOeUqOaIt+mAgOWHuueZu+W9leiiq+i4ouWHuuaIv+mXtFxuICAgKi9cbiAgTE9HT1VUID0gMTExMSxcbiAgLyoqXG4gICAqIOeUqOaIt+iiq+WFtuS7luerr+eZu+W9leaMpOS4i+e6v1xuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0xPR0lOID0gMTExMixcbiAgLyoqXG4gICAqIOWFtuS7luerr+WKoOWFpeaWsOmAmuivnVxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0pPSU5FRCA9IDExMTMsXG4gIC8qKlxuICAgKiDlhbbku5bnq6/lt7LlnKjlhbbku5bpgJror53kuK3vvIjlt7Hnq68gQTEg5YW25LuW56uv5q2j5Zyo6YCa6K+d5Lit77yMQTIg5aSa56uv5Y+I5Yqg5YWl5oi/6Ze06KKr5ouS57ud5ZCO6YCa6K+d57uT5p2fIEEyIOeahOeKtuaAge+8iVxuICAgKi9cbiAgT1RIRVJfQ0xJRU5UX0lOX1JPT00gPSAxMTE0LFxuICAvKipcbiAgICog5YW25LuW56uv5bey5oyC5patXG4gICAqL1xuICBPVEhFUl9DTElFTlRfSEFOR1VQID0gMTE1MSxcbiAgLyoqXG4gICAqIOi/nOerr+eUqOaIt+WKoOWFpeaIv+mXtOWksei0pVxuICAgKi9cbiAgUkVNT1RFX0pPSU5fUlRDX0VSUk9SID0gMTIwNSxcbiAgLyoqXG4gICAqIOi/nOerr+eUqOaIt+WPkeW4g+i1hOa6kOWksei0pVxuICAgKi9cbiAgUkVNT1RFX1BVQkxJU0hfRVJST1IgPSAxMjA2LFxuICAvKipcbiAgICog6L+c56uv55So5oi36K6i6ZiF6LWE5rqQ5aSx6LSlXG4gICAqL1xuICBSRU1PVEVfU1VCU0NSSUJFX0VSUk9SID0gMTIwNyxcbiAgLyoqXG4gICAqIOi/nOerr+eUqOaIt+W3suiiqyjlsIHnpoEp56aB5q2i6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfS0lDS0VEX0JZX1NFUlZFUiA9IDEyMDksXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLdVRFDov57mjqXmlq3lvIBcbiAgICovXG4gIFJFTU9URV9DT05ORUNUSU9OX0VSUk9SID0gMTIxMCxcbiAgLyoqXG4gICAqIOi/nOerr+eUqOaIt+mAgOWHuklN55m75b2VXG4gICAqL1xuICBSRU1PVEVfTE9HT1VUID0gMTIxMSxcbiAgLyoqXG4gICAqIOi/nOerr+eUqOaIt+iiq+WFtuS7luerr+eZu+W9leaMpOS4i+e6v1xuICAgKi9cbiAgUkVNT1RFX09USEVSX0NMSUVOVF9MT0dJTiA9IDEyMTIsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfooqvlhbbku5bnq6/liqDlhaXmiL/pl7Qgam9pblJvb20g6Lii5Ye6XG4gICAqL1xuICBSRU1PVEVfT1RIRVJfSk9JTkVEX1JUQyA9IDEyMTMsXG4gIC8qKlxuICAgKiDov5znq6/nlKjmiLfnmoTlhbbku5bnq6/lt7Lnu4/lnKjmiL/pl7TkuK3vvIzkuI3lhYHorrggam9pblJvb20g6L+b6KGM6Z+z6KeG6aKR6YCa6K+dXG4gICAqL1xuICBSRU1PVEVfT1RIRVJfQ0xJRU5UX0lOX1JUQyA9IDEyMTRcbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyLCBpc051bWJlciB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IElBdWRpb0NvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ0F1ZGlvQ29uZmlnQnVpbGRlciB7XG4gIHByaXZhdGUgX2F1ZGlvQ29uZmlnOiBJQXVkaW9Db25maWcgPSB7fVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICkge31cblxuICAvKipcbiAgICog5oyH5a6a6buY6K6k6bqm5YWL6aOOXG4gICAqIG1pY3JvcGhvbmVJZCDlj5blgLzlj6/lj4LogIMgaHR0cHM6Ly9kb2Mucm9uZ2Nsb3VkLmNuL3J0Yy9XZWIvNS5YL2RldmljZSMlRTglOEUlQjclRTUlOEYlOTYlRTklQkElQTYlRTUlODUlOEIlRTklQTMlOEUlRTglQUUlQkUlRTUlQTQlODclRTUlODglOTclRTglQTElQThcbiAgICovXG4gIHNldERlZmF1bHRNaWNyb3Bob25lSWQobWljcm9waG9uZUlkOiBzdHJpbmcpOiBSQ0F1ZGlvQ29uZmlnQnVpbGRlciB7XG4gICAgdGhpcy5fYXVkaW9Db25maWcubWljcm9waG9uZUlkID0gbWljcm9waG9uZUlkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruacgOWwj+OAgeacgOWkp+eggeeOh1xuICAgKiDljZXkvY0ga2Jwc1xuICAgKiDkuI3orr7nva7ml7bvvIzlj5bliqjmgIHnoIHnjoforqHnrpfnu5PmnpxcbiAgICogQHBhcmFtIG1pbiDmnIDlsI/noIHnjodcbiAgICogQHBhcmFtIG1heCDmnIDlpKfnoIHnjodcbiAgICovXG4gIHNldEJpdHJhdGUobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogUkNBdWRpb0NvbmZpZ0J1aWxkZXIge1xuICAgIGlmICghaXNOdW1iZXIobWluKSB8fCAhaXNOdW1iZXIobWF4KSB8fCBtYXggPD0gMCB8fCBtaW4gPD0gMCB8fCBtYXggPCBtaW4pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQVVESU9fQ09ORklHX1NFVF9CSVRSQVRFX08sIGBwYXJhbXMgZXJyb3IgLT4gbWF4OiAke21heH0sbWluOiAke21pbn0sIG1heCBhbmQgbWluIGlzIGEgbnVtYmVyID4gMCwgbWF4IHNob3VsZCA+IG1pbmApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2F1ZGlvQ29uZmlnLm1pbkJpdHJhdGUgPSBtaW47XG4gICAgdGhpcy5fYXVkaW9Db25maWcubWF4Qml0cmF0ZSA9IG1heDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7pn7PpopHph4fmoLfnjofvvIzkuI3lu7rorq7oh6rooYzkv67mlLlcbiAgICogQHBhcmFtIHNhbXBsZVJhdGUg6YeH5qC3546HXG4gICAqL1xuICBzZXRTYW1wbGVSYXRlKHNhbXBsZVJhdGU6IG51bWJlcik6IFJDQXVkaW9Db25maWdCdWlsZGVyIHtcbiAgICBpZiAoIWlzTnVtYmVyKHNhbXBsZVJhdGUpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0FVRElPX0NPTkZJR19TRVRfU0FNUExFX1JBVEVfTywgYHBhcmFtcyBlcnJvciAtPiBzYW1wbGVSYXRlOiAke3NhbXBsZVJhdGV9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fYXVkaW9Db25maWcuc2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiog5p6E5bu66YWN572uICovXG4gIGJ1aWxkKCk6IElBdWRpb0NvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuX2F1ZGlvQ29uZmlnO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgaXNOdW1iZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzRnJhbWVSYXRlLCBSQ0NhbGxQbHVzUmVzb2x1dGlvbiwgSVZpZGVvQ29uZmlnIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4vZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJDVmlkZW9Db25maWdCdWlsZGVyIHtcbiAgcHJpdmF0ZSBfdmlkZW9Db25maWc6IElWaWRlb0NvbmZpZyA9IHtcbiAgICByZXNvbHV0aW9uOiBSQ0NhbGxQbHVzUmVzb2x1dGlvbi5XNjQwX0g0ODAsXG4gICAgZnJhbWVSYXRlOiBSQ0NhbGxQbHVzRnJhbWVSYXRlLkZQU18xNSxcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICkge31cblxuICAvKiog6ZKI5a+55LiN5ZCM6KeG6aKR5rWB5YiG5Yir6YWN572u5bin546HICovXG4gIHNldEZyYW1lUmF0ZShmcHM6IFJDQ2FsbFBsdXNGcmFtZVJhdGUpOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgaWYgKCFSQ0NhbGxQbHVzRnJhbWVSYXRlW2Zwc10pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfVklERU9fQ09ORklHX1NFVF9GUkFNRV9SQVRFX08sIGBwYXJhbXMgZXJyb3IgLT4gZnBzOiAke2Zwc31gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl92aWRlb0NvbmZpZy5mcmFtZVJhdGUgPSBmcHM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiog6ZKI5a+55LiN5ZCM6KeG6aKR5rWB5YiG5Yir6YWN572u5YiG6L6o546HICovXG4gIHNldFZpZGVvUmVzb2x1dGlvbihyZXNvbHV0aW9uOiBSQ0NhbGxQbHVzUmVzb2x1dGlvbik6IFJDVmlkZW9Db25maWdCdWlsZGVyIHtcbiAgICBpZiAoIVJDQ2FsbFBsdXNSZXNvbHV0aW9uW3Jlc29sdXRpb25dKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfUkVTT0xVVElPTl9PLCBgcGFyYW1zIGVycm9yIC0+IHJlc29sdXRpb246ICR7cmVzb2x1dGlvbn1gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl92aWRlb0NvbmZpZy5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7pu5jorqQgY2FtZXJhSWRcbiAgICogY2FtZXJhSWQg5Y+W5YC85Y+v5Y+C6ICDIGh0dHBzOi8vZG9jLnJvbmdjbG91ZC5jbi9ydGMvV2ViLzUuWC9kZXZpY2UjJUU4JThFJUI3JUU1JThGJTk2JUU2JTkxJTg0JUU1JTgzJThGJUU1JUE0JUI0JUU4JUFFJUJFJUU1JUE0JTg3JUU1JTg4JTk3JUU4JUExJUE4XG4gICAqIOS9nOeUqOS6jumihOiniOWKn+iDveOAgeWRvOWPq+WPlua1geetiVxuICAgKi9cbiAgc2V0RGVmYXVsdENhbWVyYUlkKGNhbWVyYUlkOiBzdHJpbmcpOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgdGhpcy5fdmlkZW9Db25maWcuY2FtZXJhSWQgPSBjYW1lcmFJZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7mnIDlsI/jgIHmnIDlpKfnoIHnjodcbiAgICog5Y2V5L2NIGticHNcbiAgICog5LiN6K6+572u5pe277yM5Y+W5Yqo5oCB56CB546H6K6h566X57uT5p6cXG4gICAqIEBwYXJhbSBtaW4g5pyA5bCP56CB546HXG4gICAqIEBwYXJhbSBtYXgg5pyA5aSn56CB546HXG4gICAqL1xuICBzZXRCaXRyYXRlKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IFJDVmlkZW9Db25maWdCdWlsZGVyIHtcbiAgICBpZiAoIWlzTnVtYmVyKG1pbikgfHwgIWlzTnVtYmVyKG1heCkgfHwgbWF4IDw9IDAgfHwgbWluIDw9IDAgfHwgbWF4IDwgbWluKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1ZJREVPX0NPTkZJR19TRVRfQklUUkFURV9PLCBgcGFyYW1zIGVycm9yIC0+IG1heDogJHttYXh9LG1pbjogJHttaW59LCBtYXggYW5kIG1pbiBpcyBhIG51bWJlciA+IDAsIG1heCBzaG91bGQgPiBtaW5gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl92aWRlb0NvbmZpZy5taW5CaXRyYXRlID0gbWluO1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnLm1heEJpdHJhdGUgPSBtYXg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDmnoTlu7rphY3nva5cbiAgYnVpbGQoKTogSVZpZGVvQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5fdmlkZW9Db25maWc7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIElOYXZpSW5mbywgaXNCb29sZWFuLCBpc051bWJlciwgaXNTdHJpbmcsIGlzVW5kZWZpbmVkLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBJQW5kcm9pZFB1c2hDb25maWcsIElSQ0NhbGxQbHVzUHVzaENvbmZpZywgSWlPU1B1c2hDb25maWcsIFJDQ2FsbFBsdXNDb2RlLCBSQ0NhbGxQbHVzUmVhc29uLFxufSBmcm9tICcuLi9hcGkvaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZSc7XG5pbXBvcnQge1xuICBJQWNjZXB0SW5mbywgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLCBJSGFuZ3VwSW5mbywgSU90aGVyTWVtSW5mbywgSVJpbmdpbmdJbmZvLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lSQ0NhbGxDbGllbnQnO1xuaW1wb3J0IHsgSVN0YXR1c0Rvd25Db250LCBJU3luY0NhbGxMb2dSZXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lTaWduYWxUcmFuc3BvcnRlcic7XG5cbi8qKlxuICogY2FsbCBzZXJ2ZXIgbG9nIOi9rOaNolxuICovXG5leHBvcnQgY29uc3QgdHJhbjJDYWxsTG9nID0gKGNhbGxMb2dMaXN0OiBJU3luY0NhbGxMb2dSZXMpOiBJUkNDYWxsUGx1c0NhbGxSZWNvcmQgPT4ge1xuICBjb25zdCB7XG4gICAgY2FsbElkLFxuICAgIGNhbGxUeXBlLFxuICAgIGNhbGxEaXIsXG4gICAgbWVkaWFUeXBlLFxuICAgIGNhbGxpbmdVc2VySWQsXG4gICAgY2FsbFVzZXJJZHMsXG4gICAgY2FsbFN0YXR1cyxcbiAgICBzZXNzaW9uU3RhdHVzLFxuICAgIHN0YXJ0VGltZSxcbiAgICBlbmRUaW1lLFxuICAgIGR1cmF0aW9uLFxuICAgIHN5bmNUaW1lLFxuICAgIHN5c1N0YXR1cyxcbiAgICBjcnRUaW1lLFxuICB9ID0gY2FsbExvZ0xpc3Q7XG4gIHJldHVybiB7XG4gICAgY2FsbElkLFxuICAgIGNhbGxUeXBlLFxuICAgIGNhbGxEaXJlY3Rpb246IGNhbGxEaXIsXG4gICAgbWVkaWFUeXBlLFxuICAgIC8vIGlzU2VjcmV0Q2hhdDogQm9vbGVhbihzZWNyZXRDaGF0KSxcbiAgICBjYWxsZXJVc2VySWQ6IGNhbGxpbmdVc2VySWQsXG4gICAgY2FsbFVzZXJJZHMsXG4gICAgc2Vzc2lvblN0YXRlOiBjYWxsU3RhdHVzLFxuICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICBzdGFydFRpbWVzdGFtcDogc3RhcnRUaW1lLFxuICAgIGVuZFRpbWVzdGFtcDogZW5kVGltZSxcbiAgICBkdXJhdGlvbixcbiAgICBzeW5jVGltZXN0YW1wOiBzeW5jVGltZSxcbiAgICBzeXN0ZW1TdGF0ZTogc3lzU3RhdHVzLFxuICAgIGNyZWF0ZVRpbWVzdGFtcDogY3J0VGltZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBhcnNlU3RhdHVzIHtcbiAgcmluZ2luZ0RhdGE6IElSaW5naW5nSW5mb1tdO1xuICBoYW5ndXBEYXRhOiBJSGFuZ3VwSW5mb1tdO1xuICBhY2NlcHREYXRhOiBJQWNjZXB0SW5mb1tdO1xuICBvdGhlckludml0ZWREYXRhOiBJT3RoZXJNZW1JbmZvW107XG59XG5cbi8qKlxuICogcGFyc2VTdGF0dXNcbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlU3RhdHVzRGF0YSA9IChkYXRhOiBJU3RhdHVzRG93bkNvbnQpOiBJUGFyc2VTdGF0dXMgPT4ge1xuICBjb25zdCB7IGNhbGxJZCB9ID0gZGF0YTtcbiAgY29uc3QgcmluZ2luZ0RhdGE6IElSaW5naW5nSW5mb1tdID0gW107XG4gIGNvbnN0IGhhbmd1cERhdGE6IElIYW5ndXBJbmZvW10gPSBbXTtcbiAgY29uc3QgYWNjZXB0RGF0YTogSUFjY2VwdEluZm9bXSA9IFtdO1xuICBjb25zdCBvdGhlckludml0ZWREYXRhOiBJT3RoZXJNZW1JbmZvW10gPSBbXTtcbiAgZGF0YS5jYWxsU2Vzc2lvblVzZXJzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBjb25zdCB7IHVzZXJJZCwgc2Vzc2lvblN0YXR1cywgc3lzU3RhdHVzIH0gPSBpdGVtO1xuICAgIHN3aXRjaCAoc2Vzc2lvblN0YXR1cykge1xuICAgICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVEOlxuICAgICAgICBvdGhlckludml0ZWREYXRhLnB1c2goe1xuICAgICAgICAgIGNhbGxJZCxcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgdXNlclN0YXRlOiBzZXNzaW9uU3RhdHVzLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLlJJTkdJTkc6XG4gICAgICAgIC8vIOmAmuefpeWTjemTg1xuICAgICAgICByaW5naW5nRGF0YS5wdXNoKHsgY2FsbElkLCBmcm9tVXNlcklkOiB1c2VySWQgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DT05ORUNUSU5HOlxuICAgICAgICAvLyDpgJrnn6Xlr7nmlrnlt7LmjqXlkKxcbiAgICAgICAgYWNjZXB0RGF0YS5wdXNoKHsgZnJvbVVzZXJJZDogdXNlcklkIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FOQ0VMTEVEOlxuICAgICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5ERUNMSU5FRDpcbiAgICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuRU5ERUQ6XG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklETEU6XG4gICAgICAgIGhhbmd1cERhdGEucHVzaCh7XG4gICAgICAgICAgY2FsbElkLFxuICAgICAgICAgIGZyb21Vc2VySWQ6IHVzZXJJZCxcbiAgICAgICAgICB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMsXG4gICAgICAgICAgc3lzdGVtU3RhdGU6IHN5c1N0YXR1cyxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHJpbmdpbmdEYXRhLFxuICAgIGhhbmd1cERhdGEsXG4gICAgYWNjZXB0RGF0YSxcbiAgICBvdGhlckludml0ZWREYXRhLFxuICB9O1xufTtcblxuLyoqXG4gKiDlroPmo4Dmn6XlhYPntKDmmK/lkKbmmK/op4bpopHoioLngrlcbiAqIEBwYXJhbSB7YW55fSBlbGVtZW50IC0g5oKo6KaB5qOA5p+l55qE5YWD57Sg5piv5ZCm5Li66KeG6aKR5YWD57Sg44CCXG4gKiBAcmV0dXJucyDkuIDkuKrluIPlsJTlgLzjgIJcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVmlkZW9Ob2RlTmFtZSA9IChlbGVtZW50OiBhbnkpID0+IGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlTmFtZSAmJiBlbGVtZW50Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdWSURFTyc7XG5cbi8qKlxuICog5qC55o2u55So5oi35b2T5YmN55qEIHN5c3RlbVN0YXRlIOWSjOaWsOS4i+WPkeeahCBzeXN0ZW1TdGF0ZSzmnaXliKTmlq3mlrAgc3lzdGVtU3RhdGUg5piv5ZCm5peg5pWIXG4gKiDkvovvvJrlvZPliY3nlKjmiLflt7LlnKggY2FsbCDkuK3vvIzlj4jmlLbliLDmraTnlKjmiLfnmoQg5ZON6ZOD44CB6L+e5o6l5LitIOetiVxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVTeXNTdGF0ZSA9IChjcnRTdGF0ZTogUkNDYWxsUGx1c1JlYXNvbiwgbmV3U3RhdGU6IFJDQ2FsbFBsdXNSZWFzb24pID0+IHtcbiAgbGV0IGlzSW5WYWxpZCA9IGZhbHNlO1xuICBjb25zdCBpbnZhbGlkU3RhdGVzID0gW1xuICAgIFJDQ2FsbFBsdXNSZWFzb24uSU5WSVRFRCxcbiAgICBSQ0NhbGxQbHVzUmVhc29uLlJJTkdJTkcsXG4gICAgUkNDYWxsUGx1c1JlYXNvbi5CVVNZTElORV9SSU5HSU5HLFxuICAgIFJDQ2FsbFBsdXNSZWFzb24uQlVTWUxJTkVfV0FJVCxcbiAgICBSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJTkcsXG4gICAgUkNDYWxsUGx1c1JlYXNvbi5PTkNBTEwsXG4gIF07XG4gIGlmIChjcnRTdGF0ZSA9PT0gUkNDYWxsUGx1c1JlYXNvbi5PTkNBTEwgJiYgaW52YWxpZFN0YXRlcy5pbmNsdWRlcyhuZXdTdGF0ZSkpIHtcbiAgICBpc0luVmFsaWQgPSB0cnVlO1xuICB9XG4gIHJldHVybiBpc0luVmFsaWQ7XG59O1xuXG4vKipcbiAgICog5qC55o2u55So5oi35b2T5YmN55qEIHVzZXJTdGF0ZSDlkozmlrDkuIvlj5HnmoQgdXNlclN0YXRlLOadpeWIpOaWreaWsCB1c2VyU3RhdGUg5piv5ZCm5peg5pWIXG4gICAqIOaXoOaViOeahOeUqOaIt+eKtuaAgVxuICAgKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVVzZXJTdGF0ZSA9IChjcnRTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUsIG5ld1N0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSkgPT4ge1xuICBsZXQgaXNJblZhbGlkID0gZmFsc2U7XG4gIGNvbnN0IGludmFsaWRTdGF0ZXMgPSBbXG4gICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRCxcbiAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5SSU5HSU5HLFxuICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkJVU1lMSU5FX1JJTkdJTkcsXG4gICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQlVTWUxJTkVfV0FJVCxcbiAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DT05ORUNUSU5HLFxuICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk9OQ0FMTCxcbiAgXTtcbiAgaWYgKGNydFN0YXRlID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5PTkNBTEwgJiYgaW52YWxpZFN0YXRlcy5pbmNsdWRlcyhuZXdTdGF0ZSkpIHtcbiAgICBpc0luVmFsaWQgPSB0cnVlO1xuICB9XG4gIHJldHVybiBpc0luVmFsaWQ7XG59O1xuXG4vKipcbiAqIOiOt+WPluaMguaWreaXtueahOS6uuWRmOezu+e7n+eKtuaAgVxuICogQHBhcmFtIHVzZXJTdGF0ZSDkurrlkZjnirbmgIFcbiAqIEBwYXJhbSBpc0NhbGxlZSDmmK/lkKbmmK/ooqvlj6tcbiAqIEByZXR1cm5zIOS6uuWRmOezu+e7n+eKtuaAgVxuICovXG5leHBvcnQgY29uc3QgZ2V0SGFuZ3VwU3lzdGVtU3RhdGUgPSAodXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSwgaXNDYWxsZWU6IGJvb2xlYW4pID0+IHtcbiAgbGV0IHN5c3RlbVN0YXRlO1xuICBzd2l0Y2ggKHVzZXJTdGF0ZSkge1xuICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FMTElORzpcbiAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5DQU5DRUxMRUQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLlJJTkdJTkc6XG4gICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVEOlxuICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkRFQ0xJTkVEO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5DT05ORUNUSU5HOlxuICAgICAgc3lzdGVtU3RhdGUgPSBpc0NhbGxlZSA/IFJDQ2FsbFBsdXNSZWFzb24uREVDTElORUQgOiBSQ0NhbGxQbHVzUmVhc29uLkNBTkNFTExFRDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuT05DQUxMOlxuICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLkVOREVEO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHN5c3RlbVN0YXRlO1xufTtcblxuLyoqXG4gKiDliKTmlq3mmK/lkKblvIDlp4vpn7Pop4bpopHmnI3liqFcbiAqL1xuZXhwb3J0IGNvbnN0IGlzU3VwcG9ydE1lZGlhU2VydmVyID0gKG5hdmlJbmZvOiBJTmF2aUluZm8pID0+IHtcbiAgY29uc3QgeyB2b2lwQ2FsbEluZm8gfSA9IG5hdmlJbmZvO1xuICBpZiAoIXZvaXBDYWxsSW5mbykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHsgc3RyYXRlZ3kgfSA9IEpTT04ucGFyc2Uodm9pcENhbGxJbmZvKTtcbiAgaWYgKHN0cmF0ZWd5ICE9PSAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVCaXRyYXRlID0gKG1pbkJpdHJhdGU/OiBudW1iZXIsIG1heEJpdHJhdGU/OiBudW1iZXIpID0+IHtcbiAgaWYgKG1pbkJpdHJhdGUgfHwgbWluQml0cmF0ZSA9PT0gMCkge1xuICAgIGlmICghaXNOdW1iZXIobWluQml0cmF0ZSkgfHwgbWluQml0cmF0ZSA8PSAwKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiwgZXJyb3JNc2c6IGBwYXJhbXMgZXJyb3IgLT4gbWluQml0cmF0ZTogYSBudW1iZXIgb2YgPiAwLCB2YWx1ZTogJHttaW5CaXRyYXRlfWAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAobWF4Qml0cmF0ZSB8fCBtYXhCaXRyYXRlID09PSAwKSB7XG4gICAgaWYgKCFpc051bWJlcihtYXhCaXRyYXRlKSB8fCBtYXhCaXRyYXRlIDw9IDApIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLCBlcnJvck1zZzogYHBhcmFtcyBlcnJvciAtPiBtYXhCaXRyYXRlOiBhIG51bWJlciBvZiA+IDAsIHZhbHVlOiAke21heEJpdHJhdGV9YCB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChtaW5CaXRyYXRlICYmIG1heEJpdHJhdGUgJiYgbWF4Qml0cmF0ZSA8IG1pbkJpdHJhdGUpIHtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiwgZXJyb3JNc2c6IGBwYXJhbXMgZXJyb3IgLT4gbWF4Qml0cmF0ZTogJHttYXhCaXRyYXRlfSwgbWluQml0cmF0ZTogJHttaW5CaXRyYXRlfSwgbWF4Qml0cmF0ZSBzaG91bGQgPiBtaW5CaXRyYXRlYCB9O1xuICB9XG5cbiAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJWaWRlb1ZpZXdJbmZvID0gKHVzZXJWaWV3TWFwOiB7IFt1c2VySWQ6IHN0cmluZ106IHsgdmlkZW9WaWV3OiBIVE1MVmlkZW9FbGVtZW50LCBpc1Rpbnk6IGJvb2xlYW4gfSB9KSA9PiB7XG4gIGNvbnN0IHVzZXJWaWV3TWFwSW5mbyA9IFtdO1xuICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB1c2VyVmlld01hcCkge1xuICAgIGNvbnN0IHsgdmlkZW9WaWV3LCBpc1RpbnkgfSA9IHVzZXJWaWV3TWFwW3VzZXJJZF07XG4gICAgdXNlclZpZXdNYXBJbmZvLnB1c2goe1xuICAgICAgdXNlcklkLFxuICAgICAgdmlkZW9WaWV3OiB2aWRlb1ZpZXcubm9kZU5hbWUsXG4gICAgICBpc1RpbnksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHVzZXJWaWV3TWFwSW5mbztcbn07XG5cbi8qKlxuICog55Sf5oiQIHB1c2hDb25maWdzIEpTT05cbiAqIEBkZXNjcmlwdGlvblxuICog5LiOIFNlcnZlciDnuqblrprkuIDoh7TvvIwgdGhyZWFkSWTjgIFhcG5zQ29sbGFwc2VJZOOAgWNoYW5uZWxJZE1p44CBY2hhbm5lbElkSFfjgIFjaGFubmVsSWRPUFBP44CBdHlwZVZpdm8g5peg5YC85pe25Y+v5Lyg56m65a2X56ym5LiyXG4qL1xuY29uc3QgcHVzaENvbmZpZ3NUb0pTT04gPSAoaU9TQ29uZmlnOiBJaU9TUHVzaENvbmZpZyA9IHt9LCBhbmRyb2lkQ29uZmlnOiBJQW5kcm9pZFB1c2hDb25maWcgPSB7fSwgY2xpZW50Q2FsbElkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7XG4gICAgdGhyZWFkSWQsIGFwbnNDb2xsYXBzZUlkLCByaWNoTWVkaWFVcmksXG4gIH0gPSBpT1NDb25maWc7XG4gIGNvbnN0IHtcbiAgICBjaGFubmVsSWRNaSwgY2hhbm5lbElkSFcsIGNoYW5uZWxJZE9QUE8sIHR5cGVWaXZvLCBmY21DaGFubmVsSWQsIGZjbUNvbGxhcHNlS2V5LCBmY21JbWFnZVVybCxcbiAgICBpbXBvcnRhbmNlSFcsIGNhdGVnb3J5SFcsIGltYWdlVXJsSFcsIGNhdGVnb3J5Vml2bywgaW1wb3J0YW5jZUhvbm9yLCBpbWFnZVVybEhvbm9yLFxuICB9ID0gYW5kcm9pZENvbmZpZztcbiAgY29uc3QgQVBOUzoge1trZXk6IHN0cmluZ106IHN0cmluZ30gPSB7fTtcbiAgdGhyZWFkSWQgJiYgKEFQTlNbJ3RocmVhZC1pZCddID0gdGhyZWFkSWQpO1xuICBBUE5TWydhcG5zLWNvbGxhcHNlLWlkJ10gPSBhcG5zQ29sbGFwc2VJZCB8fCBjbGllbnRDYWxsSWQ7XG4gIHJpY2hNZWRpYVVyaSAmJiAoQVBOUy5yaWNoTWVkaWFVcmkgPSByaWNoTWVkaWFVcmkpO1xuXG4gIGNvbnN0IEhXOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSA9IHt9O1xuICBjaGFubmVsSWRIVyAmJiAoSFcuY2hhbm5lbElkID0gY2hhbm5lbElkSFcpO1xuICBpbWFnZVVybEhXICYmIChIVy5pbWFnZSA9IGltYWdlVXJsSFcpO1xuICBjYXRlZ29yeUhXICYmIChIVy5jYXRlZ29yeSA9IGNhdGVnb3J5SFcpO1xuICBIVy5pbXBvcnRhbmNlID0gaW1wb3J0YW5jZUhXIHx8ICdOT1JNQUwnO1xuXG4gIGNvbnN0IHB1c2hDb25nZmlnczogYW55ID0gW1xuICAgIHtcbiAgICAgIEhXLFxuICAgIH0sXG4gICAge1xuICAgICAgQVBOUyxcbiAgICB9LFxuICBdO1xuXG4gIGxldCBGQ006IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuICBpZiAoZmNtQ29sbGFwc2VLZXkgfHwgZmNtSW1hZ2VVcmwgfHwgZmNtQ2hhbm5lbElkKSB7XG4gICAgRkNNID0ge307XG4gICAgZmNtQ29sbGFwc2VLZXkgJiYgKEZDTS5jb2xsYXBzZV9rZXkgPSBmY21Db2xsYXBzZUtleSk7XG4gICAgZmNtSW1hZ2VVcmwgJiYgKEZDTS5pbWFnZVVybCA9IGZjbUltYWdlVXJsKTtcbiAgICBmY21DaGFubmVsSWQgJiYgKEZDTS5jaGFubmVsSWQgPSBmY21DaGFubmVsSWQpO1xuICAgIHB1c2hDb25nZmlnc1swXS5GQ00gPSBGQ007XG4gIH1cblxuICBsZXQgTUk6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuICBpZiAoY2hhbm5lbElkTWkpIHtcbiAgICBNSSA9IHt9O1xuICAgIGNoYW5uZWxJZE1pICYmIChNSS5jaGFubmVsSWQgPSBjaGFubmVsSWRNaSk7XG4gICAgcHVzaENvbmdmaWdzWzBdLk1JID0gTUk7XG4gIH1cblxuICBsZXQgT1BQTzoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIGlmIChjaGFubmVsSWRPUFBPKSB7XG4gICAgT1BQTyA9IHt9O1xuICAgIE9QUE8uY2hhbm5lbElkID0gY2hhbm5lbElkT1BQTztcbiAgICBwdXNoQ29uZ2ZpZ3NbMF0uT1BQTyA9IE9QUE87XG4gIH1cblxuICBsZXQgVklWTzoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIGlmICh0eXBlVml2byB8fCBjYXRlZ29yeVZpdm8pIHtcbiAgICBWSVZPID0ge307XG4gICAgdHlwZVZpdm8gJiYgKFZJVk8uY2xhc3NpZmljYXRpb24gPSB0eXBlVml2byk7XG4gICAgY2F0ZWdvcnlWaXZvICYmIChWSVZPLmNhdGVnb3J5ID0gY2F0ZWdvcnlWaXZvKTtcbiAgICBwdXNoQ29uZ2ZpZ3NbMF0uVklWTyA9IFZJVk87XG4gIH1cblxuICBsZXQgSE9OT1I6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuICBpZiAoaW1wb3J0YW5jZUhvbm9yIHx8IGltYWdlVXJsSG9ub3IpIHtcbiAgICBIT05PUiA9IHt9O1xuICAgIGltcG9ydGFuY2VIb25vciAmJiAoSE9OT1IuaW1wb3J0YW5jZSA9IGltcG9ydGFuY2VIb25vcik7XG4gICAgaW1hZ2VVcmxIb25vciAmJiAoSE9OT1IuaW1hZ2UgPSBpbWFnZVVybEhvbm9yKTtcbiAgICBwdXNoQ29uZ2ZpZ3NbMF0uSE9OT1IgPSBIT05PUjtcbiAgfVxuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShwdXNoQ29uZ2ZpZ3MpO1xufTtcblxuLyoqXG4gKiDmioogcHVzaENvbmZpZyDovazljJbkuLrmnI3liqHnq6/pnIDopoHnmoTmlbDmja5cbiAqL1xuZXhwb3J0IGNvbnN0IHRyYW5zU2VydmVyUHVzaEV4dCA9IChwdXNoQ29uZmlnOiBJUkNDYWxsUGx1c1B1c2hDb25maWcsIGNsaWVudENhbGxJZDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBwdXNoVGl0bGUgPSAnJywgaU9TQ29uZmlnLCBhbmRyb2lkQ29uZmlnLCBkaXNhYmxlUHVzaFRpdGxlLCB0ZW1wbGF0ZUlkLFxuICB9ID0gcHVzaENvbmZpZztcbiAgY29uc3QgcHVzaEV4dDogYW55ID0ge1xuICAgIHB1c2hDb25maWdzOiBwdXNoQ29uZmlnc1RvSlNPTihpT1NDb25maWcsIGFuZHJvaWRDb25maWcsIGNsaWVudENhbGxJZCksXG4gIH07XG4gIGlzQm9vbGVhbihkaXNhYmxlUHVzaFRpdGxlKSAmJiAocHVzaEV4dC5kaXNhYmxlVGl0bGUgPSBkaXNhYmxlUHVzaFRpdGxlKTtcbiAgcHVzaFRpdGxlICYmIChwdXNoRXh0LnRpdGxlID0gcHVzaFRpdGxlKTtcbiAgdGVtcGxhdGVJZCAmJiAocHVzaEV4dC50ZW1wbGF0ZUlkID0gdGVtcGxhdGVJZCk7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShwdXNoRXh0KTtcbn07XG5cbi8qKlxuICog5qCh6aqMIHB1c2hDb25maWdcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUHVzaENvbmZpZyA9IChwdXNoQ29uZmlnOiBJUkNDYWxsUGx1c1B1c2hDb25maWcpID0+IHtcbiAgY29uc3QgcHVzaENvbmZpZ0tleXMgPSBbJ3B1c2hUaXRsZScsICdpT1NDb25maWcnLCAnYW5kcm9pZENvbmZpZycsICdkaXNhYmxlUHVzaFRpdGxlJywgJ3RlbXBsYXRlSWQnXTtcbiAgY29uc3Qga2V5SXNSaWdodCA9IE9iamVjdC5rZXlzKHB1c2hDb25maWcpLmV2ZXJ5KChrZXkpID0+IHB1c2hDb25maWdLZXlzLmluY2x1ZGVzKGtleSkpO1xuICBpZiAoIWtleUlzUmlnaHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IsXG4gICAgICBlcnJvck1zZzogYHJpZ2h0IGtleTogJHtwdXNoQ29uZmlnS2V5cy5qb2luKCcsJyl9YCxcbiAgICB9O1xuICB9XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHB1c2hDb25maWdLZXlzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGtleSA9IHB1c2hDb25maWdLZXlzW2luZGV4XTtcbiAgICAvKipcbiAgICAgKiDmoKHpqowgYm9vbGVhbiDnsbvlnotcbiAgICAgKi9cbiAgICBpZiAoa2V5ID09PSAnZGlzYWJsZVB1c2hUaXRsZScpIHtcbiAgICAgIGlmICghaXNVbmRlZmluZWQocHVzaENvbmZpZ1trZXldKSAmJiAhaXNCb29sZWFuKHB1c2hDb25maWdba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUixcbiAgICAgICAgICBlcnJvck1zZzogYCR7a2V5fSB0eXBlIGlzIGJvb2xlYW5gLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncHVzaFRpdGxlJ1xuICAgICAgfHwga2V5ID09PSAndGVtcGxhdGVJZCcpIHtcbiAgICAgIC8qKlxuICAgICAgICog5qCh6aqMIHN0cmluZyDnsbvlnotcbiAgICAgICAqL1xuICAgICAgaWYgKHB1c2hDb25maWdba2V5XSAmJiAhaXNTdHJpbmcocHVzaENvbmZpZ1trZXldKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgICAgIGVycm9yTXNnOiBgJHtrZXl9IHR5cGUgaXMgc3RyaW5nYCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgeyBpT1NDb25maWcsIGFuZHJvaWRDb25maWcgfSA9IHB1c2hDb25maWc7XG5cbiAgLyoqXG4gICAqIOagoemqjCBpT1NDb25maWdcbiAgICovXG4gIGNvbnN0IHZhbGlkYXRlSU9TQ29uZmlnUmVzID0gdmFsaWRhdGVJT1NDb25maWcoaU9TQ29uZmlnIHx8IHt9KTtcbiAgaWYgKHZhbGlkYXRlSU9TQ29uZmlnUmVzLmNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVJT1NDb25maWdSZXM7XG4gIH1cblxuICAvKipcbiAgICog5qCh6aqMIGFuZHJvaWRDb25maWdcbiAgICovXG4gIGNvbnN0IHZhbGlkYXRlQW5kcm9pZENvbmZpZ1JlcyA9IHZhbGlkYXRlQW5kcm9pZENvbmZpZyhhbmRyb2lkQ29uZmlnIHx8IHt9KTtcbiAgaWYgKHZhbGlkYXRlQW5kcm9pZENvbmZpZ1Jlcy5jb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlQW5kcm9pZENvbmZpZ1JlcztcbiAgfVxuXG4gIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbn07XG5cbmNvbnN0IHZhbGlkYXRlSU9TQ29uZmlnID0gKGlPU0NvbmZpZzogSWlPU1B1c2hDb25maWcpID0+IHtcbiAgY29uc3QgeyB0aHJlYWRJZCwgcmljaE1lZGlhVXJpIH0gPSBpT1NDb25maWcgfHwge307XG4gIGlmICh0aHJlYWRJZCAmJiAhaXNTdHJpbmcodGhyZWFkSWQpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgZXJyb3JNc2c6ICdpT1NDb25maWcudGhyZWFkSWQgdHlwZSBpcyBzdHJpbmcnLFxuICAgIH07XG4gIH1cblxuICBpZiAocmljaE1lZGlhVXJpICYmICFpc1N0cmluZyhyaWNoTWVkaWFVcmkpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgZXJyb3JNc2c6ICdpT1NDb25maWcucmljaE1lZGlhVXJpIHR5cGUgaXMgc3RyaW5nJyxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbn07XG5cbmNvbnN0IHZhbGlkYXRlQW5kcm9pZENvbmZpZyA9IChhbmRyb2lkQ29uZmlnOiBhbnkpID0+IHtcbiAgY29uc3QgYW5kcm9pZENvbmZpZ0tleXMgPSBbJ2NoYW5uZWxJZE1pJywgJ2NoYW5uZWxJZEhXJywgJ2NhdGVnb3J5SFcnLCAnaW1wb3J0YW5jZUhXJywgJ2ltYWdlVXJsSFcnLCAnY2hhbm5lbElkT1BQTycsICd0eXBlVml2bycsICdjYXRlZ29yeVZpdm8nLCAnZmNtQ2hhbm5lbElkJywgJ2ZjbUNvbGxhcHNlS2V5JywgJ2ZjbUltYWdlVXJsJywgJ2ltcG9ydGFuY2VIb25vcicsICdpbWFnZVVybEhvbm9yJ107XG4gIGNvbnN0IGtleUlzUmlnaHQgPSBPYmplY3Qua2V5cyhhbmRyb2lkQ29uZmlnKS5ldmVyeSgoa2V5KSA9PiBhbmRyb2lkQ29uZmlnS2V5cy5pbmNsdWRlcyhrZXkpKTtcbiAgaWYgKCFrZXlJc1JpZ2h0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgZXJyb3JNc2c6IGByaWdodCBrZXk6ICR7YW5kcm9pZENvbmZpZ0tleXMuam9pbignLCcpfWAsXG4gICAgfTtcbiAgfVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhbmRyb2lkQ29uZmlnS2V5cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBrZXkgPSBhbmRyb2lkQ29uZmlnS2V5c1tpbmRleF07XG4gICAgaWYgKGtleSA9PT0gJ2ltcG9ydGFuY2VIVycgfHwga2V5ID09PSAnaW1wb3J0YW5jZUhvbm9yJykge1xuICAgICAgaWYgKGFuZHJvaWRDb25maWdba2V5XSAmJiBhbmRyb2lkQ29uZmlnW2tleV0gIT09ICdMT1cnICYmIGFuZHJvaWRDb25maWdba2V5XSAhPT0gJ05PUk1BTCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUixcbiAgICAgICAgICBlcnJvck1zZzogYGFuZHJvaWRDb25maWcuJHtrZXl9IHZhbHVlIGlzIE5PUk1BTHxMT1dgLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYW5kcm9pZENvbmZpZ1trZXldICYmICFpc1N0cmluZyhhbmRyb2lkQ29uZmlnW2tleV0pKSB7XG4gICAgICAvKipcbiAgICAgICAqIOagoemqjCBzdHJpbmcg57G75Z6LXG4gICAgICAgKi9cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SLFxuICAgICAgICBlcnJvck1zZzogYGFuZHJvaWRDb25maWcuJHtrZXl9IHR5cGUgaXMgc3RyaW5nYCxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCeXRlTGVuZ3RoID0gKHN0cjogc3RyaW5nLCBjaGFyc2V0OiBzdHJpbmcgPSAndXRmLTgnKSA9PiB7XG4gIGxldCB0b3RhbCA9IDA7XG4gIGlmIChjaGFyc2V0ID09PSAndXRmLTE2Jykge1xuICAgIHRvdGFsID0gY2FsY3VsYXRlVVRGMTZCeXRlTGVuZ3RoKHN0cik7XG4gIH0gZWxzZSB7XG4gICAgdG90YWwgPSBjYWxjdWxhdGVVVEY4Qnl0ZUxlbmd0aChzdHIpO1xuICB9XG4gIHJldHVybiB0b3RhbDtcbn07XG5cbmNvbnN0IGNhbGN1bGF0ZVVURjE2Qnl0ZUxlbmd0aCA9IChzdHI6IHN0cmluZykgPT4ge1xuICBsZXQgdG90YWwgPSAwOyBsZXQgY2hhdENvZGU6IG51bWJlcjtcbiAgZm9yIChsZXQgaSA9IDAsIG1heCA9IHN0ci5sZW5ndGg7IGkgPCBtYXg7IGkrKykge1xuICAgIGNoYXRDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGNoYXRDb2RlIDw9IDB4ZmZmZikge1xuICAgICAgdG90YWwgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgdG90YWwgKz0gNDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvdGFsO1xufTtcblxuY29uc3QgY2FsY3VsYXRlVVRGOEJ5dGVMZW5ndGggPSAoc3RyOiBzdHJpbmcpID0+IHtcbiAgbGV0IHRvdGFsID0gMDsgbGV0IGNoYXRDb2RlOiBudW1iZXI7XG4gIGZvciAobGV0IGkgPSAwLCBtYXggPSBzdHIubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHtcbiAgICBjaGF0Q29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjaGF0Q29kZSA8IDB4MDA3Zikge1xuICAgICAgdG90YWwgKz0gMTtcbiAgICB9IGVsc2UgaWYgKGNoYXRDb2RlIDw9IDB4MDdmZikge1xuICAgICAgdG90YWwgKz0gMjtcbiAgICB9IGVsc2UgaWYgKGNoYXRDb2RlIDw9IDB4ZmZmZikge1xuICAgICAgdG90YWwgKz0gMztcbiAgICB9IGVsc2Uge1xuICAgICAgdG90YWwgKz0gNDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvdGFsO1xufTtcbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnIHtcbiAgLyoqXG4gICAqIOWPkei1t+mAmuivnVxuICAgKi9cbiAgTF9RU19TVEFSVF9DQUxMX1MgPSAnQ2FsbC1zdGFydC1TJyxcbiAgLyoqXG4gICAqIOaOpeWQrOmAmuivnVxuICAgKi9cbiAgTF9RU19BQ0NFUFRfQ0FMTF9TID0gJ0NhbGwtYWNjZXB0LVMnLFxuICAvKipcbiAgICog5oyC5pat6YCa6K+dXG4gICAqL1xuICBMX1FTX0hBTkdVUF9DQUxMX1MgPSAnQ2FsbC1oYW5ndXAtUycsXG4gIC8qKlxuICAgKiDmlLbliLDpgJror51cbiAgICovXG4gIExfUVNfUkVDRUlWRV9DQUxMX1MgPSAnQ2FsbC1yZWN2LVMnLFxuICAvKipcbiAgICog5byC5bi45oyC5patXG4gICAqL1xuICBMX1FTX0FCTk9STUFMX0hBTkdVUF9TID0gJ0NhbGwtaW50ZXJydXB0LVMnXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgUGx1Z2luQ29udGV4dCB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lDYWxsUGx1c1N0YXRpc3RpY3MnO1xuaW1wb3J0IHtcbiAgUkNDYWxsUGx1c01lZGlhVHlwZSwgUkNDYWxsUGx1c1Nlc3Npb24sIFJDQ2FsbFBsdXNUeXBlLFxufSBmcm9tICcuLi9hcGkvaW50ZXJmYWNlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSQ0NhbGxQTHVzU3RhdGlzdGljcyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUGx1Z2luQ29udGV4dCxcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgcmVwb3J0U3RhdGlzdGljc0RhdGEoXG4gICAgdGFnOiBSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyxcbiAgICBjb2RlOiBudW1iZXIsXG4gICAgc3RhcnRUaW1lOiBudW1iZXIsXG4gICAgc2Vzc2lvbjogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsLFxuICAgIGNsaWVudENhbGxJZD86IHN0cmluZyxcbiAgICBpbnZpdGVTb3VyY2U/OiBSQ0NhbGxQbHVzSW52aXRlU291cmNlIHwgbnVsbCxcbiAgICBleHRyYT86IHtcbiAgICAgIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgICAgIGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSxcbiAgICAgIGNhbGxJZDogc3RyaW5nLFxuICAgIH0sXG4gICkge1xuICAgIGNvbnN0IG5vd1RpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB7IG1lZGlhVHlwZSwgY2FsbFR5cGUsIGNhbGxJZCB9ID0gc2Vzc2lvbiA/IHsgbWVkaWFUeXBlOiBzZXNzaW9uLmdldE1lZGlhVHlwZSgpLCBjYWxsVHlwZTogc2Vzc2lvbi5nZXRDYWxsVHlwZSgpLCBjYWxsSWQ6IHNlc3Npb24uZ2V0Q2FsbElkKCkgfSA6IGV4dHJhITtcbiAgICBjb25zdCBjb21tb25EYXRhID0ge1xuICAgICAgY3I6ICd1bmtub3duJyxcbiAgICAgIG5ldDogJ3Vua25vd24nLFxuICAgICAgY29kOiBjb2RlLFxuICAgICAgbXRwOiBtZWRpYVR5cGUsXG4gICAgICBjdHA6IGNhbGxUeXBlLFxuICAgICAgY2lkOiBjYWxsSWQsXG4gICAgICB0aW1lOiBub3dUaW1lLFxuICAgICAgdWlkOiB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLFxuICAgIH07XG5cbiAgICBjbGllbnRDYWxsSWQgJiYgT2JqZWN0LmFzc2lnbihjb21tb25EYXRhLCB7IGNjaWQ6IGNsaWVudENhbGxJZCB9KTtcblxuICAgIGxldCBkYXRhID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAvKipcbiAgICAgICAqIOaUtuWIsOWRvOWPq1xuICAgICAgICovXG4gICAgICBjYXNlIFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfUkVDRUlWRV9DQUxMX1M6XG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgLi4uY29tbW9uRGF0YSxcbiAgICAgICAgICByZjogaW52aXRlU291cmNlLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIC8qKlxuICAgICAgICog5byC5bi45oyC5patXG4gICAgICAgKi9cbiAgICAgIGNhc2UgUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19BQk5PUk1BTF9IQU5HVVBfUzpcbiAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICAuLi5jb21tb25EYXRhLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlj5HotbfjgIHmjqXlkKzjgIHmjILmlq3pgJror51cbiAgICAgICAgICovXG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgLi4uY29tbW9uRGF0YSxcbiAgICAgICAgICBkdXI6IG5vd1RpbWUgLSBzdGFydFRpbWUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oJ0wtY2FsbC1wbHVzLXN0YXRpc3RpYycsIEpTT04uc3RyaW5naWZ5KGRhdGEpLCB0YWcpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLl9fc3RhdGlzdGljcyh0YWcsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgfVxufVxuIiwiLyoqXG4gKiDlr7nor53liqjkvZxcbiAqL1xuZXhwb3J0IGVudW0gRGlhbG9nQWN0aW9uIHtcbiAgLyoqXG4gICAqIOivt+axglxuICAgKi9cbiAgUkVRVUVTVCA9ICdyZXF1ZXN0JyxcbiAgLyoqXG4gICAqIOaOpeWPl1xuICAgKi9cbiAgQUNDRVBUID0gJ2FjY2VwdCcsXG4gIC8qKlxuICAgKiDmi5Lnu51cbiAgICovXG4gIFJFRlVTRSA9ICdyZWZ1c2UnLFxuICAvKipcbiAgICog6K+35rGC5Y+W5raIXG4gICAqL1xuICBDQU5DRUwgPSAnY2FuY2VsJyxcbiAgLyoqXG4gICAqIOmAmuefpVxuICAgKi9cbiAgTk9USUNFID0gJ25vdGljZScsXG4gIC8qKlxuICAgKiDotoXml7ZcbiAgICovXG4gIFRJTUVPVVQgPSAndGltZW91dCdcbn1cbiIsIi8qKlxuICog5a+56K+d57G75Z6LXG4gKi9cbmV4cG9ydCBlbnVtIERpYWxvZ1R5cGUge1xuICBTV0lUQ0hfTUVESUFfVFlQRSA9IDFcbn1cbiIsIi8qKlxuICog6YCa6K+d6aKd5aSW57G75Z6L77yI56e75Yqo56uv54m55pyJ77yJXG4gKi9cbmV4cG9ydCBlbnVtIFNlY3JldENhbGxUeXBlIHtcbiAgLyoqXG4gICAqIOaZrumAmumAmuivnVxuICAgKi9cbiAgTk9STUFMLFxuICAvKipcbiAgICog5a+G6IGKXG4gICAqL1xuICBTRUNSRVRcbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWFsb2dBY3Rpb24gfSBmcm9tICcuLi9lbnVtcy9EaWFsb2dBY3Rpb24nO1xuaW1wb3J0IHsgUkNDYWxsUGx1c01lZGlhVHlwZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NhbGxTdGF0ZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFNlc3Npb25TdGF0ZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzVHlwZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUgfSBmcm9tICcuLi9lbnVtcy9SQ0NhbGxTZXNzaW9uVXNlclN0YXRlJztcbmltcG9ydCB7IElTZXNzaW9uVXNlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyB2YWxpZGF0ZVN5c1N0YXRlLCB2YWxpZGF0ZVVzZXJTdGF0ZSB9IGZyb20gJy4uL3V0aWxzL2hlbHBlcic7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlYXNvbiB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzUmVhc29uJztcblxuZXhwb3J0IGVudW0gQ2FsbFRpbWVyRXZlbnRUeXBlIHtcbiAgSU5WSVRFUiA9ICdpbnZpdGVyJyxcbiAgSU5WSVRFRSA9ICdpbnZpdGVlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElPbGREaWFsb2dEYXRhe1xuICB0cmFuc2FjdGlvbklkPzogc3RyaW5nO1xuICBhY3Rpb246IERpYWxvZ0FjdGlvbjtcbiAgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlO1xufVxuXG4vKipcbiAqIFNESyDlhoXpg6jkvb/nlKggU2Vzc2lvbiDlrp7kvotcbiAqL1xuZXhwb3J0IGNsYXNzIFJDQ2FsbElubmVyU2Vzc2lvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiDor7fmsYLmm7TmlrDnmoQgbWVkaWFUeXBlXG4gICAqL1xuICBwcml2YXRlIF9yZXFNZWRpYVR5cGUhOiBSQ0NhbGxQbHVzTWVkaWFUeXBlIHwgbnVsbFxuXG4gIC8qKlxuICAgKiDpgoDor7fogIXotoXml7borqHml7blmahcbiAgICovXG4gIHByaXZhdGUgX2ludml0ZXJUaW1lcklkITogbnVtYmVyXG5cbiAgLyoqXG4gICAqIOiiq+mCgOivt+iAhei2heaXtuiuoeaXtuWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfaW52aXRlZVRpbWVySWQhOiBudW1iZXJcblxuICAvKipcbiAgICog5b2T5YmNIHNlc3Npb24g5Lq65ZGY5L+h5oGv5YiX6KGoXG4gICAqL1xuICAvLyBwcml2YXRlIF9jYWxsVXNlcnM6IElTZXNzaW9uVXNlcltdID0gW11cblxuICAvKipcbiAgICog5penIGRpYWxvZyDmlbDmja7vvIznlKjkuo7lr7nmr5RcbiAgICovXG4gIHByaXZhdGUgX29sZERpYWxvZ0RhdGEhOiBJT2xkRGlhbG9nRGF0YVxuXG4gIC8qKlxuICAgKiDorrDlvZXmmK/lkKbmnKzlnLDmnInmjILmlq1cbiAgICovXG4gIHByaXZhdGUgaXNMb2NhbENsaWVudEhhbmd1cDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIOaehOmAoOWZqFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogQ2FsbCBJRFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NhbGxJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIHNlc3Npb24g54q25oCBXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc3RhdGU6IFJDQ2FsbFBsdXNDYWxsU3RhdGUsXG4gICAgLyoqXG4gICAgICog6YCa6K+d57G75Z6LXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2FsbFR5cGU6IFJDQ2FsbFBsdXNUeXBlLFxuICAgIC8qKlxuICAgICAqIOmAmuivneWqkuS9k+exu+Wei1xuICAgICAqL1xuICAgIHByaXZhdGUgX21lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgICAvKipcbiAgICAgKiBzZXNzaW9uIOWRvOWPq+WPkei1t+iAhVxuICAgICAqL1xuICAgIHByaXZhdGUgX3N0YXJ0Q2FsbGVySWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiDmnKzmrKEgc2Vzc2lvbiDnmoTpgoDor7fogIVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jYWxsZXJJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIOW9k+WJjSBzZXNzaW9uIOS6uuWRmOS/oeaBr+WIl+ihqFxuICAgICAqL1xuICAgIHByaXZhdGUgX2NhbGxVc2VyczogSVNlc3Npb25Vc2VyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgQ2FsbElEXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FsbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bnirbmgIFcbiAgICovXG4gIHB1YmxpYyBnZXRTZXNzaW9uU3RhdGUoKTogUkNDYWxsUGx1c0NhbGxTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumAmuivneexu+Wei1xuICAgKi9cbiAgcHVibGljIGdldENhbGxUeXBlKCk6IFJDQ2FsbFBsdXNUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbFR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5aqS5L2T57G75Z6LXG4gICAqL1xuICBwdWJsaWMgZ2V0TWVkaWFUeXBlKCk6IFJDQ2FsbFBsdXNNZWRpYVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9tZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIHNlc3Npb24g5Y+R6LW36ICFXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhcnRDYWxsZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGFydENhbGxlcklkO1xuICB9XG5cbiAgLyoqXG4gICAqIOacrOasoSBzZXNzaW9uIOmCgOivt+iAhVxuICAgKi9cbiAgcHVibGljIGdldENhbGxlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxlcklkO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBzZXNzaW9uIHVzZXIgbGlzdFxuICAgKi9cbiAgcHVibGljIGdldFVzZXJMaXN0KCk6IElTZXNzaW9uVXNlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbFVzZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIOivt+axguabtOaWsOeahCBtZWRpYVR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXRSZXFNZWRpYVR5cGUoKTogUkNDYWxsUGx1c01lZGlhVHlwZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yZXFNZWRpYVR5cGU7XG4gIH1cblxuICAvKipcbiAgICogaW52aXRlclRpbWVySWRcbiAgICovXG4gIHB1YmxpYyBnZXRJbnZpdGVyVGltZXJJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbnZpdGVyVGltZXJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBpbnZpdGVlVGltZXJJZFxuICAgKi9cbiAgcHVibGljIGdldEludml0ZWVUaW1lcklkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2ludml0ZWVUaW1lcklkO1xuICB9XG5cbiAgcHVibGljIGdldEFsbFRpbWVySWRzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gW3RoaXMuX2ludml0ZXJUaW1lcklkLCB0aGlzLl9pbnZpdGVlVGltZXJJZF07XG4gIH1cblxuICBwdWJsaWMgc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQ6IHN0cmluZywgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlLCBlbmFibGU6IGJvb2xlYW4sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1NFVF9VU0VSX0RFVklDRV9FTkFCTEVfTywgYHVzZXJJZDogJHt1c2VySWR9LCBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfSwgZW5hYmxlOiAke2VuYWJsZX1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB1c2VyU3RhdGUgPSB0aGlzLl9jYWxsVXNlcnMuZmluZCgoaXRlbSkgPT4gdXNlcklkID09PSBpdGVtLnVzZXJJZCk7XG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykge1xuICAgICAgdXNlclN0YXRlIS5taWNyb3Bob25lRW5hYmxlID0gZW5hYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB1c2VyU3RhdGUhLmNhbWVyYUVuYWJsZSA9IGVuYWJsZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pu05paw5Lq65ZGY5YiX6KGoLCDlubbov5Tlm57mm7TmlrDnmoTkurrlkZjliJfooahcbiAgICog5qC55o2u5Lq65ZGY54q25oCB5Y675re75Yqg44CB5Yig6Zmk44CB5pu05pawXG4gICAqIOagueaNrueKtuaAgeaXtumXtO+8jOWIpOaWreaYr+WQpuabtOaWsO+8jOaXoOaXtumXtOaIs+eahOS4uuacrOWcsOeKtuaAgeiwg+aVtO+8jOebtOaOpeabtOaWsFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVVzZXJMaXN0KHVzZXJzOiBJU2Vzc2lvblVzZXJbXSwgdHJhY2VJZDogc3RyaW5nKTogSVNlc3Npb25Vc2VyW10ge1xuICAgIGNvbnN0IGNoYW5nZWRVc2VyczogSVNlc3Npb25Vc2VyW10gPSBbXTtcbiAgICB1c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHVzZXJTdGF0ZTogbmV3VXNlclN0YXRlLFxuICAgICAgICBzdGF0ZVRpbWU6IG5ld1N0YXRlVGltZSxcbiAgICAgICAgc3lzdGVtU3RhdGU6IG5ld1N5c1N0YXRlLFxuICAgICAgfSA9IHVzZXI7XG4gICAgICBjb25zdCBuZWVkQWRkU3RhdGVzID0gW1JDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNBTExJTkcsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQsIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkJVU1lMSU5FX1dBSVRdO1xuICAgICAgaWYgKG5lZWRBZGRTdGF0ZXMuaW5jbHVkZXMobmV3VXNlclN0YXRlKSkge1xuICAgICAgICAvLyDnm7TmjqXmt7vliqDmlbDmja5cbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHB1c2ggdXNlcjogJHtKU09OLnN0cmluZ2lmeSh1c2VyKX1gLCB0cmFjZUlkKTtcbiAgICAgICAgdGhpcy5fY2FsbFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgIGNoYW5nZWRVc2Vycy5wdXNoKHVzZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5pu05paw5pWw5o2uXG4gICAgICAgIGxldCBoYXNVc2VyID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2FsbFVzZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgdXNlcklkLCBzdGF0ZVRpbWU6IG9sZFN0YXRlVGltZSwgc3lzdGVtU3RhdGU6IG9sZFN5c3RlbVN0YXRlLCB1c2VyU3RhdGU6IG9sZFVzZXJTdGF0ZSxcbiAgICAgICAgICB9ID0gdGhpcy5fY2FsbFVzZXJzW2ldO1xuICAgICAgICAgIGlmICh1c2VySWQgPT09IHVzZXIudXNlcklkKSB7XG4gICAgICAgICAgICBoYXNVc2VyID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW52YWxpZFN5c1N0YXRlID0gdmFsaWRhdGVTeXNTdGF0ZShvbGRTeXN0ZW1TdGF0ZSwgbmV3U3lzU3RhdGUpO1xuICAgICAgICAgICAgY29uc3QgaXNJbnZhbGlkVXNlclN0YXRlID0gdmFsaWRhdGVVc2VyU3RhdGUob2xkVXNlclN0YXRlLCBuZXdVc2VyU3RhdGUpO1xuXG4gICAgICAgICAgICBjb25zdCBpc0ludmFsaWRPbnBob25lRW5kID0gbmV3U3lzU3RhdGUgPT09IFJDQ2FsbFBsdXNSZWFzb24uT05fUEhPTkVfRU5EICYmIG9sZFN5c3RlbVN0YXRlICE9PSBSQ0NhbGxQbHVzUmVhc29uLk9OX1BIT05FICYmIG5ld1VzZXJTdGF0ZSAhPT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiDml6DmlYjnmoTnirbmgIHvvJpcbiAgICAgICAgICAgICAqIOaWsOS4i+WPkeeKtuaAgeeahOaXtumXtOWwj+S6juW9k+WJjeeKtuaAgeeahOaXtumXtCDkuJQgc3lzdGVtU3RhdGUg5ZKMIHVzZXJTdGF0ZSDlnYfmmK/ml6DmlYjnmoRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKChuZXdTdGF0ZVRpbWUgJiYgb2xkU3RhdGVUaW1lICYmIG5ld1N0YXRlVGltZSA8IG9sZFN0YXRlVGltZSkgfHwgKGlzSW52YWxpZFN5c1N0YXRlICYmIGlzSW52YWxpZFVzZXJTdGF0ZSkpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9VUERBVEVfVVNFUl9TVEFURV9PLCBgdGltZW91dCB1c2VyIHN0YXRlOiBvbGQ6JHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICB1c2VySWQsIG9sZFN0YXRlVGltZSwgb2xkU3lzdGVtU3RhdGUsIG9sZFVzZXJTdGF0ZSxcbiAgICAgICAgICAgICAgICB9KX07IG5ldzoke0pTT04uc3RyaW5naWZ5KHVzZXIpfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOTkVSX1NFU1NJT05fVVBEQVRFX1VTRVJfU1RBVEVfTywgYHVwZGF0ZVVzZXJMaXN0IGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8g55u05o6l6KaG55uW5pu05pawXG4gICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9JTk5FUl9TRVNTSU9OX1VQREFURV9VU0VSX1NUQVRFX08sIGB1cGRhdGVVc2VyTGlzdCAtPiBjb3ZlciAke0pTT04uc3RyaW5naWZ5KHVzZXIpfWAsIHRyYWNlSWQpO1xuICAgICAgICAgICAgICB0aGlzLl9jYWxsVXNlcnNbaV0gPSB1c2VyO1xuICAgICAgICAgICAgICAhaXNJbnZhbGlkT25waG9uZUVuZCAmJiBjaGFuZ2VkVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOaXoOatpOeUqOaIt+ebtOaOpea3u+WKoFxuICAgICAgICBpZiAoIWhhc1VzZXIpIHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfSU5ORVJfU0VTU0lPTl9VUERBVEVfVVNFUl9TVEFURV9PLCBgdXBkYXRlVXNlckxpc3QgLT4gbm8gdXNlciBwdXNoICR7SlNPTi5zdHJpbmdpZnkodXNlcil9YCwgdHJhY2VJZCk7XG4gICAgICAgICAgdGhpcy5fY2FsbFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgICAgY2hhbmdlZFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlZFVzZXJzO1xuICB9XG5cbiAgcHVibGljIHNldE9sZERpYWxvZ0RhdGEoZGF0YTogSU9sZERpYWxvZ0RhdGEpIHtcbiAgICB0aGlzLl9vbGREaWFsb2dEYXRhID0gZGF0YTtcbiAgfVxuXG4gIC8qKiA9PT09PT3np4HmnInmlrnms5U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiAgLyoqXG4gICAqIOabtOaWsCBzZXNzaW9uIOeKtuaAgVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVNlc3Npb25TdGF0ZShzdGF0ZTogUkNDYWxsUGx1c0NhbGxTdGF0ZSkge1xuICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICog5pu05paw6YCa6K+d57G75Z6L77yI5Y2H6ZmN57qn6K6+572u77yJXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQ2FsbFR5cGUoY2FsbFR5cGU6IFJDQ2FsbFBsdXNUeXBlKSB7XG4gICAgdGhpcy5fY2FsbFR5cGUgPSBjYWxsVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmm7TmlrDlqpLkvZPnsbvlnovvvIjljYfpmY3nuqfvvIlcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVNZWRpYVR5cGUobWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlKSB7XG4gICAgdGhpcy5fbWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOivt+axgueahOWqkuS9k+exu+Wei++8iOWNh+mZjee6p++8iVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVJlcU1lZGlhVHlwZShtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfCBudWxsKSB7XG4gICAgdGhpcy5fcmVxTWVkaWFUeXBlID0gbWVkaWFUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsCBpbnZ0ZXIgdGltZXIgaWRcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVUaW1lcklkKHR5cGU6IENhbGxUaW1lckV2ZW50VHlwZSwgdGltZXJJZDogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGUgPT09IENhbGxUaW1lckV2ZW50VHlwZS5JTlZJVEVSKSB7XG4gICAgICB0aGlzLl9pbnZpdGVyVGltZXJJZCA9IHRpbWVySWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2ludml0ZWVUaW1lcklkID0gdGltZXJJZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WXG4gICAqL1xuICBwdWJsaWMgZ2V0T2xkRGlhbG9nRGF0YSgpOiBJT2xkRGlhbG9nRGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuX29sZERpYWxvZ0RhdGE7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5piv5ZCm5piv5bex56uv5oyC5patXG4gICAqL1xuICBwdWJsaWMgc2V0SXNMb2NhbENsaWVudEhhbmd1cChpc0xvY2FsQ2xpZW50SGFuZ3VwOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc0xvY2FsQ2xpZW50SGFuZ3VwID0gaXNMb2NhbENsaWVudEhhbmd1cDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTG9jYWxDbGllbnRIYW5ndXA7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIENhbGxTZXJ2ZXJBY3Rpb24ge1xuICAvKipcbiAgICog5byA5aeL5Y2V5Lq65ZG85Y+rXG4gICAqL1xuICBTVEFSVF9TSU5HTEVfQ0FMTCA9ICdzdGFydFNpbmdsZUNhbGwnLFxuICAvKipcbiAgICog5byA5aeL5aSa5Lq65ZG85Y+rXG4gICAqL1xuICBTVEFSVF9HUk9VUF9DQUxMID0gJ3N0YXJ0R3JvdXBDYWxsJyxcbiAgLyoqXG4gICAqIOmCgOivt+WlveWPi+WKoOWFpemAmuivnVxuICAgKi9cbiAgSU5WSVRFX0NBTEwgPSAnaW52aXRlQ2FsbCcsXG4gIC8qKlxuICAgKiDkuIvlj5HpgoDor7fpgJror53mlbDmja5cbiAgICovXG4gIFBVQl9JTlZJVEVfQ0FMTCA9ICdwdWJJbnZpdGVDYWxsJyxcbiAgLyoqXG4gICAqIOmAmuivneWTjemTg1xuICAgKi9cbiAgUklOR0lOR19DQUxMID0gJ3JpbmdDYWxsJyxcbiAgLyoqXG4gICAqIOaOpeWPl+mAmuivnVxuICAgKi9cbiAgQUNDRVBUX0NBTEwgPSAnYWNjZXB0Q2FsbCcsXG4gIC8qKlxuICAgKiDliqDlhaXpgJror51cbiAgICovXG4gIEpPSU5fQ0FMTCA9ICdqb2luQ2FsbCcsXG4gIC8qKlxuICAgKiDmjILmlq3pgJror51cbiAgICovXG4gIEhBTkdVUF9DQUxMID0gJ2hhbmd1cENhbGwnLFxuICAvKipcbiAgICog6YCa6K+d54q25oCB5LiK5oqlXG4gICAqL1xuICBTVEFUVVNfVVBfQ0FMTCA9ICdzdGF0dXNVcENhbGwnLFxuICAvKipcbiAgICog6YCa6K+d54q25oCB5LiL5Y+RXG4gICAqL1xuICBTVEFUVVNfRE9XTl9DQUxMID0gJ3N0YXR1c0Rvd25DYWxsJyxcbiAgLyoqXG4gICAqIOmAmuivneS6i+S7tuS4iuaKpVxuICAgKi9cbiAgRVZFTlRfVVBfQ0FMTCA9ICdldmVudFVwQ2FsbCcsXG4gIC8qKlxuICAgKiDpgJror53kuovku7bkuIvlj5FcbiAgICovXG4gIEVWRU5UX0RPV05fQ0FMTCA9ICdldmVudERvd25DYWxsJyxcbiAgLyoqXG4gICAqIOWvueivneaVsOaNruS4iuihjFxuICAgKi9cbiAgRElBTE9HX1VQX0NBTEwgPSAnZGlhbG9nVXBDYWxsJyxcbiAgLyoqXG4gICAqIOWvueivneaVsOaNruS4i+ihjFxuICAgKi9cbiAgRElBTE9HX0RPV05fQ0FMTCA9ICdkaWFsb2dEb3duQ2FsbCcsXG4gIC8qKlxuICAgKiDojrflj5bnlKjmiLfkvJror53mlbDmja7liJfooahcbiAgICovXG4gIEdFVF9DQUxMX1VTRVJfU0VTU0lPTl9MSVNUID0gJ2dldENhbGxVU2VyU2Vzc2lvbkxpc3QnLFxuICAvKipcbiAgICog5pel5b+X6K6w5b2V5ZCM5q2lXG4gICAqL1xuICBTWU5DX0NBTExfTE9HID0gJ3N5bmNDYWxsTG9nJyxcbiAgLyoqXG4gICAqIOaXpeW/l+iusOW9leS4i+WPkVxuICAgKi9cbiAgUFVCX0NBTExfTE9HID0gJ3B1YkNhbGxMb2cnLFxuICAvKipcbiAgICog5om56YeP5Yig6Zmk6YCa6K+d6K6w5b2VXG4gICAqL1xuICBERUxfQ0FMTF9MT0cgPSAnZGVsZXRlQ2FsbExvZycsXG4gIC8qKlxuICAgKiDmn6Xor6LlvZPliY3nlKjmiLflt7LmnInnmoQgY2FsbCDnirbmgIFcbiAgICovXG4gIFFSWV9DQUxMX1NUQVRFID0gJ3F1ZXJ5VXNlckhhc0NhbGwnLFxuICAvKipcbiAgICog5p+l6K+iIGNhbGxTZXJ2ZXIg5b2T5YmN5pe26Ze05oizXG4gICAqL1xuICBRUllfU1JWX1RJTUVTVEFNUCA9ICdnZXRDYWxsU3J2VGltZVN0YW1wJyxcbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjeeUqOaIt+i/m+ihjOeahCBjYWxsIOWIl+ihqFxuICAgKi9cbiAgR0VUX0NBTExfU1RBVEVfTElTVCA9ICdnZXRVc2VyQ2FsbFN0YXRlTGlzdCcsXG4gIC8qKlxuICAgKiDmuIXpmaTlvZPliY3nlKjmiLfpgJror53orrDlvZVcbiAgICovXG4gIENMRUFSX0NBTExfTE9HID0gJ2NsZWFuQ2FsbExvZycsXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCDkvJror53kv6Hmga9cbiAgICovXG4gIEdFVF9DQUxMX1NFU1NJT04gPSAnZ2V0Q2FsbFNlc3Npb24nLFxuICAvKipcbiAgICog6I635Y+WIGNhbGwg5pe26Ze05L+h5oGvXG4gICAqL1xuICBHRVRfQ0FMTF9USU1FX0lORk8gPSAnZ2V0Q2FsbFRpbWVJbmZvJyxcbiAgLyoqXG4gICAqIOe7k+adn+W9k+WJjeeUqOaIt+W8guW4uOeahGNhbGxTZXNzaW9uKOWMheWQq+WQhOS4qumYtuautSnvvIzkuLvopoHnlKjkuo7lupTnlKjlvILluLjpgIDlh7rlho3lkK/liqjjgIHlkITnp43pgJror53lvILluLjlvZPkuK3jgILphYzmg4XosIPnlKhcbiAgICovXG4gIEVORF9BQk5PUk1BTF9DQUxMID0gJ2VuZFVzZXJBYm5vcm1hbENhbGxzJyxcbiAgLyoqXG4gICAqIOeUqOaIt+ezu+e7n+eKtuaAgeS4iuaKpVxuICAgKi9cbiAgU1lTX1NUQVRVU19VUCA9ICdzeXNTdGF0dXNVcCcsXG4gIC8qKlxuICAgKiDkuIrmiqXpgJror53orrDlvZXlt7Lor7vnirbmgIFcbiAgICovXG4gIFVQX0NBTExfTE9HX1JFQURFRCA9ICd1cENhbGxMb2dSZWFkZWQnLFxuICAvKipcbiAgICog5LiL5Y+R6YCa6K+d6K6w5b2V5bey6K+754q25oCBXG4gICAqL1xuICBQVUJfQ0FMTF9MT0dfUkVBREVEID0gJ3B1YkNhbGxMb2dSZWFkZWQnLFxuICAvKipcbiAgICog5LiL5Y+R5LiL6KGM5L+h5Luk5pWw5o2u5bqP5Y+3SWQg77yI5byx572R6KGl5YG/5pa55rOV77yM56e75Yqo56uv5bey5a6e546w77yMUEMg5pyq5a6e546w77yJXG4gICAqL1xuICBQVUJfTkFDS19TRVFfSUQgPSAncHViTkFDS1NlcUlkJyxcbiAgLyoqXG4gICAqIOafpeivouW9k+WJjeeUqOaIt+WPguS4jueahOacque7k+adn+eahGNhbGxTZXNzaW9u55qEQ2FsbElk5YiX6KGo77yMZ3JvdXDkuJPnlKjvvIzlj6/lnKhncm91cGNhbGznu5PmnZ/ml7bvvIzooaXlgb/lkITnq6/nmoTlv6vmjbflhaXlj6PmmK/lkKbmtojlpLHnmoTliKTmlq1cbiAgICovXG4gIEdFVF9VU0VSX0NBTExfU0VTU0lPTl9JRF9MSVNUID0gJ2dldFVzZXJDYWxsU2Vzc2lvbklkTGlzdCdcbn1cbiIsImV4cG9ydCBjb25zdCB0aW1lclNldFRpbWVvdXQgPSAoZnVuYzogRnVuY3Rpb24sIHRpbWVvdXQ6IG51bWJlcik6IG51bWJlciA9PiBzZXRUaW1lb3V0KGZ1bmMsIHRpbWVvdXQpIGFzIG51bWJlcjtcblxuZXhwb3J0IGNvbnN0IHRpbWVySW50ZXJ2YWwgPSAoZnVuOiBGdW5jdGlvbiwgaXR2OiBudW1iZXIpOiBudW1iZXIgPT4gc2V0SW50ZXJ2YWwoZnVuLCBpdHYpIGFzIG51bWJlcjtcblxuZXhwb3J0IGNvbnN0IHNsZWVwID0gKG1pbGxpc2Vjb25kOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gIHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmQpO1xufSk7XG4iLCJpbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ1JUQ0NvZGUgfSBmcm9tICdAcm9uZ2Nsb3VkL3BsdWdpbi1ydGMnO1xuaW1wb3J0IHsgQ2FsbFNlcnZlckVycm9yQ29kZSB9IGZyb20gJy4uL2VudW1zL0NhbGxTZXJ2ZXJFcnJvckNvZGUnO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3RpbWVycyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ29kZSB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzQ29kZSc7XG5cbmV4cG9ydCB0eXBlIFRSZXRyeUVycm9yQ29kZSA9IENhbGxTZXJ2ZXJFcnJvckNvZGUgfCBSQ1JUQ0NvZGUgfCBudW1iZXIgfCBFcnJvckNvZGVcbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIOimgemHjeivleeahOW8guatpeWHveaVsFxuICAgKi9cbiAgYXN5bmNGbjogRnVuY3Rpb247XG4gIC8qKlxuICAgKiDlh73mlbDnmoTlj4LmlbBcbiAgICovXG4gIGZuQXJnczogYW55W107XG4gIC8qKlxuICAgKiDlvZPliY3ph43or5Xml7bpl7TmiLNcbiAgICovXG4gIGN1cnJlbnRSZXRyeVRpbWU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDmnIDlpKfph43or5Xml7bplb9cbiAgICovXG4gIG1heER1cmF0aW9uPzogbnVtYmVyO1xuICAvKipcbiAgICog5qKv5bqm6YeN6K+V6Ze06ZqUXG4gICAqL1xuICBpbnRlcnZhbHM/OiBudW1iZXJbXTtcbiAgLyoqXG4gICAqIOair+W6pumHjeivlemXtOmalOaVsOe7hOS4i+agh1xuICAgKi9cbiAgaW5kZXg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDph43or5XlpLHotKXnmoTlm57osINcbiAgICovXG4gIG9uRXJyb3I/OiAoY29kZTogVFJldHJ5RXJyb3JDb2RlKSA9PiB2b2lkXG59XG5cbmNvbnN0IG5lZWRSZXRyeUNvZGU6IFRSZXRyeUVycm9yQ29kZVtdID0gW1xuICAvKipcbiAgICogSU0g5bqV5bGC6L+U5Zue6ZyA6KaB6YeN6K+V55qE6ZSZ6K+v56CBXG4gICAqL1xuICBFcnJvckNvZGUuUkNfTkVUX0NIQU5ORUxfSU5WQUxJRCxcbiAgRXJyb3JDb2RlLlJDX05FVF9VTkFWQUlMQUJMRSxcbiAgRXJyb3JDb2RlLlJDX01TR19SRVNQX1RJTUVPVVQsXG4gIC8qKlxuICAgKiBSVEMg6L+U5Zue6ZyA6KaB6YeN6K+V55qE6ZSZ6K+v56CBXG4gICAqL1xuICBSQ1JUQ0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCxcbiAgUkNSVENDb2RlLlJFUVVFU1RfRkFJTEVELFxuXG5dO1xuXG4vKipcbiAqIEBwYXJhbSBSZXRyeU9wdGlvbnMuYXN5bmNGbiDopoHph43or5XnmoTlvILmraXlh73mlbBcbiAqIEBwYXJhbSBSZXRyeU9wdGlvbnMuZm5BcmdzIOWHveaVsOeahOWPguaVsFxuICogQHBhcmFtIFJldHJ5T3B0aW9ucy5jdXJyZW50UmV0cnlUaW1lIOW9k+WJjemHjeivleaXtumXtOaIs1xuICogQHBhcmFtIFJldHJ5T3B0aW9ucy5tYXhEdXJhdGlvbiDmnIDlpKfph43or5Xml7bplb9cbiAqIEBwYXJhbSBSZXRyeU9wdGlvbnMuaW50ZXJ2YWxzIOair+W6pumHjeivlemXtOmalFxuICogQHBhcmFtIFJldHJ5T3B0aW9ucy5pbmRleCDmoq/luqbph43or5Xpl7TpmpTmlbDnu4TkuIvmoIdcbiAqL1xuZXhwb3J0IGNvbnN0IHJldHJ5QXN5bmNGbiA9IGFzeW5jIDxSIGV4dGVuZHMge2NvZGU6IFRSZXRyeUVycm9yQ29kZX0+ICh7XG4gIGFzeW5jRm4sXG4gIGZuQXJncyxcbiAgY3VycmVudFJldHJ5VGltZSA9IERhdGUubm93KCksXG4gIG1heER1cmF0aW9uID0gNjAgKiAxMDAwLFxuICBpbnRlcnZhbHMgPSBbMiAqIDEwMDAsIDQgKiAxMDAwLCA4ICogMTAwMCwgMTYgKiAxMDAwLCAzMiAqIDEwMDAsIDY0ICogMTAwMF0sXG4gIGluZGV4ID0gMCxcbiAgb25FcnJvcixcbn06IFJldHJ5T3B0aW9ucyk6IFByb21pc2U8Uj4gPT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBhc3luY0ZuKC4uLmZuQXJncyk7XG4gIC8vIGNvbnN0IGl0diA9IGludGVydmFsc1tpbmRleF0gfHwgaW50ZXJ2YWxzW2ludGVydmFscy5sZW5ndGggLSAxXVxuICAvLyBpbmRleCsrXG4gIC8vIGl0diDlhpnmrbsgMjAwMCBtcyAs5ZCO57ut6ZyA6KaB5YaN5pS+5byA5qKv5bqm6YeN6K+VXG4gIGNvbnN0IGl0diA9IDIgKiAxMDAwO1xuICBjb25zdCBpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkgPSAocmVzLmNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1NcbiAgICB8fCAhbmVlZFJldHJ5Q29kZS5pbmNsdWRlcyhyZXMuY29kZSkpXG4gICAgfHwgKChEYXRlLm5vdygpICsgaXR2IC0gY3VycmVudFJldHJ5VGltZSkgPiBtYXhEdXJhdGlvbik7XG5cbiAgaWYgKCFpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkpIHtcbiAgICBvbkVycm9yICYmIG9uRXJyb3IocmVzLmNvZGUpO1xuICAgIGF3YWl0IHNsZWVwKGl0dik7XG4gICAgcmV0dXJuIHJldHJ5QXN5bmNGbih7XG4gICAgICBhc3luY0ZuLFxuICAgICAgZm5BcmdzLFxuICAgICAgY3VycmVudFJldHJ5VGltZSxcbiAgICAgIG1heER1cmF0aW9uLFxuICAgICAgaW50ZXJ2YWxzLFxuICAgICAgaW5kZXgsXG4gICAgICBvbkVycm9yLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5QnlUaW1lT3B0aW9ucyB7XG4gIC8qKlxuICAgKiDopoHph43or5XnmoTlvILmraXlh73mlbBcbiAgICovXG4gIGFzeW5jRm46IEZ1bmN0aW9uO1xuICAvKipcbiAgICog5Ye95pWw55qE5Y+C5pWwXG4gICAqL1xuICBmbkFyZ3M6IGFueVtdO1xuICAvKipcbiAgICog5b2T5YmN6YeN6K+V5pe26Ze05oizXG4gICAqL1xuICBjdXJyZW50UmV0cnlUaW1lPzogbnVtYmVyO1xuICAvKipcbiAgICog5pyA5aSn6YeN6K+V5qyh5pWwLCDpu5jorqQgMiDmrKFcbiAgICovXG4gIG1heFJldHJ5VGltZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIOmHjeivleWksei0peeahOWbnuiwg1xuICAgKi9cbiAgb25FcnJvcj86IChjb2RlOiBUUmV0cnlFcnJvckNvZGUpID0+IHZvaWRcbn1cblxuZXhwb3J0IGNvbnN0IHJldHJ5QXNueWNGbkJ5VGltZSA9IGFzeW5jIDxSIGV4dGVuZHMge2NvZGU6IFRSZXRyeUVycm9yQ29kZX0+ICh7XG4gIGFzeW5jRm4sXG4gIGZuQXJncyxcbiAgY3VycmVudFJldHJ5VGltZSA9IDAsXG4gIG1heFJldHJ5VGltZSA9IDIsXG4gIG9uRXJyb3IsXG59OiBSZXRyeUJ5VGltZU9wdGlvbnMpOiBQcm9taXNlPFI+ID0+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgYXN5bmNGbiguLi5mbkFyZ3MpO1xuICBjb25zdCBpdHYgPSAyICogMTAwMDtcbiAgY3VycmVudFJldHJ5VGltZSsrO1xuICBjb25zdCBpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkgPSAocmVzLmNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1NcbiAgICB8fCAhbmVlZFJldHJ5Q29kZS5pbmNsdWRlcyhyZXMuY29kZSkpIHx8IGN1cnJlbnRSZXRyeVRpbWUgPiBtYXhSZXRyeVRpbWU7XG5cbiAgaWYgKCFpc05lZWRSZXNvbHZlSW1tZWRpYXRlbHkpIHtcbiAgICBvbkVycm9yICYmIG9uRXJyb3IocmVzLmNvZGUpO1xuICAgIGF3YWl0IHNsZWVwKGl0dik7XG4gICAgcmV0dXJuIHJldHJ5QXNueWNGbkJ5VGltZSh7XG4gICAgICBhc3luY0ZuLFxuICAgICAgZm5BcmdzLFxuICAgICAgY3VycmVudFJldHJ5VGltZSxcbiAgICAgIG1heFJldHJ5VGltZSxcbiAgICAgIG9uRXJyb3IsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG4iLCJpbXBvcnQgeyBJUHViSW52aXRlQ29uIH0gZnJvbSAnLi9JU2lnbmFsVHJhbnNwb3J0ZXInO1xuXG5leHBvcnQgZW51bSBDYWxsSG9va3NUeXBlIHtcbiAgb25CZWZvcmVQdWJsaXNoID0gJ29uQmVmb3JlUHVibGlzaCcsXG4gIG9uUHVibGlzaFJlcyA9ICdvblB1Ymxpc2hSZXMnLFxuICBvblB1Ykludml0ZUNhbGwgPSAnb25QdWJJbnZpdGVDYWxsJyxcbiAgb25QdWJJbnZpdGVDYWxsUHVsbEt2ID0gJ29uUHViSW52aXRlQ2FsbFB1bGxLdicsXG4gIG9uUHViSW52aXRlQ2FsbE1pc3MgPSAnb25QdWJJbnZpdGVDYWxsTWlzcydcbn1cblxuZXhwb3J0IGVudW0gUHViSW52aXRlQ2FsbE1pc3NSZWFzb24ge1xuICBOT1RfQ1VSUkVOVF9ERVZJQ0VJRCA9ICdub3QgY3VycmVudCBkZXZpY2UgaWQnLFxuICBTRUNSRVRfQ0FMTCA9ICdzZWNyZXQgY2FsbCcsXG4gIE5PVF9JTlZJVEVFID0gJ25vdCBhbiBpbnZpdGVlJ1xufVxuXG5leHBvcnQgZW51bSBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyIHtcbiAgUFVCX0lOVklURSA9ICdwdWJpbnZpdGVjYWxsJyxcbiAgUFVMTF9LVl9JTlZJVEUgPSAncHVsbGt2X2ludml0ZWNhbGwnLFxuICBQVVNIID0gJ3N5c3RlbV9wdWJzaCdcbn1cblxuZXhwb3J0IHR5cGUgSVB1Ykludml0ZUNhbGxJbmZvID0gSVB1Ykludml0ZUNvbiAmIHsgZXh0cmE6IHN0cmluZ31cblxuZXhwb3J0IHR5cGUgSVB1Ykludml0ZUNhbGxNaXNzSW5mbyA9IElQdWJJbnZpdGVDb24gJiB7IGV4dHJhOiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nLCByZWZlcjogUHViSW52aXRlQ2FsbE1pc3NSZWZlcn1cbiIsIi8qKlxuICogZXh0cmEg5YaF5a655bC65a+46ZmQ5Yi277yaMTI4IEtCXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfRVhUUkFfQllURVMgPSAxMjggKiAxMDI0O1xuXG4vKipcbiAqIENhbGwgUGx1cyBtaXNzIOa2iOaBr+WQjeensFxuICovXG5leHBvcnQgY29uc3QgTUlTU19NRVNTQUdFX05BTUUgPSAnUkM6Q2FsbFBsdXNNaXNzJztcbiIsImltcG9ydCB7XG4gIEJhc2ljTG9nZ2VyLCBFcnJvckNvZGUsIEV2ZW50RW1pdHRlciwgZ2V0VVVJRDIyLCBJUmVjZWl2ZWRNZXNzYWdlLCBJUnVudGltZSwgaXNOdWxsLCBpc1N0cmluZywgbG9nZ2VyLCBQbHVnaW5Db250ZXh0LCBSQ0Nvbm5lY3Rpb25TdGF0dXMsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IENhbGxTZXJ2ZXJBY3Rpb24gfSBmcm9tICcuLi9lbnVtcy9DYWxsU2VydmVyQWN0aW9uJztcbmltcG9ydCB7XG4gIElBY2NlcHRDYWxsQ29uLFxuICBJQmFzZVNpbmdhbENvbixcbiAgSUNsZWFyQ2FsbExvZ1JlcyxcbiAgSUNvbnBlbnNhdGlvbkRhdGEsXG4gIElEaWFsb2dEb3duQ2FsbENvbixcbiAgSURpYWxvZ1VwQ2FsbENvbixcbiAgSUVuZEFibm9ybWFsQ2FsbE9wdHMsXG4gIElFdmVudERvd25DYWxsQ29uLFxuICBJRXZlbnRVcENhbGxDb24sXG4gIElHZXRDYWxsU2Vzc2lvblNlcnZlclJlcyxcbiAgSUdldENhbGxUaW1lSW5mb1JlcyxcbiAgSUdldFVzZXJDYWxsU3RhdGVMaXN0UmVzLFxuICBJSGFuZ3VwQ2FsbENvbixcbiAgSUludml0ZUNhbGxDb24sXG4gIElJbnZpdGVDYWxsUmVzLFxuICBJSm9pbkNhbGxDb24sXG4gIElQdWJDYWxsTG9nLFxuICBJUHViSW52aXRlQ29uLFxuICBJUXJ5VXNlckhhc0NhbGxSZXMsXG4gIElSaW5naW5nQ2FsbENvbixcbiAgSVNpZ25hbFRyYW5zcG9ydGVyTGlzdGVuZXIsXG4gIElTdGFydENhbGxDb24sXG4gIElTdGFydENhbGxSZXMsXG4gIElTdGFydEdyb3VwQ29uLFxuICBJU3RhcnRTaW5nbGVDb24sXG4gIElTdGF0dXNEb3duQ29udCxcbiAgSVN0YXR1c1VwQ29uLFxuICBJU3luY0NhbGxMb2dDb24sXG4gIElTeW5jQ2FsbExvZ1Jlc0xpc3QsXG4gIElTeXNTdGF0dXNVcE9wdHMsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSVNpZ25hbFRyYW5zcG9ydGVyJztcbmltcG9ydCB7IERpYWxvZ1R5cGUgfSBmcm9tICcuLi9lbnVtcy9EaWFsb2dUeXBlJztcbmltcG9ydCB7IElSQ0NhbGxJbml0T3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSUluZGV4JztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsU2Vzc2lvblVzZXJTdGF0ZSc7XG5pbXBvcnQgeyBUaW1lQ29ycmVjdGlvbmVyIH0gZnJvbSAnLi9UaW1lQ29ycmVjdGlvbmVyJztcbmltcG9ydCB7IHJldHJ5QXN5bmNGbiB9IGZyb20gJy4uL3V0aWxzL3JldHJ5JztcbmltcG9ydCB7IFJDQ2FsbFBsdXNUeXBlIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsVHlwZSc7XG5pbXBvcnQge1xuICBDYWxsSG9va3NUeXBlLCBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbiwgUHViSW52aXRlQ2FsbE1pc3NSZWZlcixcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JQ2FsbEhvb2tzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDb2RlIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlIH0gZnJvbSAnLi9SQ0NhbGxQbHVzUmVwb3J0TW9kdWxlJztcbmltcG9ydCB7IElSQ0NhbGxQbHVzU3VtbWFyeU1lc3NhZ2VDb250ZW50IH0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBNSVNTX01FU1NBR0VfTkFNRSB9IGZyb20gJy4uL2FwaS9jb25zdGFudHMnO1xuXG5leHBvcnQgY2xhc3MgU2lnbmFsVHJhbnNwb3J0ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICog55uR5ZCs5a+56LGhXG4gICAqL1xuICBfbGlzdGVuZXIhOiBJU2lnbmFsVHJhbnNwb3J0ZXJMaXN0ZW5lclxuXG4gIC8qKlxuICAgKiDpnIDopoHph43or5XnmoQgYWN0aW9uXG4gICAqL1xuICBfbmVlZFJldHJ5QWN0aW9uczogQ2FsbFNlcnZlckFjdGlvbltdID0gW1xuICAgIENhbGxTZXJ2ZXJBY3Rpb24uU1RBUlRfU0lOR0xFX0NBTEwsXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5TVEFSVF9HUk9VUF9DQUxMLFxuICAgIENhbGxTZXJ2ZXJBY3Rpb24uQUNDRVBUX0NBTEwsXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5KT0lOX0NBTEwsXG4gICAgQ2FsbFNlcnZlckFjdGlvbi5FVkVOVF9VUF9DQUxMLFxuICBdXG5cbiAgX3Nlc3Npb25JZDogc3RyaW5nID0gJydcblxuICAvKipcbiAgICogY29uc3RydWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5pdE9wdHM6IElSQ0NhbGxJbml0T3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90aW1lQ29ycmVjdGlvbmVyOiBUaW1lQ29ycmVjdGlvbmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVwb3J0QXBwRXZlbnRNb2R1bGU6IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY29udGV4dC5vbkNhbGxJbmZvID0gdGhpcy5fb25SZWN2Q2FsbFNpZ25hbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2NvbnRleHQub25jb25uZWN0aW9uc3RhdGVjaGFuZ2UgPSB0aGlzLl9vbklNQ29ubmVjdGlvblN0YXRlQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgLy8g5aSE55CG5raI5oGv5pS25Y+RXG4gICAgdGhpcy5fY29udGV4dC5vbm1lc3NhZ2UgPSB0aGlzLl9vbk1lc3NhZ2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9zZXNzaW9uSWQgPSBnZXRVVUlEMjIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uTWVzc2FnZShtZXNzYWdlOiBJUmVjZWl2ZWRNZXNzYWdlKSB7XG4gICAgLyoqXG4gICAgICog5LiK5oql56a757q/6YCa6K+d57uT5p2f55qEIHN1bW1hcnkg5raI5oGvXG4gICAgICovXG4gICAgY29uc3QgaXNDYWxsTXNnID0gW01JU1NfTUVTU0FHRV9OQU1FXS5pbmNsdWRlcyhtZXNzYWdlLm1lc3NhZ2VUeXBlKTtcbiAgICBpZiAoaXNDYWxsTXNnKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICBjYWxsSWQsIG1lZGlhVHlwZSwgc3RhcnRUaW1lLCBjYWxsU2Vzc2lvblVzZXJzLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgc2VuZGVyVXNlcklkLFxuICAgICAgfSA9IG1lc3NhZ2U7XG4gICAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAgIGNvbnN0IGlzUmVwb3J0TWlzcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBtaXNzTWVzc2FnZU1hcC0ke2N1cnJlbnRVc2VySWR9LSR7Y2FsbElkfWApO1xuICAgICAgaWYgKCFpc1JlcG9ydE1pc3MpIHtcbiAgICAgICAgY29uc3Qgc3VtbWFyeUNvbnRlbnQ6IElSQ0NhbGxQbHVzU3VtbWFyeU1lc3NhZ2VDb250ZW50ID0ge1xuICAgICAgICAgIGNhbGxJZCxcbiAgICAgICAgICBjYWxsZXJVc2VySWQ6IHNlbmRlclVzZXJJZCxcbiAgICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgICAgZmlyc3RGcmFtZVRpbWU6IDAsXG4gICAgICAgICAgY2FsbFN0YXJ0VGltZTogc3RhcnRUaW1lIC0gdGhpcy5fdGltZUNvcnJlY3Rpb25lci5nZXRMb2NhbERlbGF5VGltZSgpLFxuICAgICAgICAgIGNhbGxFbmRUaW1lOiAwLFxuICAgICAgICAgIGhhbmd1cFJlYXNvbjogY2FsbFNlc3Npb25Vc2Vycy5maWx0ZXIoKHsgdXNlcklkIH06IGFueSkgPT4gdXNlcklkID09PSBjdXJyZW50VXNlcklkKVswXS5zZXNzaW9uU3RhdHVzLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfTUlTU19NRVNTQUdFX08sIGByZWNlaXZlIG1pc3MgbWVzc2FnZTogJHtKU09OLnN0cmluZ2lmeShtZXNzYWdlKX1gKTtcbiAgICAgICAgY29uc3Qgc3VtbWFyeU1lc3NhZ2UgPSBPYmplY3QuYXNzaWduKG1lc3NhZ2UsIHsgY29udGVudDogSlNPTi5zdHJpbmdpZnkoc3VtbWFyeUNvbnRlbnQpIH0pO1xuICAgICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbFBsdXNTdW1tYXJ5TWVzc2FnZShzdW1tYXJ5TWVzc2FnZSk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBtaXNzTWVzc2FnZU1hcC0ke2N1cnJlbnRVc2VySWR9LSR7Y2FsbElkfWAsIGNhbGxJZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0U2Vzc2lvbklkKCkge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uSWQ7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcjogSVNpZ25hbFRyYW5zcG9ydGVyTGlzdGVuZXIpIHtcbiAgICB0aGlzLl9saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0Q2FsbChtc2c6IElTdGFydENhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN9PiB7XG4gICAgY29uc3Qge1xuICAgICAgY2xpZW50Q2FsbElkLCBjYWxsVHlwZSwgdG9Vc2VycywgbWVkaWFUeXBlLCBzZWNyZXRDaGF0LCB0YXJnZXRUeXBlLCB0YXJnZXRJZCwgbmlja05hbWUsIG9sZFJvb21JZCwgcHVzaEV4dCwgZXh0cmEsXG4gICAgfSA9IG1zZztcbiAgICBpZiAoY2FsbFR5cGUgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhcnRTaW5nbGVDYWxsKHtcbiAgICAgICAgY2xpZW50Q2FsbElkLFxuICAgICAgICB0b1VzZXJJZDogdG9Vc2Vyc1swXS51c2VySWQsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgICAgc2VjcmV0Q2hhdCxcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIG9sZFJvb21JZCxcbiAgICAgICAgdG9PcmdJZDogdG9Vc2Vyc1swXS5vcmdJZCB8fCAnJyxcbiAgICAgICAgcHVzaEV4dCxcbiAgICAgICAgZXh0cmEsXG4gICAgICB9LCB0cmFjZUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRHcm91cENhbGwoe1xuICAgICAgY2xpZW50Q2FsbElkLFxuICAgICAgdG9Vc2VycyxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIG5pY2tOYW1lLFxuICAgICAgb2xkUm9vbUlkLFxuICAgICAgcHVzaEV4dCxcbiAgICAgIGV4dHJhLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0U2luZ2xlQ2FsbChtc2c6IElTdGFydFNpbmdsZUNvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVN0YXJ0Q2FsbFJlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1NJTkdMRV9DQUxMX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN0YXJ0U2luZ2xlQ29uLCBJU3RhcnRDYWxsUmVzPih0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBDYWxsU2VydmVyQWN0aW9uLlNUQVJUX1NJTkdMRV9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0R3JvdXBDYWxsKG1zZzogSVN0YXJ0R3JvdXBDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9HUk9VUF9DQUxMX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN0YXJ0R3JvdXBDb24sIElTdGFydENhbGxSZXM+KHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIENhbGxTZXJ2ZXJBY3Rpb24uU1RBUlRfR1JPVVBfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpbnZpdGVDYWxsKG1zZzogSUludml0ZUNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElJbnZpdGVDYWxsUmVzfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfSU5WSVRFX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUludml0ZUNhbGxDb24sIElJbnZpdGVDYWxsUmVzPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLklOVklURV9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJpbmdpbmdDYWxsKG1zZzogSVJpbmdpbmdDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SSU5HX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVJpbmdpbmdDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uUklOR0lOR19DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFjY2VwdENhbGwobXNnOiBJQWNjZXB0Q2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQUNDRVBUX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUFjY2VwdENhbGxDb24sIHVuZGVmaW5lZD4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5BQ0NFUFRfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBqb2luQ2FsbChtc2c6IElKb2luQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfSk9JTl9DQUxMX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUpvaW5DYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uSk9JTl9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmd1cENhbGwobXNnOiBJSGFuZ3VwQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfSEFOR1VQX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NlbmRDYWxsU2lnbmFsPElIYW5ndXBDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uSEFOR1VQX0NBTEwsIG1zZyk7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMKSB7XG4gICAgICAvLyDlrZjlnKjljZXlkbwgQSDmjILmlq3lkI7nm7TmjqXouKLlh7ogQu+8jENhbGxTZXJ2ZXIg5bey56e76ZmkIGNhbGwsIEIg5ZCO5YiwIENhbGxTZXJ2ZXIg55qEIGhhbmd1cCDkvJrovazkuLogQ2FsbFNlcnZlckVycm9yQ29kZS5DQUxMX05PVF9FWElTVO+8jOaVheW/veeVpVxuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhdHVzVXBDYWxsKG1zZzogSVN0YXR1c1VwQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX1NUQVRVU19VUF9ULCBgY2FsbCBzdGF0dXMgdXAgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElTdGF0dXNVcENvbiwgdW5kZWZpbmVkPihtc2cuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLlNUQVRVU19VUF9DQUxMLCBtc2cpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGV2ZW50VXBDYWxsKG1zZzogSUV2ZW50VXBDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX0VWRU5UX1VQX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SUV2ZW50VXBDYWxsQ29uLCB1bmRlZmluZWQ+KG1zZy5jYWxsSWQsIENhbGxTZXJ2ZXJBY3Rpb24uRVZFTlRfVVBfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkaWFsb2dVcENhbGwobXNnOiBJRGlhbG9nVXBDYWxsQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9DQUxMX0RJQUxPR19VUF9ULCBgcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElEaWFsb2dVcENhbGxDb24sIHVuZGVmaW5lZD4obXNnLmNhbGxJZCwgQ2FsbFNlcnZlckFjdGlvbi5ESUFMT0dfVVBfQ0FMTCwgbXNnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWxldGVDYWxsUmVjb3JkKHVzZXJJZDogc3RyaW5nLCBjYWxsSWRzOiBzdHJpbmdbXSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0RFTEVURV9DQUxMX1JFQ09SRF9ULCBgY2FsbElkczogJHtKU09OLnN0cmluZ2lmeShjYWxsSWRzKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8e2NhbGxJZHM6IHN0cmluZ1tdfSwgdW5kZWZpbmVkPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uREVMX0NBTExfTE9HLCB7XG4gICAgICBjYWxsSWRzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN5bmNDYWxsTG9nKG1zZzogSVN5bmNDYWxsTG9nQ29uLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJU3luY0NhbGxMb2dSZXNMaXN0fT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfUkVDT1JEX1QsIGBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8SVN5bmNDYWxsTG9nQ29uLCBJU3luY0NhbGxMb2dSZXNMaXN0Pihtc2cudXNlcklkLCBDYWxsU2VydmVyQWN0aW9uLlNZTkNfQ0FMTF9MT0csIG1zZyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcXVlcnlVc2VySGFzQ2FsbCgpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJUXJ5VXNlckhhc0NhbGxSZXN9PiB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8bnVsbCwgSVFyeVVzZXJIYXNDYWxsUmVzPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uUVJZX0NBTExfU1RBVEUsIG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENhbGxTZXJ2ZXJUaW1lc3RhbXAodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogeyBzeW5jVGltZTogbnVtYmVyfX0+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfU0VSVkVSX1RJTUVfVCwgYHVzZXJJZDogJHt1c2VySWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPG51bGwsIHsgc3luY1RpbWU6IG51bWJlcn0+KHVzZXJJZCwgQ2FsbFNlcnZlckFjdGlvbi5RUllfU1JWX1RJTUVTVEFNUCwgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFRpbWVJbmZvKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJR2V0Q2FsbFRpbWVJbmZvUmVzfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfR0VUX0NBTExfVElNRV9JTkZPX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDx7IGNhbGxJZDogc3RyaW5nfSwgSUdldENhbGxUaW1lSW5mb1Jlcz4oY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkdFVF9DQUxMX1RJTUVfSU5GTywgeyBjYWxsSWQgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VXNlckNhbGxTdGF0ZUxpc3QodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldFVzZXJDYWxsU3RhdGVMaXN0UmVzfT4ge1xuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9HRVRfQVZBSUxBQkxFX0NBTExfTElTVF9ULCBgdXNlcklkOiAke3VzZXJJZH1gLCB0cmFjZUlkKTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZENhbGxTaWduYWw8bnVsbCwgSUdldFVzZXJDYWxsU3RhdGVMaXN0UmVzPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uR0VUX0NBTExfU1RBVEVfTElTVCwgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYXJDYWxsUmVjb3JkKHRyYWNlSWQ6IHN0cmluZyk6UHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUNsZWFyQ2FsbExvZ1Jlc30+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfQ0xFQVJfQ0FMTF9SRUNPUkRfVCwgYHVzZXJJZDogJHt1c2VySWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPG51bGwsIElDbGVhckNhbGxMb2dSZXM+KHVzZXJJZCwgQ2FsbFNlcnZlckFjdGlvbi5DTEVBUl9DQUxMX0xPRywgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFNlc3Npb24ob3B0czogSUJhc2VTaW5nYWxDb24sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElHZXRDYWxsU2Vzc2lvblNlcnZlclJlc30+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX0dFVF9DQUxMX0lORk9fQllfQ0FMTElEX1QsIGBjYWxsSWQ6ICR7b3B0cy5jYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPElCYXNlU2luZ2FsQ29uLCBJR2V0Q2FsbFNlc3Npb25TZXJ2ZXJSZXM+KG9wdHMuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLkdFVF9DQUxMX1NFU1NJT04sIG9wdHMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN5c1N0YXR1c1VwKG9wdHM6IElTeXNTdGF0dXNVcE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1VTRVJfU1lTVEVNX1NUQVRFX1VQX1QsIGBvcHRzOiAke0pTT04uc3RyaW5naWZ5KG9wdHMpfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJU3lzU3RhdHVzVXBPcHRzLCB1bmRlZmluZWQ+KG9wdHMuY2FsbElkLCBDYWxsU2VydmVyQWN0aW9uLlNZU19TVEFUVVNfVVAsIG9wdHMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwQ2FsbExvZ1JlYWRlZChvcHRzOiBJQmFzZVNpbmdhbENvbik6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHJldHVybiB0aGlzLl9zZW5kQ2FsbFNpZ25hbDxJQmFzZVNpbmdhbENvbiwgdW5kZWZpbmVkPih1c2VySWQsIENhbGxTZXJ2ZXJBY3Rpb24uVVBfQ0FMTF9MT0dfUkVBREVELCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmuIXpmaTnlKjmiLfmraPlnKjlkbzlj6vkuK3nmoTpgJror53kvJror53vvIgq6Z2e5pq06Zyy5o6l5Y+j77yM5L6b6LCD6K+V6YWM5oOF6LCD55So77yJXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5kVXNlckFibm9ybWFsQ2FsbHMob3B0czogSUVuZEFibm9ybWFsQ2FsbE9wdHMpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRDYWxsU2lnbmFsPHsgYWxsRGV2aWNlOiAwIHwgMX0sIHVuZGVmaW5lZD4odGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgQ2FsbFNlcnZlckFjdGlvbi5FTkRfQUJOT1JNQUxfQ0FMTCwgb3B0cyk7XG4gIH1cblxuICAvKiogPT09PT0956eB5pyJ5pa55rOVPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4gIHByaXZhdGUgX29uSU1Db25uZWN0aW9uU3RhdGVDaGFuZ2Uoc3RhdGU6IFJDQ29ubmVjdGlvblN0YXR1cykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfSU1fU1RBVEVfQ0hBTkdFX08sIGBzdGF0ZTogJHtzdGF0ZX1gLCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2xpc3RlbmVyLm9uSU1TdGF0ZUNoYW5nZShzdGF0ZSk7XG4gICAgLyoqXG4gICAgICog6L+e5o6l5oiQ5Yqf5ZCO5ZCv5Yqo5pe26Ze05qCh5q2j5ZmoXG4gICAgICovXG4gICAgaWYgKHN0YXRlID09PSBSQ0Nvbm5lY3Rpb25TdGF0dXMuQ09OTkVDVEVEKSB7XG4gICAgICB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLnN0YXJ0KHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLnN0b3AodHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNhbGwg5L+h5Luk5Y+R6YCBXG4gICAqIEBwYXJhbSB0YXJnZXRJZCDojrflj5YgY2FsbCBsb2cgKHN5bmNDYWxsTG9nKSDml7bkvKAgdXNlcklkLCDlhbbku5YgYWN0aW9uIOS8oCBjYWxsSWRcbiAgICogQHBhcmFtIGtleSBjYWxsIHNlcnZlciDlrprkuYkgYWN0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIGFjdGlvbiDmkLrluKblj4LmlbDvvIzml6Dlj4LmlbDkvKDnqbrlrZfnrKbkuLJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3NlbmRDYWxsU2lnbmFsIDxULCBSPih0YXJnZXRJZDogc3RyaW5nLCBrZXk6IENhbGxTZXJ2ZXJBY3Rpb24sIG9wdGlvbnM6IFQpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBSfT4ge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucyA/IEpTT04uc3RyaW5naWZ5KHsgLi4ub3B0aW9ucywgLi4ueyBzZXNzaW9uSWQ6IHRoaXMuX3Nlc3Npb25JZCB9IH0pIDogJyc7XG5cbiAgICBsZXQgcmVzdWx0OiB7ZGF0YT86IHsga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmd9LCBjb2RlOiBFcnJvckNvZGV9O1xuICAgIGlmICh0aGlzLl9uZWVkUmV0cnlBY3Rpb25zLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHJldHJ5QXN5bmNGbiA8e2RhdGE/OiB7IGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nfSwgY29kZTogRXJyb3JDb2RlfT4oe1xuICAgICAgICBhc3luY0ZuOiB0aGlzLl9jb250ZXh0LnNldENhbGxJbmZvLmJpbmQodGhpcy5fY29udGV4dCksXG4gICAgICAgIGZuQXJnczogW3RhcmdldElkLCBrZXksIHZhbHVlXSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9jb250ZXh0LnNldENhbGxJbmZvKHRhcmdldElkLCBrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSByZXN1bHQ7XG4gICAgaWYgKGNvZGUgIT09IEVycm9yQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIGNvbnN0IHsgdmFsdWU6IHNlcnZlclZhbCB9ID0gZGF0YSE7XG4gICAgY29uc3QgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2Uoc2VydmVyVmFsKS5kYXRhIGFzIFI7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBkYXRhOiBwYXJzZWREYXRhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogY2FsbCDkv6Hku6TmjqXmlLZcbiAgICovXG4gIHByaXZhdGUgX29uUmVjdkNhbGxTaWduYWwoZGF0YTogc3RyaW5nKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0NBTExfU0lHTkFMX0RBVEFfTywgYGRhdGE6ICR7ZGF0YX1gLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IGRhdGFMaXN0ID0gSlNPTi5wYXJzZShkYXRhKS5saXN0IGFzIHtba2V5OiBzdHJpbmddOiBzdHJpbmcgfVtdO1xuICAgIGRhdGFMaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHsga2V5IH0gPSBpdGVtO1xuICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UoaXRlbS52YWx1ZSk7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uUFVCX0lOVklURV9DQUxMOlxuICAgICAgICAgIHRoaXMuX29uUHViSW52aXRlQ2FsbChpbmZvIGFzIElQdWJJbnZpdGVDb24sIHRyYWNlSWQsIHRydWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uU1RBVFVTX0RPV05fQ0FMTDpcbiAgICAgICAgICB0aGlzLl9vblN0YXR1c0Rvd25DYWxsKGluZm8gYXMgSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLkVWRU5UX0RPV05fQ0FMTDpcbiAgICAgICAgICB0aGlzLl9vbkV2ZW50RG93bkNhbGwoaW5mbyBhcyBJRXZlbnREb3duQ2FsbENvbiwgdHJhY2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5ESUFMT0dfRE9XTl9DQUxMOlxuICAgICAgICAgIHRoaXMuX29uRGlhbG9nRG93bkNhbGwoaW5mbyBhcyBJRGlhbG9nRG93bkNhbGxDb24sIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENhbGxTZXJ2ZXJBY3Rpb24uUFVCX0NBTExfTE9HOlxuICAgICAgICAgIHRoaXMuX29uUHViQ2FsbExvZyhpbmZvIGFzIElQdWJDYWxsTG9nLCB0cmFjZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDYWxsU2VydmVyQWN0aW9uLlBVQl9DQUxMX0xPR19SRUFERUQ6XG4gICAgICAgICAgLy8gcGFzcyDmmoLmnKrnlKjliLBcbiAgICAgICAgICAvLyB0aGlzLl9vblB1YkNhbGxMb2dSZWFkZWQoaW5mbyBhcyBJUHViQ2FsbExvZ1JlYWRlZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ2FsbFNlcnZlckFjdGlvbi5QVUJfTkFDS19TRVFfSUQ6XG4gICAgICAgICAgLy8gVE9ETyBjYWxsIOW8see9keihpeWBv+aWueahiOa2ieWPiuaWueazle+8jFBDIOacquWBmu+8jOatpOWkhOmYsuatoui1sOWIsCBkZWZhdWx0XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5fb25Db25wZW5zYXRpb25EYXRhKGluZm8gYXMgSUNvbnBlbnNhdGlvbkRhdGEsIHRyYWNlSWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOagueaNriBkZXZpY2VJZCDliKTmlq3mlbDmja7mmK/lkKblupTor6XkuIvlj5FcbiAgICogZGV2aWNlSWQg5Li656m65a2X56ym5Liy5oiWIG51bGwg55u05o6l5LiL5Y+RXG4gICAqIGRldmljZUlkIOacieWFt+S9k+eahOWAvO+8jOagueaNriBkZXZpY2VJZCDliKTmlq3mmK/lkKbmmK/lt7Hnq6/nmoQgZGV2aWNlSWRcbiAgICovXG4gIHByaXZhdGUgX2lzVmFsaWREYXRhKGRldmljZUlkOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzTnVsbChkZXZpY2VJZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoaXNTdHJpbmcoZGV2aWNlSWQpICYmIChkZXZpY2VJZD8ubGVuZ3RoID09PSAwIHx8IGRldmljZUlkID09PSB0aGlzLl9zZXNzaW9uSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmCgOivt1xuICAgKiBAcGFyYW0gaXNEaXJlY3RseSDmmK/lkKbkuLrnm7Tlj5Hkv6Hku6RcbiAgICovXG4gIHByaXZhdGUgX29uUHViSW52aXRlQ2FsbChkYXRhOiBJUHViSW52aXRlQ29uLCB0cmFjZUlkOiBzdHJpbmcsIGlzRGlyZWN0bHkgPSB0cnVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRVSWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgICAgY29uc3QgY3VycmVudFVzZXIgPSBkYXRhLmNhbGxTZXNzaW9uVXNlcnMuZmluZCgoaXRlbSkgPT4gaXRlbS51c2VySWQgPT09IGN1cnJlbnRVSWQpO1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9jb250ZXh0LmdldENvbm5lY3Rpb25TdGF0dXMoKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9JTlZJVEVfTywgYGN1cnJlbnRVc2VyOiAke0pTT04uc3RyaW5naWZ5KGN1cnJlbnRVc2VyKX0sIGN1cnJlbnRVc2VySWQ6ICR7Y3VycmVudFVJZH0sIHN0YXRlOiAke3N0YXRlfWAsIHRyYWNlSWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9TSUdOQUxfVFJBTlNQT1JURVJfUkVDRUlWRV9JTlZJVEVfTywgYGVycm9yOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCwgdHJhY2VJZCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5faXNWYWxpZERhdGEoZGF0YS50b0RldmljZUlkIHx8ICcnKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1NJR05BTF9UUkFOU1BPUlRFUl9SRUNFSVZFX0lOVklURV9PLCBgbm90IGN1cnJlbnQgZGV2aWNlSWQgLT4gZGV2aWNlSW5mbzogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRvRGV2aWNlSWQ6IGRhdGEudG9EZXZpY2VJZCxcbiAgICAgICAgY2xpZW50RGV2aWNlSWQ6IHRoaXMuX3Nlc3Npb25JZCxcbiAgICAgIH0pfWAsIHRyYWNlSWQpO1xuICAgICAgLy8gQSDlkowgQiDnvqTpgJror53kuK3vvIxBIOWGjemCgOivtyBD77yMQiDlkowgQicg6YO95Lya5Lya5pS25YiwIHB1Ykludml0ZUNhbGwsIEInIOaUtuWIsOeahCBwdWJJbnZpdGVDYWxsIOeahCB0b0RldmljZUlkIOS4jeS4uuiHquW3se+8jOaXoOmcgOWkhOeQhlxuXG4gICAgICAvLyBob29rcyDlm57osIPlpITnkIZcbiAgICAgIGNvbnN0IGluZm8gPSB7XG4gICAgICAgIGV4dHJhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgcmVhc29uOiBQdWJJbnZpdGVDYWxsTWlzc1JlYXNvbi5OT1RfQ1VSUkVOVF9ERVZJQ0VJRCxcbiAgICAgICAgcmVmZXI6IGlzRGlyZWN0bHkgPyBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLlBVQl9JTlZJVEUgOiBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLlBVTExfS1ZfSU5WSVRFLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5lbWl0KENhbGxIb29rc1R5cGUub25QdWJJbnZpdGVDYWxsTWlzcywgT2JqZWN0LmFzc2lnbihkYXRhLCBpbmZvKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdGVuZXIub25JbnZpdGUoZGF0YSwgaXNEaXJlY3RseSwgdHJhY2VJZCk7XG4gICAgaWYgKGlzRGlyZWN0bHkpIHtcbiAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbCwgT2JqZWN0LmFzc2lnbihkYXRhLCB7IGV4dHJhOiBKU09OLnN0cmluZ2lmeShkYXRhKSB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uUHViSW52aXRlQ2FsbFB1bGxLdiwgT2JqZWN0LmFzc2lnbihkYXRhLCB7IGV4dHJhOiBKU09OLnN0cmluZ2lmeShkYXRhKSB9KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOeKtuaAgeWPmOabtO+8muWTjemTg+OAgeW/meeijOOAgemAmuivneetieW+heOAgeWvueaWueacquaOpeWQrOOAgeW3seaWueacquaOpeWQrFxuICAgKi9cbiAgcHJpdmF0ZSBfb25TdGF0dXNEb3duQ2FsbChkYXRhOiBJU3RhdHVzRG93bkNvbnQsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOaVsOaNruS4rei/h+a7pOaOieacquWPmOabtOeahCB1c2VyU2Vzc2lvblxuICAgIGRhdGEuY2FsbFNlc3Npb25Vc2VycyA9IGRhdGEuY2FsbFNlc3Npb25Vc2Vycy5maWx0ZXIoKGl0ZW0pID0+IEJvb2xlYW4oaXRlbS5jaGFuZ2VkKSk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfQ0FMTF9TVEFUVVNfTywgJycsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCF0aGlzLl9pc1ZhbGlkRGF0YShkYXRhLnRvRGV2aWNlSWQgfHwgJycpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfU0lHTkFMX1RSQU5TUE9SVEVSX1JFQ0VJVkVfQ0FMTF9TVEFUVVNfTywgYG5vdCBjdXJyZW50IGRldmljZUlkIC0+IGRldmljZUluZm86ICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0b0RldmljZUlkOiBkYXRhLnRvRGV2aWNlSWQsXG4gICAgICAgIGNsaWVudERldmljZUlkOiB0aGlzLl9zZXNzaW9uSWQsXG4gICAgICB9KX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIOS4jeaYr+e7meW9k+WJjeiuvuWkh+S4i+WPkeeahOeKtuaAgeWkhOeQhlxuICAgICAgdGhpcy5fbGlzdGVuZXIub25PdGhlckNsaWVudFN0YXR1c0Rvd24oZGF0YSwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2xpc3RlbmVyLm9uU3RhdHVzRG93bihkYXRhLCB0cmFjZUlkLCB0aGlzLl9zZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmAmuivneS6i+S7tuWPmOabtO+8muaJk+W8gHzlhbPpl60g5pGE5YOP5aS0XG4gICAqL1xuICBwcml2YXRlIF9vbkV2ZW50RG93bkNhbGwoZGF0YTogSUV2ZW50RG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xpc3RlbmVyLm9uRXZlbnREb3duKGRhdGEsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmAmuivneiwg+aVtOS6i+S7tuWPiue7k+aenFxuICAgKiDkuovku7bvvJrlqpLkvZPnsbvlnovliIfmjaJcbiAgICog5Yqo5L2c77ya6K+35rGC44CB5o6l5Y+X44CB5ouS57ud44CB5Y+W5raIXG4gICAqL1xuICBwcml2YXRlIF9vbkRpYWxvZ0Rvd25DYWxsKGRhdGE6IElEaWFsb2dEb3duQ2FsbENvbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBkaWFsb2dUeXBlIH0gPSBkYXRhO1xuICAgIGlmIChkaWFsb2dUeXBlID09PSBEaWFsb2dUeXBlLlNXSVRDSF9NRURJQV9UWVBFKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lci5vblN3aXRjaE1lZGlhVHlwZShkYXRhLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d57uT5p2f5ZCO77yM5pel5b+X5LiL5Y+RXG4gICAqL1xuICBwcml2YXRlIF9vblB1YkNhbGxMb2coZGF0YTogSVB1YkNhbGxMb2csIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NBTExfUkVDT1JEX08sIGBjYWxsIHJlY29yZDogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gLCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2xpc3RlbmVyLm9uUmVjdkNhbGxFbmRMb2coZGF0YSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6KGl5YG/5pWw5o2u5aSE55CGXG4gICAqL1xuICBwcml2YXRlIF9vbkNvbnBlbnNhdGlvbkRhdGEoZGF0YTogSUNvbnBlbnNhdGlvbkRhdGEsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9SRUNFSVZFX0NPTVBMRU1FTlRBUllfREFUQV9PLCAnJywgdHJhY2VJZCk7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbElkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBzZWNyZXRDaGF0LCBkdXJhdGlvbiwgY2FsbFN0YXR1cywgY2FsbGluZ1VzZXJJZCwgY2FsbFNlc3Npb25Vc2VycywgdG9EZXZpY2VJZCwgY2FsbERpYWxvZ0VudGl0eXMsIGV4dHJhLFxuICAgIH0gPSBkYXRhO1xuXG4gICAgY29uc3QgaXNQdWJJbnZpdGVDYWxsRGF0YSA9IGNhbGxTZXNzaW9uVXNlcnMuc29tZSgoaXRlbSkgPT4gaXRlbS5zZXNzaW9uU3RhdHVzID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JTlZJVEVEICYmIGl0ZW0udXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKTtcblxuICAgIGlmIChpc1B1Ykludml0ZUNhbGxEYXRhKSB7XG4gICAgICB0aGlzLl9vblB1Ykludml0ZUNhbGwoe1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIHRvRGV2aWNlSWQsXG4gICAgICAgIGNhbGxUeXBlLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGludml0ZVVzZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbFNlc3Npb25Vc2VycyxcbiAgICAgICAgc2VjcmV0Q2hhdCxcbiAgICAgICAgZXh0cmEsXG4gICAgICB9LCB0cmFjZUlkLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb25TdGF0dXNEb3duQ2FsbCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgdG9EZXZpY2VJZCxcbiAgICAgICAgY2FsbFN0YXR1cyxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIGNhbGxTZXNzaW9uVXNlcnMsXG4gICAgICB9LCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICBpZiAoY2FsbERpYWxvZ0VudGl0eXMubGVuZ3RoID4gMCkge1xuICAgICAgY2FsbERpYWxvZ0VudGl0eXMuZm9yRWFjaCgoZGF0YSkgPT4gdGhpcy5fb25EaWFsb2dEb3duQ2FsbChkYXRhLCB0cmFjZUlkKSwgdGhpcyk7XG4gICAgfVxuICB9XG59XG4iLCJjb25zdCBzdHJpbmcxMHRvNjQgPSAobnVtYmVyOiBudW1iZXIpID0+IHtcbiAgY29uc3QgY2hhcnMgPSAnMDEyMzQ1Njc4OWFiY2RlZmdoaWdrbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJR0tMTU5PUFFSU1RVVldYWVorLycuc3BsaXQoJycpO1xuICBjb25zdCByYWRpeCA9IGNoYXJzLmxlbmd0aCArIDE7XG4gIGxldCBxdXRpZW50ID0gK251bWJlcjtcbiAgY29uc3QgYXJyID0gW107XG4gIGRvIHtcbiAgICBjb25zdCBtb2QgPSBxdXRpZW50ICUgcmFkaXg7XG4gICAgcXV0aWVudCA9IChxdXRpZW50IC0gbW9kKSAvIHJhZGl4O1xuICAgIGFyci51bnNoaWZ0KGNoYXJzW21vZF0pO1xuICB9IHdoaWxlIChxdXRpZW50KTtcbiAgcmV0dXJuIGFyci5qb2luKCcnKTtcbn07XG5cbmNvbnN0IGdldFVVSUQgPSAoKSA9PiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gIGNvbnN0IHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwO1xuICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcbiAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xufSk7XG5cbi8qIOiOt+WPliAyMiDkvY3nmoQgVVVJRCAqL1xuZXhwb3J0IGNvbnN0IGdldFVVSUQyMiA9ICgpID0+IHtcbiAgbGV0IHV1aWQ6IHN0cmluZyB8IG51bWJlciA9IGdldFVVSUQoKTtcbiAgdXVpZCA9IGAke3V1aWQucmVwbGFjZSgvLS9nLCAnJyl9MGA7XG4gIHV1aWQgPSBwYXJzZUludCh1dWlkLCAxNik7XG4gIHV1aWQgPSBzdHJpbmcxMHRvNjQodXVpZCk7XG4gIGlmICh1dWlkLmxlbmd0aCA+IDIyKSB7XG4gICAgdXVpZCA9IHV1aWQuc2xpY2UoMCwgMjIpO1xuICB9XG4gIHJldHVybiB1dWlkO1xufTtcbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuXG5jb25zdCBDQUxMX0RCX05BTUUgPSAnUkNfQ0FMTFBMVVMnO1xuXG5jb25zdCBEQl9WRVJTSU9OID0gMTtcblxuaW50ZXJmYWNlIElPYmpTdG9yZVBhcmFtcyB7XG4gIC8qKlxuICAgKiDkuLvplK5cbiAgICovXG4gIGtleVBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiDlpoLmnpzmsqHmnInlkIjpgILnmoTkuLvplK7vvIzlj6/ku6Xorr7nva7kuLogdHJ1ZSDoh6rliqjnlJ/miJBcbiAgICovXG4gIGF1dG9JbmNyZW1lbnQ/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBJSW5kZXhEQk9wdHMge1xuICBvblN1Y2Nlc3M6ICgpID0+IHZvaWQ7XG4gIG9uRXJyb3I/OiAoKSA9PiB2b2lkO1xufVxuXG5sZXQgbG9nZ2VyOiBCYXNpY0xvZ2dlcjtcblxuZXhwb3J0IGNsYXNzIFJDQ2FsbEluZGV4REIge1xuICAvKipcbiAgICogY2FsbCBpbmRleERCIOW6k1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2RiOiBJREJEYXRhYmFzZSB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIFJDQ2FsbEluZGV4REIg5a6e5L6LXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFJDQ2FsbEluZGV4REIgfCBudWxsID0gbnVsbFxuXG4gIHN0YXRpYyBpbml0KF9sb2dnZXI6IEJhc2ljTG9nZ2VyLCBvcHRzOiBJSW5kZXhEQk9wdHMpIHtcbiAgICBsb2dnZXIgPSBfbG9nZ2VyO1xuICAgIGlmICghdGhpcy5pc1N1cHBvcnQoKSkge1xuICAgICAgbG9nZ2VyLmluZm8oJ1tSQ0NhbGxJbmRleERCXScsICdJbmRleERCIGlzIG5vdCBzdXBwb3J0IGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxID0gd2luZG93LmluZGV4ZWREQi5vcGVuKENBTExfREJfTkFNRSwgREJfVkVSU0lPTik7XG5cbiAgICByZXEub25lcnJvciA9IChldjogYW55KSA9PiB7XG4gICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYG9wZW4gaW5kZXhEQiByZXEgZmFpbGVkIC0+ICR7ZXYudGFyZ2V0LmVycm9yfWApO1xuICAgIH07XG5cbiAgICByZXEub25zdWNjZXNzID0gKGV2OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuX2RiID0gZXYudGFyZ2V0LnJlc3VsdDtcbiAgICAgIGlmICh0aGlzLl9kYikge1xuICAgICAgICB0aGlzLl9kYi5vbmNsb3NlID0gKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYFRoZSBkYiAke3RoaXMuX2RiIS5uYW1lfSBoYXMgdW5leHBlY3RlZGx5IGNsb3NlZC4gJHtldn1gKTtcbiAgICAgICAgICB0aGlzLnVuSW5pdCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kYi5vbmVycm9yID0gKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYFRoZSBkYiAke3RoaXMuX2RiIS5uYW1lfSBoYXMgb3BlbmluZyBlcnJvci4gJHtldn1gKTtcbiAgICAgICAgICB0aGlzLnVuSW5pdCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kYi5vbmFib3J0ID0gKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYFRoZSBkYiAke3RoaXMuX2RiIS5uYW1lfSBoYXMgb3BlbmluZyBhYm9ydGVkLiAke2V2fWApO1xuICAgICAgICAgIHRoaXMudW5Jbml0KCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBSQ0NhbGxJbmRleERCLl9pbnN0YW5jZSA9IG5ldyBSQ0NhbGxJbmRleERCKCk7XG4gICAgICBvcHRzLm9uU3VjY2VzcygpO1xuICAgIH07XG5cbiAgICByZXEub251cGdyYWRlbmVlZGVkID0gKGV2OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuX2RiID0gZXYudGFyZ2V0LnJlc3VsdDtcblxuICAgICAgUkNDYWxsSW5kZXhEQi5jcmVhdGVPYmpTdG9yZSgnQ2FsbEJXX0Fibm9ybWFsQ2FsbCcsIHsga2V5UGF0aDogJ3VzZXJJZCcgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyB1bkluaXQoKSB7XG4gICAgdGhpcy5fZGIgPSBudWxsO1xuICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBSQ0NhbGxJbmRleERCIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xuICB9XG5cbiAgc3RhdGljIGlzU3VwcG9ydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCAhd2luZG93IHx8ICF3aW5kb3cuaW5kZXhlZERCKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVPYmpTdG9yZShvYmpOYW1lOiBzdHJpbmcsIG9wdHM6IElPYmpTdG9yZVBhcmFtcykge1xuICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGI/Lm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMob2JqTmFtZSkpIHtcbiAgICAgIFJDQ2FsbEluZGV4REIuX2RiIS5jcmVhdGVPYmplY3RTdG9yZShvYmpOYW1lLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdbUkNDYWxsSW5kZXhEQl0nLCBgY3JlYXRlT2JqU3RvcmUgJHtvYmpOYW1lfSBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gb2JqTmFtZSDooajmmI5cbiAgICogQHBhcmFtIHZhbCDopoHmt7vliqDnmoTmlbDmja5cbiAgICovXG4gIHB1YmxpYyBhZGRWYWx1ZSA8VD4ob2JqTmFtZTogc3RyaW5nLCB2YWw6IFQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFSQ0NhbGxJbmRleERCLl9kYikge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdG9yZSA9IFJDQ2FsbEluZGV4REIuX2RiLnRyYW5zYWN0aW9uKFtvYmpOYW1lXSwgJ3JlYWR3cml0ZScpLm9iamVjdFN0b3JlKG9iak5hbWUpO1xuICAgICAgY29uc3QgcmVxID0gc3RvcmUuYWRkKHZhbCk7XG5cbiAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXEub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdbUkNDYWxsSW5kZXhEQl0nLCAnYWRkVmFsdWUgZmFpbGVkJyk7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7kuLvplK7or7vlj5bmlbDmja5cbiAgICogQHBhcmFtIGtleSDkuLvplK5cbiAgICovXG4gIHB1YmxpYyByZWFkQnlLZXkgPFQ+KG9iak5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGIpIHtcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdG9yZSA9IFJDQ2FsbEluZGV4REIuX2RiLnRyYW5zYWN0aW9uKFtvYmpOYW1lXSkub2JqZWN0U3RvcmUob2JqTmFtZSk7XG5cbiAgICAgIGNvbnN0IHJlcSA9IHN0b3JlLmdldChrZXkpO1xuXG4gICAgICByZXEub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHJlcS5yZXN1bHQpO1xuICAgICAgfTtcblxuICAgICAgcmVxLm9uZXJyb3IgPSAoZXYpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1tSQ0NhbGxJbmRleERCXScsIGByZWFkQnlLZXkgb25lcnJvciAtPiAke2V2fWApO1xuICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja7kuLvplK7mm7TmlrDmlbDmja5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVCeUtleSA8VD4ob2JqTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsOiBUKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghUkNDYWxsSW5kZXhEQi5fZGIpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RvcmUgPSBSQ0NhbGxJbmRleERCLl9kYi50cmFuc2FjdGlvbihbb2JqTmFtZV0sICdyZWFkd3JpdGUnKS5vYmplY3RTdG9yZShvYmpOYW1lKTtcblxuICAgICAgY29uc3QgcmVxID0gc3RvcmUucHV0KHZhbCk7XG5cbiAgICAgIHJlcS5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXEub25lcnJvciA9IChldikgPT4ge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1tSQ0NhbGxJbmRleERCXScsIGB1cGRhdGVCeUtleSBvbmVycm9yIC0+ICR7ZXZ9YCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUJ5S2V5KG9iak5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFSQ0NhbGxJbmRleERCLl9kYikge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdG9yZSA9IFJDQ2FsbEluZGV4REIuX2RiLnRyYW5zYWN0aW9uKFtvYmpOYW1lXSwgJ3JlYWR3cml0ZScpLm9iamVjdFN0b3JlKG9iak5hbWUpO1xuXG4gICAgICBjb25zdCByZXEgPSBzdG9yZS5kZWxldGUoa2V5KTtcblxuICAgICAgcmVxLm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH07XG5cbiAgICAgIHJlcS5vbmVycm9yID0gKGV2KSA9PiB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICBsb2dnZXIud2FybignW1JDQ2FsbEluZGV4REJdJywgYHJlbW92ZUJ5S2V5IG9uZXJyb3IgLT4gJHtldn1gKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyLCBJUnVudGltZSwgSVN0b3JhZ2UgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxJbmRleERCIH0gZnJvbSAnLi4vdXRpbHMvaW5kZXhEQic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU9ialN0b3JlIHtbdXNlcklkOiBzdHJpbmddOiBzdHJpbmdbXX1cblxuaW50ZXJmYWNlIElTdG9yZVZhbCB7dXNlcklkOiBzdHJpbmcsIGNhbGxJZHM6IHN0cmluZ1tdfVxuXG4vKipcbiAqIOW8guW4uOe7k+adnyBjYWxsIOWkhOeQhuWtmOWCqOexu1xuICog5Zyo5ZG85Ye65oiW5ZG85YWl6Zi25q6155qEIGNhbGwg6L+b6KGM5pys5Zyw5a2Y5YKo77yM5q2j5bi457uT5p2f5ZCO5riF6ZmkXG4gKiDlvILluLjnu5PmnZ/lkI7vvIzmnKzlnLDlj5bmnKrmuIXpmaTnmoQgY2FsbElkLCDpgJrov4fmnI3liqHmjqXlj6PmuIXpmaTlvILluLjnu5PmnZ/nmoQgY2FsbCAs6Ziy5q2i5peg5rOV5ZG85Ye65oiW5ZG85YWlXG4gKi9cbmV4cG9ydCBjbGFzcyBBYm5vcm1hbENhbGwge1xuICBwcml2YXRlIF9sb2NhbFN0b3JlITogSVN0b3JhZ2VcblxuICBwcml2YXRlIF9pbmRleERCU3RvcmUhOiBSQ0NhbGxJbmRleERCXG5cbiAgcHJpdmF0ZSBfc3RvcmVLZXk6IHN0cmluZyA9ICdDYWxsQldfQWJub3JtYWxDYWxsJ1xuXG4gIHByaXZhdGUgX2lzU3VwcG9ydEluZGV4REI6IGJvb2xlYW5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXI6IEJhc2ljTG9nZ2VyLFxuICApIHtcbiAgICB0aGlzLl9pc1N1cHBvcnRJbmRleERCID0gUkNDYWxsSW5kZXhEQi5pc1N1cHBvcnQoKTtcbiAgICBpZiAodGhpcy5faXNTdXBwb3J0SW5kZXhEQikge1xuICAgICAgUkNDYWxsSW5kZXhEQi5pbml0KHRoaXMuX2xvZ2dlciwge1xuICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLl9pbmRleERCU3RvcmUgPSBSQ0NhbGxJbmRleERCLmdldEluc3RhbmNlKCkhO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2xvY2FsU3RvcmUgPSBfcnVudGltZS5sb2NhbFN0b3JhZ2U7XG4gIH1cblxuICAvKipcbiAgICog5re75Yqg5byC5bi4IGNhbGxJZFxuICAgKi9cbiAgcHVibGljIGFkZEFibm9ybWFsbENhbGxJZCh1c2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhZGRGdW5jID0gdGhpcy5faXNTdXBwb3J0SW5kZXhEQiA/IHRoaXMuX2FkZEJ5SW5kZXhEQiA6IHRoaXMuX2FkZEJ5TG9jYWxTdG9yZTtcbiAgICBhZGRGdW5jLmNhbGwodGhpcywgdXNlcklkLCBjYWxsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIoOmZpOW8guW4uCBjYWxsSWRcbiAgICovXG4gIHB1YmxpYyByZW1vdmVBYm5vcm1hbENhbGxJZHModXNlcklkOiBzdHJpbmcsIGNhbGxJZHM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcmVtb3ZlRnVuYyA9IHRoaXMuX2lzU3VwcG9ydEluZGV4REIgPyB0aGlzLl9yZW1vdmVCeUluZGV4REIgOiB0aGlzLl9yZW1vdmVCeUxvY2FsU3RvcmU7XG4gICAgcmVtb3ZlRnVuYy5jYWxsKHRoaXMsIHVzZXJJZCwgY2FsbElkcyk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5byC5bi457uT5p2f55qEIGNhbGxJZCDliJfooahcbiAgICovXG4gIHB1YmxpYyBnZXRBYm5vcm1hbENhbGxJZHModXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICAgIGNvbnN0IGdldEZ1bmMgPSB0aGlzLl9pc1N1cHBvcnRJbmRleERCID8gdGhpcy5fZ2V0QnlJbmRleERCIDogdGhpcy5fZ2V0QnlMb2NhbFN0b3JlO1xuICAgIHJldHVybiBnZXRGdW5jLmNhbGwodGhpcywgdXNlcklkKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZEJ5TG9jYWxTdG9yZSh1c2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2JqU3RvcmU6IElPYmpTdG9yZSA9IDxJT2JqU3RvcmU+SlNPTi5wYXJzZSh0aGlzLl9sb2NhbFN0b3JlLmdldEl0ZW0odGhpcy5fc3RvcmVLZXkpIHx8ICd7fScpO1xuICAgICAgbGV0IHVzZXJBYm5vcm1hbENhbGxJZHMgPSBvYmpTdG9yZVt1c2VySWRdO1xuICAgICAgaWYgKHVzZXJBYm5vcm1hbENhbGxJZHMpIHtcbiAgICAgICAgdXNlckFibm9ybWFsQ2FsbElkcy5wdXNoKGNhbGxJZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1c2VyQWJub3JtYWxDYWxsSWRzID0gW2NhbGxJZF07XG4gICAgICB9XG4gICAgICBvYmpTdG9yZVt1c2VySWRdID0gdXNlckFibm9ybWFsQ2FsbElkcztcbiAgICAgIHRoaXMuX2xvY2FsU3RvcmUuc2V0SXRlbSh0aGlzLl9zdG9yZUtleSwgSlNPTi5zdHJpbmdpZnkob2JqU3RvcmUpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdbQWJub3JtYWxDYWxsXScsIGBfYWRkQnlMb2NhbFN0b3JlIGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZUJ5TG9jYWxTdG9yZSh1c2VySWQ6IHN0cmluZywgY2FsbElkczogc3RyaW5nW10pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2JqU3RvcmU6IElPYmpTdG9yZSA9IDxJT2JqU3RvcmU+SlNPTi5wYXJzZSh0aGlzLl9sb2NhbFN0b3JlLmdldEl0ZW0odGhpcy5fc3RvcmVLZXkpIHx8ICd7fScpO1xuICAgICAgbGV0IHVzZXJBYm5vcm1hbENhbGxJZHMgPSBvYmpTdG9yZVt1c2VySWRdO1xuICAgICAgaWYgKHVzZXJBYm5vcm1hbENhbGxJZHMpIHtcbiAgICAgICAgdXNlckFibm9ybWFsQ2FsbElkcyA9IHVzZXJBYm5vcm1hbENhbGxJZHMuZmlsdGVyKChpZCkgPT4gIWNhbGxJZHMuaW5jbHVkZXMoaWQpKTtcbiAgICAgICAgaWYgKHVzZXJBYm5vcm1hbENhbGxJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG9ialN0b3JlW3VzZXJJZF0gPSB1c2VyQWJub3JtYWxDYWxsSWRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBvYmpTdG9yZVt1c2VySWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9jYWxTdG9yZS5zZXRJdGVtKHRoaXMuX3N0b3JlS2V5LCBKU09OLnN0cmluZ2lmeShvYmpTdG9yZSkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ1tBYm5vcm1hbENhbGxdJywgYF9yZW1vdmVCeUxvY2FsU3RvcmUgZXJyOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QnlMb2NhbFN0b3JlKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+IHtcbiAgICBsZXQgY2FsbElkcyA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9ialN0b3JlOiBJT2JqU3RvcmUgPSA8SU9ialN0b3JlPkpTT04ucGFyc2UodGhpcy5fbG9jYWxTdG9yZS5nZXRJdGVtKHRoaXMuX3N0b3JlS2V5KSB8fCAne30nKTtcbiAgICAgIGNvbnN0IHVzZXJBYm5vcm1hbENhbGxJZHMgPSBvYmpTdG9yZVt1c2VySWRdO1xuICAgICAgaWYgKHVzZXJBYm5vcm1hbENhbGxJZHMpIHtcbiAgICAgICAgY2FsbElkcyA9IHVzZXJBYm5vcm1hbENhbGxJZHM7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignW0Fibm9ybWFsQ2FsbF0nLCBgX2dldEJ5TG9jYWxTdG9yZSBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjYWxsSWRzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2FkZEJ5SW5kZXhEQih1c2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuX2luZGV4REJTdG9yZS5yZWFkQnlLZXk8SVN0b3JlVmFsPih0aGlzLl9zdG9yZUtleSwgdXNlcklkKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGRhdGEuY2FsbElkcy5wdXNoKGNhbGxJZCk7XG4gICAgICAgIHRoaXMuX2luZGV4REJTdG9yZS51cGRhdGVCeUtleSh0aGlzLl9zdG9yZUtleSwgdXNlcklkLCB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIGNhbGxJZHM6IGRhdGEuY2FsbElkcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbmRleERCU3RvcmUuYWRkVmFsdWUodGhpcy5fc3RvcmVLZXksIHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgY2FsbElkczogW2NhbGxJZF0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ1tBYm5vcm1hbENhbGxdJywgYF9hZGRCeUluZGV4REIgZXJyOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVtb3ZlQnlJbmRleERCKHVzZXJJZDogc3RyaW5nLCBjYWxsSWRzOiBzdHJpbmdbXSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5faW5kZXhEQlN0b3JlLnJlYWRCeUtleTxJU3RvcmVWYWw+KHRoaXMuX3N0b3JlS2V5LCB1c2VySWQpO1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZGF0YS5jYWxsSWRzID0gZGF0YS5jYWxsSWRzLmZpbHRlcigoaWQpID0+ICFjYWxsSWRzLmluY2x1ZGVzKGlkKSk7XG4gICAgICAgIGlmIChkYXRhLmNhbGxJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuX2luZGV4REJTdG9yZS51cGRhdGVCeUtleSh0aGlzLl9zdG9yZUtleSwgdXNlcklkLCB7XG4gICAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgICBjYWxsSWRzOiBkYXRhLmNhbGxJZHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5faW5kZXhEQlN0b3JlLnJlbW92ZUJ5S2V5KHRoaXMuX3N0b3JlS2V5LCB1c2VySWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybignW0Fibm9ybWFsQ2FsbF0nLCBgX3JlbW92ZUJ5SW5kZXhEQiBlcnI6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9nZXRCeUluZGV4REIodXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICAgIGxldCBkYXRhID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgZGF0YSA9IGF3YWl0IHRoaXMuX2luZGV4REJTdG9yZS5yZWFkQnlLZXk8SVN0b3JlVmFsPih0aGlzLl9zdG9yZUtleSwgdXNlcklkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdbQWJub3JtYWxDYWxsXScsIGBfZ2V0QnlJbmRleERCIGVycjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAoZGF0YSkge1xuICAgICAgcmV0dXJuIGRhdGEuY2FsbElkcztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsIi8qKlxuICog5LqL5Lu257G75Z6LXG4gKi9cbmV4cG9ydCBlbnVtIENhbGxTZXJ2ZXJFdmVudFR5cGUge1xuICAvKipcbiAgICog5o+Q56S656qX5Y+jXG4gICAqL1xuICBQUk9NUFQgPSAwLFxuICAvKipcbiAgICogQ2FsbFNlcnZlciDkuIvlj5HpgJror53ml7bplb/lj5jmm7TnsbvlnotcbiAgICovXG4gIENBTExfRFVSQVRJT04gPSAxMCxcbiAgLyoqXG4gICAqIOaUtuWIsOi/nOerr+esrOS4gOW4p+aXtumXtFxuICAgKi9cbiAgRklSU1RfRlJBTUUgPSAyMCxcbn1cbiIsImV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNJbm5lckNvZGUge1xuICBTVUNDRVNTID0gMCxcbiAgLyoqXG4gICAqIOaXoOaViOeahOWTjeW6lOaXtumXtO+8iOaOpeWPo+WTjeW6lOaXtumXtOi/h+mVv++8iVxuICAgKi9cbiAgSU5WQUxJRF9SRVNQT05TRV9USU1FID0gODAxNzAsXG4gIC8qKlxuICAgKiDpnZ7mnIDkvJjlk43lupTml7bpl7RcbiAgICovXG4gIE5PTk9QVElNQUxfUkVTX1RJTUUgPSA4MDE3MSxcbn1cbiIsImltcG9ydCB7IEJhc2ljTG9nZ2VyIH0gZnJvbSAnQHJvbmdjbG91ZC9lbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsRW5naW5lIH0gZnJvbSAnLi4vUkNDYWxsRW5naW5lJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDb2RlIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNDb2RlJztcbmltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4uL3V0aWxzL3RpbWVycyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0lubmVyQ29kZSB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNJbm5lckNvZGUnO1xuXG4vKipcbiAqIOagoeaXtuaooeWdl1xuICovXG5leHBvcnQgY2xhc3MgVGltZUNvcnJlY3Rpb25lciB7XG4gIC8qKlxuICAgKiDmjqXlj6Plk43lupTml7bpl7RcbiAgICovXG4gIHByaXZhdGUgX1JUVDogbnVtYmVyID0gMFxuXG4gIC8qKlxuICAgKiDlj6/nlKjnmoTmjqXlj6Plk43lupTml7bpl7TkuIvpmZDvvIjljZXkvY06IG1z77yJXG4gICAqL1xuICBwcml2YXRlIF92YWxpZE1pblJUVDogbnVtYmVyID0gMjAwXG5cbiAgLyoqXG4gICAqIOWPr+eUqOeahOaOpeWPo+WTjeW6lOaXtumXtOS4iumZkO+8iOWNleS9jTogbXPvvIlcbiAgICovXG4gIHByaXZhdGUgX3ZhbGlkTWF4UlRUOiBudW1iZXIgPSAxMDAwXG5cbiAgLyoqXG4gICAqIOS4jiBjYWxsU2VydmVyIOeahOaXtumXtOWBj+W3ruaXtumXtO+8iOWNleS9jTogbXPvvIlcbiAgICovXG4gIHByaXZhdGUgX2RlbHRhVGltZTogbnVtYmVyID0gMFxuXG4gIC8qKlxuICAgKiB0aW1lcklkXG4gICAqL1xuICBwcml2YXRlIF90aW1lcklkOiBudW1iZXIgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiDova7orq3ml7bpl7Tpl7TpmpTvvIjljZXkvY06IG1z77yJXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbnRlcnZhbDogbnVtYmVyID0gMiAqIDEwMDBcblxuICAvKipcbiAgICog5pyA5aSn6YeN6K+V5qyh5pWwXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhSZXRyeVRpbWVzOiBudW1iZXIgPSA4XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2FsbEVuZ2luZTogUkNDYWxsRW5naW5lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2luZ2xlQ2FsbER1cmF0aW9uRXY6IChjYWxsSWQ6IHN0cmluZywgY2xpZW50U3RhcnRUaW1lOiBudW1iZXIsIGNsaWVudEZpcnN0RnJhbWVUaW1lOiBudW1iZXIsIHRyYWNlSWQ6IHN0cmluZykgPT4gdm9pZCxcbiAgKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiDku47mnI3liqHnq6/ojrflj5bpgJror53ml7bplb/jgIHpgJror53lvIDlp4vml7bpl7RcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsQ2xpZW50VGltZUJ5U2VydmVyKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCBkdXJhdGlvbj86IG51bWJlciwgY2xpZW50U3RhcnRUaW1lPzogbnVtYmVyIH0+IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0dFVF9DQUxMX0NMSUVOVF9USU1FX0JZX1NFUlZFUl9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICBpZiAoIXRoaXMuX1JUVCB8fCB0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1pblJUVCkge1xuICAgICAgYXdhaXQgdGhpcy5fZ2V0RGVsdGFUaW1lKHRyYWNlSWQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1heFJUVCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FfWAsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRDYWxsVGltZUluZm8oY2FsbElkLCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1IsIGBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBzdGFydFRpbWU6IHNlcnZlclN0YXJ0VGltZSB9ID0gZGF0YSE7XG4gICAgY29uc3QgY2xpZW50U3RhcnRUaW1lID0gTWF0aC5mbG9vcihzZXJ2ZXJTdGFydFRpbWUgLSB0aGlzLl9kZWx0YVRpbWUpO1xuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZHVyYXRpb24gPSAoY3VycmVudFRpbWUgKyB0aGlzLl9kZWx0YVRpbWUgLSBzZXJ2ZXJTdGFydFRpbWUpIC8gMTAwMDtcblxuICAgIGlmIChkdXJhdGlvbiA8IDApIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1AsIGBpbnZhbGlkIGR1cmF0aW9uOiAke2R1cmF0aW9ufWAsIHRyYWNlSWQpO1xuICAgICAgZHVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIC8vIOWQkeS4i+WPluaVtFxuICAgIGR1cmF0aW9uID0gTWF0aC5mbG9vcihkdXJhdGlvbik7XG5cbiAgICBpZiAodGhpcy5fUlRUID4gdGhpcy5fdmFsaWRNaW5SVFQgJiYgdGhpcy5fUlRUIDw9IHRoaXMuX3ZhbGlkTWF4UlRUKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9HRVRfQ0FMTF9DTElFTlRfVElNRV9CWV9TRVJWRVJfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0lubmVyQ29kZS5OT05PUFRJTUFMX1JFU19USU1FfWAsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfR0VUX0NBTExfQ0xJRU5UX1RJTUVfQllfU0VSVkVSX1IsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHJ0dDogdGhpcy5fUlRULFxuICAgICAgZGVsdGFUOiB0aGlzLl9kZWx0YVRpbWUsXG4gICAgICBzZXJ2ZXJTdGFydFRpbWUsXG4gICAgICBjbGllbnRTdGFydFRpbWUsXG4gICAgICBkdXJhdGlvbixcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZSwgZHVyYXRpb24sIGNsaWVudFN0YXJ0VGltZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOebtOaOpeiuoeeul+WuouaIt+err+W8gOWni+aXtumXtFxuICAgKi9cbiAgcHVibGljIGNhbGNDbGllbnRTdGFydFRpbWUoY2FsbElkOiBzdHJpbmcsIHN0YXJ0VGltZTogbnVtYmVyLCB0cmFjZUlkOiBzdHJpbmcpOiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUsIGNsaWVudFN0YXJ0VGltZT86IG51bWJlciB9IHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0NBTENfQ0xJRU5UX1NUQVJUX1RJTUVfVCwgYGNhbGxJZDogJHtjYWxsSWR9LCBzdGFydFRpbWU6ICR7c3RhcnRUaW1lfWAsIHRyYWNlSWQpO1xuICAgIGlmICh0aGlzLl9SVFQgPiB0aGlzLl92YWxpZE1heFJUVCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfQ0FMQ19DTElFTlRfU1RBUlRfVElNRV9SLCBgY29kZTogJHtSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRX1gLCB0cmFjZUlkKTtcbiAgICAgIC8vIOWGjeasoemHjeaWsOiOt+WPliBSVFQg5bm26YeN5paw6K6h566X5byA5aeL5pe26Ze0XG4gICAgICB0aGlzLl9sb29wQ29ycmVjdENsaWVudFRpbWUoY2FsbElkLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FIH07XG4gICAgfVxuXG4gICAgY29uc3QgY2xpZW50U3RhcnRUaW1lID0gTWF0aC5mbG9vcihzdGFydFRpbWUgLSB0aGlzLl9kZWx0YVRpbWUpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfQ0FMQ19DTElFTlRfU1RBUlRfVElNRV9SLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBydHQ6IHRoaXMuX1JUVCxcbiAgICAgIGRlbHRhVDogdGhpcy5fZGVsdGFUaW1lLFxuICAgICAgc3RhcnRUOiBzdGFydFRpbWUsXG4gICAgICBjbGllbnRTdGFydFRpbWUsXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgaWYgKHRoaXMuX1JUVCA+IHRoaXMuX3ZhbGlkTWluUlRUKSB7XG4gICAgICAvLyDph43nva4gY2FsbCDkuK3ph43or5XmrKHmlbBcbiAgICAgIHRoaXMuX3JldHJ5VGltZXNJbkNhbGwgPSAwO1xuICAgICAgLy8g5YaN5qyh6YeN5paw6I635Y+WIFJUVCDlubbph43mlrDorqHnrpflvIDlp4vml7bpl7RcbiAgICAgIHRoaXMuX2xvb3BDb3JyZWN0Q2xpZW50VGltZShjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuU1VDQ0VTUywgY2xpZW50U3RhcnRUaW1lIH07XG4gIH1cblxuICBwcml2YXRlIF9zdGFydFRpbWVzID0gMDtcblxuICAvKipcbiAgICog5byA5aeL5a6a5pe26YCS5b2S6I635Y+W5LiOIENhbGxTZXJ2ZXIg55qE5pe26Ze05YGP5beu5YC8XG4gICAqL1xuICBwdWJsaWMgc3RhcnQodHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX3RpbWVySWQgfHwgdGhpcy5fc3RhcnRUaW1lcyA+PSB0aGlzLl9tYXhSZXRyeVRpbWVzKSB7XG4gICAgICAvLyDpmLLmraLph43lpI3lkK/liqhcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX1NUQVJUX08sIGB0aW1lcklkOiAke3RoaXMuX3RpbWVySWR9YCk7XG5cbiAgICB0aGlzLl9zdGFydFRpbWVzKys7XG5cbiAgICAvLyDojrflj5ZcbiAgICB0aGlzLl9nZXREZWx0YVRpbWUodHJhY2VJZCk7XG5cbiAgICB0aGlzLl90aW1lcklkID0gdGltZXJTZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3RpbWVySWQgPSBudWxsO1xuICAgICAgdGhpcy5zdGFydCh0cmFjZUlkKTtcbiAgICB9LCB0aGlzLl9pbnRlcnZhbCk7XG4gIH1cblxuICAvKipcbiAgICog5YGc5q2i5a6a5pe26L2u6K6tXG4gICAqL1xuICBwdWJsaWMgc3RvcCh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX1NUT1BfTywgYHRpbWVySWQ6ICR7dGhpcy5fdGltZXJJZH1gLCB0cmFjZUlkKTtcbiAgICB0aGlzLl90aW1lcklkICYmIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcklkKTtcbiAgICB0aGlzLl90aW1lcklkID0gbnVsbDtcbiAgICAvLyDph43nva7mrKHmlbBcbiAgICB0aGlzLl9zdGFydFRpbWVzID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiDph43mlrDlrprml7bova7orq1cbiAgICovXG4gIHB1YmxpYyByZXN0YXJ0KHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfUkVTVEFSVF9PLCBgbGVnYWwgcnR0IHRpbWUsIFJUVDogJHt0aGlzLl9SVFR9LCB2YWxpZE1pblJUVDogJHt0aGlzLl92YWxpZE1pblJUVH1gLCB0cmFjZUlkKTtcbiAgICBpZiAodGhpcy5fUlRUIDwgdGhpcy5fdmFsaWRNaW5SVFQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5riF6Zmk5b2T5YmN5q2j5Zyo6L+b6KGM55qEXG4gICAgdGhpcy5zdG9wKHRyYWNlSWQpO1xuICAgIC8vIOmHjeaWsOWQr+WKqFxuICAgIHRoaXMuc3RhcnQodHJhY2VJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9jYWxEZWxheVRpbWUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLl9kZWx0YVRpbWUpO1xuICB9XG5cbiAgcHVibGljIGdldFJUVCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9SVFQ7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5LiOIENhbGxTZXJ2ZXIg55qE5pe26Ze05YGP5beu5YC877yM6Z2e6YCa6K+d5Lit55qE6K6h566XXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9nZXREZWx0YVRpbWUodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgZGVsYXlUaW1lPzogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3QgeyBjb2RlLCBkYXRhOiBzeW5jVGltZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRDYWxsU2VydmVyVGltZXN0YW1wKHRyYWNlSWQpO1xuXG4gICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50UlRUID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcblxuICAgIC8vIOWwj+S6jiAxMDAwbXMg5Li65Y+v55SoIHJ0dFxuICAgIGlmICgoY3VycmVudFJUVCA8IHRoaXMuX1JUVCB8fCB0aGlzLl9SVFQgPT09IDApICYmIGN1cnJlbnRSVFQgPD0gdGhpcy5fdmFsaWRNYXhSVFQpIHtcbiAgICAgIHRoaXMuX1JUVCA9IGN1cnJlbnRSVFQ7XG4gICAgfVxuXG4gICAgLy8g5Y+q5pyJ5bCP5LqOIDIwMG1zIOWBnOatouiOt+WPllxuICAgIGlmIChjdXJyZW50UlRUIDwgdGhpcy5fdmFsaWRNaW5SVFQpIHtcbiAgICAgIC8vIOWwj+S6juacgOWwj+WPr+eUqCBydHTvvIzlgZzmraLova7orq3orqHnrpdcbiAgICAgIHRoaXMuc3RvcCh0cmFjZUlkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWx0YVRpbWUgPSAoc3luY1RpbWUhIC0gc3RhcnRUaW1lKSAtIHRoaXMuX1JUVCAvIDI7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX1NFVF9ERUxUQV9USU1FX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHJ0dDogdGhpcy5fUlRULFxuICAgICAgZGVsdGFUOiB0aGlzLl9kZWx0YVRpbWUsXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgcmV0dXJuIHsgY29kZSwgZGVsYXlUaW1lOiB0aGlzLl9kZWx0YVRpbWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3ojrflj5blvIDlp4vml7bpl7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2dldERlbHRhVGltZUluQ2FsbChjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUsIGNsaWVudFN0YXJ0VGltZT86IG51bWJlciwgY2xpZW50Rmlyc3RGcmFtZVRpbWU/OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmdldENhbGxUaW1lSW5mbyhjYWxsSWQsIHRyYWNlSWQpO1xuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50UlRUID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcblxuICAgIC8vIOWwj+S6jiAxMDAwbXMg5Li65Y+v55SoIHJ0dFxuICAgIGlmIChjdXJyZW50UlRUIDwgdGhpcy5fUlRUKSB7XG4gICAgICB0aGlzLl9SVFQgPSBjdXJyZW50UlRUO1xuICAgIH1cblxuICAgIHRoaXMuX2RlbHRhVGltZSA9IChkYXRhIS5zeW5jVGltZSAtIHN0YXJ0VGltZSkgLSB0aGlzLl9SVFQgLyAyO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9TRVRfREVMVEFfVElNRV9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjYWxsSWQsXG4gICAgICBydHQ6IHRoaXMuX1JUVCxcbiAgICAgIGRlbHRhVDogdGhpcy5fZGVsdGFUaW1lLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IGNsaWVudFN0YXJ0VGltZSA9IE1hdGguZmxvb3IoZGF0YSEuc3RhcnRUaW1lIC0gdGhpcy5fZGVsdGFUaW1lKTtcbiAgICBjb25zdCBjbGllbnRGaXJzdEZyYW1lVGltZSA9IE1hdGguZmxvb3IoZGF0YSEuZmlyc3RGcmFtZXRpbWUgLSB0aGlzLl9kZWx0YVRpbWUpO1xuXG4gICAgLy8g5Y+q5pyJ5bCP5LqOIDIwMG1zIOWBnOatouiOt+WPllxuICAgIGlmIChjdXJyZW50UlRUIDwgdGhpcy5fdmFsaWRNaW5SVFQpIHtcbiAgICAgIC8vIOacgOS8mOe7k+aenO+8jOWBnOatoui9ruiureiuoeeul1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTLCBjbGllbnRTdGFydFRpbWUsIGNsaWVudEZpcnN0RnJhbWVUaW1lIH07XG4gICAgfVxuICAgIC8vIOmdnuacgOS8mOe7k+aenFxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNJbm5lckNvZGUuSU5WQUxJRF9SRVNQT05TRV9USU1FLCBjbGllbnRTdGFydFRpbWUsIGNsaWVudEZpcnN0RnJhbWVUaW1lIH07XG4gIH1cblxuICBwcml2YXRlIF9yZXRyeVRpbWVzSW5DYWxsOiBudW1iZXIgPSAwXG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4UmV0cnlUaW1lc0luQ2FsbDogbnVtYmVyID0gM1xuXG4gIC8qKlxuICAgKiDlpJrmrKHmoKHmraPmipvnu5nkuJrliqHlsYLnmoTpgJror53lvIDlp4vml7bpl7TjgIHpppbluKfml7bpl7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2xvb3BDb3JyZWN0Q2xpZW50VGltZShjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgLy8g5YWI5YGc5q2i5pyq57uT5p2f55qE6K6h566XXG4gICAgdGhpcy5zdG9wKHRyYWNlSWQpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9USU1FX0NPUlJFQ1RfTE9PUF9DT1JSRUNUX0NMSU5FVF9USU1FX1QsIGBjYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHsgY29kZSwgY2xpZW50U3RhcnRUaW1lLCBjbGllbnRGaXJzdEZyYW1lVGltZSB9ID0gYXdhaXQgdGhpcy5fZ2V0RGVsdGFUaW1lSW5DYWxsKGNhbGxJZCwgdHJhY2VJZCk7XG5cbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfVElNRV9DT1JSRUNUX0xPT1BfQ09SUkVDVF9DTElORVRfVElNRV9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfWAsIHRyYWNlSWQpO1xuICAgICAgLy8g57uT5p6c5pyA5LyY77yM5oqb57uZ5bqU55So5bGC5byA5aeL5pe26Ze0XG4gICAgICB0aGlzLl9zaW5nbGVDYWxsRHVyYXRpb25FdihjYWxsSWQsIGNsaWVudFN0YXJ0VGltZSEsIGNsaWVudEZpcnN0RnJhbWVUaW1lISwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXRyeVRpbWVzSW5DYWxsID4gdGhpcy5fbWF4UmV0cnlUaW1lc0luQ2FsbCAmJiBjb2RlID09PSBSQ0NhbGxQbHVzSW5uZXJDb2RlLklOVkFMSURfUkVTUE9OU0VfVElNRSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1RJTUVfQ09SUkVDVF9MT09QX0NPUlJFQ1RfQ0xJTkVUX1RJTUVfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0lubmVyQ29kZS5JTlZBTElEX1JFU1BPTlNFX1RJTUV9YCwgdHJhY2VJZCk7XG4gICAgICAvLyDpnZ7mnIDkvJjnu5PmnpzvvIzmipvnu5nlupTnlKjlsYLlvIDlp4vml7bpl7TvvIzmoLnmja7ph43or5XmrKHmlbDov5vooYzph43or5U7IOmHjeivlSAzIOasoeWQjuWGjeaKm+WHuuS4u+imgeaYr+S4uuS6huiOt+WPluacgOWwjyBSVFRcbiAgICAgIHRoaXMuX3NpbmdsZUNhbGxEdXJhdGlvbkV2KGNhbGxJZCwgY2xpZW50U3RhcnRUaW1lISwgY2xpZW50Rmlyc3RGcmFtZVRpbWUhLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JldHJ5VGltZXNJbkNhbGwgPiB0aGlzLl9tYXhSZXRyeVRpbWVzSW5DYWxsKSB7XG4gICAgICAvLyDml6DmnIDkvJjnu5PmnpzvvIzlupTnlKjlsYLmoLnmja7oh6rlt7HnmoTml7bpl7TotbDooagsIOebuOW9k+S6jiBSVFQg5oyJIDAg5aSE55CGXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmV0cnlUaW1lc0luQ2FsbCsrO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fbG9vcENvcnJlY3RDbGllbnRUaW1lKGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfSwgdGhpcy5faW50ZXJ2YWwpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBGb3J3YXJkVHlwZSB7XG4gIC8qKlxuICAgKiDpgJrov4fkuIvkuIDmrKHkurrlkZjnirbmgIEgdXNlclN0YXRlIOeahOS4i+WPkeWQjOatpeW4puS4i+WOu1xuICAgKi9cbiAgU09PTl9BRkVURVIgPSAwLFxuICAvKipcbiAgICog56uL5Y2z6L2s5Y+RXG4gICAqL1xuICBDVVJSRU5UID0gMSxcbn1cbiIsImltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGUsIFJDQ2FsbFBsdXNUeXBlIH0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5cbmV4cG9ydCBlbnVtIFJDQ2FsbFBsdXNJbnZpdGVTb3VyY2Uge1xuICBQVUJfSU5WSVRFX0NBTEwgPSAwLFxuICBQVUxMX0tWX0lOVklURV9DQUxMID0gMSxcbiAgU1lTVEVNX1BVU0ggPSAyLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTdGF0aXN0aWNzRGF0YSB7XG4gIC8qKlxuICAgKiDkuIrmiqXml7bpl7RcbiAgICovXG4gIHRpbWU6IG51bWJlcixcbiAgLyoqXG4gICAqIOi/kOiQpeWVhu+8jOS+i+WmgiDkuK3lm73ogZTpgJpcbiAgICovXG4gIGNyOiBzdHJpbmcsXG4gIC8qKlxuICAgKiDnvZHnu5znsbvlnovvvIzkvovlpoIgNEdcbiAgICovXG4gIG5ldDogc3RyaW5nLFxuICAvKipcbiAgICogdXNlcklkXG4gICAqL1xuICB1aWQ6IHN0cmluZyxcbiAgLyoqXG4gICAqIOmUmeivr+eggVxuICAgKi9cbiAgY29kOiBudW1iZXIsXG4gIC8qKlxuICAgKiDosIPnlKjmiafooYzml7bplb9cbiAgICovXG4gIGR1cjogbnVtYmVyXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnotcbiAgICovXG4gIG10cDogUkNDYWxsUGx1c01lZGlhVHlwZVxuICAvKipcbiAgICog6YCa6K+d57G75Z6L77yM56eB6IGK5oiW576k6IGKXG4gICAqL1xuICBjdHA6IFJDQ2FsbFBsdXNUeXBlXG4gIC8qKlxuICAgKiBjYWxsSWRcbiAgICovXG4gIGNpZDogc3RyaW5nXG4gIC8qKlxuICAgKiBjbGllbnQgY2FsbElkXG4gICAqL1xuICBjY2lkOiBzdHJpbmcsXG4gIC8qKlxuICAgKiDpgoDor7fmjqXmlLbmnaXmupBcbiAgICovXG4gIHJmOiBSQ0NhbGxQbHVzSW52aXRlU291cmNlXG59XG4iLCJleHBvcnQgZW51bSBSQ0NhbGxEaXJlY3Rpb24ge1xuICAvKipcbiAgICog5ZG85Ye6XG4gICAqL1xuICBPVVQgPSAtMSxcbiAgLyoqXG4gICAqIOe+pOWRvFxuICAgKi9cbiAgR1JPVVAgPSAwLFxuICAvKipcbiAgICog5ZG85YWlXG4gICAqL1xuICBJTiA9IDFcbn1cbiIsImltcG9ydCB7XG4gIEJhc2ljTG9nZ2VyLCBDb252ZXJzYXRpb25UeXBlLCBFdmVudEVtaXR0ZXIsIElSdW50aW1lLCBNZXNzYWdlRGlyZWN0aW9uLCBQbHVnaW5Db250ZXh0LCBSQ0Nvbm5lY3Rpb25TdGF0dXMsIFJlY2VpdmVkU3RhdHVzLCBnZXRVVUlELFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBEaWFsb2dBY3Rpb24gfSBmcm9tICcuL2VudW1zL0RpYWxvZ0FjdGlvbic7XG5pbXBvcnQgeyBEaWFsb2dUeXBlIH0gZnJvbSAnLi9lbnVtcy9EaWFsb2dUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0NhbGxTdGF0ZSB9IGZyb20gJy4vZW51bXMvUkNDYWxsU2Vzc2lvblN0YXRlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNUeXBlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxUeXBlJztcbmltcG9ydCB7IFNlY3JldENhbGxUeXBlIH0gZnJvbSAnLi9lbnVtcy9TZWNyZXRDYWxsVHlwZSc7XG5pbXBvcnQgeyBJUkNDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMvSUluZGV4JztcbmltcG9ydCB7XG4gIElBY2NlcHRJbmZvLFxuICBJQWNjZXB0T3B0cyxcbiAgSUNhbGxJZCxcbiAgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLFxuICBJUkNDYWxsUGx1c0dldENhbGxSZWNvcmRSZXMsXG4gIElDYW5jZWxDaGFuZ2VNZWRpYVR5cGVPcHRzLFxuICBJR2V0Q2FsbExvZ0xpc3RPcHRzLFxuICBJR2V0Q2FsbFNlc3Npb25SZXMsXG4gIElIYW5ndXBJbmZvLFxuICBJSW52aXRlT3B0cyxcbiAgSUludml0ZVJlcyxcbiAgSUpvaW5DYWxsT3B0cyxcbiAgSU90aGVyTWVtSW5mbyxcbiAgSVJlcUNoYW5nZU1lZGlhVHlwZU9wdHMsXG4gIElSZXFDaGFuZ2VNZWRpYVR5cGVSZXMsXG4gIElSZXNDaGFuZ2VNZWRpYVR5cGVPcHRzLFxuICBJU2Vzc2lvblVzZXIsXG4gIElTdGFydENhbGxPcHRzLFxuICBJU3RhcnRDYWxsUmVzdWx0LFxuICBJSGFuZ3VwRm9yQnVzeU9wdHMsXG4gIElDaGFuZ2VNZWRpYVR5cGVJbmZvLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQge1xuICBJQ2FsbFNlc3Npb25Vc2VyLFxuICBJRGlhbG9nRG93bkNhbGxDb24sXG4gIElFdmVudERvd25DYWxsQ29uLFxuICBJR2V0Q2FsbFRpbWVJbmZvUmVzLFxuICBJR2V0RGVsYXlUaW1lSW5mb1JlcyxcbiAgSVB1YkNhbGxMb2csXG4gIElQdWJJbnZpdGVDb24sXG4gIElTdGF0dXNEb3duQ29udCxcbiAgSVN5c1N0YXR1c1VwT3B0cyxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL0lTaWduYWxUcmFuc3BvcnRlcic7XG5pbXBvcnQgeyBDYWxsVGltZXJFdmVudFR5cGUsIFJDQ2FsbElubmVyU2Vzc2lvbiB9IGZyb20gJy4vbW9kdWxlcy9SQ0NhbGxJbm5lclNlc3Npb24nO1xuaW1wb3J0IHsgU2lnbmFsVHJhbnNwb3J0ZXIgfSBmcm9tICcuL21vZHVsZXMvU2lnbmFsVHJhbnNwb3J0ZXInO1xuaW1wb3J0IHsgcGFyc2VTdGF0dXNEYXRhLCB0cmFuMkNhbGxMb2csIHRyYW5zU2VydmVyUHVzaEV4dCB9IGZyb20gJy4vdXRpbHMvaGVscGVyJztcbmltcG9ydCB7IGdldFVVSUQyMiB9IGZyb20gJy4vdXRpbHMvcmFuZG9tJztcbmltcG9ydCB7IHRpbWVyU2V0VGltZW91dCB9IGZyb20gJy4vdXRpbHMvdGltZXJzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxTZXNzaW9uVXNlclN0YXRlJztcbmltcG9ydCB7IEFibm9ybWFsQ2FsbCB9IGZyb20gJy4vbW9kdWxlcy9BYm5vcm1hbENhbGwnO1xuaW1wb3J0IHsgQ2FsbFNlcnZlckV2ZW50VHlwZSB9IGZyb20gJy4vZW51bXMvQ2FsbFNlcnZlckV2ZW50VHlwZSc7XG5pbXBvcnQgeyBUaW1lQ29ycmVjdGlvbmVyIH0gZnJvbSAnLi9tb2R1bGVzL1RpbWVDb3JyZWN0aW9uZXInO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1Nlc3Npb24gfSBmcm9tICcuL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24nO1xuaW1wb3J0IHsgRm9yd2FyZFR5cGUgfSBmcm9tICcuL2VudW1zL0ZvcndhcmRUeXBlJztcbmltcG9ydCB7XG4gIENhbGxIb29rc1R5cGUsIFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLCBQdWJJbnZpdGVDYWxsTWlzc1JlZmVyLFxufSBmcm9tICcuL2ludGVyZmFjZXMvSUNhbGxIb29rcyc7XG5pbXBvcnQgeyBJUkNDYWxsUGx1c1N1bW1hcnlNZXNzYWdlQ29udGVudCwgUkNDYWxsUGx1c0NvZGUsIFJDQ2FsbFBsdXNSZWFzb24gfSBmcm9tICcuL2FwaS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0ludml0ZVNvdXJjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9JQ2FsbFBsdXNTdGF0aXN0aWNzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNMb2dnZXJUYWcgfSBmcm9tICcuL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSB9IGZyb20gJy4vbW9kdWxlcy9SQ0NhbGxQbHVzUmVwb3J0TW9kdWxlJztcbmltcG9ydCB7IFJDQ2FsbERpcmVjdGlvbiB9IGZyb20gJy4vZW51bXMvUkNDYWxsRGlyZWN0aW9uJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNJbm5lckNvZGUgfSBmcm9tICcuL2VudW1zL1JDQ2FsbFBsdXNJbm5lckNvZGUnO1xuaW1wb3J0IHsgTUlTU19NRVNTQUdFX05BTUUgfSBmcm9tICcuL2FwaS9jb25zdGFudHMnO1xuXG5jb25zdCBDQUxMX1RJTUVfT1VUID0gNjAgKiAxMDAwO1xuXG5leHBvcnQgY2xhc3MgUkNDYWxsRW5naW5lIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgc3RhdGljIF9fSU5ORVJfU0VTU0lPTl9DTE9TRV9fOiBzdHJpbmcgPSAnaW5uZXItc2Vzc2lvbi1jbG9zZSdcblxuICBzdGF0aWMgX19JTk5FUl9TRVNTSU9OX0NPTk5FQ1RfXzogc3RyaW5nID0gJ2lubmVyLXNlc3Npb24tY29ubmVjdCdcblxuICBzdGF0aWMgX19JTk5FUl9DSEFOR0VfTUVESUFfVFlQRV9fOiBzdHJpbmcgPSAnaW5uZXItY2hhbmdlLW1lZGlhLXR5cGUnXG5cbiAgc3RhdGljIF9fSU5ORVJfSU5WSVRFX186IHN0cmluZyA9ICdpbm5lci1pbnZpdGUnXG5cbiAgLyoqXG4gICAqIOS4uyBzZXNzaW9uXG4gICAqL1xuICBfbWFpblNlc3Npb246IFJDQ2FsbElubmVyU2Vzc2lvbiB8IG51bGwgPSBudWxsXG5cbiAgLyoqXG4gICAqIOWcqOmAmuivneS4reaUtuWIsOeahCDpgoDor7cgc2Vzc2lvblxuICAgKi9cbiAgX2hvbGRTZXNzaW9uczogUkNDYWxsSW5uZXJTZXNzaW9uW10gPSBbXVxuXG4gIC8qKlxuICAgKiDkv6Hku6TmqKHlnZdcbiAgICovXG4gIF9zaWduYWxNb2R1bGU6IFNpZ25hbFRyYW5zcG9ydGVyXG5cbiAgLyoqXG4gICAqIOW8guW4uOe7k+adnyBjYWxsIOWkhOeQhuWZqFxuICAgKi9cbiAgX2Fibm9ybWFsTW9kdWxlOiBBYm5vcm1hbENhbGxcblxuICAvKipcbiAgICog6K6w5b2V5Y2V5ZG85Lit77yM5piv5ZCm5LiK5oql6L+H56ys5LiA5binXG4gICAqIOe9riB0cnVlIOaXtuacuu+8muaUtuWIsOi/nOerr+esrOS4gOW4p++8jOaIkOWKn+S4iuaKpSBTZXJ2ZXJcbiAgICog572uIGZhbHNlIOaXtuacuu+8mumAmuivnee7k+adn1xuICAgKi9cbiAgcHJpdmF0ZSBfaXNVcEZpcnN0RnJhbWVUaW1lOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICog6YCa6K+d5Li6IE9OQ0FMTCDml7bvvIxTREsg6ZyA57uZ5Lia5Yqh5bGC5LiK5oql6YCa6K+d5byA5aeL6K6h5pe25LqL5Lu2XG4gICAqIOS8muaUtuWIsOWkmuasoSBPTkNBTEzvvIzmiYDku6XpnIDopoHmoIfor4bmmK/lkKblt7Lmipvov4fkuovku7ZcbiAgICovXG4gIHByaXZhdGUgX2NhbGxTdGFydE1hcDoge1xuICAgIFtjYWxsSWQ6IHN0cmluZ106IHtcbiAgICAgIC8qKlxuICAgICAgICog5piv5ZCm5pS25Yiw6L+H6YCa6K+d5byA5aeL5pe26Ze0XG4gICAgICAgKi9cbiAgICAgIGlzUmVjZWl2ZUNhbGxTdGFydFRpbWU6IGJvb2xlYW4sXG4gICAgICAvKipcbiAgICAgICAqIOmAmuivneW8gOWni+aXtumXtFxuICAgICAgICovXG4gICAgICBjYWxsU3RhcnRUaW1lOiBudW1iZXIsXG4gICAgICAvKipcbiAgICAgICAqIOmAmuivnemmluW4p+WIsOi+vuaXtumXtFxuICAgICAgICovXG4gICAgICBmaXJzdEZyYW1lVGltZTogbnVtYmVyXG4gICAgfVxuICB9ID0ge31cblxuICAvKipcbiAgICog5qCh5pe25ZmoXG4gICAqL1xuICBfdGltZUNvcnJlY3Rpb25lcjogVGltZUNvcnJlY3Rpb25lclxuXG4gIC8qKlxuICAgKiBjbGllbnQgY2FsbElkXG4gICAqL1xuICBwcml2YXRlIF9jbGllbnRDYWxsSWQ6IHN0cmluZyA9ICcnXG5cbiAgLyoqXG4gICAqIOaehOmAoOWZqFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dDogUGx1Z2luQ29udGV4dCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0T3B0czogSVJDQ2FsbEluaXRPcHRpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVwb3J0QXBwRXZlbnRNb2R1bGU6IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fdGltZUNvcnJlY3Rpb25lciA9IG5ldyBUaW1lQ29ycmVjdGlvbmVyKHRoaXMsIF9sb2dnZXIsIHRoaXMuX29uUmVjdlNpbkNhbGxEdXJhdGlvbi5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9zaWduYWxNb2R1bGUgPSBuZXcgU2lnbmFsVHJhbnNwb3J0ZXIoX2NvbnRleHQsIF9ydW50aW1lLCBfaW5pdE9wdHMsIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIsIHRoaXMuX2xvZ2dlciwgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUpO1xuICAgIHRoaXMuX3NpZ25hbE1vZHVsZS5yZWdpc3Rlckxpc3RlbmVyKHtcbiAgICAgIG9uSW52aXRlOiB0aGlzLl9vbkludml0ZS5iaW5kKHRoaXMpLFxuICAgICAgb25TdGF0dXNEb3duOiB0aGlzLl9vblN0YXR1c0Rvd24uYmluZCh0aGlzKSxcbiAgICAgIG9uT3RoZXJDbGllbnRTdGF0dXNEb3duOiB0aGlzLl9vbk90aGVyQ2xpZW50U3RhdHVzRG93bi5iaW5kKHRoaXMpLFxuICAgICAgb25FdmVudERvd246IHRoaXMuX29uRXZlbnREb3duLmJpbmQodGhpcyksXG4gICAgICBvblN3aXRjaE1lZGlhVHlwZTogdGhpcy5fb25Td2l0Y2hNZWRpYVR5cGUuYmluZCh0aGlzKSxcbiAgICAgIG9uUmVjdkNhbGxFbmRMb2c6IHRoaXMuX29uUmVjdkNhbGxFbmRMb2cuYmluZCh0aGlzKSxcbiAgICAgIG9uSU1TdGF0ZUNoYW5nZTogdGhpcy5fb25JTVN0YXRlQ2hhbmdlLmJpbmQodGhpcyksXG4gICAgfSk7XG4gICAgdGhpcy5fYWJub3JtYWxNb2R1bGUgPSBuZXcgQWJub3JtYWxDYWxsKF9ydW50aW1lLCBfbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5Hotbflkbzlj6tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdGFydENhbGwob3B0czogSVN0YXJ0Q2FsbE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElTdGFydENhbGxSZXN1bHR9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbFR5cGUsIG1lZGlhVHlwZSwgdG9Vc2VycywgdGFyZ2V0SWQsIHRhcmdldFR5cGUsIG9sZFJvb21JZCwgcHVzaENvbmZpZywgZXh0cmEsXG4gICAgfSA9IG9wdHM7XG4gICAgdGhpcy5fY2xpZW50Q2FsbElkID0gb3B0cy5jYWxsSWQ7XG4gICAgY29uc3QgcHVzaEV4dCA9IHB1c2hDb25maWcgPyB0cmFuc1NlcnZlclB1c2hFeHQocHVzaENvbmZpZywgdGhpcy5fY2xpZW50Q2FsbElkKSA6ICcnO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLnN0YXJ0Q2FsbCh7XG4gICAgICBjbGllbnRDYWxsSWQ6IHRoaXMuX2NsaWVudENhbGxJZCxcbiAgICAgIGNhbGxUeXBlLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgdG9Vc2VycyxcbiAgICAgIHNlY3JldENoYXQ6IFNlY3JldENhbGxUeXBlLk5PUk1BTCxcbiAgICAgIHRhcmdldFR5cGUsXG4gICAgICB0YXJnZXRJZCxcbiAgICAgIG9sZFJvb21JZCxcbiAgICAgIHB1c2hFeHQsXG4gICAgICBleHRyYSxcbiAgICB9LCB0cmFjZUlkKTtcblxuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjYWxsSWQsIGJ1c3lsaW5lVXNlcnMgfSA9IGRhdGEhO1xuXG4gICAgLy8g5pys5Zyw5a2Y5YKoIGNhbGxJZCwgY2FsbCDlvILluLjpgIDlh7rml7bkvb/nlKhcbiAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZS5hZGRBYm5vcm1hbGxDYWxsSWQoY3VycmVudFVzZXJJZCwgY2FsbElkKTtcblxuICAgIC8vIOeUn+aIkOS4uyBzZXNzaW9uXG4gICAgdGhpcy5fbWFpblNlc3Npb24gPSBuZXcgUkNDYWxsSW5uZXJTZXNzaW9uKFxuICAgICAgY2FsbElkLFxuICAgICAgUkNDYWxsUGx1c0NhbGxTdGF0ZS5JTlZJVEVELFxuICAgICAgY2FsbFR5cGUsXG4gICAgICBtZWRpYVR5cGUsXG4gICAgICBjdXJyZW50VXNlcklkLFxuICAgICAgY3VycmVudFVzZXJJZCxcbiAgICAgIFtdLFxuICAgICAgdGhpcy5fbG9nZ2VyLFxuICAgICk7XG5cbiAgICAvLyDljZXlkbzlkK/liqjlkbzlj6votoXml7borqHml7blmagsIOe+pOWRvOaXoOi2heaXtumAu+i+kVxuICAgIGlmIChjYWxsVHlwZSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFKSB7XG4gICAgICBjb25zdCBpbnZpdGVyVGltZXJJZCA9IHRoaXMuX3N0YXJ0VGltZXIoZGF0YSEuY2FsbElkLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5OT19BTlNXRVIsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlVGltZXJJZChDYWxsVGltZXJFdmVudFR5cGUuSU5WSVRFUiwgaW52aXRlclRpbWVySWQpO1xuICAgIH1cblxuICAgIC8vIOmAmuefpeW3seaWueS6uuWRmOeKtuaAgeWPmOabtFxuICAgIGNvbnN0IHNlbGZTdGF0ZSA9IHtcbiAgICAgIHVzZXJJZDogY3VycmVudFVzZXJJZCxcbiAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FMTElORyxcbiAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLkNBTExJTkcsXG4gICAgICB0YXJnZXRUeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgfTtcbiAgICBsZXQgaW52aXRlZXNTdGF0ZSA9IHRvVXNlcnMubWFwKCh7IHVzZXJJZCwgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSkgPT4gKHtcbiAgICAgIHVzZXJJZCxcbiAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSU5WSVRFRCxcbiAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLklOVklURUQsXG4gICAgICB0YXJnZXRUeXBlLFxuICAgICAgdGFyZ2V0SWQsXG4gICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgfSkpO1xuXG4gICAgbGV0IGJ1c3lVc2Vyc1N0YXRlOiBJU2Vzc2lvblVzZXJbXSA9IFtdO1xuICAgIGlmIChidXN5bGluZVVzZXJzKSB7XG4gICAgICBidXN5VXNlcnNTdGF0ZSA9IGJ1c3lsaW5lVXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSA9IGludml0ZWVzU3RhdGUuZmluZCgodXNlcikgPT4gdXNlci51c2VySWQgPT09IGl0ZW0udXNlcklkKSE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdXNlcklkOiBpdGVtLnVzZXJJZCxcbiAgICAgICAgICB1c2VyU3RhdGU6IGl0ZW0uc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5CVVNZTElORV9SSU5HSU5HLFxuICAgICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgLy8g6KKr6YKA6K+36ICF5Lit6ZyA6L+H5ruk5Ye65b+Z56KM55So5oi3XG4gICAgICBpbnZpdGVlc1N0YXRlID0gaW52aXRlZXNTdGF0ZS5maWx0ZXIoKHsgdXNlcklkIH0pID0+IGJ1c3lVc2Vyc1N0YXRlLmV2ZXJ5KCh7IHVzZXJJZDogYnVzeVVzZXJJZCB9KSA9PiBidXN5VXNlcklkICE9PSB1c2VySWQpKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIFtzZWxmU3RhdGUsIC4uLmludml0ZWVzU3RhdGUsIC4uLmJ1c3lVc2Vyc1N0YXRlXSwgdHJhY2VJZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgY29kZSwgZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneS4remCgOivt1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGludml0ZShvcHRzOiBJSW52aXRlT3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUludml0ZVJlc30+IHtcbiAgICAvLyDkuI3lrZjlnKjmraPlnKjpgJror53kuK0gc2Vzc2lvbiwg5LiN5YWB6K646YKA6K+3XG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHRvVXNlcnMsIHB1c2hDb25maWcsIGV4dHJhIH0gPSBvcHRzO1xuICAgIGNvbnN0IHB1c2hFeHQgPSBwdXNoQ29uZmlnID8gdHJhbnNTZXJ2ZXJQdXNoRXh0KHB1c2hDb25maWcsIHRoaXMuX2NsaWVudENhbGxJZCkgOiAnJztcblxuICAgIGNvbnN0IGNhbGxJZCA9IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmludml0ZUNhbGwoe1xuICAgICAgY2FsbElkLFxuICAgICAgdG9Vc2VycyxcbiAgICAgIHB1c2hFeHQsXG4gICAgICBleHRyYSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgaWYgKHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSkge1xuICAgICAgICAvLyDljZXlkbzkuK3pgoDor7fmiJDlip/vvIzljbPmm7TmlrAgY2FsbCBzZXNzaW9uIOmAmuivneexu+Wei+S4uue+pOWRvFxuICAgICAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVDYWxsVHlwZShSQ0NhbGxQbHVzVHlwZS5NVUxUSSk7XG4gICAgICAgIC8vIOmAmuefpSBjYWxsVHlwZSDlj5jmm7TkuLrnvqTlkbxcbiAgICAgICAgdGhpcy5fb25DYWxsVHlwZUNoYW5nZSh0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSwgUkNDYWxsUGx1c1R5cGUuTVVMVEksIHRyYWNlSWQpO1xuICAgICAgfVxuXG4gICAgICAvLyDpgJrnn6XooqvpgoDor7fkurrlkZjnirbmgIHlj5jmm7RcbiAgICAgIGxldCBpbnZpdGVkVXNlcnNTdGF0ZSA9IHRvVXNlcnMubWFwKCh7IHVzZXJJZCwgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSkgPT4gKHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLklOVklURUQsXG4gICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgIHRhcmdldElkLFxuICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICBtaWNyb3Bob25lRW5hYmxlOiBmYWxzZSxcbiAgICAgIH0pKTtcblxuICAgICAgbGV0IGJ1c3lsaW5lVXNlcnNTdGF0ZTogSVNlc3Npb25Vc2VyW10gPSBbXTtcbiAgICAgIGlmIChkYXRhIS5idXN5bGluZVVzZXJzKSB7XG4gICAgICAgIGJ1c3lsaW5lVXNlcnNTdGF0ZSA9IGRhdGEhLmJ1c3lsaW5lVXNlcnM/Lm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgdGFyZ2V0VHlwZSwgdGFyZ2V0SWQgfSA9IGludml0ZWRVc2Vyc1N0YXRlLmZpbmQoKHVzZXIpID0+IHVzZXIudXNlcklkID09PSBpdGVtLnVzZXJJZCkhO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1c2VySWQ6IGl0ZW0udXNlcklkLFxuICAgICAgICAgICAgdXNlclN0YXRlOiBpdGVtLnNlc3Npb25TdGF0dXMsXG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5CVVNZTElORV9SSU5HSU5HLFxuICAgICAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgICAgIHRhcmdldElkLFxuICAgICAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBpbnZpdGVkVXNlcnNTdGF0ZSA9IGludml0ZWRVc2Vyc1N0YXRlLmZpbHRlcigoeyB1c2VySWQgfSkgPT4gYnVzeWxpbmVVc2Vyc1N0YXRlLmV2ZXJ5KCh7IHVzZXJJZDogYnVzeVVzZXJJZCB9KSA9PiBidXN5VXNlcklkICE9PSB1c2VySWQpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgWy4uLmludml0ZWRVc2Vyc1N0YXRlLCAuLi5idXN5bGluZVVzZXJzU3RhdGVdLCB0cmFjZUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSwgZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGJlZm9yZUhhbmd1cFxuICAgKi9cbiAgcHVibGljIGNsZWFyQWxsVGltZXIoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOa4hemZpOaJgOaciei2heaXtuiuoeaXtuWZqFxuICAgIFt0aGlzLl9tYWluU2Vzc2lvbiwgLi4udGhpcy5faG9sZFNlc3Npb25zXS5mb3JFYWNoKChzZXNzaW9uKSA9PiB7XG4gICAgICBpZiAoc2Vzc2lvbiAmJiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgICAgc2Vzc2lvbi5nZXRBbGxUaW1lcklkcygpLmZvckVhY2goKHRpbWVySWQpID0+IHRoaXMuX3N0b3BUaW1lci5iaW5kKHRoaXMpKHRpbWVySWQsIHRyYWNlSWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjILmlq1cbiAgICog6YCa6K+d6K+35rGC5Y+W5raI44CB6YCa6K+d5ouS57udXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFuZ3VwKG9wdHM6IElIYW5ndXBGb3JCdXN5T3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgc3lzdGVtU3RhdGUsIHB1c2hDb25maWcsXG4gICAgfSA9IG9wdHM7XG4gICAgY29uc3QgcHVzaEV4dCA9IHB1c2hDb25maWcgPyB0cmFuc1NlcnZlclB1c2hFeHQocHVzaENvbmZpZywgdGhpcy5fY2xpZW50Q2FsbElkKSA6ICcnO1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuaGFuZ3VwQ2FsbCh7XG4gICAgICBjYWxsSWQsXG4gICAgICBzeXNTdGF0dXM6IHN5c3RlbVN0YXRlLFxuICAgICAgcHVzaEV4dCxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjqXmlLbpgoDor7dcbiAgICog6YCa6K+d5Lit5Y+I5pS25Yiw5paw5p2l55S15ZCO77yM5o6l5ZCs5paw5p2l55S15pe277yM5b+F6aG75YWI5oyC5pat5LmL5YmN55qE6YCa6K+d77yIbWFpblNlc3Npb27vvIlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY2NlcHQob3B0czogSUFjY2VwdE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICAvLyDkuI3lrZjlnKggc2Vzc2lvbiDkuI3lhYHorrjmjqXlkKxcbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY2FsbElkIH0gPSBvcHRzO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmFjY2VwdENhbGwoe1xuICAgICAgY2FsbElkLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgLy8g5riF6Zmk5o6l5ZCs6LaF5pe26K6h5pe25ZmoXG4gICAgdGhpcy5fc3RvcFRpbWVyKHRoaXMuX21haW5TZXNzaW9uLmdldEludml0ZWVUaW1lcklkKCksIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuICAgIHRoaXMuX2NsZWFyTW9iaWxlT25QaG9uZShvcHRzLmNhbGxJZCwgdHJhY2VJZCk7XG4gICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlU2Vzc2lvblN0YXRlKFJDQ2FsbFBsdXNDYWxsU3RhdGUuQ09OTkVDVElORyk7XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog55u05o6l5Yqg5YWlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgam9pbkNhbGwob3B0czogSUpvaW5DYWxsT3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIC8vIOWFiOaUtuWIsCBvbkludml0Ze+8jOayoeacieaOpemAmui/hyBqb2luQ2FsbCDmuIXpmaTmjqXlkKzotoXml7borqHml7blmahcbiAgICB0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9zdG9wVGltZXIodGhpcy5fbWFpblNlc3Npb24uZ2V0SW52aXRlZVRpbWVySWQoKSwgdHJhY2VJZCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuam9pbkNhbGwoeyBjYWxsSWQ6IG9wdHMuY2FsbElkIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgLy8g5pys5Zyw5a2Y5YKoIGNhbGxJZCwgY2FsbCDlvILluLjpgIDlh7rml7bkvb/nlKhcbiAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZS5hZGRBYm5vcm1hbGxDYWxsSWQoY3VycmVudFVzZXJJZCwgb3B0cy5jYWxsSWQpO1xuXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgLy8g5aaC5p6c5LiN5a2Y5ZyoIG1haW5TZXNzaW9uIOS7jiBzZXJ2ZXIg6I635Y+W5b2T5YmN5Yqg5YWl55qEIHNlc3Npb25cbiAgICAgIGF3YWl0IHRoaXMuX2NyZWF0ZVNlc3Npb25CeVNlcnZlcihvcHRzLmNhbGxJZCwgdHJhY2VJZCwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NsZWFyTW9iaWxlT25QaG9uZShvcHRzLmNhbGxJZCwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneWqkuS9k+WPmOabtOivt+axglxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUob3B0czogSVJlcUNoYW5nZU1lZGlhVHlwZU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgZGF0YT86IElSZXFDaGFuZ2VNZWRpYVR5cGVSZXN9PiB7XG4gICAgLy8g5LiN5a2Y5Zyo5q2j5Zyo6YCa6K+d5LitIHNlc3Npb24sIOS4jeWFgeiuuOiwg+eUqFxuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgY29uc3QgZXh0cmFLZXlWYWwgPSB7XG4gICAgICBtZWRpYVR5cGU6IG9wdHMubWVkaWFUeXBlLFxuICAgIH07XG4gICAgdGhpcy5fbWFpblNlc3Npb24udXBkYXRlUmVxTWVkaWFUeXBlKG9wdHMubWVkaWFUeXBlKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbklkID0gZ2V0VVVJRDIyKCk7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuZGlhbG9nVXBDYWxsKHtcbiAgICAgIHRyYW5zYWN0aW9uSWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgdG9Vc2VySWRzOiBvcHRzLnRvVXNlcklkcyxcbiAgICAgIGRpYWxvZ1R5cGU6IERpYWxvZ1R5cGUuU1dJVENIX01FRElBX1RZUEUsXG4gICAgICBhY3Rpb246IERpYWxvZ0FjdGlvbi5SRVFVRVNULFxuICAgICAgZXh0cmFLZXlWYWwsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCBkYXRhOiB7IHRyYW5zYWN0aW9uSWQgfSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuivneWqkuS9k+exu+Wei+WPmOabtOivt+axguWTjeW6lFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlc3BvbnNlQ2hhbmdlTWVkaWFUeXBlKG9wdHM6IElSZXNDaGFuZ2VNZWRpYVR5cGVPcHRzLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXJ9PiB7XG4gICAgLy8g5LiN5a2Y5Zyo5q2j5Zyo6YCa6K+d5LitIHNlc3Npb24sIOS4jeWFgeiuuOiwg+eUqFxuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVxTWVkaWFUeXBlID0gdGhpcy5fbWFpblNlc3Npb24uZ2V0UmVxTWVkaWFUeXBlKCk7XG4gICAgaWYgKG9wdHMuYWdyZWUpIHtcbiAgICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZU1lZGlhVHlwZShyZXFNZWRpYVR5cGUhKTtcbiAgICAgIHRoaXMuX21haW5TZXNzaW9uLnVwZGF0ZVJlcU1lZGlhVHlwZShudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbE1vZHVsZS5kaWFsb2dVcENhbGwoe1xuICAgICAgdHJhbnNhY3Rpb25JZDogb3B0cy50cmFuc2FjdGlvbklkLFxuICAgICAgY2FsbElkOiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICAgIGRpYWxvZ1R5cGU6IERpYWxvZ1R5cGUuU1dJVENIX01FRElBX1RZUEUsXG4gICAgICBhY3Rpb246IG9wdHMuYWdyZWUgPyBEaWFsb2dBY3Rpb24uQUNDRVBUIDogRGlhbG9nQWN0aW9uLlJFRlVTRSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5bmtojpgJror53lqpLkvZPnsbvlnovliIfmjaLor7fmsYJcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYW5jZWxDaGFuZ2VNZWRpYVR5cGUob3B0czogSUNhbmNlbENoYW5nZU1lZGlhVHlwZU9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICAvLyDkuI3lrZjlnKjmraPlnKjpgJror53kuK0gc2Vzc2lvbiwg5LiN5YWB6K646LCD55SoXG4gICAgaWYgKCF0aGlzLl9tYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmRpYWxvZ1VwQ2FsbCh7XG4gICAgICB0cmFuc2FjdGlvbklkOiBvcHRzLnRyYW5zYWN0aW9uSWQsXG4gICAgICBjYWxsSWQ6IHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpLFxuICAgICAgZGlhbG9nVHlwZTogRGlhbG9nVHlwZS5TV0lUQ0hfTUVESUFfVFlQRSxcbiAgICAgIGFjdGlvbjogRGlhbG9nQWN0aW9uLkNBTkNFTCxcbiAgICB9LCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCBsb2cg5YiX6KGoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbExvZ0xpc3Qob3B0czogSUdldENhbGxMb2dMaXN0T3B0cywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSVJDQ2FsbFBsdXNHZXRDYWxsUmVjb3JkUmVzfT4ge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHsgdGltZXN0YW1wLCBjb3VudCwgb3JkZXIgfSA9IG9wdHM7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuc3luY0NhbGxMb2coe1xuICAgICAgdXNlcklkOiBjdXJyZW50VXNlcklkLFxuICAgICAgc3luY1RpbWU6IHRpbWVzdGFtcCxcbiAgICAgIGNvdW50LFxuICAgICAgb3JkZXIsXG4gICAgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgY29uc3QgY2FsbExvZzogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkW10gPSBkYXRhIS5jYWxsTG9nTGlzdC5tYXAoKGl0ZW0pID0+IHRyYW4yQ2FsbExvZyhpdGVtKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgaGFzTW9yZTogQm9vbGVhbihkYXRhPy5oYXNNb3JlKSxcbiAgICAgICAgc3luY1RpbWU6IG9yZGVyID09PSAwID8gZGF0YSEubWF4VGltZSA6IGRhdGEhLm1pblRpbWUsXG4gICAgICAgIGxpc3Q6IGNhbGxMb2csXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5om56YeP5Yig6Zmk6YCa6K+d5pel5b+XXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlQ2FsbExvZyhjYWxsSWRzOiBzdHJpbmdbXSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxNb2R1bGUuZGVsZXRlQ2FsbFJlY29yZChjdXJyZW50VXNlcklkLCBjYWxsSWRzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgY2FsbCBzZXJ2ZXIg5b2T5YmN5pe26Ze05oizXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFNlcnZlclRpbWVzdGFtcCh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBudW1iZXJ9PiB7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0Q2FsbFNlcnZlclRpbWVzdGFtcCh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBjb2RlLCBkYXRhOiBkYXRhIS5zeW5jVGltZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBjYWxsIOaXtumXtOS/oeaBr1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENhbGxUaW1lSW5mbyhjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldENhbGxUaW1lSW5mb1Jlc30+IHtcbiAgICByZXR1cm4gdGhpcy5fc2lnbmFsTW9kdWxlLmdldENhbGxUaW1lSW5mbyhjYWxsSWQsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluacque7k+adn+eahOmAmuivneWIl+ihqFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldE9wZW5DYWxsTGlzdCh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIGRhdGE/OiBJUkNDYWxsUGx1c0NhbGxSZWNvcmRbXSB9PiB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgeyBjb2RlLCBkYXRhOiByZXNEYXRhIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0VXNlckNhbGxTdGF0ZUxpc3QodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0ID0gcmVzRGF0YSEuY2FsbFN0YXRlTGlzdC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2FsbElkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBjYWxsaW5nVXNlcklkLCBjYWxsVXNlcklkcywgY2FsbFN0YXR1cywgY3J0VGltZSwgdXNlclNlc3Npb25TdGF0dXMsIHN0YXJ0VGltZSwgc3luY1RpbWUsXG4gICAgICB9ID0gaXRlbTtcbiAgICAgIGNvbnN0IGNhbGxEaXJlY3Rpb24gPSAoY2FsbGluZ1VzZXJJZCA9PT0gY3VycmVudFVzZXJJZCkgPyBSQ0NhbGxEaXJlY3Rpb24uT1VUIDogUkNDYWxsRGlyZWN0aW9uLklOO1xuICAgICAgY29uc3QgeyBjbGllbnRTdGFydFRpbWUgPSBzdGFydFRpbWUgfSA9IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuY2FsY0NsaWVudFN0YXJ0VGltZShjYWxsSWQsIHN0YXJ0VGltZSwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIGNhbGxUeXBlLFxuICAgICAgICBjYWxsRGlyZWN0aW9uLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICAgIGNhbGxlclVzZXJJZDogY2FsbGluZ1VzZXJJZCxcbiAgICAgICAgY2FsbFVzZXJJZHMsXG4gICAgICAgIHNlc3Npb25TdGF0ZTogY2FsbFN0YXR1cyxcbiAgICAgICAgdXNlclN0YXRlOiB1c2VyU2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3RhcnRUaW1lc3RhbXA6IHN0YXJ0VGltZSxcbiAgICAgICAgZW5kVGltZXN0YW1wOiAwLFxuICAgICAgICBkdXJhdGlvbjogTWF0aC5mbG9vcigoK25ldyBEYXRlKCkgLSBjbGllbnRTdGFydFRpbWUpIC8gMTAwMCksXG4gICAgICAgIHN5bmNUaW1lc3RhbXA6IHN5bmNUaW1lLFxuICAgICAgICBzeXN0ZW1TdGF0ZTogMCxcbiAgICAgICAgY3JlYXRlVGltZXN0YW1wOiBjcnRUaW1lLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb2RlLFxuICAgICAgZGF0YTogbGlzdCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOa4hemZpOW9k+WJjeeUqOaIt+eahCBjYWxsIGxvZ1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlbW92ZUFsbENhbGxMb2codHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3NpZ25hbE1vZHVsZS5jbGVhckNhbGxSZWNvcmQodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmui/hyBjYWxsSWQg6I635Y+WIHNlc3Npb24g6K+m57uG5L+h5oGvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2FsbFNlc3Npb24ob3B0czogSUNhbGxJZCwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkYXRhPzogSUdldENhbGxTZXNzaW9uUmVzfT4ge1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmdldENhbGxTZXNzaW9uKG9wdHMsIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgY2FsbElkLCBjYWxsaW5nVXNlcklkLCBjYWxsVHlwZSwgbWVkaWFUeXBlLCBjYWxsU3RhdHVzLCBjYWxsU2Vzc2lvblVzZXJzLCBzdGFydFRpbWUsIGR1cmF0aW9uLCBzeW5jVGltZSxcbiAgICB9ID0gZGF0YSE7XG4gICAgY29uc3Qgc2Vzc2lvblVzZXJzID0gY2FsbFNlc3Npb25Vc2Vycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzeXNTdGF0dXMsIHRhcmdldFR5cGUsIHRhcmdldElkLFxuICAgICAgfSA9IGl0ZW07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3lzdGVtU3RhdGU6IHN5c1N0YXR1cyxcbiAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIGNhbWVyYUVuYWJsZTogZmFsc2UsXG4gICAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBzdGFydENhbGxlcklkOiBjYWxsaW5nVXNlcklkLFxuICAgICAgICBjYWxsVHlwZSxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgICBzZXNzaW9uU3RhdGU6IGNhbGxTdGF0dXMsXG4gICAgICAgIGNhbGxTZXNzaW9uVXNlcnM6IHNlc3Npb25Vc2VycyxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgc3luY1RpbWUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0SG9sZFNlc3Npb24oY2FsbElkOiBzdHJpbmcpOiBSQ0NhbGxQbHVzU2Vzc2lvbiB8IG51bGwge1xuICAgIGNvbnN0IGlubmVyU2Vzc2lvbiA9IHRoaXMuX2hvbGRTZXNzaW9ucy5maW5kKChzZXNzaW9uKSA9PiBzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZCk7XG4gICAgcmV0dXJuIGlubmVyU2Vzc2lvbiA/IG5ldyBSQ0NhbGxQbHVzU2Vzc2lvbihpbm5lclNlc3Npb24sIHRoaXMsIHRoaXMuX2xvZ2dlcikgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjeS4uyBzZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9jYWxNYWluU2Vzc2lvbigpOiBSQ0NhbGxQbHVzU2Vzc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tYWluU2Vzc2lvbiA/IG5ldyBSQ0NhbGxQbHVzU2Vzc2lvbih0aGlzLl9tYWluU2Vzc2lvbiwgdGhpcywgdGhpcy5fbG9nZ2VyKSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5Li7IHNlc3Npb24g54q25oCBXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlTWFpblNlc3Npb25TdGF0ZShzdGF0ZTogUkNDYWxsUGx1c0NhbGxTdGF0ZSkge1xuICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVTZXNzaW9uU3RhdGUoc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiusOW9leaYr+WQpuaYr+acrOerr+aMguaWrVxuICAgKi9cbiAgcHVibGljIHNldElzTG9jYWxDbGllbnRIYW5ndXAoaXNMb2NhbENsaWVudEhhbmd1cDogYm9vbGVhbikge1xuICAgIHRoaXMuX21haW5TZXNzaW9uPy5zZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKGlzTG9jYWxDbGllbnRIYW5ndXApO1xuICB9XG5cbiAgLyoqXG4gICAqIOmAmuefpeS6uuWRmOeKtuaAgVxuICAgKiBDYWxsQ2xpZW50IOS5n+mcgOimgeabtOaWsOS6uuWRmOeKtuaAge+8jOWumuS5ieS4uuWFrOWFseWHveaVsFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkOiBzdHJpbmcsIHVzZXJzOiBJU2Vzc2lvblVzZXJbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQREFURV9VU0VSU19TVEFURV9PLCBgdXBkYXRlVXNlcnNTdGF0ZSAtPiB1c2VyczogJHtKU09OLnN0cmluZ2lmeSh1c2Vycyl9YCwgdHJhY2VJZCk7XG5cbiAgICAvLyDmm7TmlrAgc2Vzc2lvbiDkurrlkZjliJfooahcbiAgICBjb25zdCBzZXNzaW9uID0gW3RoaXMuX21haW5TZXNzaW9uLCAuLi50aGlzLl9ob2xkU2Vzc2lvbnNdLmZpbmQoKGl0ZW0pID0+IGl0ZW0/LmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuXG4gICAgY29uc3QgY2hhbmdlZFVzZXJzID0gW107XG4gICAgaWYgKHNlc3Npb24pIHtcbiAgICAgIGNvbnN0IG5ld1VzZXJzID0gdXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZFVzZXJTdGF0ZSA9IHNlc3Npb24uZ2V0VXNlckxpc3QoKS5maWx0ZXIoKHsgdXNlcklkIH0pID0+IHVzZXJJZCA9PT0gaXRlbS51c2VySWQpWzBdIHx8IHt9O1xuICAgICAgICBjb25zdCBpc0lkbGUgPSBpdGVtLnVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuSURMRTtcbiAgICAgICAgY29uc3QgeyBjYW1lcmFFbmFibGUgPSBmYWxzZSwgbWljcm9waG9uZUVuYWJsZSA9IGZhbHNlIH0gPSBpc0lkbGUgPyB7IGNhbWVyYUVuYWJsZTogZmFsc2UsIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlIH0gOiBvbGRVc2VyU3RhdGU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBjYW1lcmFFbmFibGUsXG4gICAgICAgICAgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBjaGFuZ2VkVXNlcnMucHVzaCguLi5zZXNzaW9uLnVwZGF0ZVVzZXJMaXN0KG5ld1VzZXJzLCB0cmFjZUlkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYW5nZWRVc2Vycy5wdXNoKC4uLnVzZXJzKTtcbiAgICB9XG4gICAgLy8g6YCa55+l5LqL5Lu2XG4gICAgY2hhbmdlZFVzZXJzLmxlbmd0aCA+IDAgJiYgdGhpcy5fb25Vc2VyU3RhdGVDaGFuZ2UoY2FsbElkLCBjaGFuZ2VkVXNlcnMsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHVibGljIHNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgZW5hYmxlOiBib29sZWFuLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8uc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQsIG1lZGlhVHlwZSwgZW5hYmxlLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bpgJror53lvIDlp4vml7bpl7RcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDYWxsU3RhcmluZ1RpbWUob3B0czogSUNhbGxJZCwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCBkdXJhdGlvbj86IG51bWJlciwgY2xpZW50U3RhcnRUaW1lPzogbnVtYmVyfT4ge1xuICAgIHJldHVybiB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmdldENhbGxDbGllbnRUaW1lQnlTZXJ2ZXIob3B0cy5jYWxsSWQsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOS6uuWRmOezu+e7n+eKtuaAgeS4iuaKpVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN5c3RlbVN0YXR1c1VwKG9wdHM6IElTeXNTdGF0dXNVcE9wdHMsIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbE1vZHVsZS5zeXNTdGF0dXNVcChvcHRzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDljZXlkbzkuK3mlLbliLDov5znq6/mtYHlkI7vvIznu5kgQ2FsbFNlcnZlciDkuIrmiqXvvIznlKjkuo7lpITnkIborqHml7bpgLvovpFcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cEZpcnN0RnJhbWVUaW1lKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlcn0+IHtcbiAgICBjb25zdCBub05lZWRVcENvbmRpdGlvbiA9ICF0aGlzLl9tYWluU2Vzc2lvblxuICAgICAgfHwgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxUeXBlKCkgIT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSlcbiAgICAgIHx8IHRoaXMuX2lzVXBGaXJzdEZyYW1lVGltZTtcbiAgICBpZiAobm9OZWVkVXBDb25kaXRpb24pIHtcbiAgICAgIC8vIOS4jeWtmCBtYWluU2Vzc2lvbiDmiJYg6YCa6L+H57G75Z6L5LiN5Li65Y2V5ZG85pe277yM5LiN5LiK5oql77yM55u05o6l6L+U5Zue5oiQ5YqfXG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZGVsYXlUaW1lID0gdGhpcy5fdGltZUNvcnJlY3Rpb25lci5nZXRMb2NhbERlbGF5VGltZSgpO1xuICAgIGNvbnN0IHN0cmVhbVJlYWR5VGltZSA9IE1hdGguZmxvb3Iobm93ICsgZGVsYXlUaW1lKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfVVBfRklSU1RfRlJBTUVfVElNRV9ULCBgbm93OiAke25vd307IGRlbGF5OiAke2RlbGF5VGltZX07IHN0cmVhbVJlYWR5VGltZTogJHtzdHJlYW1SZWFkeVRpbWV9YCwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9pc1VwRmlyc3RGcmFtZVRpbWUgPSB0cnVlO1xuXG4gICAgY29uc3QgY2FsbElkID0gdGhpcy5fbWFpblNlc3Npb24hLmdldENhbGxJZCgpO1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fc2lnbmFsTW9kdWxlLmV2ZW50VXBDYWxsKHtcbiAgICAgIGNhbGxJZCxcbiAgICAgIGV2ZW50VHlwZTogQ2FsbFNlcnZlckV2ZW50VHlwZS5GSVJTVF9GUkFNRSxcbiAgICAgIGV2ZW50QXJnczogeyBzdHJlYW1SZWFkeVRpbWUgfSxcbiAgICAgIGV2ZW50VGltZTogRGF0ZS5ub3coKSxcbiAgICB9LCB0cmFjZUlkKTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUF9GSVJTVF9GUkFNRV9USU1FX1IsIGBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5LiK5bGC5qih5oufIHN0YXR1c0Rvd25DYWxsLCDnu5PmnZ8gc2Vzc2lvblxuICAgKiDpgJror53lu7rnq4vlkI7vvIzlj6rog73nu5PmnZ8gbWFpblNlc3Npb25cbiAgICovXG4gIHB1YmxpYyBlbmRDdXJyZW50U2Vzc2lvbihjdXJyZW50VXNlclN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCBjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgIGNvbnN0IHNlc3Npb25Vc2VyczogSUNhbGxTZXNzaW9uVXNlcltdID0gdGhpcy5fbWFpblNlc3Npb24uZ2V0VXNlckxpc3QoKS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICB1c2VySWQsIHN5c3RlbVN0YXRlLCB0YXJnZXRUeXBlLCB0YXJnZXRJZCxcbiAgICAgICAgfSA9IGl0ZW07XG4gICAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQpIHtcbiAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IGN1cnJlbnRVc2VyU3lzdGVtU3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICAgc2Vzc2lvblN0YXR1czogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuRU5ERUQsXG4gICAgICAgICAgc3RhdHVzVGltZTogRGF0ZS5ub3coKSxcbiAgICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgICBjaGFuZ2VkOiAxLFxuICAgICAgICAgIGludml0ZVVzZXJJZDogdGhpcy5fbWFpblNlc3Npb24hLmdldFN0YXJ0Q2FsbGVySWQoKSxcbiAgICAgICAgICBzeXNTdGF0dXM6IHN5c3RlbVN0YXRlLFxuICAgICAgICAgIHRhcmdldFR5cGUsXG4gICAgICAgICAgdGFyZ2V0SWQsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGE6IElTdGF0dXNEb3duQ29udCA9IHtcbiAgICAgICAgY2FsbElkOiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICAgICAgdG9EZXZpY2VJZDogdGhpcy5fc2lnbmFsTW9kdWxlLmdldFNlc3Npb25JZCgpLFxuICAgICAgICBjYWxsU3RhdHVzOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkVOREVELFxuICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgY2FsbFNlc3Npb25Vc2Vyczogc2Vzc2lvblVzZXJzLFxuICAgICAgfTtcbiAgICAgIHRoaXMuX29uU3RhdHVzRG93bihkYXRhLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5LiK5bGCIFJUQyDliqDlhaXmiL/pl7TlkI7ph43mlrDlvIDlp4vmoKHml7ZcbiAgICovXG4gIHB1YmxpYyBzdGFydFRpbWVDb3JyZWN0aW9uKHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIucmVzdGFydCh0cmFjZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREZWxheVRpbWVJbmZvKCk6IElHZXREZWxheVRpbWVJbmZvUmVzIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVsYXlUaW1lOiB0aGlzLl90aW1lQ29ycmVjdGlvbmVyLmdldExvY2FsRGVsYXlUaW1lKCksXG4gICAgICBydHQ6IHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuZ2V0UlRUKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBob2xkU2Vzc2lvbiDljYfnuqfkuLogbWFpblNlc3Npb25cbiAgICovXG4gIHB1YmxpYyB1cGdyYWRlTWFpblNlc3Npb24oaG9sZENhbGxJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9ob2xkU2Vzc2lvbnMuZmluZEluZGV4KChzZXNzaW9uKSA9PiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBob2xkQ2FsbElkKTtcbiAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IHRoaXMuX2hvbGRTZXNzaW9ucy5zcGxpY2UoaW5kZXgsIDEpPy5bMF07XG4gIH1cblxuICAvKipcbiAgICog5riF6Zmk5byC5bi457uT5p2f55qEIGNhbGxcbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbmRDdXJyZW50VXNlckFibm9ybWFsQ2FsbHMob3B0czoge2FsbERldmljZTogYm9vbGVhbn0pOiBQcm9taXNlPHtjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IGNhbGxJZHMgPSBhd2FpdCB0aGlzLl9hYm5vcm1hbE1vZHVsZS5nZXRBYm5vcm1hbENhbGxJZHMoY3VycmVudFVzZXJJZCk7XG4gICAgaWYgKCFjYWxsSWRzKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9zaWduYWxNb2R1bGUuZW5kVXNlckFibm9ybWFsQ2FsbHMoe1xuICAgICAgY2FsbElkcyxcbiAgICAgIGFsbERldmljZTogb3B0cy5hbGxEZXZpY2UgPyAxIDogMCxcbiAgICB9KTtcblxuICAgIGlmIChjb2RlID09PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZS5yZW1vdmVBYm5vcm1hbENhbGxJZHMoY3VycmVudFVzZXJJZCwgY2FsbElkcyk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKiA9PT09PT3np4HmnInmlrnms5U9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuICAvKipcbiAgICogSU0g54q25oCB5Y+Y5pu05aSE55CGXG4gICAqL1xuICBwcml2YXRlIF9vbklNU3RhdGVDaGFuZ2Uoc3RhdGU6IFJDQ29ubmVjdGlvblN0YXR1cykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIGxldCB0aW1lcklkOiBudW1iZXIgPSAwO1xuICAgIGlmIChzdGF0ZSA9PT0gUkNDb25uZWN0aW9uU3RhdHVzLkRJU0NPTk5FQ1RFRCkge1xuICAgICAgaWYgKHRoaXMuX21haW5TZXNzaW9uICYmIHRoaXMuX21haW5TZXNzaW9uLmdldFNlc3Npb25TdGF0ZSgpICE9PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgICAvLyDmlq3nvZHnrYnlvoUgNjBzIOWQjuinpuWPkSBvblNlc3Npb25DbG9zZVxuICAgICAgICB0aW1lcklkID0gdGltZXJTZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfSU1fU1RBVEVfQ0hBTkdFX08sICdlbmRDdXJyZW50U2Vzc2lvbiwgSU0gZGlzY29ubmVjdGVkIGZvciBtb3JlIHRoYW4gNjBzJywgdHJhY2VJZCk7XG4gICAgICAgICAgdGhpcy5lbmRDdXJyZW50U2Vzc2lvbihSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSLCB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkhLCB0cmFjZUlkKTtcbiAgICAgICAgfSwgQ0FMTF9USU1FX09VVCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gUkNDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgdGltZXJJZCAmJiBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICB0aGlzLmVuZEN1cnJlbnRVc2VyQWJub3JtYWxDYWxscyh7IGFsbERldmljZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5aSE55CG5Y+R6LW36YKA6K+344CB5pS25Yiw6YKA6K+35ZCO6K6h5pe26LaF5pe2XG4gICAqIOaPkOWJjeaooeaLnyBfb25TdGF0dXNEb3duLCDkuI3lho3kvp3otZYgQ2FsbFNlcnZlciDkuIvlj5HnmoQgX29uU3RhdHVzRG93blxuICAgKiDlpITnkIbnvZHnu5zlvILluLjmg4XlhrXkuIvkuIrmiqUgQ2FsbFNlcnZlciDlpLHotKXvvIxDYWxsU2VydmVyIOS4jeS8muS4i+WPkSBfb25TdGF0dXNEb3duIOaDheWGtVxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQ2FsbFRpbWVvdXQoY2FsbElkOiBzdHJpbmcsIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9DQUxMX1RJTUVPVVRfTywgYGNhbGwgdGltZW91dCBjYWxsSWQ6ICR7Y2FsbElkfSwgdXNlclN0YXRlOiAke3VzZXJTdGF0ZX1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCBzZXNzaW9uID0gW3RoaXMuX21haW5TZXNzaW9uLCAuLi50aGlzLl9ob2xkU2Vzc2lvbnNdLmZpbmQoKHNlc3Npb24pID0+IHNlc3Npb24gJiYgc2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKTtcbiAgICBpZiAoIXNlc3Npb24pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9DQUxMX1RJTUVPVVRfTywgYGhhbmRsZUNhbGxUaW1lb3V0IHdpdGhvdXQgc2Vzc2lvbiwgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcblxuICAgIHRoaXMuX29uU3RhdHVzRG93bih7XG4gICAgICBjYWxsSWQsXG4gICAgICB0b0RldmljZUlkOiB0aGlzLl9zaWduYWxNb2R1bGUuZ2V0U2Vzc2lvbklkKCksXG4gICAgICBjYWxsU3RhdHVzOiBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkVOREVELFxuICAgICAgZHVyYXRpb246IDAsXG4gICAgICBjYWxsU2Vzc2lvblVzZXJzOiBzZXNzaW9uLmdldFVzZXJMaXN0KCkubWFwKCh1c2VyKSA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB1c2VySWQsIHRhcmdldFR5cGUsIHRhcmdldElkLCBzdGF0ZVRpbWUsXG4gICAgICAgIH0gPSB1c2VyO1xuXG4gICAgICAgIGxldCBzeXNTdGF0dXM6IFJDQ2FsbFBsdXNSZWFzb247XG4gICAgICAgIGxldCBzZXNzaW9uU3RhdHVzOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZTtcbiAgICAgICAgaWYgKHVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCkge1xuICAgICAgICAgIHN5c1N0YXR1cyA9IHVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VEID8gUkNDYWxsUGx1c1JlYXNvbi5NSVNTRUQgOiBSQ0NhbGxQbHVzUmVhc29uLk5PX0FOU1dFUjtcbiAgICAgICAgICBzZXNzaW9uU3RhdHVzID0gdXNlclN0YXRlID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQgPyBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQgOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5OT19BTlNXRVI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3lzU3RhdHVzID0gdXNlclN0YXRlID09PSBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQgPyBSQ0NhbGxQbHVzUmVhc29uLk5PX0FOU1dFUiA6IFJDQ2FsbFBsdXNSZWFzb24uTUlTU0VEO1xuICAgICAgICAgIHNlc3Npb25TdGF0dXMgPSB1c2VyU3RhdGUgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCA/IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk5PX0FOU1dFUiA6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHNlc3Npb25TdGF0dXMsXG4gICAgICAgICAgc3RhdHVzVGltZTogc3RhdGVUaW1lID8gc3RhdGVUaW1lICsgMSA6IERhdGUubm93KCksXG4gICAgICAgICAgZHVyYXRpb246IDAsXG4gICAgICAgICAgY2hhbmdlZDogMSxcbiAgICAgICAgICBpbnZpdGVVc2VySWQ6IHNlc3Npb24uZ2V0Q2FsbGVySWQoKSxcbiAgICAgICAgICBzeXNTdGF0dXMsXG4gICAgICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIH0sIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOW8gOWQr+i2heaXtuiuoeaXtuWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfc3RhcnRUaW1lcihjYWxsSWQ6IHN0cmluZywgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSwgdHJhY2VJZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAvLyDlkK/liqjlkbzlj6votoXml7borqHml7blmahcbiAgICBjb25zdCB0aW1lcklkID0gdGltZXJTZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2hhbmRsZUNhbGxUaW1lb3V0KGNhbGxJZCwgdXNlclN0YXRlLCB0cmFjZUlkKTtcbiAgICAgIC8vIOS4iuaKpSBjYWxsIHNlcnZlciDotoXml7ZcbiAgICAgIHRoaXMuX3NpZ25hbE1vZHVsZS5zdGF0dXNVcENhbGwoeyBjYWxsSWQsIHNlc3Npb25TdGF0dXM6IHVzZXJTdGF0ZSB9LCB0cmFjZUlkKTtcbiAgICB9LCBDQUxMX1RJTUVfT1VUKTtcblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9TVEFSVF9DQUxMX1RJTUVSX08sIGBjYWxsSWQ6ICR7Y2FsbElkfSwgdGltZXJJZDogJHt0aW1lcklkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB0aW1lcklkO1xuICB9XG5cbiAgLyoqXG4gICAqIOWBnOatoui2heaXtuiuoeaXtuWZqFxuICAgKi9cbiAgcHJpdmF0ZSBfc3RvcFRpbWVyKHRpbWVySWQ6IG51bWJlciwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9TVE9QX0NBTExfVElNRVJfTywgYHRpbWVySWQ6ICR7dGltZXJJZH1gLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmlLbliLAg6YCa6K+d6YKA6K+3XG4gICAqL1xuICBwcml2YXRlIF9vbkludml0ZShkYXRhOiBJUHViSW52aXRlQ29uLCBpc0RpcmVjdGx5OiBib29sZWFuLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jbGllbnRDYWxsSWQgPSBnZXRVVUlEKCk7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbFNlc3Npb25Vc2Vycywgc2VjcmV0Q2hhdCwgZXh0cmEgPSAne30nLFxuICAgIH0gPSBkYXRhO1xuXG4gICAgaWYgKHNlY3JldENoYXQgPT09IFNlY3JldENhbGxUeXBlLlNFQ1JFVCkge1xuICAgICAgLy8g5aaC5p6c5piv5a+G6IGK6YCa6K+d5LiN5aSE55CGXG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ykludml0ZUNhbGxNaXNzLCBPYmplY3QuYXNzaWduKGRhdGEsIHtcbiAgICAgICAgZXh0cmE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICByZWFzb246IFB1Ykludml0ZUNhbGxNaXNzUmVhc29uLlNFQ1JFVF9DQUxMLFxuICAgICAgICByZWZlcjogaXNEaXJlY3RseSA/IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVCX0lOVklURSA6IFB1Ykludml0ZUNhbGxNaXNzUmVmZXIuUFVMTF9LVl9JTlZJVEUsXG4gICAgICB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g5aaC5p6c6Ieq5bex5piv6KKr6YKA6K+355qE55So5oi3XG4gICAgY29uc3QgaXNJbnZpdGVlID0gY2FsbFNlc3Npb25Vc2Vycy5zb21lKChpdGVtKSA9PiBpdGVtLnVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCk7XG4gICAgaWYgKGlzSW52aXRlZSkge1xuICAgICAgdGhpcy5fc2VsZklzSW52aXRlZUhhbmRsZShkYXRhLCBpc0RpcmVjdGx5LCB0cmFjZUlkLCBleHRyYSk7XG4gICAgfVxuXG4gICAgdGhpcy5fb3RoZXJzSXNJbnZpdGVlSGFuZGxlKGRhdGEsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOacrOerr+iiq+mCgOivt+WkhOeQhlxuICAgKi9cbiAgcHJpdmF0ZSBfc2VsZklzSW52aXRlZUhhbmRsZShkYXRhOiBJUHViSW52aXRlQ29uLCBpc0RpcmVjdGx5OiBib29sZWFuLCB0cmFjZUlkOiBzdHJpbmcsIGV4dHJhOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7XG4gICAgICBjYWxsSWQsIGludml0ZVVzZXJJZCwgY2FsbFR5cGUsIG1lZGlhVHlwZSwgY2FsbFNlc3Npb25Vc2VycyxcbiAgICB9ID0gZGF0YTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDmnKzlnLDlrZjlgqggY2FsbElkLCBjYWxsIOW8guW4uOmAgOWHuuaXtuS9v+eUqFxuICAgIHRoaXMuX2Fibm9ybWFsTW9kdWxlLmFkZEFibm9ybWFsbENhbGxJZChjdXJyZW50VXNlcklkLCBjYWxsSWQpO1xuXG4gICAgLy8g55Sf5oiQIGNhbGxTZXNzaW9uXG4gICAgY29uc3QgaW5uZXJTZXNzaW9uID0gbmV3IFJDQ2FsbElubmVyU2Vzc2lvbihcbiAgICAgIGNhbGxJZCxcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuUklOR0lORyxcbiAgICAgIGNhbGxUeXBlLFxuICAgICAgbWVkaWFUeXBlLFxuICAgICAgaW52aXRlVXNlcklkLFxuICAgICAgaW52aXRlVXNlcklkLFxuICAgICAgW10sXG4gICAgICB0aGlzLl9sb2dnZXIsXG4gICAgKTtcbiAgICAvLyBjYWxsIHNlcnZlciDlk43pk4PkuIrmiqVcbiAgICB0aGlzLl9zaWduYWxNb2R1bGUucmluZ2luZ0NhbGwoeyBjYWxsSWQgfSwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlkK/liqjmjqXlkKzotoXml7borqHml7blmahcbiAgICAgKi9cbiAgICBjb25zdCBpbnZpdGVlVGltZXJJZCA9IHRoaXMuX3N0YXJ0VGltZXIoY2FsbElkLCBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5NSVNTRUQsIHRyYWNlSWQpO1xuICAgIGlubmVyU2Vzc2lvbi51cGRhdGVUaW1lcklkKENhbGxUaW1lckV2ZW50VHlwZS5JTlZJVEVFLCBpbnZpdGVlVGltZXJJZCk7XG5cbiAgICBpZiAoIXRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICAvLyDnlJ/miJDkuLsgc2Vzc2lvblxuICAgICAgdGhpcy5fbWFpblNlc3Npb24gPSBpbm5lclNlc3Npb247XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOeUn+aIkOWJryBzZXNzaW9uc1xuICAgICAgdGhpcy5faG9sZFNlc3Npb25zLnB1c2goaW5uZXJTZXNzaW9uKTtcbiAgICAgIC8vIOabtOaWsOS4uyBzZXNzaW9uIOeKtuaAgeS4uiBIT0xEXG4gICAgICB0aGlzLl9tYWluU2Vzc2lvbi51cGRhdGVTZXNzaW9uU3RhdGUoUkNDYWxsUGx1c0NhbGxTdGF0ZS5CVVNZTElORV9XQUlUKTtcbiAgICB9XG5cbiAgICAvLyDmipvlh7rlt7HmlrnooqvpgoDor7dcbiAgICBjb25zdCBjYWxsUGx1c1Nlc3Npb24gPSBuZXcgUkNDYWxsUGx1c1Nlc3Npb24oaW5uZXJTZXNzaW9uLCB0aGlzLCB0aGlzLl9sb2dnZXIpO1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsKGNhbGxQbHVzU2Vzc2lvbiwgdHJhY2VJZCwgSlNPTi5wYXJzZShleHRyYSB8fCAne30nKS5leHRyYSk7XG5cbiAgICBjb25zdCBpbnZpdGVTb3VyY2UgPSBpc0RpcmVjdGx5ID8gUkNDYWxsUGx1c0ludml0ZVNvdXJjZS5QVUJfSU5WSVRFX0NBTEwgOiBSQ0NhbGxQbHVzSW52aXRlU291cmNlLlBVTExfS1ZfSU5WSVRFX0NBTEw7XG4gICAgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX0lOVklURV9fLCBjYWxsUGx1c1Nlc3Npb24sIGludml0ZVNvdXJjZSk7XG5cbiAgICBjb25zdCBvdGhlcnNTdGF0ZTogSVNlc3Npb25Vc2VyW10gPSBjYWxsU2Vzc2lvblVzZXJzLm1hcCgoe1xuICAgICAgdXNlcklkLCBzZXNzaW9uU3RhdHVzLCBzeXNTdGF0dXMsIHRhcmdldFR5cGUsIHRhcmdldElkLCBzdGF0dXNUaW1lLFxuICAgIH0pID0+ICh7XG4gICAgICB1c2VySWQsXG4gICAgICB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMsXG4gICAgICBzeXN0ZW1TdGF0ZTogc3lzU3RhdHVzLFxuICAgICAgdGFyZ2V0VHlwZSxcbiAgICAgIHRhcmdldElkLFxuICAgICAgc3RhdGVUaW1lOiBzdGF0dXNUaW1lLFxuICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgIG1pY3JvcGhvbmVFbmFibGU6IGZhbHNlLFxuICAgIH0pKTtcbiAgICAvLyDmipvlh7rkurrlkZjnirbmgIHlj5jmm7RcbiAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBvdGhlcnNTdGF0ZSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5YW25LuW5Lq66KKr6YKA6K+35aSE55CGXG4gICAqL1xuICBwcml2YXRlIF9vdGhlcnNJc0ludml0ZWVIYW5kbGUoZGF0YTogSVB1Ykludml0ZUNvbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgeyBjYWxsSWQsIGludml0ZVVzZXJJZCwgY2FsbFNlc3Npb25Vc2VycyB9ID0gZGF0YTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICAvLyDov4fmu6Tlh7rlhbbku5bnlKjmiLflkozoh6rlt7FcbiAgICBjb25zdCBvdGhlckludml0ZWRNZW1iZXIgPSBjYWxsU2Vzc2lvblVzZXJzLmZpbHRlcigoaXRlbSkgPT4gaXRlbS51c2VySWQgIT09IGN1cnJlbnRVc2VySWQgJiYgaXRlbS51c2VySWQgIT09IGludml0ZVVzZXJJZCAmJiBpdGVtLnNlc3Npb25TdGF0dXMgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLklOVklURUQpO1xuICAgIC8vIOaKm+WHuue+pOiBiuS4reiiq+mCgOivt+eahOWFtuS7luS6ulxuICAgIGlmICghb3RoZXJJbnZpdGVkTWVtYmVyLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyDpgJrnn6UgY2FsbFR5cGUg57G75Z6L5Y+Y5pu0XG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5TSU5HTEUgJiYgdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpID09PSBjYWxsSWQpIHtcbiAgICAgIHRoaXMuX29uQ2FsbFR5cGVDaGFuZ2UodGhpcy5fbWFpblNlc3Npb24uZ2V0Q2FsbElkKCksIFJDQ2FsbFBsdXNUeXBlLk1VTFRJLCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVDYWxsVHlwZShSQ0NhbGxQbHVzVHlwZS5NVUxUSSk7XG4gICAgfVxuXG4gICAgY29uc3QgaW52aXRlZE1lbWJlcjogSU90aGVyTWVtSW5mb1tdID0gW107XG4gICAgY29uc3QgdXNlcnNTdGF0ZTogSVNlc3Npb25Vc2VyW10gPSBbXTtcbiAgICBvdGhlckludml0ZWRNZW1iZXIuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgeyB1c2VySWQsIHNlc3Npb25TdGF0dXMsIHN5c1N0YXR1cyB9ID0gaXRlbTtcbiAgICAgIGludml0ZWRNZW1iZXIucHVzaCh7IGNhbGxJZCwgdXNlcklkLCB1c2VyU3RhdGU6IHNlc3Npb25TdGF0dXMgfSk7XG4gICAgICB1c2Vyc1N0YXRlLnB1c2goe1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3lzdGVtU3RhdGU6IHN5c1N0YXR1cyxcbiAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLl9vbk90aGVyTWVtYmVySW52aXRlKGludml0ZWRNZW1iZXIpO1xuICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIHVzZXJzU3RhdGUsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsCDmjILmlq3vvIjlr7nmlrnpgJror53lj5bmtojjgIHpgJror53mi5Lnu53vvIlcbiAgICovXG4gIHByaXZhdGUgX29uSGFuZ3VwKGRhdGE6IElIYW5ndXBJbmZvW10sIGNhbGxTZXNzaW9uYVN0YXR1czogUkNDYWxsUGx1c0NhbGxTdGF0ZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uKSB7XG4gICAgICAvLyDmuIXpmaTlkbzlj6votoXml7borqHml7blmahcbiAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5jYWxsSWQgPT09IHRoaXMuX21haW5TZXNzaW9uIS5nZXRDYWxsSWQoKSkge1xuICAgICAgICAgIGlmIChpdGVtLnVzZXJTdGF0ZSA9PT0gUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ0FOQ0VMTEVEKSB7XG4gICAgICAgICAgICAvLyDmuIXpmaTmjqXlkKzotoXml7borqHml7blmahcbiAgICAgICAgICAgIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlZVRpbWVySWQoKSwgdHJhY2VJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOaLkuaOpeOAgeW/meeijOOAgeacquaOpeWQrCDmuIXpmaTlkbzlj6votoXml7borqHml7blmahcbiAgICAgICAgICAgIHRoaXMuX3N0b3BUaW1lcih0aGlzLl9tYWluU2Vzc2lvbiEuZ2V0SW52aXRlclRpbWVySWQoKSwgdHJhY2VJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25YiwIOaOpeWQrFxuICAgKi9cbiAgcHJpdmF0ZSBfb25BY2NlcHQoZGF0YTogSUFjY2VwdEluZm9bXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2Vzc2lvblN0YXRlID0gdGhpcy5fbWFpblNlc3Npb24/LmdldFNlc3Npb25TdGF0ZSgpO1xuICAgIGNvbnN0IHVuTmVlZFVwU3RhdGUgPSBbXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkNPTk5FQ1RJTkcsXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCxcbiAgICAgIFJDQ2FsbFBsdXNDYWxsU3RhdGUuQlVTWUxJTkVfV0FJVCxcbiAgICBdO1xuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuU0lOR0xFXG4gICAgICAmJiBzZXNzaW9uU3RhdGUgJiYgdW5OZWVkVXBTdGF0ZS5pbmNsdWRlcyhzZXNzaW9uU3RhdGUpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRDYWxsZXJJZCA9IHRoaXMuX21haW5TZXNzaW9uIS5nZXRTdGFydENhbGxlcklkKCk7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICAvKipcbiAgICAgKiDljZXlkbzmlLbliLDlr7nmlrnmjqXlkKzml7bvvIzpnIDlrozmiJDlj5HluIPotYTmupDkuIDns7vliJfliqjkvZxcbiAgICAgKi9cbiAgICBpZiAodGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSAmJiBzdGFydENhbGxlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICBjb25zdCBhY2NlcHRVc2VySW5mbyA9IGRhdGEuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmZyb21Vc2VySWQgIT09IGN1cnJlbnRVc2VySWQpO1xuICAgICAgYWNjZXB0VXNlckluZm8gJiYgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ09OTkVDVF9fLCB0aGlzLmdldExvY2FsTWFpblNlc3Npb24oKSEuZ2V0Q2FsbElkKCksIHRyYWNlSWQpO1xuICAgIH1cbiAgICAvLyDmm7TmlrDkuLsgc2Vzc2lvbiDnirbmgIFcbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8udXBkYXRlU2Vzc2lvblN0YXRlKFJDQ2FsbFBsdXNDYWxsU3RhdGUuQ09OTkVDVElORyk7XG5cbiAgICAvLyDmuIXpmaTlkbzlj6votoXml7borqHml7blmahcbiAgICB0aGlzLl9zdG9wVGltZXIodGhpcy5fbWFpblNlc3Npb24hLmdldEludml0ZXJUaW1lcklkKCksIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOeKtuaAgeS4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfb25TdGF0dXNEb3duKGRhdGE6IElTdGF0dXNEb3duQ29udCwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICog6YCa6K+d54q25oCB5Li66L+e5o6l54q25oCB5pe277yM5L+d5a2Y5pyN5Yqh5LiL5Y+R55qE6YCa6K+d5byA5aeL5pe26Ze0XG4gICAgICovXG4gICAgY29uc3Qge1xuICAgICAgY2FsbFN0YXR1cywgc3RhcnRUaW1lLCBjYWxsSWQsXG4gICAgfSA9IGRhdGE7XG4gICAgaWYgKGNhbGxJZCAhPT0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0gPSB0aGlzLl9jYWxsU3RhcnRNYXBbY2FsbElkXSB8fCB7fTtcblxuICAgIC8qKlxuICAgICAqIOS4iuaKpemAmuivneW8gOWni+iuoeaXtuS6i+S7tlxuICAgICAqIOadoeS7tu+8mumAmuivneeKtuaAgeS4uiBPTkNBTEwg5LiU5pyq5LiK5oql6L+H6YCa6K+d5byA5aeL6K6h5pe25LqL5Lu2XG4gICAgICovXG4gICAgaWYgKCF0aGlzLl9jYWxsU3RhcnRNYXBbY2FsbElkXS5pc1JlY2VpdmVDYWxsU3RhcnRUaW1lXG4gICAgICAmJiBjYWxsU3RhdHVzID09PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0uaXNSZWNlaXZlQ2FsbFN0YXJ0VGltZSA9IHRydWU7XG4gICAgICBjb25zdCB7IGNvZGUsIGNsaWVudFN0YXJ0VGltZSB9ID0gdGhpcy5fdGltZUNvcnJlY3Rpb25lci5jYWxjQ2xpZW50U3RhcnRUaW1lKGNhbGxJZCwgc3RhcnRUaW1lISwgdHJhY2VJZCk7XG4gICAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2NhbGxTdGFydE1hcFtjYWxsSWRdLmNhbGxTdGFydFRpbWUgPSBjbGllbnRTdGFydFRpbWUhO1xuICAgICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbFN0YXJ0VGltZSh7XG4gICAgICAgICAgY2FsbElkLFxuICAgICAgICAgIGNhbGxTdGFydFRpbWU6IGNsaWVudFN0YXJ0VGltZSEsXG4gICAgICAgIH0sIHRyYWNlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOiuoeeul+aYr+WQpumAmuivnee7k+adn1xuICAgIGxldCBzZWxmRW5kID0gZmFsc2U7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG5cbiAgICAvLyDkuIrmiqXkurrlkZjnirbmgIHlj5jmm7RcbiAgICBjb25zdCBjaGFuZ2VkVXNlcnMgPSBkYXRhLmNhbGxTZXNzaW9uVXNlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICAvKipcbiAgICAgICAqIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk1JU1NFRCDpnIDljLrliIbigJzlkbzlj6vmlrnlhYjlj5bmtojpgJror53igJ3lkozigJzmnKznq6/otoXml7bmnKrmjqXlkKzigJ1cbiAgICAgICAqL1xuICAgICAgY29uc3QgaXNMZWZ0ID0gW1xuICAgICAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5JRExFLFxuICAgICAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5ERUNMSU5FRCxcbiAgICAgICAgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuTUlTU0VELFxuICAgICAgICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5OT19BTlNXRVIsXG4gICAgICAgIFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNBTkNFTExFRCxcbiAgICAgIF0uaW5jbHVkZXMoaXRlbS5zZXNzaW9uU3RhdHVzKSAmJiBpdGVtLnN5c1N0YXR1cyAhPT0gUkNDYWxsUGx1c1JlYXNvbi5DQU5DRUxMRUQ7XG4gICAgICBpZiAoaXNMZWZ0ICYmIGl0ZW0udXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgIHNlbGZFbmQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB1c2VySWQ6IGl0ZW0udXNlcklkLFxuICAgICAgICB1c2VyU3RhdGU6IGl0ZW0uc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgc3lzdGVtU3RhdGU6IGl0ZW0uc3lzU3RhdHVzLFxuICAgICAgICBzdGF0ZVRpbWU6IGl0ZW0uc3RhdHVzVGltZSxcbiAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY2hhbmdlZFVzZXJzLmxlbmd0aCA+IDAgJiYgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgY2hhbmdlZFVzZXJzLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOayoeaciSBzZXNzaW9uIOS4jeWkhOeQhuS8muivneeKtuaAgeWPmOabtFxuICAgICAqL1xuICAgIGlmICghdGhpcy5fbWFpblNlc3Npb24gJiYgIXRoaXMuX2hvbGRTZXNzaW9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDorqHnrpflh7rlk43lupTliqjkvZzvvIzlubbmipvlh7rkv6Hmga9cbiAgICBjb25zdCB7XG4gICAgICBoYW5ndXBEYXRhLCBhY2NlcHREYXRhLCBvdGhlckludml0ZWREYXRhLFxuICAgIH0gPSBwYXJzZVN0YXR1c0RhdGEoZGF0YSk7XG5cbiAgICBoYW5ndXBEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5fb25IYW5ndXAoaGFuZ3VwRGF0YSwgZGF0YS5jYWxsU3RhdHVzLCB0cmFjZUlkKTtcbiAgICBhY2NlcHREYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5fb25BY2NlcHQoYWNjZXB0RGF0YSwgdHJhY2VJZCk7XG5cbiAgICBpZiAob3RoZXJJbnZpdGVkRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsVHlwZSgpID09PSBSQ0NhbGxQbHVzVHlwZS5NVUxUSSkge1xuICAgICAgdGhpcy5fb25PdGhlck1lbWJlckludml0ZShvdGhlckludml0ZWREYXRhKTtcbiAgICB9XG5cbiAgICAvLyDlj6rmnInlnKggY2FsbFNlc3Npb24g54q25oCB5Li6IEVuZGVkIOaXtumAmuefpSBvblNlc3Npb25DbG9zZVxuICAgIGlmIChkYXRhLmNhbGxTdGF0dXMgPT09IFJDQ2FsbFBsdXNDYWxsU3RhdGUuRU5ERUQgfHwgc2VsZkVuZCkge1xuICAgICAgdGhpcy5fb25TZXNzaW9uQ2xvc2UoZGF0YSwgdHJhY2VJZCwgc2VsZkVuZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOWFtuS7luerr+eahOeKtuaAgeS4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBfb25PdGhlckNsaWVudFN0YXR1c0Rvd24oZGF0YTogSVN0YXR1c0Rvd25Db250LCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCB7IGNhbGxJZCwgY2FsbFNlc3Npb25Vc2VycyB9ID0gZGF0YTtcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IGNhbGxTZXNzaW9uVXNlcnMuZmluZCgoeyB1c2VySWQgfSkgPT4gdXNlcklkID09PSBjdXJyZW50VXNlcklkKTtcblxuICAgIGlmIChjdXJyZW50VXNlciAmJiAodGhpcy5fbWFpblNlc3Npb24gfHwgdGhpcy5faG9sZFNlc3Npb25zLmxlbmd0aCkpIHtcbiAgICAgIC8vIOaYr+W3seerr+eKtuaAgeWPmOabtOS4lOWtmOWcqCBzZXNzaW9uIOWGjeWOu+mAmuefpeS6uuWRmOeKtuaAgeWPmOabtOWbnuiwg++8jOS4jeWtmOWcqCBzZXNzaW9uIOS4jemcgOimgemAmuefpVxuICAgICAgY29uc3QgeyB1c2VySWQsIHNlc3Npb25TdGF0dXMsIHN0YXR1c1RpbWUgfSA9IGN1cnJlbnRVc2VyO1xuICAgICAgaWYgKHNlc3Npb25TdGF0dXMgPT09IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLkNPTk5FQ1RJTkcpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVzID0gW1JDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLk9OQ0FMTCwgUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuQ09OTkVDVElOR107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIOWmguaenOiHquW3seacquaOpeWQrOS4u+mAmuivne+8jOaUtuWIsOWkmuerryBDb25uZWN0aW5nIOeKtuaAge+8jOmcgOaKm+WHuiBzZXNzaW9uQ2xvc2VcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGlzTWFpblNlc3Npb24gPSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkgPT09IGNhbGxJZDtcbiAgICAgICAgY29uc3QgY3VycmVudFVzZXJTYXRlID0gdGhpcy5fbWFpblNlc3Npb24/LmdldFVzZXJMaXN0KCkuZmluZCgoaXRlbSkgPT4gaXRlbS51c2VySWQgPT09IGN1cnJlbnRVc2VySWQpPy51c2VyU3RhdGU7XG4gICAgICAgIGNvbnN0IGlzQWNjZXB0TWFpblNlc3Npb24gPSBpc01haW5TZXNzaW9uICYmIGN1cnJlbnRVc2VyU2F0ZSAmJiBzdGF0ZXMuaW5jbHVkZXMoY3VycmVudFVzZXJTYXRlKTtcbiAgICAgICAgaWYgKCFpc0FjY2VwdE1haW5TZXNzaW9uKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXRlKGNhbGxJZCwgW3tcbiAgICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICAgIHVzZXJTdGF0ZTogc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLk9USEVSX0NMSUVOVF9BQ0NFUFQsXG4gICAgICAgICAgICBzdGF0ZVRpbWU6IHN0YXR1c1RpbWUsXG4gICAgICAgICAgICBjYW1lcmFFbmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgfV0sIHRyYWNlSWQpO1xuXG4gICAgICAgICAgdGhpcy5fb25TZXNzaW9uQ2xvc2UoZGF0YSwgdHJhY2VJZCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOS6i+S7tuS4i+WPkVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfb25FdmVudERvd24oZGF0YTogSUV2ZW50RG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgZXZlbnRBcmdzLCBldmVudFR5cGUsXG4gICAgfSA9IGRhdGE7XG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gQ2FsbFNlcnZlckV2ZW50VHlwZS5DQUxMX0RVUkFUSU9OICYmIGNhbGxJZCA9PT0gdGhpcy5fbWFpblNlc3Npb24/LmdldENhbGxJZCgpKSB7XG4gICAgICBjb25zdCB7IGZpcnN0RnJhbWVUaW1lIH0gPSBldmVudEFyZ3MgYXMgeyBmaXJzdEZyYW1lVGltZTogbnVtYmVyIH07XG4gICAgICAvLyDorqHnrpflvIDlp4vml7bpl7RcbiAgICAgIGNvbnN0IHsgY29kZSwgY2xpZW50U3RhcnRUaW1lOiBjbGllbnRGaXJzdEZyYW1lVGltZSB9ID0gdGhpcy5fdGltZUNvcnJlY3Rpb25lci5jYWxjQ2xpZW50U3RhcnRUaW1lKGNhbGxJZCwgZmlyc3RGcmFtZVRpbWUsIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfRklSU1RfRlJBTUVfVElNRV9PLCBgY2xpZW50Rmlyc3RGcmFtZVRpbWU6ICR7Y2xpZW50Rmlyc3RGcmFtZVRpbWV9YCwgdHJhY2VJZCk7XG4gICAgICBpZiAoY29kZSA9PT0gUkNDYWxsUGx1c0lubmVyQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2NhbGxTdGFydE1hcFtjYWxsSWRdLmZpcnN0RnJhbWVUaW1lID0gY2xpZW50Rmlyc3RGcmFtZVRpbWUhO1xuICAgICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbEZpcnN0RnJhbWVUaW1lKGNhbGxJZCwgY2xpZW50Rmlyc3RGcmFtZVRpbWUhLCB0cmFjZUlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa55+l5Y2V5ZG8IGR1cmF0aW9uIOWPmOabtFxuICAgKi9cbiAgcHJpdmF0ZSBfb25SZWN2U2luQ2FsbER1cmF0aW9uKGNhbGxJZDogc3RyaW5nLCBjbGllbnRTdGFydFRpbWU6IG51bWJlciwgY2xpZW50Rmlyc3RGcmFtZVRpbWU6IG51bWJlciwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX21haW5TZXNzaW9uPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICB0aGlzLl9jYWxsU3RhcnRNYXBbY2FsbElkXS5jYWxsU3RhcnRUaW1lID0gY2xpZW50U3RhcnRUaW1lO1xuICAgICAgdGhpcy5fY2FsbFN0YXJ0TWFwW2NhbGxJZF0uZmlyc3RGcmFtZVRpbWUgPSBjbGllbnRGaXJzdEZyYW1lVGltZTtcbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDYWxsU3RhcnRUaW1lKHsgY2FsbElkLCAuLi57IGNhbGxTdGFydFRpbWU6IGNsaWVudFN0YXJ0VGltZSB9IH0sIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZShjYWxsSWQsIGNsaWVudEZpcnN0RnJhbWVUaW1lLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25Yiw5aqS5L2T5Y+Y5pu055u45YWz5LqL5Lu2XG4gICAqL1xuICBwcml2YXRlIF9vblN3aXRjaE1lZGlhVHlwZShkYXRhOiBJRGlhbG9nRG93bkNhbGxDb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgYWN0aW9uLCBleHRyYUtleVZhbCwgdHJhbnNhY3Rpb25JZCwgcHJvbW90ZXJJZCxcbiAgICB9ID0gZGF0YTtcbiAgICBjb25zdCB7IG1lZGlhVHlwZSwgcmVhc29uIH0gPSBleHRyYUtleVZhbDtcblxuICAgIGNvbnN0IGN1cnJlbnRDYWxsSWQgPSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCk7XG4gICAgaWYgKGNhbGxJZCAhPT0gY3VycmVudENhbGxJZCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfTUVESUFUWVBFX0NIQU5HRV9PLCBgbm90IGN1cnJlbnQgc2Vzc2lvbiBjYWxsSWQ6ICR7Y3VycmVudENhbGxJZH0sIHJlY3ZDYWxsSWQ6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHRyYW5zYWN0aW9uSWQ6IG9sZFRyYW5zSWQsIGFjdGlvbjogb2xkQWN0aW9uLCBtZWRpYVR5cGU6IE9sZE1lZGlhVHlwZSB9ID0gdGhpcy5fbWFpblNlc3Npb24/LmdldE9sZERpYWxvZ0RhdGEoKSB8fCB7fTtcbiAgICBpZiAob2xkVHJhbnNJZCA9PT0gdHJhbnNhY3Rpb25JZCAmJiBvbGRBY3Rpb24gPT09IGFjdGlvbiAmJiBPbGRNZWRpYVR5cGUgPT09IG1lZGlhVHlwZSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfTUVESUFUWVBFX0NIQU5HRV9PLCAnZHVwbGljYXRlIGRpYWxvZyBkYXRhJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfTUVESUFUWVBFX0NIQU5HRV9PLCBgYWN0aW9uOiAke2FjdGlvbn0sIHJlYXNvbjogJHtyZWFzb259YCwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9tYWluU2Vzc2lvbj8uc2V0T2xkRGlhbG9nRGF0YSh7IHRyYW5zYWN0aW9uSWQsIGFjdGlvbiwgbWVkaWFUeXBlIH0pO1xuXG4gICAgLy8g5Y2H57qn5rWB56iL5aSE55CGXG4gICAgaWYgKGFjdGlvbiA9PT0gRGlhbG9nQWN0aW9uLlJFUVVFU1QpIHtcbiAgICAgIHRoaXMuX29uUmVxdWVzdENoYW5nZU1lZGlhVHlwZSh7XG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IHRyYW5zYWN0aW9uSWQhLFxuICAgICAgICB1c2VySWQ6IHByb21vdGVySWQsXG4gICAgICAgIG1lZGlhVHlwZSxcbiAgICAgIH0sIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY2hhbmdlTWVkaWFUeXBlUmVzdWx0ID0gbnVsbDtcbiAgICAgIHN3aXRjaCAocmVhc29uKSB7XG4gICAgICAgIGNhc2UgRGlhbG9nQWN0aW9uLkNBTkNFTDpcbiAgICAgICAgICBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgPSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LkNBTkNFTF9DSEFOR0VfTUVESUFfVFlQRTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBEaWFsb2dBY3Rpb24uQUNDRVBUOlxuICAgICAgICAgIGNoYW5nZU1lZGlhVHlwZVJlc3VsdCA9IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuU0VSVkVSX0FMTE9XX01FRElBX1RZUEU7XG4gICAgICAgICAgdGhpcy5fbWFpblNlc3Npb24/LnVwZGF0ZU1lZGlhVHlwZSh0aGlzLl9tYWluU2Vzc2lvbi5nZXRSZXFNZWRpYVR5cGUoKSEpO1xuICAgICAgICAgIHRoaXMuX21haW5TZXNzaW9uPy51cGRhdGVSZXFNZWRpYVR5cGUobnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRGlhbG9nQWN0aW9uLlJFRlVTRTpcbiAgICAgICAgICBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgPSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LlJFRlVTRV9DSEFOR0VfTUVESUFfVFlQRTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBEaWFsb2dBY3Rpb24uVElNRU9VVDpcbiAgICAgICAgICBjaGFuZ2VNZWRpYVR5cGVSZXN1bHQgPSBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LkNIQU5HRV9NRURJQV9UWVBFX1RJTUVPVVQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHRbY2hhbmdlTWVkaWFUeXBlUmVzdWx0IGFzIFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHRdXG4gICAgICAmJiB0aGlzLl9yZWNlaXZlTWVkaWFUeXBlQ2hhbmdlUmVzdWx0KHtcbiAgICAgICAgdHJhbnNhY3Rpb25JZDogdHJhbnNhY3Rpb25JZCEsXG4gICAgICAgIHVzZXJJZDogcHJvbW90ZXJJZCxcbiAgICAgICAgbWVkaWFUeXBlLFxuICAgICAgfSwgY2hhbmdlTWVkaWFUeXBlUmVzdWx0IGFzIFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIC8vIOmZjee6p+mAmuefpeWkhOeQhlxuICAgIGlmIChhY3Rpb24gPT09IERpYWxvZ0FjdGlvbi5OT1RJQ0UgJiYgbWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPICYmICFyZWFzb24pIHtcbiAgICAgIHRoaXMuX3JlY2VpdmVNZWRpYVR5cGVDaGFuZ2VSZXN1bHQoe1xuICAgICAgICB0cmFuc2FjdGlvbklkOiB0cmFuc2FjdGlvbklkISxcbiAgICAgICAgdXNlcklkOiBwcm9tb3RlcklkLFxuICAgICAgICBtZWRpYVR5cGUsXG4gICAgICB9LCBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0LlNFUlZFUl9BTExPV19NRURJQV9UWVBFLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pS25YiwIGNhbGwgbG9nIOaXpeW/l1xuICAgKi9cbiAgcHJpdmF0ZSBfb25SZWN2Q2FsbEVuZExvZyhkYXRhOiBJUHViQ2FsbExvZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2FsbExvZyA9IHRyYW4yQ2FsbExvZyhkYXRhKTtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbFJlY29yZChjYWxsTG9nLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53nu5PmnZ9cbiAgICovXG4gIHByaXZhdGUgX29uU2Vzc2lvbkNsb3NlKGRhdGE6IElTdGF0dXNEb3duQ29udCwgdHJhY2VJZDogc3RyaW5nLCBpc1NlbGZIYW5ndXA6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB7IGNhbGxJZCB9ID0gZGF0YTtcbiAgICBjb25zdCBjdXJyZW50VXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcblxuICAgIC8vIOato+W4uOe7k+adn++8jOa4hemZpOacrOWcsOWtmOWCqOeahCBjYWxsSWRcbiAgICB0aGlzLl9hYm5vcm1hbE1vZHVsZS5yZW1vdmVBYm5vcm1hbENhbGxJZHMoY3VycmVudFVzZXJJZCwgW2NhbGxJZF0pO1xuXG4gICAgbGV0IGNsb3NlZFNlc3Npb24gPSBbdGhpcy5fbWFpblNlc3Npb24sIC4uLnRoaXMuX2hvbGRTZXNzaW9uc10uZmluZCgoc2Vzc2lvbikgPT4gc2Vzc2lvbiAmJiBzZXNzaW9uLmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuICAgIGlmICghY2xvc2VkU2Vzc2lvbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfQ0xPU0VfU0VTU0lPTl9PLCBgdW5leHBlY3Qgc2Vzc2lvbiBjYWxsSWQgLT4gJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1JFQ0VJVkVfQ0xPU0VfU0VTU0lPTl9PLCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOa0vuWPkemAmuivnee7k+adn++8jOWkhOeQhumAmuivnee7k+adn+WQjiBSVEMg6YCA5oi/6Ze0562J6YC76L6RXG4gICAgICovXG4gICAgdGhpcy5lbWl0KFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ0xPU0VfXywgY2FsbElkLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOS4iuaKpemAmuivnee7k+adn1xuICAgICAqIOWkmuerr+WFtuS7luerr+aMguaWremAmuivne+8jOmcgOaKiuacrOerr+S6uuWRmOezu+e7n+eKtuaAgei9rOWMluS4uiBSQ0NhbGxQbHVzUmVhc29uLk9USEVSX0NMSUVOVF9IQU5HVVBcbiAgICAgKi9cbiAgICBjb25zdCBjcnRVc2VyRGF0YSA9IGNsb3NlZFNlc3Npb24uZ2V0VXNlckxpc3QoKS5maW5kKChpdGVtKSA9PiBpdGVtLnVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCk7XG4gICAgbGV0IGhhbmd1cFJlYXNvbjtcbiAgICBpZiAoaXNTZWxmSGFuZ3VwICYmIGRhdGEudG9EZXZpY2VJZCAhPT0gdGhpcy5fc2lnbmFsTW9kdWxlLmdldFNlc3Npb25JZCgpKSB7XG4gICAgICBoYW5ndXBSZWFzb24gPSBjbG9zZWRTZXNzaW9uLmdldElzTG9jYWxDbGllbnRIYW5ndXAoKSA/IGNydFVzZXJEYXRhIS5zeXN0ZW1TdGF0ZSA6IFJDQ2FsbFBsdXNSZWFzb24uT1RIRVJfQ0xJRU5UX0hBTkdVUDtcbiAgICB9IGVsc2Uge1xuICAgICAgaGFuZ3VwUmVhc29uID0gY3J0VXNlckRhdGEhLnN5c3RlbVN0YXRlO1xuICAgIH1cblxuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uQ2FsbEVuZGVkKG5ldyBSQ0NhbGxQbHVzU2Vzc2lvbihjbG9zZWRTZXNzaW9uLCB0aGlzLCB0aGlzLl9sb2dnZXIpLCBoYW5ndXBSZWFzb24sIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fcmVwb3J0Q2FsbFBsdXNTdW1tYXJ5TWVzc2FnZShjbG9zZWRTZXNzaW9uLCBjYWxsSWQsIGhhbmd1cFJlYXNvbik7XG5cbiAgICAvLyBzZXNzaW9uIGNsb3NlIOWQjue7k+adn+aJgOaciei2heaXtuiuoeaXtuWZqFxuICAgIGlmICh0aGlzLl9tYWluU2Vzc2lvbiAmJiB0aGlzLl9tYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKSB7XG4gICAgICB0aGlzLl9tYWluU2Vzc2lvbi5nZXRBbGxUaW1lcklkcygpLmZvckVhY2goKHRpbWVySWQpID0+IHRoaXMuX3N0b3BUaW1lci5iaW5kKHRoaXMpKHRpbWVySWQsIHRyYWNlSWQpKTtcbiAgICAgIC8vIOe7k+adnyDkuIrmiqXnrKzkuIDluKdcbiAgICAgIGlmIChjbG9zZWRTZXNzaW9uLmdldENhbGxUeXBlKCkgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSkge1xuICAgICAgICB0aGlzLl9pc1VwRmlyc3RGcmFtZVRpbWUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLl9jYWxsU3RhcnRNYXBbY2FsbElkXTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZW1vdmVTZXNzaW9uKGNhbGxJZCk7XG4gIH1cblxuICAvKipcbiAgICog5LiK5oql5Zyo57q/6YCa6K+d57uT5p2f55qEIHN1bW1hcnkg5raI5oGvXG4gICAqL1xuICBwcml2YXRlIF9yZXBvcnRDYWxsUGx1c1N1bW1hcnlNZXNzYWdlKGNsb3NlZFNlc3Npb246IFJDQ2FsbElubmVyU2Vzc2lvbiwgY2FsbElkOiBzdHJpbmcsIGhhbmd1cFJlYXNvbjogUkNDYWxsUGx1c1JlYXNvbikge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpO1xuICAgIGNvbnN0IHJlbW90ZVVzZXJJZCA9IGNsb3NlZFNlc3Npb24uZ2V0VXNlckxpc3QoKS5maWx0ZXIoKHsgdXNlcklkIH0pID0+IHVzZXJJZCAhPT0gY3VycmVudFVzZXJJZClbMF0udXNlcklkO1xuICAgIGNvbnN0IGNhbGxlclVzZXJJZCA9IGNsb3NlZFNlc3Npb24uZ2V0U3RhcnRDYWxsZXJJZCgpO1xuICAgIGNvbnN0IGlzUmVwb3J0TWlzcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBtaXNzTWVzc2FnZU1hcC0ke2N1cnJlbnRVc2VySWR9LSR7Y2FsbElkfWApO1xuICAgIGlmICghaXNSZXBvcnRNaXNzKSB7XG4gICAgICBjb25zdCBjb250ZW50OiBJUkNDYWxsUGx1c1N1bW1hcnlNZXNzYWdlQ29udGVudCA9IHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBjYWxsZXJVc2VySWQsXG4gICAgICAgIHRhcmdldElkOiByZW1vdGVVc2VySWQsXG4gICAgICAgIG1lZGlhVHlwZTogY2xvc2VkU2Vzc2lvbi5nZXRNZWRpYVR5cGUoKSxcbiAgICAgICAgZmlyc3RGcmFtZVRpbWU6IHRoaXMuX2NhbGxTdGFydE1hcFtjYWxsSWRdLmZpcnN0RnJhbWVUaW1lIHx8IDAsXG4gICAgICAgIGNhbGxTdGFydFRpbWU6IHRoaXMuX2NhbGxTdGFydE1hcFtjYWxsSWRdLmNhbGxTdGFydFRpbWUgfHwgMCxcbiAgICAgICAgY2FsbEVuZFRpbWU6IHRoaXMuX2NhbGxTdGFydE1hcFtjYWxsSWRdLmNhbGxTdGFydFRpbWUgPyArbmV3IERhdGUoKSAtIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuZ2V0TG9jYWxEZWxheVRpbWUoKSA6IDAsXG4gICAgICAgIGhhbmd1cFJlYXNvbixcbiAgICAgIH07XG4gICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblJlY2VpdmVkQ2FsbFBsdXNTdW1tYXJ5TWVzc2FnZSh7XG4gICAgICAgIG1lc3NhZ2VUeXBlOiBNSVNTX01FU1NBR0VfTkFNRSxcbiAgICAgICAgY29udGVudDogSlNPTi5zdHJpbmdpZnkoY29udGVudCksXG4gICAgICAgIHNlbmRlclVzZXJJZDogY2FsbGVyVXNlcklkLFxuICAgICAgICB0YXJnZXRJZDogcmVtb3RlVXNlcklkLFxuICAgICAgICBjaGFubmVsSWQ6ICcnLFxuICAgICAgICBjb252ZXJzYXRpb25UeXBlOiBDb252ZXJzYXRpb25UeXBlLlBSSVZBVEUsXG4gICAgICAgIHNlbnRUaW1lOiArbmV3IERhdGUoKSAtIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuZ2V0TG9jYWxEZWxheVRpbWUoKSxcbiAgICAgICAgcmVjZWl2ZWRUaW1lOiArbmV3IERhdGUoKSAtIHRoaXMuX3RpbWVDb3JyZWN0aW9uZXIuZ2V0TG9jYWxEZWxheVRpbWUoKSxcbiAgICAgICAgbWVzc2FnZVVJZDogJycsXG4gICAgICAgIG1lc3NhZ2VEaXJlY3Rpb246IGNhbGxlclVzZXJJZCA9PT0gY3VycmVudFVzZXJJZCA/IE1lc3NhZ2VEaXJlY3Rpb24uU0VORCA6IE1lc3NhZ2VEaXJlY3Rpb24uUkVDRUlWRSxcbiAgICAgICAgaXNQZXJzaXRlZDogdHJ1ZSxcbiAgICAgICAgaXNDb3VudGVkOiBmYWxzZSxcbiAgICAgICAgaXNPZmZMaW5lTWVzc2FnZTogZmFsc2UsXG4gICAgICAgIGNhbkluY2x1ZGVFeHBhbnNpb246IGZhbHNlLFxuICAgICAgICByZWNlaXZlZFN0YXR1czogUmVjZWl2ZWRTdGF0dXMuUkVBRCxcbiAgICAgICAgaXNTdGF0dXNNZXNzYWdlOiBmYWxzZSxcbiAgICAgICAgaXNNZW50aW9uZWQ6IGZhbHNlLFxuICAgICAgICBleHBhbnNpb246IG51bGwsXG4gICAgICAgIGRpc2FibGVOb3RpZmljYXRpb246IGZhbHNlLFxuICAgICAgfSk7XG5cbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBtaXNzTWVzc2FnZU1hcC0ke2N1cnJlbnRVc2VySWR9LSR7Y2FsbElkfWAsIGNhbGxJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagueaNriBjYWxsSWQg56e76ZmkIHNlc3Npb25cbiAgICovXG4gIHByaXZhdGUgX3JlbW92ZVNlc3Npb24oY2FsbElkOiBzdHJpbmcpIHtcbiAgICBpZiAoY2FsbElkID09PSB0aGlzLl9tYWluU2Vzc2lvbj8uZ2V0Q2FsbElkKCkpIHtcbiAgICAgIHRoaXMuX21haW5TZXNzaW9uID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9ob2xkU2Vzc2lvbnMuZmluZEluZGV4KChzZXNzaW9uKSA9PiBzZXNzaW9uPy5nZXRDYWxsSWQoKSA9PT0gY2FsbElkKTtcbiAgICAgIHRoaXMuX2hvbGRTZXNzaW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDkuI3lrZjlnKggbWFpblNlc3Npb24g5pe277yM5LuO5pyN5Yqh56uv6I635Y+W5pWw5o2u55Sf5oiQIG1haW5TZXNzaW9uLCDlubbpgJrnn6XkurrlkZjnirbmgIHlj5jmm7RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2NyZWF0ZVNlc3Npb25CeVNlcnZlcihjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nLCBpc05lZWRVcDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0NSRUFURV9TRVNTSU9OX0JZX1NFUlZFUl9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuZ2V0Q2FsbFNlc3Npb24oeyBjYWxsSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTF9FTkdJTkVfQ1JFQVRFX1NFU1NJT05fQllfU0VSVkVSX1IsIGBlcnJjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX0NSRUFURV9TRVNTSU9OX0JZX1NFUlZFUl9SLCBgY29kZTogJHtjb2RlfSwgZGF0YTogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxUeXBlLCBtZWRpYVR5cGUsIGNhbGxTZXNzaW9uVXNlcnMsIHN0YXJ0Q2FsbGVySWQsXG4gICAgfSA9IGRhdGEhO1xuXG4gICAgLy8g55Sf5oiQ5Li7IHNlc3Npb25cbiAgICB0aGlzLl9tYWluU2Vzc2lvbiA9IG5ldyBSQ0NhbGxJbm5lclNlc3Npb24oXG4gICAgICBjYWxsSWQsXG4gICAgICBSQ0NhbGxQbHVzQ2FsbFN0YXRlLkNPTk5FQ1RJTkcsXG4gICAgICBjYWxsVHlwZSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIHN0YXJ0Q2FsbGVySWQsXG4gICAgICBzdGFydENhbGxlcklkLFxuICAgICAgW10sXG4gICAgICB0aGlzLl9sb2dnZXIsXG4gICAgKTtcbiAgICBpZiAoaXNOZWVkVXApIHtcbiAgICAgIHRoaXMuX2NsZWFyTW9iaWxlT25QaG9uZShjYWxsSWQsIHRyYWNlSWQpO1xuICAgIH1cbiAgICAvLyDkurrlkZjnirbmgIHlj5jmm7TpgJrnn6VcbiAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBjYWxsU2Vzc2lvblVzZXJzLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlhbzlrrnnp7vliqjnq68gb25QaG9uZSDml6Dms5XmtojpmaTpl67pophcbiAgICogQTEg56e75Yqo56uv5ZKMIEIg5q2j5ZyoIGNhbGwg5Lit77yM5LiUIG9uUGhvbmUg54q25oCB77yMIEExIOadgOi/m+eoi+WQju+8jEIg56uv5bGV56S655qEIG9uUGhvbmUg54q25oCB5peg5rOV5raI5aSxXG4gICAqIEEyIOWkmuerr+WcqOaOpeWQrOWSjOebtOaOpeWKoOWFpSBjYWxsIOaXtu+8jOS4iuaKpSBvblBob25lRW5kIOeKtuaAge+8jOa2iOmZpCBCIOerr+WxleekuueahCBvblBob25lIOeKtuaAgVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfY2xlYXJNb2JpbGVPblBob25lKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzZXNzaW9uID0gW3RoaXMuX21haW5TZXNzaW9uLCAuLi50aGlzLl9ob2xkU2Vzc2lvbnNdLmZpbmQoKGl0ZW0pID0+IGl0ZW0/LmdldENhbGxJZCgpID09PSBjYWxsSWQpO1xuICAgIGlmIChzZXNzaW9uICYmIHNlc3Npb24uZ2V0Q2FsbFR5cGUoKSA9PT0gUkNDYWxsUGx1c1R5cGUuTVVMVEkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUF9PTl9QSE9ORV9FTkRfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuc3lzdGVtU3RhdHVzVXAoe1xuICAgICAgICBjYWxsSWQsXG4gICAgICAgIHN5c1N0YXR1czogUkNDYWxsUGx1c1JlYXNvbi5PTl9QSE9ORV9FTkQsXG4gICAgICAgIGZvcndhcmQ6IEZvcndhcmRUeXBlLkNVUlJFTlQsXG4gICAgICB9LCB0cmFjZUlkKTtcblxuICAgICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExfRU5HSU5FX1VQX09OX1BIT05FX0VORF9SLCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMX0VOR0lORV9VUF9PTl9QSE9ORV9FTkRfUiwgYGNhbGxJZDogJHtjYWxsSWR9LCBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g5Y6fIGNsaWVudCDkuK3lrprkuYnnmoTkuovku7ZcbiAgcHJpdmF0ZSBfb25Vc2VyU3RhdGVDaGFuZ2UoY2FsbElkOiBzdHJpbmcsIHVzZXJzOiBJU2Vzc2lvblVzZXJbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgdXNlcnMuZm9yRWFjaCgodXNlcikgPT4ge1xuICAgICAgY29uc3QgeyB1c2VySWQsIHVzZXJTdGF0ZSwgc3lzdGVtU3RhdGUgfSA9IHVzZXI7XG4gICAgICBpZiAodXNlcklkID09PSBjdXJyZW50VXNlcklkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlVXNlclN0YXRlQ2hhbmdlZCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB1c2VyU3RhdGUsXG4gICAgICAgIHJlYXNvbjogc3lzdGVtU3RhdGUsXG4gICAgICB9LCB0cmFjZUlkKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIOaUtuWIsOiHquW3sSBzeXN0ZW1TdGF0ZSDkuLogOTk577yM55u05o6l56a75byA5oi/6Ze0XG4gICAgICog5aSE55CG6KKr5Y+r5o6l5ZCs55qE556s6Ze077yM5Li75Y+r5ZCM5pe25oyC5pat55qE5oOF5Ya177yM5LiN5o6J56a75byA5oi/6Ze06YCa6K+d5LiN5Lya57uT5p2fXG4gICAgICovXG4gICAgdXNlcnMuZm9yRWFjaCgoeyB1c2VySWQsIHN5c3RlbVN0YXRlIH0pID0+IHtcbiAgICAgIGlmICh1c2VySWQgPT09IGN1cnJlbnRVc2VySWQgJiYgc3lzdGVtU3RhdGUgPT09IFJDQ2FsbFBsdXNSZWFzb24uQUJOT1JNQUxfRU5EKSB7XG4gICAgICAgIHRoaXMuZW1pdChSQ0NhbGxFbmdpbmUuX19JTk5FUl9TRVNTSU9OX0NMT1NFX18sIGNhbGxJZCwgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vbk90aGVyTWVtYmVySW52aXRlKGluZm86IElPdGhlck1lbUluZm9bXSkge1xuICAgIGluZm8uZm9yRWFjaCgoaW5mbykgPT4ge1xuICAgICAgY29uc3QgeyB1c2VySWQsIGNhbGxJZCB9ID0gaW5mbztcbiAgICAgIGNvbnN0IGludml0ZXJVc2VySWQgPSB0aGlzLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0SW52aXRlclVzZXJJZCgpO1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVVc2VySW52aXRlZChbdXNlcklkXSwgaW52aXRlclVzZXJJZCEsIGNhbGxJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vblJlcXVlc3RDaGFuZ2VNZWRpYVR5cGUoaW5mbzogSUNoYW5nZU1lZGlhVHlwZUluZm8sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgdXNlcklkLCB0cmFuc2FjdGlvbklkLCBtZWRpYVR5cGUgfSA9IGluZm87XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlcXVlc3QodXNlcklkLCB0cmFuc2FjdGlvbklkLCBtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVjZWl2ZU1lZGlhVHlwZUNoYW5nZVJlc3VsdChpbmZvOiBJQ2hhbmdlTWVkaWFUeXBlSW5mbywgY29kZTogUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQuU0VSVkVSX0FMTE9XX01FRElBX1RZUEUpIHtcbiAgICAgIHRoaXMuZW1pdChSQ0NhbGxFbmdpbmUuX19JTk5FUl9DSEFOR0VfTUVESUFfVFlQRV9fLCBpbmZvLm1lZGlhVHlwZSwgdHJhY2VJZCk7XG4gICAgfVxuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXN1bHQoe1xuICAgICAgLi4uaW5mbyxcbiAgICAgIGNvZGUsXG4gICAgfSwgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkNhbGxUeXBlQ2hhbmdlKGNhbGxJZDogc3RyaW5nLCBjYWxsVHlwZTogUkNDYWxsUGx1c1R5cGUsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uQ2FsbFR5cGVDaGFuZ2VkKGNhbGxUeXBlLCBjYWxsSWQsIHRyYWNlSWQpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBSVENSZXNvdXJjZVRhZyB7XG4gIC8qKlxuICAgKiDmma7pgJrpn7Pop4bpopHmtYFcbiAgICovXG4gIE5PUk1BTCA9ICdSb25nQ2xvdWRSVEMnLFxuICAvKipcbiAgICog5bGP5bmV5YiG5Lqr5rWBXG4gICAqL1xuICBTQ1JFRU4gPSAnU2NyZWVuU2hhcmUnXG59XG4iLCJpbXBvcnQge1xuICBQbHVnaW5Db250ZXh0LCBJUnVudGltZSwgUlRDTW9kZSwgQmFzaWNMb2dnZXIsIEV2ZW50RW1pdHRlciwgaXNCb29sZWFuLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQge1xuICBSQ1JUQ1Jvb20sXG4gIFJDUlRDQ2xpZW50LFxuICBSQ1JUQ0NvZGUsXG4gIFJDTG9jYWxUcmFjayxcbiAgUkNSZW1vdGVUcmFjayxcbiAgUkNMb2NhbEF1ZGlvVHJhY2ssXG4gIElTdWJzY3JpYmVBdHRyLFxuICBSQ1JlbW90ZVZpZGVvVHJhY2ssXG4gIFJDUmVtb3RlQXVkaW9UcmFjayxcbiAgUkNLaWNrUmVhc29uLFxuICBSQ1RyYWNrLFxuICBSQ0xvY2FsVmlkZW9UcmFjayxcbiAgSVB1Ymxpc2hBdHRycyxcbiAgSVJDUlRDU3RhdGVSZXBvcnQsXG4gIGhlbHBlcixcbn0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcbmltcG9ydCB7XG4gIElBdWRpb0NvbmZpZyxcbiAgSUNhbGxQbHVzSW5pdE9wdHMsXG4gIElTdGF0dXNSZXBvcnRMaXN0ZW5lcixcbiAgSVZpZGVvQ29uZmlnLFxuICBSQ0NhbGxQbHVzQ29kZSxcbiAgUkNDYWxsUGx1c0ZyYW1lUmF0ZSxcbiAgUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgUkNDYWxsUGx1c1BhY2tldExvc3NTdGF0cyxcbiAgUkNDYWxsUGx1c1Jlc29sdXRpb24sXG59IGZyb20gJy4uL2FwaS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUlRDUmVzb3VyY2VUYWcgfSBmcm9tICcuLi9lbnVtcy9SVENSZXNvdXJjZVRhZyc7XG5pbXBvcnQgeyByZXRyeUFzeW5jRm4gfSBmcm9tICcuLi91dGlscy9yZXRyeSc7XG5pbXBvcnQgeyBDYWxsSG9va3NUeXBlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JQ2FsbEhvb2tzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNSZWFzb24gfSBmcm9tICcuLi9hcGkvZW51bXMvUkNDYWxsUGx1c1JlYXNvbic7XG5pbXBvcnQgeyBSQ0NhbGxLaWNrRXh0cmEgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lSVENNb2R1bGUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4uL2FwaS9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7IElNZWRpYU11dGVDaGFuZ2VJbmZvLCBJTWVtYmVySW5mbyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSVJDQ2FsbENsaWVudCc7XG5pbXBvcnQgeyBSQ0NhbGxFbmdpbmUgfSBmcm9tICcuLi9SQ0NhbGxFbmdpbmUnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSB9IGZyb20gJy4vUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSc7XG5pbXBvcnQgeyBnZXRVc2VyVmlkZW9WaWV3SW5mbyB9IGZyb20gJy4uL3V0aWxzL2hlbHBlcic7XG5cbmludGVyZmFjZSBJSm9pblJUQ1Jvb21SZXMge1xuICBjb2RlOiBSQ1JUQ0NvZGU7XG4gIHJvb206IFJDUlRDUm9vbSB8IHVuZGVmaW5lZDtcbiAgdXNlcklkczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSB8IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIElTdWJSZXMge1xuICBjb2RlOiBSQ1JUQ0NvZGU7XG4gIGZhaWxlZExpc3Q6IChJU3Vic2NyaWJlQXR0cilbXSB8IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIElQdWJSZXMge1xuICBjb2RlOiBSQ1JUQ0NvZGU7XG4gIGxpdmVVcmw6IHN0cmluZyB8IHVuZGVmaW5lZFxufVxuXG5pbnRlcmZhY2UgUkNLaWNrRXh0cmEge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBSVENNb2R1bGUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBzdGF0aWMgX19JTk5FUl9SVENfUFJPQ0VTU19GQUlMRURfXzogc3RyaW5nID0gJ2lubmVyLXJ0Yy1wcm9jZXNzLWZhaWxlZCdcblxuICBzdGF0aWMgX19JTk5FUl9SVENfUEVFUkNPTk5FQ1RJT05fQUJOT1JNQUxfQ0xPU0VfXzogc3RyaW5nID0gJ2lubmVyLXJ0Yy1wZWVyY29ubmVjdGlvbi1hYm5vcm1hbC1jbG9zZSdcblxuICBzdGF0aWMgX19JTk5FUl9PTl9TRUxGX0pPSU5FRF9fOiBzdHJpbmcgPSAnaW5uZXItb24tc2VsZi1qb2luZWQnXG5cbiAgc3RhdGljIF9fSU5ORVJfT05fT1RIRVJfSk9JTkVEX186IHN0cmluZyA9ICdpbm5lci1vbi1vdGhlci1qb2luZWQnXG5cbiAgc3RhdGljIF9fSU5ORVJfUkVDRUlWRV9GSVJTVF9GUkFNRV9fOiBzdHJpbmcgPSAnaW5uZXItcmVjZWl2ZS1maXJzdC1mcmFtZSdcblxuICBzdGF0aWMgX19JTk5FUl9PTl9LSUNLT0ZGX186IHN0cmluZyA9ICdpbm5lci1raWNrb2ZmLWZyYW1lJ1xuXG4gIHN0YXRpYyBfX0lOTkVSX09OX0RFVklDRV9FTkFCTEVfQ0hBTkdFX186IHN0cmluZyA9ICdpbm5lci1vbi1kZXZpY2UtZW5hYmxlLWNoYW5nZSdcblxuICAvKipcbiAgICogUkNSVEMg5a6e5L6LXG4gICAqL1xuICBwdWJsaWMgX3J0Y0NsaWVudDogUkNSVENDbGllbnRcblxuICAvKipcbiAgICog5bex5pa555qE6Z+z6KeG6aKRIHRyYWNrc1xuICAgKi9cbiAgcHJpdmF0ZSBfbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW11cblxuICAvKipcbiAgICogUkNSVENSb29tIOWunuS+i1xuICAgKi9cbiAgcHVibGljIF9yb29tOiBSQ1JUQ1Jvb20gfCBudWxsID0gbnVsbFxuXG4gIHByaXZhdGUgX2NhbGxJZDogc3RyaW5nID0gJydcblxuICBwcml2YXRlIF9jYWxsTWVkaWFUeXBlITogUkNDYWxsUGx1c01lZGlhVHlwZVxuXG4gIHByaXZhdGUgX3ZpZGVvQ29uZmlnOiBJVmlkZW9Db25maWcgPSB7XG4gICAgcmVzb2x1dGlvbjogUkNDYWxsUGx1c1Jlc29sdXRpb24uVzY0MF9INDgwLFxuICAgIGZyYW1lUmF0ZTogUkNDYWxsUGx1c0ZyYW1lUmF0ZS5GUFNfMTUsXG4gIH1cblxuICBwcml2YXRlIF9hdWRpb0NvbmZpZzogSUF1ZGlvQ29uZmlnID0ge31cblxuICBwcml2YXRlIF9pc1B1YlRpbnk6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDop4bpopHphY3nva7mmK/lkKblj5jmm7RcbiAgICovXG4gIHByaXZhdGUgX3ZpZGVvQ29uZmlnSXNDaGFuZ2U6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDpn7PpopHphY3nva7mmK/lkKblj5jmm7RcbiAgICovXG4gIHByaXZhdGUgX2F1ZGlvQ29uZmlnSXNDaGFuZ2U6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDlrZjlgqjorr7nva7nmoTkurrlkZjlkozop4blm75cbiAgICovXG4gIHByaXZhdGUgX3VzZXJWaWV3TWFwOiB7IFt1c2VySWQ6IHN0cmluZ106IHsgdmlkZW9WaWV3OiBIVE1MVmlkZW9FbGVtZW50LCBpc1Rpbnk6IGJvb2xlYW4gfSB9ID0ge31cblxuICBwcml2YXRlIF9jYWxsUGx1c1N0YXR1c1JlcG9ydExpc3RlbmVyOiBJU3RhdHVzUmVwb3J0TGlzdGVuZXIgfCBudWxsID0gbnVsbFxuXG4gIHByaXZhdGUgX3JlbW90ZUF1ZGlvRW5hYmxlOiBib29sZWFuID0gdHJ1ZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcnVudGltZTogSVJ1bnRpbWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5pdE9wdHM6IElDYWxsUGx1c0luaXRPcHRzLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2FsbEVuZ2luZTogUkNDYWxsRW5naW5lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlcG9ydEFwcEV2ZW50TW9kdWxlOiBSQ0NhbGxQbHVzUmVwb3J0TW9kdWxlLFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3J0Y0NsaWVudCA9IF9pbml0T3B0cz8ucnRjQ2xpZW50O1xuICAgIHRoaXMuX2lzUHViVGlueSA9IF9pbml0T3B0cy5pc1B1YlRpbnkgfHwgZmFsc2U7XG4gIH1cblxuICBzZXRDYWxsUGx1c1N0YXR1c1JlcG9ydExpc3RlbmVyKGxpc3RlbmVyOiBJU3RhdHVzUmVwb3J0TGlzdGVuZXIpIHtcbiAgICB0aGlzLl9jYWxsUGx1c1N0YXR1c1JlcG9ydExpc3RlbmVyID0gbGlzdGVuZXI7XG4gIH1cblxuICAvKipcbiAgICog5Y+W5pGE5YOP5aS06LWE5rqQXG4gICAqIOWGheWtmOS4reacieaXtu+8jOi/lOWbnuWGheWtmOS4reeahOinhui9qFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENhbWVyYVZpZGVvVHJhY2sodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCB0cmFjaz86IFJDTG9jYWxUcmFja30+IHtcbiAgICBjb25zdCBkZWZhdWx0VmlkZW9UcmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gKGRlZmF1bHRWaWRlb1RyYWNrICYmICF0aGlzLl92aWRlb0NvbmZpZ0lzQ2hhbmdlKSA/IHsgdHJhY2s6IGRlZmF1bHRWaWRlb1RyYWNrLCBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH0gOiBhd2FpdCB0aGlzLl9jcmVhdGVWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgIHRoaXMuX3ZpZGVvQ29uZmlnSXNDaGFuZ2UgPSBmYWxzZTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIHRyYWNrLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5Y+W6bqm5YWL6aOO6LWE5rqQXG4gICAqIOWGheWtmOS4reacieaXtu+8jOi/lOWbnuWGheWtmOS4reeahOmfs+i9qFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldE1pY3JvcGhvbmVBdWRpb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8e2NvZGU6IG51bWJlciwgdHJhY2s/OiBSQ0xvY2FsVHJhY2t9PiB7XG4gICAgY29uc3QgZGVmYXVsdEF1ZGlvVHJhY2sgPSB0aGlzLmdldExvY2FsQXVkaW9UcmFjaygpO1xuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IChkZWZhdWx0QXVkaW9UcmFjayAmJiAhdGhpcy5fYXVkaW9Db25maWdJc0NoYW5nZSkgPyB7IHRyYWNrOiBkZWZhdWx0QXVkaW9UcmFjaywgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9IDogYXdhaXQgdGhpcy5fY3JlYXRlQXVkaW9UcmFjayh0cmFjZUlkKTtcbiAgICB0aGlzLl9hdWRpb0NvbmZpZ0lzQ2hhbmdlID0gZmFsc2U7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIHRyYWNrLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u6YCa6K+d57G75Z6L5Yib5bu66Z+z44CB6KeG6aKR6LWE5rqQXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUg6Z+z6aKR5oiW6Z+z6KeG6aKRXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlQ2FsbE1lZGlhVHJhY2tzKG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2NhbGxNZWRpYVR5cGUgPSBtZWRpYVR5cGU7XG4gICAgY29uc3QgeyBjb2RlOiBnZXRBdWRpb0NvZGUgfSA9IGF3YWl0IHRoaXMuZ2V0TWljcm9waG9uZUF1ZGlvVHJhY2sodHJhY2VJZCk7XG4gICAgaWYgKGdldEF1ZGlvQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgcmV0dXJuIHsgY29kZTogZ2V0QXVkaW9Db2RlIH07XG4gICAgfVxuXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJT19WSURFTykge1xuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLmdldENhbWVyYVZpZGVvVHJhY2sodHJhY2VJZCk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICAvLyByZXR1cm4geyBjb2RlIH07XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9DQUxMX01FRElBX1RSQUNLU19QLCBgZ2V0IGNhbWVyYSB2aWRlbyB0cmFjayBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgcHVibGljIHNldFZpZGVvQ29uZmlnKHZpZGVvQ29uZmlnOiBJVmlkZW9Db25maWcpIHtcbiAgICB0aGlzLl92aWRlb0NvbmZpZ0lzQ2hhbmdlID0gdHJ1ZTtcbiAgICB0aGlzLl92aWRlb0NvbmZpZyA9IHZpZGVvQ29uZmlnO1xuICB9XG5cbiAgcHVibGljIHNldEF1ZGlvQ29uZmlnKGF1ZGlvQ29uZmlnOiBJQXVkaW9Db25maWcpIHtcbiAgICB0aGlzLl9hdWRpb0NvbmZpZ0lzQ2hhbmdlID0gdHJ1ZTtcbiAgICB0aGlzLl9hdWRpb0NvbmZpZyA9IGF1ZGlvQ29uZmlnO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3lBbGxUcmFja3ModHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfREVTVFJPWV9BTExfVFJBQ0tTX08sICcnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9sb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgdHJhY2suZGVzdHJveSgpO1xuICAgIH0pO1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzLmxlbmd0aCA9IDA7XG4gIH1cblxuICBwdWJsaWMgc2V0QWxsUmVtb3RlQXVkaW9FbmFibGUoZW5hYmxlOiBib29sZWFuLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVRfQUxMX1JFTU9URV9BVURJT19FTkFCTEVfVCwgYGVuYWJsZTogJHtlbmFibGV9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIWlzQm9vbGVhbihlbmFibGUpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VUX0FMTF9SRU1PVEVfQVVESU9fRU5BQkxFX1IsIGBwYXJhbSBlcnJvciwgZW5hYmxlOiB0eXBlIGlzIGJvb2xlYW4sIHZhbHVlOiAke2VuYWJsZX1gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdGhpcy5fcmVtb3RlQXVkaW9FbmFibGUgPSBlbmFibGU7XG5cbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCBhdWRpb1RyYWNrcyA9IHRoaXMuX3Jvb20uZ2V0UmVtb3RlVHJhY2tzKCkuZmlsdGVyKCh0cmFjaykgPT4gdHJhY2suaXNBdWRpb1RyYWNrKCkpO1xuICAgIGF1ZGlvVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBpZiAoZW5hYmxlKSB7XG4gICAgICAgIHRyYWNrLnVubXV0ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhY2subXV0ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VUX0FMTF9SRU1PVEVfQVVESU9fRU5BQkxFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlc3Ryb3lUcmFjayh0cmFjazogUkNMb2NhbFRyYWNrKSB7XG4gICAgdHJhY2suZGVzdHJveSgpO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fbG9jYWxUcmFja3MuZmluZEluZGV4KChsb2NhbFRyYWNrKSA9PiBsb2NhbFRyYWNrLmdldFRyYWNrSWQoKSA9PT0gdHJhY2suZ2V0VHJhY2tJZCgpKTtcbiAgICB0aGlzLl9sb2NhbFRyYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNlc3Npb24g6L+e5o6lXG4gICAqL1xuICBhc3luYyBzZXNzaW9uQ29ubmVjdGVkKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG4gICAgLy8gMS4g5Yqg5oi/6Ze0XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICBjb25zdCB7IGNvZGUsIHJvb20gfSA9IGF3YWl0IHRoaXMuam9pblJUQ1Jvb20oY2FsbElkLCB0cmFjZUlkKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcm9vbSA9IHJvb20hO1xuICAgIH1cblxuICAgIC8vIOazqOWGjCBSVEMg55u45YWz55uR5ZCsXG4gICAgdGhpcy5fY2FsbElkID0gY2FsbElkO1xuICAgIHRoaXMuX3JlZ1JUQ0xpc3RlbmVycygpO1xuXG4gICAgY29uc3Qgcm9vbVVzZXJzSWQgPSB0aGlzLl9yb29tPy5nZXRSZW1vdGVVc2VySWRzKCkgfHwgW107XG4gICAgaWYgKHJvb21Vc2Vyc0lkLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX29uT3RoZXJNZW1Kb2luZWQocm9vbVVzZXJzSWQubWFwKCh1c2VySWQpID0+ICh7IGNhbGxJZCwgdXNlcklkIH0pKSwgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgLy8gMi4g5Y+R5biD5rWBXG4gICAgaWYgKHRoaXMuX2xvY2FsVHJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZW1pdChDYWxsSG9va3NUeXBlLm9uQmVmb3JlUHVibGlzaCk7XG4gICAgICBjb25zdCBwdWJQYXJhbXMgPSB0aGlzLl9pc1B1YlRpbnlcbiAgICAgICAgPyB0aGlzLl9sb2NhbFRyYWNrcy5tYXAoKHRyYWNrKSA9PiAodHJhY2suaXNWaWRlb1RyYWNrKCkgPyB7IHRyYWNrLCBpc1B1YlRpbnk6IHRydWUgfSA6IHRyYWNrKSlcbiAgICAgICAgOiB0aGlzLl9sb2NhbFRyYWNrcztcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5wdWJsaXNoKHB1YlBhcmFtcywgdHJhY2VJZCk7XG4gICAgICB0aGlzLmVtaXQoQ2FsbEhvb2tzVHlwZS5vblB1Ymxpc2hSZXMsIGNvZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NPTk5FQ1RfUCwgJ3Nlc3Npb25Db25uZWN0ZWQgbG9jYWwgdHJhY2tzIGlzIGVtcHR5JywgdHJhY2VJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DT05ORUNUX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNVQ0NFU1N9YCwgdHJhY2VJZCk7XG4gIH1cblxuICBhc3luYyBzZXNzaW9uQ2xvc2UoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NFU1NJT05fQ0xPU0VfVCwgYGNhbGxJZDogJHtjYWxsSWR9YCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDplIDmr4HmnKznq6/otYTmupBcbiAgICAgKi9cbiAgICB0aGlzLmRlc3Ryb3lBbGxUcmFja3ModHJhY2VJZCk7XG5cbiAgICBjb25zdCBjdXJyZW50Um9vbUlkID0gdGhpcy5fcm9vbT8uZ2V0Um9vbUlkKCk7XG4gICAgaWYgKHRoaXMuX3Jvb20gJiYgY2FsbElkID09PSBjdXJyZW50Um9vbUlkKSB7XG4gICAgICAvLyDpgIDlh7rmiL/pl7RcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmxlYXZlUm9vbSh0aGlzLl9yb29tKTtcbiAgICAgIC8vIOazqOmUgOWGheWtmOaVsOaNrlxuICAgICAgdGhpcy5fcmVsZWFzZVN0b3JlZERhdGEoKTtcbiAgICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU0VTU0lPTl9DTE9TRV9SLCBgbGVhdmVSb29tIGZhaWxlZCwgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IsICdsZWF2ZVJvb20gc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sb2dnZXIud2FybihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVNTSU9OX0NMT1NFX1IsICdsZWF2ZVJvb20gdGhyb3cgZXhjZXB0aW9uOiBub3QgaW4gcm9vbScsIHRyYWNlSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjop4bpopEgdHJhY2tcbiAgICovXG4gIGFzeW5jIGRpc2FibGVWaWRlb1RyYWNrKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfCBSQ1JUQ0NvZGUsIHRyYWNrPzogUkNMb2NhbFRyYWNrfT4ge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5DQU1FUkFfQ0xPU0VEIH07XG4gICAgfVxuXG4gICAgLy8g56aB55So6KeG6aKRXG4gICAgY29uc3QgY29kZSA9IGF3YWl0IHRyYWNrLm11dGUoKTtcblxuICAgIHJldHVybiB7IGNvZGUsIHRyYWNrIH07XG4gIH1cblxuICAvKipcbiAgICog5ZCv55So6KeG6aKRdHJhY2tcbiAgICogMS4g5ZCv55So5YmN5bqU55So5bGC6ZyA5YWI5Yib5bu66KeG6aKRIHRyYWNrXG4gICAqL1xuICBhc3luYyBlbmFibGVWaWRlb1RyYWNrKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfCBSQ1JUQ0NvZGV9PiB7XG4gICAgLy8g6I635Y+W5pys56uv6KeG6aKRIHRyYWNrXG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpO1xuICAgIGlmICghdHJhY2spIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLkNBTUVSQV9DTE9TRUQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlpoLmnpzotYTmupDmsqHooqvnpoHnlKjvvIzov5Tlm57miJDlip9cbiAgICAgKi9cbiAgICBpZiAoIXRyYWNrLmlzT3duZXJNdXRlZCgpKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5ZCv55So6LWE5rqQXG4gICAgICovXG4gICAgY29uc3QgY29kZSA9IGF3YWl0IHRyYWNrLnVubXV0ZSgpO1xuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3liIfmjaLop4bpopHorr7lpIdcbiAgICovXG4gIGFzeW5jIGNoYW5nZVZpZGVvRGV2aWNlKHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbFRyYWNrIH0+IHtcbiAgICAvLyDmlrDorr7lpIfnmoTovahcbiAgICBjb25zdCByZWNlbnRUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG4gICAgLy8g5pW055CG5ZCO55qE6L2oXG4gICAgY29uc3QgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICBjb25zdCB7IGNvZGUsIHRyYWNrIH0gPSBhd2FpdCB0aGlzLl9ydGNDbGllbnQuY3JlYXRlQ2FtZXJhVmlkZW9UcmFjayhSVENSZXNvdXJjZVRhZy5OT1JNQUwsIHRoaXMuX3ZpZGVvQ29uZmlnKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG1pbkJpdHJhdGUsIG1heEJpdHJhdGUgfSA9IHRoaXMuX3ZpZGVvQ29uZmlnO1xuICAgIChtaW5CaXRyYXRlIHx8IG1heEJpdHJhdGUpICYmIHRyYWNrIS5zZXRCaXRyYXRlKG1heEJpdHJhdGUhLCBtaW5CaXRyYXRlISk7XG5cbiAgICBsZXQgbmVlZERlc3Ryb3lUcmFjazogUkNMb2NhbFRyYWNrO1xuICAgIHRoaXMuX2xvY2FsVHJhY2tzICYmIHRoaXMuX2xvY2FsVHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBpZiAodHJhY2suaXNWaWRlb1RyYWNrKCkpIHtcbiAgICAgICAgLy8g6LWE5rqQ6YeK5pS+XG4gICAgICAgIHRyYWNrLmRlc3Ryb3koKTtcbiAgICAgICAgbmVlZERlc3Ryb3lUcmFjayA9IHRyYWNrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDku47mnKzlnLDnvJPlrZjkuK3liKDpmaTplIDmr4HnmoQgdHJhY2tcbiAgICB0aGlzLl9sb2NhbFRyYWNrcyA9IHRoaXMuX2xvY2FsVHJhY2tzLmZpbHRlcigoaXRlbSkgPT4gbmVlZERlc3Ryb3lUcmFjayAmJiAoaXRlbS5nZXRUcmFja0lkKCkgIT09IG5lZWREZXN0cm95VHJhY2suZ2V0VHJhY2tJZCgpKSk7XG5cbiAgICByZWNlbnRUcmFja3MucHVzaCh0cmFjayEpO1xuXG4gICAgLy8g57uZ5pys5Zyw5Yqg5LiK5paw5Lqn55Sf55qE6KeG6aKRXG4gICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuXG4gICAgdGhpcy5fbG9jYWxUcmFja3MgPSBsb2NhbFRyYWNrcztcblxuICAgIC8vIOmAmuefpeS4iuWxgiB0cmFja1JlYWR5XG4gICAgdGhpcy5fb25Mb2NhbFRyYWNrUmVhZHkocmVjZW50VHJhY2tzLCB0cmFjZUlkKTtcblxuICAgIC8vIOW3suWKoOWFpeaIv+mXtFxuICAgIGlmICh0aGlzLl9yb29tKSB7XG4gICAgICAvLyDlj5HluIPmtYFcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKHJlY2VudFRyYWNrcyk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHRyYWNrIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit5pu05o2i6Z+z6aKR6K6+5aSHXG4gICAqL1xuICBhc3luYyBjaGFuZ2VBdWRpb0RldmljZSh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICAvLyDmlrDorr7lpIfnmoTovahcbiAgICBjb25zdCByZWNlbnRUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG4gICAgLy8g5pW055CG5ZCO5pys5Zyw6L2oXG4gICAgY29uc3QgbG9jYWxUcmFja3M6IFJDTG9jYWxUcmFja1tdID0gW107XG5cbiAgICBjb25zdCBhdWRpb0NvbmZpZyA9IHsgLi4udGhpcy5fYXVkaW9Db25maWcsIG1pY3Bob25lSWQ6IHRoaXMuX2F1ZGlvQ29uZmlnLm1pY3JvcGhvbmVJZCB9O1xuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQXVkaW9UcmFjayhSVENSZXNvdXJjZVRhZy5OT1JNQUwsIGF1ZGlvQ29uZmlnKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2NhbFRyYWNrcyAmJiB0aGlzLl9sb2NhbFRyYWNrcy5mb3JFYWNoKCh0cmFjazogUkNMb2NhbFRyYWNrKSA9PiB7XG4gICAgICBpZiAodHJhY2suaXNBdWRpb1RyYWNrKCkpIHtcbiAgICAgICAgLy8g5LmL5YmN55qE6Z+z6aKR6YO96ZSA5q+B77yM77yIUlRDTGliIFNES+WGhemDqOS8muWcqCBhZGRMb2NhbFRyYWNrIOa4heeQhuWQjOexu+Wei+i9qOmBk+aVsOaNru+8jOaJgOS7pei/memHjOazqOmHiuaOie+8iVxuICAgICAgICAvLyB0cmFjay5kZXN0cm95KClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAvLyDlj6rmiorkuYvliY3nmoTop4bpopHnlZnkuItcbiAgICAgICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWNlbnRUcmFja3MucHVzaCh0cmFjayEpO1xuXG4gICAgLy8g5Yqg5LiK5pys5Zyw5paw5Lqn55Sf55qE6Z+z6aKRXG4gICAgbG9jYWxUcmFja3MucHVzaCh0cmFjayEpO1xuXG4gICAgdGhpcy5fbG9jYWxUcmFja3MgPSBsb2NhbFRyYWNrcztcblxuICAgIC8vIOmAmuefpeS4iuWxgiB0cmFja1JlYWR5XG4gICAgdGhpcy5fb25Mb2NhbFRyYWNrUmVhZHkocmVjZW50VHJhY2tzLCB0cmFjZUlkKTtcblxuICAgIC8vIOW3suWKoOWFpeaIv+mXtO+8jOWPkeW4g+aWsOa1gVxuICAgIGlmICh0aGlzLl9yb29tKSB7XG4gICAgICAvLyDlj5HluIPmlrDmtYFcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcm9vbS5wdWJsaXNoKHJlY2VudFRyYWNrcyk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnpoHnlKjpn7PpopEgdHJhY2tcbiAgICovXG4gIGFzeW5jIGRpc2FibGVBdWRpb1RyYWNrKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfCBSQ1JUQ0NvZGUsIHRyYWNrPzogUkNMb2NhbFRyYWNrfT4ge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5nZXRMb2NhbEF1ZGlvVHJhY2soKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5NSUNST1BIT05FX0NMT1NFRCB9O1xuICAgIH1cblxuICAgIC8vIOemgeeUqOmfs+mikVxuICAgIGNvbnN0IGNvZGUgPSBhd2FpdCB0cmFjay5tdXRlKCk7XG5cbiAgICByZXR1cm4geyBjb2RlLCB0cmFjayB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWqkuS9k+exu+Wei+WNh+OAgemZjVxuICAgKi9cbiAgYXN5bmMgY2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfVCwgYG1lZGlhVHlwZTogJHttZWRpYVR5cGV9YCwgdHJhY2VJZCk7XG5cbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU9fVklERU8pIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX3VwZ3JhZGVNZWRpYVR5cGUodHJhY2VJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX2Rvd25ncmFkZU1lZGlhVHlwZSh0cmFjZUlkKTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LmNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWNh+e6pyDpn7PpopEgLT4g6Z+z6KeG6aKRXG4gICAqIDEuIOS4muWKoeWxgumcgOimgeWFiOmAmui/hyBjcmVhdGVMb2NhbFRyYWNrcyDliJvlu7rmnKzlnLDop4bpopEgdHJhY2tcbiAgICogMi4gU0RLIOWPquWkhOeQhuWPkeW4g+inhumikSB0cmFja1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfdXBncmFkZU1lZGlhVHlwZSh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICAvLyAxLiDojrflj5bnvJPlrZjkuK3nmoTop4bpopEgdHJhY2tcbiAgICBsZXQgdHJhY2sgPSB0aGlzLmdldExvY2FsVmlkZW9UcmFjaygpO1xuICAgIGlmICghdHJhY2spIHtcbiAgICAgIGNvbnN0IHsgY29kZSwgdHJhY2s6IG5ld1RyYWNrIH0gPSBhd2FpdCB0aGlzLl9jcmVhdGVWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBjcmVhdGUgdmlkZW8gdHJhY2sgZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG4gICAgICB0cmFjayA9IG5ld1RyYWNrO1xuICAgICAgY29uc3QgeyBtaW5CaXRyYXRlLCBtYXhCaXRyYXRlIH0gPSB0aGlzLl92aWRlb0NvbmZpZztcbiAgICAgIChtaW5CaXRyYXRlIHx8IG1heEJpdHJhdGUpICYmIHRyYWNrIS5zZXRCaXRyYXRlKG1heEJpdHJhdGUhLCBtaW5CaXRyYXRlISk7XG4gICAgfVxuICAgIC8vIDIuIOWPkeW4g+a1gVxuICAgIGNvbnN0IHB1YlBhcmFtcyA9IHRoaXMuX2lzUHViVGlueSA/IHsgdHJhY2s6IHRyYWNrISwgaXNQdWJUaW55OiB0cnVlIH0gOiB0cmFjayE7XG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLnB1Ymxpc2goW3B1YlBhcmFtc10sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHB1Ymxpc2ggZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpmY3nuqflpITnkIZcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2Rvd25ncmFkZU1lZGlhVHlwZSh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICAvLyAxLiDojrflj5bmnKzlnLDop4bpopEgdHJhY2tcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG5cbiAgICBpZiAodHJhY2spIHtcbiAgICAgIC8vIOWPlua2iOWPkeW4g+inhumikVxuICAgICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9yb29tIS51bnB1Ymxpc2goW3RyYWNrXSk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NIQU5HRV9NRURJQV9UWVBFX1IsIGB1bnB1Ymxpc2ggZXJyQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgICB9XG5cbiAgICAgIC8vIOmHiuaUvuinhumikSB0cmFja1xuICAgICAgdGhpcy5kZXN0cm95VHJhY2sodHJhY2spO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliqDlhaUgUlRDIOaIv+mXtFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGpvaW5SVENSb29tKGNhbGxJZDogc3RyaW5nLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCByb29tPzogUkNSVENSb29tLCB0cmFja3M/OiBSQ1JlbW90ZVRyYWNrW10gfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0pPSU5fUlRDX1JPT01fVCwgYGNhbGw6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgIGNvbnN0IHsgY29kZSwgcm9vbSwgdHJhY2tzIH0gPSBhd2FpdCByZXRyeUFzeW5jRm4gPElKb2luUlRDUm9vbVJlcz4oe1xuICAgICAgYXN5bmNGbjogdGhpcy5fcnRjQ2xpZW50LmpvaW5SVENSb29tLmJpbmQodGhpcy5fcnRjQ2xpZW50KSxcbiAgICAgIGZuQXJnczogW2NhbGxJZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGZhbHNlLCBSVENNb2RlLkNBTExdLFxuICAgIH0pO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0pPSU5fUlRDX1JPT01fUiwgYGNhbGxJZDogJHtjYWxsSWR9LCBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9vblJUQ01ldGhvZEZhaWwoUkNDYWxsUGx1c1JlYXNvbi5KT0lOX1JPT01fRVJSLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9KT0lOX1JUQ19ST09NX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgdGhpcy5fcm9vbSA9IHJvb20hO1xuICAgIHRoaXMuX29uU2VsZkpvaW5lZCh7IGNhbGxJZCwgdXNlcklkOiB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpIH0sIHRyYWNlSWQpO1xuICAgIHRyYWNrcz8ubGVuZ3RoICYmIHRoaXMuX29uUmVtb3RlVHJhY2tQdWJsaXNoKHRyYWNrcyk7XG5cbiAgICB0aGlzLl9jYWxsSWQgPSBjYWxsSWQ7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgcm9vbSwgdHJhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICogUlRDIOiuoumYhVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN1YnNjcmliZVRyYWNrcyh0cmFja3M6IChJU3Vic2NyaWJlQXR0cilbXSwgdHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfU1VCU0NSSUJFX1QsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHBhcmFtczogdHJhY2tzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCB7IHRyYWNrLCBzdWJUaW55IH0gPSBpdGVtO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRyYWNrSWQ6IHRyYWNrLmdldFRyYWNrSWQoKSxcbiAgICAgICAgICBzdWJUaW55LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCByZXRyeUFzeW5jRm4gPElTdWJSZXM+KHtcbiAgICAgIGFzeW5jRm46IHRoaXMuX3Jvb20uc3Vic2NyaWJlLmJpbmQodGhpcy5fcm9vbSksXG4gICAgICBmbkFyZ3M6IFt0cmFja3NdLFxuICAgICAgb25FcnJvcjogKGNvZGUpID0+IHt9LFxuICAgIH0pO1xuICAgIGlmIChjb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25GZXRjaFJlbW90ZU1lZGlhRXJyb3IodHJhY2tzLCBjb2RlKTtcblxuICAgICAgdGhpcy5fb25SVENNZXRob2RGYWlsKFJDQ2FsbFBsdXNSZWFzb24uU1VCU0NSSUJFX0VSUiwgdHJhY2VJZCk7XG5cbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TVUJTQ1JJQkVfUiwgYGVycm9yQ29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1NVQlNDUklCRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSVEMg5Y+W5raI6K6i6ZiFXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5zdWJzY3JpYmVUcmFja3ModHJhY2tzOiBSQ1JlbW90ZVRyYWNrW10sIHRyYWNlSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1VOU1VCU0NSSUJFX1QsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHRyYWNrSWRzOiB0cmFja3MubWFwKCh0cmFjaykgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIXRoaXMuX3Jvb20pIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3Jvb20udW5zdWJzY3JpYmUodHJhY2tzKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9VTlNVQlNDUklCRV9SLCBgZXJyb3JDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfVU5TVUJTQ1JJQkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICBwcml2YXRlIF9yZWxlYXNlU3RvcmVkRGF0YSgpIHtcbiAgICB0aGlzLl9yb29tID0gbnVsbDtcbiAgICB0aGlzLl9yZW1vdGVBdWRpb0VuYWJsZSA9IHRydWU7XG4gICAgdGhpcy5fdXNlclZpZXdNYXAgPSB7fTtcbiAgfVxuXG4gIGdldFJlbW90ZVRyYWNrcygpOiB7IFt1c2VySWQ6IHN0cmluZ106IFJDUmVtb3RlVHJhY2tbXX0ge1xuICAgIGNvbnN0IHRyYWNrczogeyBbdXNlcklkOiBzdHJpbmddOiBSQ1JlbW90ZVRyYWNrW119ID0ge307XG4gICAgaWYgKCF0aGlzLl9yb29tKSB7XG4gICAgICByZXR1cm4gdHJhY2tzO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJJZHMgPSB0aGlzLl9yb29tLmdldFJlbW90ZVVzZXJJZHMoKTtcbiAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZDogc3RyaW5nKSA9PiB7XG4gICAgICB0cmFja3NbdXNlcklkXSA9IHRoaXMuX3Jvb20hLmdldFJlbW90ZVRyYWNrc0J5VXNlcklkKHVzZXJJZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYWNrcztcbiAgfVxuXG4gIGdldFJlbW90ZVRyYWNrKHVzZXJJZDogc3RyaW5nLCBtZWRpYVR5cGU6IFJDQ2FsbFBsdXNNZWRpYVR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5fcm9vbT8uZ2V0UmVtb3RlVHJhY2tzQnlVc2VySWQodXNlcklkKS5maW5kKCh0cmFjaykgPT4gKChtZWRpYVR5cGUgPT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8pID8gdHJhY2suaXNBdWRpb1RyYWNrKCkgOiB0cmFjay5pc1ZpZGVvVHJhY2soKSkpO1xuICB9XG5cbiAgZ2V0UlRDU2Vzc2lvbklkKCkge1xuICAgIHJldHVybiB0aGlzLl9yb29tID8gdGhpcy5fcm9vbS5nZXRTZXNzaW9uSWQoKSA6IG51bGw7XG4gIH1cblxuICAvKiogPT09PT0956eB5pyJ5pa55rOVPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4gIC8qKlxuICAgKiBSVEMg5LqL5Lu255uR5ZCs5rOo5YaMXG4gICAqL1xuICBwcml2YXRlIF9yZWdSVENMaXN0ZW5lcnMoKSB7XG4gICAgLy8g5rOo5YaM5oi/6Ze05LqL5Lu255uR5ZCsXG4gICAgdGhpcy5fcm9vbSEucmVnaXN0ZXJSb29tRXZlbnRMaXN0ZW5lcih7XG4gICAgICAvKipcbiAgICAgICAqIOacrOerr+iiq+i4ouWHuuaIv+mXtOaXtuinpuWPkVxuICAgICAgICogQGRlc2NyaXB0aW9uIOiiq+i4ouWHuuaIv+mXtOWPr+iDveaYr+eUseS6juacjeWKoeerr+i2heWHuuS4gOWumuaXtumXtOacquiDveaUtuWIsCBydGNQaW5nIOa2iOaBr++8jOaJgOS7peiupOS4uuW3seaWueemu+e6v+OAglxuICAgICAgICog5Y+m5LiA56eN5Y+v6IO95piv5bex5pa5IHJ0Y1Bpbmcg5aSx6LSl5qyh5pWw6LaF5Ye65LiK6ZmQ77yM5pWF6ICM5Li75Yqo5pat57q/XG4gICAgICAgKiBAcGFyYW0gYnlTZXJ2ZXJcbiAgICAgICAqIOW9k+WAvOS4uiBmYWxzZSDml7bvvIzor7TmmI7mnKznq68gcnRjUGluZyDotoXml7ZcbiAgICAgICAqIOW9k+WAvOS4uiB0cnVlIOaXtu+8jOivtOaYjuacrOerr+aUtuWIsOiiq+i4ouWHuuaIv+mXtOmAmuefpVxuICAgICAgICovXG4gICAgICBvbktpY2tPZmY6IChieVNlcnZlcjogYm9vbGVhbiwgc3RhdGU/OiBSQ0tpY2tSZWFzb24gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgdGhpcy5fb25LaWNrT2ZmKGJ5U2VydmVyLCB0aGlzLl9yb29tIS5nZXRSb29tSWQoKSwgc3RhdGUpO1xuICAgICAgICB0aGlzLl9yZWxlYXNlU3RvcmVkRGF0YSgpO1xuICAgICAgfSxcbiAgICAgIC8vIOi/nOerr+eUqOaIt+WKoOWFpVxuICAgICAgb25Vc2VySm9pbjogKHVzZXJJZDogc3RyaW5nW10pID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IHVzZXJJZC5tYXAoKGlkKSA9PiAoeyBjYWxsSWQ6IHRoaXMuX2NhbGxJZCwgdXNlcklkOiBpZCB9KSk7XG4gICAgICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgICAgICB0aGlzLl9vbk90aGVyTWVtSm9pbmVkKGluZm8sIHRyYWNlSWQpO1xuICAgICAgfSxcbiAgICAgIC8vIOi/nOerr+eUqOaIt+emu+W8gFxuICAgICAgb25Vc2VyTGVhdmU6ICh1c2VySWRzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB1c2VySWRzLmZvckVhY2goKHVzZXJJZCkgPT4ge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLl91c2VyVmlld01hcFt1c2VySWRdO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvLyDov5znq6/otYTmupDlj5HluINcbiAgICAgIG9uVHJhY2tQdWJsaXNoOiB0aGlzLl9vblJlbW90ZVRyYWNrUHVibGlzaC5iaW5kKHRoaXMpLFxuICAgICAgLy8g6L+c56uv6LWE5rqQ5Y+W5raI5Y+R5biDXG4gICAgICBvblRyYWNrVW5wdWJsaXNoOiB0aGlzLl9vblRyYWNrVW5wdWJsaXNoLmJpbmQodGhpcyksXG4gICAgICAvLyDov5znq6/otYTmupDlh4blpIflsLHnu6pcbiAgICAgIG9uVHJhY2tSZWFkeTogKHRyYWNrOiBSQ1JlbW90ZVRyYWNrKSA9PiB7XG4gICAgICAgIHRoaXMuX29uUmVtb3RlVHJhY2tSZWFkeShbdHJhY2tdKTtcbiAgICAgIH0sXG4gICAgICAvLyDlj5HluIPogIXnpoHnlKjjgIHlkK/nlKjop4bpopFcbiAgICAgIG9uVmlkZW9NdXRlQ2hhbmdlOiAodmlkZW9UcmFjazogUkNSZW1vdGVWaWRlb1RyYWNrKSA9PiB7XG4gICAgICAgIHRoaXMuX29uVmlkZW9NdXRlQ2hhZ25lKHtcbiAgICAgICAgICBmcm9tVXNlcklkOiB2aWRlb1RyYWNrLmdldFVzZXJJZCgpLFxuICAgICAgICAgIG11dGVkOiB2aWRlb1RyYWNrLmlzT3duZXJNdXRlZCgpLFxuICAgICAgICAgIHRyYWNrSWQ6IHZpZGVvVHJhY2suZ2V0VHJhY2tJZCgpLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvLyDlj5HluIPogIXnpoHnlKjjgIHlkK/nlKjpn7PpopFcbiAgICAgIG9uQXVkaW9NdXRlQ2hhbmdlOiAoYXVkaW9UcmFjazogUkNSZW1vdGVBdWRpb1RyYWNrKSA9PiB7XG4gICAgICAgIHRoaXMuX29uQXVkaW9NdXRlQ2hhbmdlKHtcbiAgICAgICAgICBmcm9tVXNlcklkOiBhdWRpb1RyYWNrLmdldFVzZXJJZCgpLFxuICAgICAgICAgIG11dGVkOiBhdWRpb1RyYWNrLmlzT3duZXJNdXRlZCgpLFxuICAgICAgICAgIHRyYWNrSWQ6IGF1ZGlvVHJhY2suZ2V0VHJhY2tJZCgpLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBvblJUQ1BlZXJDb25uZWN0aW9uQ2xvc2VCeUV4Y2VwdGlvbjogdGhpcy5fb25SVENQZWVyQ29ubmVjdGlvbkNsb3NlQnlFeGNlcHRpb24uYmluZCh0aGlzKSxcbiAgICB9KTtcbiAgICAvLyDms6jlhozotKjph4/mlbDmja7miqXlkYrnm5HlkKxcbiAgICB0aGlzLl9yb29tIS5yZWdpc3RlclJlcG9ydExpc3RlbmVyKHtcbiAgICAgIG9uU3RhdGVSZXBvcnQ6IHRoaXMuX29uUlRDU3RhdGVSZXBvcnQuYmluZCh0aGlzKSxcbiAgICB9KTtcbiAgICAvLyDms6jlhozpn7Pph4/kuIrmiqXkuovku7ZcbiAgICB0aGlzLl9yb29tIS5vbkF1ZGlvTGV2ZWxDaGFuZ2UoKGF1ZGlvTGV2ZWxSZXBvcnRMaXN0KSA9PiB7XG4gICAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblVzZXJBdWRpb0xldmVsQ2hhbmdlZChhdWRpb0xldmVsUmVwb3J0TGlzdCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9vbkxvY2FsVHJhY2tSZWFkeSh0cmFja3M6IFJDTG9jYWxUcmFja1tdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZS5vblVzZXJNZWRpYUF2YWlsYWJsZSh0cmFja3MsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25SZW1vdGVUcmFja1JlYWR5KHRyYWNrczogUkNSZW1vdGVUcmFja1tdKSB7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25Vc2VyTWVkaWFBdmFpbGFibGUodHJhY2tzKTtcbiAgICB0aGlzLmVtaXQoUlRDTW9kdWxlLl9fSU5ORVJfUkVDRUlWRV9GSVJTVF9GUkFNRV9fKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uS2lja09mZihieVNlcnZlcjogYm9vbGVhbiwgcm9vbUlkOiBzdHJpbmcsIHN0YXRlPzogUkNLaWNrUmVhc29uLCBraWNrRXh0cmE/OiBSQ0NhbGxLaWNrRXh0cmEpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX0tJQ0tfT0ZGX08sIGByb29uSWQ6ICR7cm9vbUlkfSwgYnlTZXJ2ZXI6ICR7YnlTZXJ2ZXJ9LCBzdGF0ZTogJHtzdGF0ZX0sIGtpY2tFeHRyYTogJHtKU09OLnN0cmluZ2lmeShraWNrRXh0cmEpfWApO1xuICAgIGxldCBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbiA9IFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElPTl9FUlI7XG4gICAgaWYgKGJ5U2VydmVyKSB7XG4gICAgICBpZiAoa2lja0V4dHJhKSB7XG4gICAgICAgIHN5c3RlbVN0YXRlID0ga2lja0V4dHJhLmtpY2tSZWFzb25Db2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgIGNhc2UgUkNLaWNrUmVhc29uLlNFUlZFUl9LSUNLOlxuICAgICAgICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLktJQ0tFRF9CWV9TRVJWRVI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFJDS2lja1JlYXNvbi5PVEhFUl9LSUNLOlxuICAgICAgICAgICAgc3lzdGVtU3RhdGUgPSBSQ0NhbGxQbHVzUmVhc29uLk9USEVSX0NMSUVOVF9KT0lORUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFJDS2lja1JlYXNvbi5JTV9ESVNDT05ORUNURUQ6XG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElPTl9FUlI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFJDS2lja1JlYXNvbi5JTV9MT0dPVVQ6XG4gICAgICAgICAgICBzeXN0ZW1TdGF0ZSA9IFJDQ2FsbFBsdXNSZWFzb24uTE9HT1VUO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSQ0tpY2tSZWFzb24uT1RIRVJfQ0xJRU5UX0lNX0NPTk5FQ1RFRDpcbiAgICAgICAgICAgIHN5c3RlbVN0YXRlID0gUkNDYWxsUGx1c1JlYXNvbi5PVEhFUl9DTElFTlRfTE9HSU47XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9PTl9LSUNLT0ZGX18sIHN5c3RlbVN0YXRlLCByb29tSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJUQyBQZWVyIOW8guW4uOWFs+mXrVxuICAgKiDnp7vliqjnq6/mnKrlpITnkIbmraTlm57osIPvvIzlrprkuYkgc3lzU3RhdHVzIOS4uiBDT05ORUNUSU9OX0VSUlxuICAgKi9cbiAgcHJpdmF0ZSBfb25SVENQZWVyQ29ubmVjdGlvbkNsb3NlQnlFeGNlcHRpb24oKSB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9QRUVSQ09OTkVDVElPTl9FWENFUFRfQ0xPU0VfTywgJycsIHRyYWNlSWQpO1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9SVENfUEVFUkNPTk5FQ1RJT05fQUJOT1JNQUxfQ0xPU0VfXywgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9vblNlbGZKb2luZWQoaW5mbzogSU1lbWJlckluZm8sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9PTl9TRUxGX0pPSU5FRF9fLCBpbmZvLmNhbGxJZCwgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9vblJlbW90ZVRyYWNrUHVibGlzaCh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX29uRGV2aWNlRW5hYmxlQ2hhbmdlKHRyYWNrcywgdHJhY2VJZCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19QVUJMSVNIX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGNhbGxJZDogdGhpcy5fY2FsbElkLFxuICAgICAgdHJhY2tJZHM6IHRyYWNrcy5tYXAoKHRyYWNrKSA9PiB0cmFjay5nZXRUcmFja0lkKCkpLFxuICAgIH0pLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IG5lZWRTdWJUcmFja3M6IElTdWJzY3JpYmVBdHRyW10gPSBbXTtcbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIGNvbnN0IHVzZXJJZCA9IHRyYWNrLmdldFVzZXJJZCgpO1xuICAgICAgLyoqXG4gICAgICAgKiDmlLbliLDpn7PpopHml7bvvIznm7TmjqXorqLpmIVcbiAgICAgICAqL1xuICAgICAgaWYgKHRyYWNrLmlzQXVkaW9UcmFjaygpKSB7XG4gICAgICAgIG5lZWRTdWJUcmFja3MucHVzaCh7IHRyYWNrLCBzdWJUaW55OiBmYWxzZSB9KTtcbiAgICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVNaWNyb3Bob25lU3RhdGVDaGFuZ2VkKHRoaXMuX2NhbGxJZCwgdHJhY2spO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl91c2VyVmlld01hcFt1c2VySWRdPy52aWRlb1ZpZXcpIHtcbiAgICAgICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVDYW1lcmFTdGF0ZUNoYW5nZWQodGhpcy5fY2FsbElkLCB0cmFjayk7XG4gICAgICAgIGNvbnN0IHsgaXNUaW55IH0gPSB0aGlzLl91c2VyVmlld01hcFt1c2VySWRdO1xuICAgICAgICBuZWVkU3ViVHJhY2tzLnB1c2goeyB0cmFjaywgc3ViVGlueTogaXNUaW55IH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG5lZWRTdWJUcmFja3MubGVuZ3RoICYmIHRoaXMuc3Vic2NyaWJlVHJhY2tzKG5lZWRTdWJUcmFja3MsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfb25UcmFja1VucHVibGlzaCh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSkge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX29uRGV2aWNlRW5hYmxlQ2hhbmdlKHRyYWNrcywgdHJhY2VJZCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUkVDRUlWRV9UUkFDS19VTlBVQkxJU0hfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY2FsbElkOiB0aGlzLl9jYWxsSWQsXG4gICAgICB0cmFja0lkczogdHJhY2tzLm1hcCgodHJhY2spID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgYXdhaXQgdGhpcy51bnN1YnNjcmliZVRyYWNrcyh0cmFja3MsIHRyYWNlSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25BdWRpb011dGVDaGFuZ2UoaW5mbzogSU1lZGlhTXV0ZUNoYW5nZUluZm8pIHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRUNFSVZFX1RSQUNLX0VOQUJMRV9DSEFOR0VfTywgSlNPTi5zdHJpbmdpZnkoeyBpbmZvIH0pLCB0cmFjZUlkKTtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMuX3Jvb20hLmdldFJlbW90ZVRyYWNrKGluZm8udHJhY2tJZCk7XG4gICAgdGhpcy5fb25EZXZpY2VFbmFibGVDaGFuZ2UoW3RyYWNrIV0sIHRyYWNlSWQpO1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlLm9uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZCh0aGlzLl9jYWxsSWQsIHRyYWNrISk7XG4gIH1cblxuICBwcml2YXRlIF9vblZpZGVvTXV0ZUNoYWduZShpbmZvOiBJTWVkaWFNdXRlQ2hhbmdlSW5mbykge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1JFQ0VJVkVfVFJBQ0tfRU5BQkxFX0NIQU5HRV9PLCBKU09OLnN0cmluZ2lmeSh7IGluZm8gfSksIHRyYWNlSWQpO1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5fcm9vbSEuZ2V0UmVtb3RlVHJhY2soaW5mby50cmFja0lkKTtcbiAgICB0aGlzLl9vbkRldmljZUVuYWJsZUNoYW5nZShbdHJhY2shXSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25SZW1vdGVDYW1lcmFTdGF0ZUNoYW5nZWQodGhpcy5fY2FsbElkLCB0cmFjayEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25SVENTdGF0ZVJlcG9ydChyZXBvcnQ6IElSQ1JUQ1N0YXRlUmVwb3J0KSB7XG4gICAgY29uc3QgeyBzZW5kZXJzLCByZWNlaXZlcnMgfSA9IHJlcG9ydDtcbiAgICBzZW5kZXJzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHsga2luZCwgcGFja2V0c0xvc3RSYXRlLCBydHQgfSA9IGl0ZW07XG4gICAgICBpZiAodGhpcy5fY2FsbE1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJT19WSURFTyAmJiBraW5kID09PSAnYXVkaW8nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXI/Lm9uU2VuZFBhY2tldExvc3MocGFja2V0c0xvc3RSYXRlIHx8IDAsIHJ0dCB8fCAwKTtcbiAgICB9KTtcbiAgICByZWNlaXZlcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICB0cmFja0lkLCBraW5kLCBwYWNrZXRzTG9zdFJhdGUsIGJpdHJhdGUsXG4gICAgICB9ID0gaXRlbTtcbiAgICAgIGlmICh0aGlzLl9jYWxsTWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPX1ZJREVPICYmIGtpbmQgPT09ICdhdWRpbycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgeyB1c2VySWQgfSA9IGhlbHBlci5wYXJzZVRyYWNrSWQodHJhY2tJZCk7XG4gICAgICBjb25zdCBkYXRhOiB7XG4gICAgICAgIFt1c2VySWQ6IHN0cmluZ106IFJDQ2FsbFBsdXNQYWNrZXRMb3NzU3RhdHM7XG4gICAgICB9ID0ge307XG4gICAgICBpZiAocGFja2V0c0xvc3RSYXRlKSB7XG4gICAgICAgIGRhdGFbdXNlcklkXSA9IHtcbiAgICAgICAgICBwYWNrZXRMb3N0UmF0ZTogcGFja2V0c0xvc3RSYXRlLFxuICAgICAgICAgIGJpdFJhdGU6IGJpdHJhdGUsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2NhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXI/Lm9uUmVjZWl2ZVBhY2tldExvc3MoZGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAqIFJUQyDmjqXmlLbmnIDnu4jlpLHotKXlkI7pnIDopoHosIPnlKggaGFuZ3VwIOaMguaWreeahOaDheWGtVxuICovXG4gIHByaXZhdGUgX29uUlRDTWV0aG9kRmFpbChzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbiwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX1JUQ19QUk9DRVNTX0ZBSUxFRF9fLCBzeXN0ZW1TdGF0ZSwgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9vbk90aGVyTWVtSm9pbmVkKGluZm86IElNZW1iZXJJbmZvW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuZW1pdChSVENNb2R1bGUuX19JTk5FUl9PTl9PVEhFUl9KT0lORURfXywgaW5mbywgdHJhY2VJZCk7XG4gIH1cblxuICBwcml2YXRlIF9vbkRldmljZUVuYWJsZUNoYW5nZSh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KFJUQ01vZHVsZS5fX0lOTkVSX09OX0RFVklDRV9FTkFCTEVfQ0hBTkdFX18sIHRyYWNrcywgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog5Yib5bu65pys5Zyw6Z+z6aKRIHRyYWNrLCDliJvlu7rmiJDlip/lkI7kv53lrZjmnKzlnLDlubblm57osIPpgJrnn6VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2NyZWF0ZUF1ZGlvVHJhY2sodHJhY2VJZDogc3RyaW5nKTogUHJvbWlzZTx7Y29kZTogbnVtYmVyLCB0cmFjaz86IFJDTG9jYWxBdWRpb1RyYWNrfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX0NSRUFURV9BVURJT19UUkFDS19ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBpZiAodGhpcy5fbG9jYWxUcmFja3M/LnNvbWUoKGl0ZW0pID0+IGl0ZW0uaXNBdWRpb1RyYWNrKCkpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCBhdWRpb0NvbmZpZyA9IE9iamVjdC5hc3NpZ24odGhpcy5fYXVkaW9Db25maWcsIHsgbWljcGhvbmVJZDogdGhpcy5fYXVkaW9Db25maWcubWljcm9waG9uZUlkIH0pO1xuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y0NsaWVudC5jcmVhdGVNaWNyb3Bob25lQXVkaW9UcmFjayhSVENSZXNvdXJjZVRhZy5OT1JNQUwsIGF1ZGlvQ29uZmlnKTtcbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiwgYGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9DUkVBVEVfQVVESU9fVFJBQ0tfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gdGhpcy5fYXVkaW9Db25maWc7XG4gICAgKG1pbkJpdHJhdGUgfHwgbWF4Qml0cmF0ZSkgJiYgdHJhY2shLnNldEJpdHJhdGUobWF4Qml0cmF0ZSEsIG1pbkJpdHJhdGUhKTtcblxuICAgIC8vIOacrOasoee8k+WtmFxuICAgIHRoaXMuX2xvY2FsVHJhY2tzLnB1c2godHJhY2shKTtcbiAgICAvLyDpgJrnn6XkuIrlsYJcbiAgICB0aGlzLl9vbkxvY2FsVHJhY2tSZWFkeShbdHJhY2shXSwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgdHJhY2sgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJvlu7rmnKzlnLDop4bpopEgdHJhY2ssIOWIm+W7uuaIkOWKn+WQjuS/neWtmOacrOWcsOW5tuWbnuiwg+mAmuefpVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlVmlkZW9UcmFjayh0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtjb2RlOiBudW1iZXIsIHRyYWNrPzogUkNMb2NhbFZpZGVvVHJhY2t9PiB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9sb2NhbFRyYWNrcz8uc29tZSgoaXRlbSkgPT4gaXRlbS5pc1ZpZGVvVHJhY2soKSAmJiAhaXRlbS5pc0Rlc3Ryb3llZCgpKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlLCB0cmFjayB9ID0gYXdhaXQgdGhpcy5fcnRjQ2xpZW50LmNyZWF0ZUNhbWVyYVZpZGVvVHJhY2soUlRDUmVzb3VyY2VUYWcuTk9STUFMLCB0aGlzLl92aWRlb0NvbmZpZyk7XG4gICAgaWYgKGNvZGUgIT09IFJDUlRDQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IsIGBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfQ1JFQVRFX1ZJREVPX1RSQUNLX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IG1pbkJpdHJhdGUsIG1heEJpdHJhdGUgfSA9IHRoaXMuX3ZpZGVvQ29uZmlnO1xuICAgIChtaW5CaXRyYXRlIHx8IG1heEJpdHJhdGUpICYmIHRyYWNrIS5zZXRCaXRyYXRlKG1heEJpdHJhdGUhLCBtaW5CaXRyYXRlISk7XG5cbiAgICAvLyDmnKzmrKHnvJPlrZhcbiAgICB0aGlzLl9sb2NhbFRyYWNrcy5wdXNoKHRyYWNrISk7XG4gICAgLy8g6YCa55+l5LiK5bGCXG4gICAgdGhpcy5fb25Mb2NhbFRyYWNrUmVhZHkoW3RyYWNrIV0sIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsIHRyYWNrIH07XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5pys5Zyw57yT5a2Y6KeG6aKRIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9jYWxWaWRlb1RyYWNrKCk6IFJDTG9jYWxUcmFjayB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGxvY2FsVmlkZW9UcmFjazogUkNMb2NhbFRyYWNrIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLl9sb2NhbFRyYWNrcykge1xuICAgICAgW2xvY2FsVmlkZW9UcmFja10gPSB0aGlzLl9sb2NhbFRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc1ZpZGVvVHJhY2soKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbFZpZGVvVHJhY2s7XG4gIH1cblxuICAvKipcbiAgICog6I635b6X5pys5Zyw57yT5a2Y6Z+z6aKRIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9jYWxBdWRpb1RyYWNrKCk6IFJDTG9jYWxUcmFjayB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGxvY2FsQXVkaW9UcmFjazogUkNMb2NhbFRyYWNrIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLl9sb2NhbFRyYWNrcykge1xuICAgICAgW2xvY2FsQXVkaW9UcmFja10gPSB0aGlzLl9sb2NhbFRyYWNrcy5maWx0ZXIoKHRyYWNrKSA9PiB0cmFjay5pc0F1ZGlvVHJhY2soKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbEF1ZGlvVHJhY2s7XG4gIH1cblxuICAvKipcbiAgICog5Y+R5biD5pys5Zyw6LWE5rqQ55qE6YC76L6RXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHVibGlzaCh0cmFja3M6IChSQ0xvY2FsVHJhY2sgfCBJUHVibGlzaEF0dHJzKVtdLCB0cmFjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyfT4ge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BVQkxJU0hfVCwgYHRyYWNrc0lkczogJHt0cmFja3MubWFwKChpdGVtKSA9PiAoKGl0ZW0gaW5zdGFuY2VvZiBSQ0xvY2FsVHJhY2spID8gaXRlbS5nZXRUcmFja0lkKCkgOiBpdGVtLnRyYWNrLmdldFRyYWNrSWQoKSkpfWAsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCByZXRyeUFzeW5jRm4gPElQdWJSZXM+KHtcbiAgICAgIGFzeW5jRm46IHRoaXMuX3Jvb20hLnB1Ymxpc2guYmluZCh0aGlzLl9yb29tKSxcbiAgICAgIGZuQXJnczogW3RyYWNrc10sXG4gICAgICBvbkVycm9yOiAoY29kZSkgPT4ge30sXG4gICAgfSk7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX29uUlRDTWV0aG9kRmFpbChSQ0NhbGxQbHVzUmVhc29uLlBVQkxJU0hfRVJSLCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QVUJMSVNIX1IsIGBlcnJDb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUFVCTElTSF9SLCBgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoVmlkZW9UcmFjaygpIHtcbiAgICBjb25zdCBkZWZhdWx0VmlkZW9UcmFjayA9IHRoaXMuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgY29uc3QgcHViUGFyYW1zID0gdGhpcy5faXNQdWJUaW55ID8geyB0cmFjazogZGVmYXVsdFZpZGVvVHJhY2shLCBpc1B1YlRpbnk6IHRydWUgfSA6IGRlZmF1bHRWaWRlb1RyYWNrITtcbiAgICByZXR1cm4gdGhpcy5fcm9vbSEucHVibGlzaChbcHViUGFyYW1zXSk7XG4gIH1cblxuICBzZXRWaWRlb1ZpZXcobGlzdDoge3VzZXJJZDogc3RyaW5nLCB2aWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQsIGlzVGlueT86IGJvb2xlYW59W10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IG5lZWRTdWJUcmFja3M6IElTdWJzY3JpYmVBdHRyW10gPSBbXTtcbiAgICBsaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHsgdXNlcklkLCB2aWRlb0VsZW1lbnQsIGlzVGlueSA9IGZhbHNlIH0gPSBpdGVtO1xuICAgICAgdGhpcy5fdXNlclZpZXdNYXBbdXNlcklkXSA9IHtcbiAgICAgICAgdmlkZW9WaWV3OiB2aWRlb0VsZW1lbnQsXG4gICAgICAgIGlzVGlueSxcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIOiuvue9ruacrOerr+inhuWbvuaXtu+8jOWPquWtmOWCqOaVsOaNru+8jOaXoOmcgOiuoumYhVxuICAgICAgICovXG4gICAgICBpZiAodXNlcklkID09PSB0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICog6K6+572u6L+c56uv6KeG5Zu+5pe277yM5aaC5p6c5bey57uP5Yqg5YWl5oi/6Ze077yM5YiZ6I635Y+W6L+c56uv6LWE5rqQ55u05o6l6K6i6ZiFXG4gICAgICAgKi9cbiAgICAgIGlmICghdGhpcy5fcm9vbSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByZW1vdGVUcmFja3MgPSB0aGlzLmdldFJlbW90ZVRyYWNrcygpO1xuICAgICAgY29uc3Qgc3ViUGFyYW1zID0gKHJlbW90ZVRyYWNrc1t1c2VySWRdIHx8IFtdKS5tYXAoKHRyYWNrKSA9PiAoe1xuICAgICAgICB0cmFjayxcbiAgICAgICAgc3ViVGlueTogaXNUaW55LFxuICAgICAgfSkpLmZpbHRlcigoeyB0cmFjayB9KSA9PiAhdHJhY2suaXNTdWJzY3JpYmVkKCkpO1xuICAgICAgbmVlZFN1YlRyYWNrcy5wdXNoKC4uLnN1YlBhcmFtcyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9TRVRfVklERU9fVklFV19PLCBKU09OLnN0cmluZ2lmeShcbiAgICAgIHtcbiAgICAgICAgdXNlclZpZXdNYXA6IGdldFVzZXJWaWRlb1ZpZXdJbmZvKHRoaXMuX3VzZXJWaWV3TWFwKSxcbiAgICAgICAgbmVlZFN1YlRyYWNrSWRzOiBuZWVkU3ViVHJhY2tzLm1hcCgoeyB0cmFjayB9KSA9PiB0cmFjay5nZXRUcmFja0lkKCkpLFxuICAgICAgfSxcbiAgICApLCB0cmFjZUlkKTtcblxuICAgIG5lZWRTdWJUcmFja3MubGVuZ3RoICYmIHRoaXMuc3Vic2NyaWJlVHJhY2tzKG5lZWRTdWJUcmFja3MsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIoOmZpOinhuWbvuaXtu+8jOWPlua2iOiuoumYhei1hOa6kFxuICAgKi9cbiAgcmVtb3ZlVmlkZW9WaWV3KHVzZXJJZHM6IHN0cmluZ1tdLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB1bnN1YlRyYWNrczogUkNSZW1vdGVUcmFja1tdID0gW107XG4gICAgdXNlcklkcy5mb3JFYWNoKCh1c2VySWQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgdHJhY2tzID0gdGhpcy5nZXRSZW1vdGVUcmFja3MoKVt1c2VySWRdO1xuICAgICAgaWYgKHRyYWNrcyAmJiB0cmFja3MubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHZpZGVvVHJhY2sgPSB0cmFja3MuZmlsdGVyKCh0cmFjaykgPT4gdHJhY2suaXNWaWRlb1RyYWNrKCkpO1xuICAgICAgICB2aWRlb1RyYWNrLmxlbmd0aCAmJiB1bnN1YlRyYWNrcy5wdXNoKHZpZGVvVHJhY2tbMF0pO1xuICAgICAgfVxuICAgICAgZGVsZXRlIHRoaXMuX3VzZXJWaWV3TWFwW3VzZXJJZF07XG4gICAgfSk7XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9SRU1PVkVfVklERU9fVklFV19PLCBKU09OLnN0cmluZ2lmeShcbiAgICAgIHtcbiAgICAgICAgdXNlclZpZXdNYXA6IGdldFVzZXJWaWRlb1ZpZXdJbmZvKHRoaXMuX3VzZXJWaWV3TWFwKSxcbiAgICAgICAgdW5zdWJUcmFja3M6IHVuc3ViVHJhY2tzLm1hcCgodHJhY2spID0+IHRyYWNrLmdldFRyYWNrSWQoKSksXG4gICAgICB9LFxuICAgICksIHRyYWNlSWQpO1xuXG4gICAgaWYgKHVuc3ViVHJhY2tzLmxlbmd0aCkge1xuICAgICAgdGhpcy51bnN1YnNjcmliZVRyYWNrcyh1bnN1YlRyYWNrcywgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluWtmOWCqOeahOS6uuWRmOWSjCB2aWRlbyDlhYPntKDmlbDmja5cbiAgICovXG4gIGdldFVzZXJWaWV3TWFwKCkge1xuICAgIHJldHVybiB0aGlzLl91c2VyVmlld01hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiDmkq3mlL7lqpLkvZPotYTmupBcbiAgICovXG4gIGFzeW5jIHBsYXlNZWRpYSh1c2VySWQ6IHN0cmluZywgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlLCB2aWRlb1ZpZXc6IEhUTUxWaWRlb0VsZW1lbnQsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfVCwgYHVzZXJJZDogJHt1c2VySWR9LCBtZWRpYVR5cGU6ICR7bWVkaWFUeXBlfSwgdmlkZW9WaWV3OiAke3ZpZGVvVmlldz8ubm9kZU5hbWV9YCwgdHJhY2VJZCk7XG4gICAgbGV0IHRyYWNrOiBSQ1RyYWNrIHwgbnVsbCA9IG51bGw7XG4gICAgLyoqXG4gICAgICog5Yy65YiG5pys56uv5ZKM6L+c56uvXG4gICAgICovXG4gICAgaWYgKHVzZXJJZCA9PT0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSkge1xuICAgICAgdHJhY2sgPSAobWVkaWFUeXBlID09PSBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPKSA/IHRoaXMuZ2V0TG9jYWxBdWRpb1RyYWNrKCkhIDogdGhpcy5nZXRMb2NhbFZpZGVvVHJhY2soKSE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZ1xuICAgICAgdHJhY2sgPSB0aGlzLmdldFJlbW90ZVRyYWNrcygpW3VzZXJJZF0uZmlsdGVyKCh0cmFjaykgPT4gKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTyA/IHRyYWNrLmlzQXVkaW9UcmFjaygpIDogdHJhY2suaXNWaWRlb1RyYWNrKCkpKVswXTtcbiAgICB9XG5cbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUExBWV9NRURJQV9SLCBgZXJyb3IgY29kZTogJHtSQ0NhbGxQbHVzQ29kZS5NRURJQV9SRVNPVVJDRV9JTlZBTElFRH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk1FRElBX1JFU09VUkNFX0lOVkFMSUVEIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gdHJhY2suaXNBdWRpb1RyYWNrKCkgPyBhd2FpdCB0cmFjay5wbGF5KCkgOiBhd2FpdCB0cmFjay5wbGF5KHZpZGVvVmlldyk7XG4gICAgICAvKipcbiAgICAgICAqIOWkhOeQhumAmuivneWJjeiuvue9ruS6humdmemfs+aJgOaciei/nOerr+mfs+mikea1gVxuICAgICAgICovXG4gICAgICB0cmFjay5pc0F1ZGlvVHJhY2soKSAmJiAhdGhpcy5fcmVtb3RlQXVkaW9FbmFibGUgJiYgdHJhY2subXV0ZSgpO1xuXG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9SVENfTU9EVUxFX1BMQVlfTUVESUFfUiwgYGVyckNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX1JUQ19NT0RVTEVfUExBWV9NRURJQV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfUlRDX01PRFVMRV9QTEFZX01FRElBX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlBMQVlfTUVESUFfRkFJTEVEfSwgbWVzc2FnZTogJHtlcnJvci5tZXNzYWdlfSxgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBMQVlfTUVESUFfRkFJTEVEIH07XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgSVJlY2VpdmVkTWVzc2FnZSB9IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7XG4gIElTdWJzY3JpYmVBdHRyLFxuICBSQ0xvY2FsQXVkaW9UcmFjayxcbiAgUkNSVENDb2RlLFxuICBSQ1JlbW90ZUF1ZGlvVHJhY2ssXG4gIFJDUmVtb3RlVHJhY2ssXG4gIFJDVHJhY2ssXG59IGZyb20gJ0Byb25nY2xvdWQvcGx1Z2luLXJ0Yyc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi4vYXBpL2VudW1zL1JDQ2FsbFBsdXNMb2dnZXJUYWcnO1xuaW1wb3J0IHtcbiAgSUNhbGxQbHVzRXZlbnRMaXN0ZW5lcixcbiAgSVJDQ2FsbFBsdXNDYWxsUmVjb3JkLFxuICBJUkNDYWxsUGx1c1JlY2VpdmVkU3VtbWFyeU1lc3NhZ2UsXG4gIFJDQ2FsbFBsdXNNZWRpYVR5cGUsXG4gIFJDQ2FsbFBsdXNSZWFzb24sXG4gIFJDQ2FsbFBsdXNTZXNzaW9uLFxuICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSxcbiAgUkNDYWxsUGx1c1R5cGUsXG59IGZyb20gJy4uL2FwaS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUkNDYWxsUGx1c01lZGlhVHlwZUNoYW5nZVJlc3VsdCB9IGZyb20gJy4uL2VudW1zL1JDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQnO1xuXG5leHBvcnQgY2xhc3MgUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSB7XG4gIHByaXZhdGUgX2xpc3RlbmVyITogSUNhbGxQbHVzRXZlbnRMaXN0ZW5lclxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICkge1xuXG4gIH1cblxuICAvKipcbiAgICog54q25oCB5py65LqL5Lu25rOo5YaMXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJFdmVudExpc3RlbmVyKGxpc3RlbmVyOiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyKSB7XG4gICAgdGhpcy5fbGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgfVxuXG4gIC8qKlxuICAqIOWbnuiwg+W6lOeUqOWxguS6i+S7tlxuICAqIEBwYXJhbSBldmVudE5hbWVcbiAgKiBAcGFyYW0gYXR0cnNcbiAgKiBAcmV0dXJuc1xuICAqL1xuICBwcml2YXRlIGFzeW5jIF9jYWxsQXBwTGlzdGVuZXIoZXZlbnROYW1lOiBrZXlvZiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyLCAuLi5hdHRyczogYW55W10pIHtcbiAgICBjb25zdCBoYW5kbGUgPSB0aGlzLl9saXN0ZW5lcj8uW2V2ZW50TmFtZV0gYXMgRnVuY3Rpb247XG4gICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGhhbmRsZSguLi5hdHRycyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsKHNlc3Npb246IFJDQ2FsbFBsdXNTZXNzaW9uLCB0cmFjZUlkOiBzdHJpbmcsIGV4dHJhPzogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVjZWl2ZWRDYWxsJyxcbiAgICAgIGNhbGxJZDogc2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvblJlY2VpdmVkQ2FsbCcsIHNlc3Npb24sIGV4dHJhKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW90ZVVzZXJJbnZpdGVkKGludml0ZWVVc2VyTGlzdDogc3RyaW5nW10sIGludml0ZXJVc2VySWQ6IHN0cmluZywgY2FsbElkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZW1vdGVVc2VySW52aXRlZCcsXG4gICAgICBpbnZpdGVlVXNlckxpc3QsXG4gICAgICBpbnZpdGVyVXNlcklkLFxuICAgICAgY2FsbElkLFxuICAgIH0pKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVtb3RlVXNlckludml0ZWQnLCBpbnZpdGVlVXNlckxpc3QsIGludml0ZXJVc2VySWQsIGNhbGxJZCk7XG4gIH1cblxuICBwdWJsaWMgb25DYWxsQ29ubmVjdGVkKHNlc3Npb246IFJDQ2FsbFBsdXNTZXNzaW9uKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uQ2FsbENvbm5lY3RlZCcsXG4gICAgICBjYWxsSWQ6IHNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgfSkpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25DYWxsQ29ubmVjdGVkJywgc2Vzc2lvbik7XG4gIH1cblxuICBwdWJsaWMgb25DYWxsVHlwZUNoYW5nZWQoY2FsbFR5cGU6IFJDQ2FsbFBsdXNUeXBlLCBjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uQ2FsbFR5cGVDaGFuZ2VkJyxcbiAgICAgIGNhbGxJZCxcbiAgICAgIGNhbGxUeXBlLFxuICAgIH0pLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uQ2FsbFR5cGVDaGFuZ2VkJywgY2FsbFR5cGUsIGNhbGxJZCk7XG4gIH1cblxuICAvKipcbiAgICog5aKe6YeP5LiK5oql6L+c56uv5Lq65ZGY54q25oCB5Y+Y5YyWXG4gICAqL1xuICBwdWJsaWMgb25SZW1vdGVVc2VyU3RhdGVDaGFuZ2VkKGRhdGE6IHtcbiAgICBjYWxsSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICB1c2VyU3RhdGU6IFJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlLFxuICAgIHJlYXNvbj86IFJDQ2FsbFBsdXNSZWFzb24sXG4gIH0sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxJZCwgdXNlcklkLCB1c2VyU3RhdGUsIHJlYXNvbixcbiAgICB9ID0gZGF0YTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZW1vdGVVc2VyU3RhdGVDaGFuZ2VkJyxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHVzZXJJZCxcbiAgICAgIHVzZXJTdGF0ZSxcbiAgICAgIHJlYXNvbixcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvblJlbW90ZVVzZXJTdGF0ZUNoYW5nZWQnLCBjYWxsSWQsIHVzZXJJZCwgdXNlclN0YXRlLCByZWFzb24pO1xuICB9XG5cbiAgcHVibGljIG9uQ2FsbEVuZGVkKHNlc3Npb246IFJDQ2FsbFBsdXNTZXNzaW9uLCByZWFzb246IFJDQ2FsbFBsdXNSZWFzb24sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvbkNhbGxFbmRlZCcsXG4gICAgICBjYWxsSWQ6IHNlc3Npb24uZ2V0Q2FsbElkKCksXG4gICAgICBjbG9zZVJlYXNvbjogcmVhc29uLFxuICAgIH0pLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uQ2FsbEVuZGVkJywgc2Vzc2lvbiwgcmVhc29uKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlbW90ZUNhbWVyYVN0YXRlQ2hhbmdlZChjYWxsSWQ6IHN0cmluZywgdHJhY2s6IFJDUmVtb3RlVHJhY2spIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZW1vdGVDYW1lcmFTdGF0ZUNoYW5nZWQnLFxuICAgICAgY2FsbElkLFxuICAgICAgdHJhY2tJZDogdHJhY2s/LmdldFRyYWNrSWQoKSxcbiAgICAgIGVuYWJsZTogdHJhY2s/LmlzT3duZXJNdXRlZCgpLFxuICAgIH0pKTtcbiAgICBjb25zdCB1c2VySWQgPSB0cmFjaz8uZ2V0VXNlcklkKCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvblJlbW90ZUNhbWVyYVN0YXRlQ2hhbmdlZCcsIGNhbGxJZCwgdXNlcklkLCB0cmFjaz8uaXNPd25lck11dGVkKCkpO1xuICB9XG5cbiAgcHVibGljIG9uUmVtb3RlTWljcm9waG9uZVN0YXRlQ2hhbmdlZChjYWxsSWQ6IHN0cmluZywgdHJhY2s6IFJDUmVtb3RlVHJhY2spIHtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTExfRVZFTlRfTElTVEVORVJfTywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRUeXBlOiAnb25SZW1vdGVNaWNyb3Bob25lU3RhdGVDaGFuZ2VkJyxcbiAgICAgIGNhbGxJZCxcbiAgICAgIHRyYWNrSWQ6IHRyYWNrPy5nZXRUcmFja0lkKCksXG4gICAgICBlbmFibGU6IHRyYWNrPy5pc093bmVyTXV0ZWQoKSxcbiAgICB9KSk7XG4gICAgY29uc3QgdXNlcklkID0gdHJhY2s/LmdldFVzZXJJZCgpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZW1vdGVNaWNyb3Bob25lU3RhdGVDaGFuZ2VkJywgY2FsbElkLCB1c2VySWQsIHRyYWNrPy5pc093bmVyTXV0ZWQoKSk7XG4gIH1cblxuICBwdWJsaWMgb25SZWNlaXZlZENhbGxSZWNvcmQocmVjb3JkOiBJUkNDYWxsUGx1c0NhbGxSZWNvcmQsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2FsbFJlY29yZCcsXG4gICAgICByZWNvcmQsXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENhbGxSZWNvcmQnLCByZWNvcmQpO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXF1ZXN0KHVzZXJJZDogc3RyaW5nLCB0cmFuc2FjdGlvbklkOiBzdHJpbmcsIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uUmVjZWl2ZWRDaGFuZ2VNZWRpYVR5cGVSZXF1ZXN0JyxcbiAgICAgIHVzZXJJZCxcbiAgICAgIHRyYW5zYWN0aW9uSWQsXG4gICAgfSksIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlcXVlc3QnLCB1c2VySWQsIHRyYW5zYWN0aW9uSWQsIG1lZGlhVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgb25SZWNlaXZlZENoYW5nZU1lZGlhVHlwZVJlc3VsdChpbmZvOiB7XG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgdHJhbnNhY3Rpb25JZDogc3RyaW5nLFxuICAgIG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgICBjb2RlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlQ2hhbmdlUmVzdWx0XG4gIH0sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHtcbiAgICAgIHVzZXJJZCwgdHJhbnNhY3Rpb25JZCwgbWVkaWFUeXBlLCBjb2RlLFxuICAgIH0gPSBpbmZvO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVzdWx0JyxcbiAgICAgIHVzZXJJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvblJlY2VpdmVkQ2hhbmdlTWVkaWFUeXBlUmVzdWx0Jywge1xuICAgICAgdXNlcklkLCB0cmFuc2FjdGlvbklkLCBtZWRpYVR5cGUsIGNvZGUsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25SZWNlaXZlZENhbGxTdGFydFRpbWUoaW5mbzogeyBjYWxsSWQ6IHN0cmluZywgY2FsbFN0YXJ0VGltZTogbnVtYmVyIH0sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2FsbFN0YXJ0VGltZScsXG4gICAgICBpbmZvLFxuICAgIH0pLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9jYWxsQXBwTGlzdGVuZXIoJ29uUmVjZWl2ZWRDYWxsU3RhcnRUaW1lJywgaW5mbyk7XG4gIH1cblxuICBwdWJsaWMgb25SZWNlaXZlZENhbGxGaXJzdEZyYW1lVGltZShjYWxsSWQ6IHN0cmluZywgY2FsbEZpcnN0RnJhbWVUaW1lOiBudW1iZXIsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FMTF9FVkVOVF9MSVNURU5FUl9PLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudFR5cGU6ICdvblJlY2VpdmVkQ2FsbEZpcnN0RnJhbWVUaW1lJyxcbiAgICAgIGNhbGxJZCxcbiAgICAgIGNhbGxGaXJzdEZyYW1lVGltZSxcbiAgICB9KSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fY2FsbEFwcExpc3RlbmVyKCdvblJlY2VpdmVkQ2FsbEZpcnN0RnJhbWVUaW1lJywgY2FsbElkLCBjYWxsRmlyc3RGcmFtZVRpbWUpO1xuICB9XG5cbiAgcHVibGljIG9uVXNlck1lZGlhQXZhaWxhYmxlKHRyYWNrczogUkNUcmFja1tdLCB0cmFjZUlkPzogc3RyaW5nKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQUxMX0VWRU5UX0xJU1RFTkVSX08sIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50VHlwZTogJ29uVXNlck1lZGlhQXZhaWxhYmxlJyxcbiAgICAgIHRyYWNrSWRzOiB0cmFja3MubWFwKCh0cmFjaykgPT4gdHJhY2suZ2V0VHJhY2tJZCgpKSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICB0cmFja3MuZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIGNvbnN0IHVzZXJJZCA9IHRyYWNrLmdldFVzZXJJZCgpO1xuICAgICAgY29uc3QgbWVkaWFUeXBlID0gdHJhY2suaXNBdWRpb1RyYWNrKCkgPyBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPIDogUkNDYWxsUGx1c01lZGlhVHlwZS5WSURFTztcbiAgICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25Vc2VyTWVkaWFBdmFpbGFibGUnLCB1c2VySWQsIG1lZGlhVHlwZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25GZXRjaFJlbW90ZU1lZGlhRXJyb3IodHJhY2tzOiBJU3Vic2NyaWJlQXR0cltdLCBjb2RlOiBSQ1JUQ0NvZGUpIHtcbiAgICB0cmFja3MuZm9yRWFjaCgoeyB0cmFjayB9KSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25GZXRjaFJlbW90ZU1lZGlhRXJyb3InLCB1c2VySWQsIGNvZGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uVXNlckF1ZGlvTGV2ZWxDaGFuZ2VkKGF1ZGlvTGV2ZWxSZXBvcnRMaXN0OiB7XG4gICAgdHJhY2s6IFJDTG9jYWxBdWRpb1RyYWNrIHwgUkNSZW1vdGVBdWRpb1RyYWNrO1xuICAgIGF1ZGlvTGV2ZWw6IG51bWJlcjtcbiAgfVtdKSB7XG4gICAgYXVkaW9MZXZlbFJlcG9ydExpc3QuZm9yRWFjaCgoeyB0cmFjaywgYXVkaW9MZXZlbCB9KSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25Vc2VyQXVkaW9MZXZlbENoYW5nZWQnLCB1c2VySWQsIGF1ZGlvTGV2ZWwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uUmVjZWl2ZWRDYWxsUGx1c1N1bW1hcnlNZXNzYWdlKG1lc3NhZ2U6IElSQ0NhbGxQbHVzUmVjZWl2ZWRTdW1tYXJ5TWVzc2FnZSkge1xuICAgIHRoaXMuX2NhbGxBcHBMaXN0ZW5lcignb25SZWNlaXZlZENhbGxQbHVzU3VtbWFyeU1lc3NhZ2UnLCBtZXNzYWdlKTtcbiAgfVxufVxuIiwiZXhwb3J0IGVudW0gQ2FsbFNlcnZlckVycm9yQ29kZSB7XG4gIC8qKlxuICAgKiDmnKrnn6XplJnor69cbiAgICovXG4gIFVOS05PV19FUlIgPSA0MTAwMCxcbiAgLyoqXG4gICAqIOaVsOaNruW6k+mUmeivr1xuICAgKi9cbiAgREJfRVJSID0gNDEwMDEsXG4gIC8qKlxuICAgKiBqc29uIOmUmeivr1xuICAgKi9cbiAgSlNPTl9FUlIgPSA0MTAwMixcbiAgLyoqXG4gICAqIGpzb24g5qC85byP6ZSZ6K+vXG4gICAqL1xuICBJTlZBTElEX0pTT05fRVJSID0gNDEwMDMsXG4gIC8qKlxuICAgKiDlj4LmlbDkuKLlpLFcbiAgICovXG4gIE1JU1NJTkdfUEFSQU1TID0gNDEwMDQsXG4gIC8qKlxuICAgKiDlj4LmlbDkuI3og73kuLrnqbpcbiAgICovXG4gIFBBUkFNU19SRVFVSVJFRCA9IDQxMDA1LFxuICAvKipcbiAgICog5pWw5o2u5qC85byP6ZSZ6K+vXG4gICAqL1xuICBEQVRBX0ZPUk1BVF9FUlIgPSA0MTAwNixcbiAgLyoqXG4gICAqIOaWueazleacquWunueOsFxuICAgKi9cbiAgTUVUSE9EX05PVF9JTVBMRU1FTlRFRCA9IDQxMDA3LFxuICAvKipcbiAgICogY2FsbCDkuI3lrZjlnKjmiJblt7Lnu5PmnZ9cbiAgICovXG4gIENBTExfTk9UX0VYSVNUID0gNDEwMTAsXG4gIC8qKlxuICAgKiDljZXlkbwg6KKr6YKA6K+36ICF5LiN6IO96LaF6L+H5Lik5Lq6XG4gICAqL1xuICBTSU5HQUxfRVhDRUVEX1RXT19JTlZJVEVFID0gNDEwMTEsXG4gIC8qKlxuICAgKiDnvqTnu4Tlkbzlj6votoXov4fop4TlrprkurrmlbDvvIjmnIDlpJogMzIg5Lq677yJXG4gICAqL1xuICBHUk9VUF9FWENFRURTX1FVT1JVTSA9IDQxMDEyLFxuICAvKipcbiAgICog5pON5L2c5bey6L+H5pyfXG4gICAqL1xuICBPUEVSQVRJT05fRVhQSVJFRCA9IDQxMDEzLFxuICAvKipcbiAgICog5b2T5YmN6K6+5aSH5q2j5Zyo5ZG85Y+r5LitXG4gICAqL1xuICBERVZJQ0VfSVNfQ0FMTElORyA9IDQxMDE0LFxuICAvKipcbiAgICog5LiK5oql55qEIHN0cmVhbVJlYWR5VGltZSDml6DmlYhcbiAgICovXG4gIFJFUE9SVF9TVFJFQU1fUkVBRFlfVElNRV9JU19JTlZBTElEID0gNDEwMTgsXG4gIC8qKlxuICAgKiDkuI3og73lkbzoh6rlt7FcbiAgICovXG4gIE5PVF9DQUxMX1lPVVJTRUxGID0gNDEwMTksXG4gIC8qKlxuICAgKiDkvJror53nirbmgIHkuI3lrZjlnKhcbiAgICovXG4gIFNFU1NJT05fU1RBVFVTX05PVF9FWElTVCA9IDQxMDIwLFxuICAvKipcbiAgICogaGFuZ3VwIOaTjeS9nOWcqOW9k+WJjeeKtuaAgeS4jeWFgeiuuOiwg+eUqFxuICAgKi9cbiAgSEFOR1VQX05PVF9BTExPVyA9IDQxMDIxLFxuICAvKipcbiAgICogYWNjZXB0IOaTjeS9nOWcqOW9k+WJjeeKtuaAgeS4jeWFgeiuuOiwg+eUqFxuICAgKi9cbiAgQUNDRVBUX05PVF9BTExPVyA9IDQxMDIyLFxuICAvKipcbiAgICog5pON5L2c5Zyo5b2T5YmN5pa55rOV5LiN5YWB6K646LCD55SoXG4gICAqL1xuICBPUEVSQVRJT05fTk9UX0FMTE9XID0gNDEwMjUsXG4gIC8qKlxuICAgKiDkuJrliqFJZOS4jeato+ehruaIluiAheS4muWKoeW3sue7k+adn1xuICAgKi9cbiAgVFJBTlNBQ1RJT05fSURfRVJSID0gNDExMDAsXG4gIC8qKlxuICAgKiDpn7PpopHljYfnuqfop4bpopHlt7Looqvlj5HotbfogIXlj5bmtohcbiAgICovXG4gIFVQX1ZJREVPX0NBTkNFTEVEID0gNDEwNTAsXG4gIC8qKlxuICAgKiDlvZPliY3pgJror53lt7Lnu4/mmK/pn7PpopHpgJror53vvIzml6DpnIDpmY3nuqdcbiAgICovXG4gIENVUlJFTlRfQ0FMTF9JU19BVURJTyA9IDQxMDUxLFxuICAvKipcbiAgICog5b2T5YmN6YCa6K+d5bey57uP5piv6KeG6aKR6YCa6K+d77yM5peg6ZyA5Y2H57qnXG4gICAqL1xuICAgQ1VSUkVOVF9DQUxMX0lTX1ZJREVPID0gNDEwNTIsXG59XG4iLCJpbXBvcnQgeyBCYXNpY0xvZ2dlciwgaXNTdHJpbmcgfSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBJQW5kcm9pZFB1c2hDb25maWcgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUkNDYWxsUGx1c0FuZHJvaWRQdXNoQ29uZmlnQnVpbGRlciB7XG4gIHByaXZhdGUgX2FuZHJvaWRQdXNoQ29uZmlnOiBJQW5kcm9pZFB1c2hDb25maWcgPSB7fVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2xvZ2dlcjogQmFzaWNMb2dnZXIsXG4gICkge31cblxuICAvKipcbiAgICog6K6+572u5bCP57Gz55qEIGNoYW5uZWxJZFxuICAgKi9cbiAgc2V0Q2hhbm5lbElkTWkoY2hhbm5lbElkTWk6IHN0cmluZykge1xuICAgIGlmICghaXNTdHJpbmcoY2hhbm5lbElkTWkpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFVF9BTkRST0lEX1BVU0hfQ09ORklHX08sIGBlcnJvck1zZzogY2hhbm5lbElkTWkgdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2NoYW5uZWxJZE1pfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2FuZHJvaWRQdXNoQ29uZmlnLmNoYW5uZWxJZE1pID0gY2hhbm5lbElkTWk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5bCP57GzIExhcmdlIGljb24g6ZO+5o6lXG4gICAqIEBkZXByZWNhdGVkIOeUseS6juWwj+exs+WumOaWueW3suWBnOatouaUr+aMgeivpeiDveWKm++8jOivpeaWueazleW3suWkseaViFxuICAgKi9cbiAgc2V0TWlMYXJnZUljb25VcmwobWlMYXJnZUljb25Vcmw6IHN0cmluZykge1xuICAgIHRoaXMuX2xvZ2dlci53YXJuKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PLCAnYHNldE1pTGFyZ2VJY29uVXJsYCBoYXMgYmVlbiBkZXByZWNhdGVkLicpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruWNjuS4uueahCBjaGFubmVsSWRcbiAgICovXG4gIHNldENoYW5uZWxJZEhXKGNoYW5uZWxJZEhXOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzU3RyaW5nKGNoYW5uZWxJZEhXKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PLCBgZXJyb3JNc2c6IGNoYW5uZWxJZEhXIHR5cGUgaXMgc3RyaW5nLCB2YWx1ZTogJHtjaGFubmVsSWRIV31gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hbmRyb2lkUHVzaENvbmZpZy5jaGFubmVsSWRIVyA9IGNoYW5uZWxJZEhXO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruWNjuS4uuaOqOmAgea2iOaBr+WIhuexu1xuICAgKi9cbiAgc2V0Q2F0ZWdvcnlIVyhjYXRlZ29yeUhXOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzU3RyaW5nKGNhdGVnb3J5SFcpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFVF9BTkRST0lEX1BVU0hfQ09ORklHX08sIGBlcnJvck1zZzogY2F0ZWdvcnlIVyB0eXBlIGlzIHN0cmluZywgdmFsdWU6ICR7Y2F0ZWdvcnlIV31gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hbmRyb2lkUHVzaENvbmZpZy5jYXRlZ29yeUhXID0gY2F0ZWdvcnlIVztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7ljY7kuLrmjqjpgIHmtojmga/nuqfliKtcbiAgICovXG4gIHNldEltcG9ydGFuY2VIVyhpbXBvcnRhbmNlSFc6ICdOT1JNQUwnIHwgJ0xPVycpIHtcbiAgICBpZiAoaW1wb3J0YW5jZUhXICE9PSAnTE9XJyAmJiBpbXBvcnRhbmNlSFcgIT09ICdOT1JNQUwnKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFVF9BTkRST0lEX1BVU0hfQ09ORklHX08sIGBlcnJvck1zZzogaW1wb3J0YW5jZUhXIHZhbHVlIGlzIE5PUk1BTHxMT1csIHZhbHVlOiAke2ltcG9ydGFuY2VIV31gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hbmRyb2lkUHVzaENvbmZpZy5pbXBvcnRhbmNlSFcgPSBpbXBvcnRhbmNlSFc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u5Y2O5Li66YCa55+l57G75Z6L55qE5o6o6YCB5omA5L2/55So55qE6YCa55+l5Zu+54mHIHVybFxuICAqL1xuICBzZXRJbWFnZVVybEhXKGltYWdlVXJsSFc6IHN0cmluZykge1xuICAgIGlmICghaXNTdHJpbmcoaW1hZ2VVcmxIVykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VUX0FORFJPSURfUFVTSF9DT05GSUdfTywgYGVycm9yTXNnOiBpbWFnZVVybEhXIHR5cGUgaXMgc3RyaW5nLCB2YWx1ZTogJHtpbWFnZVVybEhXfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2FuZHJvaWRQdXNoQ29uZmlnLmltYWdlVXJsSFcgPSBpbWFnZVVybEhXO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9riBPUFBPIOeahCBjaGFubmVsSWRcbiAgICovXG4gIHNldENoYW5uZWxJZE9QUE8oY2hhbm5lbElkT1BQTzogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1N0cmluZyhjaGFubmVsSWRPUFBPKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PLCBgZXJyb3JNc2c6IGNoYW5uZWxJZE9QUE8gdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2NoYW5uZWxJZE9QUE99YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fYW5kcm9pZFB1c2hDb25maWcuY2hhbm5lbElkT1BQTyA9IGNoYW5uZWxJZE9QUE87XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572uIHZpdm8g55qE57G75Z6LXG4gICAqL1xuICBzZXRUeXBlVml2byh0eXBlVml2bzogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1N0cmluZyh0eXBlVml2bykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VUX0FORFJPSURfUFVTSF9DT05GSUdfTywgYGVycm9yTXNnOiB0eXBlVml2byB0eXBlIGlzIHN0cmluZywgdmFsdWU6ICR7dHlwZVZpdm99YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fYW5kcm9pZFB1c2hDb25maWcudHlwZVZpdm8gPSB0eXBlVml2bztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva4gVml2byDliIbnsbtcbiAgICovXG4gIHNldENhdGVnb3J5Vml2byhjYXRlZ29yeVZpdm86IHN0cmluZykge1xuICAgIGlmICghaXNTdHJpbmcoY2F0ZWdvcnlWaXZvKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PLCBgZXJyb3JNc2c6IGNhdGVnb3J5Vml2byB0eXBlIGlzIHN0cmluZywgdmFsdWU6ICR7Y2F0ZWdvcnlWaXZvfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2FuZHJvaWRQdXNoQ29uZmlnLmNhdGVnb3J5Vml2byA9IGNhdGVnb3J5Vml2bztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAqIOiuvue9riBGQ00g5o6o6YCB5bmz5Y+w5rig6YGTIElEXG4gICovXG4gIHNldEZjbUNoYW5uZWxJZChmY21DaGFubmVsSWQ6IHN0cmluZykge1xuICAgIGlmICghaXNTdHJpbmcoZmNtQ2hhbm5lbElkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PLCBgZXJyb3JNc2c6IGZjbUNoYW5uZWxJZCB0eXBlIGlzIHN0cmluZywgdmFsdWU6ICR7ZmNtQ2hhbm5lbElkfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2FuZHJvaWRQdXNoQ29uZmlnLmZjbUNoYW5uZWxJZCA9IGZjbUNoYW5uZWxJZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva4gRkNNIOmAmuefpeexu+Wei+aOqOmAgeaXtuaJgOS9v+eUqOeahOWIhue7hCBpZFxuICAgKi9cbiAgc2V0RmNtQ29sbGFwc2VLZXkoZmNtQ29sbGFwc2VLZXk6IHN0cmluZykge1xuICAgIGlmICghaXNTdHJpbmcoZmNtQ29sbGFwc2VLZXkpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFVF9BTkRST0lEX1BVU0hfQ09ORklHX08sIGBlcnJvck1zZzogZmNtQ29sbGFwc2VLZXkgdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2ZjbUNvbGxhcHNlS2V5fWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2FuZHJvaWRQdXNoQ29uZmlnLmZjbUNvbGxhcHNlS2V5ID0gZmNtQ29sbGFwc2VLZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572uIEZDTSDpgJrnn6XnsbvlnovnmoTmjqjpgIHmiYDkvb/nlKjnmoTpgJrnn6Xlm77niYcgdXJsXG4gICAqL1xuICBzZXRGY21JbWFnZVVybChmY21JbWFnZVVybDogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1N0cmluZyhmY21JbWFnZVVybCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfU0VUX0FORFJPSURfUFVTSF9DT05GSUdfTywgYGVycm9yTXNnOiBmY21JbWFnZVVybCB0eXBlIGlzIHN0cmluZywgdmFsdWU6ICR7ZmNtSW1hZ2VVcmx9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fYW5kcm9pZFB1c2hDb25maWcuZmNtSW1hZ2VVcmwgPSBmY21JbWFnZVVybDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva4gSE9OT1Ig5o6o6YCB57qn5YirXG4gICAqIExPVzog6LWE6K6v6JCl6ZSA57G75raI5oGv77yMTk9STUFMOiDmnI3liqHkuI7pgJrorq/nsbvmtojmga9cbiAgICovXG4gIHNldGltcG9ydGFuY2VIb25vcihpbXBvcnRhbmNlSG9ub3I6ICdOT1JNQUwnIHwgJ0xPVycpIHtcbiAgICBpZiAoaW1wb3J0YW5jZUhvbm9yICE9PSAnTE9XJyAmJiBpbXBvcnRhbmNlSG9ub3IgIT09ICdOT1JNQUwnKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX1NFVF9BTkRST0lEX1BVU0hfQ09ORklHX08sIGBlcnJvck1zZzogaW1wb3J0YW5jZUhvbm9yIHZhbHVlIGlzIE5PUk1BTHxMT1csIHZhbHVlOiAke2ltcG9ydGFuY2VIb25vcn1gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9hbmRyb2lkUHVzaENvbmZpZy5pbXBvcnRhbmNlSG9ub3IgPSBpbXBvcnRhbmNlSG9ub3I7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog6K6+572uIEhPTk9SIOaOqOmAgeaJgOS9v+eUqOeahOmAmuefpeWbvueJhyB1cmxcbiAgICovXG4gIHNldGltYWdlVXJsSG9ub3IoaW1hZ2VVcmxIb25vcjogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1N0cmluZyhpbWFnZVVybEhvbm9yKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19TRVRfQU5EUk9JRF9QVVNIX0NPTkZJR19PLCBgZXJyb3JNc2c6IGltYWdlVXJsSG9ub3IgdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2ltYWdlVXJsSG9ub3J9YCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fYW5kcm9pZFB1c2hDb25maWcuaW1hZ2VVcmxIb25vciA9IGltYWdlVXJsSG9ub3I7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog5p6E5bu6IElBbmRyb2lkUHVzaENvbmZpZ1xuPDw8PDw8PCBIRUFEXG49PT09PT09XG4gICAqIEByZXR1cm5zIElBbmRyb2lkUHVzaENvbmZpZyDlronljZPmjqjpgIHphY3nva7mlbDmja5cbiAgICog6L+U5Zue5YC86ZyA5Lyg5YWlIHN0YXJ0Q2FsbOOAgWludml0ZeOAgWhhbmd1cCDmlrnms5XnmoQgcHVzaENvbmZpZy5hbmRyb2lkQ29uZmlnIOS4rVxuPj4+Pj4+PiBkZXZlbG9wXG4gICAqL1xuICBidWlsZCgpOiBJQW5kcm9pZFB1c2hDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9hbmRyb2lkUHVzaENvbmZpZztcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQmFzaWNMb2dnZXIsIGdldFVVSUQsIElSdW50aW1lLCBpc0Jvb2xlYW4sIGlzTnVtYmVyLCBpc1N0cmluZywgaXNVbmRlZmluZWQsIG5vdEVtcHR5QXJyYXksIG5vdEVtcHR5U3RyaW5nLCBQbHVnaW5Db250ZXh0LCBSQ0Nvbm5lY3Rpb25TdGF0dXMsXG59IGZyb20gJ0Byb25nY2xvdWQvZW5naW5lJztcbmltcG9ydCB7IFJDUmVtb3RlVHJhY2ssIFJDUlRDQ29kZSwgZGV2aWNlIH0gZnJvbSAnQHJvbmdjbG91ZC9wbHVnaW4tcnRjJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNDb2RlIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzQ29kZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzTG9nZ2VyVGFnIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzTG9nZ2VyVGFnJztcbmltcG9ydCB7XG4gIFJDQ2FsbFBsdXNGcmFtZVJhdGUsXG4gIFJDQ2FsbFBsdXNSZXNvbHV0aW9uLFxuICBJQ2FsbFBsdXNFdmVudExpc3RlbmVyLFxuICBJQ2FsbFBsdXNJbml0T3B0cyxcbiAgSVN0YXR1c1JlcG9ydExpc3RlbmVyLFxuICBJUkNDYWxsUGx1c0dldENhbGxSZWNvcmRSZXMsXG4gIFJDQ2FsbFBsdXNDYWxsVXNlcixcbiAgUkNDYWxsUGx1c01lZGlhVHlwZSxcbiAgUkNDYWxsUGx1c1Nlc3Npb24sXG4gIFJDQ2FsbFBsdXNUeXBlLFxuICBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZSxcbiAgSUF1ZGlvQ29uZmlnLFxuICBJVmlkZW9Db25maWcsXG4gIFJDQ2FsbFBsdXNDYWxsU3RhdGUsXG4gIElSQ0NhbGxQbHVzQ2FsbFJlY29yZCxcbiAgSVJDQ2FsbFBsdXNQdXNoQ29uZmlnLFxufSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgUkNBdWRpb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9SQ0F1ZGlvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgUkNWaWRlb0NvbmZpZ0J1aWxkZXIgZnJvbSAnLi9SQ1ZpZGVvQ29uZmlnQnVpbGRlcic7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzUmVhc29uIH0gZnJvbSAnLi9lbnVtcy9SQ0NhbGxQbHVzUmVhc29uJztcbmltcG9ydCB7XG4gIGdldEJ5dGVMZW5ndGgsIGdldEhhbmd1cFN5c3RlbVN0YXRlLCBpc1N1cHBvcnRNZWRpYVNlcnZlciwgdmFsaWRhdGVCaXRyYXRlLCB2YWxpZGF0ZVB1c2hDb25maWcsIHZhbGlkYXRlVmlkZW9Ob2RlTmFtZSxcbn0gZnJvbSAnLi4vdXRpbHMvaGVscGVyJztcbmltcG9ydCBSQ0NhbGxQTHVzU3RhdGlzdGljcyBmcm9tICcuLi9tb2R1bGVzL1JDQ2FsbFBMdXNTdGF0aXN0aWNzJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnIH0gZnJvbSAnLi4vZW51bXMvUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcnO1xuaW1wb3J0IHtcbiAgSUhhbmd1cEZvckJ1c3lPcHRzLCBJTWVtYmVySW5mbyxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JUkNDYWxsQ2xpZW50JztcbmltcG9ydCB7IFJDQ2FsbEVuZ2luZSB9IGZyb20gJy4uL1JDQ2FsbEVuZ2luZSc7XG5pbXBvcnQgeyBSVENNb2R1bGUgfSBmcm9tICcuLi9tb2R1bGVzL1JUQ01vZHVsZSc7XG5pbXBvcnQgeyBGb3J3YXJkVHlwZSB9IGZyb20gJy4uL2VudW1zL0ZvcndhcmRUeXBlJztcbmltcG9ydCB7IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUgfSBmcm9tICcuLi9tb2R1bGVzL1JDQ2FsbFBsdXNSZXBvcnRNb2R1bGUnO1xuaW1wb3J0IHsgQ2FsbFNlcnZlckVycm9yQ29kZSB9IGZyb20gJy4uL2VudW1zL0NhbGxTZXJ2ZXJFcnJvckNvZGUnO1xuaW1wb3J0IFJDQ2FsbFBsdXNBbmRyb2lkUHVzaENvbmZpZ0J1aWxkZXIgZnJvbSAnLi9SQ0NhbGxQbHVzQW5kcm9pZFB1c2hDb25maWdCdWlsZGVyJztcbmltcG9ydCB7IE1BWF9FWFRSQV9CWVRFUyB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIFJDQ2FsbFBsdXNDbGllbnQge1xuICAvKipcbiAgICog5pGE5YOP5aS06YeH6ZuG6YWN572uXG4gICAqL1xuICBwcml2YXRlIF92aWRlb0NvbmZpZzogSVZpZGVvQ29uZmlnID0ge1xuICAgIHJlc29sdXRpb246IFJDQ2FsbFBsdXNSZXNvbHV0aW9uLlc2NDBfSDQ4MCxcbiAgICBmcmFtZVJhdGU6IFJDQ2FsbFBsdXNGcmFtZVJhdGUuRlBTXzE1LFxuICB9XG5cbiAgLyoqXG4gICAqIOm6puWFi+mjjumHh+mbhumFjee9rlxuICAgKi9cbiAgcHJpdmF0ZSBfYXVkaW9Db25maWc6IElBdWRpb0NvbmZpZyA9IHt9XG5cbiAgLyoqXG4gICAqIOe7n+iuoeWfi+eCueexu1xuICAgKi9cbiAgcHJpdmF0ZSBfY2FsbFBsdXNTdGF0aXN0aWNzOiBSQ0NhbGxQTHVzU3RhdGlzdGljc1xuXG4gIC8qKlxuICAgKiBjbGllbnQgY2FsbElkXG4gICAqL1xuICBwcml2YXRlIF9jbGllbnRDYWxsSWQ6IHN0cmluZyA9ICcnXG5cbiAgLyoqXG4gICAqIOaYr+WQpuS4uuS4u+WKqOaMguaWrVxuICAgKi9cbiAgcHJpdmF0ZSBfaXNMYXVuY2hIYW5ndXAgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiDlkbzlj6vov4fnqIvkuK3mjILmlq1cbiAgICovXG4gIHByaXZhdGUgX25lZWRIYW5ndXBDYWxsSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgcHJpdmF0ZSBfY2FsbEVuZ2luZTogUkNDYWxsRW5naW5lO1xuXG4gIHByaXZhdGUgX3J0Y01vZHVsZTogUlRDTW9kdWxlO1xuXG4gIC8qKlxuICAgKiDkuIrmiqXlupTnlKjlsYLkuovku7bmqKHlnZdcbiAgICovXG4gIF9yZXBvcnRBcHBFdmVudE1vZHVsZTogUkNDYWxsUGx1c1JlcG9ydE1vZHVsZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRleHQ6IFBsdWdpbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nZ2VyOiBCYXNpY0xvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lOiBJUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0T3B0czogSUNhbGxQbHVzSW5pdE9wdHMsXG4gICkge1xuICAgIHRoaXMuX3JlcG9ydEFwcEV2ZW50TW9kdWxlID0gbmV3IFJDQ2FsbFBsdXNSZXBvcnRNb2R1bGUoX2xvZ2dlcik7XG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzID0gbmV3IFJDQ2FsbFBMdXNTdGF0aXN0aWNzKHRoaXMuX2xvZ2dlciwgdGhpcy5fY29udGV4dCk7XG4gICAgLy8g5Yid5aeL5YyW54q25oCB5py65a6e5L6LXG4gICAgdGhpcy5fY2FsbEVuZ2luZSA9IG5ldyBSQ0NhbGxFbmdpbmUodGhpcy5fY29udGV4dCwgdGhpcy5fcnVudGltZSwgdGhpcy5faW5pdE9wdHMsIHRoaXMuX2xvZ2dlciwgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUpO1xuXG4gICAgdGhpcy5fcnRjTW9kdWxlID0gbmV3IFJUQ01vZHVsZSh0aGlzLl9jb250ZXh0LCB0aGlzLl9ydW50aW1lLCB0aGlzLl9pbml0T3B0cywgdGhpcy5fbG9nZ2VyLCB0aGlzLl9jYWxsRW5naW5lLCB0aGlzLl9yZXBvcnRBcHBFdmVudE1vZHVsZSk7XG5cbiAgICB0aGlzLl9ydGNNb2R1bGUub24oUlRDTW9kdWxlLl9fSU5ORVJfUlRDX1BST0NFU1NfRkFJTEVEX18sIHRoaXMuX3J0Y1Byb2Nlc3NGYWlsSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9SVENfUEVFUkNPTk5FQ1RJT05fQUJOT1JNQUxfQ0xPU0VfXywgdGhpcy5fcGVlckNvbm5lY3Rpb25BYm5vcm1hbENsb3NlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9PTl9TRUxGX0pPSU5FRF9fLCB0aGlzLl9zZWxmSm9pbmVkSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5vbihSVENNb2R1bGUuX19JTk5FUl9PTl9PVEhFUl9KT0lORURfXywgdGhpcy5fb3RoZXJKb2luZWRIYW5kbGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLm9uKFJUQ01vZHVsZS5fX0lOTkVSX1JFQ0VJVkVfRklSU1RfRlJBTUVfXywgdGhpcy5fcmVjZWl2ZUZpcnN0RnJhbWVIYW5kbGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLm9uKFJUQ01vZHVsZS5fX0lOTkVSX09OX0tJQ0tPRkZfXywgdGhpcy5fa2lja29mZkhhbmRsZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUub24oUlRDTW9kdWxlLl9fSU5ORVJfT05fREVWSUNFX0VOQUJMRV9DSEFOR0VfXywgdGhpcy5fcmVjZWl2ZURldmljZUVuYWJsZUNoYW5nZUhhbmRsZS5iaW5kKHRoaXMpKTtcblxuICAgIC8qKlxuICAgICAqIOmAmuivneW7uueri+WQju+8jFJUQyDmqKHlnZfpnIDlj5HluIPotYTmupBcbiAgICAgKi9cbiAgICB0aGlzLl9jYWxsRW5naW5lLm9uKFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ09OTkVDVF9fLCB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNvbm5lY3RlZC5iaW5kKHRoaXMuX3J0Y01vZHVsZSkpO1xuICAgIC8qKlxuICAgICAqIOmAmuivneaMguaWreWQju+8jFJUQyDmqKHlnZfpnIDpgIDlh7rmiL/pl7TjgIHlpITnkIblhoXlrZjmlbDmja5cbiAgICAgKi9cbiAgICB0aGlzLl9jYWxsRW5naW5lLm9uKFJDQ2FsbEVuZ2luZS5fX0lOTkVSX1NFU1NJT05fQ0xPU0VfXywgdGhpcy5fc2Vzc2lvbkNsb3NlSGFuZGxlLmJpbmQodGhpcykpO1xuICAgIC8qKlxuICAgICAqIOWkhOeQhiBSVEMg5qih5Z2X5aqS5L2T5Y2H6ZmN57qn6YC76L6RXG4gICAgICovXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5vbihSQ0NhbGxFbmdpbmUuX19JTk5FUl9DSEFOR0VfTUVESUFfVFlQRV9fLCB0aGlzLl9ydGNNb2R1bGUuY2hhbmdlTWVkaWFUeXBlLmJpbmQodGhpcy5fcnRjTW9kdWxlKSk7XG4gICAgLyoqXG4gICAgICog5pS25Yiw6YCa6K+d6YKA6K+35ZCO77yM6ZyA5LiK5oql5Z+L54K5XG4gICAgICovXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5vbihSQ0NhbGxFbmdpbmUuX19JTk5FUl9JTlZJVEVfXywgKG5ld1Nlc3Npb24sIGludml0ZVNvdXJjZSkgPT4ge1xuICAgICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzLnJlcG9ydFN0YXRpc3RpY3NEYXRhKFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfUkVDRUlWRV9DQUxMX1MsIFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsICtuZXcgRGF0ZSgpLCBuZXdTZXNzaW9uLCAnJywgaW52aXRlU291cmNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliqDmiL/pl7TjgIHlj5HluIPjgIHorqLpmIXlpLHotKXml7bpnIDnu5PmnZ/pgJror53vvIzlubbkuIrmiqXljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX3J0Y1Byb2Nlc3NGYWlsSGFuZGxlKHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCB0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmIChtYWluU2Vzc2lvbikge1xuICAgICAgY29uc3QgY2FsbElkID0gbWFpblNlc3Npb24uZ2V0Q2FsbElkKCk7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnN5c3RlbVN0YXR1c1VwKHtcbiAgICAgICAgY2FsbElkLFxuICAgICAgICBzeXNTdGF0dXM6IHN5c3RlbVN0YXRlLFxuICAgICAgICBmb3J3YXJkOiBGb3J3YXJkVHlwZS5DVVJSRU5ULFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9jYWxsUGx1c1N0YXRpc3RpY3MucmVwb3J0U3RhdGlzdGljc0RhdGEoUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19BQk5PUk1BTF9IQU5HVVBfUywgUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUywgK25ldyBEYXRlKCksIG1haW5TZXNzaW9uKTtcbiAgICAgIHRoaXMuX19pbm5lckhhbmd1cCh7IGNhbGxJZCwgc3lzdGVtU3RhdGUgfSwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJ0YyBwZWVyQ29ubmVjdGlvbiDlvILluLjmlq3lvIDml7bpnIDnu5PmnZ/pgJror53vvIzlubbkuIrmiqXljp/lm6BcbiAgICovXG4gIHByaXZhdGUgX3BlZXJDb25uZWN0aW9uQWJub3JtYWxDbG9zZSh0cmFjZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpO1xuICAgIGlmIChtYWluU2Vzc2lvbikge1xuICAgICAgLy8g5LiK5oql54q25oCB6K6p5a+55pa555+l6YGT6Ieq5bex56a75byA55qE5Y6f5ZugXG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnN5c3RlbVN0YXR1c1VwKHtcbiAgICAgICAgY2FsbElkOiBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKSxcbiAgICAgICAgc3lzU3RhdHVzOiBSQ0NhbGxQbHVzUmVhc29uLkNPTk5FQ1RJT05fRVJSLFxuICAgICAgICBmb3J3YXJkOiBGb3J3YXJkVHlwZS5DVVJSRU5ULFxuICAgICAgfSwgdHJhY2VJZCk7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLmVuZEN1cnJlbnRTZXNzaW9uKFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElPTl9FUlIsIG1haW5TZXNzaW9uLmdldENhbGxJZCgpLCB0cmFjZUlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5pys56uv5Yqg5YWlIFJUQyDmiL/pl7TvvIzpnIDmm7TmlrDmnKzkurogT05DQUxMIOeKtuaAge+8jOmHjeaWsOagoeaXtlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2VsZkpvaW5lZEhhbmRsZShjYWxsSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKTtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUub25DYWxsQ29ubmVjdGVkKHNlc3Npb24hKTtcblxuICAgIC8qKlxuICAgICAqIOabtOaWsOiHquW3seeahOeKtuaAgVxuICAgICAqL1xuICAgIGNvbnN0IHZpZGVvVHJhY2sgPSB0aGlzLl9ydGNNb2R1bGUuZ2V0TG9jYWxWaWRlb1RyYWNrKCk7XG4gICAgY29uc3QgYXVkaW9UcmFjayA9IHRoaXMuX3J0Y01vZHVsZS5nZXRMb2NhbEF1ZGlvVHJhY2soKTtcbiAgICBjb25zdCBjYW1lcmFFbmFibGUgPSB2aWRlb1RyYWNrID8gIXZpZGVvVHJhY2suaXNPd25lck11dGVkKCkgOiBmYWxzZTtcbiAgICBjb25zdCBtaWNyb3Bob25lRW5hYmxlID0gYXVkaW9UcmFjayA/ICFhdWRpb1RyYWNrLmlzT3duZXJNdXRlZCgpIDogZmFsc2U7XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLlZJREVPLCBjYW1lcmFFbmFibGUsIHRyYWNlSWQpO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh1c2VySWQsIFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8sIG1pY3JvcGhvbmVFbmFibGUsIHRyYWNlSWQpO1xuXG4gICAgY29uc3Qgc2VsZlN0YXRlID0gW1xuICAgICAge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIHVzZXJTdGF0ZTogUkNDYWxsUGx1c1Nlc3Npb25Vc2VyU3RhdGUuT05DQUxMLFxuICAgICAgICBzeXN0ZW1TdGF0ZTogUkNDYWxsUGx1c1JlYXNvbi5PTkNBTEwsXG4gICAgICAgIGNhbWVyYUVuYWJsZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZSxcbiAgICAgIH0sXG4gICAgXTtcbiAgICB0aGlzLl9jYWxsRW5naW5lLnVwZGF0ZVVzZXJzU3RhdGUoY2FsbElkLCBzZWxmU3RhdGUsIHRyYWNlSWQpO1xuXG4gICAgLy8g6YeN5paw5byA5aeL5qCh5pe26YC76L6RXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zdGFydFRpbWVDb3JyZWN0aW9uKHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOi/nOerr+S6uuWRmOWKoOWFpeaIv+mXtO+8jOabtOaWsOi/nOerr+S6uuWRmOeKtuaAgeWSjOmAmuivneeKtuaAgeS4uiBPTkNBTExcbiAgICovXG4gIHByaXZhdGUgX290aGVySm9pbmVkSGFuZGxlKGluZm86IElNZW1iZXJJbmZvW10sIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8vIOabtOaWsOWKoOWFpeaIv+mXtOS6uuWRmOeKtuaAgVxuICAgIGxldCBjYWxsSWQgPSAnJztcbiAgICBjb25zdCB1c2Vyc1N0YXRlID0gaW5mby5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNhbGxJZCA9IGl0ZW0uY2FsbElkO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcklkOiBpdGVtLnVzZXJJZCxcbiAgICAgICAgdXNlclN0YXRlOiBSQ0NhbGxQbHVzU2Vzc2lvblVzZXJTdGF0ZS5PTkNBTEwsXG4gICAgICAgIHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLk9OQ0FMTCxcbiAgICAgICAgY2FtZXJhRW5hYmxlOiBmYWxzZSxcbiAgICAgICAgbWljcm9waG9uZUVuYWJsZTogZmFsc2UsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUudXBkYXRlVXNlcnNTdGF0ZShjYWxsSWQsIHVzZXJzU3RhdGUsIHRyYWNlSWQpO1xuXG4gICAgLy8g5pyJ5Lq65Y+q5Yqg5oi/6Ze077yM5LiN5Y+R5rWB77yM5pWF5q2k5aSE5Lmf5pu05paw5Li6IENPTk5FQ1RFRFxuICAgIGlmICh0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0U3RhdGUoKSAhPT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUudXBkYXRlTWFpblNlc3Npb25TdGF0ZShSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOaUtuWIsOmmluW4p+S4iuaKpee7meS4muWKoeWxglxuICAgKi9cbiAgcHJpdmF0ZSBfcmVjZWl2ZUZpcnN0RnJhbWVIYW5kbGUodHJhY2VJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpPy5nZXRTdGF0ZSgpICE9PSBSQ0NhbGxQbHVzQ2FsbFN0YXRlLk9OQ0FMTCkge1xuICAgICAgdGhpcy5fY2FsbEVuZ2luZS51cGRhdGVNYWluU2Vzc2lvblN0YXRlKFJDQ2FsbFBsdXNDYWxsU3RhdGUuT05DQUxMKTtcbiAgICB9XG5cbiAgICAvLyDnu5kgQ2FsbFNlcnZlciDkuIrmiqXmtYHliLDovr5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnVwRmlyc3RGcmFtZVRpbWUodHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6KKr6Lii5Ye65oi/6Ze05pe277yM6ZyA57uT5p2f6YCa6K+dXG4gICAqL1xuICBwcml2YXRlIF9raWNrb2ZmSGFuZGxlKHN5c3RlbVN0YXRlOiBSQ0NhbGxQbHVzUmVhc29uLCByb29tSWQ6IHN0cmluZywgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICog5pys56uv572R57uc5pyJ6Zeu6aKY77yMcGluZyDlpLHotKXml7ZcbiAgICAgKi9cbiAgICBpZiAoc3lzdGVtU3RhdGUgPT09IFJDQ2FsbFBsdXNSZWFzb24uQ09OTkVDVElPTl9FUlIpIHtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuZW5kQ3VycmVudFNlc3Npb24oc3lzdGVtU3RhdGUsIHJvb21JZCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOiiq+acjeWKoeerr+i4ouWHuuaXtueahOWkhOeQhlxuICAgICAqL1xuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKG1haW5TZXNzaW9uKSB7XG4gICAgICBjb25zdCBjYWxsSWQgPSBtYWluU2Vzc2lvbi5nZXRDYWxsSWQoKTtcbiAgICAgIHRoaXMuX2NhbGxQbHVzU3RhdGlzdGljcy5yZXBvcnRTdGF0aXN0aWNzRGF0YShSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZy5MX1FTX0FCTk9STUFMX0hBTkdVUF9TLCBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCArbmV3IERhdGUoKSwgbWFpblNlc3Npb24sIHRoaXMuX2NsaWVudENhbGxJZCk7XG5cbiAgICAgIC8vIOS4iuaKpeeKtuaAgeebtOaOpeiuqeWvueaWueefpemBk+iHquW3seemu+W8gOeahOWOn+WboFxuICAgICAgdGhpcy5fY2FsbEVuZ2luZS5zeXN0ZW1TdGF0dXNVcCh7XG4gICAgICAgIGNhbGxJZCxcbiAgICAgICAgc3lzU3RhdHVzOiBzeXN0ZW1TdGF0ZSxcbiAgICAgICAgZm9yd2FyZDogRm9yd2FyZFR5cGUuQ1VSUkVOVCxcbiAgICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgICAvLyDnm7TmjqXnu5PmnZ/lt7HmlrnpgJror51cbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuZW5kQ3VycmVudFNlc3Npb24oc3lzdGVtU3RhdGUsIHJvb21JZCwgdHJhY2VJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOi/nOerr+i1hOa6kOmfs+inhumikeeKtuaAgeWPmOWMlu+8jOmcgOabtOaWsCBzZXNzaW9uIOS4reS6uuWRmOeahOiuvuWkh+eKtuaAgVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVjZWl2ZURldmljZUVuYWJsZUNoYW5nZUhhbmRsZSh0cmFja3M6IFJDUmVtb3RlVHJhY2tbXSwgdHJhY2VJZDogc3RyaW5nKSB7XG4gICAgdHJhY2tzLmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICBjb25zdCB1c2VySWQgPSB0cmFjay5nZXRVc2VySWQoKTtcbiAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IHRyYWNrLmlzQXVkaW9UcmFjaygpID8gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTyA6IFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU87XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodXNlcklkLCBtZWRpYVR5cGUsICF0cmFjay5pc093bmVyTXV0ZWQoKSwgdHJhY2VJZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5oyC5pat5pe277yM6ZyA5riF56m65YaF5a2Y77yM56a75byA5oi/6Ze0XG4gICAqL1xuICBwcml2YXRlIF9zZXNzaW9uQ2xvc2VIYW5kbGUoY2FsbElkOiBzdHJpbmcsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIC8qKlxuICAgICAqIOS7heWcqOiiq+WKqOaMguaWreaXtua4heepuuWIm+W7uueahOWuouaIt+erryBjYWxsSWTvvIxcbiAgICAgKiDkuI3lvbHlk43kuLvliqjlkbzlj6vlkI7mjILmlq3ml7bkuIrmiqUg5a6i5oi356uvIGNhbGxJZFxuICAgICAqL1xuICAgIGlmICghdGhpcy5faXNMYXVuY2hIYW5ndXApIHtcbiAgICAgIHRoaXMuX2NsaWVudENhbGxJZCA9ICcnO1xuICAgIH1cbiAgICB0aGlzLl9pc0xhdW5jaEhhbmd1cCA9IGZhbHNlO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ2xvc2UoY2FsbElkLCB0cmFjZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhozlupTnlKjlsYLkuovku7ZcbiAgICog5YyF5ZCr4oCc5pS25Yiw5ZG85Y+r44CB6YCa6K+d57uT5p2f44CB6YCa6K+d5Lq65ZGY54q25oCB5Y+Y5pu044CB6YCa6K+d57G75Z6L5Y+Y5pu04oCd562J5LqL5Lu2XG4gICAqIElDYWxsUGx1c0V2ZW50TGlzdGVuZXIg5a+56LGh6K+35Y+C6ICDIGFwaURvY1xuICAgKi9cbiAgc2V0Q2FsbFBsdXNFdmVudExpc3RlbmVyKGxpc3RlbmVyOiBJQ2FsbFBsdXNFdmVudExpc3RlbmVyKSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfRVZFTlRfTElTVEVORVJfTywgbGlzdGVuZXIgPyBPYmplY3Qua2V5cyhsaXN0ZW5lcikuam9pbignLCcpIDogbnVsbCk7XG4gICAgdGhpcy5fcmVwb3J0QXBwRXZlbnRNb2R1bGUucmVnaXN0ZXJFdmVudExpc3RlbmVyKGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDms6jlhozpn7Pop4bpopHkuIrkuIvooYzkuKLljIXmlbDmja7nm5HlkKxcbiAgICog5q+P56eS5LiK5oql5LiA5qyhXG4gICAqIEBwYXJhbSBsaXN0ZW5lciDnsbvlnovkuLogSVN0YXR1c1JlcG9ydExpc3RlbmVy77yM6K+m57uG5a6a5LmJ5Y+v5Y+C6ICDIGFwaURvY1xuICAgKiBAcGFyYW0gbGlzdGVuZXIub25TZW5kUGFja2V0TG9zcyAg5Y+R6YCB5Lii5YyF546H5L+h5oGv5Zue6LCDXG4gICAqIEBwYXJhbSBsaXN0ZW5lci5vblJlY2VpdmVQYWNrZXRMb3NzIOaOpeaUtuS4ouWMheeOh+S/oeaBr+Wbnuiwg1xuICAgKi9cbiAgc2V0U3RhdHVzUmVwb3J0TGlzdGVuZXIobGlzdGVuZXI6IElTdGF0dXNSZXBvcnRMaXN0ZW5lcikge1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1NUQVRVU19SRVBPUlRfTElTVEVORVJfTywgbGlzdGVuZXIgPyBPYmplY3Qua2V5cyhsaXN0ZW5lcikuam9pbignLCcpIDogbnVsbCk7XG4gICAgdGhpcy5fcnRjTW9kdWxlLnNldENhbGxQbHVzU3RhdHVzUmVwb3J0TGlzdGVuZXIobGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruimgeingueci+S6uuWRmCjljIXmi6zoh6rlt7Hlkozlr7nmlrkp55qE5aqS5L2T5pKt5pS+5ZmoXG4gICAqIEBwYXJhbSBsaXN0IOS4uuS4gOS4quWIl+ihqO+8jOWPr+S8oOWFpeWkmuS6uueahOWqkuS9k+aSreaUvuWZqFxuICAgKiBAcGFyYW0gaXRlbS51c2VySWQg55So5oi3IGlkXG4gICAqIEBwYXJhbSBpdGVtLnZpZGVvRWxlbWVudCDkuIDkuKogdmlkZW8g5YWD57Sg77yM55So5LqO5pKt5pS+6KeG6aKR77yM6ZyA6KaB5oyC6L295Zyo5Lia5Yqh5bGC6aG16Z2i5LiKXG4gICAqIEBwYXJhbSBpdGVtLmlzVGlueSDmmK/lkKbop4LnnIvliKvkurrnmoTlsI/mtYHvvIzlsI/nqpflj6Pml7blj6/ku6XphY3nva7kuLogdHJ1Ze+8jOWPr+iKguecgeW4puWuve+8jHVzZXJJZCDkuLrov5znq6/nlKjmiLfml7bmnInmlYhcbiAgICogQHJldHVybnMgY29kZSDov5Tlm57mmK/lkKborr7nva7miJDlip9cbiAgICovXG4gIHNldFZpZGVvVmlldyhsaXN0OiB7dXNlcklkOiBzdHJpbmcsIHZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCwgaXNUaW55PzogYm9vbGVhbn1bXSk6IHsgY29kZTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX1ZJRVdfVCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgbGlzdDogbGlzdC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyB1c2VySWQsIHZpZGVvRWxlbWVudCwgaXNUaW55IH0gPSBpdGVtO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBlbGVtZW50TmFtZTogdmlkZW9FbGVtZW50Py5ub2RlTmFtZSxcbiAgICAgICAgICBpc1RpbnksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmo4DmtYtcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5QXJyYXkobGlzdCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19WSUVXX1IsIGBwYXJhbXMgZXJyLCBsaXN0OiBub3QgZW1wdHkgYXJyYXksIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGxpc3QpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdCkge1xuICAgICAgY29uc3QgeyB1c2VySWQsIHZpZGVvRWxlbWVudCB9ID0gaXRlbTtcbiAgICAgIGlmICghbm90RW1wdHlTdHJpbmcodXNlcklkKSkge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fVklFV19SLCBgcGFyYW1zIGVyciwgdXNlcklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHt1c2VySWR9YCwgdHJhY2VJZCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghdmFsaWRhdGVWaWRlb05vZGVOYW1lKHZpZGVvRWxlbWVudCkpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX1ZJRVdfUiwgYHBhcmFtcyBlcnIsIHZpZGVvRWxlbWVudDogbmVlZCBhIHZpZGVvIGVsZW1lbnQsIHZhbHVlOiAke3ZpZGVvRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gdmlkZW9FbGVtZW50Lm5vZGVOYW1lIDogdmlkZW9FbGVtZW50fWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX1ZJRVdfUiwgJ3N1Y2NlcycsIHRyYWNlSWQpO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRWaWRlb1ZpZXcobGlzdCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWIoOmZpOafkOS4quS6uueahOWqkuS9k+aSreaUvuWZqFxuICAgKiDkuI3op4LnnIvmn5DkuKrkurrnmoTop4bpopHml7bvvIzkuJrliqHlsYLlj6/ku6Xnm7TmjqXnp7vpmaTlr7nlupTnmoQgdmlkZW8g5qCH562+77yMXG4gICAqIOiwgyByZW1vdmVWaWRlb1ZpZXcg5pa55rOV77yMU0RLIOWGhemDqOS8muWBnOatouaOpeaUtuWvueaWueeahOWqkuS9k+S8oOi+k1xuICAgKiBAcGFyYW0gdXNlcklkcyDnlKjmiLcgaWQg5YiX6KGoXG4gICAqIEByZXR1cm5zIGNvZGUg6L+U5Zue5piv5ZCm5Yig6Zmk5oiQ5YqfXG4gICAqL1xuICByZW1vdmVWaWRlb1ZpZXcodXNlcklkczogc3RyaW5nW10pOiB7IGNvZGU6IG51bWJlciB9IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFTU9WRV9WSURFT19WSUVXX1QsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHVzZXJJZHMsXG4gICAgfSksIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qOA5rWLXG4gICAgICovXG4gICAgaWYgKCEoXG4gICAgICBub3RFbXB0eUFycmF5KHVzZXJJZHMpXG4gICAgICAmJiB1c2VySWRzLmV2ZXJ5KCh1c2VySWQpID0+IG5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpXG4gICAgKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVNT1ZFX1ZJREVPX1ZJRVdfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZHM6IG5vdCBlbXB0eSBhcnJheSwgdXNlcklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeSh1c2VySWRzKX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRU1PVkVfVklERU9fVklFV19SLCAnc3VjY2VzJywgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9ydGNNb2R1bGUucmVtb3ZlVmlkZW9WaWV3KHVzZXJJZHMsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmkq3mlL7mjIflrprkurrlkZjnmoTpn7Pop4bpopHlqpLkvZNcbiAgICog5pKt5pS+5p+Q5Liq5Lq655qE6KeG6aKR5YmN77yM6K+356Gu5L+d5bey57uP6LCD55SoIGBzZXRWaWRlb1ZpZXdgIOaWueazleS4uuWFtuiuvue9ruinhumikeinhuWbvlxuICAgKiBAcGFyYW0gdXNlcklkIOaMh+Wumuimgeafpeeci+afkOS4quS6uueahOWqkuS9k+i1hOa6kFxuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOaMh+WumuaSreaUvumfs+mikei/mOaYr+inhumikVxuICAgKiBAcmV0dXJucyDov5Tlm57mmK/lkKbmkq3mlL7miJDlip9cbiAgICovXG4gIGFzeW5jIHBsYXlNZWRpYSh1c2VySWQ6IHN0cmluZywgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9QTEFZX01FRElBX1QsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHVzZXJJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICB9KSwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1BMQVlfTUVESUFfUiwgYHBhcmFtcyBlcnIsIHVzZXJJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7dXNlcklkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQoUkNDYWxsUGx1c01lZGlhVHlwZVttZWRpYVR5cGVdKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUExBWV9NRURJQV9SLCBgcGFyYW1zIGVyciwgbWVkaWFUeXBlIGlzIGlsbGVnYWwsIHZhbHVlOiAke21lZGlhVHlwZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5LiN5pKt5pS+6Ieq5bex55qE5aOw6Z+zXG4gICAgICovXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTyAmJiB1c2VySWQgPT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUExBWV9NRURJQV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIpOaWreS4muWKoeWxguaYr+WQpuiuvue9rui/h+W9k+WJjeS6uuWRmOeahOinhumikeinhuWbvlxuICAgICAqL1xuICAgIGNvbnN0IHsgdmlkZW9WaWV3IH0gPSB0aGlzLl9ydGNNb2R1bGUuZ2V0VXNlclZpZXdNYXAoKVt1c2VySWRdIHx8IHt9O1xuICAgIGlmIChtZWRpYVR5cGUgIT09IFJDQ2FsbFBsdXNNZWRpYVR5cGUuQVVESU8gJiYgIXZpZGVvVmlldykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUExBWV9NRURJQV9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5WSURFT19WSUVXX05PVF9TRVR9LCB2aWRlbyB2aWV3IG5vdCBzZXRgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlZJREVPX1ZJRVdfTk9UX1NFVCB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ydGNNb2R1bGUucGxheU1lZGlhKHVzZXJJZCwgbWVkaWFUeXBlLCB2aWRlb1ZpZXcsIHRyYWNlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuinhumikemFjee9ruaehOW7uuWZqFxuICAgKiBAcmV0dXJucyBSQ1ZpZGVvQ29uZmlnQnVpbGRlciDnlKjkuo7mnoTpgKDop4bpopHph4fpm4bml7bnmoTphY3nva7pobnvvIzlj6/ku6Xorr7nva7mkYTlg4/lpLTorr7lpIcgaWTjgIHluKfnjofjgIHliIbovqjnjofnrYnvvIxcbiAgICog6K6+572u5a6M6ZyA6LCDIGJ1aWxkIOaWueazle+8jOacgOe7iOWcqCBzZXRWaWRlb0NvbmZpZyDlkI7nlJ/mlYhcbiAgICovXG4gIGNyZWF0ZVZpZGVvQ29uZmlnQnVpbGRlcigpOiBSQ1ZpZGVvQ29uZmlnQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBSQ1ZpZGVvQ29uZmlnQnVpbGRlcih0aGlzLl9sb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9ruinhumikemFjee9rlxuICAgKiDkuIvmrKHph4fpm4bml7bnlJ/mlYjvvIzlpoLliIfmjaLmkYTlg4/lpLTjgIHph43mlrDlu7rnq4vpgJror51cbiAgICovXG4gIHNldFZpZGVvQ29uZmlnKGNmZzogSVZpZGVvQ29uZmlnKTogeyBjb2RlOiBudW1iZXIgfSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fQ09ORklHX1QsIEpTT04uc3RyaW5naWZ5KGNmZykpO1xuXG4gICAgY29uc3Qge1xuICAgICAgZnJhbWVSYXRlLCByZXNvbHV0aW9uLCBtYXhCaXRyYXRlLCBtaW5CaXRyYXRlLFxuICAgIH0gPSBjZmc7XG5cbiAgICBpZiAoIVJDQ2FsbFBsdXNGcmFtZVJhdGVbZnJhbWVSYXRlXSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19SLCBgcGFyYW0gZXJyb3IsIGZyYW1lUmF0ZSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHtmcmFtZVJhdGV9YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGlmICghUkNDYWxsUGx1c1Jlc29sdXRpb25bcmVzb2x1dGlvbl0pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9WSURFT19DT05GSUdfUiwgYHBhcmFtIGVycm9yLCByZXNvbHV0aW9uIGlzIGlsbGVnYWwsIHZhbHVlOiAke3Jlc29sdXRpb259YCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSwgZXJyb3JNc2cgfSA9IHZhbGlkYXRlQml0cmF0ZShtaW5CaXRyYXRlLCBtYXhCaXRyYXRlKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX1ZJREVPX0NPTkZJR19SLCBlcnJvck1zZyk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfVklERU9fQ09ORklHX1IsICdzdWNjZXNzJyk7XG4gICAgdGhpcy5fdmlkZW9Db25maWcgPSB7IC4uLmNmZyB9O1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRWaWRlb0NvbmZpZyh0aGlzLl92aWRlb0NvbmZpZyk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uumfs+mikemFjee9ruaehOW7uuWZqFxuICAgKiBAcmV0dXJucyBSQ0F1ZGlvQ29uZmlnQnVpbGRlciDnlKjkuo7mnoTpgKDpn7PpopHph4fpm4bml7bnmoTphY3nva7pobnvvIzlj6/ku6Xorr7nva7puqblhYvpo47orr7lpIcgaWRcbiAgICog6K6+572u5a6M6ZyA6LCDIGJ1aWxkIOaWueazle+8jOacgOe7iOWcqCBzZXRBdWRpb0NvbmZpZyDlkI7nlJ/mlYhcbiAgICovXG4gIGNyZWF0ZUF1ZGlvQ29uZmlnQnVpbGRlcigpOiBSQ0F1ZGlvQ29uZmlnQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBSQ0F1ZGlvQ29uZmlnQnVpbGRlcih0aGlzLl9sb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIm+W7uuWuieWNk+aOqOmAgeS/oeaBr+aehOW7uuWZqFxuICAgKiBAcmV0dXJucyBSQ0NhbGxQbHVzQW5kcm9pZFB1c2hDb25maWdCdWlsZGVyIOeUqOS6juaehOmAoOWuieWNk+aOqOmAgeS/oeeahOmFjee9rumhuVxuICAgKiDorr7nva7lrozpnIDosIMgYnVpbGQg5pa55rOV6I635Y+W6K6+572u55qEIGFuZHJvaWRQdXNoQ29uZmlnIOaVsOaNrlxuICAgKiDmnIDnu4jpnIDmioogYW5kcm9pZFB1c2hDb25maWcg5Lyg5YWlIHN0YXJ0Q2FsbOOAgWludml0ZeOAgWhhbmd1cCDmlrnms5XnmoQgcHVzaENvbmZpZy5hbmRyb2lkQ29uZmlnIOS4rVxuICAgKi9cbiAgY3JlYXRlQW5kcm9pZFB1c2hDb25maWdCdWlsZGVyKCk6IFJDQ2FsbFBsdXNBbmRyb2lkUHVzaENvbmZpZ0J1aWxkZXIge1xuICAgIHJldHVybiBuZXcgUkNDYWxsUGx1c0FuZHJvaWRQdXNoQ29uZmlnQnVpbGRlcih0aGlzLl9sb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9rumfs+mikemFjee9rlxuICAgKiDkuIvmrKHph4fpm4bml7bnlJ/mlYjvvIzlpoLph43mlrDlu7rnq4vpgJror51cbiAgICovXG4gIHNldEF1ZGlvQ29uZmlnKGNmZzogSUF1ZGlvQ29uZmlnKTogeyBjb2RlOiBudW1iZXIgfSB7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TRVRfQVVESU9fQ09ORklHX1QsIEpTT04uc3RyaW5naWZ5KGNmZykpO1xuICAgIGNvbnN0IHsgc2FtcGxlUmF0ZSwgbWluQml0cmF0ZSwgbWF4Qml0cmF0ZSB9ID0gY2ZnO1xuICAgIGlmIChzYW1wbGVSYXRlICYmICFpc051bWJlcihzYW1wbGVSYXRlKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SLCBgcGFyYW0gZXJyb3IsIHNhbXBsZVJhdGU6IHR5cGUgaXMgbnVtYmVyLCB2YWx1ZTogJHtzYW1wbGVSYXRlfWApO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGVycm9yTXNnIH0gPSB2YWxpZGF0ZUJpdHJhdGUobWluQml0cmF0ZSwgbWF4Qml0cmF0ZSk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NFVF9BVURJT19DT05GSUdfUiwgZXJyb3JNc2cpO1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU0VUX0FVRElPX0NPTkZJR19SLCAnc3VjY2VzcycpO1xuXG4gICAgdGhpcy5fYXVkaW9Db25maWcgPSB7IC4uLmNmZyB9O1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRBdWRpb0NvbmZpZyh0aGlzLl9hdWRpb0NvbmZpZyk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPkei1t+WRvOWPq1xuICAgKiBAcGFyYW0gdXNlcklkcyDooqvlj6vkurrlkZggdXNlcklkIOWIl+ihqO+8jOWNleS6uuWRvOWPq+S7hemcgOWcqOaVsOe7hOS4reaUvue9ruWvueaWueS4gOS6uueahCB1c2VySWRcbiAgICogQHBhcmFtIHR5cGUg5Y2V5Lq65ZG85Y+rIG9yIOWkmuS6uuWRvOWPq1xuICAgKiBAcGFyYW0gbWVkaWFUeXBlIOmAmuivneWqkuS9k+exu+Weizog6Z+z6aKRIG9yIOmfs+inhumikVxuICAgKiBAcGFyYW0gcHVzaENvbmZpZyDnp7vliqjnq6/mjqjpgIHkv6Hmga9cbiAgICogQHBhcmFtIGV4dHJhIOmZhOWKoOS/oeaBr++8jOS8mumAj+S8oOe7meiiq+WRvOWPq+aWuVxuICAgKiBAcmV0dXJucyBjYWxsSWQg5ZG85Y+r5oiQ5Yqf5ZCO77yM5Lqn55Sf55qE5Lya6K+dIGlkXG4gICAqL1xuICBhc3luYyBzdGFydENhbGwodXNlcklkczogc3RyaW5nW10sIGNhbGxUeXBlOiBSQ0NhbGxQbHVzVHlwZSA9IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSwgbWVkaWFUeXBlOiBSQ0NhbGxQbHVzTWVkaWFUeXBlID0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJT19WSURFTywgcHVzaENvbmZpZz86IElSQ0NhbGxQbHVzUHVzaENvbmZpZywgZXh0cmE/OiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyLCBjYWxsSWQ/OiBzdHJpbmcgfT4ge1xuICAgIHRoaXMuX2NsaWVudENhbGxJZCA9IGdldFVVSUQoKTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfVCwgYHVzZXJJZHM6ICR7dXNlcklkcy5qb2luKCcsJyl9LCBjYWxsVHlwZTogJHtjYWxsVHlwZX0sIG1lZGlhVHlwZTogJHttZWRpYVR5cGV9LCBwdXNoQ29uZmlnOiAke3B1c2hDb25maWd9LCBleHRyYTogJHtleHRyYX1gLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9jb250ZXh0LmdldENvbm5lY3Rpb25TdGF0dXMoKSAhPT0gUkNDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU0lHTkFMX0RJU0NPTk5FQ1RFRCB9O1xuICAgIH1cblxuICAgIGNvbnN0IG5hdmlJbmZvID0gdGhpcy5fY29udGV4dC5nZXROYXZpSW5mbygpO1xuICAgIGlmICghbmF2aUluZm8gfHwgIWlzU3VwcG9ydE1lZGlhU2VydmVyKG5hdmlJbmZvKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlJUQ19TRVJWSUNFX1VOQVZBSUxBQkxFIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCEoXG4gICAgICBub3RFbXB0eUFycmF5KHVzZXJJZHMpXG4gICAgICAmJiB1c2VySWRzLmV2ZXJ5KCh1c2VySWQpID0+IG5vdEVtcHR5U3RyaW5nKHVzZXJJZCkpXG4gICAgKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgdXNlcklkczogbm90IGVtcHR5IGFycmF5LCB1c2VySWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQoUkNDYWxsUGx1c1R5cGVbY2FsbFR5cGVdKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgY2FsbFR5cGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7Y2FsbFR5cGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGlmIChpc1VuZGVmaW5lZChSQ0NhbGxQbHVzTWVkaWFUeXBlW21lZGlhVHlwZV0pKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGBwYXJhbXMgZXJyLCBtZWRpYVR5cGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7bWVkaWFUeXBlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAocHVzaENvbmZpZykge1xuICAgICAgY29uc3QgcmVzID0gdmFsaWRhdGVQdXNoQ29uZmlnKHB1c2hDb25maWcpO1xuICAgICAgaWYgKHJlcy5jb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHBhcmFtcyBlcnIsIHB1c2hDb25maWcgaXMgaWxsZWdhbCwgbXNnOiAke3Jlcy5lcnJvck1zZ31gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXh0cmEpIHtcbiAgICAgIGlmICghaXNTdHJpbmcoZXh0cmEpKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYHBhcmFtcyBlcnIsIGV4dHJhIGlzIGlsbGVnYWwsIHZhbHVlOiAke2V4dHJhfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0Qnl0ZUxlbmd0aChleHRyYSkgPiBNQVhfRVhUUkFfQllURVMpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCAncGFyYW1zIGVyciwgZXh0cmEgbWF4IHNpemUgaXMgMTI4S0InLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDljZXogYogdXNlcklkcyDplb/luqbkuI3og73otoXov4cgMVxuICAgICAqL1xuICAgIGlmICh1c2VySWRzLmxlbmd0aCA+IDEgJiYgY2FsbFR5cGUgPT09IFJDQ2FsbFBsdXNUeXBlLlNJTkdMRSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgcGFyYW1zIGVyciwgWW91IGNhbiBvbmx5IGNhbGwgb25lIHBlcnNvbiBpbiBhIHNpbmdsZSBjYWxsLCB1c2VySWRzOiAke3VzZXJJZHMuam9pbignLCcpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvLyDlt7LlrZjlnKggc2Vzc2lvbiDkuI3lhYHorrjlho3lj5Hotbflkbzlj6tcbiAgICBpZiAodGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU0VTU0lPTl9FWElTVH0sIHNlc3Npb24gZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNFU1NJT05fRVhJU1QgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpn7Pop4bpopHpgJror53vvIzpnIDmj5DliY3ph4fpm4bpn7Pop4bpopHotYTmupBcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICAgIGlmIChnZXRNZWRpYVRyYWNrc0NvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgYGNyZWF0ZSBtZWlkYSB0cmFja3MgZXJyb3IgY29kZTogJHtnZXRNZWRpYVRyYWNrc0NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBnZXRNZWRpYVRyYWNrc0NvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuc3RhcnRDYWxsKHtcbiAgICAgIHRvVXNlcnM6IHVzZXJJZHMubWFwKCh1c2VySWQpID0+ICh7IHVzZXJJZCB9KSksXG4gICAgICBjYWxsVHlwZSxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICAgIGNhbGxJZDogdGhpcy5fY2xpZW50Q2FsbElkLFxuICAgICAgcHVzaENvbmZpZyxcbiAgICAgIGV4dHJhOiBKU09OLnN0cmluZ2lmeSh7IHVzZXJJZDogdGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgZXh0cmEgfSksXG4gICAgfSwgdHJhY2VJZCk7XG5cbiAgICB0aGlzLl9jYWxsUGx1c1N0YXRpc3RpY3MucmVwb3J0U3RhdGlzdGljc0RhdGEoUkNDYWxsUGx1c1N0YXRpc3RpY3NUYWcuTF9RU19TVEFSVF9DQUxMX1MsIGNvZGUsIHN0YXJ0VGltZSwgbnVsbCwgdGhpcy5fY2xpZW50Q2FsbElkLCBudWxsLCB7IG1lZGlhVHlwZSwgY2FsbFR5cGUsIGNhbGxJZDogZGF0YT8uY2FsbElkIHx8ICcnIH0pO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX3J0Y01vZHVsZS5kZXN0cm95QWxsVHJhY2tzKHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FMTF9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlkbzlj6vov4fnqIvkuK3mjILmlq1cbiAgICAgKi9cbiAgICBjb25zdCB7IGNhbGxJZCwgY2xpZW50Q2FsbElkIH0gPSBkYXRhITtcbiAgICBpZiAodGhpcy5fbmVlZEhhbmd1cENhbGxJZCA9PT0gY2xpZW50Q2FsbElkKSB7XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLmNsZWFyQWxsVGltZXIoY2FsbElkLCB0cmFjZUlkKTtcbiAgICAgIHRoaXMuX2NhbGxFbmdpbmUuaGFuZ3VwKHsgY2FsbElkIH0sIHRyYWNlSWQpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQUxMX1IsIGB0aGUgJHtjYWxsSWR9IGNhbGwgaGFzIGJlZW4gaGFuZ3VwYCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgaWYgKGNhbGxUeXBlID09PSBSQ0NhbGxQbHVzVHlwZS5NVUxUSSkge1xuICAgICAgYXdhaXQgdGhpcy5fcnRjTW9kdWxlLnNlc3Npb25Db25uZWN0ZWQoY2FsbElkLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX0NBTExfUiwgSlNPTi5zdHJpbmdpZnkoeyBkYXRhLCBjb2RlIH0pLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLCBjYWxsSWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnm7TmjqXliqDlhaXov5vooYzkuK3nmoTnvqTnu4TpgJror51cbiAgICogQHBhcmFtIGNhbGxJZCDpgJror50gaWRcbiAgICovXG4gIGFzeW5jIGpvaW5NdWx0aUNhbGwoY2FsbElkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9ULCBgY2FsbElkOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9jb250ZXh0LmdldENvbm5lY3Rpb25TdGF0dXMoKSAhPT0gUkNDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNJR05BTF9ESVNDT05ORUNURUR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVEIH07XG4gICAgfVxuXG4gICAgY29uc3QgbmF2aUluZm8gPSB0aGlzLl9jb250ZXh0LmdldE5hdmlJbmZvKCk7XG4gICAgaWYgKCFuYXZpSW5mbyB8fCAhaXNTdXBwb3J0TWVkaWFTZXJ2ZXIobmF2aUluZm8pKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPguaVsOagoemqjFxuICAgICAqL1xuICAgIGlmICghbm90RW1wdHlTdHJpbmcoY2FsbElkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBwYXJhbXMgZXJyLCBjYWxsSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlOiBnZXRTZXNzaW9uQ29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRDYWxsU2Vzc2lvbih7IGNhbGxJZCB9LCB0cmFjZUlkKTtcbiAgICBpZiAoZ2V0U2Vzc2lvbkNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0pPSU5fTVVMVElfQ0FMTF9SLCBgZ2V0IGNhbGwgZGF0YSBlcnJvciwgY29kZTogJHtnZXRTZXNzaW9uQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IGdldFNlc3Npb25Db2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBtZWRpYVR5cGUgfSA9IGRhdGEhO1xuXG4gICAgY29uc3QgbWFpblNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgICBpZiAobWFpblNlc3Npb24gJiYgbWFpblNlc3Npb24uZ2V0Q2FsbElkKCkgIT09IGNhbGxJZCkge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU0VTU0lPTl9FWElTVCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmfs+inhumikemAmuivne+8jOmcgOaPkOWJjemHh+mbhumfs+inhumikei1hOa6kFxuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZTogZ2V0TWVkaWFUcmFja3NDb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuY3JlYXRlQ2FsbE1lZGlhVHJhY2tzKG1lZGlhVHlwZSwgdHJhY2VJZCk7XG4gICAgaWYgKGdldE1lZGlhVHJhY2tzQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSk9JTl9NVUxUSV9DQUxMX1IsIGBjcmVhdGUgbWVpZGEgdHJhY2tzIGVycm9yIGNvZGU6ICR7Z2V0TWVkaWFUcmFja3NDb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogZ2V0TWVkaWFUcmFja3NDb2RlIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmpvaW5DYWxsKHtcbiAgICAgIGNhbGxJZCxcbiAgICAgIG1lZGlhVHlwZSxcbiAgICB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fcnRjTW9kdWxlLmRlc3Ryb3lBbGxUcmFja3ModHJhY2VJZCk7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9KT0lOX01VTFRJX0NBTExfUiwgYGNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuU1VDQ0VTU31gLCB0cmFjZUlkKTtcbiAgICBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNvbm5lY3RlZChjYWxsSWQsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpgJror53kuK3pgoDor7fku5bkurpcbiAgICog5Y2V5Lq66YCa6K+d5Lit6YKA6K+35LuW5Lq65Lya5byV5Y+R6YCa6K+d57G75Z6L5Y+Y5pu0XG4gICAqIEBwYXJhbSB1c2VySWRzIOiiq+mCgOivt+S6uuWIl+ihqFxuICAgKiBAcGFyYW0gcHVzaENvbmZpZyDnp7vliqjnq6/mjqjpgIHkv6Hmga9cbiAgICogQHBhcmFtIGV4dHJhIOmZhOWKoOS/oeaBr++8jOS8mumAj+S8oOe7meiiq+mCgOivt+aWuVxuICAgKiBAcmV0dXJucyBidXN5VXNlcnMg6L+U5Zue5b+Z57q/5Lq65ZGY5YiX6KGoXG4gICAqL1xuICBhc3luYyBpbnZpdGUodXNlcklkczogc3RyaW5nW10sIHB1c2hDb25maWc/OiBJUkNDYWxsUGx1c1B1c2hDb25maWcsIGV4dHJhPzogc3RyaW5nKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgYnVzeVVzZXJzPzogUkNDYWxsUGx1c0NhbGxVc2VyW10gfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1QsIGBjYWxsSWQ6ICR7dXNlcklkcy5qb2luKCcsJyl9LCBwdXNoQ29uZmlnOiAke3B1c2hDb25maWd9LCBleHRyYTogJHtleHRyYX1gLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOWPguaVsOagoemqjFxuICAgICAqL1xuICAgIGlmICghKFxuICAgICAgbm90RW1wdHlBcnJheSh1c2VySWRzKVxuICAgICAgJiYgdXNlcklkcy5ldmVyeSgodXNlcklkKSA9PiBub3RFbXB0eVN0cmluZyh1c2VySWQpKVxuICAgICkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9SLCBgcGFyYW1zIGVyciwgdXNlcklkczogbm90IGVtcHR5IGFycmF5LCB1c2VySWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KHVzZXJJZHMpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAocHVzaENvbmZpZykge1xuICAgICAgY29uc3QgcmVzID0gdmFsaWRhdGVQdXNoQ29uZmlnKHB1c2hDb25maWcpO1xuICAgICAgaWYgKHJlcy5jb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9SLCBgcGFyYW1zIGVyciwgcHVzaENvbmZpZyBpcyBpbGxlZ2FsLCBtc2c6ICR7cmVzLmVycm9yTXNnfWAsIHRyYWNlSWQpO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChleHRyYSkge1xuICAgICAgaWYgKCFpc1N0cmluZyhleHRyYSkpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSU5WSVRFX1IsIGBwYXJhbXMgZXJyLCBleHRyYSBpcyBpbGxlZ2FsLCB2YWx1ZTogJHtleHRyYX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdldEJ5dGVMZW5ndGgoZXh0cmEpID4gTUFYX0VYVFJBX0JZVEVTKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9SLCAncGFyYW1zIGVyciwgZXh0cmEgbWF4IHNpemUgaXMgMTI4S0InLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj5HotbfpgoDor7dcbiAgICAgKi9cbiAgICBjb25zdCB7IGNvZGUsIGRhdGEgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuaW52aXRlKHtcbiAgICAgIHRvVXNlcnM6IHVzZXJJZHMubWFwKCh1c2VySWQpID0+ICh7XG4gICAgICAgIHVzZXJJZCxcbiAgICAgIH0pKSxcbiAgICAgIHB1c2hDb25maWcsXG4gICAgICBleHRyYTogSlNPTi5zdHJpbmdpZnkoeyB1c2VySWQ6IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIGV4dHJhIH0pLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0lOVklURV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICBjb25zdCBidXN5VXNlcnMgPSBbXTtcbiAgICBpZiAoZGF0YSEuYnVzeWxpbmVVc2Vycz8ubGVuZ3RoKSB7XG4gICAgICBidXN5VXNlcnMucHVzaCguLi5kYXRhIS5idXN5bGluZVVzZXJzLm1hcCgodXNlcikgPT4gKHtcbiAgICAgICAgdXNlcklkOiB1c2VyLnVzZXJJZCxcbiAgICAgICAgc3RhdGU6IHVzZXIuc2Vzc2lvblN0YXR1cyxcbiAgICAgIH0pKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9JTlZJVEVfUiwgYHN1Y2Nlc3MgYnVzeVVzZXJzOiAke0pTT04uc3RyaW5naWZ5KGJ1c3lVc2Vycyl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICBidXN5VXNlcnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmjqXlkKzpgJror51cbiAgICogQHBhcmFtIGNhbGxJZCDpgJror50gaWRcbiAgICogQHBhcmFtIHB1c2hDb25maWcg56e75Yqo56uv5o6o6YCB5L+h5oGvXG4gICAqL1xuICBhc3luYyBhY2NlcHQoY2FsbElkOiBzdHJpbmcsIHB1c2hDb25maWc/OiBJUkNDYWxsUGx1c1B1c2hDb25maWcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9ULCBgY2FsbElkOiAke2NhbGxJZH0sIHB1c2hDb25maWc6ICR7cHVzaENvbmZpZ31gLCB0cmFjZUlkKTtcblxuICAgIGlmICh0aGlzLl9jb250ZXh0LmdldENvbm5lY3Rpb25TdGF0dXMoKSAhPT0gUkNDb25uZWN0aW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLlNJR05BTF9ESVNDT05ORUNURUR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TSUdOQUxfRElTQ09OTkVDVEVEIH07XG4gICAgfVxuXG4gICAgY29uc3QgbmF2aUluZm8gPSB0aGlzLl9jb250ZXh0LmdldE5hdmlJbmZvKCk7XG4gICAgaWYgKCFuYXZpSW5mbyB8fCAhaXNTdXBwb3J0TWVkaWFTZXJ2ZXIobmF2aUluZm8pKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYGVyckNvZGU6ICR7UkNDYWxsUGx1c0NvZGUuUlRDX1NFUlZJQ0VfVU5BVkFJTEFCTEV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5SVENfU0VSVklDRV9VTkFWQUlMQUJMRSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPguaVsOagoemqjFxuICAgICAqL1xuICAgIGlmICghbm90RW1wdHlTdHJpbmcoY2FsbElkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBwYXJhbXMgZXJyLCBjYWxsSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKHB1c2hDb25maWcpIHtcbiAgICAgIGNvbnN0IHJlcyA9IHZhbGlkYXRlUHVzaENvbmZpZyhwdXNoQ29uZmlnKTtcbiAgICAgIGlmIChyZXMuY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYHBhcmFtcyBlcnIsIHB1c2hDb25maWcgaXMgaWxsZWdhbCwgbXNnOiAke3Jlcy5lcnJvck1zZ31gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmmK/lkKblrZjlnKjpgJror51cbiAgICAgKiDpnIDku47lvZPliY3pgJror53ojrflj5YgbWVpZGFUeXBlXG4gICAgICovXG4gICAgY29uc3QgbWFpblNlc3Npb24gPSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKTtcbiAgICBjb25zdCBob2xkU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0SG9sZFNlc3Npb24oY2FsbElkKTtcbiAgICBpZiAoIW1haW5TZXNzaW9uICYmICFob2xkU2Vzc2lvbikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQUNDRVBUX1IsIGBlcnJDb2RlIDogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTH0sIHNlc3Npb24gbm90IGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWMuuWIhuaOpeWQrCBtYWluU2Vzc2lvbiDlkowgaG9sZFNlc3Npb25cbiAgICAgKiDlpoLmnpzmjqXlkKwgaG9sZFNlc3Npb27vvIzpnIDlhYjmjILmlq0gbWFpblNlc3Npb25cbiAgICAgKi9cbiAgICBjb25zdCBpc0FjY2VwdEhvbGRTZXNzaW9uID0gY2FsbElkID09PSBob2xkU2Vzc2lvbj8uZ2V0Q2FsbElkKCk7XG4gICAgaWYgKGlzQWNjZXB0SG9sZFNlc3Npb24pIHtcbiAgICAgIGNvbnN0IHsgY29kZTogaGFuZ3VwTWFpblNlc3Npb25Db2RlIH0gPSBhd2FpdCB0aGlzLmhhbmd1cChtYWluU2Vzc2lvbiEuZ2V0Q2FsbElkKCkpO1xuICAgICAgaWYgKGhhbmd1cE1haW5TZXNzaW9uQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYGhhbmd1cCBtYWluU2Vzc2lvbiBlcnJvciBjb2RlOiAke2hhbmd1cE1haW5TZXNzaW9uQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogaGFuZ3VwTWFpblNlc3Npb25Db2RlIH07XG4gICAgICB9XG4gICAgICB0aGlzLl9jYWxsRW5naW5lLnVwZ3JhZGVNYWluU2Vzc2lvbihjYWxsSWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmfs+inhumikemAmuivne+8jOmcgOaPkOWJjemHh+mbhumfs+inhumikei1hOa6kFxuICAgICAqL1xuICAgIGNvbnN0IG1lZGlhVHlwZSA9IG1haW5TZXNzaW9uIS5nZXRNZWRpYVR5cGUoKTtcbiAgICBjb25zdCB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmNyZWF0ZUNhbGxNZWRpYVRyYWNrcyhtZWRpYVR5cGUsIHRyYWNlSWQpO1xuICAgIGlmIChnZXRNZWRpYVRyYWNrc0NvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0FDQ0VQVF9SLCBgY3JlYXRlIG1laWRhIHRyYWNrcyBlcnJvciBjb2RlOiAke2dldE1lZGlhVHJhY2tzQ29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IGdldE1lZGlhVHJhY2tzQ29kZSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPkei1t+aOpeWQrFxuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5hY2NlcHQoe1xuICAgICAgY2FsbElkLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzLnJlcG9ydFN0YXRpc3RpY3NEYXRhKFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfQUNDRVBUX0NBTExfUywgY29kZSwgc3RhcnRUaW1lLCBtYWluU2Vzc2lvbik7XG5cbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fcnRjTW9kdWxlLmRlc3Ryb3lBbGxUcmFja3ModHJhY2VJZCk7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9BQ0NFUFRfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2Vzc2lvbkNvbm5lY3RlZChjYWxsSWQsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX19pbm5lckhhbmd1cChvcHRzOiBJSGFuZ3VwRm9yQnVzeU9wdHMsIHRyYWNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgY2FsbElkIH0gPSBvcHRzO1xuXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRJc0xvY2FsQ2xpZW50SGFuZ3VwKHRydWUpO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUuY2xlYXJBbGxUaW1lcihjYWxsSWQsIHRyYWNlSWQpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmhhbmd1cChvcHRzLCB0cmFjZUlkKTtcblxuICAgIGlmIChjb2RlID09PSBDYWxsU2VydmVyRXJyb3JDb2RlLkNBTExfTk9UX0VYSVNUKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgJiYgY2FsbElkID09PSB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0Q2FsbElkKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5zZXNzaW9uQ2xvc2UoY2FsbElkLCB0cmFjZUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlIH07XG4gIH1cblxuICAvKipcbiAgICog5oyC5pat6YCa6K+dXG4gICAqIEBwYXJhbSBjYWxsSWQg5Li65Y+v6YCJ5Y+C5pWw77yM5LiN5Lyg5pe277yM5oyC5pat5q2j5Zyo6L+b6KGM55qE5Li7IHNlc3Npb27vvIzkvKDlhaXml7blj6/mjIflrprmjILmlq3kuLvpgJror53miJbmmoLmnKrlu7rnq4vov57mjqXnmoTpgJror51cbiAgICogQHBhcmFtIHB1c2hDb25maWcg56e75Yqo56uv5o6o6YCB5L+h5oGvXG4gICAqIOaaguacquW7uueri+i/nuaOpeeahOmAmuivne+8muaMh+W3suWcqOmAmuivneS4reaXtu+8jOaUtuWIsOWRvOWPq+S9huaaguacquaOpeWQrOeahOmAmuivnVxuICAgKiBAcGFyYW0gcHVzaENvbmZpZyDnp7vliqjnq6/mjqjpgIHkv6Hmga9cbiAgICovXG4gIGFzeW5jIGhhbmd1cChjYWxsSWQ/OiBzdHJpbmcsIHB1c2hDb25maWc/OiBJUkNDYWxsUGx1c1B1c2hDb25maWcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSArbmV3IERhdGUoKTtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9ULCBgY2FsbElkOiAke2NhbGxJZH0sIHB1c2hDb25maWc6ICR7cHVzaENvbmZpZ31gLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IG1haW5TZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKCFtYWluU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDnsbvlnovmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoY2FsbElkICYmICFpc1N0cmluZyhjYWxsSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZDogdHlwZSBpcyBzdHJpbmcsIHZhbHVlOiAke2NhbGxJZH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlBBUkFNX0VSUk9SIH07XG4gICAgfVxuXG4gICAgaWYgKHB1c2hDb25maWcpIHtcbiAgICAgIGNvbnN0IHJlcyA9IHZhbGlkYXRlUHVzaENvbmZpZyhwdXNoQ29uZmlnKTtcbiAgICAgIGlmIChyZXMuY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgYHBhcmFtcyBlcnIsIHB1c2hDb25maWcgaXMgaWxsZWdhbCwgbXNnOiAke3Jlcy5lcnJvck1zZ31gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtYWluU2Vzc2lvbkNhbGxJZCA9IG1haW5TZXNzaW9uLmdldENhbGxJZCgpO1xuXG4gICAgLyoqXG4gICAgICog5qCh6aqM5Lyg5YWl55qEIGNhbGxJZCDmmK/lkKbmraPnoa5cbiAgICAgKi9cbiAgICBpZiAoY2FsbElkICYmIGNhbGxJZCAhPT0gbWFpblNlc3Npb25DYWxsSWQgJiYgIXRoaXMuX2NhbGxFbmdpbmUuZ2V0SG9sZFNlc3Npb24oY2FsbElkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfSEFOR1VQX1IsIGBwYXJhbXMgZXJyLCBjYWxsSWQgaXMgaW52YWxpZCwgdmFsdWU6ICR7Y2FsbElkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuQ0FMTF9JRF9JTlZBTElEIH07XG4gICAgfVxuXG4gICAgdGhpcy5faXNMYXVuY2hIYW5ndXAgPSB0cnVlO1xuXG4gICAgdGhpcy5fbmVlZEhhbmd1cENhbGxJZCA9IGNhbGxJZCB8fCBtYWluU2Vzc2lvbkNhbGxJZDtcbiAgICBjb25zdCBob2xkU2Vzc2lvbiA9IHRoaXMuX2NhbGxFbmdpbmUuZ2V0SG9sZFNlc3Npb24odGhpcy5fbmVlZEhhbmd1cENhbGxJZCk7XG4gICAgY29uc3QgaGFuZ3VwU2Vzc2lvbiA9IGhvbGRTZXNzaW9uIHx8IG1haW5TZXNzaW9uO1xuXG4gICAgLyoqXG4gICAgICog6I635Y+W5oyC5pat5pe255qE5Lq65ZGY57O757uf54q25oCBXG4gICAgICovXG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCk7XG4gICAgY29uc3QgdXNlclN0YXRlID0gbWFpblNlc3Npb24uZ2V0VXNlckxpc3QoKS5maWx0ZXIoKHVzZXJJbmZvKSA9PiB1c2VySW5mby51c2VySWQgPT09IGN1cnJlbnRVc2VySWQpWzBdLnN0YXRlO1xuICAgIGNvbnN0IGlzQ2FsbGVlID0gW21haW5TZXNzaW9uLmdldENyZWF0b3JVc2VySWQoKSwgbWFpblNlc3Npb24uZ2V0SW52aXRlclVzZXJJZCgpXS5pbmNsdWRlcyhjdXJyZW50VXNlcklkKTtcbiAgICBjb25zdCBzeXN0ZW1TdGF0ZSA9IGdldEhhbmd1cFN5c3RlbVN0YXRlKHVzZXJTdGF0ZSwgaXNDYWxsZWUpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9faW5uZXJIYW5ndXAoe1xuICAgICAgY2FsbElkOiB0aGlzLl9uZWVkSGFuZ3VwQ2FsbElkLFxuICAgICAgc3lzdGVtU3RhdGUsXG4gICAgICBwdXNoQ29uZmlnLFxuICAgIH0sIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5LiK5oql5oyC5pat5Z+L54K55pWw5o2uXG4gICAgICovXG4gICAgdGhpcy5fY2FsbFBsdXNTdGF0aXN0aWNzLnJlcG9ydFN0YXRpc3RpY3NEYXRhKFJDQ2FsbFBsdXNTdGF0aXN0aWNzVGFnLkxfUVNfSEFOR1VQX0NBTExfUywgY29kZSwgc3RhcnRUaW1lLCBoYW5ndXBTZXNzaW9uLCB0aGlzLl9jbGllbnRDYWxsSWQpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0hBTkdVUF9SLCBgc2lnbmFsIGVycm9yIGNvZGUgOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbmVlZEhhbmd1cENhbGxJZCA9IG51bGw7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9IQU5HVVBfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog6YCa6K+d5Lit5Y+R6LW35aqS5L2T57G75Z6L5Y+Y5pu06K+35rGCXG4gICAqIEBwYXJhbSBtZWRpYVR5cGUg5aqS5L2T57G75Z6LXG4gICAqIEByZXR1cm5zIHRyYW5zYWN0aW9uSWQg5a6i5oi356uv5ZKM5pyN5Yqh56uv5Lqk5LqS55qE5LqL5YqhIGlk77yM5Zyo5Y+W5raI5oiW5bqU562U5aqS5L2T57G75Z6L5YiH5o2i5pe25Lyg5YWlXG4gICAqL1xuICBhc3luYyByZXF1ZXN0Q2hhbmdlTWVkaWFUeXBlKG1lZGlhVHlwZTogUkNDYWxsUGx1c01lZGlhVHlwZSk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIsIHRyYW5zYWN0aW9uSWQ/OiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9ULCBgbWVkaWFUeXBlOiAke21lZGlhVHlwZX1gLCB0cmFjZUlkKTtcblxuICAgIGlmIChpc1VuZGVmaW5lZChSQ0NhbGxQbHVzTWVkaWFUeXBlW21lZGlhVHlwZV0pKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBwYXJhbXMgZXJyLCBtZWRpYVR5cGUgaXMgaWxsZWdhbCwgdmFsdWU6ICR7bWVkaWFUeXBlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCBtYWluU2Vzc2lvbiA9IHRoaXMuZ2V0Q3VycmVudENhbGxTZXNzaW9uKCk7XG4gICAgY29uc3Qgb2xkTWVkaWFUeXBlID0gbWFpblNlc3Npb24/LmdldE1lZGlhVHlwZSgpO1xuXG4gICAgaWYgKG1lZGlhVHlwZSA9PT0gb2xkTWVkaWFUeXBlKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBlcnJvciBjb2RlOiAke1JDQ2FsbFBsdXNDb2RlLk1FRElBVFlQRV9JTlZBTElEfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTUVESUFUWVBFX0lOVkFMSUQgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3mmK/lkKblnKjpgJror53kuK1cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVFVRVNUX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBlcnJvciBjb2RlIDogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTH0sIHNlc3Npb24gbm90IGV4aXN0YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPkei1t+WqkuS9k+exu+Wei+WIh+aNolxuICAgICAqL1xuICAgIGNvbnN0IHRvVXNlcklkcyA9IG1haW5TZXNzaW9uPy5nZXRVc2VyTGlzdCgpLmZpbHRlcigodXNlcikgPT4gdXNlci51c2VySWQgIT09IHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCkpLm1hcCgodXNlcikgPT4gdXNlci51c2VySWQpO1xuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5yZXF1ZXN0Q2hhbmdlTWVkaWFUeXBlKHsgbWVkaWFUeXBlLCB0b1VzZXJJZHM6IHRvVXNlcklkcyB8fCBbXSB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVRVUVTVF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUVVFU1RfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHN1Y2Nlc3MgdHJhbnNhY3Rpb25JZDogJHtkYXRhIS50cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgICAgdHJhbnNhY3Rpb25JZDogZGF0YSEudHJhbnNhY3Rpb25JZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWPlua2iOWIh+aNouWqkuS9k+exu+Wei+WPmOabtOivt+axglxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCDlrqLmiLfnq6/lkozmnI3liqHnq6/kuqTkupLnmoTkuovliqEgaWTvvIzkuLrlj5HotbflqpLkvZPnsbvlnovlj5jmm7Tor7fmsYLov5Tlm57nmoQgdHJhbnNhY3Rpb25JZFxuICAgKi9cbiAgYXN5bmMgY2FuY2VsQ2hhbmdlTWVkaWFUeXBlKHRyYW5zYWN0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfQ0FOQ0VMX0NIQU5HRV9NRURJQV9UWVBFX1QsIGB0cmFuc2FjdGlvbklkOiAke3RyYW5zYWN0aW9uSWR9YCwgdHJhY2VJZCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4LmlbDmoKHpqoxcbiAgICAgKi9cbiAgICBpZiAoIW5vdEVtcHR5U3RyaW5nKHRyYW5zYWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHBhcmFtIGVycm9yLCB0cmFuc2FjdGlvbklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHt0cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3mmK/lkKblnKjpgJror53kuK1cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9DQU5DRUxfQ0hBTkdFX01FRElBX1RZUEVfUiwgYGVycm9yIGNvZGUgOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfSwgc2Vzc2lvbiBub3QgZXhpc3RgLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+W5raI5aqS5L2T57G75Z6L5YiH5o2iXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9jYWxsRW5naW5lLmNhbmNlbENoYW5nZU1lZGlhVHlwZSh7IHRyYW5zYWN0aW9uSWQgfSwgdHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0NBTkNFTF9DSEFOR0VfTUVESUFfVFlQRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlqpLkvZPnsbvlnovlj5jmm7TlupTnrZRcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQg5a6i5oi356uv5ZKM5pyN5Yqh56uv5Lqk5LqS55qE5LqL5YqhIGlk77yM5Li6IG9uUmVjZWl2ZWRDaGFuZ2VUb1ZpZGVvIOebkeWQrOaUtuWIsCB0cmFuc2FjdGlvbklkIOWPguaVsOWAvFxuICAgKi9cbiAgYXN5bmMgcmVwbHlDaGFuZ2VNZWRpYVR5cGUodHJhbnNhY3Rpb25JZDogc3RyaW5nLCBpc0FncmVlOiBib29sZWFuKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9ULCBgdHJhbnNhY3Rpb25JZDogJHt0cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuXG4gICAgLyoqXG4gICAgICog5Y+C5pWw5qCh6aqMXG4gICAgICovXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyh0cmFuc2FjdGlvbklkKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfUkVQTFlfQ0hBTkdFX01FRElBX1RZUEVfUiwgYHBhcmFtIGVycm9yLCB0cmFuc2FjdGlvbklkOiBub3QgZW1wdHkgc3RyaW5nLCB2YWx1ZTogJHt0cmFuc2FjdGlvbklkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG4gICAgaWYgKCFpc0Jvb2xlYW4oaXNBZ3JlZSkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1JFUExZX0NIQU5HRV9NRURJQV9UWVBFX1IsIGBwYXJhbSBlcnJvciwgaXNBZ3JlZTogdHlwZSBpcyBib29sZWFuLCB2YWx1ZTogJHtpc0FncmVlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliKTmlq3mmK/lkKblnKjpgJror53kuK1cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuX2NhbGxFbmdpbmUuZ2V0TG9jYWxNYWluU2Vzc2lvbigpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgZXJyb3IgY29kZSA6ICR7UkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEx9LCBzZXNzaW9uIG5vdCBleGlzdGAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUucmVzcG9uc2VDaGFuZ2VNZWRpYVR5cGUoe1xuICAgICAgdHJhbnNhY3Rpb25JZCxcbiAgICAgIGFncmVlOiBpc0FncmVlLFxuICAgIH0sIHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCBgc2lnbmFsIGVycm9yOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9SRVBMWV9DSEFOR0VfTUVESUFfVFlQRV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3ov5vooYzkuK3nmoTpgJror51cbiAgICogQHJldHVybnMgUkNDYWxsUGx1c1Nlc3Npb24g5a+56LGh5oiWIG51bGwg5Li65b2T5YmN5q2j5Zyo6L+b6KGM55qE6YCa6K+d5a+56LGhXG4gICAqL1xuICBnZXRDdXJyZW50Q2FsbFNlc3Npb24oKTogUkNDYWxsUGx1c1Nlc3Npb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gIH1cblxuICAvKipcbiAgICog5LuO5pyN5Yqh5Zmo6I635Y+W5pyq57uT5p2f55qE6YCa6K+d6K6w5b2VXG4gICAqIEByZXR1cm5zIHJlY29yZHMg5LiA57uE5pyq57uT5p2f55qE6YCa6K+d6K6w5b2VXG4gICAqL1xuICBhc3luYyBnZXRBdmFpbGFibGVDYWxsUmVjb3Jkc0Zyb21TZXJ2ZXIoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgcmVjb3Jkcz86IElSQ0NhbGxQbHVzQ2FsbFJlY29yZFtdIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9BVkFJTEFCTEVfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRPcGVuQ2FsbExpc3QodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9BVkFJTEFCTEVfQ0FMTF9SRUNPUkRTX0ZST01fU0VSVkVSX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0FWQUlMQUJMRV9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiwgYHN1Y2Nlc3MsIGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YCwgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MsXG4gICAgICByZWNvcmRzOiBkYXRhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5YiG6aG15p+l5om+5b2T5YmN55So5oi355qE5YWo6YOo6YCa6K+d6K6w5b2VXG4gICAqIEBwYXJhbSBzdGFydFRpbWVzdGFtcCDotbflp4vml7bpl7TmiLPvvIxcbiAgICog6aaW5qyh6I635Y+W5Y+v5LygIC0x77yM5YCS5bqP5pe277yM6L+U5Zue5pyA5paw55qE6YCa6K+d6K6w5b2V77yM5q2j5bqP5pe277yM6L+U5Zue5pyA5pep55qE6YCa6K+d6K6w5b2VXG4gICAqIG9yZGVyIOS4uuato+W6j+aXtu+8jOi/lOWbnuWkp+S6juatpOaXtumXtOaIs+eahOmAmuivneiusOW9lVxuICAgKiBvcmRlciDkuLrlgJLluo/ml7bvvIzov5Tlm57lsI/kuo7mraTml7bpl7TmiLPnmoTpgJror53orrDlvZVcbiAgICogQHBhcmFtIGNvdW50IOavj+asoeiOt+WPlueahOaVsOmHj1xuICAgKiBAcGFyYW0gb3JkZXIg5q2j5bqP5oiW5YCS5bqP6I635Y+W77yM6buY6K6k5Li65q2j5bqPXG4gICAqIDAg5Li65q2j5bqP77yM5ZCR5byA5aeL5pe26Ze05oiz5LmL5ZCO5p+l6K+iXG4gICAqIDEg5Li65YCS5bqP77yM5ZCR5byA5aeL5pe26Ze05oiz5LmL5YmN5p+l6K+iXG4gICAqIEByZXR1cm5zIHJlc3VsdC5oYXNNb3JlIOaYr+WQpuacieabtOWkmumAmuivneiusOW9lVxuICAgKiBAcmV0dXJucyByZXN1bHQubGlzdCDpgJror53orrDlvZXliJfooajvvIznsbvlnovkuLogSVJDQ2FsbFBsdXNDYWxsUmVjb3JkW13vvIzlj6/pgJrov4cgYXBpRG9jIOafpeeci+WFt+S9k+WMheWQq+Wtl+autVxuICAgKiBAcmV0dXJucyByZXN1bHQuc3luY1RpbWUgaGFzTW9yZSDkuLogdHJ1ZSDml7bvvIznu6fnu63ojrflj5bpgJror53orrDlvZXpnIDkvKDlhaXnmoTml7bpl7TmiLNcbiAgICovXG4gIGFzeW5jIGdldENhbGxSZWNvcmRzKHN0YXJ0VGltZXN0YW1wOiBudW1iZXIsIGNvdW50OiBudW1iZXIsIG9yZGVyOiAwfDEgPSAwKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciwgcmVzdWx0PzogSVJDQ2FsbFBsdXNHZXRDYWxsUmVjb3JkUmVzIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfVCwgYHN0YXJ0VGltZXN0YW1wOiAke3N0YXJ0VGltZXN0YW1wfSwgY291bnQ6ICR7Y291bnR9YCwgdHJhY2VJZCk7XG5cbiAgICBpZiAoIShpc051bWJlcihzdGFydFRpbWVzdGFtcCkgJiYgc3RhcnRUaW1lc3RhbXAgPj0gMCkpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfUiwgYHBhcmFtcyBlcnJvciwgc3RhcnRUaW1lc3RhbXA6IGlzIGEgbnVtYmVyID49IDAsIHZhbHVlOiAke3N0YXJ0VGltZXN0YW1wfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBpZiAoIShpc051bWJlcihjb3VudCkgJiYgY291bnQgPiAwKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19SLCBgcGFyYW1zIGVycm9yLCBjb3VudDogaXMgYSBudW1iZXIgPj0gMCwgdmFsdWU6ICR7Y291bnR9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5QQVJBTV9FUlJPUiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSwgZGF0YSB9ID0gYXdhaXQgdGhpcy5fY2FsbEVuZ2luZS5nZXRDYWxsTG9nTGlzdCh7XG4gICAgICB0aW1lc3RhbXA6IHN0YXJ0VGltZXN0YW1wLFxuICAgICAgY291bnQsXG4gICAgICBvcmRlcixcbiAgICB9LCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfR0VUX0NBTExfUkVDT1JEU19SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0dFVF9DQUxMX1JFQ09SRFNfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyxcbiAgICAgIHJlc3VsdDogZGF0YSEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmoLnmja4gY2FsbElkIOmbhuWQiOaJuemHj+WIoOmZpOmAmuivneiusOW9lVxuICAgKiBAcGFyYW0gY2FsbElkcyBjYWxsSWQg5YiX6KGoXG4gICAqL1xuICBhc3luYyBkZWxldGVDYWxsUmVjb3Jkc0Zyb21TZXJ2ZXIoY2FsbElkczogc3RyaW5nW10pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX0RFTEVURV9DQUxMX1JFQ09SRFNfQllfQ0FMTElEX1QsIGBjYWxsSWRzOiAke2NhbGxJZHMuam9pbignLCcpfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCEoXG4gICAgICBub3RFbXB0eUFycmF5KGNhbGxJZHMpXG4gICAgICAmJiBjYWxsSWRzLmV2ZXJ5KChjYWxsSWQpID0+IG5vdEVtcHR5U3RyaW5nKGNhbGxJZCkpXG4gICAgKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0NBTExfUkVDT1JEU19CWV9DQUxMSURfUiwgYHBhcmFtcyBlcnIsIGNhbGxJZHM6IG5vdCBlbXB0eSBhcnJheSwgY2FsbElkOiBub3QgZW1wdHkgc3RyaW5nLCBjYWxsSWRzOiAke0pTT04uc3RyaW5naWZ5KGNhbGxJZHMpfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUuZGVsZXRlQ2FsbExvZyhjYWxsSWRzLCB0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0NBTExfUkVDT1JEU19CWV9DQUxMSURfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQ0FMTF9SRUNPUkRTX0JZX0NBTExJRF9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5riF56m65omA5pyJ6YCa6K+d6K6w5b2VXG4gICAqL1xuICBhc3luYyBkZWxldGVBbGxDYWxsUmVjb3Jkc0Zyb21TZXJ2ZXIoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9ULCAnJywgdHJhY2VJZCk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX2NhbGxFbmdpbmUucmVtb3ZlQWxsQ2FsbExvZyh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfREVMRVRFX0FMTF9DQUxMX1JFQ09SRFNfRlJPTV9TRVJWRVJfUiwgYHNpZ25hbCBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9ERUxFVEVfQUxMX0NBTExfUkVDT1JEU19GUk9NX1NFUlZFUl9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvIDlkK/mkYTlg4/lpLRcbiAgICogQGRlc2NyaXB0aW9uIOmAmuivnei/h+eoi+S4reaJk+W8gOaRhOWDj+WktO+8jOWmguaenOaJqeaVo+i1hOa6kOWksei0pe+8jOWNs+WvueaWueayoeaUtuWIsOacrOerr+aJk+W8gOaRhOWDj+WktOeahOmAmuefpeaXtu+8jOatpOasoeihjOS4uuWksei0pVxuICAgKiBAcmV0dXJucyB0cmFjayDmkYTlg4/lpLTop4bpopHotYTmupBcbiAgICovXG4gIGFzeW5jIHN0YXJ0Q2FtZXJhKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIC8qKlxuICAgICAqIOiOt+WPluaRhOWDj+WktOi1hOa6kFxuICAgICAqL1xuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5nZXRDYW1lcmFWaWRlb1RyYWNrKHRyYWNlSWQpO1xuICAgIGlmIChjb2RlICE9PSBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgYGNyZWF0ZSB2aWRlbyB0cmFjayBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fY2FsbEVuZ2luZS5zZXRVc2VyRGV2aWNlRW5hYmxlKHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudElkKCksIFJDQ2FsbFBsdXNNZWRpYVR5cGUuVklERU8sIHRydWUsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCF0cmFjaz8uaXNQdWJsaXNoZWQoKSAmJiB0aGlzLl9jYWxsRW5naW5lLmdldExvY2FsTWFpblNlc3Npb24oKT8uZ2V0U3RhdGUoKSA9PT0gUkNDYWxsUGx1c0NhbGxTdGF0ZS5PTkNBTEwpIHtcbiAgICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLnB1Ymxpc2hWaWRlb1RyYWNrKCk7XG4gICAgICBpZiAoY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsIGBwdWJsaXNoIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgICAgfVxuICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9DQU1FUkFfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlkK/nlKjotYTmupBcbiAgICAgKiDmianmlaPlkK/nlKjotYTmupDmtojmga/vvIzlpoLmnpzlpLHotKXvvIzliJkgc3RhcnRDYW1lcmEg6KGM5Li65aSx6LSlXG4gICAgICovXG4gICAgY29uc3QgeyBjb2RlOiB1bm11dGVDb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuZW5hYmxlVmlkZW9UcmFjayh0cmFjZUlkKTtcbiAgICBpZiAodW5tdXRlQ29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MgJiYgdW5tdXRlQ29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsIGBzaWduYWwgZXJyb3IgY29kZTogJHt1bm11dGVDb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogdW5tdXRlQ29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfQ0FNRVJBX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOWFs+mXreaRhOWDj+WktFxuICAgKi9cbiAgYXN5bmMgc3RvcENhbWVyYSgpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfQ0FNRVJBX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5kaXNhYmxlVmlkZW9UcmFjaygpO1xuXG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgJiYgY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfQ0FNRVJBX1IsIGBlcnJvciBjb2RlOiAke2NvZGV9YCwgdHJhY2VJZCk7XG4gICAgICByZXR1cm4geyBjb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5fcnRjTW9kdWxlLmRlc3Ryb3lUcmFjayh0cmFjayEpO1xuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLlZJREVPLCBmYWxzZSwgdHJhY2VJZCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX0NBTUVSQV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliIfmjaLmkYTlg4/lpLRcbiAgICog5YiH5o2i5oiQ5Yqf5ZCOIGBJQ2FsbFBsdXNFdmVudExpc3RlbmVyYCDnm5HlkKzlmajnmoQgYG9uVXNlck1lZGlhQXZhaWxhYmxlYCDkuK3kvJrmlLbliLDmlrDliIfmjaLnmoTmkYTlg4/lpLTotYTmupDlj6/mkq3mlL7vvIzmraTml7bosIPnlKggYGNhbGxQbHVzQ2xpZW50LnBsYXlNZWRpYSgpYCDlj6/mmL7npLrmlrDmkYTlg4/lpLTnmoTnlLvpnaJcbiAgICogQHBhcmFtIGNhbWVyYUlkIOa1j+iniOWZqOS4reWPluW+l+eahOaRhOWDj+WktOiuvuWkhyBpZO+8jOWPr+iwgyBnZXRDYW1lcmFzIOaWueazleWPluW+l1xuICAgKiBAZGVzY3JpcHRpb24g6YCa6K+d5YmN5ZKM6YCa6K+d5Lit6YO95Y+v6LCD55SoXG4gICAqL1xuICBhc3luYyBzd2l0Y2hDYW1lcmEoY2FtZXJhSWQ6IHN0cmluZyk6IFByb21pc2U8eyBjb2RlOiBudW1iZXJ9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1QsIGBjYW1lcmFJZDogJHtjYW1lcmFJZH1gLCB0cmFjZUlkKTtcblxuICAgIGlmICghbm90RW1wdHlTdHJpbmcoY2FtZXJhSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsIGBwYXJhbSBlcnJvciwgY2FtZXJhSWQ6IG5vdCBlbXB0eSBzdHJpbmcsIHZhbHVlOiAke2NhbWVyYUlkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsIGBlcnJDb2RlOiAke1JDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOX0NBTEwgfTtcbiAgICB9XG5cbiAgICBpZiAoc2Vzc2lvbi5nZXRNZWRpYVR5cGUoKSA9PT0gUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1dJVENIX0NBTUVSQV9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfVklERU9fQ0FMTH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9WSURFT19DQUxMIH07XG4gICAgfVxuXG4gICAgdGhpcy5fdmlkZW9Db25maWcuY2FtZXJhSWQgPSBjYW1lcmFJZDtcbiAgICB0aGlzLl9ydGNNb2R1bGUuc2V0VmlkZW9Db25maWcodGhpcy5fdmlkZW9Db25maWcpO1xuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB0aGlzLl9ydGNNb2R1bGUuY2hhbmdlVmlkZW9EZXZpY2UodHJhY2VJZCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9DQU1FUkFfUiwgYGNhbGwgY2xpZW50IGNoYW5nZVZpZGVvRGV2aWNlIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfQ0FNRVJBX1IsICdzdWNjZXNzJywgdHJhY2VJZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOW8gOWQr+m6puWFi+mjjlxuICAgKiBAZGVzY3JpcHRpb24g6YCa6K+d6L+H56iL5Lit5omT5byA6bqm5YWL6aOO77yM5aaC5p6c5omp5pWj6LWE5rqQ5aSx6LSl77yM5Y2z5a+55pa55rKh5pS25Yiw5pys56uv5omT5byA6bqm5YWL6aOO55qE6YCa55+l5pe277yM5q2k5qyh6KGM5Li65aSx6LSlXG4gICAqL1xuICBhc3luYyBzdGFydE1pY3JvcGhvbmUoKTogUHJvbWlzZTx7IGNvZGU6IG51bWJlciB9PiB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHRoaXMuX2xvZ2dlci5jcmVhdGVUcmFjZUlkKCk7XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVEFSVF9NSUNST1BIT05FX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSwgdHJhY2sgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5nZXRNaWNyb3Bob25lQXVkaW9UcmFjayh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCBgY3JlYXRlIG1pY3JvcGhvbmUgYXVkaW8gdHJhY2sgZXJyb3IgY29kZTogJHtjb2RlfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZSB9O1xuICAgIH1cblxuICAgIHRoaXMuX2NhbGxFbmdpbmUuc2V0VXNlckRldmljZUVuYWJsZSh0aGlzLl9jb250ZXh0LmdldEN1cnJlbnRJZCgpLCBSQ0NhbGxQbHVzTWVkaWFUeXBlLkFVRElPLCB0cnVlLCB0cmFjZUlkKTtcblxuICAgIGlmICghdHJhY2shLmlzT3duZXJNdXRlZCgpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUQVJUX01JQ1JPUEhPTkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgICB9XG5cbiAgICBjb25zdCB1bm11dGVDb2RlID0gYXdhaXQgdHJhY2shLnVubXV0ZSgpO1xuICAgIGlmICh1bm11dGVDb2RlICE9PSBSQ1JUQ0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IHVubXV0ZUNvZGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RBUlRfTUlDUk9QSE9ORV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5YWz6Zet6bqm5YWL6aOOXG4gICAqIEBkZXNjcmlwdGlvbiDpgJror53ov4fnqIvkuK3lhbPpl63puqblhYvpo47vvIzlpoLmnpzmianmlaPotYTmupDlpLHotKXvvIzljbPlr7nmlrnmsqHmlLbliLDmnKznq6/lhbPpl63puqblhYvpo47nmoTpgJrnn6Xml7bvvIzmraTmrKHooYzkuLrlpLHotKVcbiAgICovXG4gIGFzeW5jIHN0b3BNaWNyb3Bob25lKCk6IFByb21pc2U8eyBjb2RlOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHRyYWNlSWQgPSB0aGlzLl9sb2dnZXIuY3JlYXRlVHJhY2VJZCgpO1xuICAgIHRoaXMuX2xvZ2dlci5pbmZvKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1RPUF9NSUNST1BIT05FX1QsICcnLCB0cmFjZUlkKTtcblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgdGhpcy5fcnRjTW9kdWxlLmRpc2FibGVBdWRpb1RyYWNrKCk7XG4gICAgaWYgKGNvZGUgIT09IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgJiYgY29kZSAhPT0gUkNSVENDb2RlLlNVQ0NFU1MpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NUT1BfTUlDUk9QSE9ORV9SLCBgc2lnbmFsIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9jYWxsRW5naW5lLnNldFVzZXJEZXZpY2VFbmFibGUodGhpcy5fY29udGV4dC5nZXRDdXJyZW50SWQoKSwgUkNDYWxsUGx1c01lZGlhVHlwZS5BVURJTywgZmFsc2UsIHRyYWNlSWQpO1xuXG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TVE9QX01JQ1JPUEhPTkVfUiwgJ3N1Y2Nlc3MnLCB0cmFjZUlkKTtcbiAgICByZXR1cm4geyBjb2RlOiBSQ0NhbGxQbHVzQ29kZS5TVUNDRVNTIH07XG4gIH1cblxuICAvKipcbiAgICog6bqm5YWL6aOO5piv5ZCm5byA5ZCvXG4gICAqL1xuICBpc01pY3JvcGhvbmVFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5fcnRjTW9kdWxlLmdldExvY2FsQXVkaW9UcmFjaygpO1xuICAgIHJldHVybiAhIXRyYWNrICYmICF0cmFjay5pc093bmVyTXV0ZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7miYDmnInov5znq6/pn7PpopHmtYHmmK/lkKblj6/nlKhcbiAgICogQHBhcmFtIGVuYWJsZSDkuLogdHJ1ZSDml7bvvIzlkK/nlKjmiYDmnInov5znq6/pn7PpopHmtYHvvJvkuLogZmFsc2Ug5pe277yM6Z2Z6Z+z5omA5pyJ6L+c56uv6Z+z6aKR5rWBXG4gICAqL1xuICBhc3luYyBzZXRBbGxSZW1vdGVBdWRpb0VuYWJsZShlbmFibGU6IGJvb2xlYW4pOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICByZXR1cm4gdGhpcy5fcnRjTW9kdWxlLnNldEFsbFJlbW90ZUF1ZGlvRW5hYmxlKGVuYWJsZSwgdHJhY2VJZCk7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+WIFNESyDniYjmnKzkv6Hmga9cbiAgICogQHJldHVybnMgU0RLIOeJiOacrOWPt1xuICAgKi9cbiAgZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBfX1ZFUlNJT05fXztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bmkYTlg4/lpLTliJfooahcbiAgICovXG4gIGFzeW5jIGdldENhbWVyYXMoKSB7XG4gICAgY29uc3QgY2FtZXJhcyA9IGF3YWl0IGRldmljZS5nZXRDYW1lcmFzKCk7XG4gICAgcmV0dXJuIGNhbWVyYXM7XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6bqm5YWL6aOO5YiX6KGoXG4gICAqL1xuICBhc3luYyBnZXRNaWNyb3Bob25lcygpIHtcbiAgICBjb25zdCBtaWNyb3Bob25lcyA9IGF3YWl0IGRldmljZS5nZXRNaWNyb3Bob25lcygpO1xuICAgIHJldHVybiBtaWNyb3Bob25lcztcbiAgfVxuXG4gIGdldFJUQ1Nlc3Npb25JZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcnRjTW9kdWxlLmdldFJUQ1Nlc3Npb25JZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIh+aNoum6puWFi+mjjlxuICAgKiDliIfmjaLmiJDlip/lkI4gYElDYWxsUGx1c0V2ZW50TGlzdGVuZXJgIOebkeWQrOWZqOeahCBgb25Vc2VyTWVkaWFBdmFpbGFibGVgIOS4reS8muaUtuWIsOaWsOWIh+aNoueahOm6puWFi+mjjui1hOa6kOWPr+aSreaUvu+8jOatpOaXtuiwg+eUqCBgY2FsbFBsdXNDbGllbnQucGxheU1lZGlhKClgIOWPr+aSreaUvuaWsOm6puWFi+mjjueahOWjsOmfs1xuICAgKiBAcGFyYW0gbWljcm9waG9uZUlkIOa1j+iniOWZqOS4reWPluW+l+eahOm6puWFi+mjjuiuvuWkhyBpZO+8jOWPr+iwgyBnZXRNaWNyb3Bob25lcyDmlrnms5Xlj5blvpdcbiAgICogQGRlc2NyaXB0aW9uIOmAmuivneWJjeWSjOmAmuivneS4remDveWPr+iwg+eUqFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN3aXRjaE1pY3JvcGhvbmUobWljcm9waG9uZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgY29kZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB0cmFjZUlkID0gdGhpcy5fbG9nZ2VyLmNyZWF0ZVRyYWNlSWQoKTtcbiAgICB0aGlzLl9sb2dnZXIuaW5mbyhSQ0NhbGxQbHVzTG9nZ2VyVGFnLkxfQ0FMTFBMVVNfQ0xJRU5UX1NXSVRDSF9NSUNST1BIT05FX1QsIGBtaWNyb3Bob25lSWQ6ICR7bWljcm9waG9uZUlkfWAsIHRyYWNlSWQpO1xuXG4gICAgaWYgKCFub3RFbXB0eVN0cmluZyhtaWNyb3Bob25lSWQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfTUlDUk9QSE9ORV9SLCBgcGFyYW0gZXJyb3IsIG1pY3JvcGhvbmVJZDogbm90IGVtcHR5IHN0cmluZywgdmFsdWU6ICR7bWljcm9waG9uZUlkfWAsIHRyYWNlSWQpO1xuICAgICAgcmV0dXJuIHsgY29kZTogUkNDYWxsUGx1c0NvZGUuUEFSQU1fRVJST1IgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fY2FsbEVuZ2luZS5nZXRMb2NhbE1haW5TZXNzaW9uKCk7XG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfTUlDUk9QSE9ORV9SLCBgZXJyQ29kZTogJHtSQ0NhbGxQbHVzQ29kZS5OT1RfSU5fQ0FMTH1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLk5PVF9JTl9DQUxMIH07XG4gICAgfVxuXG4gICAgdGhpcy5fYXVkaW9Db25maWcubWljcm9waG9uZUlkID0gbWljcm9waG9uZUlkO1xuICAgIHRoaXMuX3J0Y01vZHVsZS5zZXRBdWRpb0NvbmZpZyh0aGlzLl9hdWRpb0NvbmZpZyk7XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHRoaXMuX3J0Y01vZHVsZS5jaGFuZ2VBdWRpb0RldmljZSh0cmFjZUlkKTtcbiAgICBpZiAoY29kZSAhPT0gUkNDYWxsUGx1c0NvZGUuU1VDQ0VTUykge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKFJDQ2FsbFBsdXNMb2dnZXJUYWcuTF9DQUxMUExVU19DTElFTlRfU1dJVENIX01JQ1JPUEhPTkVfUiwgYGNhbGwgY2xpZW50IGNoYW5nZUF1ZGlvRGV2aWNlIGVycm9yIGNvZGU6ICR7Y29kZX1gLCB0cmFjZUlkKTtcbiAgICAgIHJldHVybiB7IGNvZGUgfTtcbiAgICB9XG4gICAgdGhpcy5fbG9nZ2VyLmluZm8oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0NBTExQTFVTX0NMSUVOVF9TV0lUQ0hfTUlDUk9QSE9ORV9SLCAnc3VjY2VzcycsIHRyYWNlSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IFJDQ2FsbFBsdXNDb2RlLlNVQ0NFU1MgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgaXNGdW5jdGlvbiwgaXNPYmplY3QsIGlzVW5kZWZpbmVkLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBJUkNDYWxsSW5pdE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lJbmRleCc7XG5pbXBvcnQgeyBJVmFsaWRhdGVSZXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lWYWxpZGF0aW9uJztcbmltcG9ydCB7IElDYWxsUGx1c0V2ZW50TGlzdGVuZXIsIFJDQ2FsbFBsdXNDb2RlIH0gZnJvbSAnLi4vYXBpL2ludGVyZmFjZSc7XG5cbi8qKlxuICog5Yid5aeL5YyW5Y+C5pWw5qCh6aqMXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUluaXRPcHRzID0gKG9wdHM6IElSQ0NhbGxJbml0T3B0aW9ucyk6IElWYWxpZGF0ZVJlcyA9PiB7XG4gIGlmICghb3B0cykge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6ICdJbml0aWFsaXphdGlvbiBtaXNzaW5nIHBhcmFtZXRlciAtPiBvcHRpb25zJyB9O1xuICB9XG4gIGlmICghaXNPYmplY3Qob3B0cykpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgbXNnOiAnSW5pdGlhbGl6YXRpb24gb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcgfTtcbiAgfVxuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvcHRzKTtcbiAgLy8g5b+F5Lyg5Y+C5pWw6aqM6K+BXG4gIGlmICgha2V5cy5pbmNsdWRlcygncnRjQ2xpZW50JykpIHtcbiAgICByZXR1cm4geyBpc0xlZ2FsOiBmYWxzZSwgY29kZTogUkNDYWxsUGx1c0NvZGUuTk9UX0lOU1RBTExfUlRDX1BMVUdJTiB9O1xuICB9XG4gIGlmICghaXNPYmplY3Qob3B0cy5ydGNDbGllbnQpKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogJ0luaXRpYWxpemF0aW9uIFxcJ3J0Y0NsaWVudFxcJyBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIFxcJ29iamVjdFxcJycgfTtcbiAgfVxuXG4gIHJldHVybiB7IGlzTGVnYWw6IHRydWUgfTtcbn07XG5cbi8qKlxuICogcmVnaXN0ZXJDYWxsRXZlbnRMaXN0ZW5lciDlj4LmlbDmoKHpqoxcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTGlzdGVuZXIgPSAobGlzdGVuZXI6IElDYWxsUGx1c0V2ZW50TGlzdGVuZXIpOiBJVmFsaWRhdGVSZXMgPT4ge1xuICBpZiAoIWxpc3RlbmVyKSB7XG4gICAgcmV0dXJuIHsgaXNMZWdhbDogZmFsc2UsIG1zZzogJ21pc3NpbmcgcGFyYW1ldGVyIC0+IGxpc3RlbmVyJyB9O1xuICB9XG5cbiAgLy8g5qCh6aqM5piv5ZCm57y65bCR5b+F6KaB55uR5ZCs5Zue6LCD5rOo5YaMXG4gIGNvbnN0IHJlcXVpcmVkS2V5cyA9IFsnb25JbnZpdGUnLCAnb25TZXNzaW9uQ2xvc2UnLCAnb25SZW1vdGVUcmFja1JlYWR5J107XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMobGlzdGVuZXIpO1xuICBjb25zdCBtaXNzaW5nS2V5czogc3RyaW5nW10gPSBbXTtcbiAgcmVxdWlyZWRLZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGlmICgha2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBtaXNzaW5nS2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICB9KTtcbiAgaWYgKG1pc3NpbmdLZXlzLmxlbmd0aCkge1xuICAgIHJldHVybiB7IGlzTGVnYWw6IGZhbHNlLCBtc2c6IGBtaXNzaW5nIHBhcmFtZXRlciAtPiBcIiR7bWlzc2luZ0tleXMuam9pbignLCcpfVwiYCB9O1xuICB9XG5cbiAgbGV0IHJlczogSVZhbGlkYXRlUmVzID0geyBpc0xlZ2FsOiB0cnVlIH07XG5cbiAgLy8g5qCh6aqM5b+F6KaB55uR5ZCs5piv5ZCm5pivIGZ1bmN0aW9uIOexu+Wei1xuICBmb3IgKGNvbnN0IGtleSBvZiByZXF1aXJlZEtleXMpIHtcbiAgICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXJbPGtleW9mIElDYWxsUGx1c0V2ZW50TGlzdGVuZXI+a2V5XSkpIHtcbiAgICAgIHJlcyA9IHsgaXNMZWdhbDogZmFsc2UsIG1zZzogYCcke2tleX0nIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgJ2Z1bmN0aW9uJ2AgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuIiwiaW1wb3J0IHtcbiAgSVBsdWdpbkdlbmVyYXRvciwgSVJ1bnRpbWUsIGlzVW5kZWZpbmVkLCBMb2dMLCBQbHVnaW5Db250ZXh0LCBWZXJzaW9uTWFuYWdlLFxufSBmcm9tICdAcm9uZ2Nsb3VkL2VuZ2luZSc7XG5pbXBvcnQgeyBSQ0NhbGxQbHVzQ2xpZW50IH0gZnJvbSAnLi9jb3JlL2FwaS9SQ0NhbGxQbHVzQ2xpZW50JztcbmltcG9ydCB7IFJDQ2FsbFBsdXNTZXNzaW9uIH0gZnJvbSAnLi9jb3JlL21vZHVsZXMvUkNDYWxsUGx1c1Nlc3Npb24nO1xuaW1wb3J0IHsgdmFsaWRhdGVJbml0T3B0cyB9IGZyb20gJy4vY29yZS91dGlscy92YWxpZGF0aW9uJztcbmltcG9ydCB7IElDYWxsUGx1c0luaXRPcHRzIH0gZnJvbSAnLi9jb3JlL2FwaS9pbnRlcmZhY2UnO1xuaW1wb3J0IFJDQXVkaW9Db25maWdCdWlsZGVyIGZyb20gJy4vY29yZS9hcGkvUkNBdWRpb0NvbmZpZ0J1aWxkZXInO1xuaW1wb3J0IFJDVmlkZW9Db25maWdCdWlsZGVyIGZyb20gJy4vY29yZS9hcGkvUkNWaWRlb0NvbmZpZ0J1aWxkZXInO1xuaW1wb3J0IHsgUkNDYWxsUGx1c0xvZ2dlclRhZyB9IGZyb20gJy4vY29yZS9hcGkvZW51bXMvUkNDYWxsUGx1c0xvZ2dlclRhZyc7XG5pbXBvcnQgUkNDYWxsUGx1c0FuZHJvaWRQdXNoQ29uZmlnQnVpbGRlciBmcm9tICcuL2NvcmUvYXBpL1JDQ2FsbFBsdXNBbmRyb2lkUHVzaENvbmZpZ0J1aWxkZXInO1xuXG5jb25zdCBpbnN0YWxsZXI6IElQbHVnaW5HZW5lcmF0b3I8UkNDYWxsUGx1c0NsaWVudCwgSUNhbGxQbHVzSW5pdE9wdHM+ID0ge1xuICB0YWc6ICdSQ0NhbGxQbHVzJyxcbiAgdmVyaWZ5KHJ1bnRpbWU6IElSdW50aW1lKSB7XG4gICAgVmVyc2lvbk1hbmFnZS5hZGQoJ3BsdWdpbi1jYWxsLXBsdXMnLCBfX1ZFUlNJT05fXyk7XG4gICAgaWYgKCFWZXJzaW9uTWFuYWdlLnZhbGlkRW5naW5lKF9fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fXykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFRoZSBjdXJyZW50IGVuZ2luZSB2ZXJzaW9uICcke1ZlcnNpb25NYW5hZ2UuZ2V0SW5mbygpLmVuZ2luZX0nIGVycm9yLCBwbHVnaW4tY2FsbC1wbHVzIHJlcXVpcmVkIGVuZ2luZSB2ZXJzaW9uIGF0IGxlYXN0ICcke19fUkVRVUlSRURfRU5HSU5FX1ZFUlNJT05fX30nLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBzZXR1cChjb250ZXh0OiBQbHVnaW5Db250ZXh0LCBydW50aW1lOiBJUnVudGltZSwgb3B0aW9uczogSUNhbGxQbHVzSW5pdE9wdHMpOiBSQ0NhbGxQbHVzQ2xpZW50IHtcbiAgICAvLyDliJ3lp4vljJblj4LmlbDmoKHpqoxcbiAgICBjb25zdCB2YWxpZGF0ZVJlcyA9IHZhbGlkYXRlSW5pdE9wdHMob3B0aW9ucyk7XG4gICAgaWYgKCF2YWxpZGF0ZVJlcy5pc0xlZ2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtDYWxsUGx1c0xpYiBpbnN0YWxsZXIgc3RldXBdJHt2YWxpZGF0ZVJlcy5tc2d9YCk7XG4gICAgfVxuXG4gICAgLy8g5Yib5bu6IGVuZ2luZSBsb2dnZXJcbiAgICBjb25zdCBlbmdpbmVMb2dnZXIgPSBjb250ZXh0LmNyZWF0ZUxvZ2dlcignQ2FsbFBsdXNMaWInLCAnUlRDJyk7XG4gICAgLy8g6K6+572uIOi+k+WHuue6p+WIq1xuICAgIGNvbnN0IG91dHB1dExldmVsID0gaXNVbmRlZmluZWQob3B0aW9ucy5sb2dPdXRwdXRMZXZlbCkgPyBMb2dMLldBUk4gOiBvcHRpb25zLmxvZ091dHB1dExldmVsO1xuICAgIGVuZ2luZUxvZ2dlci5zZXRPdXRwdXRMZXZlbChvdXRwdXRMZXZlbCk7XG4gICAgZW5naW5lTG9nZ2VyLndhcm4oUkNDYWxsUGx1c0xvZ2dlclRhZy5MX0lOREVYX0lOU1RBTExfQ0FMTF9QTFVTX1BMVUdJTl9PLCBgQ2FsbFBsdXMgVmVyc2lvbjogJHtfX1ZFUlNJT05fX30sIENvbW1pdDogJHtfX0NPTU1JVF9JRF9ffWApO1xuXG4gICAgcmV0dXJuIG5ldyBSQ0NhbGxQbHVzQ2xpZW50KGNvbnRleHQsIGVuZ2luZUxvZ2dlciwgcnVudGltZSwgb3B0aW9ucyk7XG4gIH0sXG59O1xuXG5leHBvcnQge1xuICBpbnN0YWxsZXIsXG4gIC8qIGNsYXNzICovXG4gIFJDQ2FsbFBsdXNDbGllbnQsXG4gIFJDQ2FsbFBsdXNTZXNzaW9uLFxuICBSQ0F1ZGlvQ29uZmlnQnVpbGRlcixcbiAgUkNWaWRlb0NvbmZpZ0J1aWxkZXIsXG4gIFJDQ2FsbFBsdXNBbmRyb2lkUHVzaENvbmZpZ0J1aWxkZXIsXG59O1xuLyoqXG4gKiDlr7zlh7rmnprkuL7lkozmjqXlj6PlrprkuYlcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL2FwaS9pbnRlcmZhY2UnO1xuIl0sIm5hbWVzIjpbIlJDQ2FsbFBsdXNDb2RlIiwiUkNDYWxsUGx1c0xvZ2dlclRhZyIsIlJDQ2FsbFBsdXNTZXNzaW9uIiwiX3Nlc3Npb24iLCJfY2FsbEVuZ2luZSIsIl9sb2dnZXIiLCJfX3B1YmxpY0ZpZWxkIiwidXNlciIsInVzZXJJZCIsInVzZXJTdGF0ZSIsImNhbWVyYUVuYWJsZSIsIm1pY3JvcGhvbmVFbmFibGUiLCJ0cmFjZUlkIiwiY29kZSIsImNsaWVudFN0YXJ0VGltZSIsImRhdGEiLCJSQ0NhbGxQbHVzVHlwZSIsIlJDQ2FsbFBsdXNUeXBlMiIsIlJDQ2FsbFBsdXNTZXNzaW9uVXNlclN0YXRlIiwiUkNDYWxsUGx1c01lZGlhVHlwZSIsIlJDQ2FsbFBsdXNNZWRpYVR5cGUyIiwiUkNDYWxsUGx1c0NhbGxTdGF0ZSIsIlJDQ2FsbFBsdXNNZWRpYVR5cGVDaGFuZ2VSZXN1bHQiLCJSQ0NhbGxQbHVzUmVhc29uIiwiUkNBdWRpb0NvbmZpZ0J1aWxkZXIiLCJtaWNyb3Bob25lSWQiLCJtaW4iLCJtYXgiLCJpc051bWJlciIsInNhbXBsZVJhdGUiLCJSQ1ZpZGVvQ29uZmlnQnVpbGRlciIsIlJDQ2FsbFBsdXNSZXNvbHV0aW9uIiwiUkNDYWxsUGx1c0ZyYW1lUmF0ZSIsImZwcyIsInJlc29sdXRpb24iLCJjYW1lcmFJZCIsInRyYW4yQ2FsbExvZyIsImNhbGxMb2dMaXN0IiwiY2FsbElkIiwiY2FsbFR5cGUiLCJjYWxsRGlyIiwibWVkaWFUeXBlIiwiY2FsbGluZ1VzZXJJZCIsImNhbGxVc2VySWRzIiwiY2FsbFN0YXR1cyIsInNlc3Npb25TdGF0dXMiLCJzdGFydFRpbWUiLCJlbmRUaW1lIiwiZHVyYXRpb24iLCJzeW5jVGltZSIsInN5c1N0YXR1cyIsImNydFRpbWUiLCJwYXJzZVN0YXR1c0RhdGEiLCJyaW5naW5nRGF0YSIsImhhbmd1cERhdGEiLCJhY2NlcHREYXRhIiwib3RoZXJJbnZpdGVkRGF0YSIsIml0ZW0iLCJ2YWxpZGF0ZVZpZGVvTm9kZU5hbWUiLCJlbGVtZW50IiwidmFsaWRhdGVTeXNTdGF0ZSIsImNydFN0YXRlIiwibmV3U3RhdGUiLCJpc0luVmFsaWQiLCJpbnZhbGlkU3RhdGVzIiwidmFsaWRhdGVVc2VyU3RhdGUiLCJnZXRIYW5ndXBTeXN0ZW1TdGF0ZSIsImlzQ2FsbGVlIiwic3lzdGVtU3RhdGUiLCJpc1N1cHBvcnRNZWRpYVNlcnZlciIsIm5hdmlJbmZvIiwidm9pcENhbGxJbmZvIiwic3RyYXRlZ3kiLCJ2YWxpZGF0ZUJpdHJhdGUiLCJtaW5CaXRyYXRlIiwibWF4Qml0cmF0ZSIsImdldFVzZXJWaWRlb1ZpZXdJbmZvIiwidXNlclZpZXdNYXAiLCJ1c2VyVmlld01hcEluZm8iLCJ2aWRlb1ZpZXciLCJpc1RpbnkiLCJwdXNoQ29uZmlnc1RvSlNPTiIsImlPU0NvbmZpZyIsImFuZHJvaWRDb25maWciLCJjbGllbnRDYWxsSWQiLCJ0aHJlYWRJZCIsImFwbnNDb2xsYXBzZUlkIiwicmljaE1lZGlhVXJpIiwiY2hhbm5lbElkTWkiLCJjaGFubmVsSWRIVyIsImNoYW5uZWxJZE9QUE8iLCJ0eXBlVml2byIsImZjbUNoYW5uZWxJZCIsImZjbUNvbGxhcHNlS2V5IiwiZmNtSW1hZ2VVcmwiLCJpbXBvcnRhbmNlSFciLCJjYXRlZ29yeUhXIiwiaW1hZ2VVcmxIVyIsImNhdGVnb3J5Vml2byIsImltcG9ydGFuY2VIb25vciIsImltYWdlVXJsSG9ub3IiLCJBUE5TIiwiSFciLCJwdXNoQ29uZ2ZpZ3MiLCJGQ00iLCJNSSIsIk9QUE8iLCJWSVZPIiwiSE9OT1IiLCJ0cmFuc1NlcnZlclB1c2hFeHQiLCJwdXNoQ29uZmlnIiwicHVzaFRpdGxlIiwiZGlzYWJsZVB1c2hUaXRsZSIsInRlbXBsYXRlSWQiLCJwdXNoRXh0IiwiaXNCb29sZWFuIiwidmFsaWRhdGVQdXNoQ29uZmlnIiwicHVzaENvbmZpZ0tleXMiLCJrZXkiLCJpbmRleCIsImlzVW5kZWZpbmVkIiwiaXNTdHJpbmciLCJ2YWxpZGF0ZUlPU0NvbmZpZ1JlcyIsInZhbGlkYXRlSU9TQ29uZmlnIiwidmFsaWRhdGVBbmRyb2lkQ29uZmlnUmVzIiwidmFsaWRhdGVBbmRyb2lkQ29uZmlnIiwiYW5kcm9pZENvbmZpZ0tleXMiLCJnZXRCeXRlTGVuZ3RoIiwic3RyIiwiY2hhcnNldCIsInRvdGFsIiwiY2FsY3VsYXRlVVRGMTZCeXRlTGVuZ3RoIiwiY2FsY3VsYXRlVVRGOEJ5dGVMZW5ndGgiLCJjaGF0Q29kZSIsImkiLCJSQ0NhbGxQbHVzU3RhdGlzdGljc1RhZyIsIlJDQ2FsbFBMdXNTdGF0aXN0aWNzIiwiX2NvbnRleHQiLCJ0YWciLCJzZXNzaW9uIiwiaW52aXRlU291cmNlIiwiZXh0cmEiLCJub3dUaW1lIiwiY29tbW9uRGF0YSIsIkRpYWxvZ0FjdGlvbiIsIkRpYWxvZ1R5cGUiLCJTZWNyZXRDYWxsVHlwZSIsIlNlY3JldENhbGxUeXBlMiIsIkNhbGxUaW1lckV2ZW50VHlwZSIsIlJDQ2FsbElubmVyU2Vzc2lvbiIsIkV2ZW50RW1pdHRlciIsIl9jYWxsSWQiLCJfc3RhdGUiLCJfY2FsbFR5cGUiLCJfbWVkaWFUeXBlIiwiX3N0YXJ0Q2FsbGVySWQiLCJfY2FsbGVySWQiLCJfY2FsbFVzZXJzIiwiZW5hYmxlIiwidXNlcnMiLCJjaGFuZ2VkVXNlcnMiLCJuZXdVc2VyU3RhdGUiLCJuZXdTdGF0ZVRpbWUiLCJuZXdTeXNTdGF0ZSIsImhhc1VzZXIiLCJvbGRTdGF0ZVRpbWUiLCJvbGRTeXN0ZW1TdGF0ZSIsIm9sZFVzZXJTdGF0ZSIsImlzSW52YWxpZFN5c1N0YXRlIiwiaXNJbnZhbGlkVXNlclN0YXRlIiwiaXNJbnZhbGlkT25waG9uZUVuZCIsImVyciIsInN0YXRlIiwidHlwZSIsInRpbWVySWQiLCJpc0xvY2FsQ2xpZW50SGFuZ3VwIiwiQ2FsbFNlcnZlckFjdGlvbiIsInRpbWVyU2V0VGltZW91dCIsImZ1bmMiLCJ0aW1lb3V0Iiwic2xlZXAiLCJtaWxsaXNlY29uZCIsInJlc29sdmUiLCJuZWVkUmV0cnlDb2RlIiwiRXJyb3JDb2RlIiwiUkNSVENDb2RlIiwicmV0cnlBc3luY0ZuIiwiYXN5bmNGbiIsImZuQXJncyIsImN1cnJlbnRSZXRyeVRpbWUiLCJtYXhEdXJhdGlvbiIsImludGVydmFscyIsIm9uRXJyb3IiLCJyZXMiLCJpdHYiLCJDYWxsSG9va3NUeXBlIiwiUHViSW52aXRlQ2FsbE1pc3NSZWFzb24iLCJQdWJJbnZpdGVDYWxsTWlzc1JlZmVyIiwiTUFYX0VYVFJBX0JZVEVTIiwiTUlTU19NRVNTQUdFX05BTUUiLCJTaWduYWxUcmFuc3BvcnRlciIsIl9ydW50aW1lIiwiX2luaXRPcHRzIiwiX3RpbWVDb3JyZWN0aW9uZXIiLCJfcmVwb3J0QXBwRXZlbnRNb2R1bGUiLCJnZXRVVUlEMjIiLCJtZXNzYWdlIiwiY2FsbFNlc3Npb25Vc2VycyIsInRhcmdldElkIiwic2VuZGVyVXNlcklkIiwiY3VycmVudFVzZXJJZCIsInN1bW1hcnlDb250ZW50Iiwic3VtbWFyeU1lc3NhZ2UiLCJsaXN0ZW5lciIsIm1zZyIsInRvVXNlcnMiLCJzZWNyZXRDaGF0IiwidGFyZ2V0VHlwZSIsIm5pY2tOYW1lIiwib2xkUm9vbUlkIiwiY2FsbElkcyIsIm9wdHMiLCJSQ0Nvbm5lY3Rpb25TdGF0dXMiLCJvcHRpb25zIiwidmFsdWUiLCJyZXN1bHQiLCJzZXJ2ZXJWYWwiLCJwYXJzZWREYXRhIiwiaW5mbyIsImRldmljZUlkIiwiaXNOdWxsIiwiaXNEaXJlY3RseSIsImN1cnJlbnRVSWQiLCJjdXJyZW50VXNlciIsImRpYWxvZ1R5cGUiLCJ0b0RldmljZUlkIiwiY2FsbERpYWxvZ0VudGl0eXMiLCJzdHJpbmcxMHRvNjQiLCJudW1iZXIiLCJjaGFycyIsInJhZGl4IiwicXV0aWVudCIsImFyciIsIm1vZCIsImdldFVVSUQiLCJjIiwiciIsInV1aWQiLCJDQUxMX0RCX05BTUUiLCJEQl9WRVJTSU9OIiwibG9nZ2VyIiwiX1JDQ2FsbEluZGV4REIiLCJyZXEiLCJldiIsIm9iak5hbWUiLCJfYSIsInZhbCIsInJlamVjdCIsIlJDQ2FsbEluZGV4REIiLCJBYm5vcm1hbENhbGwiLCJvYmpTdG9yZSIsInVzZXJBYm5vcm1hbENhbGxJZHMiLCJpZCIsIkNhbGxTZXJ2ZXJFdmVudFR5cGUiLCJSQ0NhbGxQbHVzSW5uZXJDb2RlIiwiVGltZUNvcnJlY3Rpb25lciIsIl9zaW5nbGVDYWxsRHVyYXRpb25FdiIsInNlcnZlclN0YXJ0VGltZSIsImN1cnJlbnRSVFQiLCJjbGllbnRGaXJzdEZyYW1lVGltZSIsIkZvcndhcmRUeXBlIiwiUkNDYWxsUGx1c0ludml0ZVNvdXJjZSIsIlJDQ2FsbERpcmVjdGlvbiIsIkNBTExfVElNRV9PVVQiLCJfUkNDYWxsRW5naW5lIiwiYnVzeWxpbmVVc2VycyIsImludml0ZXJUaW1lcklkIiwic2VsZlN0YXRlIiwiaW52aXRlZXNTdGF0ZSIsImJ1c3lVc2Vyc1N0YXRlIiwiYnVzeVVzZXJJZCIsImludml0ZWRVc2Vyc1N0YXRlIiwiYnVzeWxpbmVVc2Vyc1N0YXRlIiwiZXh0cmFLZXlWYWwiLCJ0cmFuc2FjdGlvbklkIiwicmVxTWVkaWFUeXBlIiwidGltZXN0YW1wIiwiY291bnQiLCJvcmRlciIsImNhbGxMb2ciLCJyZXNEYXRhIiwibGlzdCIsInVzZXJTZXNzaW9uU3RhdHVzIiwiY2FsbERpcmVjdGlvbiIsInNlc3Npb25Vc2VycyIsImlubmVyU2Vzc2lvbiIsIm5ld1VzZXJzIiwiaXNJZGxlIiwibm93IiwiZGVsYXlUaW1lIiwic3RyZWFtUmVhZHlUaW1lIiwiY3VycmVudFVzZXJTeXN0ZW1TdGF0ZSIsImhvbGRDYWxsSWQiLCJzdGF0ZVRpbWUiLCJpbnZpdGVVc2VySWQiLCJpbnZpdGVlVGltZXJJZCIsImNhbGxQbHVzU2Vzc2lvbiIsIm90aGVyc1N0YXRlIiwic3RhdHVzVGltZSIsIm90aGVySW52aXRlZE1lbWJlciIsIl9iIiwiX2MiLCJpbnZpdGVkTWVtYmVyIiwidXNlcnNTdGF0ZSIsImNhbGxTZXNzaW9uYVN0YXR1cyIsInNlc3Npb25TdGF0ZSIsInVuTmVlZFVwU3RhdGUiLCJzdGFydENhbGxlcklkIiwiX2QiLCJzZWxmRW5kIiwic3RhdGVzIiwiaXNNYWluU2Vzc2lvbiIsImN1cnJlbnRVc2VyU2F0ZSIsImV2ZW50QXJncyIsImV2ZW50VHlwZSIsImZpcnN0RnJhbWVUaW1lIiwiYWN0aW9uIiwicHJvbW90ZXJJZCIsInJlYXNvbiIsImN1cnJlbnRDYWxsSWQiLCJvbGRUcmFuc0lkIiwib2xkQWN0aW9uIiwiT2xkTWVkaWFUeXBlIiwiY2hhbmdlTWVkaWFUeXBlUmVzdWx0IiwiX2UiLCJpc1NlbGZIYW5ndXAiLCJjbG9zZWRTZXNzaW9uIiwiY3J0VXNlckRhdGEiLCJoYW5ndXBSZWFzb24iLCJyZW1vdGVVc2VySWQiLCJjYWxsZXJVc2VySWQiLCJjb250ZW50IiwiQ29udmVyc2F0aW9uVHlwZSIsIk1lc3NhZ2VEaXJlY3Rpb24iLCJSZWNlaXZlZFN0YXR1cyIsImlzTmVlZFVwIiwiaW52aXRlclVzZXJJZCIsIlJDQ2FsbEVuZ2luZSIsIlJUQ1Jlc291cmNlVGFnIiwiX1JUQ01vZHVsZSIsImRlZmF1bHRWaWRlb1RyYWNrIiwidHJhY2siLCJkZWZhdWx0QXVkaW9UcmFjayIsImdldEF1ZGlvQ29kZSIsInZpZGVvQ29uZmlnIiwiYXVkaW9Db25maWciLCJsb2NhbFRyYWNrIiwicm9vbSIsInJvb21Vc2Vyc0lkIiwicHViUGFyYW1zIiwiY3VycmVudFJvb21JZCIsInJlY2VudFRyYWNrcyIsImxvY2FsVHJhY2tzIiwibmVlZERlc3Ryb3lUcmFjayIsIm5ld1RyYWNrIiwidHJhY2tzIiwiUlRDTW9kZSIsInN1YlRpbnkiLCJieVNlcnZlciIsInVzZXJJZHMiLCJ2aWRlb1RyYWNrIiwiYXVkaW9UcmFjayIsImF1ZGlvTGV2ZWxSZXBvcnRMaXN0Iiwicm9vbUlkIiwia2lja0V4dHJhIiwiUkNLaWNrUmVhc29uIiwibmVlZFN1YlRyYWNrcyIsInJlcG9ydCIsInNlbmRlcnMiLCJyZWNlaXZlcnMiLCJraW5kIiwicGFja2V0c0xvc3RSYXRlIiwicnR0IiwidHJhY2tJZCIsImJpdHJhdGUiLCJoZWxwZXIiLCJsb2NhbFZpZGVvVHJhY2siLCJsb2NhbEF1ZGlvVHJhY2siLCJSQ0xvY2FsVHJhY2siLCJ2aWRlb0VsZW1lbnQiLCJzdWJQYXJhbXMiLCJ1bnN1YlRyYWNrcyIsImVycm9yIiwiUlRDTW9kdWxlIiwiUkNDYWxsUGx1c1JlcG9ydE1vZHVsZSIsImV2ZW50TmFtZSIsImF0dHJzIiwiaGFuZGxlIiwiaW52aXRlZVVzZXJMaXN0IiwicmVjb3JkIiwiY2FsbEZpcnN0RnJhbWVUaW1lIiwiYXVkaW9MZXZlbCIsIkNhbGxTZXJ2ZXJFcnJvckNvZGUiLCJSQ0NhbGxQbHVzQW5kcm9pZFB1c2hDb25maWdCdWlsZGVyIiwibWlMYXJnZUljb25VcmwiLCJSQ0NhbGxQbHVzQ2xpZW50IiwibmV3U2Vzc2lvbiIsIm1haW5TZXNzaW9uIiwibm90RW1wdHlBcnJheSIsIm5vdEVtcHR5U3RyaW5nIiwiY2ZnIiwiZnJhbWVSYXRlIiwiZXJyb3JNc2ciLCJnZXRNZWRpYVRyYWNrc0NvZGUiLCJnZXRTZXNzaW9uQ29kZSIsImJ1c3lVc2VycyIsImhvbGRTZXNzaW9uIiwiaGFuZ3VwTWFpblNlc3Npb25Db2RlIiwibWFpblNlc3Npb25DYWxsSWQiLCJoYW5ndXBTZXNzaW9uIiwidXNlckluZm8iLCJvbGRNZWRpYVR5cGUiLCJ0b1VzZXJJZHMiLCJpc0FncmVlIiwic3RhcnRUaW1lc3RhbXAiLCJ1bm11dGVDb2RlIiwiZGV2aWNlIiwidmFsaWRhdGVJbml0T3B0cyIsImlzT2JqZWN0IiwiaW5zdGFsbGVyIiwicnVudGltZSIsIlZlcnNpb25NYW5hZ2UiLCJjb250ZXh0IiwidmFsaWRhdGVSZXMiLCJlbmdpbmVMb2dnZXIiLCJvdXRwdXRMZXZlbCIsIkxvZ0wiXSwibWFwcGluZ3MiOiI2Z0JBR08sTUFBTUEsRUFBaUIsQ0FJNUIsUUFBUyxFQUlULFlBQWEsTUFJYixjQUFlLE1BSWYsWUFBYSxNQUliLGtCQUFtQixNQUluQixlQUFnQixNQUloQix3QkFBeUIsTUFJekIsa0JBQW1CLE1BSW5CLGdCQUFpQixNQUlqQix1QkFBd0IsTUFJeEIsZ0JBQWlCLE1BSWpCLHFDQUFzQyxNQUl0QyxvQkFBcUIsTUFJckIsY0FBZSxNQUlmLGtCQUFtQixNQUluQix3QkFBeUIsTUFJekIsdUJBQXdCLE1BSXhCLGtCQUFtQixNQUluQixtQkFBb0IsS0FDdEIsRUNoRlksSUFBQUMsR0FBQUEsSUFDVkEsRUFBQSxtQ0FBcUMscUNBSXJDQSxFQUFBLHVDQUF5Qyx5Q0FJekNBLEVBQUEsd0NBQTBDLDBDQUkxQ0EsRUFBQSwrQ0FBaUQsaURBQ2pEQSxFQUFBLGdEQUFrRCxrREFJbERBLEVBQUEscUNBQXVDLHVDQUN2Q0EsRUFBQSxxQ0FBdUMsdUNBQ3ZDQSxFQUFBLHlDQUEyQywyQ0FDM0NBLEVBQUEseUNBQTJDLDJDQUMzQ0EsRUFBQSxzQ0FBd0Msd0NBSXhDQSxFQUFBLHFDQUF1Qyx1Q0FDdkNBLEVBQUEscUNBQXVDLHVDQUN2Q0EsRUFBQSxzQ0FBd0Msd0NBQ3hDQSxFQUFBLDBDQUE0Qyw0Q0FJNUNBLEVBQUEsNEJBQThCLDhCQUM5QkEsRUFBQSw0QkFBOEIsOEJBSTlCQSxFQUFB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
|