-
Notifications
You must be signed in to change notification settings - Fork 2
/
4130.18327b1b.iframe.bundle.js
2 lines (2 loc) · 137 KB
/
4130.18327b1b.iframe.bundle.js
1
2
"use strict";(self.webpackChunkblockly_mooc=self.webpackChunkblockly_mooc||[]).push([[4130],{"./src/code-studio/activityUtils.js":(__unused_webpack_module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.resultFromStatus=exports.mergeActivityResult=exports.activityCssClass=void 0;var _constants=__webpack_require__("./src/constants.js"),_sharedConstants=__webpack_require__("./generated-scripts/sharedConstants.ts");exports.activityCssClass=function activityCssClass(result){return result&&result!==_constants.TestResults.NO_TESTS_RUN?result===_constants.TestResults.REVIEW_ACCEPTED_RESULT?_sharedConstants.LevelStatus.review_accepted:result===_constants.TestResults.REVIEW_REJECTED_RESULT?_sharedConstants.LevelStatus.review_rejected:result===_constants.TestResults.SUBMITTED_RESULT?_sharedConstants.LevelStatus.submitted:result>=_constants.TestResults.MINIMUM_OPTIMAL_RESULT?_sharedConstants.LevelStatus.perfect:result>=_constants.TestResults.MINIMUM_PASS_RESULT?_sharedConstants.LevelStatus.passed:_sharedConstants.LevelStatus.attempted:_sharedConstants.LevelStatus.not_tried},exports.resultFromStatus=function resultFromStatus(status){return status===_sharedConstants.LevelStatus.review_accepted?_constants.TestResults.REVIEW_ACCEPTED_RESULT:status===_sharedConstants.LevelStatus.review_rejected?_constants.TestResults.REVIEW_REJECTED_RESULT:status===_sharedConstants.LevelStatus.submitted?_constants.TestResults.SUBMITTED_RESULT:status===_sharedConstants.LevelStatus.free_play_complete?_constants.TestResults.FREE_PLAY:status===_sharedConstants.LevelStatus.perfect?_constants.TestResults.ALL_PASS:status===_sharedConstants.LevelStatus.passed?_constants.TestResults.MINIMUM_PASS_RESULT:_constants.TestResults.NO_TESTS_RUN},exports.mergeActivityResult=function mergeActivityResult(a,b){return b=b||0,0===(a=a||0)?b:0===b?a:Math.max(a,b)}},"./src/code-studio/hiddenLessonRedux.js":(__unused_webpack_module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.STUDENT_SECTION_ID=void 0,exports.default=function reducer(){var state=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new HiddenState,action=arguments.length>1?arguments[1]:void 0;if(action.type===SET_HIDDEN_LESSONS){var hiddenLessonsPerSection=action.hiddenLessonsPerSection,hideableLessonsAllowed=action.hideableLessonsAllowed,sectionIds=Object.keys(hiddenLessonsPerSection),nextState=state;return sectionIds.forEach((function(sectionId){hiddenLessonsPerSection[sectionId].forEach((function(lessonId){nextState=nextState.setIn(["lessonsBySection",sectionId,lessonId.toString()],!0)}))})),validateSectionIds(nextState),nextState.merge({hiddenLessonsInitialized:!0,hideableLessonsAllowed})}if(action.type===UPDATE_HIDDEN_LESSON){var sectionId=action.sectionId,lessonId=action.lessonId,hidden=action.hidden,_nextState=state.setIn(["lessonsBySection",sectionId,lessonId.toString()],hidden);return validateSectionIds(_nextState),_nextState}if(action.type===UPDATE_HIDDEN_SCRIPT){var _sectionId=action.sectionId,scriptId=action.scriptId,_hidden=action.hidden,_nextState2=state.setIn(["scriptsBySection",_sectionId.toString(),scriptId.toString()],_hidden);return validateSectionIds(_nextState2),_nextState2}return state},exports.getHiddenLessons=function getHiddenLessons(scriptName,canHideLessons){return function(dispatch){_jquery.default.ajax({type:"GET",url:"/s/".concat(scriptName,"/hidden_lessons"),dataType:"json",contentType:"application/json"}).done((function(response){return dispatch(function initializeHiddenLessons(data,canHideLessons){return function(dispatch){Array.isArray(data)&&(data=_defineProperty({},STUDENT_SECTION_ID,data)),dispatch(setHiddenLessons(data,!!canHideLessons))}}(response,canHideLessons))})).fail((function(err){return console.error(err)}))}},exports.initializeHiddenScripts=function initializeHiddenScripts(data){return function(dispatch){data&&(Array.isArray(data)&&(data=_defineProperty({},STUDENT_SECTION_ID,data)),Object.keys(data).forEach((function(sectionId){data[sectionId].forEach((function(scriptId){dispatch(updateHiddenScript(sectionId,scriptId,!0))}))})))}},exports.isLessonHiddenForSection=function isLessonHiddenForSection(state,sectionId,lessonId){return isHiddenForSection(state,sectionId,lessonId,"lessonsBySection")},exports.isScriptHiddenForSection=function isScriptHiddenForSection(state,sectionId,scriptId){return isHiddenForSection(state,sectionId,scriptId,"scriptsBySection")},exports.setHiddenLessons=setHiddenLessons,exports.toggleHiddenLesson=function toggleHiddenLesson(scriptName,sectionId,lessonId,hidden){return function(dispatch){dispatch(updateHiddenLesson(sectionId,lessonId,hidden)),postToggleHidden(scriptName,sectionId,lessonId,hidden)}},exports.toggleHiddenScript=function toggleHiddenScript(scriptName,sectionId,scriptId,hidden){return function(dispatch){dispatch(updateHiddenScript(sectionId,scriptId,hidden)),postToggleHidden(scriptName,sectionId,null,hidden)}},exports.updateHiddenLesson=updateHiddenLesson,exports.updateHiddenScript=updateHiddenScript;var _immutable=_interopRequireDefault(__webpack_require__("./node_modules/immutable/dist/immutable.js")),_jquery=_interopRequireDefault(__webpack_require__("./node_modules/jquery/dist/jquery.js"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _typeof(o){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _defineProperty(e,r,t){return(r=function _toPropertyKey(t){var i=function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(t,"string");return"symbol"==_typeof(i)?i:i+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}var SET_HIDDEN_LESSONS="hiddenLesson/SET_HIDDEN_LESSONS",UPDATE_HIDDEN_LESSON="hiddenLesson/UPDATE_HIDDEN_LESSON",UPDATE_HIDDEN_SCRIPT="hiddenLesson/UPDATE_HIDDEN_SCRIPT",STUDENT_SECTION_ID=exports.STUDENT_SECTION_ID="STUDENT",HiddenState=_immutable.default.Record({hiddenLessonsInitialized:!1,hideableLessonsAllowed:!1,lessonsBySection:_immutable.default.Map({}),scriptsBySection:_immutable.default.Map({})});function validateSectionIds(state){if(state.getIn(["lessonsBySection",STUDENT_SECTION_ID])&&state.get("lessonsBySection").size>1)throw new Error("Should never have STUDENT_SECTION_ID alongside other sectionIds")}function setHiddenLessons(hiddenLessonsPerSection,hideableLessonsAllowed){return{type:SET_HIDDEN_LESSONS,hiddenLessonsPerSection,hideableLessonsAllowed}}function updateHiddenLesson(sectionId,lessonId,hidden){return{type:UPDATE_HIDDEN_LESSON,sectionId,lessonId,hidden}}function updateHiddenScript(sectionId,scriptId,hidden){return{type:UPDATE_HIDDEN_SCRIPT,sectionId,scriptId,hidden}}function postToggleHidden(scriptName,sectionId,lessonId,hidden){var data={section_id:sectionId,hidden};lessonId&&(data.stage_id=lessonId),_jquery.default.ajax({type:"POST",url:"/s/".concat(scriptName,"/toggle_hidden"),dataType:"json",contentType:"application/json",data:JSON.stringify(data)}).success((function(){window.__TestInterface=window.__TestInterface||{},window.__TestInterface.toggleHiddenUnitComplete=!0}))}function isHiddenForSection(state,sectionId,itemId,bySectionKey){return!!itemId&&(sectionId||(sectionId=STUDENT_SECTION_ID),!!state.get(bySectionKey).getIn([sectionId.toString(),itemId.toString()]))}},"./src/code-studio/lessonLockRedux.js":(__unused_webpack_module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.closeLockDialog=exports.beginSave=exports.authorizeLockable=exports.LockStatus=exports.FINISH_SAVE=exports.CLOSE_LOCK_DIALOG=exports.BEGIN_SAVE=void 0,exports.default=function reducer(){var state=arguments.length>0&&void 0!==arguments[0]?arguments[0]:initialState,action=arguments.length>1?arguments[1]:void 0;if(action.type===AUTHORIZE_LOCKABLE)return Object.assign({},state,{lockableAuthorized:action.isAuthorized,lockableAuthorizedLoaded:!0});if(action.type===SET_SECTION_LOCK_STATUS)return _objectSpread(_objectSpread({},state),{},{lessonsBySectionId:_lodash.default.mapValues(action.sections,(function(section){return section.lessons})),lessonsBySectionIdLoaded:!0});if(action.type===REFRESH_SECTION_LOCK_STATUS){var lessonsBySectionId=_lodash.default.mapValues(action.sections,(function(section){return section.lessons})),lockDialogLessonId=state.lockDialogLessonId;if(lockDialogLessonId){var lockStatus=lockStatusForLesson(lessonsBySectionId[action.sectionId],lockDialogLessonId);return _objectSpread(_objectSpread({},state),{},{lessonsBySectionId,lockStatus})}return _objectSpread(_objectSpread({},state),{},{lessonsBySectionId})}if(action.type===_teacherSectionsRedux.SELECT_SECTION){if(0===Object.keys(state.lessonsBySectionId).length)return state;var sectionId=action.payload;if(sectionId===_teacherSectionsRedux.NO_SECTION)return _objectSpread(_objectSpread({},state),{},{lockStatus:initialState.lockStatus});if(!state.lessonsBySectionId[sectionId])throw new Error("Unknown sectionId ".concat(sectionId));var _lockDialogLessonId=state.lockDialogLessonId;if(_lockDialogLessonId)return _objectSpread(_objectSpread({},state),{},{lockStatus:lockStatusForLesson(state.lessonsBySectionId[sectionId],_lockDialogLessonId)})}if(action.type===OPEN_LOCK_DIALOG){var _sectionId=action.sectionId,lessonId=action.lessonId;return Object.assign({},state,{lockDialogLessonId:lessonId,lockStatus:lockStatusForLesson(state.lessonsBySectionId[_sectionId],lessonId)})}if(action.type===CLOSE_LOCK_DIALOG)return Object.assign({},state,{lockDialogLessonId:null,lockStatus:initialState.lockStatus});if(action.type===BEGIN_SAVE)return Object.assign({},state,{saving:!0});if(action.type===FINISH_SAVE){var _lessonsBySectionId=state.lessonsBySectionId,nextLockStatus=action.lockStatus,_sectionId2=action.sectionId,_lessonId=action.lessonId,nextLesson=_lodash.default.cloneDeep(_lessonsBySectionId[_sectionId2][_lessonId]);nextLesson.forEach((function(item,index){var update=nextLockStatus[index];if(item.user_level_id!==update.userLevelId)throw new Error("Expect user ids be the same");item.locked=update.lockStatus===LockStatus.Locked,item.readonly_answers=update.lockStatus===LockStatus.ReadonlyAnswers}));var nextState=_lodash.default.cloneDeep(state);return nextState.lessonsBySectionId[_sectionId2][_lessonId]=nextLesson,Object.assign(nextState,{lockStatus:nextLockStatus,saving:!1})}return state},exports.setSectionLockStatus=exports.saveLockDialog=exports.refetchSectionLockStatus=exports.openLockDialog=exports.lockLesson=exports.fullyLockedLessonMapping=exports.finishSave=void 0;var _jquery=_interopRequireDefault(__webpack_require__("./node_modules/jquery/dist/jquery.js")),_lodash=_interopRequireDefault(__webpack_require__("./node_modules/lodash/lodash.js")),_teacherSectionsRedux=__webpack_require__("./src/templates/teacherDashboard/teacherSectionsRedux.ts"),_utils=__webpack_require__("./src/utils.js");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _typeof(o){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach((function(r){_defineProperty(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function _defineProperty(e,r,t){return(r=function _toPropertyKey(t){var i=function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(t,"string");return"symbol"==_typeof(i)?i:i+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}var LockStatus=exports.LockStatus=(0,_utils.makeEnum)("Locked","Editable","ReadonlyAnswers"),OPEN_LOCK_DIALOG="lessonLock/OPEN_LOCK_DIALOG",CLOSE_LOCK_DIALOG=exports.CLOSE_LOCK_DIALOG="lessonLock/CLOSE_LOCK_DIALOG",BEGIN_SAVE=exports.BEGIN_SAVE="lessonLock/BEGIN_SAVE",FINISH_SAVE=exports.FINISH_SAVE="lessonLock/FINISH_SAVE",AUTHORIZE_LOCKABLE="lessonLock/AUTHORIZE_LOCKABLE",SET_SECTION_LOCK_STATUS="lessonLock/SET_SECTION_LOCK_STATUS",REFRESH_SECTION_LOCK_STATUS="lessonLock/REFRESH_SECTION_LOCK_STATUS",initialState={lessonsBySectionId:{},lessonsBySectionIdLoaded:!1,lockDialogLessonId:null,lockStatus:[],saving:!1,lockableAuthorized:null,lockableAuthorizedLoaded:!1};exports.authorizeLockable=function authorizeLockable(isAuthorized){return{type:AUTHORIZE_LOCKABLE,isAuthorized}},exports.openLockDialog=function openLockDialog(sectionId,lessonId){return{type:OPEN_LOCK_DIALOG,sectionId,lessonId}};var beginSave=exports.beginSave=function beginSave(){return{type:BEGIN_SAVE}},finishSave=exports.finishSave=function finishSave(sectionId,lessonId,newLockStatus){return{type:FINISH_SAVE,sectionId,lessonId,lockStatus:newLockStatus}},performSave=function performSave(sectionId,lessonId,newLockStatus,onComplete){return function(dispatch,getState){var oldLockStatus=getState().lessonLock.lockStatus,saveData=newLockStatus.filter((function(item,index){return!_lodash.default.isEqual(item,oldLockStatus[index])})).map((function(item){return{user_level_data:item.userLevelData,locked:item.lockStatus===LockStatus.Locked,readonly_answers:item.lockStatus===LockStatus.ReadonlyAnswers}}));0!==saveData.length?(dispatch(beginSave()),_jquery.default.ajax({type:"POST",url:"/api/lock_status",dataType:"json",contentType:"application/json",data:JSON.stringify({updates:saveData})}).done((function(){dispatch(finishSave(sectionId,lessonId,newLockStatus)),onComplete()})).fail((function(err){console.error(err),onComplete()}))):onComplete()}},closeLockDialog=(exports.saveLockDialog=function saveLockDialog(sectionId,newLockStatus){return function(dispatch,getState){var lessonId=getState().lessonLock.lockDialogLessonId;dispatch(performSave(sectionId,lessonId,newLockStatus,(function(){dispatch(closeLockDialog())})))}},exports.lockLesson=function lockLesson(sectionId,lessonId){return function(dispatch,getState){var section=getState().lessonLock.lessonsBySectionId[sectionId],newLockStatus=lockStatusForLesson(section,lessonId).map((function(student){return _objectSpread(_objectSpread({},student),{},{lockStatus:LockStatus.Locked})}));dispatch(performSave(sectionId,lessonId,newLockStatus,(function(){})))}},exports.closeLockDialog=function closeLockDialog(){return{type:CLOSE_LOCK_DIALOG}}),lockStatusForLesson=function lockStatusForLesson(section,lessonId){return void 0===section?[]:section[lessonId].map((function(student){return{userLevelData:student.user_level_data,name:student.name,lockStatus:student.locked?LockStatus.Locked:student.readonly_answers?LockStatus.ReadonlyAnswers:LockStatus.Editable}}))};exports.fullyLockedLessonMapping=function fullyLockedLessonMapping(section){return section?Object.keys(section).reduce((function(obj,lessonId){var fullyLocked=!section[lessonId].some((function(student){return!student.locked}));return _objectSpread(_objectSpread({},obj),{},_defineProperty({},lessonId,fullyLocked))}),{}):{}},exports.setSectionLockStatus=function setSectionLockStatus(sections){return{type:SET_SECTION_LOCK_STATUS,sections}},exports.refetchSectionLockStatus=function refetchSectionLockStatus(sectionId,scriptId){return function(dispatch){_jquery.default.ajax("/api/lock_status",{data:{script_id:scriptId}}).done((function(data){dispatch(function refreshSectionLockStatus(sections,sectionId){return{type:REFRESH_SECTION_LOCK_STATUS,sections,sectionId}}(data,sectionId))})).fail((function(err){console.log(err)}))}}},"./src/code-studio/utils.js":(__unused_webpack_module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.environmentSpecificCookieName=function environmentSpecificCookieName(name){var rack_env=window.dashboard.rack_env;if("production"===rack_env)return name;return"".concat(name,"_").concat(rack_env)},exports.getRootDomainFromHostname=function getRootDomainFromHostname(hostname){return hostname.split(".").slice(-2).join(".")},exports.hasQueryParam=function hasQueryParam(name){var parsedParams=queryParams();return Object.prototype.hasOwnProperty.call(parsedParams,name)},exports.queryParams=queryParams,exports.resetWindowLocation=function resetWindowLocation(){windowLocation=window.location},exports.setWindowLocation=function setWindowLocation(fakeLocation){windowLocation=fakeLocation},exports.updateQueryParam=function updateQueryParam(param,value){var useReplaceState=arguments.length>2&&void 0!==arguments[2]&&arguments[2],newString=_queryString.default.stringify(_objectSpread(_objectSpread({},_queryString.default.parse(windowLocation.search)),{},_defineProperty({},param,value))),newLocation=windowLocation.pathname;newString&&(newLocation+="?"+newString);var method=useReplaceState?"replaceState":"pushState";window.history[method](null,document.title,newLocation)};var _queryString=function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}(__webpack_require__("./node_modules/query-string/index.js"));function _typeof(o){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach((function(r){_defineProperty(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function _defineProperty(e,r,t){return(r=function _toPropertyKey(t){var i=function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(t,"string");return"symbol"==_typeof(i)?i:i+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}var windowLocation=window.location;function queryParams(name){var parsed=_queryString.default.parse(windowLocation.search);return name?parsed[name]:parsed}},"./src/code-studio/viewAsRedux.js":(__unused_webpack_module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.changeViewType=exports.ViewType=exports.SET_VIEW_TYPE=void 0,exports.default=function reducer(){var state=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ViewType.Participant,action=arguments.length>1?arguments[1]:void 0;if(action.type===SET_VIEW_TYPE){var viewType=action.viewType;if("Teacher"===viewType)viewType="Instructor",(0,_utils.updateQueryParam)("viewAs","Instructor");else if("Student"===viewType)viewType="Participant",(0,_utils.updateQueryParam)("viewAs","Participant");else if(!ViewType[viewType])throw new Error("unknown ViewType: "+viewType);return viewType}return state},exports.setViewType=void 0;var _utils=__webpack_require__("./src/code-studio/utils.js"),_utils2=__webpack_require__("./src/utils.js"),ViewType=exports.ViewType=(0,_utils2.makeEnum)("Participant","Instructor"),SET_VIEW_TYPE=exports.SET_VIEW_TYPE="viewAs/SET_VIEW_TYPE";var setViewType=exports.setViewType=function setViewType(viewType){return{type:SET_VIEW_TYPE,viewType}};exports.changeViewType=function changeViewType(viewType,isAsync){return function(dispatch){viewType!==ViewType.Participant||!(0,_utils.queryParams)("user_id")||((0,_utils.updateQueryParam)("user_id",void 0),isAsync)?dispatch(setViewType(viewType)):(0,_utils2.reload)()}}},"./src/templates/feedback/types.js":(__unused_webpack_module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.levelFeedbackType=exports.levelFeedbackShape=exports.feedbackShape=exports.ReviewStates=void 0;var _propTypes=function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}(__webpack_require__("./node_modules/prop-types/index.js")),_utils=__webpack_require__("./src/utils.js");var feedbackShape=exports.feedbackShape=_propTypes.default.shape({id:_propTypes.default.number.isRequired,seen_on_feedback_page_at:_propTypes.default.string,student_first_visited_at:_propTypes.default.string,created_at:_propTypes.default.oneOfType([_propTypes.default.string,_propTypes.default.instanceOf(Date)]).isRequired,comment:_propTypes.default.string,performance:_propTypes.default.string,is_awaiting_teacher_review:_propTypes.default.bool,review_state:_propTypes.default.string}),levelFeedbackType=(exports.levelFeedbackShape=_propTypes.default.shape(levelFeedbackType),exports.levelFeedbackType={lessonName:_propTypes.default.string.isRequired,lessonNum:_propTypes.default.number.isRequired,levelNum:_propTypes.default.number.isRequired,linkToLevel:_propTypes.default.string.isRequired,unitName:_propTypes.default.string,feedbacks:_propTypes.default.arrayOf(feedbackShape)});exports.ReviewStates=(0,_utils.makeEnum)("completed","keepWorking","awaitingReview")},"./src/templates/progress/progressHelpers.js":(__unused_webpack_module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.defaultBubbleIcon=exports.commentLeft=void 0,exports.getIconForLevel=function getIconForLevel(level){if(arguments.length>1&&void 0!==arguments[1]&&arguments[1]&&isLevelAssessment(level))return"check-circle";if(level.isUnplugged)return"scissors";if(level.isLocked)return"lock";if(level.icon){var match=/fa-(.*)/.exec(level.icon);if(!match||!match[1])throw new Error("Unknown iconType: "+level.icon);return match[1]}if(level.bonus)return"flag-checkered";return defaultBubbleIcon},exports.getLevelResult=void 0,exports.isLevelAssessment=isLevelAssessment,exports.lessonHasLevels=function lessonHasLevels(lesson){var _lesson$levels;return!(null===(_lesson$levels=lesson.levels)||void 0===_lesson$levels||!_lesson$levels.length)},exports.lessonIsAllAssessment=function lessonIsAllAssessment(levels){return levels.every((function(level){return level.kind===_sharedConstants.LevelKind.assessment}))},exports.lessonIsLockedForAllStudents=function lessonIsLockedForAllStudents(lessonId,state){var currentSectionId=state.teacherSections.selectedSectionId,currentSection=state.lessonLock.lessonsBySectionId[currentSectionId];return!!(0,_lessonLockRedux.fullyLockedLessonMapping)(currentSection)[lessonId]},exports.lessonIsLockedForUser=function lessonIsLockedForUser(lesson,levels,state,viewAs){if(!lesson.lockable)return!1;if(!state.currentUser.userId)return!0;if(viewAs===_viewAsRedux.ViewType.Instructor)return!state.lessonLock.lockableAuthorized;if(viewAs===_viewAsRedux.ViewType.Participant)return lessonLocked(levels);return!0},exports.lessonIsVisible=function lessonIsVisible(lesson,state,viewAs){if(!viewAs)throw new Error("missing param viewAs in lessonIsVisible");var hiddenLessonState=state.hiddenLesson,sectionId=state.teacherSections.selectedSectionId;return!(0,_hiddenLessonRedux.isLessonHiddenForSection)(hiddenLessonState,sectionId,lesson.id)||viewAs===_viewAsRedux.ViewType.Instructor},exports.lessonLocked=lessonLocked,exports.lessonProgressForSection=function lessonProgressForSection(sectionLevelProgress,lessons){var sectionLessonProgress={};return Object.entries(sectionLevelProgress).forEach((function(_ref){var _ref2=function _slicedToArray(r,e){return function _arrayWithHoles(r){if(Array.isArray(r))return r}(r)||function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t.return&&(u=t.return(),Object(u)!==u))return}finally{if(o)throw n}}return a}}(r,e)||function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}(r,e)||function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(_ref,2),studentId=_ref2[0],studentLevelProgress=_ref2[1],studentLessonProgress={};lessons.forEach((function(lesson){studentLessonProgress[lesson.id]=function lessonProgressForStudent(studentLevelProgress,lessonLevels){var filteredLevels=lessonLevels.filter((function(level){return!level.bonus}));if(!filteredLevels.length)return null;var completedStatuses=[_sharedConstants.LevelStatus.perfect,_sharedConstants.LevelStatus.submitted,_sharedConstants.LevelStatus.free_play_complete,_sharedConstants.LevelStatus.completed_assessment],attempted=0,imperfect=0,completed=0,timeSpent=0,lastTimestamp=0;filteredLevels.forEach((function(level){var levelProgress=studentLevelProgress[level.id];levelProgress&&(attempted+=levelProgress.status===_sharedConstants.LevelStatus.attempted,imperfect+=levelProgress.status===_sharedConstants.LevelStatus.passed,completed+=completedStatuses.includes(levelProgress.status),timeSpent+=levelProgress.timeSpent||0,lastTimestamp=Math.max(lastTimestamp,levelProgress.lastTimestamp||0))}));var incomplete=filteredLevels.length-completed-imperfect;if(!(attempted+imperfect+completed>0))return null;var getPercent=function getPercent(count){return 100*count/filteredLevels.length};return{incompletePercent:getPercent(incomplete),imperfectPercent:getPercent(imperfect),completedPercent:getPercent(completed),timeSpent,lastTimestamp}}(studentLevelProgress,lesson.levels)})),sectionLessonProgress[studentId]=studentLessonProgress})),sectionLessonProgress},exports.processedLevel=exports.processServerStudentProgress=exports.processServerSectionProgress=exports.levelProgressFromStatus=exports.levelProgressFromServer=exports.levelProgressFromResult=void 0,exports.shouldShowReviewStates=function shouldShowReviewStates(unit){return unit.isCsd||unit.isCsp},exports.studentNeedsFeedback=void 0;var _lodash=function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}(__webpack_require__("./node_modules/lodash/lodash.js")),_activityUtils=__webpack_require__("./src/code-studio/activityUtils.js"),_hiddenLessonRedux=__webpack_require__("./src/code-studio/hiddenLessonRedux.js"),_lessonLockRedux=__webpack_require__("./src/code-studio/lessonLockRedux.js"),_viewAsRedux=__webpack_require__("./src/code-studio/viewAsRedux.js"),_sharedConstants=__webpack_require__("./generated-scripts/sharedConstants.ts"),_progressTypes=__webpack_require__("./src/templates/progress/progressTypes.js");function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function lessonLocked(levels){return!!levels[levels.length-1].isLocked}var defaultBubbleIcon=exports.defaultBubbleIcon="desktop";function isLevelAssessment(level){return"assessment"===level.kind}exports.commentLeft=function commentLeft(progress){return(null==progress?void 0:progress.teacherFeedbackCommented)&&(null==progress?void 0:progress.teacherFeedbackNew)},exports.studentNeedsFeedback=function studentNeedsFeedback(progress,level){return progress&&progress.status!==_sharedConstants.LevelStatus.not_tried&&!progress.teacherFeedbackNew&&"assessment"===level.kind&&level.canHaveFeedback};var _processedLevel=exports.processedLevel=function processedLevel(level,parentLevelId){var id=level.activeId||level.id;return{id,url:level.url,name:level.name,app:level.app,usesLab2:level.uses_lab2,progression:level.progression,progressionDisplayName:level.progression_display_name,kind:level.kind,icon:level.icon,isUnplugged:level.display_as_unplugged,levelNumber:level.kind===_sharedConstants.LevelKind.unplugged?void 0:level.title||level.position,bubbleText:level.kind===_sharedConstants.LevelKind.unplugged?void 0:level.letter||level.title.toString(),isConceptLevel:level.is_concept_level,isValidated:level.is_validated,canHaveFeedback:level.can_have_feedback,bonus:level.bonus,pageNumber:void 0!==level.page_number?level.page_number:_progressTypes.PUZZLE_PAGE_NONE,scriptLevelId:parentLevelId?void 0:level.id,sublevels:level.sublevels&&level.sublevels.map((function(sublevel){return _processedLevel(sublevel,id)})),path:level.path,parentLevelId}},getLevelResult=exports.getLevelResult=function getLevelResult(serverProgress){return serverProgress.result||(0,_activityUtils.resultFromStatus)(serverProgress.status)},getPagesProgress=function getPagesProgress(serverProgress){var _serverProgress$pages;return(null===(_serverProgress$pages=serverProgress.pages_completed)||void 0===_serverProgress$pages?void 0:_serverProgress$pages.length)>1?serverProgress.pages_completed.map((function(pageResult){var pageProgress=pageResult&&levelProgressFromResult(pageResult)||levelProgressFromStatus(_sharedConstants.LevelStatus.not_tried);return pageProgress.locked=serverProgress.locked||!1,pageProgress})):null},levelProgressFromServer=exports.levelProgressFromServer=function levelProgressFromServer(serverProgress){return{status:serverProgress.status||_sharedConstants.LevelStatus.not_tried,result:getLevelResult(serverProgress),locked:serverProgress.locked||!1,paired:serverProgress.paired||!1,timeSpent:serverProgress.time_spent,teacherFeedbackReviewState:serverProgress.teacher_feedback_review_state,teacherFeedbackNew:serverProgress.teacher_feedback_new||!1,teacherFeedbackCommented:serverProgress.teacher_feedback_commented||!1,lastTimestamp:serverProgress.last_progress_at,pages:getPagesProgress(serverProgress)}},processServerStudentProgress=exports.processServerStudentProgress=function processServerStudentProgress(serverStudentProgress){return _lodash.default.mapValues(serverStudentProgress,(function(progress){return levelProgressFromServer(progress)}))},levelProgressFromStatus=(exports.processServerSectionProgress=function processServerSectionProgress(serverSectionProgress){return _lodash.default.mapValues(serverSectionProgress,(function(student){return processServerStudentProgress(student)}))},exports.levelProgressFromStatus=function levelProgressFromStatus(status){return levelProgressFromServer({status})}),levelProgressFromResult=exports.levelProgressFromResult=function levelProgressFromResult(result){return levelProgressFromStatus((0,_activityUtils.activityCssClass)(result))}},"./src/templates/progress/progressTypes.js":(__unused_webpack_module,exports,__webpack_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.unitProgressType=exports.studentType=exports.studentLevelProgressType=exports.studentLessonProgressType=exports.levelWithProgressType=exports.levelType=exports.lessonType=exports.groupedLessonsType=exports.PUZZLE_PAGE_NONE=void 0;var _propTypes=function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}(__webpack_require__("./node_modules/prop-types/index.js")),_types=__webpack_require__("./src/templates/feedback/types.js");function _typeof(o){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach((function(r){_defineProperty(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function _defineProperty(e,r,t){return(r=function _toPropertyKey(t){var i=function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(t,"string");return"symbol"==_typeof(i)?i:i+""}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}exports.PUZZLE_PAGE_NONE=-1,exports.studentType=_propTypes.default.shape({id:_propTypes.default.number.isRequired,name:_propTypes.default.string.isRequired});var levelShape={id:_propTypes.default.string.isRequired,levelNumber:_propTypes.default.number,bubbleText:_propTypes.default.string,kind:_propTypes.default.string,url:_propTypes.default.string,name:_propTypes.default.string,icon:_propTypes.default.string,isUnplugged:_propTypes.default.bool,isConceptLevel:_propTypes.default.bool,pageNumber:_propTypes.default.number};levelShape.sublevels=_propTypes.default.arrayOf(_propTypes.default.shape(levelWithProgressType));exports.levelType=_propTypes.default.shape(levelShape);var levelWithProgressType=exports.levelWithProgressType=_propTypes.default.shape(_objectSpread(_objectSpread({},levelShape),{},{status:_propTypes.default.string.isRequired,paired:_propTypes.default.bool,isLocked:_propTypes.default.bool,isCurrentLevel:_propTypes.default.bool})),studentLevelProgressShape={status:_propTypes.default.string.isRequired,result:_propTypes.default.number.isRequired,locked:_propTypes.default.bool.isRequired,paired:_propTypes.default.bool.isRequired,timeSpent:_propTypes.default.number,lastTimestamp:_propTypes.default.number,teacherFeedbackReviewState:_propTypes.default.oneOf(Object.keys(_types.ReviewStates)),teacherFeedbackNew:_propTypes.default.bool.isRequired};studentLevelProgressShape.pages=_propTypes.default.arrayOf(_propTypes.default.shape(studentLevelProgressShape));var studentLevelProgressType=exports.studentLevelProgressType=_propTypes.default.shape(studentLevelProgressShape),lessonType=(exports.unitProgressType=_propTypes.default.objectOf(studentLevelProgressType),exports.lessonType=_propTypes.default.shape({name:_propTypes.default.string.isRequired,id:_propTypes.default.number.isRequired,lockable:_propTypes.default.bool.isRequired,lessonNumber:_propTypes.default.number,lesson_plan_html_url:_propTypes.default.string,lesson_feedback_url:_propTypes.default.string,isFocusArea:_propTypes.default.bool.isRequired,description_student:_propTypes.default.string,description_teacher:_propTypes.default.string})),lessonGroupShape=(exports.studentLessonProgressType=_propTypes.default.shape({incompletePercent:_propTypes.default.number.isRequired,imperfectPercent:_propTypes.default.number.isRequired,completedPercent:_propTypes.default.number.isRequired,timeSpent:_propTypes.default.number.isRequired,lastTimestamp:_propTypes.default.number.isRequired}),{id:_propTypes.default.number,displayName:_propTypes.default.string,bigQuestions:_propTypes.default.string,description:_propTypes.default.string});exports.groupedLessonsType=_propTypes.default.shape({lessonGroup:_propTypes.default.shape(lessonGroupShape),lessons:_propTypes.default.arrayOf(lessonType).isRequired,levelsByLesson:_propTypes.default.arrayOf(_propTypes.default.arrayOf(levelWithProgressType)).isRequired})}}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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TSxDQUNoRHFMLFlBQWF0TCxXQUFBQSxRQUFVQyxNQUFNaUwsa0JBQzdCcFMsUUFBU2tILFdBQUFBLFFBQVV3QixRQUFRa0osWUFBWXRLLFdBQ3ZDbUwsZUFBZ0J2TCxXQUFBQSxRQUFVd0IsUUFBUXhCLFdBQUFBLFFBQVV3QixRQUFRNEksd0JBQ2pEaEssWSIsInNvdXJjZXMiOlsid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL3NyYy9jb2RlLXN0dWRpby9hY3Rpdml0eVV0aWxzLmpzIiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL3NyYy9jb2RlLXN0dWRpby9oaWRkZW5MZXNzb25SZWR1eC5qcyIsIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9zcmMvY29kZS1zdHVkaW8vbGVzc29uTG9ja1JlZHV4LmpzIiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL3NyYy9jb2RlLXN0dWRpby91dGlscy5qcyIsIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9zcmMvY29kZS1zdHVkaW8vdmlld0FzUmVkdXguanMiLCJ3ZWJwYWNrOi8vYmxvY2tseS1tb29jLy4vc3JjL3RlbXBsYXRlcy9mZWVkYmFjay90eXBlcy5qcyIsIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9zcmMvdGVtcGxhdGVzL3Byb2dyZXNzL3Byb2dyZXNzSGVscGVycy5qcyIsIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9zcmMvdGVtcGxhdGVzL3Byb2dyZXNzL3Byb2dyZXNzVHlwZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIHNldCBvZiB1dGlsaXR5IGZ1bmN0aW9ucyBtYWRlIGZvciBkZWFsaW5nIHdpdGggYWN0aXZpdGllcyBlYXNpZXIuXG4gKi9cblxuaW1wb3J0IHtUZXN0UmVzdWx0c30gZnJvbSAnQGNkby9hcHBzL2NvbnN0YW50cyc7XG5pbXBvcnQge0xldmVsU3RhdHVzfSBmcm9tICdAY2RvL2dlbmVyYXRlZC1zY3JpcHRzL3NoYXJlZENvbnN0YW50cyc7XG5cbi8qKlxuICogU2VlIEFwcGxpY2F0aW9uSGVscGVyI2FjdGl2aXR5X2Nzc19jbGFzcy5cbiAqIEBwYXJhbSByZXN1bHRcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IGFjdGl2aXR5Q3NzQ2xhc3MgPSByZXN1bHQgPT4ge1xuICBpZiAoIXJlc3VsdCB8fCByZXN1bHQgPT09IFRlc3RSZXN1bHRzLk5PX1RFU1RTX1JVTikge1xuICAgIHJldHVybiBMZXZlbFN0YXR1cy5ub3RfdHJpZWQ7XG4gIH1cbiAgaWYgKHJlc3VsdCA9PT0gVGVzdFJlc3VsdHMuUkVWSUVXX0FDQ0VQVEVEX1JFU1VMVCkge1xuICAgIHJldHVybiBMZXZlbFN0YXR1cy5yZXZpZXdfYWNjZXB0ZWQ7XG4gIH1cbiAgaWYgKHJlc3VsdCA9PT0gVGVzdFJlc3VsdHMuUkVWSUVXX1JFSkVDVEVEX1JFU1VMVCkge1xuICAgIHJldHVybiBMZXZlbFN0YXR1cy5yZXZpZXdfcmVqZWN0ZWQ7XG4gIH1cbiAgaWYgKHJlc3VsdCA9PT0gVGVzdFJlc3VsdHMuU1VCTUlUVEVEX1JFU1VMVCkge1xuICAgIHJldHVybiBMZXZlbFN0YXR1cy5zdWJtaXR0ZWQ7XG4gIH1cbiAgaWYgKHJlc3VsdCA+PSBUZXN0UmVzdWx0cy5NSU5JTVVNX09QVElNQUxfUkVTVUxUKSB7XG4gICAgcmV0dXJuIExldmVsU3RhdHVzLnBlcmZlY3Q7XG4gIH1cbiAgaWYgKHJlc3VsdCA+PSBUZXN0UmVzdWx0cy5NSU5JTVVNX1BBU1NfUkVTVUxUKSB7XG4gICAgcmV0dXJuIExldmVsU3RhdHVzLnBhc3NlZDtcbiAgfVxuICByZXR1cm4gTGV2ZWxTdGF0dXMuYXR0ZW1wdGVkO1xufTtcblxuLyoqXG4gKiBJbnZlcnNlIG9mIHRoZSBhYm92ZSBmdW5jdGlvbi5cbiAqIEdpdmVuIGEgc3RhdHVzIHN0cmluZywgcmV0dXJucyBhIHJlc3VsdCB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0dXNcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc3VsdEZyb21TdGF0dXMgPSBzdGF0dXMgPT4ge1xuICBpZiAoc3RhdHVzID09PSBMZXZlbFN0YXR1cy5yZXZpZXdfYWNjZXB0ZWQpIHtcbiAgICByZXR1cm4gVGVzdFJlc3VsdHMuUkVWSUVXX0FDQ0VQVEVEX1JFU1VMVDtcbiAgfVxuICBpZiAoc3RhdHVzID09PSBMZXZlbFN0YXR1cy5yZXZpZXdfcmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gVGVzdFJlc3VsdHMuUkVWSUVXX1JFSkVDVEVEX1JFU1VMVDtcbiAgfVxuICBpZiAoc3RhdHVzID09PSBMZXZlbFN0YXR1cy5zdWJtaXR0ZWQpIHtcbiAgICByZXR1cm4gVGVzdFJlc3VsdHMuU1VCTUlUVEVEX1JFU1VMVDtcbiAgfVxuICBpZiAoc3RhdHVzID09PSBMZXZlbFN0YXR1cy5mcmVlX3BsYXlfY29tcGxldGUpIHtcbiAgICByZXR1cm4gVGVzdFJlc3VsdHMuRlJFRV9QTEFZO1xuICB9XG4gIGlmIChzdGF0dXMgPT09IExldmVsU3RhdHVzLnBlcmZlY3QpIHtcbiAgICByZXR1cm4gVGVzdFJlc3VsdHMuQUxMX1BBU1M7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gTGV2ZWxTdGF0dXMucGFzc2VkKSB7XG4gICAgcmV0dXJuIFRlc3RSZXN1bHRzLk1JTklNVU1fUEFTU19SRVNVTFQ7XG4gIH1cbiAgcmV0dXJuIFRlc3RSZXN1bHRzLk5PX1RFU1RTX1JVTjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgXCJiZXN0XCIgb2YgdGhlIHR3byByZXN1bHRzLCBhcyBkZWZpbmVkIGluIGFwcHMvc3JjL2NvbnN0YW50cy5qcy5cbiAqIE5vdGUgdGhhdCB0aGVyZSBhcmUgbmVnYXRpdmUgcmVzdWx0cyB0aGF0IGNvdW50IGFzIGFuIGF0dGVtcHQsIHNvIHdlIGNhbid0XG4gKiBqdXN0IHRha2UgdGhlIG1heGltdW0uXG4gKiBAcGFyYW0ge051bWJlcn0gYVxuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEByZXR1cm4ge051bWJlcn0gVGhlIGJldHRlciByZXN1bHQuXG4gKi9cbmV4cG9ydCBjb25zdCBtZXJnZUFjdGl2aXR5UmVzdWx0ID0gKGEsIGIpID0+IHtcbiAgYSA9IGEgfHwgMDtcbiAgYiA9IGIgfHwgMDtcbiAgaWYgKGEgPT09IDApIHtcbiAgICByZXR1cm4gYjtcbiAgfVxuICBpZiAoYiA9PT0gMCkge1xuICAgIHJldHVybiBhO1xuICB9XG4gIHJldHVybiBNYXRoLm1heChhLCBiKTtcbn07XG4iLCIvKipcbiAqIFJlZHVjZXIgYW5kIGFjdGlvbnMgdXNlZCB0byB0cmFjayB3aGF0IHNlY3Rpb25zL3NjcmlwdHMgYXJlIGFyZSBoaWRkZW4gb24gYVxuICogcGVyIHNlY3Rpb24gYmFzaXMuXG4gKi9cbmltcG9ydCBJbW11dGFibGUgZnJvbSAnaW1tdXRhYmxlJztcbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbmNvbnN0IFNFVF9ISURERU5fTEVTU09OUyA9ICdoaWRkZW5MZXNzb24vU0VUX0hJRERFTl9MRVNTT05TJztcbmNvbnN0IFVQREFURV9ISURERU5fTEVTU09OID0gJ2hpZGRlbkxlc3Nvbi9VUERBVEVfSElEREVOX0xFU1NPTic7XG5jb25zdCBVUERBVEVfSElEREVOX1NDUklQVCA9ICdoaWRkZW5MZXNzb24vVVBEQVRFX0hJRERFTl9TQ1JJUFQnO1xuXG5leHBvcnQgY29uc3QgU1RVREVOVF9TRUNUSU9OX0lEID0gJ1NUVURFTlQnO1xuXG5jb25zdCBIaWRkZW5TdGF0ZSA9IEltbXV0YWJsZS5SZWNvcmQoe1xuICBoaWRkZW5MZXNzb25zSW5pdGlhbGl6ZWQ6IGZhbHNlLFxuICBoaWRlYWJsZUxlc3NvbnNBbGxvd2VkOiBmYWxzZSxcbiAgLy8gQSBtYXBwaW5nLCB3aGVyZSB0aGUga2V5IGlzIHRoZSBzZWN0aW9uSWQsIGFuZCB0aGUgdmFsdWUgaXMgYSBtYXBwaW5nIGZyb21cbiAgLy8gbGVzc29uSWQgdG8gYSBib29sIGluZGljYXRpbmcgd2hldGhlciB0aGF0IGxlc3NvbiBpcyBoaWRkZW4gKHRydWUpIG9yIG5vdCAoZmFsc2UpXG4gIC8vIFRlYWNoZXJzIHdpbGwgcG90ZW50aWFsbHkgaGF2ZSBhIG51bWJlciBvZiBzZWN0aW9uIGlkcy4gRm9yIHN0dWRlbnRzIHdlXG4gIC8vIHVzZSBhIHNlY3Rpb25JZCBvZiBTVFVERU5UX1NFQ1RJT05fSUQsIHdoaWNoIHJlcHJlc2VudHMgdGhlIGhpZGRlbiBzdGF0ZVxuICAvLyBmb3IgdGhlIHN0dWRlbnQgYmFzZWQgb24gdGhlIHNlY3Rpb25zIHRoZXkgYXJlIGluLlxuICBsZXNzb25zQnlTZWN0aW9uOiBJbW11dGFibGUuTWFwKHtcbiAgICAvLyBbc2VjdGlvbklkXToge1xuICAgIC8vICAgW2xlc3NvbklkXTogdHJ1ZVxuICAgIC8vIH1cbiAgfSksXG4gIC8vIFNhbWUgYXMgYWJvdmUgYnV0IGZvciBoaWRpbmcgc2NyaXB0cyBpbiBhIHNlY3Rpb24gaW5zdGVhZCBvZiBsZXNzb25zXG4gIHNjcmlwdHNCeVNlY3Rpb246IEltbXV0YWJsZS5NYXAoe1xuICAgIC8vIFtzZWN0aW9uSWRdOiB7XG4gICAgLy8gICBbc2NyaXB0SWRdOiB0cnVlXG4gICAgLy8gfVxuICB9KSxcbn0pO1xuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGF0IHdlIG5ldmVyIGhhdmUgbXVsdGlwbGUgbGVzc29uc0J5U2VjdGlvbiBpZiB3ZSBoYXZlIFNUVURFTlRfU0VDVElPTl9JRFxuICogQHRocm93cyBJZiBuZXcgc3RhdGUgaXMgaW52YWxpZFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVNlY3Rpb25JZHMoc3RhdGUpIHtcbiAgaWYgKFxuICAgIHN0YXRlLmdldEluKFsnbGVzc29uc0J5U2VjdGlvbicsIFNUVURFTlRfU0VDVElPTl9JRF0pICYmXG4gICAgc3RhdGUuZ2V0KCdsZXNzb25zQnlTZWN0aW9uJykuc2l6ZSA+IDFcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1Nob3VsZCBuZXZlciBoYXZlIFNUVURFTlRfU0VDVElPTl9JRCBhbG9uZ3NpZGUgb3RoZXIgc2VjdGlvbklkcydcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogSGlkZGVuIGxlc3NvbiByZWR1Y2VyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZHVjZXIoc3RhdGUgPSBuZXcgSGlkZGVuU3RhdGUoKSwgYWN0aW9uKSB7XG4gIGlmIChhY3Rpb24udHlwZSA9PT0gU0VUX0hJRERFTl9MRVNTT05TKSB7XG4gICAgY29uc3Qge2hpZGRlbkxlc3NvbnNQZXJTZWN0aW9uLCBoaWRlYWJsZUxlc3NvbnNBbGxvd2VkfSA9IGFjdGlvbjtcblxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIHNlY3Rpb25cbiAgICBjb25zdCBzZWN0aW9uSWRzID0gT2JqZWN0LmtleXMoaGlkZGVuTGVzc29uc1BlclNlY3Rpb24pO1xuICAgIGxldCBuZXh0U3RhdGUgPSBzdGF0ZTtcbiAgICBzZWN0aW9uSWRzLmZvckVhY2goc2VjdGlvbklkID0+IHtcbiAgICAgIC8vIEFuZCBpdGVyYXRlIHRocm91Z2ggZWFjaCBoaWRkZW4gbGVzc29uIHdpdGhpbiB0aGF0IHNlY3Rpb25cbiAgICAgIGNvbnN0IGhpZGRlbkxlc3NvbklkcyA9IGhpZGRlbkxlc3NvbnNQZXJTZWN0aW9uW3NlY3Rpb25JZF07XG4gICAgICBoaWRkZW5MZXNzb25JZHMuZm9yRWFjaChsZXNzb25JZCA9PiB7XG4gICAgICAgIG5leHRTdGF0ZSA9IG5leHRTdGF0ZS5zZXRJbihcbiAgICAgICAgICBbJ2xlc3NvbnNCeVNlY3Rpb24nLCBzZWN0aW9uSWQsIGxlc3NvbklkLnRvU3RyaW5nKCldLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHZhbGlkYXRlU2VjdGlvbklkcyhuZXh0U3RhdGUpO1xuXG4gICAgcmV0dXJuIG5leHRTdGF0ZS5tZXJnZSh7XG4gICAgICBoaWRkZW5MZXNzb25zSW5pdGlhbGl6ZWQ6IHRydWUsXG4gICAgICBoaWRlYWJsZUxlc3NvbnNBbGxvd2VkLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSBVUERBVEVfSElEREVOX0xFU1NPTikge1xuICAgIGNvbnN0IHtzZWN0aW9uSWQsIGxlc3NvbklkLCBoaWRkZW59ID0gYWN0aW9uO1xuICAgIGNvbnN0IG5leHRTdGF0ZSA9IHN0YXRlLnNldEluKFxuICAgICAgWydsZXNzb25zQnlTZWN0aW9uJywgc2VjdGlvbklkLCBsZXNzb25JZC50b1N0cmluZygpXSxcbiAgICAgIGhpZGRlblxuICAgICk7XG4gICAgdmFsaWRhdGVTZWN0aW9uSWRzKG5leHRTdGF0ZSk7XG4gICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gVVBEQVRFX0hJRERFTl9TQ1JJUFQpIHtcbiAgICBjb25zdCB7c2VjdGlvbklkLCBzY3JpcHRJZCwgaGlkZGVufSA9IGFjdGlvbjtcbiAgICBjb25zdCBuZXh0U3RhdGUgPSBzdGF0ZS5zZXRJbihcbiAgICAgIFsnc2NyaXB0c0J5U2VjdGlvbicsIHNlY3Rpb25JZC50b1N0cmluZygpLCBzY3JpcHRJZC50b1N0cmluZygpXSxcbiAgICAgIGhpZGRlblxuICAgICk7XG4gICAgdmFsaWRhdGVTZWN0aW9uSWRzKG5leHRTdGF0ZSk7XG4gICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuLy8gYWN0aW9uIGNyZWF0b3JzXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGhpZGRlbkxlc3NvbnNQZXJTZWN0aW9uIC0gTWFwcGluZyBmcm9tIHNlY3Rpb25JZCB0byBhIGxpc3Qgb2YgbGVzc29uSWRzXG4gKiAgIHRoYXQgYXJlIGhpZGRlbiBmb3IgdGhhdCBzZWN0aW9uLlxuICogQHBhcmFtIHtib29sfSBoaWRlYWJsZUxlc3NvbnNBbGxvd2VkIC0gVHJ1ZSBpZiB3ZSdyZSBhYmxlIHRvIHRvZ2dsZSBoaWRkZW4gbGVzc29uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SGlkZGVuTGVzc29ucyhcbiAgaGlkZGVuTGVzc29uc1BlclNlY3Rpb24sXG4gIGhpZGVhYmxlTGVzc29uc0FsbG93ZWRcbikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFNFVF9ISURERU5fTEVTU09OUyxcbiAgICBoaWRkZW5MZXNzb25zUGVyU2VjdGlvbixcbiAgICBoaWRlYWJsZUxlc3NvbnNBbGxvd2VkLFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUhpZGRlbkxlc3NvbihzZWN0aW9uSWQsIGxlc3NvbklkLCBoaWRkZW4pIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBVUERBVEVfSElEREVOX0xFU1NPTixcbiAgICBzZWN0aW9uSWQsXG4gICAgbGVzc29uSWQsXG4gICAgaGlkZGVuLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlSGlkZGVuU2NyaXB0KHNlY3Rpb25JZCwgc2NyaXB0SWQsIGhpZGRlbikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFVQREFURV9ISURERU5fU0NSSVBULFxuICAgIHNlY3Rpb25JZCxcbiAgICBzY3JpcHRJZCxcbiAgICBoaWRkZW4sXG4gIH07XG59XG5cbi8qKlxuICogVG9nZ2xlIHRoZSBoaWRkZW4gc3RhdGUgb2YgYSBwYXJ0aWN1bGFyIGxlc3NvbiBpbiBhIHNlY3Rpb24sIHVwZGF0aW5nIG91ciBsb2NhbFxuICogc3RhdGUgdG8gcmVmbGVjdCB0aGUgY2hhbmdlLCBhbmQgcG9zdGluZyB0byB0aGUgc2VydmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9nZ2xlSGlkZGVuTGVzc29uKHNjcmlwdE5hbWUsIHNlY3Rpb25JZCwgbGVzc29uSWQsIGhpZGRlbikge1xuICByZXR1cm4gZGlzcGF0Y2ggPT4ge1xuICAgIC8vIHVwZGF0ZSBsb2NhbCBzdGF0ZVxuICAgIGRpc3BhdGNoKHVwZGF0ZUhpZGRlbkxlc3NvbihzZWN0aW9uSWQsIGxlc3NvbklkLCBoaWRkZW4pKTtcbiAgICBwb3N0VG9nZ2xlSGlkZGVuKHNjcmlwdE5hbWUsIHNlY3Rpb25JZCwgbGVzc29uSWQsIGhpZGRlbik7XG4gIH07XG59XG5cbi8qKlxuICogVG9nZ2xlIHRoZSBoaWRkZW4gc3RhdGUgb2YgYSBwYXJ0aWN1bGFyIHNjcmlwdCBpbiBhIHNlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2dnbGVIaWRkZW5TY3JpcHQoc2NyaXB0TmFtZSwgc2VjdGlvbklkLCBzY3JpcHRJZCwgaGlkZGVuKSB7XG4gIHJldHVybiBkaXNwYXRjaCA9PiB7XG4gICAgZGlzcGF0Y2godXBkYXRlSGlkZGVuU2NyaXB0KHNlY3Rpb25JZCwgc2NyaXB0SWQsIGhpZGRlbikpO1xuICAgIHBvc3RUb2dnbGVIaWRkZW4oc2NyaXB0TmFtZSwgc2VjdGlvbklkLCBudWxsLCBoaWRkZW4pO1xuICB9O1xufVxuXG4vKipcbiAqIFBvc3QgdG8gdGhlIHNlcnZlciB0byB0b2dnbGUgdGhlIGhpZGRlbiBzdGF0ZSBvZiBhIGxlc3NvbiBvciBzY3JpcHQuIGxlc3NvbklkXG4gKiBzaG91bGQgYmUgbnVsbCBpZiB3ZSdyZSBoaWRpbmcgdGhlIHNjcmlwdCByYXRoZXIgdGhhbiBhIHBhcnRpY3VsYXIgbGVzc29uXG4gKiBAcGFyYW0ge3N0cmluZ30gc2NyaXB0TmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IHNlY3Rpb25JZFxuICogQHBhcmFtIHtzdHJpbmd9IGxlc3NvbklkXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGhpZGRlblxuICovXG5mdW5jdGlvbiBwb3N0VG9nZ2xlSGlkZGVuKHNjcmlwdE5hbWUsIHNlY3Rpb25JZCwgbGVzc29uSWQsIGhpZGRlbikge1xuICBjb25zdCBkYXRhID0ge1xuICAgIHNlY3Rpb25faWQ6IHNlY3Rpb25JZCxcbiAgICBoaWRkZW4sXG4gIH07XG4gIGlmIChsZXNzb25JZCkge1xuICAgIGRhdGEuc3RhZ2VfaWQgPSBsZXNzb25JZDtcbiAgfVxuXG4gICQuYWpheCh7XG4gICAgdHlwZTogJ1BPU1QnLFxuICAgIHVybDogYC9zLyR7c2NyaXB0TmFtZX0vdG9nZ2xlX2hpZGRlbmAsXG4gICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICB9KS5zdWNjZXNzKCgpID0+IHtcbiAgICB3aW5kb3cuX19UZXN0SW50ZXJmYWNlID0gd2luZG93Ll9fVGVzdEludGVyZmFjZSB8fCB7fTtcbiAgICB3aW5kb3cuX19UZXN0SW50ZXJmYWNlLnRvZ2dsZUhpZGRlblVuaXRDb21wbGV0ZSA9IHRydWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIFF1ZXJ5IHNlcnZlciBmb3IgaGlkZGVuIGxlc3NvbiBpZHMsIGFuZCAocG90ZW50aWFsbHkpIHRvZ2dsZSB3aGV0aGVyIG9yIG5vdCB3ZVxuICogYXJlIGFibGUgdG8gbWFyayBsZXNzb25zIGFzIGhpZGVhYmxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNjcmlwdE5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY2FuSGlkZUxlc3NvbnMgSWYgdHJ1ZSwgaW5mb3JtIHJlZHV4IHRoYXQgd2UncmUgYWJsZSB0byB0b2dnbGVcbiAqICAgd2hldGhlciBvciBub3QgbGVzc29ucyBhcmUgaGlkZGVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGlkZGVuTGVzc29ucyhzY3JpcHROYW1lLCBjYW5IaWRlTGVzc29ucykge1xuICByZXR1cm4gZGlzcGF0Y2ggPT4ge1xuICAgICQuYWpheCh7XG4gICAgICB0eXBlOiAnR0VUJyxcbiAgICAgIHVybDogYC9zLyR7c2NyaXB0TmFtZX0vaGlkZGVuX2xlc3NvbnNgLFxuICAgICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgfSlcbiAgICAgIC5kb25lKHJlc3BvbnNlID0+XG4gICAgICAgIGRpc3BhdGNoKGluaXRpYWxpemVIaWRkZW5MZXNzb25zKHJlc3BvbnNlLCBjYW5IaWRlTGVzc29ucykpXG4gICAgICApXG4gICAgICAuZmFpbChlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGhpZGRlbiBsZXNzb25zIGJhc2VkIG9uIHNlcnZlciBkYXRhLiBJbiB0aGUgY2FzZSBvZiBhIHN0dWRlbnQsIHRoaXNcbiAqIHdpbGwgYmUgYSBsaXN0IG9mIGhpZGRlbiBsZXNzb24gaWRzLiBJbiB0aGUgY2FzZSBvZiBhIHRlYWNoZXIsIGl0IHdpbGwgYmVcbiAqIGEgbWFwcGluZyBmcm9tIHNlY3Rpb24gaWQgdG8gYSBsaXN0IG9mIGhpZGRlbiBsZXNzb24gaWRzIGZvciB0aGF0IHNlY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nW118T2JqZWN0PHN0cmluZywgc3RyaW5nW10+fSBkYXRhXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNhbkhpZGVMZXNzb25zIC0gVHJ1ZSBpZiB3ZSdyZSBhYmxlIHRvIHRvZ2dsZSBoaWRkZW4gbGVzc29uc1xuICovXG5mdW5jdGlvbiBpbml0aWFsaXplSGlkZGVuTGVzc29ucyhkYXRhLCBjYW5IaWRlTGVzc29ucykge1xuICByZXR1cm4gZGlzcGF0Y2ggPT4ge1xuICAgIC8vIEZvciBhIGluc3RydWN0b3IsIHdlIGdldCBiYWNrIGEgbWFwIG9mIHNlY3Rpb24gaWQgdG8gaGlkZGVuIGxlc3NvbiBpZHNcbiAgICAvLyBGb3IgYSBwYXJ0aWNpcGFudCwgd2UganVzdCBnZXQgYmFjayBhIGxpc3Qgb2YgaGlkZGVuIGxlc3NvbiBpZHMuIFR1cm4gdGhhdFxuICAgIC8vIGludG8gYW4gb2JqZWN0LCB1bmRlciB0aGUgJ3NlY3Rpb25JZCcgb2YgU1RVREVOVF9TRUNUSU9OX0lEXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGRhdGEgPSB7W1NUVURFTlRfU0VDVElPTl9JRF06IGRhdGF9O1xuICAgIH1cblxuICAgIGRpc3BhdGNoKHNldEhpZGRlbkxlc3NvbnMoZGF0YSwgISFjYW5IaWRlTGVzc29ucykpO1xuICB9O1xufVxuXG4vKipcbiAqIEdpdmVuIHNlcnZlciBkYXRhIGZvciB0aGUgc2V0IG9mIHNjcmlwdHMgdGhhdCBhcmUgaGlkZGVuIGZvciB0aGlzIHVzZXIsXG4gKiBwb3B1bGF0ZSBvdXIgcmVkdXggc3RvcmUuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfE9iamVjdDxzdHJpbmcsIHN0cmluZ1tdPn0gZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZUhpZGRlblNjcmlwdHMoZGF0YSkge1xuICByZXR1cm4gZGlzcGF0Y2ggPT4ge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBhIHRlYWNoZXIsIHdlIGdldCBiYWNrIGEgbWFwIG9mIHNlY3Rpb24gaWQgdG8gaGlkZGVuIHNjcmlwdCBpZHNcbiAgICAvLyBGb3IgYSBzdHVkZW50LCB3ZSBqdXN0IGdldCBiYWNrIGEgbGlzdCBvZiBoaWRkZW4gc2NyaXB0IGlkcy4gVHVybiB0aGF0XG4gICAgLy8gaW50byBhbiBvYmplY3QsIHVuZGVyIHRoZSAnc2VjdGlvbklkJyBvZiBTVFVERU5UX1NFQ1RJT05fSURcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgZGF0YSA9IHtbU1RVREVOVF9TRUNUSU9OX0lEXTogZGF0YX07XG4gICAgfVxuXG4gICAgT2JqZWN0LmtleXMoZGF0YSkuZm9yRWFjaChzZWN0aW9uSWQgPT4ge1xuICAgICAgY29uc3QgaGlkZGVuU2NyaXB0SWRzID0gZGF0YVtzZWN0aW9uSWRdO1xuICAgICAgaGlkZGVuU2NyaXB0SWRzLmZvckVhY2goc2NyaXB0SWQgPT4ge1xuICAgICAgICBkaXNwYXRjaCh1cGRhdGVIaWRkZW5TY3JpcHQoc2VjdGlvbklkLCBzY3JpcHRJZCwgdHJ1ZSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG59XG5cbi8vIHV0aWxzXG5cbi8qKlxuICogSGVscGVyIHRvIGRldGVybWluZSB3aGV0aGVyIGEgbGVzc29uIGlzIGhpZGRlbiBmb3IgYSBnaXZlbiBzZWN0aW9uLiBJZiBub1xuICogc2VjdGlvbiBpcyBnaXZlbiwgd2UgYXNzdW1lIHRoaXMgaXMgYSBzdHVkZW50IGFuZCB1c2UgU1RVREVOVF9TRUNUSU9OX0lEXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xlc3NvbkhpZGRlbkZvclNlY3Rpb24oc3RhdGUsIHNlY3Rpb25JZCwgbGVzc29uSWQpIHtcbiAgcmV0dXJuIGlzSGlkZGVuRm9yU2VjdGlvbihzdGF0ZSwgc2VjdGlvbklkLCBsZXNzb25JZCwgJ2xlc3NvbnNCeVNlY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBzY3JpcHQgaXMgaGlkZGVuIGZvciBhIGdpdmVuIHNlY3Rpb24uIElmIG5vXG4gKiBzZWN0aW9uIGlzIGdpdmVuLCB3ZSBhc3N1bWUgdGhpcyBpcyBhIHN0dWRlbnQgYW5kIHVzZSBTVFVERU5UX1NFQ1RJT05fSURcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2NyaXB0SGlkZGVuRm9yU2VjdGlvbihzdGF0ZSwgc2VjdGlvbklkLCBzY3JpcHRJZCkge1xuICByZXR1cm4gaXNIaWRkZW5Gb3JTZWN0aW9uKHN0YXRlLCBzZWN0aW9uSWQsIHNjcmlwdElkLCAnc2NyaXB0c0J5U2VjdGlvbicpO1xufVxuXG4vKipcbiAqIEhlbHBlciB1c2VkIGJ5IHRoZSBhYm92ZSB0d28gbWV0aG9kcyBzbyB0aGF0IHdlIGJlaGF2ZSB0aGUgc2FtZSB3aGVuIGxvb2tpbmdcbiAqIGZvciBoaWRkZW4gbGVzc29ucy9zY3JpcHRzXG4gKi9cbmZ1bmN0aW9uIGlzSGlkZGVuRm9yU2VjdGlvbihzdGF0ZSwgc2VjdGlvbklkLCBpdGVtSWQsIGJ5U2VjdGlvbktleSkge1xuICBpZiAoIWl0ZW1JZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBpZiB3ZSBkb24ndCBoYXZlIGEgc2VjdGlvbklkLCB3ZSBtdXN0IGJlIGEgc3R1ZGVudFxuICBpZiAoIXNlY3Rpb25JZCkge1xuICAgIHNlY3Rpb25JZCA9IFNUVURFTlRfU0VDVElPTl9JRDtcbiAgfVxuICBjb25zdCBieVNlY3Rpb24gPSBzdGF0ZS5nZXQoYnlTZWN0aW9uS2V5KTtcbiAgcmV0dXJuICEhYnlTZWN0aW9uLmdldEluKFtzZWN0aW9uSWQudG9TdHJpbmcoKSwgaXRlbUlkLnRvU3RyaW5nKCldKTtcbn1cbiIsIi8qKlxuICogUmVkdWNlciBhbmQgYWN0aW9ucyBmb3IgbGVzc29uIGxvY2sgaW5mby4gVGhpcyBpbmNsdWRlcyB0aGUgdGVhY2hlciBwYW5lbCBvblxuICogdGhlIGNvdXJzZSBvdmVydmlldyBwYWdlLCBhbmQgdGhlIGxlc3NvbiBsb2NraW5nIGRpYWxvZy5cbiAqL1xuXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHtcbiAgTk9fU0VDVElPTixcbiAgU0VMRUNUX1NFQ1RJT04sXG59IGZyb20gJ0BjZG8vYXBwcy90ZW1wbGF0ZXMvdGVhY2hlckRhc2hib2FyZC90ZWFjaGVyU2VjdGlvbnNSZWR1eCc7XG5pbXBvcnQge21ha2VFbnVtfSBmcm9tICdAY2RvL2FwcHMvdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgTG9ja1N0YXR1cyA9IG1ha2VFbnVtKCdMb2NrZWQnLCAnRWRpdGFibGUnLCAnUmVhZG9ubHlBbnN3ZXJzJyk7XG5cbi8vIEFjdGlvbiB0eXBlc1xuY29uc3QgT1BFTl9MT0NLX0RJQUxPRyA9ICdsZXNzb25Mb2NrL09QRU5fTE9DS19ESUFMT0cnO1xuZXhwb3J0IGNvbnN0IENMT1NFX0xPQ0tfRElBTE9HID0gJ2xlc3NvbkxvY2svQ0xPU0VfTE9DS19ESUFMT0cnO1xuZXhwb3J0IGNvbnN0IEJFR0lOX1NBVkUgPSAnbGVzc29uTG9jay9CRUdJTl9TQVZFJztcbmV4cG9ydCBjb25zdCBGSU5JU0hfU0FWRSA9ICdsZXNzb25Mb2NrL0ZJTklTSF9TQVZFJztcbmNvbnN0IEFVVEhPUklaRV9MT0NLQUJMRSA9ICdsZXNzb25Mb2NrL0FVVEhPUklaRV9MT0NLQUJMRSc7XG5jb25zdCBTRVRfU0VDVElPTl9MT0NLX1NUQVRVUyA9ICdsZXNzb25Mb2NrL1NFVF9TRUNUSU9OX0xPQ0tfU1RBVFVTJztcbmNvbnN0IFJFRlJFU0hfU0VDVElPTl9MT0NLX1NUQVRVUyA9ICdsZXNzb25Mb2NrL1JFRlJFU0hfU0VDVElPTl9MT0NLX1NUQVRVUyc7XG5cbmNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgbGVzc29uc0J5U2VjdGlvbklkOiB7fSxcbiAgbGVzc29uc0J5U2VjdGlvbklkTG9hZGVkOiBmYWxzZSxcbiAgbG9ja0RpYWxvZ0xlc3NvbklkOiBudWxsLFxuICAvLyBUaGUgbG9ja2luZyBpbmZvIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHNlY3Rpb24vbGVzc29uXG4gIGxvY2tTdGF0dXM6IFtdLFxuICBzYXZpbmc6IGZhbHNlLFxuICAvLyB3aGV0aGVyIHVzZXIgaXMgYWxsb3dlZCB0byBzZWUgbG9ja2FibGUgbGVzc29uc1xuICBsb2NrYWJsZUF1dGhvcml6ZWQ6IG51bGwsXG4gIGxvY2thYmxlQXV0aG9yaXplZExvYWRlZDogZmFsc2UsXG59O1xuXG4vKipcbiAqIExlc3NvbiBsb2NrIHJlZHVjZXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVkdWNlcihzdGF0ZSA9IGluaXRpYWxTdGF0ZSwgYWN0aW9uKSB7XG4gIGlmIChhY3Rpb24udHlwZSA9PT0gQVVUSE9SSVpFX0xPQ0tBQkxFKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICBsb2NrYWJsZUF1dGhvcml6ZWQ6IGFjdGlvbi5pc0F1dGhvcml6ZWQsXG4gICAgICBsb2NrYWJsZUF1dGhvcml6ZWRMb2FkZWQ6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBpZiAoYWN0aW9uLnR5cGUgPT09IFNFVF9TRUNUSU9OX0xPQ0tfU1RBVFVTKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbGVzc29uc0J5U2VjdGlvbklkOiBfLm1hcFZhbHVlcyhcbiAgICAgICAgYWN0aW9uLnNlY3Rpb25zLFxuICAgICAgICBzZWN0aW9uID0+IHNlY3Rpb24ubGVzc29uc1xuICAgICAgKSxcbiAgICAgIGxlc3NvbnNCeVNlY3Rpb25JZExvYWRlZDogdHJ1ZSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSBSRUZSRVNIX1NFQ1RJT05fTE9DS19TVEFUVVMpIHtcbiAgICBjb25zdCBsZXNzb25zQnlTZWN0aW9uSWQgPSBfLm1hcFZhbHVlcyhcbiAgICAgIGFjdGlvbi5zZWN0aW9ucyxcbiAgICAgIHNlY3Rpb24gPT4gc2VjdGlvbi5sZXNzb25zXG4gICAgKTtcblxuICAgIGNvbnN0IHtsb2NrRGlhbG9nTGVzc29uSWR9ID0gc3RhdGU7XG4gICAgaWYgKGxvY2tEaWFsb2dMZXNzb25JZCkge1xuICAgICAgY29uc3QgbG9ja1N0YXR1cyA9IGxvY2tTdGF0dXNGb3JMZXNzb24oXG4gICAgICAgIGxlc3NvbnNCeVNlY3Rpb25JZFthY3Rpb24uc2VjdGlvbklkXSxcbiAgICAgICAgbG9ja0RpYWxvZ0xlc3NvbklkXG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgbGVzc29uc0J5U2VjdGlvbklkLFxuICAgICAgICBsb2NrU3RhdHVzLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBsZXNzb25zQnlTZWN0aW9uSWQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gU0VMRUNUX1NFQ1RJT04pIHtcbiAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBzZWN0aW9uIGluZm8sIGl0IHByb2JhYmx5IG1lYW5zIHdlIGhhdmVuJ3QgbG9hZGVkXG4gICAgLy8gYW55IGxlc3NvbiBsb2NrIGRhdGEgaW4gdGhpcyBjb250ZXh0LCBhbmQgdGh1cyBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nXG4gICAgLy8gd2hlbiBhIHNlY3Rpb24gZ2V0cyBzZWxlY3RlZFxuICAgIGlmIChPYmplY3Qua2V5cyhzdGF0ZS5sZXNzb25zQnlTZWN0aW9uSWQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0IHNlY3Rpb25JZCA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIGlmIChzZWN0aW9uSWQgPT09IE5PX1NFQ1RJT04pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBsb2NrU3RhdHVzOiBpbml0aWFsU3RhdGUubG9ja1N0YXR1cyxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICghc3RhdGUubGVzc29uc0J5U2VjdGlvbklkW3NlY3Rpb25JZF0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzZWN0aW9uSWQgJHtzZWN0aW9uSWR9YCk7XG4gICAgfVxuICAgIC8vIElmIHdlIGhhdmUgYSBsb2NrU3RhdHVzIChpLmUuIGZyb20gYW4gb3BlbiBkaWFsb2cpIHdlIG5lZWQgdG8gdXBkYXRlXG4gICAgLy8gaXQgd2l0aCB0aGUgbmV3IHNlY3Rpb25cbiAgICBjb25zdCB7bG9ja0RpYWxvZ0xlc3NvbklkfSA9IHN0YXRlO1xuICAgIGlmIChsb2NrRGlhbG9nTGVzc29uSWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBsb2NrU3RhdHVzOiBsb2NrU3RhdHVzRm9yTGVzc29uKFxuICAgICAgICAgIHN0YXRlLmxlc3NvbnNCeVNlY3Rpb25JZFtzZWN0aW9uSWRdLFxuICAgICAgICAgIGxvY2tEaWFsb2dMZXNzb25JZFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAoYWN0aW9uLnR5cGUgPT09IE9QRU5fTE9DS19ESUFMT0cpIHtcbiAgICBjb25zdCB7c2VjdGlvbklkLCBsZXNzb25JZH0gPSBhY3Rpb247XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICBsb2NrRGlhbG9nTGVzc29uSWQ6IGxlc3NvbklkLFxuICAgICAgbG9ja1N0YXR1czogbG9ja1N0YXR1c0Zvckxlc3NvbihcbiAgICAgICAgc3RhdGUubGVzc29uc0J5U2VjdGlvbklkW3NlY3Rpb25JZF0sXG4gICAgICAgIGxlc3NvbklkXG4gICAgICApLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFjdGlvbi50eXBlID09PSBDTE9TRV9MT0NLX0RJQUxPRykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgbG9ja0RpYWxvZ0xlc3NvbklkOiBudWxsLFxuICAgICAgbG9ja1N0YXR1czogaW5pdGlhbFN0YXRlLmxvY2tTdGF0dXMsXG4gICAgfSk7XG4gIH1cblxuICBpZiAoYWN0aW9uLnR5cGUgPT09IEJFR0lOX1NBVkUpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgIHNhdmluZzogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChhY3Rpb24udHlwZSA9PT0gRklOSVNIX1NBVkUpIHtcbiAgICBjb25zdCB7bGVzc29uc0J5U2VjdGlvbklkfSA9IHN0YXRlO1xuICAgIGNvbnN0IHtsb2NrU3RhdHVzOiBuZXh0TG9ja1N0YXR1cywgc2VjdGlvbklkLCBsZXNzb25JZH0gPSBhY3Rpb247XG4gICAgY29uc3QgbmV4dExlc3NvbiA9IF8uY2xvbmVEZWVwKGxlc3NvbnNCeVNlY3Rpb25JZFtzZWN0aW9uSWRdW2xlc3NvbklkXSk7XG5cbiAgICAvLyBVcGRhdGUgbG9ja2VkL3JlYWRvbmx5X2Fuc3dlcnMgaW4gbGVzc29ucyBiYXNlZCBvbiB0aGUgbmV3IGxvY2tTdGF0dXMgcHJvdmlkZWRcbiAgICAvLyBieSBvdXIgZGlhbG9nLlxuICAgIG5leHRMZXNzb24uZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IG5leHRMb2NrU3RhdHVzW2luZGV4XTtcbiAgICAgIC8vIFdlIGFzc3VtZSBsb2NrU3RhdHVzIGlzIG9yZGVyZWQgdGhlIHNhbWUgYXMgbGVzc29uVG9VcGRhdGUuIExldCdzXG4gICAgICAvLyB2YWxpZGF0ZSB0aGF0LlxuICAgICAgaWYgKGl0ZW0udXNlcl9sZXZlbF9pZCAhPT0gdXBkYXRlLnVzZXJMZXZlbElkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0IHVzZXIgaWRzIGJlIHRoZSBzYW1lJyk7XG4gICAgICB9XG4gICAgICBpdGVtLmxvY2tlZCA9IHVwZGF0ZS5sb2NrU3RhdHVzID09PSBMb2NrU3RhdHVzLkxvY2tlZDtcbiAgICAgIGl0ZW0ucmVhZG9ubHlfYW5zd2VycyA9IHVwZGF0ZS5sb2NrU3RhdHVzID09PSBMb2NrU3RhdHVzLlJlYWRvbmx5QW5zd2VycztcbiAgICB9KTtcblxuICAgIGNvbnN0IG5leHRTdGF0ZSA9IF8uY2xvbmVEZWVwKHN0YXRlKTtcbiAgICBuZXh0U3RhdGUubGVzc29uc0J5U2VjdGlvbklkW3NlY3Rpb25JZF1bbGVzc29uSWRdID0gbmV4dExlc3NvbjtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXh0U3RhdGUsIHtcbiAgICAgIGxvY2tTdGF0dXM6IG5leHRMb2NrU3RhdHVzLFxuICAgICAgc2F2aW5nOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuLy8gQWN0aW9uIGNyZWF0b3JzXG5cbi8qKlxuICogQXV0aG9yaXplcyB0aGUgdXNlciB0byBiZSBhYmxlIHRvIHNlZSBsb2NrYWJsZSBsZXNzb25zXG4gKi9cbmV4cG9ydCBjb25zdCBhdXRob3JpemVMb2NrYWJsZSA9IGlzQXV0aG9yaXplZCA9PiAoe1xuICB0eXBlOiBBVVRIT1JJWkVfTE9DS0FCTEUsXG4gIGlzQXV0aG9yaXplZCxcbn0pO1xuXG5leHBvcnQgY29uc3Qgb3BlbkxvY2tEaWFsb2cgPSAoc2VjdGlvbklkLCBsZXNzb25JZCkgPT4gKHtcbiAgdHlwZTogT1BFTl9MT0NLX0RJQUxPRyxcbiAgc2VjdGlvbklkLFxuICBsZXNzb25JZCxcbn0pO1xuXG5leHBvcnQgY29uc3QgYmVnaW5TYXZlID0gKCkgPT4gKHt0eXBlOiBCRUdJTl9TQVZFfSk7XG5leHBvcnQgY29uc3QgZmluaXNoU2F2ZSA9IChzZWN0aW9uSWQsIGxlc3NvbklkLCBuZXdMb2NrU3RhdHVzKSA9PiAoe1xuICB0eXBlOiBGSU5JU0hfU0FWRSxcbiAgc2VjdGlvbklkLFxuICBsZXNzb25JZCxcbiAgbG9ja1N0YXR1czogbmV3TG9ja1N0YXR1cyxcbn0pO1xuXG4vKipcbiAqIEFjdGlvbiBhc3luY2hyb25vdXNseSBkaXNwYXRjaGVzIGEgc2V0IG9mIGFjdGlvbnMgYXJvdW5kIHNhdmluZyBvdXJcbiAqIGxvY2sgc3RhdHVzLlxuICovXG5jb25zdCBwZXJmb3JtU2F2ZSA9IChzZWN0aW9uSWQsIGxlc3NvbklkLCBuZXdMb2NrU3RhdHVzLCBvbkNvbXBsZXRlKSA9PiB7XG4gIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgY29uc3Qgb2xkTG9ja1N0YXR1cyA9IGdldFN0YXRlKCkubGVzc29uTG9jay5sb2NrU3RhdHVzO1xuXG4gICAgY29uc3Qgc2F2ZURhdGEgPSBuZXdMb2NrU3RhdHVzXG4gICAgICAuZmlsdGVyKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAvLyBPbmx5IG5lZWQgdG8gc2F2ZSBpdGVtcyB0aGF0IGNoYW5nZWRcbiAgICAgICAgcmV0dXJuICFfLmlzRXF1YWwoaXRlbSwgb2xkTG9ja1N0YXR1c1tpbmRleF0pO1xuICAgICAgfSlcbiAgICAgIC5tYXAoaXRlbSA9PiAoe1xuICAgICAgICB1c2VyX2xldmVsX2RhdGE6IGl0ZW0udXNlckxldmVsRGF0YSxcbiAgICAgICAgbG9ja2VkOiBpdGVtLmxvY2tTdGF0dXMgPT09IExvY2tTdGF0dXMuTG9ja2VkLFxuICAgICAgICByZWFkb25seV9hbnN3ZXJzOiBpdGVtLmxvY2tTdGF0dXMgPT09IExvY2tTdGF0dXMuUmVhZG9ubHlBbnN3ZXJzLFxuICAgICAgfSkpO1xuXG4gICAgaWYgKHNhdmVEYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgb25Db21wbGV0ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpc3BhdGNoKGJlZ2luU2F2ZSgpKTtcbiAgICAkLmFqYXgoe1xuICAgICAgdHlwZTogJ1BPU1QnLFxuICAgICAgdXJsOiAnL2FwaS9sb2NrX3N0YXR1cycsXG4gICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHt1cGRhdGVzOiBzYXZlRGF0YX0pLFxuICAgIH0pXG4gICAgICAuZG9uZSgoKSA9PiB7XG4gICAgICAgIGRpc3BhdGNoKGZpbmlzaFNhdmUoc2VjdGlvbklkLCBsZXNzb25JZCwgbmV3TG9ja1N0YXR1cykpO1xuICAgICAgICBvbkNvbXBsZXRlKCk7XG4gICAgICB9KVxuICAgICAgLmZhaWwoZXJyID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICBvbkNvbXBsZXRlKCk7XG4gICAgICB9KTtcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBzYXZlTG9ja0RpYWxvZyA9IChzZWN0aW9uSWQsIG5ld0xvY2tTdGF0dXMpID0+IHtcbiAgcmV0dXJuIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICBjb25zdCBsZXNzb25JZCA9IGdldFN0YXRlKCkubGVzc29uTG9jay5sb2NrRGlhbG9nTGVzc29uSWQ7XG4gICAgZGlzcGF0Y2goXG4gICAgICBwZXJmb3JtU2F2ZShzZWN0aW9uSWQsIGxlc3NvbklkLCBuZXdMb2NrU3RhdHVzLCAoKSA9PiB7XG4gICAgICAgIGRpc3BhdGNoKGNsb3NlTG9ja0RpYWxvZygpKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2NrTGVzc29uID0gKHNlY3Rpb25JZCwgbGVzc29uSWQpID0+IHtcbiAgcmV0dXJuIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgY29uc3Qgc2VjdGlvbiA9IHN0YXRlLmxlc3NvbkxvY2subGVzc29uc0J5U2VjdGlvbklkW3NlY3Rpb25JZF07XG4gICAgY29uc3Qgb2xkTG9ja1N0YXR1cyA9IGxvY2tTdGF0dXNGb3JMZXNzb24oc2VjdGlvbiwgbGVzc29uSWQpO1xuICAgIGNvbnN0IG5ld0xvY2tTdGF0dXMgPSBvbGRMb2NrU3RhdHVzLm1hcChzdHVkZW50ID0+ICh7XG4gICAgICAuLi5zdHVkZW50LFxuICAgICAgbG9ja1N0YXR1czogTG9ja1N0YXR1cy5Mb2NrZWQsXG4gICAgfSkpO1xuICAgIGRpc3BhdGNoKHBlcmZvcm1TYXZlKHNlY3Rpb25JZCwgbGVzc29uSWQsIG5ld0xvY2tTdGF0dXMsICgpID0+IHt9KSk7XG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgY2xvc2VMb2NrRGlhbG9nID0gKCkgPT4gKHtcbiAgdHlwZTogQ0xPU0VfTE9DS19ESUFMT0csXG59KTtcblxuLy8gSGVscGVyc1xuLyoqXG4gKiBHZW5lcmF0ZSBhbiBhcnJheSBvZiBsb2NrIHN0YXR1cyBpbmZvIGZvciBlYWNoIHN0dWRlbnQgaW4gdGggcHJvdmlkZWQgc2VjdGlvblxuICogb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm8gc2VjdGlvbi9zdHVkZW50cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBzZWN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gbGVzc29uSWRcbiAqIEByZXR1cm5zIHtvYmplY3RbXX1cbiAqL1xuY29uc3QgbG9ja1N0YXR1c0Zvckxlc3NvbiA9IChzZWN0aW9uLCBsZXNzb25JZCkgPT4ge1xuICBpZiAoc2VjdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHN0dWRlbnRzID0gc2VjdGlvbltsZXNzb25JZF07XG4gIHJldHVybiBzdHVkZW50cy5tYXAoc3R1ZGVudCA9PiAoe1xuICAgIHVzZXJMZXZlbERhdGE6IHN0dWRlbnQudXNlcl9sZXZlbF9kYXRhLFxuICAgIG5hbWU6IHN0dWRlbnQubmFtZSxcbiAgICBsb2NrU3RhdHVzOiBzdHVkZW50LmxvY2tlZFxuICAgICAgPyBMb2NrU3RhdHVzLkxvY2tlZFxuICAgICAgOiBzdHVkZW50LnJlYWRvbmx5X2Fuc3dlcnNcbiAgICAgID8gTG9ja1N0YXR1cy5SZWFkb25seUFuc3dlcnNcbiAgICAgIDogTG9ja1N0YXR1cy5FZGl0YWJsZSxcbiAgfSkpO1xufTtcblxuLyoqXG4gKiBIZWxwZXIgdGhhdCByZXR1cm5zIGEgbWFwcGluZyBvZiBsZXNzb25JZCB0byB3aGV0aGVyIG9yIG5vdCBpdCBpcyBmdWxseSBsb2NrZWRcbiAqIGluIHRoZSBjdXJyZW50IHNlY3Rpb24uIEEgbGVzc29uIGlzIGZ1bGx5IGxvY2tlZCBpZiBhbmQgb25seSBpZiBpdCBpcyBsb2NrZWRcbiAqIGZvciBhbGwgb2YgdGhlIHN0dWRlbnRzIGluIHRoZSBzZWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBmdWxseUxvY2tlZExlc3Nvbk1hcHBpbmcgPSBzZWN0aW9uID0+IHtcbiAgaWYgKCFzZWN0aW9uKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKHNlY3Rpb24pLnJlZHVjZSgob2JqLCBsZXNzb25JZCkgPT4ge1xuICAgIGNvbnN0IHN0dWRlbnRzID0gc2VjdGlvbltsZXNzb25JZF07XG4gICAgY29uc3QgZnVsbHlMb2NrZWQgPSAhc3R1ZGVudHMuc29tZShzdHVkZW50ID0+ICFzdHVkZW50LmxvY2tlZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm9iaixcbiAgICAgIFtsZXNzb25JZF06IGZ1bGx5TG9ja2VkLFxuICAgIH07XG4gIH0sIHt9KTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBsb2NrIHN0YXR1cyBmb3Igc3R1ZGVudHMgaW4gc2VjdGlvbnMgYmFzZWQgb24gZGF0YSBmcm9tIHNlcnZlclxuICovXG5leHBvcnQgY29uc3Qgc2V0U2VjdGlvbkxvY2tTdGF0dXMgPSBzZWN0aW9ucyA9PiAoe1xuICB0eXBlOiBTRVRfU0VDVElPTl9MT0NLX1NUQVRVUyxcbiAgc2VjdGlvbnMsXG59KTtcblxuLyoqXG4gKiBTZXQgdGhlIGxvY2sgc3RhdHVzIGZvciBzdHVkZW50cyBpbiBzZWN0aW9ucyBiYXNlZCBvbiBkYXRhIGZyb20gc2VydmVyXG4gKi9cbmNvbnN0IHJlZnJlc2hTZWN0aW9uTG9ja1N0YXR1cyA9IChzZWN0aW9ucywgc2VjdGlvbklkKSA9PiAoe1xuICB0eXBlOiBSRUZSRVNIX1NFQ1RJT05fTE9DS19TVEFUVVMsXG4gIHNlY3Rpb25zLFxuICBzZWN0aW9uSWQsXG59KTtcblxuZXhwb3J0IGNvbnN0IHJlZmV0Y2hTZWN0aW9uTG9ja1N0YXR1cyA9IChzZWN0aW9uSWQsIHNjcmlwdElkKSA9PiB7XG4gIHJldHVybiBkaXNwYXRjaCA9PiB7XG4gICAgJC5hamF4KCcvYXBpL2xvY2tfc3RhdHVzJywge1xuICAgICAgZGF0YToge3NjcmlwdF9pZDogc2NyaXB0SWR9LFxuICAgIH0pXG4gICAgICAuZG9uZShkYXRhID0+IHtcbiAgICAgICAgZGlzcGF0Y2gocmVmcmVzaFNlY3Rpb25Mb2NrU3RhdHVzKGRhdGEsIHNlY3Rpb25JZCkpO1xuICAgICAgfSlcbiAgICAgIC5mYWlsKGVyciA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICB9KTtcbiAgfTtcbn07XG4iLCJpbXBvcnQgcXVlcnlTdHJpbmcgZnJvbSAncXVlcnktc3RyaW5nJztcblxuLy8gUHJvdmlkZSBtZXRob2RzIHRoYXQgYWxsb3cgdGVzdHMgdG8gbW9jayB3aW5kb3cubG9jYXRpb25cbmxldCB3aW5kb3dMb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjtcbmV4cG9ydCBmdW5jdGlvbiBzZXRXaW5kb3dMb2NhdGlvbihmYWtlTG9jYXRpb24pIHtcbiAgd2luZG93TG9jYXRpb24gPSBmYWtlTG9jYXRpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNldFdpbmRvd0xvY2F0aW9uKCkge1xuICB3aW5kb3dMb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1F1ZXJ5UGFyYW0obmFtZSkge1xuICBjb25zdCBwYXJzZWRQYXJhbXMgPSBxdWVyeVBhcmFtcygpO1xuXG4gIC8vIGNhbid0IGNhbGwgaGFzT3duUHJvcGVydHkgZGlyZWN0bHkgZHVlIHRvIGJ1ZyBpbiBxdWVyeS1zdHJpbmc6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvcXVlcnktc3RyaW5nL2lzc3Vlcy81MFxuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcnNlZFBhcmFtcywgbmFtZSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgVVJMIHF1ZXJ5c3RyaW5nIHBhcmFtcy5cbiAqIEBwYXJhbSBuYW1lIHtzdHJpbmc9fSBPcHRpb25hbGx5IHB1bGwgYSBzcGVjaWZpYyBwYXJhbS5cbiAqIEByZXR1cm4ge29iamVjdHxzdHJpbmd9IEhhc2ggb2YgcGFyYW1zLCBvciBwYXJhbSBzdHJpbmcgaWYgYG5hbWVgIGlzIHNwZWNpZmllZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5UGFyYW1zKG5hbWUpIHtcbiAgY29uc3QgcGFyc2VkID0gcXVlcnlTdHJpbmcucGFyc2Uod2luZG93TG9jYXRpb24uc2VhcmNoKTtcbiAgaWYgKG5hbWUpIHtcbiAgICByZXR1cm4gcGFyc2VkW25hbWVdO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogVXBkYXRlcyBhIHF1ZXJ5IHBhcmFtZXRlciBpbiB0aGUgVVJMIHZpYSBwdXNoU3RhdGUgKGkuZS4gZG9lc24ndCBmb3JjZSBhXG4gKiByZWxvYWQpLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtIC0gTmFtZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIHRvIG1vZGlmeVxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHZhbHVlIC0gTmV3IHZhbHVlIChvciB1bmRlZmluZWQgdG8gcmVtb3ZlKVxuICogQHBhcmFtIHtib29sZWFufSB1c2VSZXBsYWNlU3RhdGUgLSBvcHRpb25hbCBwYXJhbSBpZiB5b3Ugd2lzaCB0byB1c2UgcmVwbGFjZVN0YXRlXG4gKiAgIGluc3RlYWQgb2YgcHVzaFN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVRdWVyeVBhcmFtKHBhcmFtLCB2YWx1ZSwgdXNlUmVwbGFjZVN0YXRlID0gZmFsc2UpIHtcbiAgY29uc3QgbmV3U3RyaW5nID0gcXVlcnlTdHJpbmcuc3RyaW5naWZ5KHtcbiAgICAuLi5xdWVyeVN0cmluZy5wYXJzZSh3aW5kb3dMb2NhdGlvbi5zZWFyY2gpLFxuICAgIFtwYXJhbV06IHZhbHVlLFxuICB9KTtcblxuICBsZXQgbmV3TG9jYXRpb24gPSB3aW5kb3dMb2NhdGlvbi5wYXRobmFtZTtcbiAgLy8gRG9uJ3QgYXBwZW5kID8gdW5sZXNzIHdlIGFjdHVhbGx5IGhhdmUgYSB2YWx1ZVxuICBpZiAobmV3U3RyaW5nKSB7XG4gICAgbmV3TG9jYXRpb24gKz0gJz8nICsgbmV3U3RyaW5nO1xuICB9XG5cbiAgY29uc3QgbWV0aG9kID0gdXNlUmVwbGFjZVN0YXRlID8gJ3JlcGxhY2VTdGF0ZScgOiAncHVzaFN0YXRlJztcbiAgd2luZG93Lmhpc3RvcnlbbWV0aG9kXShudWxsLCBkb2N1bWVudC50aXRsZSwgbmV3TG9jYXRpb24pO1xufVxuXG4vKipcbiAqIFdlIGhhdmUgdmFyaW91cyBjb29raWVzIHRoYXQgd2Ugd2FudCB0byBiZSBlbnZpcm9ubWVudCBzcGVjaWZpYy4gV2UgYWNjb21wbGlzaFxuICogdGhpcyBieSB0YWNraW5nIG9uIHRoZSByYWNrX2VudiAodW5sZXNzIHdlJ3JlIGluIHByb2QpLiBUaGlzIGhlbHBlciBnZXRzIHRoZVxuICogYXBwcm9wcmlhdGUgY29va2llIG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQmFzZSBjb29raWUgbmFtZVxuICogQHJldHVybnMge3N0cmluZ30gQWN0dWFsIGNvb2tpZSBuYW1lLCB3aXRoIHRoZSByYWNrX2VudiBhcHBlbmRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZW52aXJvbm1lbnRTcGVjaWZpY0Nvb2tpZU5hbWUobmFtZSkge1xuICBjb25zdCByYWNrX2VudiA9IHdpbmRvdy5kYXNoYm9hcmQucmFja19lbnY7XG4gIGlmIChyYWNrX2VudiA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cblxuICByZXR1cm4gYCR7bmFtZX1fJHtyYWNrX2Vudn1gO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgaG9zdCBuYW1lIChlLmcuIHN0dWRpby5jb2RlLm9yZykgcmV0dXJuIHRoZSBzaXRlJ3Mgcm9vdCBkb21haW5cbiAqIChlLmcuIGNvZGUub3JnKS4gIFVzZWZ1bCBmb3IgZ2V0dGluZyB0aGUgZG9tYWluIG9uIHdoaWNoIHdlIHdpbGwgc2V0IGEgY29va2llLlxuICogQHBhcmFtIHtzdHJpbmd9IGhvc3RuYW1lIC0gQSBob3N0IG5hbWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSByb290IGRvbWFpbiBuYW1lIGZvciB0aGUgaG9zdCBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb290RG9tYWluRnJvbUhvc3RuYW1lKGhvc3RuYW1lKSB7XG4gIHJldHVybiBob3N0bmFtZS5zcGxpdCgnLicpLnNsaWNlKC0yKS5qb2luKCcuJyk7XG59XG4iLCIvKipcbiAqIFJlZHVjZXIgZm9yIHRyYWNraW5nIHdoZXRoZXIgd2UncmUgY3VycmVudGx5IHZpZXdpbmcgdGhlIHBhZ2UgYXMgYSBwYXJ0aWNpcGFudFxuICogb3IgYXMgYSBpbnN0cnVjdG9yXG4gKi9cblxuaW1wb3J0IHtxdWVyeVBhcmFtcywgdXBkYXRlUXVlcnlQYXJhbX0gZnJvbSAnQGNkby9hcHBzL2NvZGUtc3R1ZGlvL3V0aWxzJztcbmltcG9ydCB7bWFrZUVudW0sIHJlbG9hZH0gZnJvbSAnQGNkby9hcHBzL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IFZpZXdUeXBlID0gbWFrZUVudW0oJ1BhcnRpY2lwYW50JywgJ0luc3RydWN0b3InKTtcblxuLy8gQWN0aW9uIHR5cGVzXG5leHBvcnQgY29uc3QgU0VUX1ZJRVdfVFlQRSA9ICd2aWV3QXMvU0VUX1ZJRVdfVFlQRSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZHVjZXIoc3RhdGUgPSBWaWV3VHlwZS5QYXJ0aWNpcGFudCwgYWN0aW9uKSB7XG4gIGlmIChhY3Rpb24udHlwZSA9PT0gU0VUX1ZJRVdfVFlQRSkge1xuICAgIGxldCB2aWV3VHlwZSA9IGFjdGlvbi52aWV3VHlwZTtcbiAgICAvKiBUaGUgVmlld1R5cGVzIHVzZWQgdG8gYmUgVGVhY2hlciBhbmQgU3R1ZGVudC4gV2UgcmVkaXJlY3QgdGhlbSB0byB0aGUgbmV3XG4gICAgICogVmlld1R5cGVzIGhlcmUgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIGJlIGNvbnRpbnVlIHRvIHN1cHBvcnQgb2xkIGxpbmtzLlxuICAgICAqL1xuICAgIGlmICh2aWV3VHlwZSA9PT0gJ1RlYWNoZXInKSB7XG4gICAgICB2aWV3VHlwZSA9ICdJbnN0cnVjdG9yJztcbiAgICAgIHVwZGF0ZVF1ZXJ5UGFyYW0oJ3ZpZXdBcycsICdJbnN0cnVjdG9yJyk7XG4gICAgfSBlbHNlIGlmICh2aWV3VHlwZSA9PT0gJ1N0dWRlbnQnKSB7XG4gICAgICB2aWV3VHlwZSA9ICdQYXJ0aWNpcGFudCc7XG4gICAgICB1cGRhdGVRdWVyeVBhcmFtKCd2aWV3QXMnLCAnUGFydGljaXBhbnQnKTtcbiAgICB9IGVsc2UgaWYgKCFWaWV3VHlwZVt2aWV3VHlwZV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBWaWV3VHlwZTogJyArIHZpZXdUeXBlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmlld1R5cGU7XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8vIEFjdGlvbiBjcmVhdG9yc1xuXG4vLyBUT0RPOiBXaGVuIHRoaXMgaXMgY29udmVydGVkIHRvIHJlZHV4LXRvb2xraXQsIHVwZGF0ZSBwcm9ncmVzc1JlZHV4IGFjY29yZGluZ2x5LCBhcyBpdCBoYXNcbi8vIGEgZGVwZW5kZW5jeSBvbiB0aGlzIGFjdGlvbi5cbmV4cG9ydCBjb25zdCBzZXRWaWV3VHlwZSA9IHZpZXdUeXBlID0+ICh7XG4gIHR5cGU6IFNFVF9WSUVXX1RZUEUsXG4gIHZpZXdUeXBlLFxufSk7XG5cbmV4cG9ydCBjb25zdCBjaGFuZ2VWaWV3VHlwZSA9ICh2aWV3VHlwZSwgaXNBc3luYykgPT4ge1xuICByZXR1cm4gZGlzcGF0Y2ggPT4ge1xuICAgIC8vIElmIGNoYW5naW5nIHRvIHZpZXdBcyBwYXJ0aWNpcGFudCB3aGlsZSB3ZSBhcmUgYSBwYXJ0aWN1bGFyIHBhcnRpY2lwYW50LCByZW1vdmVcbiAgICAvLyB0aGUgdXNlcl9pZCBhbmQgZG8gYSByZWxvYWQgc28gdGhhdCB3ZSdyZSBpbnN0ZWFkIHZpZXdpbmcgYXMgYSBnZW5lcmljXG4gICAgLy8gcGFydGljaXBhbnRcblxuICAgIGlmICh2aWV3VHlwZSA9PT0gVmlld1R5cGUuUGFydGljaXBhbnQgJiYgcXVlcnlQYXJhbXMoJ3VzZXJfaWQnKSkge1xuICAgICAgdXBkYXRlUXVlcnlQYXJhbSgndXNlcl9pZCcsIHVuZGVmaW5lZCk7XG5cbiAgICAgIGlmICghaXNBc3luYykge1xuICAgICAgICByZWxvYWQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRpc3BhdGNoKHNldFZpZXdUeXBlKHZpZXdUeXBlKSk7XG4gIH07XG59O1xuIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcblxuaW1wb3J0IHttYWtlRW51bX0gZnJvbSAnQGNkby9hcHBzL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGZlZWRiYWNrU2hhcGUgPSBQcm9wVHlwZXMuc2hhcGUoe1xuICBpZDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBzZWVuX29uX2ZlZWRiYWNrX3BhZ2VfYXQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHN0dWRlbnRfZmlyc3RfdmlzaXRlZF9hdDogUHJvcFR5cGVzLnN0cmluZyxcbiAgY3JlYXRlZF9hdDogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUHJvcFR5cGVzLnN0cmluZyxcbiAgICBQcm9wVHlwZXMuaW5zdGFuY2VPZihEYXRlKSxcbiAgXSkuaXNSZXF1aXJlZCxcbiAgY29tbWVudDogUHJvcFR5cGVzLnN0cmluZyxcbiAgcGVyZm9ybWFuY2U6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGlzX2F3YWl0aW5nX3RlYWNoZXJfcmV2aWV3OiBQcm9wVHlwZXMuYm9vbCxcbiAgcmV2aWV3X3N0YXRlOiBQcm9wVHlwZXMuc3RyaW5nLFxufSk7XG5cbmV4cG9ydCBjb25zdCBsZXZlbEZlZWRiYWNrU2hhcGUgPSBQcm9wVHlwZXMuc2hhcGUobGV2ZWxGZWVkYmFja1R5cGUpO1xuXG5leHBvcnQgY29uc3QgbGV2ZWxGZWVkYmFja1R5cGUgPSB7XG4gIGxlc3Nvbk5hbWU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgbGVzc29uTnVtOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGxldmVsTnVtOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGxpbmtUb0xldmVsOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIHVuaXROYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBmZWVkYmFja3M6IFByb3BUeXBlcy5hcnJheU9mKGZlZWRiYWNrU2hhcGUpLFxufTtcblxuZXhwb3J0IGNvbnN0IFJldmlld1N0YXRlcyA9IG1ha2VFbnVtKFxuICAnY29tcGxldGVkJyxcbiAgJ2tlZXBXb3JraW5nJyxcbiAgJ2F3YWl0aW5nUmV2aWV3J1xuKTtcbiIsImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7XG4gIGFjdGl2aXR5Q3NzQ2xhc3MsXG4gIHJlc3VsdEZyb21TdGF0dXMsXG59IGZyb20gJ0BjZG8vYXBwcy9jb2RlLXN0dWRpby9hY3Rpdml0eVV0aWxzJztcbmltcG9ydCB7aXNMZXNzb25IaWRkZW5Gb3JTZWN0aW9ufSBmcm9tICdAY2RvL2FwcHMvY29kZS1zdHVkaW8vaGlkZGVuTGVzc29uUmVkdXgnO1xuaW1wb3J0IHtmdWxseUxvY2tlZExlc3Nvbk1hcHBpbmd9IGZyb20gJ0BjZG8vYXBwcy9jb2RlLXN0dWRpby9sZXNzb25Mb2NrUmVkdXgnO1xuaW1wb3J0IHtWaWV3VHlwZX0gZnJvbSAnQGNkby9hcHBzL2NvZGUtc3R1ZGlvL3ZpZXdBc1JlZHV4JztcbmltcG9ydCB7TGV2ZWxTdGF0dXMsIExldmVsS2luZH0gZnJvbSAnQGNkby9nZW5lcmF0ZWQtc2NyaXB0cy9zaGFyZWRDb25zdGFudHMnO1xuXG5pbXBvcnQge1BVWlpMRV9QQUdFX05PTkV9IGZyb20gJy4vcHJvZ3Jlc3NUeXBlcyc7XG5cbi8qKlxuICogVGhpcyBpcyBjb25jZXB0dWFsbHkgc2ltaWxhciB0byBiZWluZyBhIHNlbGVjdG9yLCBleGNlcHQgdGhhdCBpdCBvcGVyYXRlcyBvblxuICogdGhlIGVudGlyZSBzdG9yZSBzdGF0ZS4gSXQgaXMgdXNlZCBieSBjb21wb25lbnRzIHRvIGRldGVybWluZSB3aGV0aGVyIGFcbiAqIHBhcnRpY3VsYXIgbGVzc29uIGlzIHZpc2libGUsIG9yIGhpZGRlbiBlbnRpcmVseS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsZXNzb24gLSB0aGUgbGVzc29uIHdlJ3JlIHF1ZXJ5aW5nXG4gKiBAcGFyYW0ge29iamVjdH0gc3RhdGUgLSBTdGF0ZSBvZiBvdXIgZW50aXJlIHJlZHV4IHN0b3JlXG4gKiBAcGFyYW0ge1ZpZXdUeXBlfSB2aWV3QXMgLSBBcmUgd2UgaW50ZXJlc3RlZCBpbiB3aGV0aGVyIHRoZSBsZXNzb24gaXMgdmlld2FibGVcbiAqICAgZm9yIHBhcnRpY2lwYW50cyBvciBpbnN0cnVjdG9yc1xuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByb3ZpZGVkIGxlc3NvbiBpcyB2aXNpYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZXNzb25Jc1Zpc2libGUobGVzc29uLCBzdGF0ZSwgdmlld0FzKSB7XG4gIGlmICghdmlld0FzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtIHZpZXdBcyBpbiBsZXNzb25Jc1Zpc2libGUnKTtcbiAgfVxuXG4gIGNvbnN0IGhpZGRlbkxlc3NvblN0YXRlID0gc3RhdGUuaGlkZGVuTGVzc29uO1xuICBjb25zdCBzZWN0aW9uSWQgPSBzdGF0ZS50ZWFjaGVyU2VjdGlvbnMuc2VsZWN0ZWRTZWN0aW9uSWQ7XG5cbiAgY29uc3QgaXNIaWRkZW4gPSBpc0xlc3NvbkhpZGRlbkZvclNlY3Rpb24oXG4gICAgaGlkZGVuTGVzc29uU3RhdGUsXG4gICAgc2VjdGlvbklkLFxuICAgIGxlc3Nvbi5pZFxuICApO1xuICByZXR1cm4gIWlzSGlkZGVuIHx8IHZpZXdBcyA9PT0gVmlld1R5cGUuSW5zdHJ1Y3Rvcjtcbn1cblxuLyoqXG4gKiBUcmVhdCB0aGUgbGVzc29uIGFzIGxvY2tlZCBpZiBlaXRoZXJcbiAqIChhKSBpdCBpcyBsb2NrZWQgZm9yIHRoaXMgdXNlciAoaW4gdGhlIGNhc2Ugb2YgYSBzdHVkZW50KVxuICogKGIpIG5vbi12ZXJpZmllZCBpbnN0cnVjdG9yXG4gKiAoYykgc2lnbmVkIG91dCB1c2VyXG4gKiBAcGFyYW0ge251bWJlcn0gbGVzc29uIC0gdGhlIGxlc3NvbiB3ZSdyZSBxdWVyeWluZ1xuICogQHBhcmFtIHtvYmplY3R9IHN0YXRlIC0gU3RhdGUgb2Ygb3VyIGVudGlyZSByZWR1eCBzdG9yZVxuICogQHBhcmFtIHtWaWV3VHlwZX0gdmlld0FzIC0gQXJlIHdlIGludGVyZXN0ZWQgaW4gd2hldGhlciB0aGUgbGVzc29uIGlzIHZpZXdhYmxlXG4gKiAgIGZvciBwYXJ0aWNpcGFudHMgb3IgaW5zdHJ1Y3RvcnNcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm92aWRlZCBsZXNzb24gaXMgdmlzaWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVzc29uSXNMb2NrZWRGb3JVc2VyKGxlc3NvbiwgbGV2ZWxzLCBzdGF0ZSwgdmlld0FzKSB7XG4gIGlmICghbGVzc29uLmxvY2thYmxlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFzdGF0ZS5jdXJyZW50VXNlci51c2VySWQpIHtcbiAgICAvLyBTaWduZWQgb3V0IHVzZXJcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmICh2aWV3QXMgPT09IFZpZXdUeXBlLkluc3RydWN0b3IpIHtcbiAgICByZXR1cm4gIXN0YXRlLmxlc3NvbkxvY2subG9ja2FibGVBdXRob3JpemVkO1xuICB9IGVsc2UgaWYgKHZpZXdBcyA9PT0gVmlld1R5cGUuUGFydGljaXBhbnQpIHtcbiAgICByZXR1cm4gbGVzc29uTG9ja2VkKGxldmVscyk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ2hlY2sgdG8gc2VlIGlmIGEgbGVzc29uIGlzIGxvY2tlZCBmb3IgYWxsIHN0dWRlbnRzIGluIHRoZSBjdXJyZW50IHNlY3Rpb25cbiAqIG9yIG5vdC4gSWYgY2FsbGVkIGFzIGEgc3R1ZGVudCwgdGhpcyBzaG91bGQgYWx3YXlzIHJldHVybiBmYWxzZSBzaW5jZSB0aGV5XG4gKiBkb24ndCBoYXZlIGEgc2VsZWN0ZWQgc2VjdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsZXNzb25JZCAtIElkIHJlcHJlc2VudGluZyB0aGUgbGVzc29uIHdlJ3JlIGN1cmlvdXMgYWJvdXRcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdGF0ZSAtIFN0YXRlIG9mIG91ciBlbnRpcmUgcmVkdXggc3RvcmVcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBnaXZlbiBsZXNzb24gaXMgbG9ja2VkIGZvciBhbGwgc3R1ZGVudHMgaW4gdGhlXG4gKiAgIGN1cnJlbnRseSBzZWxlY3RlZCBzZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVzc29uSXNMb2NrZWRGb3JBbGxTdHVkZW50cyhsZXNzb25JZCwgc3RhdGUpIHtcbiAgY29uc3QgY3VycmVudFNlY3Rpb25JZCA9IHN0YXRlLnRlYWNoZXJTZWN0aW9ucy5zZWxlY3RlZFNlY3Rpb25JZDtcbiAgY29uc3QgY3VycmVudFNlY3Rpb24gPSBzdGF0ZS5sZXNzb25Mb2NrLmxlc3NvbnNCeVNlY3Rpb25JZFtjdXJyZW50U2VjdGlvbklkXTtcbiAgY29uc3QgZnVsbHlMb2NrZWRMZXNzb25zID0gZnVsbHlMb2NrZWRMZXNzb25NYXBwaW5nKGN1cnJlbnRTZWN0aW9uKTtcbiAgcmV0dXJuICEhZnVsbHlMb2NrZWRMZXNzb25zW2xlc3NvbklkXTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2xldmVsW119IGxldmVscyAtIEEgc2V0IG9mIGxldmVscyBmb3IgYSBnaXZlbiBsZXNzb25cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHdlIHNob3VsZCBjb25zaWRlciB0aGUgbGVzc29uIHRvIGJlIGxvY2tlZCBmb3IgdGhlXG4gKiAgIGN1cnJlbnQgdXNlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxlc3NvbkxvY2tlZChsZXZlbHMpIHtcbiAgLy8gRm9yIGxvY2thYmxlIGxlc3NvbnMsIHRoZXJlIGlzIGEgcmVxdWlyZW1lbnQgdGhhdCB0aGV5IGhhdmUgZXhhY3RseSBvbmUgTGV2ZWxHcm91cCxcbiAgLy8gYW5kIHRoYXQgaXQgYmUgdGhlIGxhc3QgbGV2ZWwgaW4gdGhlIGxlc3Nvbi4gQmVjYXVzZSBMZXZlbEdyb3VwJ3MgY2FuIGhhdmVcbiAgLy8gbXVsdGlwbGUgXCJwYWdlc1wiLCBhbmQgc2luZ2xlIExldmVsR3JvdXAgbWlnaHQgYXBwZWFyIGFzIG11bHRpcGxlIGxldmVscy9idWJibGVzXG4gIC8vIG9uIHRoZSBjbGllbnQuIEhvd2V2ZXIsIGl0IGlzIHRoZSBjYXNlIHRoYXQgZWFjaCBwYWdlIGluIHRoZSBMRyBzaG91bGQgaGF2ZVxuICAvLyBhbiBpZGVudGljYWwgbG9ja2VkL3VubG9ja2VkIHN0YXRlLlxuICAvLyBHaXZlbiB0aGlzLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBsb29rIGF0IHRoZSBsYXN0IGxldmVsIGluIG91ciBjb2xsZWN0aW9uXG4gIC8vIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBMRyAoYW5kIHRodXMgdGhlIGxlc3Nvbikgc2hvdWxkIGJlIGNvbnNpZGVyZWQgbG9ja2VkLlxuICByZXR1cm4gISFsZXZlbHNbbGV2ZWxzLmxlbmd0aCAtIDFdLmlzTG9ja2VkO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIEEgZnJpZW5kbHkgbmFtZSBmb3IgdGhlIGljb24gbmFtZSAodGhhdCBjYW4gYmUgcGFzc2VkIHRvIEZvbnRBd2Vzb21lKVxuICogICBmb3IgdGhlIGdpdmVuIGxldmVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SWNvbkZvckxldmVsKGxldmVsLCBpblByb2dyZXNzVmlldyA9IGZhbHNlKSB7XG4gIGlmIChpblByb2dyZXNzVmlldyAmJiBpc0xldmVsQXNzZXNzbWVudChsZXZlbCkpIHtcbiAgICByZXR1cm4gJ2NoZWNrLWNpcmNsZSc7XG4gIH1cblxuICBpZiAobGV2ZWwuaXNVbnBsdWdnZWQpIHtcbiAgICByZXR1cm4gJ3NjaXNzb3JzJztcbiAgfVxuXG4gIGlmIChsZXZlbC5pc0xvY2tlZCkge1xuICAgIHJldHVybiAnbG9jayc7XG4gIH1cblxuICBpZiAobGV2ZWwuaWNvbikge1xuICAgIC8vIEV2ZW50dWFsbHkgSSdkIGxpa2UgdG8gaGF2ZSBkYXNoYm9hcmQgcmV0dXJuIGFuIGljb24gdHlwZS4gRm9yIG5vdywgSSdtIGp1c3RcbiAgICAvLyBnb2luZyB0byB0cmVhdCB0aGUgY3NzIGNsYXNzIGl0IHNlbmRzIGFzIGEgdHlwZSwgYW5kIG1hcCBpdCB0byBhbiBpY29uIG5hbWUuXG4gICAgY29uc3QgbWF0Y2ggPSAvZmEtKC4qKS8uZXhlYyhsZXZlbC5pY29uKTtcbiAgICBpZiAoIW1hdGNoIHx8ICFtYXRjaFsxXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGljb25UeXBlOiAnICsgbGV2ZWwuaWNvbik7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaFsxXTtcbiAgfVxuXG4gIGlmIChsZXZlbC5ib251cykge1xuICAgIHJldHVybiAnZmxhZy1jaGVja2VyZWQnO1xuICB9XG5cbiAgLy8gZGVmYXVsdCB0byBkZXNrdG9wXG4gIHJldHVybiBkZWZhdWx0QnViYmxlSWNvbjtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRCdWJibGVJY29uID0gJ2Rlc2t0b3AnO1xuXG4vKipcbiAqIEByZXR1cm5zIFdoZXRoZXIgYSBsZXZlbCBpcyBhbiBhc3Nlc3NtZW50IGxldmVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMZXZlbEFzc2Vzc21lbnQobGV2ZWwpIHtcbiAgcmV0dXJuIGxldmVsLmtpbmQgPT09ICdhc3Nlc3NtZW50Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSB3aG9sZSBsZXNzb24gaXMgYXNzZXNzbWVudCBsZXZlbHNcbiAqIEBwYXJhbSB7W119IGxldmVscyBBbiBhcnJheSBvZiBsZXZlbHNcbiAqIEByZXR1cm5zIHtib29sfSBJZiBhbGwgdGhlIGxldmVscyBpbiBhIGxlc3NvbiBhcmUgYXNzZXNzbWVudCBsZXZlbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxlc3NvbklzQWxsQXNzZXNzbWVudChsZXZlbHMpIHtcbiAgcmV0dXJuIGxldmVscy5ldmVyeShsZXZlbCA9PiBsZXZlbC5raW5kID09PSBMZXZlbEtpbmQuYXNzZXNzbWVudCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZXJlIGFyZSBhbnkgbGV2ZWxzIGluIGEgbGVzc29uLlxuICogQHBhcmFtIHtvYmplY3R9IGxlc3NvbiB0aGUgbGVzc29uIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbH0gSWYgdGhlIGxlc3NvbiBoYXMgYW55IGxldmVsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGVzc29uSGFzTGV2ZWxzKGxlc3Nvbikge1xuICByZXR1cm4gISFsZXNzb24ubGV2ZWxzPy5sZW5ndGg7XG59XG5cbmV4cG9ydCBjb25zdCBjb21tZW50TGVmdCA9IHByb2dyZXNzID0+XG4gIHByb2dyZXNzPy50ZWFjaGVyRmVlZGJhY2tDb21tZW50ZWQgJiYgcHJvZ3Jlc3M/LnRlYWNoZXJGZWVkYmFja05ldztcblxuZXhwb3J0IGNvbnN0IHN0dWRlbnROZWVkc0ZlZWRiYWNrID0gKHByb2dyZXNzLCBsZXZlbCkgPT5cbiAgcHJvZ3Jlc3MgJiZcbiAgcHJvZ3Jlc3Muc3RhdHVzICE9PSBMZXZlbFN0YXR1cy5ub3RfdHJpZWQgJiZcbiAgIXByb2dyZXNzLnRlYWNoZXJGZWVkYmFja05ldyAmJlxuICBsZXZlbC5raW5kID09PSAnYXNzZXNzbWVudCcgJiZcbiAgbGV2ZWwuY2FuSGF2ZUZlZWRiYWNrO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgd2Ugc2hvdWxkIHNob3cgXCJLZWVwIHdvcmtpbmdcIiBhbmQgXCJOZWVkcyByZXZpZXdcIiBzdGF0ZXMgZm9yXG4gKiBwcm9ncmVzcyBpbiBhIHVuaXQuIFVuaXQgbXVzdCBiZSBlaXRoZXIgQ1NEIG9yIENTUC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFNob3dSZXZpZXdTdGF0ZXModW5pdCkge1xuICByZXR1cm4gdW5pdC5pc0NzZCB8fCB1bml0LmlzQ3NwO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHN1bW1hcnkgb2YgYSBzdHVkZW50J3MgcHJvZ3Jlc3MgaW4gYSBsZXNzb24ncyBsZXZlbHMuXG4gKiBAcGFyYW0ge3tpZDogc3R1ZGVudExldmVsUHJvZ3Jlc3NUeXBlfX0gc3R1ZGVudExldmVsUHJvZ3Jlc3NcbiAqIEFuIG9iamVjdCBrZXllZCBieSBsZXZlbCBpZCBjb250YWluaW5nIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBzdHVkZW50J3NcbiAqIHByb2dyZXNzIGluIHRoYXQgbGV2ZWxcbiAqIEBwYXJhbSB7bGV2ZWxUeXBlW119IGxldmVscyBBbiBhcnJheSBvZiBsZXZlbHNcbiAqIEByZXR1cm5zIHtzdHVkZW50TGVzc29uUHJvZ3Jlc3NUeXBlfVxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBzdHVkZW50J3MgcHJvZ3Jlc3MgaW4gdGhlIGxlc3NvblxuICovXG5mdW5jdGlvbiBsZXNzb25Qcm9ncmVzc0ZvclN0dWRlbnQoc3R1ZGVudExldmVsUHJvZ3Jlc3MsIGxlc3NvbkxldmVscykge1xuICAvLyBGaWx0ZXIgYW55IGJvbnVzIGxldmVscyBhcyB0aGV5IGRvIG5vdCBjb3VudCB0b3dhcmQgcHJvZ3Jlc3MuXG4gIGNvbnN0IGZpbHRlcmVkTGV2ZWxzID0gbGVzc29uTGV2ZWxzLmZpbHRlcihsZXZlbCA9PiAhbGV2ZWwuYm9udXMpO1xuICBpZiAoIWZpbHRlcmVkTGV2ZWxzLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgY29tcGxldGVkU3RhdHVzZXMgPSBbXG4gICAgTGV2ZWxTdGF0dXMucGVyZmVjdCxcbiAgICBMZXZlbFN0YXR1cy5zdWJtaXR0ZWQsXG4gICAgTGV2ZWxTdGF0dXMuZnJlZV9wbGF5X2NvbXBsZXRlLFxuICAgIExldmVsU3RhdHVzLmNvbXBsZXRlZF9hc3Nlc3NtZW50LFxuICBdO1xuXG4gIGxldCBhdHRlbXB0ZWQgPSAwO1xuICBsZXQgaW1wZXJmZWN0ID0gMDtcbiAgbGV0IGNvbXBsZXRlZCA9IDA7XG4gIGxldCB0aW1lU3BlbnQgPSAwO1xuICBsZXQgbGFzdFRpbWVzdGFtcCA9IDA7XG5cbiAgZmlsdGVyZWRMZXZlbHMuZm9yRWFjaChsZXZlbCA9PiB7XG4gICAgY29uc3QgbGV2ZWxQcm9ncmVzcyA9IHN0dWRlbnRMZXZlbFByb2dyZXNzW2xldmVsLmlkXTtcbiAgICBpZiAobGV2ZWxQcm9ncmVzcykge1xuICAgICAgYXR0ZW1wdGVkICs9IGxldmVsUHJvZ3Jlc3Muc3RhdHVzID09PSBMZXZlbFN0YXR1cy5hdHRlbXB0ZWQ7XG4gICAgICBpbXBlcmZlY3QgKz0gbGV2ZWxQcm9ncmVzcy5zdGF0dXMgPT09IExldmVsU3RhdHVzLnBhc3NlZDtcbiAgICAgIGNvbXBsZXRlZCArPSBjb21wbGV0ZWRTdGF0dXNlcy5pbmNsdWRlcyhsZXZlbFByb2dyZXNzLnN0YXR1cyk7XG4gICAgICB0aW1lU3BlbnQgKz0gbGV2ZWxQcm9ncmVzcy50aW1lU3BlbnQgfHwgMDtcbiAgICAgIGxhc3RUaW1lc3RhbXAgPSBNYXRoLm1heChsYXN0VGltZXN0YW1wLCBsZXZlbFByb2dyZXNzLmxhc3RUaW1lc3RhbXAgfHwgMCk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBpbmNvbXBsZXRlID0gZmlsdGVyZWRMZXZlbHMubGVuZ3RoIC0gY29tcGxldGVkIC0gaW1wZXJmZWN0O1xuICBjb25zdCBpc0xlc3NvblN0YXJ0ZWQgPSBhdHRlbXB0ZWQgKyBpbXBlcmZlY3QgKyBjb21wbGV0ZWQgPiAwO1xuXG4gIGlmICghaXNMZXNzb25TdGFydGVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBnZXRQZXJjZW50ID0gY291bnQgPT4gKDEwMCAqIGNvdW50KSAvIGZpbHRlcmVkTGV2ZWxzLmxlbmd0aDtcbiAgcmV0dXJuIHtcbiAgICBpbmNvbXBsZXRlUGVyY2VudDogZ2V0UGVyY2VudChpbmNvbXBsZXRlKSxcbiAgICBpbXBlcmZlY3RQZXJjZW50OiBnZXRQZXJjZW50KGltcGVyZmVjdCksXG4gICAgY29tcGxldGVkUGVyY2VudDogZ2V0UGVyY2VudChjb21wbGV0ZWQpLFxuICAgIHRpbWVTcGVudDogdGltZVNwZW50LFxuICAgIGxhc3RUaW1lc3RhbXA6IGxhc3RUaW1lc3RhbXAsXG4gIH07XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgc3R1ZGVudExlc3NvblByb2dyZXNzVHlwZSBvYmplY3RzIGZvciBlYWNoIGxlc3NvbiBmcm9tIHRoZSBwcm92aWRlZFxuICogbGV2ZWwgcHJvZ3Jlc3MgZGF0YSBmb3IgZWFjaCBzdHVkZW50LlxuICogQHBhcmFtIHtzdHVkZW50SWQ6IHtsZXZlbElkOiBzdHVkZW50TGV2ZWxQcm9ncmVzc1R5cGV9fSBzZWN0aW9uTGV2ZWxQcm9ncmVzc1xuICogQW4gb2JqZWN0IGtleWVkIGJ5IHN0dWRlbnQgaWQgYWxsIHRoZSBzdHVkZW50J3MgbGV2ZWwgcHJvZ3Jlc3MgZGF0YVxuICogQHBhcmFtIHtsZXNzb25UeXBlW119IGxlc3NvbnMgQW4gYXJyYXkgb2YgbGVzc29uc1xuICogQHJldHVybnMge3N0dWRlbnRJZDoge2xlc3NvbklkOiBzdHVkZW50TGVzc29uUHJvZ3Jlc3NUeXBlfX1cbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGxlc3NvbiBwcm9ncmVzcyBkYXRhIGZvciBlYWNoIHN0dWRlbnQgaW4gYSBzZWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZXNzb25Qcm9ncmVzc0ZvclNlY3Rpb24oc2VjdGlvbkxldmVsUHJvZ3Jlc3MsIGxlc3NvbnMpIHtcbiAgLy8gY3JlYXRlIGVtcHR5IFwiZGljdGlvbmFyeVwiIHRvIHN0b3JlIGxlc3NvbiBwcm9ncmVzcyBmb3IgZWFjaCBzdHVkZW50XG4gIGNvbnN0IHNlY3Rpb25MZXNzb25Qcm9ncmVzcyA9IHt9O1xuICBPYmplY3QuZW50cmllcyhzZWN0aW9uTGV2ZWxQcm9ncmVzcykuZm9yRWFjaChcbiAgICAvLyBrZXk6IHN0dWRlbnRJZCwgdmFsdWU6IFwiZGljdGlvbmFyeVwiIG9mIGxldmVsIHByb2dyZXNzIGZvciB0aGF0IHN0dWRlbnRcbiAgICAoW3N0dWRlbnRJZCwgc3R1ZGVudExldmVsUHJvZ3Jlc3NdKSA9PiB7XG4gICAgICAvLyBjcmVhdGUgZW1wdHkgXCJkaWN0aW9uYXJ5XCIgdG8gc3RvcmUgcGVyLWxlc3NvbiBwcm9ncmVzcyBmb3Igc3R1ZGVudFxuICAgICAgY29uc3Qgc3R1ZGVudExlc3NvblByb2dyZXNzID0ge307XG4gICAgICAvLyBmb3IgZWFjaCBsZXNzb24sIHN1bW1hcml6ZSBzdHVkZW50J3MgcHJvZ3Jlc3MgYmFzZWQgb24gbGV2ZWwgcHJvZ3Jlc3NcbiAgICAgIGxlc3NvbnMuZm9yRWFjaChsZXNzb24gPT4ge1xuICAgICAgICBzdHVkZW50TGVzc29uUHJvZ3Jlc3NbbGVzc29uLmlkXSA9IGxlc3NvblByb2dyZXNzRm9yU3R1ZGVudChcbiAgICAgICAgICBzdHVkZW50TGV2ZWxQcm9ncmVzcyxcbiAgICAgICAgICBsZXNzb24ubGV2ZWxzXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIC8vIGFkZCBzdHVkZW50IHByb2dyZXNzIHRvIHNlY3Rpb24gcHJvZ3Jlc3NcbiAgICAgIHNlY3Rpb25MZXNzb25Qcm9ncmVzc1tzdHVkZW50SWRdID0gc3R1ZGVudExlc3NvblByb2dyZXNzO1xuICAgIH1cbiAgKTtcbiAgcmV0dXJuIHNlY3Rpb25MZXNzb25Qcm9ncmVzcztcbn1cblxuLyoqXG4gKiBUaGUgbGV2ZWwgb2JqZWN0IHBhc3NlZCBkb3duIHRvIHVzIHZpYSB0aGUgc2VydmVyIChhbmQgc3RvcmVkIGluXG4gKiBzY3JpcHQubGVzc29ucy5sZXZlbHMpIGNvbnRhaW5zIG1vcmUgZGF0YSB0aGFuIHdlIG5lZWQuIFRoaXMgcGFyc2VzIHRoZSBwYXJ0c1xuICogd2UgY2FyZSBhYm91dCB0byBjb25mb3JtIHRvIG91ciBgbGV2ZWxUeXBlYCBvYmplY3QuXG4gKi9cbmV4cG9ydCBjb25zdCBwcm9jZXNzZWRMZXZlbCA9IChsZXZlbCwgcGFyZW50TGV2ZWxJZCkgPT4ge1xuICBjb25zdCBpZCA9IGxldmVsLmFjdGl2ZUlkIHx8IGxldmVsLmlkO1xuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIHVybDogbGV2ZWwudXJsLFxuICAgIG5hbWU6IGxldmVsLm5hbWUsXG4gICAgYXBwOiBsZXZlbC5hcHAsXG4gICAgdXNlc0xhYjI6IGxldmVsLnVzZXNfbGFiMixcbiAgICBwcm9ncmVzc2lvbjogbGV2ZWwucHJvZ3Jlc3Npb24sXG4gICAgcHJvZ3Jlc3Npb25EaXNwbGF5TmFtZTogbGV2ZWwucHJvZ3Jlc3Npb25fZGlzcGxheV9uYW1lLFxuICAgIGtpbmQ6IGxldmVsLmtpbmQsXG4gICAgaWNvbjogbGV2ZWwuaWNvbixcbiAgICBpc1VucGx1Z2dlZDogbGV2ZWwuZGlzcGxheV9hc191bnBsdWdnZWQsXG4gICAgbGV2ZWxOdW1iZXI6XG4gICAgICBsZXZlbC5raW5kID09PSBMZXZlbEtpbmQudW5wbHVnZ2VkXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogbGV2ZWwudGl0bGUgfHwgbGV2ZWwucG9zaXRpb24sXG4gICAgYnViYmxlVGV4dDpcbiAgICAgIGxldmVsLmtpbmQgPT09IExldmVsS2luZC51bnBsdWdnZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBsZXZlbC5sZXR0ZXIgfHwgbGV2ZWwudGl0bGUudG9TdHJpbmcoKSxcbiAgICBpc0NvbmNlcHRMZXZlbDogbGV2ZWwuaXNfY29uY2VwdF9sZXZlbCxcbiAgICBpc1ZhbGlkYXRlZDogbGV2ZWwuaXNfdmFsaWRhdGVkLFxuICAgIGNhbkhhdmVGZWVkYmFjazogbGV2ZWwuY2FuX2hhdmVfZmVlZGJhY2ssXG4gICAgYm9udXM6IGxldmVsLmJvbnVzLFxuICAgIHBhZ2VOdW1iZXI6XG4gICAgICB0eXBlb2YgbGV2ZWwucGFnZV9udW1iZXIgIT09ICd1bmRlZmluZWQnXG4gICAgICAgID8gbGV2ZWwucGFnZV9udW1iZXJcbiAgICAgICAgOiBQVVpaTEVfUEFHRV9OT05FLFxuICAgIC8vIFNjcmlwdCBsZXZlbCBJRCBkb2Vzbid0IGFwcGx5IGZvciBzdWJsZXZlbHMuIFNldCB0byB1bmRlZmluZWQgaWYgd2UgaGF2ZSBhIHBhcmVudCBsZXZlbC5cbiAgICBzY3JpcHRMZXZlbElkOiBwYXJlbnRMZXZlbElkID8gdW5kZWZpbmVkIDogbGV2ZWwuaWQsXG4gICAgc3VibGV2ZWxzOlxuICAgICAgbGV2ZWwuc3VibGV2ZWxzICYmXG4gICAgICBsZXZlbC5zdWJsZXZlbHMubWFwKHN1YmxldmVsID0+IHByb2Nlc3NlZExldmVsKHN1YmxldmVsLCBpZCkpLFxuICAgIHBhdGg6IGxldmVsLnBhdGgsXG4gICAgcGFyZW50TGV2ZWxJZCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRMZXZlbFJlc3VsdCA9IHNlcnZlclByb2dyZXNzID0+IHtcbiAgcmV0dXJuIHNlcnZlclByb2dyZXNzLnJlc3VsdCB8fCByZXN1bHRGcm9tU3RhdHVzKHNlcnZlclByb2dyZXNzLnN0YXR1cyk7XG59O1xuXG4vKipcbiAqIGBzdHVkZW50TGV2ZWxQcm9ncmVzc1R5cGUucGFnZXNgIGlzIHVzZWQgYnkgbXVsdGktcGFnZSBhc3Nlc3NtZW50cyxcbiAqIGFuZCBpdHMgcHJlc2VuY2UgKG9yIGFic2VuY2UpIGlzIGhvdyB3ZSBkaXN0aW5ndWlzaCB0aG9zZSBmcm9tIHNpbmdsZS1wYWdlXG4gKiBhc3Nlc3NtZW50cy4gYHBhZ2VzX2NvbXBsZXRlZGAgaXMgYW4gb3B0aW9uYWwgYXJyYXkgb2YgaW5kaXZpZHVhbCByZXN1bHRzXG4gKiBmb3IgZWFjaCBwYWdlIChvciBudWxsKS4gU2luY2Ugd2Ugb25seSBoYXZlIHRoZSByZXN1bHRzIGZvciB0aGUgcGFnZXMsIHdlXG4gKiBuZWVkIHRvIGNyZWF0ZSBhIGBzdHVkZW50TGV2ZWxQcm9ncmVzc1R5cGVgIG9iamVjdCBmcm9tIHRoZSByZXN1bHRzIHRoZW5cbiAqIHNldCB0aGUgYGxvY2tlZGAgdmFsdWUgZnJvbSB0aGUgcGFyZW50IHByb2dyZXNzLlxuICovXG5jb25zdCBnZXRQYWdlc1Byb2dyZXNzID0gc2VydmVyUHJvZ3Jlc3MgPT4ge1xuICBpZiAoc2VydmVyUHJvZ3Jlc3MucGFnZXNfY29tcGxldGVkPy5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIHNlcnZlclByb2dyZXNzLnBhZ2VzX2NvbXBsZXRlZC5tYXAocGFnZVJlc3VsdCA9PiB7XG4gICAgICBjb25zdCBwYWdlUHJvZ3Jlc3MgPVxuICAgICAgICAocGFnZVJlc3VsdCAmJiBsZXZlbFByb2dyZXNzRnJvbVJlc3VsdChwYWdlUmVzdWx0KSkgfHxcbiAgICAgICAgbGV2ZWxQcm9ncmVzc0Zyb21TdGF0dXMoTGV2ZWxTdGF0dXMubm90X3RyaWVkKTtcbiAgICAgIHBhZ2VQcm9ncmVzcy5sb2NrZWQgPSBzZXJ2ZXJQcm9ncmVzcy5sb2NrZWQgfHwgZmFsc2U7XG4gICAgICByZXR1cm4gcGFnZVByb2dyZXNzO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBQYXJzZSBhIGxldmVsIHByb2dyZXNzIG9iamVjdCB0aGF0IHdlIGdldCBmcm9tIHRoZSBzZXJ2ZXIgdXNpbmcgZWl0aGVyXG4gKiAvYXBpL3VzZXJfcHJvZ3Jlc3Mgb3IgL2Rhc2hib2FyZGFwaS9zZWN0aW9uX2xldmVsX3Byb2dyZXNzIGludG8gb3VyXG4gKiBjYW5vbmljYWwgc3R1ZGVudExldmVsUHJvZ3Jlc3NUeXBlIHNoYXBlLlxuICogQHBhcmFtIHtvYmplY3R9IHNlcnZlclByb2dyZXNzIEEgcHJvZ3Jlc3Mgb2JqZWN0IGZyb20gdGhlIHNlcnZlclxuICogQHJldHVybnMge3N0dWRlbnRMZXZlbFByb2dyZXNzVHlwZX0gT3VyIGNhbm9uaWNhbCBwcm9ncmVzcyBzaGFwZVxuICovXG5leHBvcnQgY29uc3QgbGV2ZWxQcm9ncmVzc0Zyb21TZXJ2ZXIgPSBzZXJ2ZXJQcm9ncmVzcyA9PiB7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiBzZXJ2ZXJQcm9ncmVzcy5zdGF0dXMgfHwgTGV2ZWxTdGF0dXMubm90X3RyaWVkLFxuICAgIHJlc3VsdDogZ2V0TGV2ZWxSZXN1bHQoc2VydmVyUHJvZ3Jlc3MpLFxuICAgIGxvY2tlZDogc2VydmVyUHJvZ3Jlc3MubG9ja2VkIHx8IGZhbHNlLFxuICAgIHBhaXJlZDogc2VydmVyUHJvZ3Jlc3MucGFpcmVkIHx8IGZhbHNlLFxuICAgIHRpbWVTcGVudDogc2VydmVyUHJvZ3Jlc3MudGltZV9zcGVudCxcbiAgICB0ZWFjaGVyRmVlZGJhY2tSZXZpZXdTdGF0ZTogc2VydmVyUHJvZ3Jlc3MudGVhY2hlcl9mZWVkYmFja19yZXZpZXdfc3RhdGUsXG4gICAgdGVhY2hlckZlZWRiYWNrTmV3OiBzZXJ2ZXJQcm9ncmVzcy50ZWFjaGVyX2ZlZWRiYWNrX25ldyB8fCBmYWxzZSxcbiAgICB0ZWFjaGVyRmVlZGJhY2tDb21tZW50ZWQ6XG4gICAgICBzZXJ2ZXJQcm9ncmVzcy50ZWFjaGVyX2ZlZWRiYWNrX2NvbW1lbnRlZCB8fCBmYWxzZSxcbiAgICBsYXN0VGltZXN0YW1wOiBzZXJ2ZXJQcm9ncmVzcy5sYXN0X3Byb2dyZXNzX2F0LFxuICAgIHBhZ2VzOiBnZXRQYWdlc1Byb2dyZXNzKHNlcnZlclByb2dyZXNzKSxcbiAgfTtcbn07XG5cbi8qKlxuICogR2l2ZW4gYW4gb2JqZWN0IGZyb20gdGhlIHNlcnZlciB3aXRoIHN0dWRlbnQgcHJvZ3Jlc3MgZGF0YSBrZXllZCBieSBsZXZlbCBJRCxcbiAqIHBhcnNlIHRoZSBwcm9ncmVzcyBkYXRhIGludG8gb3VyIGNhbm9uaWNhbCBzdHVkZW50TGV2ZWxQcm9ncmVzc1R5cGVcbiAqIEBwYXJhbSB7e1tsZXZlbElkOiBudW1iZXJdOnNlcnZlclByb2dyZXNzfX0gc2VydmVyU3R1ZGVudFByb2dyZXNzXG4gKiBAcmV0dXJucyB7e1tsZXZlbElkOiBudW1iZXJdOnN0dWRlbnRMZXZlbFByb2dyZXNzVHlwZX19XG4gKi9cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2VydmVyU3R1ZGVudFByb2dyZXNzID0gc2VydmVyU3R1ZGVudFByb2dyZXNzID0+IHtcbiAgcmV0dXJuIF8ubWFwVmFsdWVzKHNlcnZlclN0dWRlbnRQcm9ncmVzcywgcHJvZ3Jlc3MgPT5cbiAgICBsZXZlbFByb2dyZXNzRnJvbVNlcnZlcihwcm9ncmVzcylcbiAgKTtcbn07XG5cbi8qKlxuICogR2l2ZW4gYW4gb2JqZWN0IGZyb20gdGhlIHNlcnZlciB3aXRoIHNlY3Rpb24gcHJvZ3Jlc3MgZGF0YSBrZXllZCBieSBzdHVkZW50XG4gKiBJRCBhbmQgbGV2ZWwgSUQsIHBhcnNlIHRoZSBwcm9ncmVzcyBkYXRhIGludG8gb3VyIGNhbm9uaWNhbFxuICogc3R1ZGVudExldmVsUHJvZ3Jlc3NUeXBlXG4gKiBAcGFyYW0ge3tzdHVkZW5JZDp7bGV2ZWxJZDpzZXJ2ZXJQcm9ncmVzc319fSBzZXJ2ZXJTZWN0aW9uUHJvZ3Jlc3NcbiAqIEByZXR1cm5zIHt7c3R1ZGVuSWQ6e2xldmVsSWQ6c3R1ZGVudExldmVsUHJvZ3Jlc3NUeXBlfX19XG4gKi9cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2VydmVyU2VjdGlvblByb2dyZXNzID0gc2VydmVyU2VjdGlvblByb2dyZXNzID0+IHtcbiAgcmV0dXJuIF8ubWFwVmFsdWVzKHNlcnZlclNlY3Rpb25Qcm9ncmVzcywgc3R1ZGVudCA9PlxuICAgIHByb2Nlc3NTZXJ2ZXJTdHVkZW50UHJvZ3Jlc3Moc3R1ZGVudClcbiAgKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgc3R1ZGVudExldmVsUHJvZ3Jlc3NUeXBlIG9iamVjdCB3aXRoIHRoZSBwcm92aWRlZCBzdGF0dXMgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RhdHVzXG4gKiBAcmV0dXJucyB7c3R1ZGVudExldmVsUHJvZ3Jlc3NUeXBlfVxuICovXG5leHBvcnQgY29uc3QgbGV2ZWxQcm9ncmVzc0Zyb21TdGF0dXMgPSBzdGF0dXMgPT4ge1xuICByZXR1cm4gbGV2ZWxQcm9ncmVzc0Zyb21TZXJ2ZXIoe3N0YXR1czogc3RhdHVzfSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHN0dWRlbnRMZXZlbFByb2dyZXNzVHlwZSBvYmplY3QgZnJvbSB0aGUgcHJvdmlkZWQgcmVzdWx0IHZhbHVlLlxuICogVGhpcyBpcyB1c2VkIHRvIG1lcmdlIHByb2dyZXNzIGRhdGEgZnJvbSBzZXNzaW9uIHN0b3JhZ2Ugd2hpY2ggb25seSBpbmNsdWRlc1xuICogYSByZXN1bHQgdmFsdWUgaW50byBvdXIgZGF0YSBtb2RlbCB0aGF0IHVzZXMgc3R1ZGVudExldmVsUHJvZ3Jlc3NUeXBlIG9iamVjdHMuXG4gKiBAcGFyYW0ge251bWJlcn0gcmVzdWx0XG4gKiBAcmV0dXJucyB7c3R1ZGVudExldmVsUHJvZ3Jlc3NUeXBlfVxuICovXG5leHBvcnQgY29uc3QgbGV2ZWxQcm9ncmVzc0Zyb21SZXN1bHQgPSByZXN1bHQgPT4ge1xuICByZXR1cm4gbGV2ZWxQcm9ncmVzc0Zyb21TdGF0dXMoYWN0aXZpdHlDc3NDbGFzcyhyZXN1bHQpKTtcbn07XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuXG5pbXBvcnQge1Jldmlld1N0YXRlc30gZnJvbSAnQGNkby9hcHBzL3RlbXBsYXRlcy9mZWVkYmFjay90eXBlcyc7XG5cbi8qKlxuICogU2VlIEFwcGxpY2F0aW9uSGVscGVyOjpQVVpaTEVfUEFHRV9OT05FLlxuICovXG5leHBvcnQgY29uc3QgUFVaWkxFX1BBR0VfTk9ORSA9IC0xO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0dWRlbnRcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gaWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBzdHVkZW50VHlwZSA9IFByb3BUeXBlcy5zaGFwZSh7XG4gIGlkOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIG5hbWU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbn0pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IExldmVsXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIFRoZSBpZCBvZiB0aGUgbGV2ZWwuIEl0IGlzIGludGVudGlvbmFsbHlcbiAqICAgYSBzdHJpbmcgKGRlc3BpdGUgYWx3YXlzIGJlaW5nIG51bWVyaWNhbCkgYmVjYXVzZSBpdCBnZXRzXG4gKiAgIHVzZWQgYXMgYSBrZXkgaW4gSlMgb2JqZWN0cyBhbmQgaXMgdXNlZCBpbiB0aGUgdXJsLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVybFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpY29uXG4gKiBAcHJvcGVydHkge2Jvb2x9IGlzVW5wbHVnZ2VkXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGV2ZWxOdW1iZXJcbiAqIEBwcm9wZXJ0eSB7Ym9vbH0gaXNDb25jZXB0TGV2ZWxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBraW5kXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIgb2YgdGhlIGxldmVsIGlmXG4gKiAgIHRoaXMgaXMgYSBtdWx0aS1wYWdlIGxldmVsLCBvciBQVVpaTEVfUEFHRV9OT05FXG4gKiBAcHJvcGVydHkge2FycmF5fSBzdWJsZXZlbHMgQW4gb3B0aW9uYWwgYXJyYXkgb2YgcmVjdXJzaXZlIHN1YmxldmVsIG9iamVjdHNcbiAqL1xuY29uc3QgbGV2ZWxTaGFwZSA9IHtcbiAgaWQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgbGV2ZWxOdW1iZXI6IFByb3BUeXBlcy5udW1iZXIsXG4gIGJ1YmJsZVRleHQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGtpbmQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHVybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgaWNvbjogUHJvcFR5cGVzLnN0cmluZyxcbiAgaXNVbnBsdWdnZWQ6IFByb3BUeXBlcy5ib29sLFxuICBpc0NvbmNlcHRMZXZlbDogUHJvcFR5cGVzLmJvb2wsXG4gIHBhZ2VOdW1iZXI6IFByb3BUeXBlcy5udW1iZXIsXG4gIC8qKiBzdWJsZXZlbHM6IFByb3BUeXBlcy5hcnJheSAqLyAvLyBTZWUgYmVsb3dcbn07XG4vLyBBdm9pZCByZWN1cnNpdmUgZGVmaW5pdGlvblxubGV2ZWxTaGFwZS5zdWJsZXZlbHMgPSBQcm9wVHlwZXMuYXJyYXlPZihcbiAgUHJvcFR5cGVzLnNoYXBlKGxldmVsV2l0aFByb2dyZXNzVHlwZSlcbik7XG5cbmV4cG9ydCBjb25zdCBsZXZlbFR5cGUgPSBQcm9wVHlwZXMuc2hhcGUobGV2ZWxTaGFwZSk7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTGV2ZWxXaXRoUHJvZ3Jlc3NcbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RhdHVzXG4gKiBAcHJvcGVydHkge2Jvb2x9IGlzTG9ja2VkXG4gKiBAcHJvcGVydHkge2Jvb2x9IGlzQ3VycmVudExldmVsXG4gKlxuICogTm90ZTogZ29pbmcgZm9yd2FyZCwgd2UgYXJlIG1vdmluZyBhbGwgdXNlci1zcGVjaWZpYyBkYXRhIGFib3V0IGEgbGV2ZWwgaW50b1xuICogYHN0dWRlbnRMZXZlbFByb2dyZXNzVHlwZWAsIHNvIG91ciBgbGV2ZWxUeXBlYCBvbmx5IGluY2x1ZGVzIGRhdGEgdGhhdCBpc1xuICogbm90IHVzZXItc3BlY2lmaWMuIEhvd2V2ZXIsIGZvciBub3cgd2Ugc3RpbGwgbmVlZCB0byBzdXBwb3J0IHRoaXMgbGVnYWN5XG4gKiB0eXBlIHdoaWNoIGRvZXMgaW5jbHVkZSB1c2VyLXNwZWNpZmljIGRhdGEsIGFuZCBidWlsZHMgb24gYGxldmVsVHlwZWAuXG4gKi9cbmV4cG9ydCBjb25zdCBsZXZlbFdpdGhQcm9ncmVzc1R5cGUgPSBQcm9wVHlwZXMuc2hhcGUoe1xuICAuLi5sZXZlbFNoYXBlLFxuICBzdGF0dXM6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgcGFpcmVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgaXNMb2NrZWQ6IFByb3BUeXBlcy5ib29sLFxuICBpc0N1cnJlbnRMZXZlbDogUHJvcFR5cGVzLmJvb2wsXG59KTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdHVkZW50TGV2ZWxQcm9ncmVzc1xuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGF0dXNcbiAqIEEgc3RyaW5nIGVudW0gcmVwcmVzZW50aW5nIHN0dWRlbnQgcHJvZ3Jlc3Mgc3RhdHVzIG9uIGEgbGV2ZWwuXG4gKiBTZWUgZ2VuZXJhdGVkLXNjcmlwdHMvc2hhcmVkQ29uc3RhbnRzLkxldmVsU3RhdHVzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHJlc3VsdFxuICogQSBudW1lcmljYWwgZW51bSBvZiB0aGUgVGVzdFJlc3VsdCBhIHN0dWRlbnQgcmVjZWl2ZWQgZm9yIGEgbGV2ZWwuXG4gKiBTZWUgc3JjL2NvbnN0YW50cy5UZXN0UmVzdWx0LlxuICogU2VlIHNyYy9jb2RlLXN0dWRpby9hY3Rpdml0eVV0aWxzLmFjdGl2aXR5Q3NzQ2xhc3MgZm9yIGEgbWFwcGluZyB0byBzdGF0dXMuXG4gKiBAcHJvcGVydHkge2Jvb2x9IGxvY2tlZFxuICogQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGxldmVsIGlzIGxvY2tlZCBmb3IgdGhlIHN0dWRlbnQuXG4gKiBAcHJvcGVydHkge2Jvb2x9IHBhaXJlZFxuICogQSBib29sZWFuIGluZGljYXRpbmcgaWYgYSBzdHVkZW50IHdhcyBwYWlyZWQgb24gYSBsZXZlbC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lU3BlbnRcbiAqIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhIHN0dWRlbnQgc3BlbnQgb24gYSBsZXZlbC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsYXN0VGltZXN0YW1wXG4gKiBBIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCB0aW1lIGEgc3R1ZGVudCBtYWRlIHByb2dyZXNzIG9uIGEgbGV2ZWwuXG4gKiBAcHJvcGVydHkge1Jldmlld1N0YXRlc30gdGVhY2hlckZlZWRiYWNrUmV2aWV3U3RhdGVcbiAqIEFuIG9wdGlvbmFsIGVudW0gaW5kaWNhdGluZyBhIHRlYWNoZXIgZmVlZGJhY2sgcmV2aWV3IHN0YXRlLlxuICogQHByb3BlcnR5IHthcnJheX0gcGFnZXNcbiAqIEFuIG9wdGlvbmFsIGFycmF5IG9mIHJlY3Vyc2l2ZSBwcm9ncmVzcyBvYmplY3RzIHJlcHJlc2VudGluZyBwcm9ncmVzcyBvblxuICogaW5kaXZpZHVhbCBwYWdlcyBvZiBhIG11bHRpLXBhZ2UgYXNzZXNzbWVudFxuICovXG5jb25zdCBzdHVkZW50TGV2ZWxQcm9ncmVzc1NoYXBlID0ge1xuICBzdGF0dXM6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgcmVzdWx0OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGxvY2tlZDogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgcGFpcmVkOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICB0aW1lU3BlbnQ6IFByb3BUeXBlcy5udW1iZXIsXG4gIGxhc3RUaW1lc3RhbXA6IFByb3BUeXBlcy5udW1iZXIsXG4gIHRlYWNoZXJGZWVkYmFja1Jldmlld1N0YXRlOiBQcm9wVHlwZXMub25lT2YoT2JqZWN0LmtleXMoUmV2aWV3U3RhdGVzKSksXG4gIHRlYWNoZXJGZWVkYmFja05ldzogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgLyoqIHBhZ2VzOiBQcm9wVHlwZXMuYXJyYXkgKi8gLy8gU2VlIGJlbG93XG59O1xuLy8gQXZvaWQgcmVjdXJzaXZlIGRlZmluaXRpb25cbnN0dWRlbnRMZXZlbFByb2dyZXNzU2hhcGUucGFnZXMgPSBQcm9wVHlwZXMuYXJyYXlPZihcbiAgUHJvcFR5cGVzLnNoYXBlKHN0dWRlbnRMZXZlbFByb2dyZXNzU2hhcGUpXG4pO1xuZXhwb3J0IGNvbnN0IHN0dWRlbnRMZXZlbFByb2dyZXNzVHlwZSA9IFByb3BUeXBlcy5zaGFwZShcbiAgc3R1ZGVudExldmVsUHJvZ3Jlc3NTaGFwZVxuKTtcblxuLypcbiAqIEB0eXBlZGVmIHtPYmplY3R9IHVuaXRQcm9ncmVzc1R5cGVcbiAqXG4gKiB1bml0UHJvZ3Jlc3NUeXBlIHJlcHJlc2VudHMgYSB1c2VyJ3MgcHJvZ3Jlc3MgaW4gYSBzY3JpcHQuICBJdCBpcyBhIG1hcCBvZlxuICogbGV2ZWxJZCAtPiBzdHVkZW50TGV2ZWxQcm9ncmVzc1R5cGUgb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IHVuaXRQcm9ncmVzc1R5cGUgPSBQcm9wVHlwZXMub2JqZWN0T2Yoc3R1ZGVudExldmVsUHJvZ3Jlc3NUeXBlKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBMZXNzb25cbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGlkXG4gKiBAcHJvcGVydHkge2Jvb2x9IGxvY2thYmxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVzc29uTnVtYmVyXG4gKi9cbmV4cG9ydCBjb25zdCBsZXNzb25UeXBlID0gUHJvcFR5cGVzLnNoYXBlKHtcbiAgbmFtZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBpZDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBsb2NrYWJsZTogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgbGVzc29uTnVtYmVyOiBQcm9wVHlwZXMubnVtYmVyLFxuICBsZXNzb25fcGxhbl9odG1sX3VybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgbGVzc29uX2ZlZWRiYWNrX3VybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgaXNGb2N1c0FyZWE6IFByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIGRlc2NyaXB0aW9uX3N0dWRlbnQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGRlc2NyaXB0aW9uX3RlYWNoZXI6IFByb3BUeXBlcy5zdHJpbmcsXG59KTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdHVkZW50TGVzc29uUHJvZ3Jlc3NcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5jb21wbGV0ZVBlcmNlbnRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbXBlcmZlY3RQZXJjZW50XG4gKiBAcHJvcGVydHkge251bWJlcn0gY29tcGxldGVkUGVyY2VudFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVTcGVudFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxhc3RUaW1lc3RhbXBcbiAqL1xuZXhwb3J0IGNvbnN0IHN0dWRlbnRMZXNzb25Qcm9ncmVzc1R5cGUgPSBQcm9wVHlwZXMuc2hhcGUoe1xuICBpbmNvbXBsZXRlUGVyY2VudDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBpbXBlcmZlY3RQZXJjZW50OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGNvbXBsZXRlZFBlcmNlbnQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgdGltZVNwZW50OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGxhc3RUaW1lc3RhbXA6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbn0pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IExlc3Nvbkdyb3VwXG4gKiBTdW1tYXJ5IG9mIGEgTGVzc29uR3JvdXAgcnVieSBtb2RlbC5cbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGlzcGxheU5hbWVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJpZ1F1ZXN0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVzY3JpcHRpb25cbiAqL1xuY29uc3QgbGVzc29uR3JvdXBTaGFwZSA9IHtcbiAgaWQ6IFByb3BUeXBlcy5udW1iZXIsXG4gIGRpc3BsYXlOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBiaWdRdWVzdGlvbnM6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGRlc2NyaXB0aW9uOiBQcm9wVHlwZXMuc3RyaW5nLFxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHcm91cGVkTGVzc29uc1xuICogVHlwZSBvZiBvYmplY3QgcmV0dXJuZWQgYnkgYHByb2dyZXNzUmVkdXguZ3JvdXBlZExlc3NvbnMoKWAuXG4gKlxuICogQHByb3BlcnR5IHtsZXNzb25Hcm91cFNoYXBlfSBsZXNzb25Hcm91cFxuICogU3VtbWFyeSBvZiB0aGUgTGVzc29uR3JvdXAgcnVieSBtb2RlbCBkZXNjcmliaW5nIHRoaXMgZ3JvdXAgb2YgbGVzc29ucy5cbiAqIEBwcm9wZXJ0eSB7W2xlc3NvblR5cGVdfSBsZXNzb25zXG4gKiBPcmRlcmVkIGxpc3Qgb2YgbGVzc29ucyBpbiB0aGlzIGdyb3VwLlxuICogQHByb3BlcnR5IHtbW2xldmVsV2l0aFByb2dyZXNzVHlwZV1dfSBsZXZlbHNCeUxlc3NvblxuICogT3JkZXJlZCBsaXN0IG9mIGxldmVscyBmb3IgZWFjaCBvZiB0aGUgbGVzc29ucyBpbiB0aGlzIGdyb3VwLlxuICovXG5leHBvcnQgY29uc3QgZ3JvdXBlZExlc3NvbnNUeXBlID0gUHJvcFR5cGVzLnNoYXBlKHtcbiAgbGVzc29uR3JvdXA6IFByb3BUeXBlcy5zaGFwZShsZXNzb25Hcm91cFNoYXBlKSxcbiAgbGVzc29uczogUHJvcFR5cGVzLmFycmF5T2YobGVzc29uVHlwZSkuaXNSZXF1aXJlZCxcbiAgbGV2ZWxzQnlMZXNzb246IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hcnJheU9mKGxldmVsV2l0aFByb2dyZXNzVHlwZSkpXG4gICAgLmlzUmVxdWlyZWQsXG59KTtcbiJdLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwicmVxdWlyZSIsIl9zaGFyZWRDb25zdGFudHMiLCJleHBvcnRzIiwiYWN0aXZpdHlDc3NDbGFzcyIsInJlc3VsdCIsIlRlc3RSZXN1bHRzIiwiTk9fVEVTVFNfUlVOIiwiUkVWSUVXX0FDQ0VQVEVEX1JFU1VMVCIsIkxldmVsU3RhdHVzIiwicmV2aWV3X2FjY2VwdGVkIiwiUkVWSUVXX1JFSkVDVEVEX1JFU1VMVCIsInJldmlld19yZWplY3RlZCIsIlNVQk1JVFRFRF9SRVNVTFQiLCJzdWJtaXR0ZWQiLCJNSU5JTVVNX09QVElNQUxfUkVTVUxUIiwicGVyZmVjdCIsIk1JTklNVU1fUEFTU19SRVNVTFQiLCJwYXNzZWQiLCJhdHRlbXB0ZWQiLCJub3RfdHJpZWQiLCJyZXN1bHRGcm9tU3RhdHVzIiwic3RhdHVzIiwiZnJlZV9wbGF5X2NvbXBsZXRlIiwiRlJFRV9QTEFZIiwiQUxMX1BBU1MiLCJtZXJnZUFjdGl2aXR5UmVzdWx0IiwiYSIsImIiLCJNYXRoIiwibWF4IiwicmVkdWNlciIsInN0YXRlIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiSGlkZGVuU3RhdGUiLCJhY3Rpb24iLCJ0eXBlIiwiU0VUX0hJRERFTl9MRVNTT05TIiwiaGlkZGVuTGVzc29uc1BlclNlY3Rpb24iLCJoaWRlYWJsZUxlc3NvbnNBbGxvd2VkIiwic2VjdGlvbklkcyIsIk9iamVjdCIsImtleXMiLCJuZXh0U3RhdGUiLCJmb3JFYWNoIiwic2VjdGlvbklkIiwibGVzc29uSWQiLCJzZXRJbiIsInRvU3RyaW5nIiwidmFsaWRhdGVTZWN0aW9uSWRzIiwibWVyZ2UiLCJoaWRkZW5MZXNzb25zSW5pdGlhbGl6ZWQiLCJVUERBVEVfSElEREVOX0xFU1NPTiIsImhpZGRlbiIsIlVQREFURV9ISURERU5fU0NSSVBUIiwic2NyaXB0SWQiLCJnZXRIaWRkZW5MZXNzb25zIiwic2NyaXB0TmFtZSIsImNhbkhpZGVMZXNzb25zIiwiZGlzcGF0Y2giLCIkIiwiYWpheCIsInVybCIsImNvbmNhdCIsImRhdGFUeXBlIiwiY29udGVudFR5cGUiLCJkb25lIiwicmVzcG9uc2UiLCJpbml0aWFsaXplSGlkZGVuTGVzc29ucyIsImRhdGEiLCJBcnJheSIsImlzQXJyYXkiLCJfZGVmaW5lUHJvcGVydHkiLCJTVFVERU5UX1NFQ1RJT05fSUQiLCJzZXRIaWRkZW5MZXNzb25zIiwiZmFpbCIsImVyciIsImNvbnNvbGUiLCJlcnJvciIsImluaXRpYWxpemVIaWRkZW5TY3JpcHRzIiwidXBkYXRlSGlkZGVuU2NyaXB0IiwiaXNMZXNzb25IaWRkZW5Gb3JTZWN0aW9uIiwiaXNIaWRkZW5Gb3JTZWN0aW9uIiwiaXNTY3JpcHRIaWRkZW5Gb3JTZWN0aW9uIiwidG9nZ2xlSGlkZGVuTGVzc29uIiwidXBkYXRlSGlkZGVuTGVzc29uIiwicG9zdFRvZ2dsZUhpZGRlbiIsInRvZ2dsZUhpZGRlblNjcmlwdCIsIl9pbW11dGFibGUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2pxdWVyeSIsImUiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsIm8iLCJTeW1ib2wiLCJpdGVyYXRvciIsImNvbnN0cnVjdG9yIiwicHJvdG90eXBlIiwiciIsInQiLCJfdG9Qcm9wZXJ0eUtleSIsImkiLCJfdG9QcmltaXRpdmUiLCJ0b1ByaW1pdGl2ZSIsImNhbGwiLCJUeXBlRXJyb3IiLCJTdHJpbmciLCJOdW1iZXIiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiSW1tdXRhYmxlIiwiUmVjb3JkIiwibGVzc29uc0J5U2VjdGlvbiIsIk1hcCIsInNjcmlwdHNCeVNlY3Rpb24iLCJnZXRJbiIsImdldCIsInNpemUiLCJFcnJvciIsInNlY3Rpb25faWQiLCJzdGFnZV9pZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJzdWNjZXNzIiwid2luZG93IiwiX19UZXN0SW50ZXJmYWNlIiwidG9nZ2xlSGlkZGVuVW5pdENvbXBsZXRlIiwiaXRlbUlkIiwiYnlTZWN0aW9uS2V5IiwiaW5pdGlhbFN0YXRlIiwiQVVUSE9SSVpFX0xPQ0tBQkxFIiwiYXNzaWduIiwibG9ja2FibGVBdXRob3JpemVkIiwiaXNBdXRob3JpemVkIiwibG9ja2FibGVBdXRob3JpemVkTG9hZGVkIiwiU0VUX1NFQ1RJT05fTE9DS19TVEFUVVMiLCJfb2JqZWN0U3ByZWFkIiwibGVzc29uc0J5U2VjdGlvbklkIiwiXyIsIm1hcFZhbHVlcyIsInNlY3Rpb25zIiwic2VjdGlvbiIsImxlc3NvbnMiLCJsZXNzb25zQnlTZWN0aW9uSWRMb2FkZWQiLCJSRUZSRVNIX1NFQ1RJT05fTE9DS19TVEFUVVMiLCJsb2NrRGlhbG9nTGVzc29uSWQiLCJsb2NrU3RhdHVzIiwibG9ja1N0YXR1c0Zvckxlc3NvbiIsIlNFTEVDVF9TRUNUSU9OIiwicGF5bG9hZCIsIk5PX1NFQ1RJT04iLCJPUEVOX0xPQ0tfRElBTE9HIiwiQ0xPU0VfTE9DS19ESUFMT0ciLCJCRUdJTl9TQVZFIiwic2F2aW5nIiwiRklOSVNIX1NBVkUiLCJuZXh0TG9ja1N0YXR1cyIsIm5leHRMZXNzb24iLCJjbG9uZURlZXAiLCJpdGVtIiwiaW5kZXgiLCJ1cGRhdGUiLCJ1c2VyX2xldmVsX2lkIiwidXNlckxldmVsSWQiLCJsb2NrZWQiLCJMb2NrU3RhdHVzIiwiTG9ja2VkIiwicmVhZG9ubHlfYW5zd2VycyIsIlJlYWRvbmx5QW5zd2VycyIsIl9sb2Rhc2giLCJfdGVhY2hlclNlY3Rpb25zUmVkdXgiLCJfdXRpbHMiLCJvd25LZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwicHVzaCIsImFwcGx5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJtYWtlRW51bSIsImF1dGhvcml6ZUxvY2thYmxlIiwib3BlbkxvY2tEaWFsb2ciLCJiZWdpblNhdmUiLCJmaW5pc2hTYXZlIiwibmV3TG9ja1N0YXR1cyIsInBlcmZvcm1TYXZlIiwib25Db21wbGV0ZSIsImdldFN0YXRlIiwib2xkTG9ja1N0YXR1cyIsImxlc3NvbkxvY2siLCJzYXZlRGF0YSIsImlzRXF1YWwiLCJtYXAiLCJ1c2VyX2xldmVsX2RhdGEiLCJ1c2VyTGV2ZWxEYXRhIiwidXBkYXRlcyIsImNsb3NlTG9ja0RpYWxvZyIsInNhdmVMb2NrRGlhbG9nIiwibG9ja0xlc3NvbiIsInN0dWRlbnQiLCJuYW1lIiwiRWRpdGFibGUiLCJmdWxseUxvY2tlZExlc3Nvbk1hcHBpbmciLCJyZWR1Y2UiLCJvYmoiLCJmdWxseUxvY2tlZCIsInNvbWUiLCJzZXRTZWN0aW9uTG9ja1N0YXR1cyIsInJlZmV0Y2hTZWN0aW9uTG9ja1N0YXR1cyIsInNjcmlwdF9pZCIsInJlZnJlc2hTZWN0aW9uTG9ja1N0YXR1cyIsImxvZyIsImVudmlyb25tZW50U3BlY2lmaWNDb29raWVOYW1lIiwicmFja19lbnYiLCJkYXNoYm9hcmQiLCJnZXRSb290RG9tYWluRnJvbUhvc3RuYW1lIiwiaG9zdG5hbWUiLCJzcGxpdCIsInNsaWNlIiwiam9pbiIsImhhc1F1ZXJ5UGFyYW0iLCJwYXJzZWRQYXJhbXMiLCJxdWVyeVBhcmFtcyIsImhhc093blByb3BlcnR5IiwicmVzZXRXaW5kb3dMb2NhdGlvbiIsIndpbmRvd0xvY2F0aW9uIiwibG9jYXRpb24iLCJzZXRXaW5kb3dMb2NhdGlvbiIsImZha2VMb2NhdGlvbiIsInVwZGF0ZVF1ZXJ5UGFyYW0iLCJwYXJhbSIsInVzZVJlcGxhY2VTdGF0ZSIsIm5ld1N0cmluZyIsInF1ZXJ5U3RyaW5nIiwicGFyc2UiLCJzZWFyY2giLCJuZXdMb2NhdGlvbiIsInBhdGhuYW1lIiwibWV0aG9kIiwiaGlzdG9yeSIsImRvY3VtZW50IiwidGl0bGUiLCJfcXVlcnlTdHJpbmciLCJwYXJzZWQiLCJWaWV3VHlwZSIsIlBhcnRpY2lwYW50IiwiU0VUX1ZJRVdfVFlQRSIsInZpZXdUeXBlIiwiX3V0aWxzMiIsInNldFZpZXdUeXBlIiwiY2hhbmdlVmlld1R5cGUiLCJpc0FzeW5jIiwicmVsb2FkIiwiX3Byb3BUeXBlcyIsImZlZWRiYWNrU2hhcGUiLCJQcm9wVHlwZXMiLCJzaGFwZSIsImlkIiwibnVtYmVyIiwiaXNSZXF1aXJlZCIsInNlZW5fb25fZmVlZGJhY2tfcGFnZV9hdCIsInN0cmluZyIsInN0dWRlbnRfZmlyc3RfdmlzaXRlZF9hdCIsImNyZWF0ZWRfYXQiLCJvbmVPZlR5cGUiLCJpbnN0YW5jZU9mIiwiRGF0ZSIsImNvbW1lbnQiLCJwZXJmb3JtYW5jZSIsImlzX2F3YWl0aW5nX3RlYWNoZXJfcmV2aWV3IiwiYm9vbCIsInJldmlld19zdGF0ZSIsImxldmVsRmVlZGJhY2tUeXBlIiwibGVzc29uTmFtZSIsImxlc3Nvbk51bSIsImxldmVsTnVtIiwibGlua1RvTGV2ZWwiLCJ1bml0TmFtZSIsImZlZWRiYWNrcyIsImFycmF5T2YiLCJnZXRJY29uRm9yTGV2ZWwiLCJsZXZlbCIsImlzTGV2ZWxBc3Nlc3NtZW50IiwiaXNVbnBsdWdnZWQiLCJpc0xvY2tlZCIsImljb24iLCJtYXRjaCIsImV4ZWMiLCJib251cyIsImRlZmF1bHRCdWJibGVJY29uIiwibGVzc29uSGFzTGV2ZWxzIiwibGVzc29uIiwiX2xlc3NvbiRsZXZlbHMiLCJsZXZlbHMiLCJsZXNzb25Jc0FsbEFzc2Vzc21lbnQiLCJldmVyeSIsImtpbmQiLCJMZXZlbEtpbmQiLCJhc3Nlc3NtZW50IiwibGVzc29uSXNMb2NrZWRGb3JBbGxTdHVkZW50cyIsImN1cnJlbnRTZWN0aW9uSWQiLCJ0ZWFjaGVyU2VjdGlvbnMiLCJzZWxlY3RlZFNlY3Rpb25JZCIsImN1cnJlbnRTZWN0aW9uIiwibGVzc29uSXNMb2NrZWRGb3JVc2VyIiwidmlld0FzIiwibG9ja2FibGUiLCJjdXJyZW50VXNlciIsInVzZXJJZCIsIkluc3RydWN0b3IiLCJsZXNzb25Mb2NrZWQiLCJsZXNzb25Jc1Zpc2libGUiLCJoaWRkZW5MZXNzb25TdGF0ZSIsImhpZGRlbkxlc3NvbiIsImxlc3NvblByb2dyZXNzRm9yU2VjdGlvbiIsInNlY3Rpb25MZXZlbFByb2dyZXNzIiwic2VjdGlvbkxlc3NvblByb2dyZXNzIiwiZW50cmllcyIsIl9yZWYiLCJfcmVmMiIsIl9zbGljZWRUb0FycmF5IiwiX2FycmF5V2l0aEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheUxpbWl0IiwibCIsIm4iLCJ1IiwiZiIsIm5leHQiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfYXJyYXlMaWtlVG9BcnJheSIsImZyb20iLCJ0ZXN0IiwiX25vbkl0ZXJhYmxlUmVzdCIsInN0dWRlbnRJZCIsInN0dWRlbnRMZXZlbFByb2dyZXNzIiwic3R1ZGVudExlc3NvblByb2dyZXNzIiwibGVzc29uUHJvZ3Jlc3NGb3JTdHVkZW50IiwibGVzc29uTGV2ZWxzIiwiZmlsdGVyZWRMZXZlbHMiLCJjb21wbGV0ZWRTdGF0dXNlcyIsImNvbXBsZXRlZF9hc3Nlc3NtZW50IiwiaW1wZXJmZWN0IiwiY29tcGxldGVkIiwidGltZVNwZW50IiwibGFzdFRpbWVzdGFtcCIsImxldmVsUHJvZ3Jlc3MiLCJpbmNsdWRlcyIsImluY29tcGxldGUiLCJnZXRQZXJjZW50IiwiY291bnQiLCJpbmNvbXBsZXRlUGVyY2VudCIsImltcGVyZmVjdFBlcmNlbnQiLCJjb21wbGV0ZWRQZXJjZW50Iiwic2hvdWxkU2hvd1Jldmlld1N0YXRlcyIsInVuaXQiLCJpc0NzZCIsImlzQ3NwIiwiX2FjdGl2aXR5VXRpbHMiLCJfaGlkZGVuTGVzc29uUmVkdXgiLCJfbGVzc29uTG9ja1JlZHV4IiwiX3ZpZXdBc1JlZHV4IiwiX3Byb2dyZXNzVHlwZXMiLCJjb21tZW50TGVmdCIsInByb2dyZXNzIiwidGVhY2hlckZlZWRiYWNrQ29tbWVudGVkIiwidGVhY2hlckZlZWRiYWNrTmV3Iiwic3R1ZGVudE5lZWRzRmVlZGJhY2siLCJjYW5IYXZlRmVlZGJhY2siLCJwcm9jZXNzZWRMZXZlbCIsInBhcmVudExldmVsSWQiLCJhY3RpdmVJZCIsImFwcCIsInVzZXNMYWIyIiwidXNlc19sYWIyIiwicHJvZ3Jlc3Npb24iLCJwcm9ncmVzc2lvbkRpc3BsYXlOYW1lIiwicHJvZ3Jlc3Npb25fZGlzcGxheV9uYW1lIiwiZGlzcGxheV9hc191bnBsdWdnZWQiLCJsZXZlbE51bWJlciIsInVucGx1Z2dlZCIsInBvc2l0aW9uIiwiYnViYmxlVGV4dCIsImxldHRlciIsImlzQ29uY2VwdExldmVsIiwiaXNfY29uY2VwdF9sZXZlbCIsImlzVmFsaWRhdGVkIiwiaXNfdmFsaWRhdGVkIiwiY2FuX2hhdmVfZmVlZGJhY2siLCJwYWdlTnVtYmVyIiwicGFnZV9udW1iZXIiLCJQVVpaTEVfUEFHRV9OT05FIiwic2NyaXB0TGV2ZWxJZCIsInN1YmxldmVscyIsInN1YmxldmVsIiwicGF0aCIsImdldExldmVsUmVzdWx0Iiwic2VydmVyUHJvZ3Jlc3MiLCJnZXRQYWdlc1Byb2dyZXNzIiwiX3NlcnZlclByb2dyZXNzJHBhZ2VzIiwicGFnZXNfY29tcGxldGVkIiwicGFnZVJlc3VsdCIsInBhZ2VQcm9ncmVzcyIsImxldmVsUHJvZ3Jlc3NGcm9tUmVzdWx0IiwibGV2ZWxQcm9ncmVzc0Zyb21TdGF0dXMiLCJsZXZlbFByb2dyZXNzRnJvbVNlcnZlciIsInBhaXJlZCIsInRpbWVfc3BlbnQiLCJ0ZWFjaGVyRmVlZGJhY2tSZXZpZXdTdGF0ZSIsInRlYWNoZXJfZmVlZGJhY2tfcmV2aWV3X3N0YXRlIiwidGVhY2hlcl9mZWVkYmFja19uZXciLCJ0ZWFjaGVyX2ZlZWRiYWNrX2NvbW1lbnRlZCIsImxhc3RfcHJvZ3Jlc3NfYXQiLCJwYWdlcyIsInByb2Nlc3NTZXJ2ZXJTdHVkZW50UHJvZ3Jlc3MiLCJzZXJ2ZXJTdHVkZW50UHJvZ3Jlc3MiLCJwcm9jZXNzU2VydmVyU2VjdGlvblByb2dyZXNzIiwic2VydmVyU2VjdGlvblByb2dyZXNzIiwiX3R5cGVzIiwibGV2ZWxTaGFwZSIsImxldmVsV2l0aFByb2dyZXNzVHlwZSIsImlzQ3VycmVudExldmVsIiwic3R1ZGVudExldmVsUHJvZ3Jlc3NTaGFwZSIsIm9uZU9mIiwiUmV2aWV3U3RhdGVzIiwic3R1ZGVudExldmVsUHJvZ3Jlc3NUeXBlIiwibGVzc29uVHlwZSIsIm9iamVjdE9mIiwibGVzc29uTnVtYmVyIiwibGVzc29uX3BsYW5faHRtbF91cmwiLCJsZXNzb25fZmVlZGJhY2tfdXJsIiwiaXNGb2N1c0FyZWEiLCJkZXNjcmlwdGlvbl9zdHVkZW50IiwiZGVzY3JpcHRpb25fdGVhY2hlciIsImxlc3Nvbkdyb3VwU2hhcGUiLCJkaXNwbGF5TmFtZSIsImJpZ1F1ZXN0aW9ucyIsImRlc2NyaXB0aW9uIiwibGVzc29uR3JvdXAiLCJsZXZlbHNCeUxlc3NvbiJdLCJzb3VyY2VSb290IjoiIn0=